| … | |
… | |
| 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; |
| 20 | use WeBWorK::PG; |
20 | use WeBWorK::PG; |
|
|
21 | use WeBWorK::PG::ImageGenerator; |
| 21 | use WeBWorK::PG::IO; |
22 | use WeBWorK::PG::IO; |
| 22 | use WeBWorK::Utils qw(writeLog encodeAnswers decodeAnswers ref2string makeTempDirectory); |
23 | use WeBWorK::Utils qw(writeLog encodeAnswers decodeAnswers ref2string makeTempDirectory); |
| 23 | use WeBWorK::DB::Utils qw(global2user user2global findDefaults); |
24 | use WeBWorK::DB::Utils qw(global2user user2global findDefaults); |
| 24 | use WeBWorK::Timing; |
25 | use WeBWorK::Timing; |
| 25 | |
26 | |
| … | |
… | |
| 213 | $will{$_} = $can{$_} && ($want{$_} || $must{$_}); |
214 | $will{$_} = $can{$_} && ($want{$_} || $must{$_}); |
| 214 | } |
215 | } |
| 215 | |
216 | |
| 216 | ##### sticky answers ##### |
217 | ##### sticky answers ##### |
| 217 | |
218 | |
| 218 | if (not $submitAnswers and $will{showOldAnswers}) { |
219 | if (not ($submitAnswers or $previewAnswers or $checkAnswers) and $will{showOldAnswers}) { |
| 219 | # do this only if new answers are NOT being submitted |
220 | # do this only if new answers are NOT being submitted |
| 220 | my %oldAnswers = decodeAnswers($problem->last_answer); |
221 | my %oldAnswers = decodeAnswers($problem->last_answer); |
| 221 | $formFields->{$_} = $oldAnswers{$_} foreach keys %oldAnswers; |
222 | $formFields->{$_} = $oldAnswers{$_} foreach keys %oldAnswers; |
| 222 | } |
223 | } |
| 223 | |
224 | |
| … | |
… | |
| 702 | my $showAttemptAnswers = shift; |
703 | my $showAttemptAnswers = shift; |
| 703 | my $showCorrectAnswers = shift; |
704 | my $showCorrectAnswers = shift; |
| 704 | my $showAttemptResults = $showAttemptAnswers && shift; |
705 | my $showAttemptResults = $showAttemptAnswers && shift; |
| 705 | my $showSummary = shift; |
706 | my $showSummary = shift; |
| 706 | my $showAttemptPreview = shift || 0; |
707 | my $showAttemptPreview = shift || 0; |
|
|
708 | my $ce = $self->{ce}; |
| 707 | my $problemResult = $pg->{result}; # the overall result of the problem |
709 | my $problemResult = $pg->{result}; # the overall result of the problem |
| 708 | my @answerNames = @{ $pg->{flags}->{ANSWER_ENTRY_ORDER} }; |
710 | my @answerNames = @{ $pg->{flags}->{ANSWER_ENTRY_ORDER} }; |
| 709 | |
711 | |
| 710 | my $showMessages = $showAttemptAnswers && grep { $pg->{answers}->{$_}->{ans_message} } @answerNames; |
712 | my $showMessages = $showAttemptAnswers && grep { $pg->{answers}->{$_}->{ans_message} } @answerNames; |
|
|
713 | |
|
|
714 | my $basename = "equation-" . $self->{set}->psvn. "." . $self->{problem}->problem_id . "-preview"; |
|
|
715 | my $imgGen = WeBWorK::PG::ImageGenerator->new( |
|
|
716 | tempDir => $ce->{webworkDirs}->{tmp}, |
|
|
717 | dir => $ce->{courseDirs}->{html_temp}, |
|
|
718 | url => $ce->{courseURLs}->{html_temp}, |
|
|
719 | basename => $basename, |
|
|
720 | latex => $ce->{externalPrograms}->{latex}, |
|
|
721 | dvipng => $ce->{externalPrograms}->{dvipng}, |
|
|
722 | ); |
| 711 | |
723 | |
| 712 | my $header; |
724 | my $header; |
| 713 | #$header .= CGI::th("Part"); |
725 | #$header .= CGI::th("Part"); |
| 714 | $header .= $showAttemptAnswers ? CGI::th("Entered") : ""; |
726 | $header .= $showAttemptAnswers ? CGI::th("Entered") : ""; |
| 715 | $header .= $showAttemptPreview ? CGI::th("Answer Preview") : ""; |
727 | $header .= $showAttemptPreview ? CGI::th("Answer Preview") : ""; |
| … | |
… | |
| 720 | my $numCorrect; |
732 | my $numCorrect; |
| 721 | foreach my $name (@answerNames) { |
733 | foreach my $name (@answerNames) { |
| 722 | my $answerResult = $pg->{answers}->{$name}; |
734 | my $answerResult = $pg->{answers}->{$name}; |
| 723 | my $studentAnswer = $answerResult->{student_ans}; # original_student_ans |
735 | my $studentAnswer = $answerResult->{student_ans}; # original_student_ans |
| 724 | my $preview = ($showAttemptPreview |
736 | my $preview = ($showAttemptPreview |
| 725 | ? $self->previewAnswer($answerResult) |
737 | ? $self->previewAnswer($answerResult, $imgGen) |
| 726 | : ""); |
738 | : ""); |
| 727 | my $correctAnswer = $answerResult->{correct_ans}; |
739 | my $correctAnswer = $answerResult->{correct_ans}; |
| 728 | my $answerScore = $answerResult->{score}; |
740 | my $answerScore = $answerResult->{score}; |
| 729 | my $answerMessage = $showMessages ? $answerResult->{ans_message} : ""; |
741 | my $answerMessage = $showMessages ? $answerResult->{ans_message} : ""; |
| 730 | |
742 | |
| 731 | $numCorrect += $answerScore > 0; |
743 | $numCorrect += $answerScore > 0; |
| … | |
… | |
| 742 | $row .= $showCorrectAnswers ? CGI::td(nbsp($correctAnswer)) : ""; |
754 | $row .= $showCorrectAnswers ? CGI::td(nbsp($correctAnswer)) : ""; |
| 743 | $row .= $showAttemptResults ? CGI::td(nbsp($resultString)) : ""; |
755 | $row .= $showAttemptResults ? CGI::td(nbsp($resultString)) : ""; |
| 744 | $row .= $answerMessage ? CGI::td(nbsp($answerMessage)) : ""; |
756 | $row .= $answerMessage ? CGI::td(nbsp($answerMessage)) : ""; |
| 745 | push @tableRows, $row; |
757 | push @tableRows, $row; |
| 746 | } |
758 | } |
|
|
759 | |
|
|
760 | # render equation images |
|
|
761 | $imgGen->render(refresh => 1); |
| 747 | |
762 | |
| 748 | my $numIncorrectNoun = scalar @answerNames == 1 ? "question" : "questions"; |
763 | my $numIncorrectNoun = scalar @answerNames == 1 ? "question" : "questions"; |
| 749 | my $scorePercent = sprintf("%.0f%%", $problemResult->{score} * 100); |
764 | my $scorePercent = sprintf("%.0f%%", $problemResult->{score} * 100); |
| 750 | my $summary = "On this attempt, you answered $numCorrect out of " |
765 | my $summary = "On this attempt, you answered $numCorrect out of " |
| 751 | . scalar @answerNames . " $numIncorrectNoun correct, for a score of $scorePercent."; |
766 | . scalar @answerNames . " $numIncorrectNoun correct, for a score of $scorePercent."; |
| … | |
… | |
| 807 | CGI::submit(-name=>"redisplay", -label=>"Save Options"), |
822 | CGI::submit(-name=>"redisplay", -label=>"Save Options"), |
| 808 | ); |
823 | ); |
| 809 | } |
824 | } |
| 810 | |
825 | |
| 811 | sub previewAnswer($$) { |
826 | sub previewAnswer($$) { |
| 812 | my ($self, $answerResult) = @_; |
827 | my ($self, $answerResult, $imgGen) = @_; |
| 813 | my $ce = $self->{ce}; |
828 | my $ce = $self->{ce}; |
| 814 | my $effectiveUser = $self->{effectiveUser}; |
829 | my $effectiveUser = $self->{effectiveUser}; |
| 815 | my $set = $self->{set}; |
830 | my $set = $self->{set}; |
| 816 | my $problem = $self->{problem}; |
831 | my $problem = $self->{problem}; |
| 817 | my $displayMode = $self->{displayMode}; |
832 | my $displayMode = $self->{displayMode}; |
| … | |
… | |
| 838 | if ($?) { |
853 | if ($?) { |
| 839 | return "<b>[tth failed: $? $@]</b>"; |
854 | return "<b>[tth failed: $? $@]</b>"; |
| 840 | } |
855 | } |
| 841 | return $result; |
856 | return $result; |
| 842 | } elsif ($displayMode eq "images") { |
857 | } elsif ($displayMode eq "images") { |
| 843 | # how are we going to name this? |
858 | ## how are we going to name this? |
| 844 | my $targetPathCommon = "/m2i/" |
859 | #my $targetPathCommon = "/m2i/" |
| 845 | . $effectiveUser->user_id . "." |
860 | # . $effectiveUser->user_id . "." |
| 846 | . $set->set_id . "." |
861 | # . $set->set_id . "." |
| 847 | . $problem->problem_id . "." |
862 | # . $problem->problem_id . "." |
| 848 | . $answerResult->{ans_name} . ".png"; |
863 | # . $answerResult->{ans_name} . ".png"; |
| 849 | |
864 | # |
| 850 | # figure out where to put things |
865 | ## figure out where to put things |
| 851 | my $wd = makeTempDirectory($ce->{courseDirs}->{html_temp}, "webwork-dvipng"); |
866 | #my $wd = makeTempDirectory($ce->{courseDirs}->{html_temp}, "webwork-dvipng"); |
| 852 | my $latex = $ce->{externalPrograms}->{latex}; |
867 | #my $latex = $ce->{externalPrograms}->{latex}; |
| 853 | my $dvipng = $ce->{externalPrograms}->{dvipng}; |
868 | #my $dvipng = $ce->{externalPrograms}->{dvipng}; |
| 854 | my $targetPath = $ce->{courseDirs}->{html_temp} . $targetPathCommon; |
869 | #my $targetPath = $ce->{courseDirs}->{html_temp} . $targetPathCommon; |
| 855 | # should use surePathToTmpFile, but we have to |
870 | # # should use surePathToTmpFile, but we have to |
| 856 | # isolate it from the problem enivronment first |
871 | # # isolate it from the problem enivronment first |
| 857 | my $targetURL = $ce->{courseURLs}->{html_temp} . $targetPathCommon; |
872 | #my $targetURL = $ce->{courseURLs}->{html_temp} . $targetPathCommon; |
| 858 | |
873 | # |
| 859 | # call dvipng to generate a preview |
874 | ## call dvipng to generate a preview |
| 860 | dvipng($wd, $latex, $dvipng, $tex, $targetPath); |
875 | #dvipng($wd, $latex, $dvipng, $tex, $targetPath); |
| 861 | rmtree($wd, 0, 0); |
876 | #rmtree($wd, 0, 0); |
| 862 | if (-e $targetPath) { |
877 | #if (-e $targetPath) { |
| 863 | return "<img src=\"$targetURL\" alt=\"$tex\" />"; |
878 | # return "<img src=\"$targetURL\" alt=\"$tex\" />"; |
| 864 | } else { |
879 | #} else { |
| 865 | return "<b>[math2img failed]</b>"; |
880 | # return "<b>[math2img failed]</b>"; |
| 866 | } |
881 | #} |
|
|
882 | $imgGen->add($answerResult->{preview_latex_string}); |
|
|
883 | |
| 867 | } |
884 | } |
| 868 | } |
885 | } |
| 869 | |
886 | |
| 870 | ##### logging subroutine #### |
887 | ##### logging subroutine #### |
| 871 | |
888 | |