[system] / branches / rel-2-1-a1 / webwork-modperl / lib / WeBWorK / ContentGenerator / ProblemSet.pm Repository:
ViewVC logotype

Annotation of /branches/rel-2-1-a1/webwork-modperl/lib/WeBWorK/ContentGenerator/ProblemSet.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1364 - (view) (download) (as text)
Original Path: trunk/webwork-modperl/lib/WeBWorK/ContentGenerator/ProblemSet.pm

1 : sh002i 455 ################################################################################
2 : sh002i 494 # WeBWorK mod_perl (c) 2000-2002 WeBWorK Project
3 : sh002i 455 # $Id$
4 :     ################################################################################
5 :    
6 : malsyned 353 package WeBWorK::ContentGenerator::ProblemSet;
7 : sh002i 818 use base qw(WeBWorK::ContentGenerator);
8 : malsyned 353
9 : sh002i 455 =head1 NAME
10 :    
11 :     WeBWorK::ContentGenerator::ProblemSet - display an index of the problems in a
12 :     problem set.
13 :    
14 :     =cut
15 :    
16 : malsyned 441 use strict;
17 :     use warnings;
18 : sh002i 443 use CGI qw();
19 : malsyned 353
20 : sh002i 469 sub initialize {
21 : sh002i 738 my ($self, $setName) = @_;
22 : sh002i 809 my $courseEnvironment = $self->{ce};
23 : sh002i 738 my $r = $self->{r};
24 : sh002i 818 my $db = $self->{db};
25 : sh002i 738 my $userName = $r->param("user");
26 :     my $effectiveUserName = $r->param("effectiveUser");
27 : sh002i 469
28 : sh002i 818 my $user = $db->getUser($userName);
29 :     my $effectiveUser = $db->getUser($effectiveUserName);
30 : sh002i 1096 my $set = $db->getMergedSet($effectiveUserName, $setName);
31 : sh002i 818 my $permissionLevel = $db->getPermissionLevel($userName)->permission();
32 : sh002i 469
33 : sh002i 738 $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 : sh002i 469 }
43 : malsyned 353
44 : sh002i 469 sub path {
45 :     my ($self, $setName, $args) = @_;
46 :    
47 : sh002i 809 my $ce = $self->{ce};
48 : sh002i 469 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 : malsyned 353 }
56 :    
57 : malsyned 750 sub nav {
58 :     my ($self, $setName, $args) = @_;
59 :    
60 : sh002i 809 my $ce = $self->{ce};
61 : malsyned 750 my $root = $ce->{webworkURLs}->{root};
62 :     my $courseName = $ce->{courseName};
63 : malsyned 795 my @links = ("Problem Sets" , "$root/$courseName", "navUp");
64 : malsyned 750 my $tail = "";
65 :    
66 :     return $self->navMacro($args, $tail, @links);
67 :     }
68 :    
69 :    
70 : sh002i 469 sub siblings {
71 :     my ($self, $setName) = @_;
72 : gage 1359 # $WeBWorK::timer0->continue('begin siblings');
73 : sh002i 809 my $ce = $self->{ce};
74 : sh002i 818 my $db = $self->{db};
75 : sh002i 469 my $root = $ce->{webworkURLs}->{root};
76 :     my $courseName = $ce->{courseName};
77 : sh002i 1228 my $effectiveUser = $self->{r}->param("effectiveUser");
78 : sh002i 526
79 :     print CGI::strong("Problem Sets"), CGI::br();
80 :    
81 : sh002i 469 my @sets;
82 : sh002i 1228
83 : gage 1359 # FIXME The following access to the complete list of sets is very slow.
84 :     # $WeBWorK::timer0->continue('collect siblings');
85 :     # push @sets, $db->getMergedSet($effectiveUser, $_)
86 :     # foreach ($db->listUserSets($effectiveUser));
87 :    
88 :     my @setNames = $db->listUserSets($effectiveUser);
89 :     @setNames = sort @setNames;
90 :     # $WeBWorK::timer0->continue('done collecting siblings');
91 : sh002i 1228 # FIXME only experience will tell us the best sorting procedure.
92 :     # due_date seems right for students, but alphabetically may be more
93 :     # useful for professors?
94 :    
95 : gage 1359 # my @sorted_sets;
96 :     #
97 :     # # sort by set name
98 :     # #@sorted_sets = sort { $a->set_id cmp $b->set_id } @sets;
99 :     #
100 :     # # sort by set due date
101 :     # $WeBWorK::timer0->continue('begin sorting siblings');
102 :     # @sorted_sets = sort { $a->due_date <=> $b->due_date } @sets;
103 :     #
104 :     # # ...and put closed sets last;
105 :     # my $now = time();
106 :     # my @open_sets = grep { $_->due_date > $now } @sorted_sets;
107 :     # my @closed_sets = grep { $_->due_date <= $now } @sorted_sets;
108 :     # @sorted_sets = (@open_sets,@closed_sets);
109 :     # $WeBWorK::timer0->continue('end sorting siblings');
110 :     # foreach my $set (@sorted_sets) {
111 :     # if (time >= $set->open_date) {
112 :     # print CGI::a({-href=>"$root/$courseName/".$set->set_id."/?"
113 :     # . $self->url_authen_args}, $set->set_id), CGI::br();
114 :     # } else {
115 :     # print $set->set_id, CGI::br();
116 :     # }
117 :     # }
118 :     # hack to put links up quickly FIXME when database is faster.
119 :     foreach my $setName (@setNames) {
120 : sh002i 1228
121 : gage 1364 print '&nbsp;&nbsp;'.CGI::a({-href=>"$root/$courseName/".$setName."/?"
122 : gage 1359 . $self->url_authen_args}, $setName), CGI::br();
123 : gage 1107
124 :    
125 : sh002i 469 }
126 :     }
127 :    
128 :     sub title {
129 :     my ($self, $setName) = @_;
130 :    
131 :     return $setName;
132 :     }
133 :    
134 : sh002i 526 sub info {
135 :     my ($self, $setName) = @_;
136 :    
137 :     my $r = $self->{r};
138 : sh002i 809 my $ce = $self->{ce};
139 : sh002i 818 my $db = $self->{db};
140 : sh002i 526
141 : sh002i 738 return "" unless $self->{isOpen};
142 :    
143 : sh002i 818 my $effectiveUser = $db->getUser($r->param("effectiveUser"));
144 : sh002i 1096 my $set = $db->getMergedSet($effectiveUser->user_id, $setName);
145 : sh002i 818 my $psvn = $set->psvn();
146 : sh002i 526
147 : gage 1347 my $screenSetHeader = $set->set_header || $ce->{webworkFiles}->{screenSnippets}->{setHeader};
148 : sh002i 526 my $displayMode = $ce->{pg}->{options}->{displayMode};
149 :    
150 :     return "" unless defined $screenSetHeader and $screenSetHeader;
151 :    
152 :     # decide what to do about problem number
153 : sh002i 818 my $problem = WeBWorK::DB::Record::UserProblem->new(
154 :     problem_id => 0,
155 :     set_id => $set->set_id,
156 : sh002i 919 login_id => $effectiveUser->user_id,
157 : sh002i 526 source_file => $screenSetHeader,
158 :     # the rest of Problem's fields are not needed, i think
159 :     );
160 :    
161 :     my $pg = WeBWorK::PG->new(
162 :     $ce,
163 : malsyned 720 $effectiveUser,
164 : sh002i 526 $r->param('key'),
165 :     $set,
166 :     $problem,
167 :     $psvn,
168 :     {}, # no form fields!
169 :     { # translation options
170 :     displayMode => $displayMode,
171 :     showHints => 0,
172 :     showSolutions => 0,
173 :     processAnswers => 0,
174 :     },
175 :     );
176 : gage 1354 # Add link for editor
177 :     #### link to edit setHeader
178 :     my $editor_link = '';
179 :     if (defined($set) and $set->set_header and
180 :     $self->{permissionLevel} >= $ce->{permissionLevels}->{modify_problem_sets} ) {
181 :     #FIXME ? can't edit the default set header this way
182 :     $editor_link = CGI::p(
183 :     CGI::a({-href=>$ce->{webworkURLs}->{root}.'/'.$ce->{courseName}.
184 :     '/instructor/pgProblemEditor/'.
185 :     $set->set_id.'/0'. '?'.$self->url_authen_args},
186 :     'Edit set header: '.$set->set_header
187 :     )
188 :     );
189 :     }
190 : sh002i 526 # handle translation errors
191 :     if ($pg->{flags}->{error_flag}) {
192 : gage 1354 return $self->errorOutput($pg->{errors}, $pg->{body_text}.$editor_link);
193 : sh002i 526 } else {
194 : gage 1354 return $pg->{body_text}.$editor_link;
195 : sh002i 526 }
196 :     }
197 :    
198 : malsyned 353 sub body {
199 : sh002i 469 my ($self, $setName) = @_;
200 : malsyned 353 my $r = $self->{r};
201 : sh002i 809 my $courseEnvironment = $self->{ce};
202 : sh002i 818 my $db = $self->{db};
203 : malsyned 720 my $effectiveUser = $r->param('effectiveUser');
204 : malsyned 353
205 : sh002i 738 return CGI::p(CGI::font({-color=>"red"}, "This problem set is not available because it is not yet open."))
206 :     unless ($self->{isOpen});
207 :    
208 : sh002i 526 my $hardcopyURL =
209 :     $courseEnvironment->{webworkURLs}->{root} . "/"
210 :     . $courseEnvironment->{courseName} . "/"
211 : sh002i 555 . "hardcopy/$setName/?" . $self->url_authen_args;
212 : sh002i 526 print CGI::p(CGI::a({-href=>$hardcopyURL}, "Download a hardcopy"),
213 :     "of this problem set.");
214 : sh002i 476
215 : sh002i 469 print CGI::start_table();
216 :     print CGI::Tr(
217 :     CGI::th("Name"),
218 :     CGI::th("Attempts"),
219 :     CGI::th("Remaining"),
220 :     CGI::th("Status"),
221 :     );
222 :    
223 : sh002i 1096 my $set = $db->getMergedSet($effectiveUser, $setName);
224 : sh002i 818 my @problemNumbers = $db->listUserProblems($effectiveUser, $setName);
225 : sh002i 469 foreach my $problemNumber (sort { $a <=> $b } @problemNumbers) {
226 : sh002i 1096 my $problem = $db->getMergedProblem($effectiveUser, $setName, $problemNumber);
227 : sh002i 469 print $self->problemListRow($set, $problem);
228 :     }
229 :    
230 :     print CGI::end_table();
231 :    
232 : sh002i 669 # feedback form
233 : sh002i 809 my $ce = $self->{ce};
234 : sh002i 669 my $root = $ce->{webworkURLs}->{root};
235 :     my $courseName = $ce->{courseName};
236 :     my $feedbackURL = "$root/$courseName/feedback/";
237 :     print
238 :     CGI::startform("POST", $feedbackURL),
239 :     $self->hidden_authen_fields,
240 :     CGI::hidden("module", __PACKAGE__),
241 : sh002i 818 CGI::hidden("set", $set->set_id),
242 : sh002i 669 CGI::p({-align=>"right"},
243 :     CGI::submit(-name=>"feedbackForm", -label=>"Send Feedback")
244 :     ),
245 :     CGI::endform();
246 :    
247 : sh002i 469 return "";
248 : malsyned 353 }
249 :    
250 : sh002i 469 sub problemListRow($$$) {
251 :     my $self = shift;
252 :     my $set = shift;
253 :     my $problem = shift;
254 :    
255 : sh002i 818 my $name = $problem->problem_id;
256 : sh002i 555 my $interactiveURL = "$name/?" . $self->url_authen_args;
257 : sh002i 469 my $interactive = CGI::a({-href=>$interactiveURL}, "Problem $name");
258 :     my $attempts = $problem->num_correct + $problem->num_incorrect;
259 :     my $remaining = $problem->max_attempts < 0
260 :     ? "unlimited"
261 :     : $problem->max_attempts - $attempts;
262 : malsyned 1034 my $status = sprintf("%.0f%%", $problem->status * 100); # round to whole number
263 : sh002i 469
264 : sh002i 526 return CGI::Tr(CGI::td({-nowrap=>1}, [
265 : sh002i 469 $interactive,
266 :     $attempts,
267 :     $remaining,
268 :     $status,
269 :     ]));
270 :     }
271 :    
272 : malsyned 353 1;

aubreyja at gmail dot com
ViewVC Help
Powered by ViewVC 1.0.9