version 1.226, 2011/09/13 21:42:58
|
version 1.249, 2024/06/19 05:56:22
|
Line 53 package Apache::response;
|
Line 53 package Apache::response;
|
use strict; |
use strict; |
use Apache::lonlocal; |
use Apache::lonlocal; |
use Apache::lonnet; |
use Apache::lonnet; |
|
use Apache::inputtags(); |
use Apache::lonmaxima(); |
use Apache::lonmaxima(); |
use Apache::lonr(); |
use Apache::lonr(); |
|
use Apache::lontexconvert(); |
|
|
BEGIN { |
BEGIN { |
&Apache::lonxml::register('Apache::response',('responseparam','parameter','dataresponse','customresponse','mathresponse')); |
&Apache::lonxml::register('Apache::response',('responseparam','parameter','dataresponse','customresponse','mathresponse')); |
Line 179 sub setrandomnumber {
|
Line 181 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 196 sub setrandomnumber {
|
Line 197 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 265 sub mandatory_part_meta {
|
Line 265 sub mandatory_part_meta {
|
} |
} |
|
|
sub meta_part_order { |
sub meta_part_order { |
|
my ($type) = @_; |
if (@Apache::inputtags::partlist) { |
if (@Apache::inputtags::partlist) { |
my @parts=@Apache::inputtags::partlist; |
my @parts=@Apache::inputtags::partlist; |
shift(@parts); |
unless ($type eq 'library') { |
|
shift(@parts); |
|
} |
return '<partorder>'.join(',',@parts).'</partorder>'."\n"; |
return '<partorder>'.join(',',@parts).'</partorder>'."\n"; |
|
} elsif ($type eq 'library') { |
|
return '<partorder></partorder>'."\n"; |
} else { |
} else { |
return '<partorder>0</partorder>'."\n"; |
return '<partorder>0</partorder>'."\n"; |
} |
} |
Line 398 sub end_dataresponse {
|
Line 403 sub end_dataresponse {
|
$Apache::lonhomework::results{"resource.$partid.$id.awarddetail"}='SUBMITTED'; |
$Apache::lonhomework::results{"resource.$partid.$id.awarddetail"}='SUBMITTED'; |
} |
} |
} else { |
} else { |
$result='Not Permitted to change values.' |
$result=&mt('Not Permitted to change values'); |
} |
} |
} |
} |
} |
} |
Line 468 sub end_customresponse {
|
Line 473 sub end_customresponse {
|
$error = $award; |
$error = $award; |
$award = 'ERROR'; |
$award = 'ERROR'; |
} |
} |
|
if (($award eq 'INCORRECT') || ($award eq 'APPROX_ANS') || |
|
($award eq 'EXACT_ANS') || ($award eq 'ASSIGNED_SCORE')) { |
|
if ($Apache::lonhomework::type eq 'survey') { |
|
$award='SUBMITTED'; |
|
} elsif ($Apache::lonhomework::type eq 'surveycred') { |
|
$award='SUBMITTED_CREDIT'; |
|
} elsif ($Apache::lonhomework::type eq 'anonsurvey') { |
|
$award='ANONYMOUS'; |
|
} elsif ($Apache::lonhomework::type eq 'anonsurveycred') { |
|
$award='ANONYMOUS_CREDIT'; |
|
} |
|
} |
&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; |
Line 490 sub end_customresponse {
|
Line 507 sub end_customresponse {
|
$result .= &Apache::response::answer_footer('customresponse'); |
$result .= &Apache::response::answer_footer('customresponse'); |
} |
} |
if ($target eq 'web') { |
if ($target eq 'web') { |
&setup_prior_tries_hash(\&format_prior_response_math); |
&setup_prior_tries_hash(\&format_prior_response_custom); |
} |
} |
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(); |
} |
} |
} |
} |
|
if ($target eq 'web') { |
|
&setup_prior_tries_hash(\&format_prior_response_math); |
|
} |
pop(@Apache::lonxml::namespace); |
pop(@Apache::lonxml::namespace); |
pop(@Apache::response::custom_answer); |
pop(@Apache::response::custom_answer); |
pop(@Apache::response::custom_answer_type); |
pop(@Apache::response::custom_answer_type); |
Line 511 sub end_customresponse {
|
Line 531 sub end_customresponse {
|
|
|
sub format_prior_response_custom { |
sub format_prior_response_custom { |
my ($mode,$answer) =@_; |
my ($mode,$answer) =@_; |
|
if (ref($answer) eq 'ARRAY') { |
|
$answer = '('.join(', ', @{ $answer }).')'; |
|
} |
return '<span class="LC_prior_custom">'. |
return '<span class="LC_prior_custom">'. |
&HTML::Entities::encode($answer,'"<>&').'</span>'; |
&HTML::Entities::encode($answer,'"<>&').'</span>'; |
} |
} |
Line 560 sub start_mathresponse {
|
Line 583 sub start_mathresponse {
|
return $result; |
return $result; |
} |
} |
|
|
sub edit_mathresponse_button { |
|
my ($id,$field)=@_; |
|
my $button=&mt('Edit Answer'); |
|
# my $helplink=&Apache::loncommon::help_open_topic('Formula_Editor'); |
|
my $iconpath=$Apache::lonnet::perlvar{'lonIconsURL'}; |
|
return(<<ENDFORMULABUTTON); |
|
<script type="text/javascript" language="JavaScript"> |
|
function edit_${id}_${field} (textarea) { |
|
thenumber = textarea; |
|
thedata = document.forms['lonhomework'].elements[textarea].value; |
|
newwin = window.open("/adm/dragmath/applet/MaximaPopup.html","","width=565,height=400,resizable"); |
|
} |
|
</script> |
|
<a href="javascript:edit_${id}_${field}('${field}');void(0);"><img class="stift" src="$iconpath/stift.gif" alt="$button" title="$button" /></a> |
|
ENDFORMULABUTTON |
|
} |
|
|
|
sub end_mathresponse { |
sub end_mathresponse { |
my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; |
my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; |
my $result; |
my $result; |
Line 610 sub end_mathresponse {
|
Line 616 sub end_mathresponse {
|
$error = $award; |
$error = $award; |
$award = 'ERROR'; |
$award = 'ERROR'; |
} |
} |
|
if (($award eq 'INCORRECT' || $award eq 'APPROX_ANS' || |
|
$award eq 'EXACT_ANS')) { |
|
if ($Apache::lonhomework::type eq 'survey') { |
|
$award='SUBMITTED'; |
|
} elsif ($Apache::lonhomework::type eq 'surveycred') { |
|
$award='SUBMITTED_CREDIT'; |
|
} elsif ($Apache::lonhomework::type eq 'anonsurvey') { |
|
$award='ANONYMOUS'; |
|
} elsif ($Apache::lonhomework::type eq 'anonsurveycred') { |
|
$award='ANONYMOUS_CREDIT'; |
|
} |
|
} |
&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; |
Line 619 sub end_mathresponse {
|
Line 637 sub end_mathresponse {
|
} |
} |
} |
} |
} |
} |
if ($target eq 'web') { |
|
&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); |
pop(@Apache::response::custom_answer); |
pop(@Apache::response::custom_answer); |
Line 762 sub start_responseparam {
|
Line 771 sub start_responseparam {
|
} |
} |
} elsif ($target eq 'grade' || $target eq 'answer' || $target eq 'web' || |
} elsif ($target eq 'grade' || $target eq 'answer' || $target eq 'web' || |
$target eq 'tex' || $target eq 'analyze' ) { |
$target eq 'tex' || $target eq 'analyze' ) { |
if ($env{'request.state'} eq 'construct') { |
if (($env{'request.state'} eq 'construct') || |
|
($env{'request.noversionuri'} =~ m{^\Q/res/adm/includes/templates/\E[^/]+\.problem$})) { |
my $name =&Apache::lonxml::get_param('name',$parstack,$safeeval); |
my $name =&Apache::lonxml::get_param('name',$parstack,$safeeval); |
my $default=&Apache::lonxml::get_param('default',$parstack, |
my $default=&Apache::lonxml::get_param('default',$parstack, |
$safeeval); |
$safeeval); |
Line 793 sub reset_params {
|
Line 803 sub reset_params {
|
sub setup_params { |
sub setup_params { |
my ($tag,$safeeval) = @_; |
my ($tag,$safeeval) = @_; |
|
|
if ($env{'request.state'} eq 'construct') { return; } |
if (($env{'request.state'} eq 'construct') || |
|
($env{'request.noversionuri'} =~ m{^\Q/res/adm/includes/templates/\E[^/]+\.problem$})) { |
|
return; |
|
} |
my %paramlist=(); |
my %paramlist=(); |
foreach my $key (keys(%Apache::lonnet::packagetab)) { |
foreach my $key (keys(%Apache::lonnet::packagetab)) { |
if ($key =~ /^\Q$tag\E/) { |
if ($key =~ /^\Q$tag\E/) { |
Line 835 sub answer_header {
|
Line 848 sub answer_header {
|
if ($Apache::lonhomework::type eq 'exam') { |
if ($Apache::lonhomework::type eq 'exam') { |
$bit = ($Apache::lonxml::counter+$increment).') '; |
$bit = ($Apache::lonxml::counter+$increment).') '; |
} else { |
} else { |
$bit .= ' Answer for Part: \verb|'. |
$bit .= ' '.&mt('Answer for Part: [_1]', |
$Apache::inputtags::part.'| '; |
'\verb|'.$Apache::inputtags::part.'|').' '; |
} |
} |
push(@answer_bits,$bit); |
push(@answer_bits,$bit); |
} else { |
} else { |
Line 1034 sub getresponse {
|
Line 1047 sub getresponse {
|
|
|
=item &repetition(); |
=item &repetition(); |
|
|
Returns the number of lines that are required to encode the weight. |
In scalar context: |
|
|
|
returns: the number of lines that are required to encode the weight. |
(Default is for 10 bubbles per bubblesheet item; other (integer) |
(Default is for 10 bubbles per bubblesheet item; other (integer) |
values can be specified by using a custom Bubblesheet format file |
values can be specified by using a custom Bubblesheet format file |
with an eighteenth entry (BubblesPerRow) set to the integer |
with an eighteenth entry (BubblesPerRow) set to the integer |
appropriate for the bubblesheets which will be used to assign weights. |
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 |
|
|
sub repetition { |
sub repetition { |
Line 1053 sub repetition {
|
Line 1072 sub repetition {
|
} else { |
} else { |
$bubbles_per_row = 10; |
$bubbles_per_row = 10; |
} |
} |
my $repetition = int($weight/$bubbles_per_row); |
my $denominator = $bubbles_per_row; |
if ($weight % $bubbles_per_row != 0) { $repetition++; } |
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 |
Line 1085 Arguments
|
Line 1113 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 1103 sub scored_response {
|
Line 1144 sub scored_response {
|
sub whichorder { |
sub whichorder { |
my ($max,$randomize,$showall,$hash,$rndseed)=@_; |
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; } |
my @names; |
my @names = @{ $$hash{'names'} }; |
if (ref($hash->{'names'}) eq 'ARRAY') { |
|
@names = @{$hash->{'names'}}; |
|
} |
|
return if (!@names); |
my @whichopt =(); |
my @whichopt =(); |
my (%top,@toplist,%bottom,@bottomlist); |
my (%top,@toplist,%bottom,@bottomlist); |
if (!($showall || ($randomize eq 'no'))) { |
if (!($showall || ($randomize eq 'no'))) { |
Line 1153 sub whichorder {
|
Line 1197 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.awarded"}; |
my $award = $Apache::lonhomework::history{"resource.$part.solved"}; |
my $status = $Apache::inputtags::status[-1]; |
my $status = $Apache::inputtags::status[-1]; |
return ( ($award ==1 |
my $canshow = 0; |
&& &Apache::lonhomework::show_problem_status()) |
if ($award =~ /^correct/) { |
|| $status eq "SHOW_ANSWER"); |
if (($Apache::lonhomework::history{"resource.$part.awarded"} >= 1) || |
|
(&Apache::lonnet::EXT("resource.$part.retrypartial") !~/^1|on|yes$/)) { |
|
$canshow = 1; |
|
} |
|
} |
|
return (($canshow && &Apache::lonhomework::show_problem_status()) |
|
|| $status eq "SHOW_ANSWER"); |
} |
} |
|
|
sub analyze_store_foilgroup { |
sub analyze_store_foilgroup { |
Line 1185 sub check_if_computed {
|
Line 1235 sub check_if_computed {
|
|
|
sub pick_foil_for_concept { |
sub pick_foil_for_concept { |
my ($target,$attrs,$hinthash,$parstack,$safeeval)=@_; |
my ($target,$attrs,$hinthash,$parstack,$safeeval)=@_; |
if (not defined(@{ $Apache::response::conceptgroup{'names'} })) { return; } |
my @names; |
my @names = @{ $Apache::response::conceptgroup{'names'} }; |
if (ref($Apache::response::conceptgroup{'names'}) eq 'ARRAY') { |
|
@names = @{ $Apache::response::conceptgroup{'names'} }; |
|
} |
|
return if (!@names); |
my $pick=int(&Math::Random::random_uniform() * ($#names+1)); |
my $pick=int(&Math::Random::random_uniform() * ($#names+1)); |
my $name=$names[$pick]; |
my $name=$names[$pick]; |
push @{ $Apache::response::foilgroup{'names'} }, $name; |
push @{ $Apache::response::foilgroup{'names'} }, $name; |
Line 1263 sub submitted {
|
Line 1316 sub submitted {
|
return 1; |
return 1; |
} |
} |
# 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 ($env{'form.all_submit'}) { return 1; } |
# otherwise no submission occurred |
# otherwise no submission occurred |
return 0; |
return 0; |
} |
} |
Line 1299 basically undef and 0 (both false) mean
|
Line 1352 basically undef and 0 (both false) mean
|
and all true values mean that they can't do any more work |
and all true values mean that they can't do any more work |
|
|
a return of undef means it is unattempted |
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 0 means it is both attempted and still has tries and |
|
is wrong or is only partially correct, and retries |
|
are allowed. |
a return of 1 means it is marked correct |
a return of 1 means it is marked correct |
a return of 2 means they have exceed maximum number of tries |
a return of 2 means they have exceeded maximum number of tries |
a return of 3 means it after the answer date |
a return of 3 means it is after the answer date |
|
|
=cut |
=cut |
|
|
Line 1311 sub check_status {
|
Line 1366 sub check_status {
|
if (!defined($id)) { $id=$Apache::inputtags::part; } |
if (!defined($id)) { $id=$Apache::inputtags::part; } |
my $curtime=&Apache::lonnet::EXT('system.time'); |
my $curtime=&Apache::lonnet::EXT('system.time'); |
my $opendate=&Apache::lonnet::EXT("resource.$id.opendate"); |
my $opendate=&Apache::lonnet::EXT("resource.$id.opendate"); |
my $duedate=&Apache::lonnet::EXT("resource.$id.duedate"); |
my $duedate=&Apache::lonhomework::due_date($id); |
my $answerdate=&Apache::lonnet::EXT("resource.$id.answerdate"); |
my $answerdate=&Apache::lonnet::EXT("resource.$id.answerdate"); |
if ( $opendate && $curtime > $opendate && |
if ( $opendate && $curtime > $opendate && |
$duedate && $curtime > $duedate && |
$duedate && $curtime > $duedate && |
Line 1319 sub check_status {
|
Line 1374 sub check_status {
|
return 3; |
return 3; |
} |
} |
my $status=&Apache::lonnet::EXT("user.resource.resource.$id.solved"); |
my $status=&Apache::lonnet::EXT("user.resource.resource.$id.solved"); |
if ($status =~ /^correct/) { return 1; } |
if ($status =~ /^correct/) { |
|
my $awarded=&Apache::lonnet::EXT("user.resource.resource.$id.awarded"); |
|
my $retrypartial=&Apache::lonnet::EXT("resource.$id.retrypartial"); |
|
unless (($retrypartial =~ /^1|on|yes$/) && ($awarded <1)) { |
|
return 1; |
|
} |
|
} |
if (!$status) { return undef; } |
if (!$status) { return undef; } |
my $maxtries=&Apache::lonnet::EXT("resource.$id.maxtries"); |
my $maxtries=&Apache::lonnet::EXT("resource.$id.maxtries"); |
if ($maxtries eq '') { $maxtries=2; } |
if ($maxtries eq '') { $maxtries=2; } |