--- loncom/homework/caparesponse/caparesponse.pm 2005/02/23 23:41:23 1.165 +++ loncom/homework/caparesponse/caparesponse.pm 2005/06/20 21:30:22 1.169 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # caparesponse definition # -# $Id: caparesponse.pm,v 1.165 2005/02/23 23:41:23 albertel Exp $ +# $Id: caparesponse.pm,v 1.169 2005/06/20 21:30:22 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -30,6 +30,7 @@ package Apache::caparesponse; use strict; use capa; use Apache::lonlocal; +use Apache::lonnet; BEGIN { &Apache::lonxml::register('Apache::caparesponse',('caparesponse','numericalresponse','stringresponse','formularesponse')); @@ -119,6 +120,50 @@ sub start_numericalresponse { return $result; } +sub check_submission { + my ($response,$partid,$id,$tag,$parstack,$safeeval)=@_; + my $args_ref= \%{$safeeval->varglob('LONCAPA::CAPAresponse_args')}; + $$args_ref{'response'}=$response; + my $hideunit=&Apache::lonnet::EXT('resource.'.$partid.'_'.$id.'.turnoffunit'); + + foreach my $arg ('type','tol','sig','format','unit','calc', + 'samples') { + $$args_ref{$arg}= + &Apache::lonxml::get_param($arg,$parstack,$safeeval); + } + foreach my $key (keys(%Apache::inputtags::params)) { + $$args_ref{$key}=$Apache::inputtags::params{$key}; + } + + #no way to enter units, with radio buttons + if ($Apache::lonhomework::type eq 'exam' || + lc($hideunit) eq "yes") { + delete($$args_ref{'unit'}); + } + #sig fig don't make much sense either + if (($Apache::lonhomework::type eq 'exam' || + &Apache::response::submitted('scantron')) && + $tag eq 'numericalresponse') { + delete($$args_ref{'sig'}); + } + + if ($tag eq 'formularesponse') { + $$args_ref{'type'}='fml'; + } elsif ($tag eq 'numericalresponse') { + $$args_ref{'type'}='float'; + } + my @answer=&Apache::lonxml::get_param_var('answer',$parstack,$safeeval); + &Apache::lonxml::debug('answer is'.join(':',@answer)); + @{$safeeval->varglob('LONCAPA::CAPAresponse_answer')}=@answer; + + my ($result,@msgs) = + &Apache::run::run("&caparesponse_check_list()",$safeeval); + &Apache::lonxml::debug('msgs are'.join(':',@msgs)); + my ($awards)=split(/:/,$result); + my @awards= split(/,/,$awards); + return(\@awards,\@msgs); +} + sub end_numericalresponse { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $increment=1; @@ -126,13 +171,13 @@ sub end_numericalresponse { if (!$Apache::lonxml::default_homework_loaded) { &Apache::lonxml::default_homework_load($safeeval); } + my $partid = $Apache::inputtags::part; + my $id = $Apache::inputtags::response[-1]; my $tag; + $safeeval->share_from('capa',['&caparesponse_capa_check_answer']); if (scalar(@$tagstack)) { $tag=$$tagstack[-1]; } if ( $target eq 'grade' && &Apache::response::submitted() ) { &Apache::response::setup_params($tag,$safeeval); - $safeeval->share_from('capa',['&caparesponse_capa_check_answer']); - my $partid = $Apache::inputtags::part; - my $id = $Apache::inputtags::response['-1']; if ($Apache::lonhomework::type eq 'exam' && $tag eq 'formularesponse') { $increment=&Apache::response::scored_response($partid,$id); @@ -155,46 +200,10 @@ sub end_numericalresponse { $response=$values->[$response]; } $Apache::lonhomework::results{"resource.$partid.$id.submission"}=$response; - my $args_ref= \%{$safeeval->varglob('LONCAPA::CAPAresponse_args')}; - $$args_ref{'response'}=$response; - my $hideunit=&Apache::lonnet::EXT('resource.'.$partid.'_'.$id.'.turnoffunit'); - - foreach my $arg ('type','tol','sig','format','unit','calc', - 'samples') { - $$args_ref{$arg}= - &Apache::lonxml::get_param($arg,$parstack,$safeeval); - } - foreach my $key (keys(%Apache::inputtags::params)) { - $$args_ref{$key}=$Apache::inputtags::params{$key}; - } - - #no way to enter units, with radio buttons - if ($Apache::lonhomework::type eq 'exam' || - lc($hideunit) eq "yes") { - delete($$args_ref{'unit'}); - } - #sig fig don't make much sense either - if (($Apache::lonhomework::type eq 'exam' || - &Apache::response::submitted('scantron')) && - $tag eq 'numericalresponse') { - delete($$args_ref{'sig'}); - } - - if ($tag eq 'formularesponse') { - $$args_ref{'type'}='fml'; - } elsif ($tag eq 'numericalresponse') { - $$args_ref{'type'}='float'; - } - my @answer=&Apache::lonxml::get_param_var('answer',$parstack,$safeeval); - &Apache::lonxml::debug('answer is'.join(':',@answer)); - @{$safeeval->varglob('LONCAPA::CAPAresponse_answer')}=@answer; - - ($result,my @msgs) = - &Apache::run::run("&caparesponse_check_list()",$safeeval); - &Apache::lonxml::debug('msgs are'.join(':',@msgs)); - my ($awards)=split(/:/,$result); - my (@awards) = split(/,/,$awards); - ($ad,my $msg) = &Apache::inputtags::finalizeawards(\@awards,\@msgs); + my ($awards,$msgs)=&check_submission($response,$partid,$id, + $tag,$parstack,$safeeval); + + ($ad,my $msg) = &Apache::inputtags::finalizeawards($awards,$msgs); &Apache::lonxml::debug('ad is'.$ad); if ($ad eq 'SIG_FAIL') { my ($sig_u,$sig_l)= @@ -221,8 +230,6 @@ sub end_numericalresponse { my $award = $Apache::lonhomework::history{"resource.$Apache::inputtags::part.solved"}; my $status = $Apache::inputtags::status['-1']; if ($Apache::lonhomework::type eq 'exam') { - my $partid=$Apache::inputtags::part; - my $id=$Apache::inputtags::response[-1]; my $number_of_bubbles = &Apache::lonnet::EXT('resource.'.$partid.'_'.$id.'.numbubbles'); if ($Apache::inputtags::params{'numbubbles'}) { $number_of_bubbles = $Apache::inputtags::params{'numbubbles'}; @@ -301,8 +308,7 @@ sub end_numericalresponse { } elsif ($target eq 'edit') { $result.=''.&Apache::edit::end_table; } elsif ($target eq 'answer' || $target eq 'analyze') { - - my $part_id="$Apache::inputtags::part.$Apache::inputtags::response[-1]"; + my $part_id="$partid.$id"; if ($target eq 'analyze') { push (@{ $Apache::lonhomework::analyze{"parts"} },$part_id); $Apache::lonhomework::analyze{"$part_id.type"} = $tag; @@ -345,10 +351,16 @@ sub end_numericalresponse { # $low =&format_number($low,$fmt,$target,$safeeval); #} } + my $response=$ans; + if ($unit) { + my $cleanunit=$unit; + $cleanunit=~s/\$\,//g; + $response.=" $cleanunit"; + } if ($target eq 'answer') { if ($high && $tag eq 'numericalresponse') { $ans.=' ['.$low.','.$high.']'; } if (defined($sighigh) && $tag eq 'numericalresponse') { - if ($ENV{'form.answer_output_mode'} eq 'tex') { + if ($env{'form.answer_output_mode'} eq 'tex') { $ans.= " Sig $siglow - $sighigh"; } else { $ans.= " Sig $siglow - $sighigh"; @@ -365,11 +377,17 @@ sub end_numericalresponse { push (@{ $Apache::lonhomework::analyze{"$part_id.format"} }, $fmt); } } + my ($awards,$msgs)=&check_submission($response,$partid,$id,$tag, + $parstack,$safeeval); + my ($ad,$msg) =&Apache::inputtags::finalizeawards($awards,$msgs); + if ($ad ne 'EXACT_ANS' && $ad ne 'APPROX_ANS') { + &Apache::lonxml::error(&mt('Computer\'s answer is incorrect ("[_1]"). It is likely that the tolerance range ("[_2]" to "[_3]") or significant figures ("[_4]" to "[_5]") needs to be adjusted',$response,$low,$high,$siglow,$sighigh)); + } } if (defined($unit) and ($unit ne '') and $tag eq 'numericalresponse') { if ($target eq 'answer') { - if ($ENV{'form.answer_output_mode'} eq 'tex') { + if ($env{'form.answer_output_mode'} eq 'tex') { $result.=&Apache::response::answer_part($tag, " Unit: $unit "); } else { @@ -415,11 +433,11 @@ sub get_table_sizes { } $cell_width+=8; my $textwidth; - if ($ENV{'form.textwidth'} ne '') { - $ENV{'form.textwidth'}=~/(\d*)\.?(\d*)/; + if ($env{'form.textwidth'} ne '') { + $env{'form.textwidth'}=~/(\d*)\.?(\d*)/; $textwidth=$1.'.'.$2; } else { - $ENV{'textwidth'}=~/(\d+)\.?(\d*)/; + $env{'form.textwidth'}=~/(\d+)\.?(\d*)/; $textwidth=$1.'.'.$2; } my $bubbles_per_line=int($textwidth/$cell_width); @@ -526,8 +544,8 @@ sub get_tolrange { sub get_sigrange { my ($sig)=@_; &Apache::lonxml::debug("Got a sig of :$sig:"); - my $courseid=$ENV{'request.course.id'}; - if (lc($ENV{"course.$courseid.disablesigfigs"}) eq 'yes') { + my $courseid=$env{'request.course.id'}; + if (lc($env{"course.$courseid.disablesigfigs"}) eq 'yes') { return (15,0); } my $sig_lbound; @@ -547,7 +565,7 @@ sub get_sigrange { ($sig_lbound > 15) || ($sig =~/(\+|-)/ ) ) { my $errormsg=&mt("Invalid Significant figures detected")." ($sig)"; - if ($ENV{'request.state'} eq 'construct') { + if ($env{'request.state'} eq 'construct') { $errormsg.= &Apache::loncommon::help_open_topic('Significant_Figures'); } @@ -711,7 +729,7 @@ sub end_stringresponse { $string='Regular Expression'; } if ($target eq 'answer') { - if ($ENV{'form.answer_output_mode'} eq 'tex') { + if ($env{'form.answer_output_mode'} eq 'tex') { $result.=&Apache::response::answer_part('stringresponse', "$string"); } else {