| … | |
… | |
| 20 | use WeBWorK::PG; |
20 | use WeBWorK::PG; |
| 21 | use WeBWorK::PG::IO; |
21 | use WeBWorK::PG::IO; |
| 22 | use WeBWorK::Utils qw(writeLog encodeAnswers decodeAnswers ref2string makeTempDirectory); |
22 | use WeBWorK::Utils qw(writeLog encodeAnswers decodeAnswers ref2string makeTempDirectory); |
| 23 | use WeBWorK::DB::Utils qw(global2user user2global findDefaults); |
23 | use WeBWorK::DB::Utils qw(global2user user2global findDefaults); |
| 24 | use WeBWorK::Timing; |
24 | use WeBWorK::Timing; |
|
|
25 | |
| 25 | ############################################################ |
26 | ############################################################ |
| 26 | # |
27 | # |
| 27 | # user |
28 | # user |
| 28 | # effectiveUser |
29 | # effectiveUser |
| 29 | # key |
30 | # key |
| … | |
… | |
| 314 | my $root = $ce->{webworkURLs}->{root}; |
315 | my $root = $ce->{webworkURLs}->{root}; |
| 315 | my $courseName = $ce->{courseName}; |
316 | my $courseName = $ce->{courseName}; |
| 316 | print CGI::strong("Problems"), CGI::br(); |
317 | print CGI::strong("Problems"), CGI::br(); |
| 317 | |
318 | |
| 318 | my $effectiveUser = $self->{r}->param("effectiveUser"); |
319 | my $effectiveUser = $self->{r}->param("effectiveUser"); |
| 319 | my @problems; |
|
|
| 320 | # push @problems, $db->getMergedProblem($effectiveUser, $setName, $_) |
|
|
| 321 | # foreach ($db->listUserProblems($effectiveUser, $setName)); |
|
|
| 322 | @problems = $db->listUserProblems($effectiveUser, $setName); # this is much faster |
320 | my @problemIDs = $db->listUserProblems($effectiveUser, $setName); |
| 323 | # foreach my $problem (sort { $a->problem_id <=> $b->problem_id } @problems) { |
|
|
| 324 | foreach my $problem (sort { $a <=> $b } @problems) { |
321 | foreach my $problem (sort { $a <=> $b } @problemIDs) { |
| 325 | print CGI::a({-href=>"$root/$courseName/$setName/".$problem."/?" |
322 | print CGI::a({-href=>"$root/$courseName/$setName/".$problem."/?" |
| 326 | . $self->url_authen_args . "&displayMode=" . $self->{displayMode}}, |
323 | . $self->url_authen_args . "&displayMode=" . $self->{displayMode}}, |
| 327 | "Problem ".$problem), CGI::br(); |
324 | "Problem ".$problem), CGI::br(); |
| 328 | } |
325 | } |
| 329 | |
326 | |
| 330 | ''; |
327 | return ""; |
| 331 | } |
328 | } |
| 332 | |
329 | |
| 333 | sub nav { |
330 | sub nav { |
| 334 | $WeBWorK::timer0->continue("begin nav subroutine") if $timer0_ON; |
331 | $WeBWorK::timer0->continue("begin nav subroutine") if $timer0_ON; |
| 335 | my $self = shift; |
332 | my $self = shift; |
| 336 | my $args = $_[-1]; |
333 | my $args = $_[-1]; |
| 337 | my $setName = $self->{set}->set_id; |
334 | my $setName = $self->{set}->set_id; |
| 338 | my $problemNumber = $self->{problem}->problem_id; |
335 | my $problemNumber = $self->{problem}->problem_id; |
| 339 | |
336 | |
| … | |
… | |
| 346 | my $effectiveUser = $self->{r}->param("effectiveUser"); |
343 | my $effectiveUser = $self->{r}->param("effectiveUser"); |
| 347 | my $tail = "&displayMode=".$self->{displayMode}; |
344 | my $tail = "&displayMode=".$self->{displayMode}; |
| 348 | |
345 | |
| 349 | my @links = ("Problem List" , "$root/$courseName/$setName", "navProbList"); |
346 | my @links = ("Problem List" , "$root/$courseName/$setName", "navProbList"); |
| 350 | |
347 | |
| 351 | # FIXME: this could be faster |
348 | my @problemIDs = $db->listUserProblems($effectiveUser, $setName); |
| 352 | my $prevProblem = $db->getMergedProblem($effectiveUser, $setName, $problemNumber-1); |
349 | my ($prevID, $nextID); |
| 353 | my $nextProblem = $db->getMergedProblem($effectiveUser, $setName, $problemNumber+1); |
350 | foreach my $id (@problemIDs) { |
|
|
351 | $prevID = $id if $id < $problemNumber |
|
|
352 | and (not defined $prevID or $id > $prevID); |
|
|
353 | $nextID = $id if $id > $problemNumber |
|
|
354 | and (not defined $nextID or $id < $nextID); |
|
|
355 | } |
| 354 | unshift @links, "Previous Problem" , ($prevProblem |
356 | unshift @links, "Previous Problem" , ($prevID |
| 355 | ? "$root/$courseName/$setName/".$prevProblem->problem_id |
357 | ? "$root/$courseName/$setName/".$prevID |
| 356 | : "") , "navPrev"; |
358 | : "") , "navPrev"; |
| 357 | push @links, "Next Problem" , ($nextProblem |
359 | push @links, "Next Problem" , ($nextID |
| 358 | ? "$root/$courseName/$setName/".$nextProblem->problem_id |
360 | ? "$root/$courseName/$setName/".$nextID |
| 359 | : "") , "navNext"; |
361 | : "") , "navNext"; |
| 360 | |
362 | |
| 361 | my $result = $self->navMacro($args, $tail, @links); |
363 | my $result = $self->navMacro($args, $tail, @links); |
| 362 | $WeBWorK::timer0->continue("end nav subroutine") if $timer0_ON; |
364 | $WeBWorK::timer0->continue("end nav subroutine") if $timer0_ON; |
| 363 | return $result; |
365 | return $result; |
| 364 | |
|
|
| 365 | } |
366 | } |
| 366 | |
367 | |
| 367 | sub title { |
368 | sub title { |
| 368 | my $self = shift; |
369 | my $self = shift; |
| 369 | my $setName = $self->{set}->set_id; |
370 | my $setName = $self->{set}->set_id; |
| … | |
… | |
| 456 | } |
457 | } |
| 457 | } |
458 | } |
| 458 | # logging student answers |
459 | # logging student answers |
| 459 | my $pastAnswerLog = undef; |
460 | my $pastAnswerLog = undef; |
| 460 | if (defined( $self->{ce}->{webworkFiles}->{logs}->{'pastAnswerList'} )) { |
461 | if (defined( $self->{ce}->{webworkFiles}->{logs}->{'pastAnswerList'} )) { |
| 461 | |
|
|
| 462 | $pastAnswerLog = $self->{ce}->{webworkFiles}->{logs}->{'pastAnswerList'}; |
462 | $pastAnswerLog = $self->{ce}->{webworkFiles}->{logs}->{'pastAnswerList'}; |
| 463 | |
|
|
| 464 | if ($submitAnswers and defined($pastAnswerLog) ) { |
463 | if ($submitAnswers and defined $pastAnswerLog) { |
| 465 | my $answerString = ""; |
464 | my $answerString = ""; |
| 466 | my %answerHash = %{ $pg->{answers} }; |
465 | my %answerHash = %{ $pg->{answers} }; |
| 467 | $answerString = $answerString . $answerHash{$_}->{original_student_ans}."\t" |
466 | $answerString = $answerString . $answerHash{$_}->{original_student_ans}."\t" |
| 468 | foreach (sort keys %answerHash); |
467 | foreach (sort keys %answerHash); |
| 469 | $answerString = '' unless defined($answerString); # insure string is defined. |
468 | $answerString = '' unless defined($answerString); # insure string is defined. |
| … | |
… | |
| 471 | '|'.$problem->user_id. |
470 | '|'.$problem->user_id. |
| 472 | '|'.$problem->set_id. |
471 | '|'.$problem->set_id. |
| 473 | '|'.$problem->problem_id.'|'."\t". |
472 | '|'.$problem->problem_id.'|'."\t". |
| 474 | time()."\t". |
473 | time()."\t". |
| 475 | $answerString, |
474 | $answerString, |
| 476 | |
|
|
| 477 | ); |
475 | ); |
| 478 | |
|
|
| 479 | } |
476 | } |
| 480 | |
|
|
| 481 | } |
477 | } |
| 482 | # end logging student answers |
478 | # end logging student answers |
|
|
479 | |
| 483 | $WeBWorK::timer0->continue("end answer processing") if $timer0_ON; |
480 | $WeBWorK::timer0->continue("end answer processing") if $timer0_ON; |
|
|
481 | |
| 484 | ##### output ##### |
482 | ##### output ##### |
| 485 | |
483 | |
| 486 | print CGI::start_div({class=>"problemHeader"}); |
484 | print CGI::start_div({class=>"problemHeader"}); |
| 487 | |
485 | |
| 488 | # custom message for editor |
486 | # custom message for editor |