Diff for /loncom/homework/response.pm between versions 1.87 and 1.102

version 1.87, 2003/10/27 19:27:09 version 1.102, 2004/09/09 08:59:56
Line 28 Line 28
   
 package Apache::response;  package Apache::response;
 use strict;  use strict;
   use Apache::lonlocal;
   
 BEGIN {  BEGIN {
     &Apache::lonxml::register('Apache::response',('responseparam','parameter','dataresponse'));      &Apache::lonxml::register('Apache::response',('responseparam','parameter','dataresponse'));
Line 45  sub start_response { Line 46  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 '' && 
    !$Apache::lonhomework::ignore_response_errors) {
    &Apache::lonxml::error(&HTML::Entities::encode(&mt("Found a <*response> outside of a <part> in a <part>ed problem"),'<>&"'));
       }
       if ($Apache::inputtags::response_with_no_part &&
    $Apache::inputtags::part ne '0') {
    &Apache::lonxml::error(&HTML::Entities::encode(&mt("<*response>s are both inside of <part> and outside of <part>, this is not a valid problem, errors in grading may occur."),'<>&"').'<br />');
       }
       if ($Apache::inputtags::part eq '0') {
    $Apache::inputtags::response_with_no_part=1;
       }
     return $id;      return $id;
 }  }
   
Line 73  sub end_hintresponse { Line 85  sub end_hintresponse {
     return '';      return '';
 }  }
   
 # used by response to set the non-safe space random number generator to something  my @randomseeds;
 # that is stable and unique based on the part number and response number  sub pushrandomnumber {
 sub setrandomnumber {      my $rand_alg=&Apache::lonnet::get_rand_alg();
     my $rndseed;      if (!$rand_alg || $rand_alg eq '32bit' || $rand_alg eq '64bit' ||
     if ($ENV{'request.state'} eq "construct") {   $rand_alg eq '64bit2') {
  $rndseed=$ENV{'form.rndseed'};   # do nothing
  if (!$rndseed) { $rndseed=time; }      } else {
    my @seed=&Math::Random::random_get_seed();
    push (@randomseeds,\@seed);
       }
       &Apache::response::setrandomnumber();
   }
   sub poprandomnumber {
       my $rand_alg=&Apache::lonnet::get_rand_alg();
       if (!$rand_alg || $rand_alg eq '32bit' || $rand_alg eq '64bit' ||
    $rand_alg eq '64bit2') {
    return;
       }
       my $seed=pop(@randomseeds);
       if ($seed) {
    &Math::Random::random_set_seed(@$seed);
     } else {      } else {
  $rndseed=&Apache::lonnet::rndseed();   &Apache::lonxml::error("Unable to restore random algorithm.");
     }      }
   }
   sub setrandomnumber {
       my $rndseed;
       $rndseed=&Apache::structuretags::setup_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);
     my $rndmod=(&Apache::lonnet::numval($Apache::inputtags::part) << 10);      my $rand_alg=&Apache::lonnet::get_rand_alg();
     if (defined($Apache::inputtags::response['-1'])) {      my $rndmod;
        $rndmod+=&Apache::lonnet::numval($Apache::inputtags::response[-1]);      if (!$rand_alg || $rand_alg eq '32bit' || $rand_alg eq '64bit' ||
     }   $rand_alg eq '64bit2') {
     if ($rndseed =~/,/) {   $rndmod=(&Apache::lonnet::numval($Apache::inputtags::part) << 10);
  {   if (defined($Apache::inputtags::response[-1])) {
     use integer;      $rndmod+=&Apache::lonnet::numval($Apache::inputtags::response[-1]);
     my ($num1,$num2)=split(/,/,$rndseed);   }
     $num1+=$rndmod;      } else {
     $num2+=$rndmod;   $rndmod=(&Apache::lonnet::numval2($Apache::inputtags::part) << 10);
     $rndseed="$num1,$num2";   if (defined($Apache::inputtags::response[-1])) {
       $rndmod+=&Apache::lonnet::numval2($Apache::inputtags::response[-1]);
  }   }
       }
       if ($rndseed =~/([,:])/) {
    my $char=$1;
    use integer;
    my ($num1,$num2)=split(/\Q$char\E/,$rndseed);
    $num1+=$rndmod;
    $num2+=$rndmod;
    $rndseed=$num1.$char.$num2;
     } else {      } else {
  $rndseed+=$rndmod;   $rndseed+=$rndmod;
     }      }
