--- loncom/homework/response.pm 2019/08/11 12:27:11 1.247 +++ loncom/homework/response.pm 2024/12/25 02:31:06 1.251 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # various response type definitons response definition # -# $Id: response.pm,v 1.247 2019/08/11 12:27:11 raeburn Exp $ +# $Id: response.pm,v 1.251 2024/12/25 02:31:06 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -42,7 +42,7 @@ described at http://www.lon-capa.org. =over -=item +=item =back @@ -73,7 +73,7 @@ sub start_response { push (@Apache::inputtags::response,$id); push (@Apache::inputtags::responselist,$id); @Apache::inputtags::inputlist=(); - if ($Apache::inputtags::part eq '' && + if ($Apache::inputtags::part eq '' && !$Apache::lonhomework::ignore_response_errors) { &Apache::lonxml::error(&HTML::Entities::encode(&mt("Found a <*response> outside of a in a ed problem"),'<>&"')); } @@ -141,7 +141,7 @@ sub setrandomnumber { my ($ignore_id2,$target,$rndseed) = @_; if (!defined($rndseed)) { $rndseed=&Apache::structuretags::setup_rndseed(undef,$target); - } + } if (!defined($rndseed)) { $rndseed=&Apache::lonnet::rndseed(); } &Apache::lonxml::debug("randseed $rndseed"); # $rndseed=unpack("%32i",$rndseed); @@ -163,7 +163,7 @@ sub setrandomnumber { } else { $shift_amt=0; } - } + } &Apache::lonxml::debug("id1: $id1, id2: $id2, shift_amt: $shift_amt"); if (!$rand_alg || $rand_alg eq '32bit' || $rand_alg eq '64bit' || $rand_alg eq '64bit2') { @@ -265,7 +265,7 @@ sub mandatory_part_meta { } sub meta_part_order { - my ($type) = @_; + my ($type) = @_; if (@Apache::inputtags::partlist) { my @parts=@Apache::inputtags::partlist; unless ($type eq 'library') { @@ -455,7 +455,7 @@ sub end_customresponse { if ($Apache::lonhomework::type eq 'exam' || &Apache::response::submitted('scantron')) { &Apache::response::scored_response($part,$id); - } elsif ( $response =~ /[^\s]/ && + } elsif ( $response =~ /[^\s]/ && $Apache::response::custom_answer_type[-1] eq 'loncapa/perl') { if (!$Apache::lonxml::default_homework_loaded) { &Apache::lonxml::default_homework_load($safeeval); @@ -467,14 +467,14 @@ sub end_customresponse { my $error; ${$safeeval->varglob('LONCAPA::customresponse_submission')}= $response; - + my ($award,$score) = &Apache::run::run('{ my $submission=$LONCAPA::customresponse_submission;'.$Apache::response::custom_answer[-1].'}',$safeeval); if (!&Apache::inputtags::valid_award($award)) { $error = $award; $award = 'ERROR'; } - if (($award eq 'INCORRECT' || $award eq 'APPROX_ANS' || - $award eq 'EXACT_ANS')) { + 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') { @@ -509,7 +509,7 @@ sub end_customresponse { if ($target eq 'web') { &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') { my $repetition = &repetition(); &Apache::lonxml::increment_counter($repetition,"$part.$id"); @@ -771,7 +771,8 @@ sub start_responseparam { } } elsif ($target eq 'grade' || $target eq 'answer' || $target eq 'web' || $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 $default=&Apache::lonxml::get_param('default',$parstack, $safeeval); @@ -802,7 +803,10 @@ sub reset_params { sub setup_params { 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=(); foreach my $key (keys(%Apache::lonnet::packagetab)) { if ($key =~ /^\Q$tag\E/) { @@ -881,7 +885,7 @@ sub answer_part { if ($env{'form.answer_output_mode'} eq 'tex') { if (!$args->{'no_verbatim'}) { my $to_use='|'; - foreach my $value (32..126) { + foreach my $value (33..41,43..126) { my $char=pack('c',$value); if ($answer !~ /\Q$char\E/) { $to_use=$char; @@ -933,7 +937,7 @@ sub answer_footer { sub showallfoils { if (defined($env{'form.showallfoils'})) { my ($symb)=&Apache::lonnet::whichuser(); - if (($env{'request.state'} eq 'construct') || + if (($env{'request.state'} eq 'construct') || ($env{'user.adv'} && $symb eq '') || ($Apache::lonhomework::viewgrades) ) { return 1; @@ -967,7 +971,7 @@ Optional Arguments: 'A is 1' -> a number between 1 and 26 'letter' -> a letter between 'A' and 'Z' $lines - undef problem only needs a single line of bubbles. - nonzero Problem wants the first nonempty response in + nonzero Problem wants the first nonempty response in $lines lines of bubbles. $bubbles_per_line - Must be provided if lines is defined.. number of bubbles on a line. @@ -1005,7 +1009,6 @@ sub getresponse { if ((defined($response)) && ($response ne "") && ($response ne " ")) { last; } - } # save bubbled letter for later @@ -1031,7 +1034,7 @@ sub getresponse { } else { $response = $env{$formparm}; } - # + # # If we have a nonempty answer, correct the numeric value # of the answer for the line on which it was found. # @@ -1046,13 +1049,13 @@ sub getresponse { 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 +(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 @@ -1062,19 +1065,19 @@ sub repetition { my $weight = &Apache::lonnet::EXT("resource.$id.weight"); if (!defined($weight) || ($weight eq '')) { $weight=1; } my $bubbles_per_row; - if (($env{'form.bubbles_per_row'} =~ /^\d+$/) && + 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) && + 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 ($weight % $denominator != 0) { $repetition++; } if (wantarray) { return ($repetition,$bubbles_per_row); } @@ -1102,7 +1105,7 @@ Arguments $part_id - id of the part to grade $response_id - id of the response to grade - + =cut @@ -1200,9 +1203,9 @@ sub 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()) + return (($canshow && &Apache::lonhomework::show_problem_status()) || $status eq "SHOW_ANSWER"); } @@ -1273,7 +1276,7 @@ sub pick_foil_for_concept { Get a parameter associated with a problem. Parameters: - $id - the id of the paramater, either a part id, + $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. @@ -1297,7 +1300,7 @@ sub get_response_param { sub submitted { my ($who)=@_; - + # when scatron grading any submission is a submission if ($env{'form.submitted'} eq 'scantron') { return 1; } # if the caller only cared if this was a scantron submission @@ -1340,7 +1343,7 @@ sub add_to_gradingqueue { } } -=pod +=pod =item check_status() @@ -1349,7 +1352,7 @@ and all true values mean that they can't a return of undef means it is unattempted a return of 0 means it is both attempted and still has tries and - is wrong or is only partially correct, and retries + is wrong or is only partially correct, and retries are allowed. a return of 1 means it is marked correct a return of 2 means they have exceeded maximum number of tries @@ -1370,7 +1373,7 @@ sub check_status { return 3; } my $status=&Apache::lonnet::EXT("user.resource.resource.$id.solved"); - if ($status =~ /^correct/) { + 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)) { @@ -1424,7 +1427,7 @@ sub setup_prior_tries_hash { } } } - if ($questiontype eq 'randomizetry') { + if ($questiontype eq 'randomizetry') { my $order_key = "$partprefix.$id.foilorder"; my @whichopts = &Apache::lonnet::str2array($Apache::lonhomework::history{$order_key}); if (@whichopts > 0) { @@ -1444,7 +1447,7 @@ sub setup_prior_tries_hash { 1; __END__ - + =pod =cut