Parent Directory
|
Revision Log
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 |