Line 115  sub meta_parameter_write { Line 155  sub meta_parameter_write {
     }      }
     $result.=            ' name="'.$name.'"'.      $result.=            ' name="'.$name.'"'.
                          ' type="'.$type.'"'.                           ' type="'.$type.'"'.
 ($default?' default="'.$default.'"':'').  (defined($default)?' default="'.$default.'"':'').
 ($display?' display="'.$display.' [Part: '.$partref.']"':'')  (defined($display)?' display="'.$display.' [Part: '.$partref.']"':'')
              .'></parameter>'               .'></parameter>'
              ."\n";               ."\n";
     return $result;      return $result;
Line 181  sub meta_part_order { Line 221  sub meta_part_order {
     if (@Apache::inputtags::partlist) {      if (@Apache::inputtags::partlist) {
  my @parts=@Apache::inputtags::partlist;   my @parts=@Apache::inputtags::partlist;
  shift(@parts);   shift(@parts);
  return '<partorder>'.join(',',@parts).'</partorder>';   return '<partorder>'.join(',',@parts).'</partorder>'."\n";
     } else {      } else {
  return '<partorder>0</partorder>';   return '<partorder>0</partorder>'."\n";
       }
   }
   
   sub meta_response_order {
       if (@Apache::inputtags::responselist) {
    return '<responseorder>'.join(',',@Apache::inputtags::responselist).
       '</responseorder>'."\n";
     }      }
 }  }
   
