--- loncom/homework/caparesponse/caparesponse.pm 2005/04/07 06:56:22 1.166 +++ loncom/homework/caparesponse/caparesponse.pm 2005/05/23 21:18:25 1.168 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # caparesponse definition # -# $Id: caparesponse.pm,v 1.166 2005/04/07 06:56:22 albertel Exp $ +# $Id: caparesponse.pm,v 1.168 2005/05/23 21:18:25 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -120,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; @@ -127,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); @@ -156,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'}); - } + my ($awards,$msgs)=&check_submission($response,$partid,$id, + $tag,$parstack,$safeeval); - 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); + ($ad,my $msg) = &Apache::inputtags::finalizeawards($awards,$msgs); &Apache::lonxml::debug('ad is'.$ad); if ($ad eq 'SIG_FAIL') { my ($sig_u,$sig_l)= @@ -222,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'}; @@ -302,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; @@ -346,6 +351,7 @@ sub end_numericalresponse { # $low =&format_number($low,$fmt,$target,$safeeval); #} } + my $response=$ans; if ($target eq 'answer') { if ($high && $tag eq 'numericalresponse') { $ans.=' ['.$low.','.$high.']'; } if (defined($sighigh) && $tag eq 'numericalresponse') { @@ -366,6 +372,12 @@ 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') {