Diff for /loncom/homework/response.pm between versions 1.250 and 1.253

version 1.250, 2024/10/29 03:22:10 version 1.253, 2025/02/20 03:26:13
Line 42  described at http://www.lon-capa.org. Line 42  described at http://www.lon-capa.org.
   
 =over  =over
   
 =item   =item
   
 =back  =back
   
Line 73  sub start_response { Line 73  sub start_response {
     push (@Apache::inputtags::response,$id);      push (@Apache::inputtags::response,$id);
     push (@Apache::inputtags::responselist,$id);      push (@Apache::inputtags::responselist,$id);
     @Apache::inputtags::inputlist=();      @Apache::inputtags::inputlist=();
     if ($Apache::inputtags::part eq '' &&       if ($Apache::inputtags::part eq '' &&
  !$Apache::lonhomework::ignore_response_errors) {   !$Apache::lonhomework::ignore_response_errors) {
  &Apache::lonxml::error(&HTML::Entities::encode(&mt("Found a <*response> outside of a <part> in a <part>ed problem"),'<>&"'));   &Apache::lonxml::error(&HTML::Entities::encode(&mt("Found a <*response> outside of a <part> in a <part>ed problem"),'<>&"'));
     }      }
Line 141  sub setrandomnumber { Line 141  sub setrandomnumber {
     my ($ignore_id2,$target,$rndseed) = @_;      my ($ignore_id2,$target,$rndseed) = @_;
     if (!defined($rndseed)) {      if (!defined($rndseed)) {
         $rndseed=&Apache::structuretags::setup_rndseed(undef,$target);          $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 163  sub setrandomnumber { Line 163  sub setrandomnumber {
  } else {   } else {
     $shift_amt=0;      $shift_amt=0;
  }   }
     }       }
     &Apache::lonxml::debug("id1: $id1, id2: $id2, shift_amt: $shift_amt");      &Apache::lonxml::debug("id1: $id1, id2: $id2, shift_amt: $shift_amt");
     if (!$rand_alg || $rand_alg eq '32bit' || $rand_alg eq '64bit' ||      if (!$rand_alg || $rand_alg eq '32bit' || $rand_alg eq '64bit' ||
  $rand_alg eq '64bit2') {   $rand_alg eq '64bit2') {
Line 265  sub mandatory_part_meta { Line 265  sub mandatory_part_meta {
 }  }
   
 sub meta_part_order {  sub meta_part_order {
     my ($type) = @_;       my ($type) = @_;
     if (@Apache::inputtags::partlist) {      if (@Apache::inputtags::partlist) {
  my @parts=@Apache::inputtags::partlist;   my @parts=@Apache::inputtags::partlist;
         unless ($type eq 'library') {          unless ($type eq 'library') {
Line 455  sub end_customresponse { Line 455  sub end_customresponse {
  if ($Apache::lonhomework::type eq 'exam' ||   if ($Apache::lonhomework::type eq 'exam' ||
     &Apache::response::submitted('scantron')) {      &Apache::response::submitted('scantron')) {
     &Apache::response::scored_response($part,$id);      &Apache::response::scored_response($part,$id);
  } elsif ( $response =~ /[^\s]/ &&    } elsif ( $response =~ /[^\s]/ &&
   $Apache::response::custom_answer_type[-1] eq 'loncapa/perl') {    $Apache::response::custom_answer_type[-1] eq 'loncapa/perl') {
     if (!$Apache::lonxml::default_homework_loaded) {      if (!$Apache::lonxml::default_homework_loaded) {
  &Apache::lonxml::default_homework_load($safeeval);   &Apache::lonxml::default_homework_load($safeeval);
Line 467  sub end_customresponse { Line 467  sub end_customresponse {
     my $error;      my $error;
     ${$safeeval->varglob('LONCAPA::customresponse_submission')}=      ${$safeeval->varglob('LONCAPA::customresponse_submission')}=
  $response;   $response;
       
     my ($award,$score) = &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;
Line 509  sub end_customresponse { Line 509  sub end_customresponse {
     if ($target eq 'web') {      if ($target eq 'web') {
  &setup_prior_tries_hash(\&format_prior_response_custom);   &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') {
         my $repetition = &repetition();          my $repetition = &repetition();
  &Apache::lonxml::increment_counter($repetition,"$part.$id");   &Apache::lonxml::increment_counter($repetition,"$part.$id");
Line 853  sub answer_header { Line 853  sub answer_header {
  }   }
  push(@answer_bits,$bit);   push(@answer_bits,$bit);
     } else {      } else {
  my $td = '<td '.(defined($rows)?'rowspan="'.$rows.'"':'').'>';   my $th = '<th '.(defined($rows)?'rowspan="'.$rows.'"':'').'>';
  $result  = '<table border="1"><tr>';   $result  = '<table border="1"><tr>';
  if ($Apache::lonhomework::type eq 'exam') {   if ($Apache::lonhomework::type eq 'exam') {
     $result .= $td.($Apache::lonxml::counter+$increment). ')</td>';      $result .= $th.($Apache::lonxml::counter+$increment). ')</th>';
  } else {   } else {
     $result .= $td.&mt('Answer for Part: [_1]',      $result .= $th.&mt('Answer for Part: [_1]',
        $Apache::inputtags::part).'</td>';         $Apache::inputtags::part).'</th>';
  }   }
  $result .= "\n";   $result .= "\n";
  $need_row_start = 0;   $need_row_start = 0;
Line 937  sub answer_footer { Line 937  sub answer_footer {
 sub showallfoils {  sub showallfoils {
     if (defined($env{'form.showallfoils'})) {      if (defined($env{'form.showallfoils'})) {
  my ($symb)=&Apache::lonnet::whichuser();   my ($symb)=&Apache::lonnet::whichuser();
  if (($env{'request.state'} eq 'construct') ||    if (($env{'request.state'} eq 'construct') ||
     ($env{'user.adv'} && $symb eq '')      ||      ($env{'user.adv'} && $symb eq '')      ||
             ($Apache::lonhomework::viewgrades) ) {              ($Apache::lonhomework::viewgrades) ) {
     return 1;      return 1;
Line 971  Optional Arguments: Line 971  Optional Arguments:
                 'A is 1' -> a number between 1 and 26                  'A is 1' -> a number between 1 and 26
                 'letter' -> a letter between 'A' and 'Z'                  'letter' -> a letter between 'A' and 'Z'
   $lines  - undef problem only needs a single line of bubbles.    $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.                        $lines lines of bubbles.
   $bubbles_per_line - Must be provided if lines is defined.. number of    $bubbles_per_line - Must be provided if lines is defined.. number of
                       bubbles on a line.                        bubbles on a line.
Line 1009  sub getresponse { Line 1009  sub getresponse {
     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
Line 1035  sub getresponse { Line 1034  sub getresponse {
     } else {      } else {
  $response = $env{$formparm};   $response = $env{$formparm};
     }      }
     #       #
     #  If we have a nonempty answer, correct the numeric value      #  If we have a nonempty answer, correct the numeric value
     #  of the answer for the line on which it was found.      #  of the answer for the line on which it was found.
     #      #
Line 1050  sub getresponse { Line 1049  sub getresponse {
 In scalar context:  In scalar context:
   
 returns: the number of lines that are required to encode the weight.  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:  In array context:
    
 returns: number of lines required to encode weight, and bubbles/line.  returns: number of lines required to encode weight, and bubbles/line.
   
 =cut  =cut
Line 1066  sub repetition { Line 1065  sub repetition {
     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 $bubbles_per_row;      my $bubbles_per_row;
     if (($env{'form.bubbles_per_row'} =~ /^\d+$/) &&       if (($env{'form.bubbles_per_row'} =~ /^\d+$/) &&
         ($env{'form.bubbles_per_row'} > 0)) {          ($env{'form.bubbles_per_row'} > 0)) {
         $bubbles_per_row = $env{'form.bubbles_per_row'};          $bubbles_per_row = $env{'form.bubbles_per_row'};
     } else {      } else {
         $bubbles_per_row = 10;          $bubbles_per_row = 10;
     }      }
     my $denominator = $bubbles_per_row;      my $denominator = $bubbles_per_row;
     if (($env{'form.scantron_lastbubblepoints'} == 0) &&       if (($env{'form.scantron_lastbubblepoints'} == 0) &&
         ($bubbles_per_row > 1)) {          ($bubbles_per_row > 1)) {
         $denominator = $bubbles_per_row - 1;          $denominator = $bubbles_per_row - 1;
     }       }
     my $repetition = int($weight/$denominator);      my $repetition = int($weight/$denominator);
     if ($weight % $denominator != 0) { $repetition++; }       if ($weight % $denominator != 0) { $repetition++; }
     if (wantarray) {      if (wantarray) {
         return ($repetition,$bubbles_per_row);          return ($repetition,$bubbles_per_row);
     }      }
Line 1106  Arguments Line 1105  Arguments
   
    $part_id - id of the part to grade     $part_id - id of the part to grade
    $response_id - id of the response to grade     $response_id - id of the response to grade
     
   
 =cut  =cut
   
Line 1204  sub show_answer { Line 1203  sub show_answer {
         if (($Apache::lonhomework::history{"resource.$part.awarded"} >= 1) ||          if (($Apache::lonhomework::history{"resource.$part.awarded"} >= 1) ||
             (&Apache::lonnet::EXT("resource.$part.retrypartial") !~/^1|on|yes$/)) {              (&Apache::lonnet::EXT("resource.$part.retrypartial") !~/^1|on|yes$/)) {
             $canshow = 1;              $canshow = 1;
         }             }
     }      }
     return  (($canshow && &Apache::lonhomework::show_problem_status())       return  (($canshow && &Apache::lonhomework::show_problem_status())
      || $status eq "SHOW_ANSWER");       || $status eq "SHOW_ANSWER");
 }  }
   
Line 1277  sub pick_foil_for_concept { Line 1276  sub pick_foil_for_concept {
   
 Get a parameter associated with a problem.  Get a parameter associated with a problem.
 Parameters:  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 _                or a partid and responspe id joined by _
  $name      - Name of the parameter to fetch   $name      - Name of the parameter to fetch
  $default   - Default value for the paramter.   $default   - Default value for the paramter.
Line 1301  sub get_response_param { Line 1300  sub get_response_param {
   
 sub submitted {  sub submitted {
     my ($who)=@_;      my ($who)=@_;
       
     # when scatron grading any submission is a submission      # when scatron grading any submission is a submission
     if ($env{'form.submitted'} eq 'scantron') { return 1; }      if ($env{'form.submitted'} eq 'scantron') { return 1; }
     # if the caller only cared if this was a scantron submission      # if the caller only cared if this was a scantron submission
Line 1344  sub add_to_gradingqueue { Line 1343  sub add_to_gradingqueue {
     }      }
 }  }
   
 =pod   =pod
   
 =item check_status()  =item check_status()
   
Line 1353  and all true values mean that they can't Line 1352  and all true values mean that they can't
   
  a return of undef means it is unattempted   a return of undef means it is unattempted
  a return of 0 means it is both attempted and still has tries and   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.                        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 exceeded maximum number of tries   a return of 2 means they have exceeded maximum number of tries
Line 1374  sub check_status { Line 1373  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/) {       if ($status =~ /^correct/) {
         my $awarded=&Apache::lonnet::EXT("user.resource.resource.$id.awarded");          my $awarded=&Apache::lonnet::EXT("user.resource.resource.$id.awarded");
         my $retrypartial=&Apache::lonnet::EXT("resource.$id.retrypartial");          my $retrypartial=&Apache::lonnet::EXT("resource.$id.retrypartial");
         unless (($retrypartial =~ /^1|on|yes$/) && ($awarded <1))  {          unless (($retrypartial =~ /^1|on|yes$/) && ($awarded <1))  {
Line 1428  sub setup_prior_tries_hash { Line 1427  sub setup_prior_tries_hash {
         }          }
     }      }
         }          }
         if ($questiontype eq 'randomizetry') {           if ($questiontype eq 'randomizetry') {
             my $order_key = "$partprefix.$id.foilorder";              my $order_key = "$partprefix.$id.foilorder";
             my @whichopts = &Apache::lonnet::str2array($Apache::lonhomework::history{$order_key});              my @whichopts = &Apache::lonnet::str2array($Apache::lonhomework::history{$order_key});
             if (@whichopts > 0) {              if (@whichopts > 0) {
Line 1448  sub setup_prior_tries_hash { Line 1447  sub setup_prior_tries_hash {
   
 1;  1;
 __END__  __END__
    
 =pod  =pod
   
 =cut  =cut

Removed from v.1.250  
changed lines
  Added in v.1.253


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>