| … | |
… | |
| 16 | use warnings; |
16 | use warnings; |
| 17 | use base qw(WeBWorK::ContentGenerator); |
17 | use base qw(WeBWorK::ContentGenerator); |
| 18 | use CGI qw(); |
18 | use CGI qw(); |
| 19 | use File::Path qw(rmtree); |
19 | use File::Path qw(rmtree); |
| 20 | use File::Temp qw(tempdir); |
20 | use File::Temp qw(tempdir); |
| 21 | use WeBWorK::DB::Classlist; |
|
|
| 22 | use WeBWorK::DB::WW; |
|
|
| 23 | use WeBWorK::Form; |
21 | use WeBWorK::Form; |
| 24 | use WeBWorK::Utils qw(readFile); |
22 | use WeBWorK::Utils qw(readFile); |
| 25 | |
23 | |
| 26 | sub go { |
24 | sub go { |
| 27 | my ($self, $singleSet) = @_; |
25 | my ($self, $singleSet) = @_; |
| 28 | |
26 | |
| 29 | my $r = $self->{r}; |
27 | my $r = $self->{r}; |
| 30 | my $ce = $self->{ce}; |
28 | my $ce = $self->{ce}; |
|
|
29 | my $db = $self->{db}; |
| 31 | my @sets = $r->param("hcSet"); |
30 | my @sets = $r->param("hcSet"); |
| 32 | my @users = $r->param("hcUser"); |
31 | my @users = $r->param("hcUser"); |
| 33 | |
32 | |
| 34 | # add singleSet to the list of sets |
33 | # add singleSet to the list of sets |
| 35 | if (length $singleSet > 0) { |
34 | if (length $singleSet > 0) { |
| … | |
… | |
| 40 | # default user is the effectiveUser |
39 | # default user is the effectiveUser |
| 41 | unless (@users) { |
40 | unless (@users) { |
| 42 | unshift @users, $r->param("effectiveUser"); |
41 | unshift @users, $r->param("effectiveUser"); |
| 43 | } |
42 | } |
| 44 | |
43 | |
| 45 | $self->{cldb} = WeBWorK::DB::Classlist->new($ce); |
|
|
| 46 | $self->{authdb} = WeBWorK::DB::Auth->new($ce); |
|
|
| 47 | $self->{wwdb} = WeBWorK::DB::WW->new($ce); |
|
|
| 48 | $self->{user} = $self->{cldb}->getUser($r->param("user")); |
44 | $self->{user} = $db->getUser($r->param("user")); |
| 49 | $self->{permissionLevel} = $self->{authdb}->getPermissions($r->param("user")); |
45 | $self->{permissionLevel} = $db->getPermissionLevel($r->param("user"))->permission(); |
| 50 | $self->{effectiveUser} = $self->{cldb}->getUser($r->param("effectiveUser")); |
46 | $self->{effectiveUser} = $db->getUser($r->param("effectiveUser")); |
| 51 | $self->{sets} = \@sets; |
47 | $self->{sets} = \@sets; |
| 52 | $self->{users} = \@users; |
48 | $self->{users} = \@users; |
| 53 | $self->{errors} = []; |
49 | $self->{errors} = []; |
| 54 | $self->{warnings} = []; |
50 | $self->{warnings} = []; |
| 55 | |
51 | |
| … | |
… | |
| 162 | # ----- |
158 | # ----- |
| 163 | |
159 | |
| 164 | sub displayForm($) { |
160 | sub displayForm($) { |
| 165 | my $self = shift; |
161 | my $self = shift; |
| 166 | my $r = $self->{r}; |
162 | my $r = $self->{r}; |
|
|
163 | my $db = $self->{db}; |
| 167 | |
164 | |
| 168 | print CGI::start_p(), "Select the problem sets for which to generate hardcopy versions."; |
165 | print CGI::start_p(), "Select the problem sets for which to generate hardcopy versions."; |
| 169 | if ($self->{permissionLevel} > 0) { |
166 | if ($self->{permissionLevel} > 0) { |
| 170 | print "You may also select multiple users from the users list. You will receive hardcopy for each (set, user) pair."; |
167 | print "You may also select multiple users from the users list. You will receive hardcopy for each (set, user) pair."; |
| 171 | } |
168 | } |
| … | |
… | |
| 202 | { |
199 | { |
| 203 | print CGI::start_td(); |
200 | print CGI::start_td(); |
| 204 | print CGI::h3("Sets"); |
201 | print CGI::h3("Sets"); |
| 205 | print CGI::start_table(); |
202 | print CGI::start_table(); |
| 206 | my @sets; |
203 | my @sets; |
| 207 | push @sets, $self->{wwdb}->getSet($self->{effectiveUser}->id, $_) |
204 | push @sets, $db->getGlobalUserSet($self->{effectiveUser}->id, $_) |
| 208 | foreach ($self->{wwdb}->getSets($self->{effectiveUser}->id)); |
205 | foreach ($db->listUserSets($self->{effectiveUser}->id)); |
| 209 | @sets = sort { $a->id cmp $b->id } @sets; |
206 | @sets = sort { $a->set_id cmp $b->set_id } @sets; |
| 210 | foreach my $set (@sets) { |
207 | foreach my $set (@sets) { |
| 211 | my $checked = grep { $_ eq $set->id } @{$self->{sets}}; |
208 | my $checked = grep { $_ eq $set->set_id } @{$self->{sets}}; |
| 212 | my $control; |
209 | my $control; |
| 213 | if (time < $set->open_date and not $preOpenSets) { |
210 | if (time < $set->open_date and not $preOpenSets) { |
| 214 | $control = ""; |
211 | $control = ""; |
| 215 | } else { |
212 | } else { |
| 216 | if ($multiSet) { |
213 | if ($multiSet) { |
| 217 | $control = CGI::checkbox( |
214 | $control = CGI::checkbox( |
| 218 | -name=>"hcSet", |
215 | -name=>"hcSet", |
| 219 | -value=>$set->id, |
216 | -value=>$set->set_id, |
| 220 | -label=>"", |
217 | -label=>"", |
| 221 | -checked=>$checked |
218 | -checked=>$checked |
| 222 | ); |
219 | ); |
| 223 | } else { |
220 | } else { |
| 224 | $control = CGI::radio_group( |
221 | $control = CGI::radio_group( |
| 225 | -name=>"hcSet", |
222 | -name=>"hcSet", |
| 226 | -values=>[$set->id], |
223 | -values=>[$set->set_id], |
| 227 | -default=>($checked ? $set->id : "-"), |
224 | -default=>($checked ? $set->set_id : "-"), |
| 228 | -labels=>{$set->id => ""} |
225 | -labels=>{$set->set_id => ""} |
| 229 | ); |
226 | ); |
| 230 | } |
227 | } |
| 231 | } |
228 | } |
| 232 | print CGI::Tr(CGI::td([ |
229 | print CGI::Tr(CGI::td([ |
| 233 | $control, |
230 | $control, |
| 234 | $set->id, |
231 | $set->set_id, |
| 235 | ])); |
232 | ])); |
| 236 | } |
233 | } |
| 237 | print CGI::end_table(); |
234 | print CGI::end_table(); |
| 238 | print CGI::end_td(); |
235 | print CGI::end_td(); |
| 239 | } |
236 | } |
| … | |
… | |
| 248 | # CGI::td({-colspan=>"2"}, "All Users"), |
245 | # CGI::td({-colspan=>"2"}, "All Users"), |
| 249 | #); |
246 | #); |
| 250 | #print CGI::Tr(CGI::td({-colspan=>"3"}, " ")); |
247 | #print CGI::Tr(CGI::td({-colspan=>"3"}, " ")); |
| 251 | my @users; |
248 | my @users; |
| 252 | push @users, $self->{cldb}->getUser($_) |
249 | push @users, $self->{cldb}->getUser($_) |
| 253 | foreach ($self->{cldb}->getUsers()); |
250 | foreach ($self->{cldb}->listUsers()); |
| 254 | @users = sort { $a->last_name cmp $b->last_name } @users; |
251 | @users = sort { $a->last_name cmp $b->last_name } @users; |
| 255 | foreach my $user (@users) { |
252 | foreach my $user (@users) { |
| 256 | my $checked = grep { $_ eq $user->id } @{$self->{users}}; |
253 | my $checked = grep { $_ eq $user->id } @{$self->{users}}; |
| 257 | print CGI::Tr(CGI::td([ |
254 | print CGI::Tr(CGI::td([ |
| 258 | CGI::checkbox(-name=>"hcUser", -value=>$user->id, -label=>"", -checked=>$checked), |
255 | CGI::checkbox(-name=>"hcUser", -value=>$user->id, -label=>"", -checked=>$checked), |
| … | |
… | |
| 406 | } |
403 | } |
| 407 | |
404 | |
| 408 | sub getSetTeX { |
405 | sub getSetTeX { |
| 409 | my ($self, $setName) = @_; |
406 | my ($self, $setName) = @_; |
| 410 | my $ce = $self->{ce}; |
407 | my $ce = $self->{ce}; |
| 411 | my $wwdb = $self->{wwdb}; |
408 | my $db = $self->{db}; |
| 412 | my $effectiveUserName = $self->{effectiveUser}->id; |
409 | my $effectiveUserName = $self->{effectiveUser}->id; |
| 413 | my @problemNumbers = sort { $a <=> $b } $wwdb->getProblems($effectiveUserName, $setName); |
410 | my @problemNumbers = sort { $a <=> $b } |
|
|
411 | $db->listUserProblems($effectiveUserName, $setName); |
| 414 | |
412 | |
| 415 | # get header and footer |
413 | # get header and footer |
| 416 | my $setHeader = $wwdb->getSet($effectiveUserName, $setName)->set_header |
414 | my $setHeader = $db->getGlobalUserSet($effectiveUserName, $setName)->set_header |
| 417 | || $ce->{webworkFiles}->{hardcopySnippets}->{setHeader}; |
415 | || $ce->{webworkFiles}->{hardcopySnippets}->{setHeader}; |
| 418 | # database doesn't support the following yet :( |
416 | # database doesn't support the following yet :( |
| 419 | #my $setFooter = $wwdb->getSet($effectiveUserName, $setName)->set_footer |
417 | #my $setFooter = $wwdb->getGlobalUserSet($effectiveUserName, $setName)->set_footer |
| 420 | # || $ce->{webworkFiles}->{hardcopySnippets}->{setFooter}; |
418 | # || $ce->{webworkFiles}->{hardcopySnippets}->{setFooter}; |
| 421 | # so we don't allow per-set customization, which is probably okay :) |
419 | # so we don't allow per-set customization, which is probably okay :) |
| 422 | my $setFooter = $ce->{webworkFiles}->{hardcopySnippets}->{setFooter}; |
420 | my $setFooter = $ce->{webworkFiles}->{hardcopySnippets}->{setFooter}; |
| 423 | |
421 | |
| 424 | my $tex = ""; |
422 | my $tex = ""; |
| … | |
… | |
| 446 | |
444 | |
| 447 | sub getProblemTeX { |
445 | sub getProblemTeX { |
| 448 | my ($self, $setName, $problemNumber, $pgFile) = @_; |
446 | my ($self, $setName, $problemNumber, $pgFile) = @_; |
| 449 | my $r = $self->{r}; |
447 | my $r = $self->{r}; |
| 450 | my $ce = $self->{ce}; |
448 | my $ce = $self->{ce}; |
| 451 | |
|
|
| 452 | my $wwdb = $self->{wwdb}; |
449 | my $db = $self->{db}; |
| 453 | my $cldb = $self->{cldb}; |
450 | |
| 454 | my $authdb = $self->{authdb}; |
|
|
| 455 | my $effectiveUser = $self->{effectiveUser}; |
451 | my $effectiveUser = $self->{effectiveUser}; |
| 456 | my $permissionLevel = $self->{permissionLevel}; |
452 | my $permissionLevel = $self->{permissionLevel}; |
| 457 | my $set = $wwdb->getSet($effectiveUser->id, $setName); |
453 | my $set = $db->getGlobalUserSet($effectiveUser->id, $setName); |
| 458 | my $psvn = $wwdb->getPSVN($effectiveUser->id, $setName); |
454 | my $psvn = $set->psvn(); |
| 459 | |
455 | |
| 460 | # decide what to do about problem number |
456 | # decide what to do about problem number |
| 461 | my $problem; |
457 | my $problem; |
| 462 | if ($problemNumber) { |
458 | if ($problemNumber) { |
| 463 | $problem = $wwdb->getProblem($effectiveUser->id, $setName, $problemNumber); |
459 | $problem = $db->getGlobalUserProblem($effectiveUser->id, $setName, $problemNumber); |
| 464 | } elsif ($pgFile) { |
460 | } elsif ($pgFile) { |
| 465 | $problem = WeBWorK::Problem->new( |
461 | $problem = WeBWorK::DB::Record::UserProblem->new( |
| 466 | id => 0, |
|
|
| 467 | set_id => $set->id, |
462 | set_id => $set->set_id, |
|
|
463 | problem_id => 0, |
| 468 | login_id => $effectiveUser->id, |
464 | login_id => $effectiveUser->id, |
| 469 | source_file => $pgFile, |
465 | source_file => $pgFile, |
| 470 | # the rest of Problem's fields are not needed, i think |
466 | # the rest of Problem's fields are not needed, i think |
| 471 | ); |
467 | ); |
| 472 | } |
468 | } |