| 1 | ################################################################################ |
1 | ################################################################################ |
| 2 | # WeBWorK Online Homework Delivery System |
2 | # WeBWorK Online Homework Delivery System |
| 3 | # Copyright © 2000-2003 The WeBWorK Project, http://openwebwork.sf.net/ |
3 | # Copyright © 2000-2003 The WeBWorK Project, http://openwebwork.sf.net/ |
| 4 | # $CVSHeader: webwork-modperl/lib/WeBWorK/ContentGenerator/Problem.pm,v 1.121 2004/04/07 22:18:46 gage Exp $ |
4 | # $CVSHeader: webwork-modperl/lib/WeBWorK/ContentGenerator/Problem.pm,v 1.122 2004/04/28 15:51:19 gage Exp $ |
| 5 | # |
5 | # |
| 6 | # This program is free software; you can redistribute it and/or modify it under |
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 |
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 |
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. |
9 | # version, or (b) the "Artistic License" which comes with this package. |
| … | |
… | |
| 150 | if (defined $problemSeed) { |
150 | if (defined $problemSeed) { |
| 151 | $problem->problem_seed($problemSeed); |
151 | $problem->problem_seed($problemSeed); |
| 152 | } |
152 | } |
| 153 | } else { |
153 | } else { |
| 154 | # students can't view problems not assigned to them |
154 | # students can't view problems not assigned to them |
| 155 | die "Set $setName is not assigned to $effectiveUserName" |
155 | # die "Set $setName is not assigned to $effectiveUserName" unless defined $set; |
| 156 | unless defined $set; |
|
|
| 157 | die "Problem $problemNumber in set $setName is not assigned to $effectiveUserName" |
156 | # die "Problem $problemNumber in set $setName is not assigned to $effectiveUserName" unless defined $problem; |
| 158 | unless defined $problem; |
157 | |
|
|
158 | # We don't want to die if this set does not exist or isn't defined for this user |
|
|
159 | # we'll just return a page with nothing but an error on it. |
|
|
160 | $self->{invalidSet} = (grep /$setName/, $db->listUserSets($effectiveUserName)) == 0; |
|
|
161 | $self->{invalidProblem} = (grep /$problemNumber/, $db->listUserProblems($effectiveUserName, $setName)) == 0; |
|
|
162 | |
| 159 | } |
163 | } |
| 160 | |
164 | |
| 161 | $self->{userName} = $userName; |
165 | $self->{userName} = $userName; |
| 162 | $self->{effectiveUserName} = $effectiveUserName; |
166 | $self->{effectiveUserName} = $effectiveUserName; |
| 163 | $self->{user} = $user; |
167 | $self->{user} = $user; |
| … | |
… | |
| 182 | $self->{redisplay} = $redisplay; |
186 | $self->{redisplay} = $redisplay; |
| 183 | $self->{submitAnswers} = $submitAnswers; |
187 | $self->{submitAnswers} = $submitAnswers; |
| 184 | $self->{checkAnswers} = $checkAnswers; |
188 | $self->{checkAnswers} = $checkAnswers; |
| 185 | $self->{previewAnswers} = $previewAnswers; |
189 | $self->{previewAnswers} = $previewAnswers; |
| 186 | $self->{formFields} = $formFields; |
190 | $self->{formFields} = $formFields; |
|
|
191 | |
|
|
192 | # now that we've set all the necessary variables quit out if the set or problem is invalid |
|
|
193 | return if $self->{invalidSet} || $self->{invalidProblem}; |
| 187 | |
194 | |
| 188 | ##### permissions ##### |
195 | ##### permissions ##### |
| 189 | |
196 | |
| 190 | # are we allowed to view this problem? |
197 | # are we allowed to view this problem? |
| 191 | $self->{isOpen} = time >= $set->open_date || $permissionLevel > 0; |
198 | $self->{isOpen} = time >= $set->open_date || $permissionLevel > 0; |
| … | |
… | |
| 330 | } |
337 | } |
| 331 | |
338 | |
| 332 | sub options { |
339 | sub options { |
| 333 | my ($self) = @_; |
340 | my ($self) = @_; |
| 334 | |
341 | |
|
|
342 | return "" if $self->{invalidProblem}; |
|
|
343 | |
| 335 | return join("", |
344 | return join("", |
| 336 | CGI::start_form("POST", $self->{r}->uri), |
345 | CGI::start_form("POST", $self->{r}->uri), |
| 337 | $self->hidden_authen_fields, |
346 | $self->hidden_authen_fields, |
| 338 | CGI::hr(), |
347 | CGI::hr(), |
| 339 | CGI::start_div({class=>"viewOptions"}), |
348 | CGI::start_div({class=>"viewOptions"}), |
| … | |
… | |
| 364 | my ($self) = @_; |
373 | my ($self) = @_; |
| 365 | my $r = $self->r; |
374 | my $r = $self->r; |
| 366 | my $db = $r->db; |
375 | my $db = $r->db; |
| 367 | my $urlpath = $r->urlpath; |
376 | my $urlpath = $r->urlpath; |
| 368 | |
377 | |
|
|
378 | # can't show sibling problems if the set is invalid |
|
|
379 | return "" if $self->{invalidSet}; |
|
|
380 | |
| 369 | my $courseID = $urlpath->arg("courseID"); |
381 | my $courseID = $urlpath->arg("courseID"); |
| 370 | my $setID = $self->{set}->set_id; |
382 | my $setID = $self->{set}->set_id; |
| 371 | my $eUserID = $r->param("effectiveUser"); |
383 | my $eUserID = $r->param("effectiveUser"); |
| 372 | my @problemIDs = sort { $a <=> $b } $db->listUserProblems($eUserID, $setID); |
384 | my @problemIDs = sort { $a <=> $b } $db->listUserProblems($eUserID, $setID); |
| 373 | |
385 | |
| … | |
… | |
| 394 | my $r = $self->r; |
406 | my $r = $self->r; |
| 395 | my $db = $r->db; |
407 | my $db = $r->db; |
| 396 | my $urlpath = $r->urlpath; |
408 | my $urlpath = $r->urlpath; |
| 397 | |
409 | |
| 398 | my $courseID = $urlpath->arg("courseID"); |
410 | my $courseID = $urlpath->arg("courseID"); |
| 399 | my $setID = $self->{set}->set_id; |
411 | my $setID = $self->{set}->set_id if !($self->{invalidSet}); |
| 400 | my $problemID = $self->{problem}->problem_id; |
412 | my $problemID = $self->{problem}->problem_id if !($self->{invalidProblem}); |
| 401 | my $eUserID = $r->param("effectiveUser"); |
413 | my $eUserID = $r->param("effectiveUser"); |
| 402 | |
414 | |
| 403 | my ($prevID, $nextID); |
415 | my ($prevID, $nextID); |
| 404 | |
416 | |
|
|
417 | if (!$self->{invalidProblem}) { |
| 405 | my @problemIDs = $db->listUserProblems($eUserID, $setID); |
418 | my @problemIDs = $db->listUserProblems($eUserID, $setID); |
| 406 | foreach my $id (@problemIDs) { |
419 | foreach my $id (@problemIDs) { |
| 407 | $prevID = $id if $id < $problemID |
420 | $prevID = $id if $id < $problemID |
| 408 | and (not defined $prevID or $id > $prevID); |
421 | and (not defined $prevID or $id > $prevID); |
| 409 | $nextID = $id if $id > $problemID |
422 | $nextID = $id if $id > $problemID |
| 410 | and (not defined $nextID or $id < $nextID); |
423 | and (not defined $nextID or $id < $nextID); |
| 411 | } |
424 | } |
| 412 | |
425 | } |
|
|
426 | |
| 413 | my @links; |
427 | my @links; |
| 414 | |
428 | |
| 415 | if ($prevID) { |
429 | if ($prevID) { |
| 416 | my $prevPage = $urlpath->newFromModule(__PACKAGE__, |
430 | my $prevPage = $urlpath->newFromModule(__PACKAGE__, |
| 417 | courseID => $courseID, setID => $setID, problemID => $prevID); |
431 | courseID => $courseID, setID => $setID, problemID => $prevID); |
| 418 | push @links, "Previous Problem", $r->location . $prevPage->path, "navPrev"; |
432 | push @links, "Previous Problem", $r->location . $prevPage->path, "navPrev"; |
| 419 | } else { |
433 | } else { |
| 420 | push @links, "Previous Problem", "", "navPrev"; |
434 | push @links, "Previous Problem", "", "navPrev"; |
| 421 | } |
435 | } |
| 422 | |
436 | |
| 423 | push @links, "Problem List", $r->location . $urlpath->parent->path, "navProbList"; |
437 | push @links, "Problem List", $r->location . $urlpath->parent->path, "navProbList"; |
| 424 | |
438 | |
| 425 | if ($nextID) { |
439 | if ($nextID) { |
| 426 | my $nextPage = $urlpath->newFromModule(__PACKAGE__, |
440 | my $nextPage = $urlpath->newFromModule(__PACKAGE__, |
| 427 | courseID => $courseID, setID => $setID, problemID => $nextID); |
441 | courseID => $courseID, setID => $setID, problemID => $nextID); |
| 428 | push @links, "Next Problem", $r->location . $nextPage->path, "navNext"; |
442 | push @links, "Next Problem", $r->location . $nextPage->path, "navNext"; |
| 429 | } else { |
443 | } else { |
| 430 | push @links, "Next Problem", "", "navNext"; |
444 | push @links, "Next Problem", "", "navNext"; |
| 431 | } |
445 | } |
| 432 | |
446 | |
| 433 | my $tail = "&displayMode=".$self->{displayMode}; |
447 | my $tail = "&displayMode=".$self->{displayMode}; |
| 434 | return $self->navMacro($args, $tail, @links); |
448 | return $self->navMacro($args, $tail, @links); |
| 435 | } |
449 | } |
| 436 | |
450 | |
| 437 | sub title { |
451 | sub title { |
| 438 | my ($self) = @_; |
452 | my ($self) = @_; |
|
|
453 | |
|
|
454 | # using the url arguments won't break if the set/problem are invalid |
|
|
455 | my $setID = $self->r->urlpath->arg("setID"); |
|
|
456 | my $problemID = $self->r->urlpath->arg("problemID"); |
| 439 | |
457 | |
| 440 | my $setID = $self->{set}->set_id; |
458 | #my $setID = $self->{set}->set_id; |
| 441 | my $problemID = $self->{problem}->problem_id; |
459 | #my $problemID = $self->{problem}->problem_id; |
| 442 | |
460 | |
| 443 | return "$setID : $problemID"; |
461 | return "$setID : $problemID"; |
| 444 | } |
462 | } |
| 445 | |
463 | |
| 446 | sub body { |
464 | sub body { |
| 447 | my $self = shift; |
465 | my $self = shift; |
| 448 | my $r = $self->r; |
466 | my $r = $self->r; |
| 449 | my $ce = $r->ce; |
467 | my $ce = $r->ce; |
| 450 | my $db = $r->db; |
468 | my $db = $r->db; |
| 451 | my $urlpath = $r->urlpath; |
469 | my $urlpath = $r->urlpath; |
|
|
470 | |
|
|
471 | if ($self->{invalidSet}) { |
|
|
472 | return CGI::div({class=>"ResultsWithError"}, |
|
|
473 | CGI::p("The selected problem set (" . $urlpath->arg("setID") . ") is not a valid set for " . $r->param("effectiveUser") . ".")); |
|
|
474 | } |
| 452 | |
475 | |
|
|
476 | if ($self->{invalidProblem}) { |
|
|
477 | return CGI::div({class=>"ResultsWithError"}, |
|
|
478 | CGI::p("The selected problem (" . $urlpath->arg("problemID") . ") is not a valid problem for set " . $self->{set}->set_id . ".")); |
|
|
479 | } |
|
|
480 | |
| 453 | unless ($self->{isOpen}) { |
481 | unless ($self->{isOpen}) { |
| 454 | return CGI::div({class=>"ResultsWithError"}, |
482 | return CGI::div({class=>"ResultsWithError"}, |
| 455 | CGI::p("This problem is not available because the problem set that contains it is not yet open.")); |
483 | CGI::p("This problem is not available because the problem set that contains it is not yet open.")); |
| 456 | } |
484 | } |
| 457 | # unpack some useful variables |
485 | # unpack some useful variables |