Line 192  sub check_for_previous { Line 239  sub check_for_previous {
     my %previous;      my %previous;
     $previous{'used'} = 0;      $previous{'used'} = 0;
     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\.$partid\.$id\.submission$/) {
     &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) {
Line 266  sub end_dataresponse { Line 313  sub end_dataresponse {
     my ($symb,$courseid,$domain,$name)=&Apache::lonxml::whichuser();      my ($symb,$courseid,$domain,$name)=&Apache::lonxml::whichuser();
     my $allowed=&Apache::lonnet::allowed('mgr',$courseid);      my $allowed=&Apache::lonnet::allowed('mgr',$courseid);
     if ($allowed) {      if ($allowed) {
  &Apache::response::setup_params('dataresponse');   &Apache::response::setup_params('dataresponse',$safeeval);
  my $partid = $Apache::inputtags::part;   my $partid = $Apache::inputtags::part;
  my $id = $Apache::inputtags::response['-1'];   my $id = $Apache::inputtags::response['-1'];
  my $response = $ENV{'form.HWVAL_'.$id};   my $response = $ENV{'form.HWVAL_'.$id};
Line 386  sub reset_params { Line 433  sub reset_params {
 }  }
   
 sub setup_params {  sub setup_params {
     my ($tag) = @_;      my ($tag,$safeeval) = @_;
   
     if ($ENV{'request.state'} eq 'construct') { return; }      if ($ENV{'request.state'} eq 'construct') { return; }
     my %paramlist=();      my %paramlist=();
Line 409  sub setup_params { Line 456  sub setup_params {
     &Apache::lonxml::debug("using nothing");      &Apache::lonxml::debug("using nothing");
     $Apache::inputtags::params{$key}='';      $Apache::inputtags::params{$key}='';
  } else {   } else {
     &Apache::lonxml::debug("using value");      my $string="{return qq\0".$value."\0}";
       my $newvalue=&Apache::run::run($string,$safeeval,1);
       if (defined($newvalue)) { $value=$newvalue; }
     $Apache::inputtags::params{$key}=$value;      $Apache::inputtags::params{$key}=$value;
  }   }
     }      }
Line 451  sub answer_footer { Line 500  sub answer_footer {
 }  }
   
 sub showallfoils {  sub showallfoils {
     my $return=0;      if (defined($ENV{'form.showallfoils'})) {
     if (defined($ENV{'form.showallfoils'}) &&   my ($symb)=&Apache::lonxml::whichuser();
  $ENV{'request.state'} eq 'construct') {   if ($ENV{'request.state'} eq 'construct' || 
  $return=1;      ($ENV{'user.adv'} && $symb eq '')) {
       return 1;
    }
     }      }
     return $return;      return 0;
 }  }
   
 sub getresponse {  sub getresponse {
     my ($temp)=@_;      my ($temp,$resulttype)=@_;
     my $formparm='form.HWVAL_'.$Apache::inputtags::response['-1'];      my $formparm='form.HWVAL_'.$Apache::inputtags::response['-1'];
     my $response;      my $response;
     if (!defined($temp)) {      if (!defined($temp)) {
Line 480  sub getresponse { Line 531  sub getresponse {
  # 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;
  $response = $let_to_num{$response};   if ($resulttype ne 'letter') {
       $response = $let_to_num{$response};
    }
     } else {      } else {
  $response = $ENV{$formparm};   $response = $ENV{$formparm};
     }      }
Line 504  sub scored_response { Line 557  sub scored_response {
  if ($increase ne '') { $score+=$increase+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; }
     my $pcr=$score/$weight;      my $pcr=$score/$weight;
     $Apache::lonhomework::results{"resource.$part.$id.awarded"}=$pcr;      $Apache::lonhomework::results{"resource.$part.$id.awarded"}=$pcr;
     $Apache::lonhomework::results{"resource.$part.$id.awarddetail"}=      $Apache::lonhomework::results{"resource.$part.$id.awarddetail"}=
Line 559  sub whichorder { Line 613  sub whichorder {
     for (my $i=0;$i<=$#bottomlist;$i++) {      for (my $i=0;$i<=$#bottomlist;$i++) {
  if ($bottomlist[$i]) { push(@whichopt,$bottomlist[$i]) }   if ($bottomlist[$i]) { push(@whichopt,$bottomlist[$i]) }
     }      }
   
     return @whichopt;      return @whichopt;
 }  }
   
Line 586  sub analyze_store_foilgroup { Line 639  sub analyze_store_foilgroup {
     push (@{ $Apache::lonhomework::analyze{"$part_id.shown"} }, @{ $shown });      push (@{ $Apache::lonhomework::analyze{"$part_id.shown"} }, @{ $shown });
 }  }
   
   sub check_if_computed {
       my ($token,$parstack,$safeeval,$name)=@_;
       my $value = &Apache::lonxml::get_param($name,$parstack,$safeeval);
       if ($value ne $token->[2]{$name}) {
    my $part_id="$Apache::inputtags::part.$Apache::inputtags::response[-1]";
    $Apache::lonhomework::analyze{"$part_id.answercomputed"} = 1;
       }
   }
   
 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; }      if (not defined(@{ $Apache::response::conceptgroup{'names'} })) { return; }
Line 621  sub pick_foil_for_concept { Line 683  sub pick_foil_for_concept {
   
 }  }
   
   sub get_response_param {
       my ($id,$name,$default)=@_;
       my $parameter;
       if ($ENV{'request.state'} eq 'construct' &&
    defined($Apache::inputtags::params{$name})) {
    $parameter=$Apache::inputtags::params{$name};
       } else {
    $parameter=&Apache::lonnet::EXT("resource.$id.$name");
       }
       if (!defined($parameter) || $parameter eq '') {
    $parameter = $default;
       }
       return $parameter;
   }
   
 1;  1;
 __END__  __END__

Removed from v.1.87  
changed lines
  Added in v.1.102


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