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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1034 - (download) (as text) (annotate)
Thu Jun 5 22:41:47 2003 UTC (9 years, 11 months ago) by malsyned
File size: 5883 byte(s)
the % done status indicators now round to the nearest whole percent.
Fixes Bug #47
-Dennis

    1 ################################################################################
    2 # WeBWorK mod_perl (c) 2000-2002 WeBWorK Project
    3 # $Id$
    4 ################################################################################
    5 
    6 package WeBWorK::ContentGenerator::ProblemSet;
    7 use base qw(WeBWorK::ContentGenerator);
    8 
    9 =head1 NAME
   10 
   11 WeBWorK::ContentGenerator::ProblemSet - display an index of the problems in a
   12 problem set.
   13 
   14 =cut
   15 
   16 use strict;
   17 use warnings;
   18 use CGI qw();
   19 
   20 sub initialize {
   21   my ($self, $setName) = @_;
   22   my $courseEnvironment = $self->{ce};
   23   my $r = $self->{r};
   24   my $db = $self->{db};
   25   my $userName = $r->param("user");
   26   my $effectiveUserName = $r->param("effectiveUser");
   27 
   28   my $user            = $db->getUser($userName);
   29   my $effectiveUser   = $db->getUser($effectiveUserName);
   30   my $set             = $db->getGlobalUserSet($effectiveUserName, $setName);
   31   my $permissionLevel = $db->getPermissionLevel($userName)->permission();
   32 
   33   $self->{userName}        = $userName;
   34   $self->{user}            = $user;
   35   $self->{effectiveUser}   = $effectiveUser;
   36   $self->{set}             = $set;
   37   $self->{permissionLevel} = $permissionLevel;
   38 
   39   ##### permissions #####
   40 
   41   $self->{isOpen} = time >= $set->open_date || $permissionLevel > 0;
   42 }
   43 
   44 sub path {
   45   my ($self, $setName, $args) = @_;
   46 
   47   my $ce = $self->{ce};
   48   my $root = $ce->{webworkURLs}->{root};
   49   my $courseName = $ce->{courseName};
   50   return $self->pathMacro($args,
   51     "Home" => "$root",
   52     $courseName => "$root/$courseName",
   53     $setName => "",
   54   );
   55 }
   56 
   57 sub nav {
   58   my ($self, $setName, $args) = @_;
   59 
   60   my $ce = $self->{ce};
   61   my $root = $ce->{webworkURLs}->{root};
   62   my $courseName = $ce->{courseName};
   63   my @links = ("Problem Sets" , "$root/$courseName", "navUp");
   64   my $tail = "";
   65 
   66   return $self->navMacro($args, $tail, @links);
   67 }
   68 
   69 
   70 sub siblings {
   71   my ($self, $setName) = @_;
   72 
   73   my $ce = $self->{ce};
   74   my $db = $self->{db};
   75   my $root = $ce->{webworkURLs}->{root};
   76   my $courseName = $ce->{courseName};
   77 
   78   print CGI::strong("Problem Sets"), CGI::br();
   79 
   80   my $effectiveUser = $self->{r}->param("effectiveUser");
   81   my @sets;
   82   push @sets, $db->getGlobalUserSet($effectiveUser, $_)
   83     foreach ($db->listUserSets($effectiveUser));
   84   foreach my $set (sort { $a->open_date <=> $b->open_date } @sets) {
   85     if (time >= $set->open_date) {
   86       print CGI::a({-href=>"$root/$courseName/".$set->set_id."/?"
   87         . $self->url_authen_args}, $set->set_id), CGI::br();
   88     } else {
   89       print $set->set_id, CGI::br();
   90     }
   91   }
   92 }
   93 
   94 sub title {
   95   my ($self, $setName) = @_;
   96 
   97   return $setName;
   98 }
   99 
  100 sub info {
  101   my ($self, $setName) = @_;
  102 
  103   my $r = $self->{r};
  104   my $ce = $self->{ce};
  105   my $db = $self->{db};
  106 
  107   return "" unless $self->{isOpen};
  108 
  109   my $effectiveUser = $db->getUser($r->param("effectiveUser"));
  110   my $set  = $db->getGlobalUserSet($effectiveUser->user_id, $setName);
  111   my $psvn = $set->psvn();
  112 
  113   my $screenSetHeader = $set->problem_header || $ce->{webworkFiles}->{screenSnippets}->{setHeader};
  114   my $displayMode     = $ce->{pg}->{options}->{displayMode};
  115 
  116   return "" unless defined $screenSetHeader and $screenSetHeader;
  117 
  118   # decide what to do about problem number
  119   my $problem = WeBWorK::DB::Record::UserProblem->new(
  120     problem_id => 0,
  121     set_id => $set->set_id,
  122     login_id => $effectiveUser->user_id,
  123     source_file => $screenSetHeader,
  124     # the rest of Problem's fields are not needed, i think
  125   );
  126 
  127   my $pg = WeBWorK::PG->new(
  128     $ce,
  129     $effectiveUser,
  130     $r->param('key'),
  131     $set,
  132     $problem,
  133     $psvn,
  134     {}, # no form fields!
  135     { # translation options
  136       displayMode     => $displayMode,
  137       showHints       => 0,
  138       showSolutions   => 0,
  139       processAnswers  => 0,
  140     },
  141   );
  142 
  143   # handle translation errors
  144   if ($pg->{flags}->{error_flag}) {
  145     return $self->errorOutput($pg->{errors}, $pg->{body_text});
  146   } else {
  147     return $pg->{body_text};
  148   }
  149 }
  150 
  151 sub body {
  152   my ($self, $setName) = @_;
  153   my $r = $self->{r};
  154   my $courseEnvironment = $self->{ce};
  155   my $db = $self->{db};
  156   my $effectiveUser = $r->param('effectiveUser');
  157 
  158   return CGI::p(CGI::font({-color=>"red"}, "This problem set is not available because it is not yet open."))
  159     unless ($self->{isOpen});
  160 
  161   my $hardcopyURL =
  162     $courseEnvironment->{webworkURLs}->{root} . "/"
  163     . $courseEnvironment->{courseName} . "/"
  164     . "hardcopy/$setName/?" . $self->url_authen_args;
  165   print CGI::p(CGI::a({-href=>$hardcopyURL}, "Download a hardcopy"),
  166     "of this problem set.");
  167 
  168   print CGI::start_table();
  169   print CGI::Tr(
  170     CGI::th("Name"),
  171     CGI::th("Attempts"),
  172     CGI::th("Remaining"),
  173     CGI::th("Status"),
  174   );
  175 
  176   my $set = $db->getGlobalUserSet($effectiveUser, $setName);
  177   my @problemNumbers = $db->listUserProblems($effectiveUser, $setName);
  178   foreach my $problemNumber (sort { $a <=> $b } @problemNumbers) {
  179     my $problem = $db->getGlobalUserProblem($effectiveUser, $setName, $problemNumber);
  180     print $self->problemListRow($set, $problem);
  181   }
  182 
  183   print CGI::end_table();
  184 
  185   # feedback form
  186   my $ce = $self->{ce};
  187   my $root = $ce->{webworkURLs}->{root};
  188   my $courseName = $ce->{courseName};
  189   my $feedbackURL = "$root/$courseName/feedback/";
  190   print
  191     CGI::startform("POST", $feedbackURL),
  192     $self->hidden_authen_fields,
  193     CGI::hidden("module", __PACKAGE__),
  194     CGI::hidden("set",    $set->set_id),
  195     CGI::p({-align=>"right"},
  196       CGI::submit(-name=>"feedbackForm", -label=>"Send Feedback")
  197     ),
  198     CGI::endform();
  199 
  200   return "";
  201 }
  202 
  203 sub problemListRow($$$) {
  204   my $self = shift;
  205   my $set = shift;
  206   my $problem = shift;
  207 
  208   my $name = $problem->problem_id;
  209   my $interactiveURL = "$name/?" . $self->url_authen_args;
  210   my $interactive = CGI::a({-href=>$interactiveURL}, "Problem $name");
  211   my $attempts = $problem->num_correct + $problem->num_incorrect;
  212   my $remaining = $problem->max_attempts < 0
  213     ? "unlimited"
  214     : $problem->max_attempts - $attempts;
  215   my $status = sprintf("%.0f%%", $problem->status * 100); # round to whole number
  216 
  217   return CGI::Tr(CGI::td({-nowrap=>1}, [
  218     $interactive,
  219     $attempts,
  220     $remaining,
  221     $status,
  222   ]));
  223 }
  224 
  225 1;

aubreyja at gmail dot com
ViewVC Help
Powered by ViewVC 1.0.9