--- loncom/homework/response.pm 2006/12/18 21:37:47 1.158 +++ loncom/homework/response.pm 2007/05/31 04:15:52 1.168 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # various response type definitons response definition # -# $Id: response.pm,v 1.158 2006/12/18 21:37:47 www Exp $ +# $Id: response.pm,v 1.168 2007/05/31 04:15:52 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -265,11 +265,14 @@ sub meta_response_order { } sub check_for_previous { - my ($curresponse,$partid,$id) = @_; + my ($curresponse,$partid,$id,$last) = @_; my %previous; $previous{'used'} = 0; foreach my $key (sort(keys(%Apache::lonhomework::history))) { if ($key =~ /resource\.$partid\.$id\.submission$/) { + if ( $last && $key =~ /^(\d+):/ ) { + next if ($1 >= $last); + } &Apache::lonxml::debug("Trying $key"); my $pastresponse=$Apache::lonhomework::history{$key}; if ($pastresponse eq $curresponse) { @@ -388,7 +391,6 @@ sub start_customresponse { $safeeval,'answerdisplay'); if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); - $result.=&Apache::edit::handle_insert(); } } elsif ($target eq 'answer' || $target eq 'grade') { &Apache::response::reset_params(); @@ -444,6 +446,9 @@ sub end_customresponse { $result .= &Apache::response::answer_part('customresponse',$answer); $result .= &Apache::response::answer_footer('customresponse'); } + if ($target eq 'web') { + &setup_prior_tries_hash(\&format_prior_response_math); + } if ($target eq 'grade' || $target eq 'web' || $target eq 'answer' || $target eq 'tex' || $target eq 'analyze') { &Apache::lonxml::increment_counter(&Apache::response::repetition()); @@ -456,6 +461,11 @@ sub end_customresponse { return $result; } +sub format_prior_response_custom { + my ($mode,$answer) =@_; + return ''. + &HTML::Entities::encode($answer,'"<>&').''; +} sub start_mathresponse { my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; @@ -488,7 +498,6 @@ sub start_mathresponse { $safeeval,'answerdisplay','cas','args'); if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); - $result.=&Apache::edit::handle_insert(); } } elsif ($target eq 'answer' || $target eq 'grade') { &Apache::response::reset_params(); @@ -533,6 +542,10 @@ sub end_mathresponse { } } } + if ($target eq 'web') { + &setup_prior_tries_hash(\&format_prior_response_math); + } + pop(@Apache::lonxml::namespace); pop(@Apache::response::custom_answer); pop(@Apache::response::custom_answer_type); @@ -541,6 +554,12 @@ sub end_mathresponse { return $result; } +sub format_prior_response_math { + my ($mode,$answer) =@_; + return ''. + &HTML::Entities::encode($answer,'"<>&').''; +} + sub implicit_multiplication { my ($expression)=@_; # Escape scientific notation, so 3e8 does not become 3*e*8 @@ -656,7 +675,6 @@ sub start_responseparam { } if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); - $result.=&Apache::edit::handle_insert(); } } elsif ($target eq 'grade' || $target eq 'answer' || $target eq 'web' || $target eq 'tex' || $target eq 'analyze' ) { @@ -694,7 +712,7 @@ sub setup_params { if ($env{'request.state'} eq 'construct') { return; } my %paramlist=(); foreach my $key (keys(%Apache::lonnet::packagetab)) { - if ($key =~ /^$tag/) { + if ($key =~ /^\Q$tag\E/) { my ($package,$name) = split(/&/,$key); $paramlist{$name}=1; } @@ -823,14 +841,33 @@ sub showallfoils { return 0; } +=pod + +=item &getresponse($offset,$resulttype); + +Retreives the current submitted response, helps out in the case of +scantron mode. + +Returns either the exact text of the submission, or a bubbled response +converted to something usable. + +Optional Arguments: + $offset - if a problem has more than one bubble response, pass in the number + of the bubble wanted + $resulttype - undef -> a number between 0 and 25 + 'A is 1' -> a number between 1 and 26 + 'letter' -> a letter between 'A' and 'Z' + +=cut + sub getresponse { - my ($temp,$resulttype)=@_; + my ($offset,$resulttype)=@_; my $formparm='form.HWVAL_'.$Apache::inputtags::response['-1']; my $response; - if (!defined($temp)) { + if (!defined($offset)) { $temp=1; } else { - $formparm.=":$temp"; + $formparm.=":$offset"; } my %let_to_num=('A'=>0,'B'=>1,'C'=>2,'D'=>3,'E'=>4,'F'=>5,'G'=>6,'H'=>7, 'I'=>8,'J'=>9,'K'=>10,'L'=>11,'M'=>12,'N'=>13,'O'=>14, @@ -839,7 +876,7 @@ sub getresponse { if ($env{'form.submitted'} eq 'scantron') { my $part = $Apache::inputtags::part; my $id = $Apache::inputtags::response[-1]; - $response = $env{'scantron.'.($Apache::lonxml::counter+$temp-1). + $response = $env{'scantron.'.($Apache::lonxml::counter+$offset-1). '.answer'}; # save bubbled letter for later $Apache::lonhomework::results{"resource.$part.$id.scantron"}.= @@ -857,6 +894,15 @@ sub getresponse { return $response; } +=pod + +=item &repetition(); + +Returns the number of lines that are required to encode the weight. +(Currently expects that there are 10 bubbles per line) + +=cut + sub repetition { my $id = $Apache::inputtags::part; my $weight = &Apache::lonnet::EXT("resource.$id.weight"); @@ -866,6 +912,30 @@ sub repetition { return $repetition; } +=pod + +=item &scored_response($part_id,$response_id); + +Sets the results hash elements + + resource.$part_id.$response_id.awarded - to the floating point + number between 0 and 1 that was awarded on the bubbled input + + resource.$part_id.$response_id.awarddetail - to 'ASSIGNED_SCORE' + +Returns + + the number of bubble sheet lines that were used (and likely need to + be passed to &Apache::lonxml::increment_counter() + +Arguments + + $part_id - id of the part to grade + $response_id - id of the response to grade + + +=cut + sub scored_response { my ($part,$id)=@_; my $repetition=&repetition(); @@ -1001,7 +1071,17 @@ sub pick_foil_for_concept { $Apache::response::conceptgroup{'names'}; } - +#------------------------------------------------------------ +# +# Get a parameter associated with a problem. +# Parameters: +# $id - the id of the paramater, either a part id, +# or a partid and responspe id joined by _ +# $name - Name of the parameter to fetch +# $default - Default value for the paramter. +# +# +# sub get_response_param { my ($id,$name,$default)=@_; my $parameter; @@ -1026,7 +1106,13 @@ sub submitted { if ($who eq 'scantron') { return 0; } # if the Submit Answer button for this particular part was pressed my $partid=$Apache::inputtags::part; - if (defined($env{'form.submit_'.$partid})) { return 1; } + if ($env{'form.submitted'} eq "part_$partid") { + return 1; + } + if ($env{'form.submitted'} eq "yes" + && defined($env{'form.submit_'.$partid})) { + return 1; + } # Submit All button on a .page was pressed if (defined($env{'form.all_submit'})) { return 1; } # otherwise no submission occured @@ -1086,6 +1172,33 @@ sub check_status { return 2; } +sub setup_prior_tries_hash { + my ($func,$data) = @_; + my $part = $Apache::inputtags::part; + my $id = $Apache::inputtags::response[-1]; + foreach my $i (1..$Apache::lonhomework::history{'version'}) { + my $sub_key = "$i:resource.$part.$id.submission"; + next if (!exists($Apache::lonhomework::history{$sub_key})); + my @other_data; + foreach my $datum (@{ $data }) { + if (ref($datum)) { + push(@other_data,$datum); + } else { + my $info_key = "$i:resource.$part.$id.$datum"; + push(@other_data,$Apache::lonhomework::history{$info_key}); + } + } + + my $output = + &$func('grade', + $Apache::lonhomework::history{$sub_key}, + \@other_data); + if (defined($output)) { + $Apache::inputtags::submission_display{$sub_key} = $output; + } + } +} + 1; __END__