version 1.192, 2008/06/14 16:34:54
|
version 1.227, 2011/11/14 03:08:01
|
Line 26
|
Line 26
|
# http://www.lon-capa.org/ |
# http://www.lon-capa.org/ |
# |
# |
|
|
|
=pod |
|
|
|
=head1 NAME |
|
|
|
Apache::response.pm |
|
|
|
=head1 SYNOPSIS |
|
|
|
This is part of the LearningOnline Network with CAPA project |
|
described at http://www.lon-capa.org. |
|
|
|
|
|
=head1 NOTABLE SUBROUTINES |
|
|
|
=over |
|
|
|
=item |
|
|
|
=back |
|
|
|
=cut |
|
|
|
|
package Apache::response; |
package Apache::response; |
use strict; |
use strict; |
use Apache::lonlocal; |
use Apache::lonlocal; |
use Apache::lonnet; |
use Apache::lonnet; |
use Apache::lonmaxima(); |
use Apache::lonmaxima(); |
|
use Apache::lonr(); |
|
|
BEGIN { |
BEGIN { |
&Apache::lonxml::register('Apache::response',('responseparam','parameter','dataresponse','customresponse','mathresponse')); |
&Apache::lonxml::register('Apache::response',('responseparam','parameter','dataresponse','customresponse','mathresponse')); |
Line 112 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 154 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 171 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 216 sub meta_stores_write {
|
Line 242 sub meta_stores_write {
|
"></stores>\n"; |
"></stores>\n"; |
} |
} |
|
|
|
=pod |
|
|
|
=item mandatory_part_meta() |
|
|
|
Autogenerate metadata for mandatory |
|
input (from RAT or lonparmset) and |
|
output (to lonspreadsheet) |
|
of each part |
|
|
|
Note: responseid-specific data 'submission' and 'awarddetail' |
|
not available to spreadsheet -> skip here |
|
|
|
=cut |
|
|
|
|
sub mandatory_part_meta { |
sub mandatory_part_meta { |
# |
return &meta_package_write('part'). |
# Autogenerate metadata for mandatory |
&meta_stores_write('solved','string','Problem Status'). |
# input (from RAT or lonparmset) and |
&meta_stores_write('tries','int_zeropos','Number of Attempts'). |
# output (to lonspreadsheet) |
&meta_stores_write('awarded','float','Partial Credit Factor'); |
# of each part |
|
# |
|
return |
|
# &meta_parameter_write('opendate','date_start','', |
|
# 'Opening Date'). |
|
# &meta_parameter_write('duedate','date_end','', |
|
# 'Due Date'). |
|
# &meta_parameter_write('answerdate','date_start','', |
|
# 'Show Answer Date'). |
|
# &meta_parameter_write('weight','int_zeropos','', |
|
# 'Available Points'). |
|
# &meta_parameter_write('maxtries','int_pos','', |
|
# 'Maximum Number of Tries'). |
|
&meta_package_write('part'). |
|
&meta_stores_write('solved','string', |
|
'Problem Status'). |
|
&meta_stores_write('tries','int_zeropos', |
|
'Number of Attempts'). |
|
&meta_stores_write('awarded','float', |
|
'Partial Credit Factor'); |
|
# |
|
# Note: responseid-specific data 'submission' and 'awarddetail' |
|
# not available to spreadsheet -> skip here |
|
# |
|
} |
} |
|
|
sub meta_part_order { |
sub meta_part_order { |
Line 265 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\.$partid\.$id\.submission$/) { |
if ($key =~ /resource\.\Q$partid\E\.\Q$id\E\.submission$/) { |
if ( $last && $key =~ /^(\d+):/ ) { |
if ( $last && $key =~ /^(\d+):/ ) { |
next if ($1 >= $last); |
next if ($1 >= $last); |
} |
} |
&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; } |
&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 302 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 383 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 423 sub end_customresponse {
|
Line 463 sub end_customresponse {
|
${$safeeval->varglob('LONCAPA::customresponse_submission')}= |
${$safeeval->varglob('LONCAPA::customresponse_submission')}= |
$response; |
$response; |
|
|
my $award = &Apache::run::run('{ my $submission=$LONCAPA::customresponse_submission;'.$Apache::response::custom_answer[-1].'}',$safeeval); |
my ($award,$score) = &Apache::run::run('{ my $submission=$LONCAPA::customresponse_submission;'.$Apache::response::custom_answer[-1].'}',$safeeval); |
if (!&Apache::inputtags::valid_award($award)) { |
if (!&Apache::inputtags::valid_award($award)) { |
$error = $award; |
$error = $award; |
$award = 'ERROR'; |
$award = 'ERROR'; |
Line 431 sub end_customresponse {
|
Line 471 sub end_customresponse {
|
&Apache::response::handle_previous(\%previous,$award); |
&Apache::response::handle_previous(\%previous,$award); |
$Apache::lonhomework::results{"resource.$part.$id.awarddetail"}= |
$Apache::lonhomework::results{"resource.$part.$id.awarddetail"}= |
$award; |
$award; |
|
if ($award eq 'ASSIGNED_SCORE') { |
|
$Apache::lonhomework::results{"resource.$part.$id.awarded"}=1.0*$score; |
|
} |
if ($error) { |
if ($error) { |
$Apache::lonhomework::results{"resource.$part.$id.awardmsg"}= |
$Apache::lonhomework::results{"resource.$part.$id.awardmsg"}= |
$error; |
$error; |
Line 451 sub end_customresponse {
|
Line 494 sub end_customresponse {
|
} |
} |
if ($target eq 'grade' || $target eq 'web' || $target eq 'answer' || |
if ($target eq 'grade' || $target eq 'web' || $target eq 'answer' || |
$target eq 'tex' || $target eq 'analyze') { |
$target eq 'tex' || $target eq 'analyze') { |
&Apache::lonxml::increment_counter(&Apache::response::repetition(), |
my $repetition = &repetition(); |
"$part.$id"); |
&Apache::lonxml::increment_counter($repetition,"$part.$id"); |
if ($target eq 'analyze') { |
if ($target eq 'analyze') { |
$Apache::lonhomework::analyze{"$part.$id.type"} = 'customresponse'; |
$Apache::lonhomework::analyze{"$part.$id.type"} = 'customresponse'; |
&Apache::lonhomework::set_bubble_lines(); |
&Apache::lonhomework::set_bubble_lines(); |
Line 486 sub start_mathresponse {
|
Line 529 sub start_mathresponse {
|
$safeeval); |
$safeeval); |
$Apache::inputtags::answertxt{$id}=[$answer]; |
$Apache::inputtags::answertxt{$id}=[$answer]; |
} |
} |
if ($Apache::inputtags::status['-1'] eq 'CAN_ANSWER') { |
|
$result.=&edit_mathresponse_button($id,"HWVAL_$id"); |
|
} |
|
|
|
} 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'], |
['maxima','R'], |
$token); |
$token); |
$result.=&Apache::edit::text_arg('Argument Array:', |
$result.=&Apache::edit::text_arg('Argument Array:', |
'args',$token); |
'args',$token). |
|
&Apache::loncommon::help_open_topic('Maxima_Argument_Array'); |
$result.=&Apache::edit::text_arg('Libraries:', |
$result.=&Apache::edit::text_arg('Libraries:', |
'libraries',$token); |
'libraries',$token). |
|
&Apache::loncommon::help_open_topic('Maxima_Libraries'); |
$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 521 sub start_mathresponse {
|
Line 563 sub start_mathresponse {
|
sub edit_mathresponse_button { |
sub edit_mathresponse_button { |
my ($id,$field)=@_; |
my ($id,$field)=@_; |
my $button=&mt('Edit Answer'); |
my $button=&mt('Edit Answer'); |
|
# my $helplink=&Apache::loncommon::help_open_topic('Formula_Editor'); |
|
my $iconpath=$Apache::lonnet::perlvar{'lonIconsURL'}; |
return(<<ENDFORMULABUTTON); |
return(<<ENDFORMULABUTTON); |
<script language="JavaScript"> |
<script type="text/javascript" language="JavaScript"> |
function edit_${id}_${field} (textarea) { |
function edit_${id}_${field} (textarea) { |
thenumber = textarea; |
thenumber = textarea; |
thedata = document.forms['lonhomework'].elements[textarea].value; |
thedata = document.forms['lonhomework'].elements[textarea].value; |
newwin = window.open("/adm/dragmath/applet/MaximaPopup.html","","width=565,height=400,resizable"); |
newwin = window.open("/adm/dragmath/applet/MaximaPopup.html","","width=565,height=400,resizable"); |
} |
} |
</script> |
</script> |
<input type='button' value='$button' onclick="javascript:edit_${id}_${field}('${field}');void(0);" /> |
<a href="javascript:edit_${id}_${field}('${field}');void(0);"><img class="stift" src="$iconpath/stift.gif" alt="$button" title="$button" /></a> |
ENDFORMULABUTTON |
ENDFORMULABUTTON |
} |
} |
|
|
Line 556 sub end_mathresponse {
|
Line 600 sub end_mathresponse {
|
$award=&Apache::lonmaxima::maxima_run($Apache::response::custom_answer[-1],$response,$args, |
$award=&Apache::lonmaxima::maxima_run($Apache::response::custom_answer[-1],$response,$args, |
&Apache::lonxml::get_param('libraries',$parstack,$safeeval)); |
&Apache::lonxml::get_param('libraries',$parstack,$safeeval)); |
} |
} |
|
if ($cas eq 'R') { |
|
my $args = [&Apache::lonxml::get_param_var('args',$parstack,$safeeval)]; |
|
$award=&Apache::lonr::r_run($Apache::response::custom_answer[-1],$response,$args, |
|
&Apache::lonxml::get_param('libraries',$parstack,$safeeval)); |
|
} |
|
|
if (!&Apache::inputtags::valid_award($award)) { |
if (!&Apache::inputtags::valid_award($award)) { |
$error = $award; |
$error = $award; |
$award = 'ERROR'; |
$award = 'ERROR'; |
Line 571 sub end_mathresponse {
|
Line 621 sub end_mathresponse {
|
} |
} |
if ($target eq 'web') { |
if ($target eq 'web') { |
&setup_prior_tries_hash(\&format_prior_response_math); |
&setup_prior_tries_hash(\&format_prior_response_math); |
|
my $partid = $Apache::inputtags::part; |
|
my $id = $Apache::inputtags::response[-1]; |
|
if (($Apache::inputtags::status['-1'] eq 'CAN_ANSWER') |
|
&& (&Apache::lonnet::EXT('resource.'.$partid.'_'.$id.'.turnoffeditor') ne 'yes')) { |
|
$result.=&edit_mathresponse_button($id,"HWVAL_$id"); |
|
} |
} |
} |
|
|
pop(@Apache::lonxml::namespace); |
pop(@Apache::lonxml::namespace); |
Line 673 sub start_responseparam {
|
Line 729 sub start_responseparam {
|
} |
} |
} |
} |
if (defined($optionlist)) { |
if (defined($optionlist)) { |
$result.='Use template: <select name="'. |
$result.=&mt('Use template:').' <select name="'. |
&Apache::edit::html_element_name('parameter_package').'">'. |
&Apache::edit::html_element_name('parameter_package').'">'. |
'<option value=""></option>'.$optionlist.'</select><br />'; |
'<option value=""></option>'.$optionlist.'</select><br />'; |
} |
} |
Line 875 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; |
} |
} |
|
|
=pod |
=pod |
|
|
=item &getresponse($offset,$resulttype); |
=item &getresponse(); |
|
|
Retreives the current submitted response, helps out in the case of |
Retreives the current submitted response, helps out in the case of |
scantron mode. |
scantron mode. |
Line 926 sub getresponse {
|
Line 986 sub getresponse {
|
my $id = $Apache::inputtags::response[-1]; |
my $id = $Apache::inputtags::response[-1]; |
|
|
my $line; |
my $line; |
|
my $startline = $env{'form.scantron_questnum_start.'.$part.'.'.$id}; |
|
if (!$startline) { |
|
$startline = $Apache::lonxml::counter; |
|
} |
for ($line = 0; $line < $lines; $line++) { |
for ($line = 0; $line < $lines; $line++) { |
my $theline = $Apache::lonxml::counter+$offset-1+$line; |
my $theline = $startline+$offset-1+$line; |
$response = $env{"scantron.$theline.answer"}; |
$response = $env{"scantron.$theline.answer"}; |
if ((defined($response)) && ($response ne "") && ($response ne " ")) { |
if ((defined($response)) && ($response ne "") && ($response ne " ")) { |
last; |
last; |
} |
} |
|
|
} |
} |
|
|
# save bubbled letter for later |
# save bubbled letter for later |
$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 968 sub getresponse {
|
Line 1034 sub getresponse {
|
|
|
=item &repetition(); |
=item &repetition(); |
|
|
Returns the number of lines that are required to encode the weight. |
In scalar context: |
(Currently expects that there are 10 bubbles per line) |
|
|
returns: the number of lines that are required to encode the weight. |
|
(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. |
|
|
|
In array context: |
|
|
|
returns: number of lines required to encode weight, and bubbles/line. |
|
|
=cut |
=cut |
|
|
Line 977 sub repetition {
|
Line 1052 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 $denominator = $bubbles_per_row; |
|
if (($env{'form.scantron_lastbubblepoints'} == 0) && |
|
($bubbles_per_row > 1)) { |
|
$denominator = $bubbles_per_row - 1; |
|
} |
|
my $repetition = int($weight/$denominator); |
|
if ($weight % $denominator != 0) { $repetition++; } |
|
if (wantarray) { |
|
return ($repetition,$bubbles_per_row); |
|
} |
return $repetition; |
return $repetition; |
|
|
} |
} |
|
|
=pod |
=pod |
|
|
=item &scored_response($part_id,$response_id); |
=item &scored_response(); |
|
|
Sets the results hash elements |
Sets the results hash elements |
|
|
Line 1009 Arguments
|
Line 1100 Arguments
|
sub scored_response { |
sub scored_response { |
my ($part,$id)=@_; |
my ($part,$id)=@_; |
my $repetition=&repetition(); |
my $repetition=&repetition(); |
|
my $bubbles_per_row; |
|
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 $score=0; |
my $score=0; |
for (my $i=0;$i<$repetition;$i++) { |
for (my $i=0;$i<$repetition;$i++) { |
# A is 1, B is 2, etc. (get response return 0-9 and then we add 1) |
# A is 1, B is 2, etc. |
my $increase=&Apache::response::getresponse($i+1); |
my $increase=&Apache::response::getresponse($i+1); |
if ($increase ne '') { $score+=$increase+1; } |
unless (($increase == $bubbles_per_row-1) && |
|
($env{'form.scantron_lastbubblepoints'} == 0)) { |
|
# (get response return 0-9 and then we add 1) |
|
if ($increase ne '') { |
|
$score+=$increase+1; |
|
} |
|
} |
} |
} |
my $weight = &Apache::lonnet::EXT("resource.$part.weight"); |
my $weight = &Apache::lonnet::EXT("resource.$part.weight"); |
if (!defined($weight) || $weight eq '' || $weight eq 0) { $weight = 1; } |
if (!defined($weight) || $weight eq '' || $weight eq 0) { $weight = 1; } |
Line 1025 sub scored_response {
|
Line 1129 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 1077 sub whichorder {
|
Line 1181 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 1141 sub pick_foil_for_concept {
|
Line 1245 sub pick_foil_for_concept {
|
$Apache::response::conceptgroup{'names'}; |
$Apache::response::conceptgroup{'names'}; |
|
|
} |
} |
#------------------------------------------------------------ |
|
# |
=pod |
# Get a parameter associated with a problem. |
|
# Parameters: |
=item get_response_param() |
# $id - the id of the paramater, either a part id, |
|
# or a partid and responspe id joined by _ |
Get a parameter associated with a problem. |
# $name - Name of the parameter to fetch |
Parameters: |
# $default - Default value for the paramter. |
$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. |
|
|
|
=cut |
|
|
sub get_response_param { |
sub get_response_param { |
my ($id,$name,$default)=@_; |
my ($id,$name,$default)=@_; |
my $parameter; |
my $parameter; |
Line 1185 sub submitted {
|
Line 1292 sub submitted {
|
} |
} |
# Submit All button on a .page was pressed |
# Submit All button on a .page was pressed |
if (defined($env{'form.all_submit'})) { return 1; } |
if (defined($env{'form.all_submit'})) { return 1; } |
# otherwise no submission occured |
# otherwise no submission occurred |
return 0; |
return 0; |
} |
} |
|
|
Line 1212 sub add_to_gradingqueue {
|
Line 1319 sub add_to_gradingqueue {
|
} |
} |
} |
} |
|
|
# basically undef and 0 (both false) mean that they still have work to do |
=pod |
# and all true values mean that they can't do any more work |
|
# |
=item check_status() |
# a return of undef means it is unattempted |
|
# a return of 0 means it is attmpted and wrong but still has tries |
basically undef and 0 (both false) mean that they still have work to do |
# a return of 1 means it is marked correct |
and all true values mean that they can't do any more work |
# a return of 2 means they have exceed maximum number of tries |
|
# a return of 3 means it after the answer date |
a return of undef means it is unattempted |
|
a return of 0 means it is attmpted and wrong but still has tries |
|
a return of 1 means it is marked correct |
|
a return of 2 means they have exceed maximum number of tries |
|
a return of 3 means it after the answer date |
|
|
|
=cut |
|
|
sub check_status { |
sub check_status { |
my ($id)=@_; |
my ($id)=@_; |
if (!defined($id)) { $id=$Apache::inputtags::part; } |
if (!defined($id)) { $id=$Apache::inputtags::part; } |
Line 1244 sub check_status {
|
Line 1358 sub check_status {
|
|
|
=pod |
=pod |
|
|
=item setup_prior_tries_hash($func,$data) |
=item setup_prior_tries_hash() |
|
|
Foreach each past .submission $func is called with 3 arguments |
Foreach each past .submission $func is called with 3 arguments |
- the mode to set things up for (currently always 'grade') |
- the mode to set things up for (currently always 'grade') |
Line 1255 sub check_status {
|
Line 1369 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}, |
Line 1287 sub setup_prior_tries_hash {
|
Line 1416 sub setup_prior_tries_hash {
|
1; |
1; |
__END__ |
__END__ |
|
|
|
=pod |
|
|
|
=cut |