| … | |
… | |
| 9 | =head1 NAME |
9 | =head1 NAME |
| 10 | |
10 | |
| 11 | WeBWorK::ContentGenerator::Problem - Allow a student to interact with a problem. |
11 | WeBWorK::ContentGenerator::Problem - Allow a student to interact with a problem. |
| 12 | |
12 | |
| 13 | =cut |
13 | =cut |
| 14 | |
14 | my $timer0_ON=0; # times pg translation phase |
| 15 | use strict; |
15 | use strict; |
| 16 | use warnings; |
16 | use warnings; |
| 17 | use CGI qw(); |
17 | use CGI qw(); |
| 18 | use File::Path qw(rmtree); |
18 | use File::Path qw(rmtree); |
| 19 | use WeBWorK::Form; |
19 | use WeBWorK::Form; |
| … | |
… | |
| 219 | my %oldAnswers = decodeAnswers($problem->last_answer); |
219 | my %oldAnswers = decodeAnswers($problem->last_answer); |
| 220 | $formFields->{$_} = $oldAnswers{$_} foreach keys %oldAnswers; |
220 | $formFields->{$_} = $oldAnswers{$_} foreach keys %oldAnswers; |
| 221 | } |
221 | } |
| 222 | |
222 | |
| 223 | ##### translation ##### |
223 | ##### translation ##### |
| 224 | |
224 | |
|
|
225 | $WeBWorK::timer0->continue("begin pg processing") if $timer0_ON; |
| 225 | my $pg = WeBWorK::PG->new( |
226 | my $pg = WeBWorK::PG->new( |
| 226 | $courseEnv, |
227 | $courseEnv, |
| 227 | $effectiveUser, |
228 | $effectiveUser, |
| 228 | $key, |
229 | $key, |
| 229 | $set, |
230 | $set, |
| … | |
… | |
| 237 | refreshMath2img => $will{showHints} || $will{showSolutions}, |
238 | refreshMath2img => $will{showHints} || $will{showSolutions}, |
| 238 | processAnswers => 1, |
239 | processAnswers => 1, |
| 239 | }, |
240 | }, |
| 240 | ); |
241 | ); |
| 241 | |
242 | |
|
|
243 | $WeBWorK::timer0->continue("end pg processing") if $timer0_ON; |
| 242 | ##### fix hint/solution options ##### |
244 | ##### fix hint/solution options ##### |
| 243 | |
245 | |
| 244 | $can{showHints} &&= $pg->{flags}->{hintExists}; |
246 | $can{showHints} &&= $pg->{flags}->{hintExists}; |
| 245 | $can{showSolutions} &&= $pg->{flags}->{solutionExists}; |
247 | $can{showSolutions} &&= $pg->{flags}->{solutionExists}; |
| 246 | |
248 | |
| … | |
… | |
| 309 | |
311 | |
| 310 | my $ce = $self->{ce}; |
312 | my $ce = $self->{ce}; |
| 311 | my $db = $self->{db}; |
313 | my $db = $self->{db}; |
| 312 | my $root = $ce->{webworkURLs}->{root}; |
314 | my $root = $ce->{webworkURLs}->{root}; |
| 313 | my $courseName = $ce->{courseName}; |
315 | my $courseName = $ce->{courseName}; |
| 314 | my $timer0 = WeBWorK::Timing->new("time siblings"); |
|
|
| 315 | $timer0->start; |
|
|
| 316 | print CGI::strong("Problems"), CGI::br(); |
316 | print CGI::strong("Problems"), CGI::br(); |
| 317 | |
317 | |
| 318 | my $effectiveUser = $self->{r}->param("effectiveUser"); |
318 | my $effectiveUser = $self->{r}->param("effectiveUser"); |
| 319 | my @problems; |
319 | my @problems; |
| 320 | # push @problems, $db->getMergedProblem($effectiveUser, $setName, $_) |
320 | # push @problems, $db->getMergedProblem($effectiveUser, $setName, $_) |
| … | |
… | |
| 324 | foreach my $problem (sort { $a <=> $b } @problems) { |
324 | foreach my $problem (sort { $a <=> $b } @problems) { |
| 325 | print CGI::a({-href=>"$root/$courseName/$setName/".$problem."/?" |
325 | print CGI::a({-href=>"$root/$courseName/$setName/".$problem."/?" |
| 326 | . $self->url_authen_args . "&displayMode=" . $self->{displayMode}}, |
326 | . $self->url_authen_args . "&displayMode=" . $self->{displayMode}}, |
| 327 | "Problem ".$problem), CGI::br(); |
327 | "Problem ".$problem), CGI::br(); |
| 328 | } |
328 | } |
| 329 | $timer0->stop; |
329 | |
| 330 | $timer0->save; |
|
|
| 331 | ''; |
330 | ''; |
| 332 | } |
331 | } |
| 333 | |
332 | |
| 334 | sub nav { |
333 | sub nav { |
|
|
334 | $WeBWorK::timer0->continue("begin nav subroutine") if $timer0_ON; |
| 335 | my $self = shift; |
335 | my $self = shift; |
| 336 | my $args = $_[-1]; |
336 | my $args = $_[-1]; |
| 337 | my $setName = $self->{set}->set_id; |
337 | my $setName = $self->{set}->set_id; |
| 338 | my $problemNumber = $self->{problem}->problem_id; |
338 | my $problemNumber = $self->{problem}->problem_id; |
| 339 | |
339 | |
| … | |
… | |
| 356 | : "") , "navPrev"; |
356 | : "") , "navPrev"; |
| 357 | push @links, "Next Problem" , ($nextProblem |
357 | push @links, "Next Problem" , ($nextProblem |
| 358 | ? "$root/$courseName/$setName/".$nextProblem->problem_id |
358 | ? "$root/$courseName/$setName/".$nextProblem->problem_id |
| 359 | : "") , "navNext"; |
359 | : "") , "navNext"; |
| 360 | |
360 | |
| 361 | return $self->navMacro($args, $tail, @links); |
361 | my $result = $self->navMacro($args, $tail, @links); |
|
|
362 | $WeBWorK::timer0->continue("end nav subroutine") if $timer0_ON; |
|
|
363 | return $result; |
|
|
364 | |
| 362 | } |
365 | } |
| 363 | |
366 | |
| 364 | sub title { |
367 | sub title { |
| 365 | my $self = shift; |
368 | my $self = shift; |
| 366 | my $setName = $self->{set}->set_id; |
369 | my $setName = $self->{set}->set_id; |
| … | |
… | |
| 396 | if ($pg->{flags}->{error_flag}) { |
399 | if ($pg->{flags}->{error_flag}) { |
| 397 | return $self->errorOutput($pg->{errors}, $pg->{body_text}); |
400 | return $self->errorOutput($pg->{errors}, $pg->{body_text}); |
| 398 | } |
401 | } |
| 399 | |
402 | |
| 400 | ##### answer processing ##### |
403 | ##### answer processing ##### |
| 401 | |
404 | $WeBWorK::timer0->continue("begin answer processing") if $timer0_ON; |
| 402 | # if answers were submitted: |
405 | # if answers were submitted: |
| 403 | if ($submitAnswers) { |
406 | if ($submitAnswers) { |
| 404 | # get a "pure" (unmerged) UserProblem to modify |
407 | # get a "pure" (unmerged) UserProblem to modify |
| 405 | # this will be undefined if the problem has not been assigned to this user |
408 | # this will be undefined if the problem has not been assigned to this user |
| 406 | my $pureProblem = $db->getUserProblem($problem->user_id, $problem->set_id, $problem->problem_id); |
409 | my $pureProblem = $db->getUserProblem($problem->user_id, $problem->set_id, $problem->problem_id); |
| … | |
… | |
| 475 | |
478 | |
| 476 | } |
479 | } |
| 477 | |
480 | |
| 478 | } |
481 | } |
| 479 | # end logging student answers |
482 | # end logging student answers |
| 480 | |
483 | $WeBWorK::timer0->continue("end answer processing") if $timer0_ON; |
| 481 | ##### output ##### |
484 | ##### output ##### |
| 482 | |
485 | |
| 483 | print CGI::start_div({class=>"problemHeader"}); |
486 | print CGI::start_div({class=>"problemHeader"}); |
| 484 | |
487 | |
| 485 | # custom message for editor |
488 | # custom message for editor |