version 1.216, 2009/05/24 13:08:18
|
version 1.226, 2011/09/13 21:42:58
|
Line 30
|
Line 30
|
|
|
=head1 NAME |
=head1 NAME |
|
|
Apache::resonse.pm |
Apache::response.pm |
|
|
=head1 SYNOPSIS |
=head1 SYNOPSIS |
|
|
Line 136 sub poprandomnumber {
|
Line 136 sub poprandomnumber {
|
} |
} |
|
|
sub setrandomnumber { |
sub setrandomnumber { |
my ($ignore_id2) = @_; |
my ($ignore_id2,$target,$rndseed) = @_; |
my $rndseed; |
if (!defined($rndseed)) { |
$rndseed=&Apache::structuretags::setup_rndseed(); |
$rndseed=&Apache::structuretags::setup_rndseed(undef,$target); |
|
} |
if (!defined($rndseed)) { $rndseed=&Apache::lonnet::rndseed(); } |
if (!defined($rndseed)) { $rndseed=&Apache::lonnet::rndseed(); } |
&Apache::lonxml::debug("randseed $rndseed"); |
&Apache::lonxml::debug("randseed $rndseed"); |
# $rndseed=unpack("%32i",$rndseed); |
# $rndseed=unpack("%32i",$rndseed); |
Line 178 sub setrandomnumber {
|
Line 179 sub setrandomnumber {
|
} else { |
} else { |
($rndmod,$rndmod2)=&Apache::lonnet::digest("$id1,$id2"); |
($rndmod,$rndmod2)=&Apache::lonnet::digest("$id1,$id2"); |
} |
} |
|
$Apache::lonhomework::results{'resource.'.$id1.'.rawrndseed'}=$rndseed; |
if ($rndseed =~/([,:])/) { |
if ($rndseed =~/([,:])/) { |
my $char=$1; |
my $char=$1; |
use integer; |
use integer; |
Line 195 sub setrandomnumber {
|
Line 196 sub setrandomnumber {
|
} |
} |
} |
} |
&Apache::lonxml::debug("randseed $rndmod $rndseed"); |
&Apache::lonxml::debug("randseed $rndmod $rndseed"); |
|
$Apache::lonhomework::results{'resource.'.$id1.'.rndseed'}=$rndseed; |
&Apache::lonnet::setup_random_from_rndseed($rndseed); |
&Apache::lonnet::setup_random_from_rndseed($rndseed); |
return ''; |
return ''; |
} |
} |
Line 280 sub meta_response_order {
|
Line 282 sub meta_response_order {
|
} |
} |
|
|
sub check_for_previous { |
sub check_for_previous { |
my ($curresponse,$partid,$id,$last) = @_; |
my ($curresponse,$partid,$id,$last,$type) = @_; |
my %previous; |
my %previous; |
$previous{'used'} = 0; |
$previous{'used'} = 0; |
|
my $questiontype = $Apache::lonhomework::type; |
|
my $curr_rndseed = $env{'form.'.$partid.'.rndseed'}; |
foreach my $key (sort(keys(%Apache::lonhomework::history))) { |
foreach my $key (sort(keys(%Apache::lonhomework::history))) { |
if ($key =~ /resource\.\Q$partid\E\.\Q$id\E\.submission$/) { |
if ($key =~ /resource\.\Q$partid\E\.\Q$id\E\.submission$/) { |
if ( $last && $key =~ /^(\d+):/ ) { |
if ( $last && $key =~ /^(\d+):/ ) { |
Line 291 sub check_for_previous {
|
Line 295 sub check_for_previous {
|
&Apache::lonxml::debug("Trying $key"); |
&Apache::lonxml::debug("Trying $key"); |
my $pastresponse=$Apache::lonhomework::history{$key}; |
my $pastresponse=$Apache::lonhomework::history{$key}; |
if ($pastresponse eq $curresponse) { |
if ($pastresponse eq $curresponse) { |
$previous{'used'} = 1; |
|
my $history; |
my $history; |
if ( $key =~ /^(\d+):/ ) { |
if ( $key =~ /^(\d+):/ ) { |
$history=$1; |
$history=$1; |
|
next if ((($questiontype eq 'randomizetry') || |
|
($Apache::lonhomework::history{"$history:resource.$partid.type"} eq 'randomizetry')) && |
|
($curr_rndseed ne $Apache::lonhomework::history{"$history:resource.$partid.rndseed"})); |
$previous{'award'} = $Apache::lonhomework::history{"$history:resource.$partid.$id.awarddetail"}; |
$previous{'award'} = $Apache::lonhomework::history{"$history:resource.$partid.$id.awarddetail"}; |
$previous{'last'}='0'; |
$previous{'last'}='0'; |
push(@{ $previous{'version'} },$history); |
push(@{ $previous{'version'} },$history); |
} else { |
} else { |
|
next if ((($questiontype eq 'randomizetry') || |
|
($Apache::lonhomework::history{"resource.$partid.type"} eq 'randomizetry')) && |
|
($curr_rndseed ne $Apache::lonhomework::history{"resource.$partid.rndseed"})); |
$previous{'award'} = $Apache::lonhomework::history{"resource.$partid.$id.awarddetail"}; |
$previous{'award'} = $Apache::lonhomework::history{"resource.$partid.$id.awarddetail"}; |
$previous{'last'}='1'; |
$previous{'last'}='1'; |
} |
} |
|
$previous{'used'} = 1; |
if (! $previous{'award'} ) { $previous{'award'} = 'UNKNOWN'; } |
if (! $previous{'award'} ) { $previous{'award'} = 'UNKNOWN'; } |
if ($previous{'award'} eq 'INTERNAL_ERROR') { $previous{'used'}=0; } |
if ($previous{'award'} eq 'INTERNAL_ERROR') { $previous{'used'}=0; } |
&Apache::lonxml::debug("got a match :$previous{'award'}:$previous{'used'}:"); |
&Apache::lonxml::debug("got a match :$previous{'award'}:$previous{'used'}:"); |
} |
} elsif ($type eq 'ci') { |
|
if (lc($pastresponse) eq lc($curresponse)) { |
|
if ($key =~ /^(\d+):/) { |
|
my $history = $1; |
|
next if (($questiontype eq 'randomizetry') && |
|
($curr_rndseed ne $Apache::lonhomework::history{"$history:resource.$partid.rndseed"})); |
|
push (@{$previous{'versionci'}},$history); |
|
$previous{'awardci'} = $Apache::lonhomework::history{"$history:resource.$partid.$id.awarddetail"}; |
|
$previous{'usedci'} = 1; |
|
} |
|
} |
|
} |
} |
} |
} |
} |
&Apache::lonhomework::showhash(%previous); |
&Apache::lonhomework::showhash(%previous); |
Line 318 sub handle_previous {
|
Line 339 sub handle_previous {
|
if ($$previous{'last'}) { |
if ($$previous{'last'}) { |
push(@Apache::inputtags::previous,'PREVIOUSLY_LAST'); |
push(@Apache::inputtags::previous,'PREVIOUSLY_LAST'); |
push(@Apache::inputtags::previous_version,$$previous{'version'}); |
push(@Apache::inputtags::previous_version,$$previous{'version'}); |
} elsif ($Apache::lonhomework::type ne 'survey') { |
} elsif (($Apache::lonhomework::type ne 'survey') && |
|
($Apache::lonhomework::type ne 'surveycred') && |
|
($Apache::lonhomework::type ne 'anonsurvey') && |
|
($Apache::lonhomework::type ne 'anonsurveycred')) { |
push(@Apache::inputtags::previous,'PREVIOUSLY_USED'); |
push(@Apache::inputtags::previous,'PREVIOUSLY_USED'); |
push(@Apache::inputtags::previous_version,$$previous{'version'}); |
push(@Apache::inputtags::previous_version,$$previous{'version'}); |
} |
} |
Line 399 sub start_customresponse {
|
Line 423 sub start_customresponse {
|
} elsif ($target eq 'edit') { |
} elsif ($target eq 'edit') { |
$result.=&Apache::edit::tag_start($target,$token); |
$result.=&Apache::edit::tag_start($target,$token); |
$result.=&Apache::edit::text_arg('String to display for answer:', |
$result.=&Apache::edit::text_arg('String to display for answer:', |
'answerdisplay',$token); |
'answerdisplay',$token,'50'); |
$result.=&Apache::edit::end_row().&Apache::edit::start_spanning_row(); |
$result.=&Apache::edit::end_row().&Apache::edit::start_spanning_row(); |
} elsif ($target eq 'modified') { |
} elsif ($target eq 'modified') { |
my $constructtag; |
my $constructtag; |
Line 509 sub start_mathresponse {
|
Line 533 sub start_mathresponse {
|
} elsif ($target eq 'edit') { |
} elsif ($target eq 'edit') { |
$result.=&Apache::edit::tag_start($target,$token); |
$result.=&Apache::edit::tag_start($target,$token); |
$result.=&Apache::edit::text_arg('String to display for answer:', |
$result.=&Apache::edit::text_arg('String to display for answer:', |
'answerdisplay',$token); |
'answerdisplay',$token,'50'); |
$result.=&Apache::edit::select_arg('Algebra System:', |
$result.=&Apache::edit::select_arg('Algebra System:', |
'cas', |
'cas', |
['maxima','R'], |
['maxima','R'], |
Line 907 sub showallfoils {
|
Line 931 sub showallfoils {
|
} |
} |
} |
} |
if ($Apache::lonhomework::type eq 'survey') { return 1; } |
if ($Apache::lonhomework::type eq 'survey') { return 1; } |
|
if ($Apache::lonhomework::type eq 'surveycred') { return 1; } |
|
if ($Apache::lonhomework::type eq 'anonsurvey') { return 1; } |
|
if ($Apache::lonhomework::type eq 'anonsurveycred') { return 1; } |
|
|
return 0; |
return 0; |
} |
} |
|
|
Line 975 sub getresponse {
|
Line 1003 sub getresponse {
|
$Apache::lonhomework::results{"resource.$part.$id.scantron"}.= |
$Apache::lonhomework::results{"resource.$part.$id.scantron"}.= |
$response; |
$response; |
if ($resulttype ne 'letter') { |
if ($resulttype ne 'letter') { |
if ($resulttype eq 'A is 1') { |
$response = $let_to_num{$response}; |
$response = $let_to_num{$response}+1; |
if ($resulttype eq 'A is 1') { |
} else { |
if ($response ne "") { |
$response = $let_to_num{$response}; |
$response = $response+1; |
|
} |
} |
} |
if ($response ne "") { |
if ($response ne "") { |
$response += $line * $bubbles_per_line; |
$response += $line * $bubbles_per_line; |
} |
} |
} else { |
} else { |
if ($response ne "") { |
if ($response ne "") { |
|
my $raw = $response; |
$response = chr(ord($response) + $line * $bubbles_per_line); |
$response = chr(ord($response) + $line * $bubbles_per_line); |
} |
} |
} |
} |
Line 1005 sub getresponse {
|
Line 1035 sub getresponse {
|
=item &repetition(); |
=item &repetition(); |
|
|
Returns the number of lines that are required to encode the weight. |
Returns the number of lines that are required to encode the weight. |
(Currently expects that there are 10 bubbles per line) |
(Default is for 10 bubbles per bubblesheet item; other (integer) |
|
values can be specified by using a custom Bubblesheet format file |
|
with an eighteenth entry (BubblesPerRow) set to the integer |
|
appropriate for the bubblesheets which will be used to assign weights. |
|
|
=cut |
=cut |
|
|
Line 1013 sub repetition {
|
Line 1046 sub repetition {
|
my $id = $Apache::inputtags::part; |
my $id = $Apache::inputtags::part; |
my $weight = &Apache::lonnet::EXT("resource.$id.weight"); |
my $weight = &Apache::lonnet::EXT("resource.$id.weight"); |
if (!defined($weight) || ($weight eq '')) { $weight=1; } |
if (!defined($weight) || ($weight eq '')) { $weight=1; } |
my $repetition = int($weight/10); |
my $bubbles_per_row; |
if ($weight % 10 != 0) { $repetition++; } |
if (($env{'form.bubbles_per_row'} =~ /^\d+$/) && |
|
($env{'form.bubbles_per_row'} > 0)) { |
|
$bubbles_per_row = $env{'form.bubbles_per_row'}; |
|
} else { |
|
$bubbles_per_row = 10; |
|
} |
|
my $repetition = int($weight/$bubbles_per_row); |
|
if ($weight % $bubbles_per_row != 0) { $repetition++; } |
return $repetition; |
return $repetition; |
} |
} |
|
|
Line 1061 sub scored_response {
|
Line 1101 sub scored_response {
|
} |
} |
|
|
sub whichorder { |
sub whichorder { |
my ($max,$randomize,$showall,$hash)=@_; |
my ($max,$randomize,$showall,$hash,$rndseed)=@_; |
#&Apache::lonxml::debug("man $max randomize $randomize"); |
#&Apache::lonxml::debug("man $max randomize $randomize"); |
if (!defined(@{ $$hash{'names'} })) { return; } |
if (!defined(@{ $$hash{'names'} })) { return; } |
my @names = @{ $$hash{'names'} }; |
my @names = @{ $$hash{'names'} }; |
Line 1113 sub whichorder {
|
Line 1153 sub whichorder {
|
|
|
sub show_answer { |
sub show_answer { |
my $part = $Apache::inputtags::part; |
my $part = $Apache::inputtags::part; |
my $award = $Apache::lonhomework::history{"resource.$part.solved"}; |
my $award = $Apache::lonhomework::history{"resource.$part.awarded"}; |
my $status = $Apache::inputtags::status[-1]; |
my $status = $Apache::inputtags::status[-1]; |
return ( ($award =~ /^correct/ |
return ( ($award ==1 |
&& &Apache::lonhomework::show_problem_status()) |
&& &Apache::lonhomework::show_problem_status()) |
|| $status eq "SHOW_ANSWER"); |
|| $status eq "SHOW_ANSWER"); |
} |
} |
Line 1301 sub check_status {
|
Line 1341 sub check_status {
|
- scalars that are other elements of the history hash to pass to $func |
- scalars that are other elements of the history hash to pass to $func |
- ref to data to be passed untouched to $func |
- ref to data to be passed untouched to $func |
|
|
|
$questiontype is the questiontype (currently only passed in if |
|
randomizebytry. |
|
|
=cut |
=cut |
|
|
sub setup_prior_tries_hash { |
sub setup_prior_tries_hash { |
my ($func,$data) = @_; |
my ($func,$data,$questiontype) = @_; |
my $part = $Apache::inputtags::part; |
my $part = $Apache::inputtags::part; |
my $id = $Apache::inputtags::response[-1]; |
my $id = $Apache::inputtags::response[-1]; |
foreach my $i (1..$Apache::lonhomework::history{'version'}) { |
foreach my $i (1..$Apache::lonhomework::history{'version'}) { |
my $sub_key = "$i:resource.$part.$id.submission"; |
my $partprefix = "$i:resource.$part"; |
|
my $sub_key = "$partprefix.$id.submission"; |
next if (!exists($Apache::lonhomework::history{$sub_key})); |
next if (!exists($Apache::lonhomework::history{$sub_key})); |
|
my $type_key = "$partprefix.type"; |
|
my $type = $Apache::lonhomework::history{$type_key}; |
my @other_data; |
my @other_data; |
foreach my $datum (@{ $data }) { |
if (ref($data) eq 'ARRAY') { |
if (ref($datum)) { |
foreach my $datum (@{ $data }) { |
push(@other_data,$datum); |
if (ref($datum)) { |
} else { |
push(@other_data,$datum); |
my $info_key = "$i:resource.$part.$id.$datum"; |
} else { |
push(@other_data,$Apache::lonhomework::history{$info_key}); |
my $info_key = "$i:resource.$part.$id.$datum"; |
|
push(@other_data,$Apache::lonhomework::history{$info_key}); |
|
} |
} |
} |
} |
} |
|
if ($questiontype eq 'randomizetry') { |
|
my $order_key = "$partprefix.$id.foilorder"; |
|
my @whichopts = &Apache::lonnet::str2array($Apache::lonhomework::history{$order_key}); |
|
if (@whichopts > 0) { |
|
shift(@other_data); |
|
unshift(@other_data,\@whichopts); |
|
} |
|
} |
my $output = |
my $output = |
&$func('grade', |
&$func('grade', |
$Apache::lonhomework::history{$sub_key}, |
$Apache::lonhomework::history{$sub_key}, |