--- loncom/homework/response.pm 2011/09/13 21:42:58 1.226
+++ loncom/homework/response.pm 2018/03/30 23:50:13 1.245
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# various response type definitons response definition
#
-# $Id: response.pm,v 1.226 2011/09/13 21:42:58 raeburn Exp $
+# $Id: response.pm,v 1.245 2018/03/30 23:50:13 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -53,8 +53,10 @@ package Apache::response;
use strict;
use Apache::lonlocal;
use Apache::lonnet;
+use Apache::inputtags();
use Apache::lonmaxima();
use Apache::lonr();
+use Apache::lontexconvert();
BEGIN {
&Apache::lonxml::register('Apache::response',('responseparam','parameter','dataresponse','customresponse','mathresponse'));
@@ -179,7 +181,6 @@ sub setrandomnumber {
} else {
($rndmod,$rndmod2)=&Apache::lonnet::digest("$id1,$id2");
}
- $Apache::lonhomework::results{'resource.'.$id1.'.rawrndseed'}=$rndseed;
if ($rndseed =~/([,:])/) {
my $char=$1;
use integer;
@@ -196,7 +197,6 @@ sub setrandomnumber {
}
}
&Apache::lonxml::debug("randseed $rndmod $rndseed");
- $Apache::lonhomework::results{'resource.'.$id1.'.rndseed'}=$rndseed;
&Apache::lonnet::setup_random_from_rndseed($rndseed);
return '';
}
@@ -265,10 +265,15 @@ sub mandatory_part_meta {
}
sub meta_part_order {
+ my ($type) = @_;
if (@Apache::inputtags::partlist) {
my @parts=@Apache::inputtags::partlist;
- shift(@parts);
+ unless ($type eq 'library') {
+ shift(@parts);
+ }
return ''.join(',',@parts).''."\n";
+ } elsif ($type eq 'library') {
+ return ''."\n";
} else {
return '0'."\n";
}
@@ -398,7 +403,7 @@ sub end_dataresponse {
$Apache::lonhomework::results{"resource.$partid.$id.awarddetail"}='SUBMITTED';
}
} else {
- $result='Not Permitted to change values.'
+ $result=&mt('Not Permitted to change values');
}
}
}
@@ -468,6 +473,18 @@ sub end_customresponse {
$error = $award;
$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::lonhomework::results{"resource.$part.$id.awarddetail"}=
$award;
@@ -490,17 +507,20 @@ sub end_customresponse {
$result .= &Apache::response::answer_footer('customresponse');
}
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' ||
$target eq 'tex' || $target eq 'analyze') {
- &Apache::lonxml::increment_counter(&Apache::response::repetition(),
- "$part.$id");
+ my $repetition = &repetition();
+ &Apache::lonxml::increment_counter($repetition,"$part.$id");
if ($target eq 'analyze') {
$Apache::lonhomework::analyze{"$part.$id.type"} = 'customresponse';
&Apache::lonhomework::set_bubble_lines();
}
}
+ 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);
@@ -511,6 +531,9 @@ sub end_customresponse {
sub format_prior_response_custom {
my ($mode,$answer) =@_;
+ if (ref($answer) eq 'ARRAY') {
+ $answer = '('.join(', ', @{ $answer }).')';
+ }
return ''.
&HTML::Entities::encode($answer,'"<>&').'';
}
@@ -560,23 +583,6 @@ sub start_mathresponse {
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(<
-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");
-}
-
-
-ENDFORMULABUTTON
-}
-
sub end_mathresponse {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
my $result;
@@ -610,6 +616,18 @@ sub end_mathresponse {
$error = $award;
$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::lonhomework::results{"resource.$part.$id.awarddetail"}=
$award;
@@ -619,15 +637,6 @@ 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::response::custom_answer);
@@ -835,8 +844,8 @@ sub answer_header {
if ($Apache::lonhomework::type eq 'exam') {
$bit = ($Apache::lonxml::counter+$increment).') ';
} else {
- $bit .= ' Answer for Part: \verb|'.
- $Apache::inputtags::part.'| ';
+ $bit .= ' '.&mt('Answer for Part: [_1]',
+ '\verb|'.$Apache::inputtags::part.'|').' ';
}
push(@answer_bits,$bit);
} else {
@@ -1034,12 +1043,18 @@ sub getresponse {
=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)
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
sub repetition {
@@ -1053,9 +1068,18 @@ sub repetition {
} else {
$bubbles_per_row = 10;
}
- my $repetition = int($weight/$bubbles_per_row);
- if ($weight % $bubbles_per_row != 0) { $repetition++; }
+ 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;
+
}
=pod
@@ -1085,11 +1109,24 @@ Arguments
sub scored_response {
my ($part,$id)=@_;
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;
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);
- 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");
if (!defined($weight) || $weight eq '' || $weight eq 0) { $weight = 1; }
@@ -1103,8 +1140,11 @@ sub scored_response {
sub whichorder {
my ($max,$randomize,$showall,$hash,$rndseed)=@_;
#&Apache::lonxml::debug("man $max randomize $randomize");
- if (!defined(@{ $$hash{'names'} })) { return; }
- my @names = @{ $$hash{'names'} };
+ my @names;
+ if (ref($hash->{'names'}) eq 'ARRAY') {
+ @names = @{$hash->{'names'}};
+ }
+ return if (!@names);
my @whichopt =();
my (%top,@toplist,%bottom,@bottomlist);
if (!($showall || ($randomize eq 'no'))) {
@@ -1153,11 +1193,17 @@ sub whichorder {
sub show_answer {
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];
- return ( ($award ==1
- && &Apache::lonhomework::show_problem_status())
- || $status eq "SHOW_ANSWER");
+ my $canshow = 0;
+ if ($award =~ /^correct/) {
+ 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 {
@@ -1185,8 +1231,11 @@ sub check_if_computed {
sub pick_foil_for_concept {
my ($target,$attrs,$hinthash,$parstack,$safeeval)=@_;
- if (not defined(@{ $Apache::response::conceptgroup{'names'} })) { return; }
- my @names = @{ $Apache::response::conceptgroup{'names'} };
+ my @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 $name=$names[$pick];
push @{ $Apache::response::foilgroup{'names'} }, $name;
@@ -1311,7 +1360,7 @@ sub check_status {
if (!defined($id)) { $id=$Apache::inputtags::part; }
my $curtime=&Apache::lonnet::EXT('system.time');
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");
if ( $opendate && $curtime > $opendate &&
$duedate && $curtime > $duedate &&