--- loncom/homework/inputtags.pm 2004/03/12 21:14:54 1.135 +++ loncom/homework/inputtags.pm 2004/03/13 00:36:11 1.136 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # input definitons # -# $Id: inputtags.pm,v 1.135 2004/03/12 21:14:54 albertel Exp $ +# $Id: inputtags.pm,v 1.136 2004/03/13 00:36:11 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -277,77 +277,48 @@ sub end_hiddenline { return ""; } +sub checkstatus { + my ($value,$awardref,$msgref)=@_; + for (my $i=0;$i<=$#$awardref;$i++) { + if ($$awardref[$i] eq $value) { + return ($$awardref[$i],$$msgref[$i]); + } + } + return(undef,undef); +} + sub finalizeawards { - my $result=''; + my ($awardref,$msgref)=@_; + my $result=undef; my $award; - if ($#_ == '-1') { $result = "NO_RESPONSE"; } + my $msg; + if ($#$awardref == -1) { $result = "NO_RESPONSE"; } if ($result eq '' ) { my $blankcount; - foreach $award (@_) { + foreach $award (@$awardref) { if ($award eq '') { $result='MISSING_ANSWER'; $blankcount++; } } - if ($blankcount == ($#_ + 1)) { $result = 'NO_RESPONSE'; } - } - if ($result eq '' ) { - foreach $award (@_) { if ($award eq 'MISSING_ANSWER') {$result='MISSING_ANSWER'; last;}} - } - if ($result eq '' ) { - foreach $award (@_) { if ($award eq 'ERROR') {$result='ERROR'; last;}} - } - if ($result eq '' ) { - foreach $award (@_) { if ($award eq 'NO_RESPONSE') {$result='NO_RESPONSE'; last;} } - } - if ($result eq '' ) { - foreach $award (@_) { if ($award eq 'TOO_LONG') {$result='TOO_LONG'; last;}} - } - if ($result eq '' ) { - foreach $award (@_) { - if ($award eq 'UNIT_FAIL' || - $award eq 'NO_UNIT' || - $award eq 'UNIT_NOTNEEDED') { - $result=$award; last; - } - } - } - if ($result eq '' ) { - foreach $award (@_) { - if ($award eq 'WANTED_NUMERIC' || - $award eq 'BAD_FORMULA') {$result=$award; last;} - } - } - if ($result eq '' ) { - foreach $award (@_) { if ($award eq 'SIG_FAIL') {$result=$award; last;} } - } - if ($result eq '' ) { - foreach $award (@_) { if ($award eq 'INCORRECT') {$result=$award; last;} } - } - if ($result eq '' ) { - foreach $award (@_) { if ($award eq 'MISORDERED_RANK') {$result=$award; last;} } - } - if ($result eq '' ) { - foreach $award (@_) { if ($award eq 'INVALID_FILETYPE') {$result=$award; last;} } + if ($blankcount == ($#$awardref + 1)) { $result = 'NO_RESPONSE'; } } - if ($result eq '' ) { - foreach $award (@_) { if ($award eq 'DRAFT') {$result=$award; last;} } - } - if ($result eq '' ) { - foreach $award (@_) { if ($award eq 'SUBMITTED') {$result=$award; last;} } - } - if ($result eq '' ) { - foreach $award (@_) { if ($award eq 'ASSIGNED_SCORE') {$result=$award; last;} } + if (defined($result)) { return ($result,$msg); } + foreach my $possibleaward ('MISSING_ANSWER', 'ERROR', 'NO_RESPONSE', + 'TOO_LONG', 'UNIT_FAIL', 'NO_UNIT', + 'UNIT_NOTNEEDED', 'WANTED_NUMERIC', + 'BAD_FORMULA', 'SIG_FAIL', 'INCORRECT', + 'MISORDERED_RANK', 'INVALID_FILETYPE', + 'DRAFT', 'SUBMITTED', 'ASSIGNED_SCORE', + 'APPROX_ANS', 'EXACT_ANS') { + ($result,$msg)=&checkstatus($possibleaward,$awardref,$msgref); + if (defined($result)) { return ($result,$msg); } } - if ($result eq '' ) { - foreach $award (@_) { if ($award eq 'APPROX_ANS') {$result=$award; last;} } - } - if ($result eq '' ) { $result='EXACT_ANS'; } - return $result + return ('ERROR',undef); } sub decideoutput { - my ($award,$solved,$previous,$target)=@_; + my ($award,$awardmsg,$solved,$previous,$target)=@_; my $message=''; my $button=0; my $previousmsg; @@ -439,16 +410,17 @@ sub decideoutput { $bgcolor=$possiblecolors{'not_charged_try'}; $button=1; } elsif ($award eq 'SIG_FAIL') { - $message = &mt("Significant figures are incorrect, submission was not graded.");# you provided %s significant figures"; + $message = &mt("Significant figures are incorrect, you provided [_1] significant figures while [_2] to [_3] were expected. Submission not graded.",(split(/:/,$awardmsg))); $bgcolor=$possiblecolors{'not_charged_try'}; $button=1; } elsif ($award eq 'UNIT_FAIL') { - $message = &mt("Units incorrect."); - if ($target ne 'tex') {$message.=&Apache::loncommon::help_open_topic('Physical_Units');} #Computer reads units as %s"; + $message = &mt('Units incorrect. Computer reads units as "[_1]"', + $awardmsg); + if ($target ne 'tex') {$message.=&Apache::loncommon::help_open_topic('Physical_Units');} $bgcolor=$possiblecolors{'not_charged_try'}; $button=1; } elsif ($award eq 'UNIT_NOTNEEDED') { - $message = &mt("Only a number required.");# Computer reads units of %s"; + $message = &mt('Only a number required. Computer reads units of "[_1]"',$awardmsg); $bgcolor=$possiblecolors{'not_charged_try'}; $button=1; } elsif ($award eq 'NO_UNIT') { @@ -500,7 +472,7 @@ sub removealldata { } sub setgradedata { - my ($award,$id,$previously_used) = @_; + my ($award,$msg,$id,$previously_used) = @_; # if the student already has it correct, don't modify the status if (!$Apache::lonhomework::scantronmode && $Apache::inputtags::status['-1'] ne 'CAN_ANSWER' && @@ -569,7 +541,9 @@ sub setgradedata { $Apache::lonhomework::results{"resource.$id.awarded"} = 0; } } - + if (defined($msg)) { + $Apache::lonhomework::results{"resource.$id.awardmsg"} = $msg; + } # did either of the overall awards chage? If so ignore the # previous check if (($Apache::lonhomework::results{"resource.$id.awarded"} eq @@ -608,14 +582,17 @@ sub grade { my $id = $Apache::inputtags::part; my $response=''; if ( defined $ENV{'form.submitted'}) { - my @awards = (); + my (@awards,@msgs); foreach $response (@Apache::inputtags::response) { &Apache::lonxml::debug("looking for response.$id.$response.awarddetail"); my $value=$Apache::lonhomework::results{"resource.$id.$response.awarddetail"}; &Apache::lonxml::debug("keeping $value from $response for $id"); push (@awards,$value); + $value=$Apache::lonhomework::results{"resource.$id.$response.awardmsg"}; + &Apache::lonxml::debug("got message $value from $response for $id"); + push (@msgs,$value); } - my $finalaward = &finalizeawards(@awards); + my ($finalaward,$msg) = &finalizeawards(\@awards,\@msgs); my $previously_used; if ( $#Apache::inputtags::previous eq $#awards ) { my $match=0; @@ -636,8 +613,8 @@ sub grade { } } } - &Apache::lonxml::debug("final award $finalaward, $previously_used"); - &setgradedata($finalaward,$id,$previously_used); + &Apache::lonxml::debug("final award $finalaward, $previously_used, message $msg"); + &setgradedata($finalaward,$msg,$id,$previously_used); } return ''; } @@ -659,11 +636,12 @@ sub gradestatus { my $award = $Apache::lonhomework::history{"resource.$id.award"}; my $solved = $Apache::lonhomework::history{"resource.$id.solved"}; my $previous = $Apache::lonhomework::history{"resource.$id.previous"}; - &Apache::lonxml::debug("Found Award |$award|$solved|"); + my $awardmsg = $Apache::lonhomework::history{"resource.$id.awardmsg"}; + &Apache::lonxml::debug("Found Award |$award|$solved|$awardmsg"); if ( $award ne '' || $solved ne '') { &Apache::lonxml::debug('Getting message'); ($showbutton,$bgcolor,$message,$previousmsg) = - &decideoutput($award,$solved,$previous,$target); + &decideoutput($award,$awardmsg,$solved,$previous,$target); if ($target eq 'tex') { $message='\vskip 2 mm '.$message.' '; } else { @@ -691,7 +669,7 @@ sub gradestatus { $trystr = '\vskip 0 mm '; } } else { - $trystr = "".$tries_text." $tries"; + $trystr = "".$tries_text." $tries"; if($ENV{'request.state'} ne 'construct') { $trystr.="/$maxtries"; } else { @@ -699,7 +677,7 @@ sub gradestatus { $trystr.="/".$Apache::inputtags::params{'maxtries'}; } } - $trystr.=""; + $trystr.=""; } } if ( $status eq 'SHOW_ANSWER' || $status eq 'CANNOT_ANSWER') {$showbutton = 0;}