[system] / trunk / webwork2 / lib / WeBWorK / ContentGenerator / ProblemSets.pm Repository:
ViewVC logotype

View of /trunk/webwork2/lib/WeBWorK/ContentGenerator/ProblemSets.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2778 - (download) (as text) (annotate)
Mon Sep 13 19:35:12 2004 UTC (8 years, 9 months ago) by sh002i
File size: 9718 byte(s)
timezone support

    1 ################################################################################
    2 # WeBWorK Online Homework Delivery System
    3 # Copyright © 2000-2003 The WeBWorK Project, http://openwebwork.sf.net/
    4 # $CVSHeader$
    5 #
    6 # This program is free software; you can redistribute it and/or modify it under
    7 # the terms of either: (a) the GNU General Public License as published by the
    8 # Free Software Foundation; either version 2, or (at your option) any later
    9 # version, or (b) the "Artistic License" which comes with this package.
   10 #
   11 # This program is distributed in the hope that it will be useful, but WITHOUT
   12 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
   13 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
   14 # Artistic License for more details.
   15 ################################################################################
   16 
   17 package WeBWorK::ContentGenerator::ProblemSets;
   18 use base qw(WeBWorK::ContentGenerator);
   19 
   20 =head1 NAME
   21 
   22 WeBWorK::ContentGenerator::ProblemSets - Display a list of built problem sets.
   23 
   24 =cut
   25 
   26 use strict;
   27 use warnings;
   28 use CGI qw();
   29 use WeBWorK::Utils qw(readFile sortByName);
   30 
   31 # what do we consider a "recent" problem set?
   32 use constant RECENT => 2*7*24*60*60 ; # Two-Weeks in seconds
   33 
   34 sub info {
   35   my ($self) = @_;
   36   my $r = $self->r;
   37   my $ce = $r->ce;
   38   my $db = $r->db;
   39   my $urlpath = $r->urlpath;
   40   my $authz = $r->authz;
   41 
   42   my $courseID = $urlpath->arg("courseID");
   43   my $user = $r->param("user");
   44 
   45   my $course_info = $ce->{courseFiles}->{course_info};
   46 
   47   if (defined $course_info and $course_info) {
   48     my $course_info_path = $ce->{courseDirs}->{templates} . "/$course_info";
   49 
   50     # deal with instructor crap
   51     if ($authz->hasPermissions($user, "access_instructor_tools")) {
   52       if (defined $r->param("editMode") and $r->param("editMode") eq "temporaryFile") {
   53         $course_info_path .= ".$user.tmp"; # this gets a big FIXME for obvious reasons
   54       }
   55 
   56       my $editorPage = $urlpath->newFromModule("WeBWorK::ContentGenerator::Instructor::PGProblemEditor", courseID => $courseID);
   57       my $editorURL = $self->systemLink($editorPage, params => { file_type => "course_info" });
   58 
   59       print CGI::p(CGI::b("Course Info"), " ",
   60         CGI::a({href=>$editorURL}, "[edit]"));
   61     } else {
   62       print CGI::p(CGI::b("Course Info"));
   63     }
   64 
   65     if (-f $course_info_path) {
   66       my $text = eval { readFile($course_info_path) };
   67       if ($@) {
   68         print CGI::div({class=>"ResultsWithError"},
   69           CGI::p("$@"),
   70         );
   71       } else {
   72         print $text;
   73       }
   74     }
   75 
   76     return "";
   77   }
   78 }
   79 sub help {   # non-standard help, since the file path includes the course name
   80   my $self = shift;
   81   my $args = shift;
   82   my $name = $args->{name};
   83   $name = lc('course home') unless defined($name);
   84   $name =~ s/\s/_/g;
   85   $self->helpMacro($name);
   86 }
   87 sub body {
   88   my ($self) = @_;
   89   my $r = $self->r;
   90   my $ce = $r->ce;
   91   my $db = $r->db;
   92   my $authz = $r->authz;
   93   my $urlpath = $r->urlpath;
   94 
   95   my $user            = $r->param("user");
   96   my $effectiveUser   = $r->param("effectiveUser");
   97   my $sort            = $r->param("sort") || "status";
   98 
   99   my $courseName      = $urlpath->arg("courseID");
  100 
  101   # Print link to instructor page for instructors
  102   if ($authz->hasPermissions($user, "access_instructor_tools")) {
  103     my $instructorPage = $urlpath->newFromModule("WeBWorK::ContentGenerator::Instructor::Index", courseID => $courseName);
  104     my $instructorLink = $self->systemLink($instructorPage);
  105     print CGI::p({-align=>'center'},CGI::a({-href=>$instructorLink},'Instructor Tools'));
  106   }
  107 
  108   $sort = "status" unless $sort eq "status" or $sort eq "name";
  109   my $nameHeader = $sort eq "name"
  110     ? CGI::u("Name")
  111     : CGI::a({href=>$self->systemLink($urlpath, params=>{sort=>"name"})}, "Name");
  112   my $statusHeader = $sort eq "status"
  113     ? CGI::u("Status")
  114     : CGI::a({href=>$self->systemLink($urlpath, params=>{sort=>"status"})}, "Status");
  115   my $hardcopyPage = $urlpath->newFromModule("WeBWorK::ContentGenerator::Hardcopy", courseID => $courseName);
  116   my $actionURL = $self->systemLink($hardcopyPage, authen => 0); # no authen info for form action
  117 
  118   print CGI::startform(-method=>"POST", -action=>$actionURL);
  119   print $self->hidden_authen_fields;
  120   print CGI::start_table();
  121   print CGI::Tr(
  122     CGI::th("Sel."),
  123     CGI::th($nameHeader),
  124     CGI::th($statusHeader),
  125   );
  126 
  127   my @setIDs = $db->listUserSets($effectiveUser);
  128 
  129   my @userSetIDs = map {[$effectiveUser, $_]} @setIDs;
  130   $WeBWorK::timer->continue("Begin collecting merged sets") if defined($WeBWorK::timer);
  131   my @sets = $db->getMergedSets( @userSetIDs );
  132 
  133   $WeBWorK::timer->continue("Begin fixing merged sets") if defined($WeBWorK::timer);
  134 
  135   # Database fix (in case of undefined published values)
  136   # this may take some extra time the first time but should NEVER need to be run twice
  137   # this is only necessary because some people keep holding to ww1.9 which did not have a published field
  138   foreach my $set (@sets) {
  139     # make sure published is set to 0 or 1
  140     if ( $set and $set->published ne "0" and $set->published ne "1") {
  141       my $globalSet = $db->getGlobalSet($set->set_id);
  142       $globalSet->published("1"); # defaults to published
  143       $db->putGlobalSet($globalSet);
  144       $set = $db->getMergedSet($effectiveUser, $set->set_id);
  145     } else {
  146       die "set $set not defined" unless $set;
  147     }
  148   }
  149 
  150   $WeBWorK::timer->continue("Begin sorting merged sets") if defined($WeBWorK::timer);
  151 
  152   @sets = sortByName("set_id", @sets) if $sort eq "name";
  153   @sets = sort byUrgency @sets if $sort eq "status";
  154 
  155   $WeBWorK::timer->continue("End preparing merged sets") if defined($WeBWorK::timer);
  156 
  157   foreach my $set (@sets) {
  158     die "set $set not defined" unless $set;
  159 
  160     if ($set->published || $authz->hasPermissions($user, "view_unpublished_sets")) {
  161       print $self->setListRow($set, $authz->hasPermissions($user, "view_multiple_sets"), $authz->hasPermissions($user, "view_unopened_sets"));
  162     }
  163   }
  164 
  165   print CGI::end_table();
  166   my $pl = ($authz->hasPermissions($user, "view_multiple_sets") ? "s" : "");
  167   print CGI::p(CGI::submit("hardcopy", "Download Hardcopy for Selected Set$pl"));
  168   print CGI::endform();
  169 
  170   # feedback form url
  171   my $feedbackPage = $urlpath->newFromModule("WeBWorK::ContentGenerator::Feedback", courseID => $courseName);
  172   my $feedbackURL = $self->systemLink($feedbackPage, authen => 0); # no authen info for form action
  173 
  174   #print feedback form
  175   print
  176     CGI::start_form(-method=>"POST", -action=>$feedbackURL),"\n",
  177     $self->hidden_authen_fields,"\n",
  178     CGI::hidden("module",             __PACKAGE__),"\n",
  179     CGI::hidden("set",                ''),"\n",
  180     CGI::hidden("problem",            ''),"\n",
  181     CGI::hidden("displayMode",        ''),"\n",
  182     CGI::hidden("showOldAnswers",     ''),"\n",
  183     CGI::hidden("showCorrectAnswers", ''),"\n",
  184     CGI::hidden("showHints",          ''),"\n",
  185     CGI::hidden("showSolutions",      ''),"\n",
  186     CGI::p({-align=>"left"},
  187       CGI::submit(-name=>"feedbackForm", -label=>"Email instructor")
  188     ),
  189     CGI::endform(),"\n";
  190 
  191   return "";
  192 }
  193 
  194 sub setListRow {
  195   my ($self, $set, $multiSet, $preOpenSets) = @_;
  196   my $r = $self->r;
  197   my $ce = $r->ce;
  198   my $urlpath = $r->urlpath;
  199 
  200   my $name = $set->set_id;
  201   my $courseName      = $urlpath->arg("courseID");
  202 
  203   my $problemSetPage = $urlpath->newFromModule("WeBWorK::ContentGenerator::ProblemSet",
  204     courseID => $courseName, setID => $name);
  205   my $interactiveURL = $self->systemLink($problemSetPage);
  206 
  207   my $openDate = $self->formatDateTime($set->open_date);
  208   my $dueDate = $self->formatDateTime($set->due_date);
  209   my $answerDate = $self->formatDateTime($set->answer_date);
  210 
  211   my $control = "";
  212   if ($multiSet) {
  213     $control = CGI::checkbox(
  214       -name=>"hcSet",
  215       -value=>$name,
  216       -label=>"",
  217     );
  218   } else {
  219     $control = CGI::radio_group(
  220       -name=>"hcSet",
  221       -values=>[$name],
  222       -default=>"-",
  223       -labels=>{$name => ""},
  224     );
  225   }
  226 
  227   my $interactive = CGI::a({-href=>$interactiveURL}, "set $name");
  228 
  229   my $status;
  230   if (time < $set->open_date) {
  231     $status = "will open on $openDate";
  232     $control = "" unless $preOpenSets;
  233     $interactive = $name unless $preOpenSets;
  234   } elsif (time < $set->due_date) {
  235     $status = "now open, due $dueDate";
  236   } elsif (time < $set->answer_date) {
  237     $status = "closed, answers on $answerDate";
  238   } elsif ($set->answer_date <= time and time < $set->answer_date +RECENT ) {
  239     $status = "closed, answers recently available";
  240   } else {
  241     $status = "closed, answers available";
  242   }
  243 
  244   my $publishedClass = ($set->published) ? "Published" : "Unpublished";
  245 
  246   $status = CGI::font({class=>$publishedClass}, $status) if $preOpenSets;
  247 
  248   return CGI::Tr(CGI::td([
  249     $control,
  250     $interactive,
  251     $status,
  252   ]));
  253 }
  254 
  255 sub byname { $a->set_id cmp $b->set_id; }
  256 
  257 sub byUrgency {
  258   my $mytime = time;
  259   my @a_parts = ($a->answer_date + RECENT <= $mytime) ?  (4, $a->open_date, $a->due_date, $a->set_id)
  260     : ($a->answer_date <= $mytime and $mytime < $a->answer_date + RECENT) ? (3, $a-> answer_date, $a-> due_date, $a->set_id)
  261     : ($a->due_date <= $mytime and $mytime < $a->answer_date ) ? (2, $a->answer_date, $a->due_date, $a->set_id)
  262     : ($mytime < $a->open_date) ? (1, $a->open_date, $a->due_date, $a->set_id)
  263     : (0, $a->due_date, $a->open_date, $a->set_id);
  264   my @b_parts = ($b->answer_date + RECENT <= $mytime) ?  (4, $b->open_date, $b->due_date, $b->set_id)
  265     : ($b->answer_date <= $mytime and $mytime < $b->answer_date + RECENT) ? (3, $b-> answer_date, $b-> due_date, $b->set_id)
  266     : ($b->due_date <= $mytime and $mytime < $b->answer_date ) ? (2, $b->answer_date, $b->due_date, $b->set_id)
  267     : ($mytime < $b->open_date) ? (1, $b->open_date, $b->due_date, $b->set_id)
  268     : (0, $b->due_date, $b->open_date, $b->set_id);
  269   my $returnIt=0;
  270   while (scalar(@a_parts) > 1) {
  271     if ($returnIt = ( (shift @a_parts) <=> (shift @b_parts) ) ) {
  272       return($returnIt);
  273     }
  274   }
  275   return (  $a_parts[0] cmp  $b_parts[0] );
  276 }
  277 
  278 1;

aubreyja at gmail dot com
ViewVC Help
Powered by ViewVC 1.0.9