Diff for /loncom/homework/structuretags.pm between versions 1.566 and 1.576

version 1.566, 2019/11/04 19:36:46 version 1.576, 2023/06/04 13:25:21
Line 62  use Apache::lonxml; Line 62  use Apache::lonxml;
 use Apache::londefdef;  use Apache::londefdef;
 use Apache::lonenc();  use Apache::lonenc();
 use Apache::loncommon();  use Apache::loncommon();
   use Apache::lonnavmaps;
 use Time::HiRes qw( gettimeofday tv_interval );  use Time::HiRes qw( gettimeofday tv_interval );
   use HTML::Entities();
 use lib '/home/httpd/lib/perl/';  use lib '/home/httpd/lib/perl/';
 use LONCAPA;  use LONCAPA;
     
Line 341  var keypresshandled = 0; Line 343  var keypresshandled = 0;
 var postsubmit = '$postsubmit';  var postsubmit = '$postsubmit';
   
 \$(document).ready(function(){  \$(document).ready(function(){
   if (postsubmit != 'off') {        if (postsubmit != 'off') {
     \$(document).keypress(function(event){      \$(document).keypress(function(event){
         var keycode = (event.keyCode ? event.keyCode : event.which);          var keycode = (event.keyCode ? event.keyCode : event.which);
         if ((keycode == '13') && (keypresshandled == 0)) {          if ((keycode == '13') && (keypresshandled == 0)) {
Line 624  sub page_start { Line 626  sub page_start {
         my ($symb,$courseid,$udom,$uname)=&Apache::lonnet::whichuser();          my ($symb,$courseid,$udom,$uname)=&Apache::lonnet::whichuser();
         my ($path,$multiresp) =           my ($path,$multiresp) = 
             &Apache::loncommon::get_turnedin_filepath($symb,$uname,$udom);              &Apache::loncommon::get_turnedin_filepath($symb,$uname,$udom);
         if (($is_task) || ($needs_upload)) {          if ($env{'request.user_in_effect'}) {
               $form_tag_start .= ' onsubmit="preventDefault();"';
           } elsif (($is_task) || ($needs_upload)) {
             $form_tag_start .= ' onsubmit="return file_submission_check(this,'."'$path','$multiresp'".');"';              $form_tag_start .= ' onsubmit="return file_submission_check(this,'."'$path','$multiresp'".');"';
         }          }
  $form_tag_start.='>'."\n";   $form_tag_start.='>'."\n";
Line 667  sub get_resource_name { Line 671  sub get_resource_name {
 }  }
   
 sub setup_rndseed {  sub setup_rndseed {
     my ($safeeval,$target,$probpartlist)=@_;      my ($safeeval,$target,$probpartlist,$prevparttype)=@_;
     my ($symb)=&Apache::lonnet::whichuser();      my ($symb)=&Apache::lonnet::whichuser();
     my ($questiontype,$set_safespace,$rndseed,$numtries,$reqtries);      my ($questiontype,$set_safespace,$rndseed,$numtries,$reqtries);
     if ($target eq 'analyze') {      if ($target eq 'analyze') {
Line 678  sub setup_rndseed { Line 682  sub setup_rndseed {
     }      }
     if ($Apache::lonhomework::type eq 'randomizetry') {      if ($Apache::lonhomework::type eq 'randomizetry') {
         my $partfortries = $Apache::inputtags::part;          my $partfortries = $Apache::inputtags::part;
   #
   # Where question type is "randomizetry" for a problem containing
   # a single part (and unless type is explicitly set to not be
   # "randomizetry" for that part), the number of tries used to
   # determine randomization will be for that part, and randomization
   # from calls to &random() in a perl script block before the part tag,
   # will change based on the number of tries, and value of the
   # "randomizeontries" parameter in effect for the single part.
   #
         if (ref($probpartlist) eq 'ARRAY') {          if (ref($probpartlist) eq 'ARRAY') {
             if ((@{$probpartlist} == 1) && ($probpartlist->[0] ne $Apache::inputtags::part)) {              if ((@{$probpartlist} == 1) && ($probpartlist->[0] ne $partfortries)) {
                 $partfortries = $probpartlist->[0];                  if (&Apache::lonnet::EXT('resource.'.$probpartlist->[0].'.type') eq 'randomizetry') {
                 if (&Apache::lonnet::EXT("resource.$partfortries.questiontype") eq 'randomizetry') {  
                     $partfortries = $probpartlist->[0];                      $partfortries = $probpartlist->[0];
                 } else {                  } else {
                     $partfortries = '';                      $partfortries = '';
Line 710  sub setup_rndseed { Line 722  sub setup_rndseed {
                 $env{'form.rndseed'}=$rndseed;                  $env{'form.rndseed'}=$rndseed;
             }              }
  }   }
         if ((($env{'request.state'} eq "construct") || ($symb eq '')) &&           if ((($env{'request.state'} eq "construct") || ($symb eq '')) &&
             ($Apache::lonhomework::type eq 'randomizetry')) {              ($Apache::lonhomework::type eq 'randomizetry')) {
             if ($numtries) {              if ($numtries) {
                 if (($reqtries =~ /^\d+$/) && ($reqtries > 1)) {                  if (($reqtries =~ /^\d+$/) && ($reqtries > 1)) {
Line 776  sub setup_rndseed { Line 788  sub setup_rndseed {
         if ($target eq 'grade') {          if ($target eq 'grade') {
             $Apache::lonhomework::rawrndseed = $rndseed;              $Apache::lonhomework::rawrndseed = $rndseed;
         }          }
       } elsif ($prevparttype eq 'randomizetry') {
           if ($env{'form.0.rndseed'} ne '') {
               $set_safespace = 1;
               $rndseed = $env{'form.0.rndseed'};
           }
     }      }
     if ($set_safespace) {      if ($set_safespace) {
         if ($safeeval) {          if ($safeeval) {
             &Apache::lonxml::debug("Setting rndseed to $rndseed");              &Apache::lonxml::debug("Setting rndseed to $rndseed");
             &Apache::run::run('$external::randomseed="'.$rndseed.'";',$safeeval);              &Apache::run::run('$external::randomseed="'.$rndseed.'";',$safeeval);
               if (($Apache::lonhomework::type eq 'randomizetry') || ($prevparttype eq 'randomizetry')) {
                   &Apache::lonxml::debug("Setting randomizetrypart to $Apache::inputtags::part");
                   &Apache::run::run('$external::randomizetrypart="'.$Apache::inputtags::part.'";',$safeeval);
               }
         }          }
     }      }
     unless (($env{'request.state'} eq "construct") || ($symb eq '')) {      unless (($env{'request.state'} eq "construct") || ($symb eq '')) {
Line 1071  sub initialize_storage { Line 1092  sub initialize_storage {
  }   }
  %Apache::lonhomework::history=   %Apache::lonhomework::history=
     &Apache::lonnet::tmprestore($namespace,'',$domain,$name);      &Apache::lonnet::tmprestore($namespace,'',$domain,$name);
  my ($temp)=keys(%Apache::lonhomework::history) ;   my ($temp)=keys(%Apache::lonhomework::history);
  &Apache::lonxml::debug("Return message of $temp");   &Apache::lonxml::debug("Return message of $temp");
     } else {      } else {
  %Apache::lonhomework::history=   %Apache::lonhomework::history=
Line 1094  sub initialize_storage { Line 1115  sub initialize_storage {
         &check_correctness_changes() is called in two circumstances          &check_correctness_changes() is called in two circumstances
         in which the results hash is to be stored permanently, for          in which the results hash is to be stored permanently, for
         grading triggered by a student's submission, where feedback on          grading triggered by a student's submission, where feedback on
         correctness is to be provided to the student.           correctness is to be provided to the student.
   
         1. Immediately prior to storing the results hash          1. Immediately prior to storing the results hash
   
         To handle the case where a student's submission (and award) were           To handle the case where a student's submission (and award) were
         stored after history was retrieved in &initialize_storage(), e.g.,          stored after history was retrieved in &initialize_storage(), e.g.,
         if a student submitted answers in quick succession (e.g., from           if a student submitted answers in quick succession (e.g., from
         multiple tabs).  &Apache::inputtags::hidealldata() is called for          multiple tabs).  &Apache::inputtags::hidealldata() is called for
         any parts with out-of-order storage (i.e., correct then incorrect,          any parts with out-of-order storage (i.e., correct then incorrect,
         where awarded >= 1 when correct).          where awarded >= 1 when correct).
Line 1110  sub initialize_storage { Line 1131  sub initialize_storage {
         To handle the case where lond on the student's homeserver returns          To handle the case where lond on the student's homeserver returns
         delay:N -- where N is the number of transactions between the last          delay:N -- where N is the number of transactions between the last
         retrieved in &initialize_storage() and the last stored immediately          retrieved in &initialize_storage() and the last stored immediately
         before permanent storage of the current transaction via           before permanent storage of the current transaction via
         lond::store_handler().  &Apache::grades::makehidden() is called            lond::store_handler().  &Apache::grades::makehidden() is called
         for any parts with out-of-order storage (i.e., correct then incorrect,          for any parts with out-of-order storage (i.e., correct then incorrect,
         where awarded >= 1 when correct).          where awarded >= 1 when correct).
   
  Will call &store_aggregates() to increment totals for attempts,    Will call &store_aggregates() to increment totals for attempts,
         students, and corrects, if running user has student role.          students, and corrects, if running user has student role.
   
 =cut  =cut
Line 1129  sub finalize_storage { Line 1150  sub finalize_storage {
  delete(@Apache::lonhomework::results{@remove});   delete(@Apache::lonhomework::results{@remove});
  my ($symb,$courseid,$domain,$name) =    my ($symb,$courseid,$domain,$name) = 
     &Apache::lonnet::whichuser($given_symb);      &Apache::lonnet::whichuser($given_symb);
         my ($passback,$ltiscope,$ltimap,$ltisymb,$ltiref,$total,$possible,$dopassback);          my ($passback,$pbscope,$pbmap,$pbsymb,$pbtype,$crsdef,$ltinum,
               $ltiref,$total,$possible,$dopassback);
  if ($env{'request.state'} eq 'construct'    if ($env{'request.state'} eq 'construct' 
     || $symb eq ''      || $symb eq ''
     || $Apache::lonhomework::type eq 'practice') {      || $Apache::lonhomework::type eq 'practice') {
Line 1143  sub finalize_storage { Line 1165  sub finalize_storage {
             if (($env{'user.name'} eq $name) && ($env{'user.domain'} eq $domain) &&              if (($env{'user.name'} eq $name) && ($env{'user.domain'} eq $domain) &&
                 (!$Apache::lonhomework::scantronmode) && (!defined($env{'form.grade_symb'})) &&                  (!$Apache::lonhomework::scantronmode) && (!defined($env{'form.grade_symb'})) &&
                 (!defined($env{'form.grade_courseid'}))) {                  (!defined($env{'form.grade_courseid'}))) {
                 if ($env{'request.lti.login'}) {                  if (($env{'request.lti.login'}) || ($env{'request.deeplink.login'})) {
                     my ($map)=&Apache::lonnet::decode_symb($symb);                      my ($map)=&Apache::lonnet::decode_symb($symb);
                     $map = &Apache::lonnet::clutter($map);                      $map = &Apache::lonnet::clutter($map);
                     ($passback,$ltiscope,$ltimap,$ltisymb,$ltiref) =                       if ($env{'request.lti.login'}) {
                         &needs_lti_passback($courseid,$symb,$map);                          ($passback,$pbscope,$pbmap,$pbsymb,$ltinum,$ltiref) =
                               &needs_lti_passback($courseid,$symb,$map);
                       } elsif ($env{'request.deeplink.login'}) {
                           ($passback,$pbscope,$pbmap,$pbsymb,$crsdef,$ltinum,$ltiref) =
                               &needs_linkprot_passback($courseid,$symb,$map);
                       }
                 }                  }
                 if ($Apache::lonhomework::history{'version'}) {                  if ($Apache::lonhomework::history{'version'}) {
                     $laststore = $Apache::lonhomework::history{'version'}.'='.                      $laststore = $Apache::lonhomework::history{'version'}.'='.
Line 1244  sub finalize_storage { Line 1271  sub finalize_storage {
                     }                      }
                 }                  }
             }              }
             if (($dopassback) && ($ltiscope eq 'resource') && ($ltisymb eq $symb)) {              if (($dopassback) && ($pbscope eq 'resource') && ($pbsymb eq $symb)) {
                 $total = 0;                  $total = 0;
                 $possible = 0;                  $possible = 0;
                 my $navmap = Apache::lonnavmaps::navmap->new();                  my $navmap = Apache::lonnavmaps::navmap->new();
Line 1285  sub finalize_storage { Line 1312  sub finalize_storage {
             &store_aggregates($symb,$courseid);              &store_aggregates($symb,$courseid);
             if ($dopassback) {              if ($dopassback) {
                 my $scoreformat = 'decimal';                  my $scoreformat = 'decimal';
                 if (ref($ltiref) eq 'HASH') {                  if (($env{'request.lti.login'}) || ($env{'request.deeplink.login'})) {
                     if ($ltiref->{'scoreformat'} =~ /^(decimal|ratio|percentage)$/) {                      if (ref($ltiref) eq 'HASH') {
                         $scoreformat = $1;                          if ($ltiref->{'scoreformat'} =~ /^(decimal|ratio|percentage)$/) {
                               $scoreformat = $1;
                           }
                     }                      }
                 }                  }
                   my ($pbid,$pburl,$pbtype);
                   if ($env{'request.lti.login'}) {
                       $pbid = $env{'request.lti.passbackid'};
                       $pburl = $env{'request.lti.passbackurl'};
                       $pbtype = 'lti';
                   } elsif ($env{'request.deeplink.login'}) {
                       $pbid = $env{'request.linkprotpbid'};
                       $pburl = $env{'request.linkprotpburl'};
                       $pbtype = 'linkprot';
                   }
                 my $ltigrade = {                  my $ltigrade = {
                                    'ltinum'   => $ltinum,
                                  'lti'      => $ltiref,                                   'lti'      => $ltiref,
                                    'crsdef'   => $crsdef,
                                  'cid'      => $courseid,                                   'cid'      => $courseid,
                                  'uname'    => $env{'user.name'},                                   'uname'    => $env{'user.name'},
                                  'udom'     => $env{'user.domain'},                                   'udom'     => $env{'user.domain'},
                                  'pbid'     => $env{'request.lti.passbackid'},                                   'pbid'     => $pbid,
                                  'pburl'    => $env{'request.lti.passbackurl'},                                   'pburl'    => $pburl,
                                  'scope'    => $ltiscope,                                   'pbtype'   => $pbtype,
                                  'ltimap'   => $ltimap,                                   'scope'    => $pbscope,
                                  'ltisymb'  => $ltisymb,                                   'pbmap'    => $pbmap,
                                    'pbsymb'   => $pbsymb,
                                  'format'   => $scoreformat,                                   'format'   => $scoreformat,
                                };                                 };
                 if ($ltiscope eq 'resource') {                  if ($pbscope eq 'resource') {
                     $ltigrade->{'total'} = $total;                      $ltigrade->{'total'} = $total;
                     $ltigrade->{'possible'} = $possible;                      $ltigrade->{'possible'} = $possible;
                 }                  }
Line 1323  sub needs_lti_passback { Line 1365  sub needs_lti_passback {
             my %lti = &Apache::lonnet::get_domain_lti($cdom,'provider');              my %lti = &Apache::lonnet::get_domain_lti($cdom,'provider');
             if (ref($lti{$env{'request.lti.login'}}) eq 'HASH') {              if (ref($lti{$env{'request.lti.login'}}) eq 'HASH') {
                 if ($lti{$env{'request.lti.login'}}{'passback'}) {                  if ($lti{$env{'request.lti.login'}}{'passback'}) {
                       my $itemnum = $env{'request.lti.login'};
                     my ($ltiscope,$ltiuri,$ltisymb) =                      my ($ltiscope,$ltiuri,$ltisymb) =
                         &LONCAPA::ltiutils::lti_provider_scope($env{'request.lti.uri'},                          &LONCAPA::ltiutils::lti_provider_scope($env{'request.lti.uri'},
                                                                $cdom,$cnum,1);                                                                 $cdom,$cnum,1);
Line 1341  sub needs_lti_passback { Line 1384  sub needs_lti_passback {
                             $passback = 1;                              $passback = 1;
                         }                          }
                     }                      }
                     return ($passback,$ltiscope,$ltimap,$ltisymb,$lti{$env{'request.lti.login'}});                      return ($passback,$ltiscope,$ltimap,$ltisymb,$itemnum,$lti{$itemnum});
                 }                  }
             }              }
         }          }
Line 1349  sub needs_lti_passback { Line 1392  sub needs_lti_passback {
     return;      return;
 }  }
   
   sub needs_linkprot_passback {
       my ($courseid,$symb,$map) = @_;
       if (($env{'request.linkprotpbid'}) && ($env{'request.linkprotpburl'})) {
           if ($courseid =~ /^($LONCAPA::match_domain)_($LONCAPA::match_courseid)$/) {
               my ($cdom,$cnum) = ($1,$2);
               my ($deeplink_symb,$deeplink_map,$deeplink,$passback);
               $deeplink_symb = &Apache::loncommon::deeplink_login_symb($cnum,$cdom);
               if ($deeplink_symb) {
                   if ($deeplink_symb =~ /\.(page|sequence)$/) {
                       $deeplink_map = &Apache::lonnet::deversion((&Apache::lonnet::decode_symb($deeplink_symb))[2]);
                       my $navmap = Apache::lonnavmaps::navmap->new();
                       if (ref($navmap)) {
                           $deeplink = $navmap->get_mapparam(undef,$deeplink_map,'0.deeplink');
                       }
                   } else {
                       $deeplink = &Apache::lonnet::EXT('resource.0.deeplink',$deeplink_symb);
                       $deeplink_map = &Apache::lonnet::deversion((&Apache::lonnet::decode_symb($deeplink_symb))[0]);
                   }
                   if (($deeplink ne '') && ($env{'request.linkprot'} ne '')) {
                       my ($itemid,$tinyurl) = split(/:/,$env{'request.linkprot'});
                       if ($itemid =~ /^(\d+)(c|d)$/) {
                           my ($itemnum,$itemtype) = ($1,$2);
                           my ($crsdef,$lti_in_use);
                           if ($itemtype eq 'c') {
                               $crsdef = 1;
                               my %crslti = &Apache::lonnet::get_course_lti($cnum,$cdom,'provider');
                               $lti_in_use = $crslti{$itemnum};
                           } else {
                               my %domlti = &Apache::lonnet::get_domain_lti($cdom,'linkprot');
                               $lti_in_use = $domlti{$itemnum};
                           }
                           my ($state,$others,$listed,$scope,$protect,$display,$target,$exit) = split(/,/,$deeplink);
                           my $passback;
                           if ($scope eq 'resource') {
                               if ($deeplink_symb eq $symb) {
                                   $passback = 1;
                               }
                           } elsif ($scope eq 'map') {
                               if (&Apache::lonnet::clutter($deeplink_map) eq $map) {
                                   $passback = 1;
                               }
                           } elsif ($scope eq 'recurse') {
   #FIXME check if $deeplink_map contains $map
                               $passback = 1;
                           }
                           return ($passback,$scope,$deeplink_map,$deeplink_symb,$crsdef,$itemnum,$lti_in_use);
                       }
                   }
               }
           }
       }
   }
   
 =pod  =pod
   
 =item check_correctness_changes()  =item check_correctness_changes()
   
         For all parts for which current results contain a solved status          For all parts for which current results contain a solved status
         of "incorrect_attempted", check if there was a transaction in which            of "incorrect_attempted", check if there was a transaction in which
         solved was set to "correct_by_student" in the time since the last           solved was set to "correct_by_student" in the time since the last
         transaction (retrieved when &initialize_storage() was called i.e.,           transaction (retrieved when &initialize_storage() was called i.e.,
         when &start_problem() was called), unless:          when &start_problem() was called), unless:
         (a) questiontype parameter is set to survey or anonymous survey (+/- credit)          (a) questiontype parameter is set to survey or anonymous survey (+/- credit)
         (b) problemstatus is set to no or no_feedback_ever          (b) problemstatus is set to no or no_feedback_ever
         If such a transaction exists, and did not occur after "reset status"           If such a transaction exists, and did not occur after "reset status"
         by a user with grading privileges, then the current transaction is an          by a user with grading privileges, then the current transaction is an
         example of an out-of-order transaction (i.e., incorrect occurring after          example of an out-of-order transaction (i.e., incorrect occurring after
         correct).  Accordingly, the current transaction should be hidden.          correct).  Accordingly, the current transaction should be hidden.
Line 1629  sub firstaccess_msg { Line 1725  sub firstaccess_msg {
     my $uri = &Apache::lonenc::check_encrypt($env{'request.uri'});      my $uri = &Apache::lonenc::check_encrypt($env{'request.uri'});
     my $buttontext = &mt('Show Resource');      my $buttontext = &mt('Show Resource');
     my $timertext = &mt('Start Timer?');      my $timertext = &mt('Start Timer?');
       my $shownsymb = &HTML::Entities::encode(&Apache::lonenc::check_encrypt($symb),'\'"<>&');
     $result .= (<<ENDCHECKOUT);      $result .= (<<ENDCHECKOUT);
 <form name="markaccess" method="post" action="$uri">  <form name="markaccess" method="post" action="$uri">
 <input type="hidden" name="markaccess" value="yes" />  <input type="hidden" name="markaccess" value="yes" />
   <input type="hidden" name="symb" value="$shownsymb" />
 <input type="button" name="accessbutton" value="$buttontext" onclick="javascript:if (confirm('$timertext')) { document.markaccess.submit(); }" />  <input type="button" name="accessbutton" value="$buttontext" onclick="javascript:if (confirm('$timertext')) { document.markaccess.submit(); }" />
 </form>  </form>
 ENDCHECKOUT  ENDCHECKOUT
Line 1814  sub start_problem { Line 1912  sub start_problem {
     } elsif ((($target eq 'grade') && ($Apache::lonhomework::type eq 'randomizetry')) ||      } elsif ((($target eq 'grade') && ($Apache::lonhomework::type eq 'randomizetry')) ||
              ($target eq 'answer')) {               ($target eq 'answer')) {
         my ($symb)= &Apache::lonnet::whichuser();          my ($symb)= &Apache::lonnet::whichuser();
         my $navmap = Apache::lonnavmaps::navmap->new();          if ($symb ne '') {
         if (ref($navmap)) {              my $navmap = Apache::lonnavmaps::navmap->new();
             my $res = $navmap->getBySymb($symb);              if (ref($navmap)) {
             if (ref($res)) {                  my $res = $navmap->getBySymb($symb);
                 $probpartlist = $res->parts();                  if (ref($res)) {
                       $probpartlist = $res->parts();
                   }
             }              }
         }          }
     }      }
   
       if (($target eq 'web') && ($env{'request.user_in_effect'})) {
           &Apache::lonxml::get_all_text("/problem",$parser,$style);
           return $result;
       }
   
     if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||      if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
         $target eq 'tex') {          $target eq 'tex') {
   
Line 1838  sub start_problem { Line 1943  sub start_problem {
     if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||      if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
  $target eq 'tex') {   $target eq 'tex') {
   
           my ($symb) = &Apache::lonnet::whichuser();
  #handle rand seed in construction space   #handle rand seed in construction space
           if (($env{'request.state'} eq 'construct') || ($symb eq '')) {
               my $partorder=&Apache::lonnet::metadata($env{'request.uri'},'partorder');
               if ($partorder ne '') {
                   @{$probpartlist} = split(/,/,$partorder);
               }
           }
  my $rndseed=&setup_rndseed($safeeval,$target,$probpartlist);   my $rndseed=&setup_rndseed($safeeval,$target,$probpartlist);
         if (($target eq 'grade') && &Apache::response::submitted()) {          if (($target eq 'grade') && &Apache::response::submitted()) {
             if ($Apache::lonhomework::type eq 'randomizetry') {              if ($Apache::lonhomework::type eq 'randomizetry') {
Line 1853  sub start_problem { Line 1965  sub start_problem {
                 }                  }
             }              }
         }          }
  my ($symb)=&Apache::lonnet::whichuser();  
   
  if ($env{'request.state'} ne "construct" &&    if ($env{'request.state'} ne "construct" && 
     ($symb eq '' || $Apache::lonhomework::type eq 'practice')) {      ($symb eq '' || $Apache::lonhomework::type eq 'practice')) {
Line 1884  sub start_problem { Line 1995  sub start_problem {
                 $form_tag_start.=&practice_problem_header();                  $form_tag_start.=&practice_problem_header();
             }              }
     $form_tag_start.='<hr />';      $form_tag_start.='<hr />';
         }           }
         if (($env{'request.state'} ne "construct") &&          if (($env{'request.state'} ne "construct") &&
             ($Apache::lonhomework::type eq 'randomizetry') &&              ($Apache::lonhomework::type eq 'randomizetry') &&
             ($status eq 'CAN_ANSWER') &&              ($status eq 'CAN_ANSWER') &&
Line 2101  sub end_problem { Line 2212  sub end_problem {
     }      }
  }   }
  $result =~ s/INSERTTEXFRONTMATTERHERE/$frontmatter/;   $result =~ s/INSERTTEXFRONTMATTERHERE/$frontmatter/;
       } elsif ($target eq 'web') {
           if ($env{'request.user_in_effect'}) {
               &reset_problem_globals('problem');
               $result .= &Apache::lonhtmlcommon::set_compute_end_time();
               return $result;
           }
     }      }
   
     my $status=$Apache::inputtags::status['-1'];      my $status=$Apache::inputtags::status['-1'];
Line 2934  sub start_part { Line 3051  sub start_part {
         if (($target eq 'grade') && &Apache::response::submitted()) {          if (($target eq 'grade') && &Apache::response::submitted()) {
             $Apache::lonhomework::results{"resource.$id.rndseed"}=$rndseed;              $Apache::lonhomework::results{"resource.$id.rndseed"}=$rndseed;
         }          }
       } elsif (@Apache::inputtags::partlist > 1) {
           my $prevparttype = &Apache::lonnet::EXT("resource.$Apache::inputtags::partlist[-2].type");
           if ($prevparttype eq 'randomizetry') {
               my $rndseed=&setup_rndseed($safeeval,$target,'',$prevparttype);
               if (($target eq 'grade') && &Apache::response::submitted()) {
                   $Apache::lonhomework::results{"resource.$id.rndseed"}=$rndseed;
               }
           }
     } elsif (($target eq 'grade') && &Apache::response::submitted()) {      } elsif (($target eq 'grade') && &Apache::response::submitted()) {
         $Apache::lonhomework::results{"resource.$id.rndseed"}=$Apache::lonhomework::rawrndseed;          $Apache::lonhomework::results{"resource.$id.rndseed"}=$Apache::lonhomework::rawrndseed;
     }      }
Line 3009  sub start_part { Line 3134  sub start_part {
  } elsif ($target eq 'web') {   } elsif ($target eq 'web') {
                     if ($status eq 'CAN_ANSWER') {                      if ($status eq 'CAN_ANSWER') {
                         my $problemstatus = &get_problem_status($Apache::inputtags::part);                           my $problemstatus = &get_problem_status($Apache::inputtags::part); 
                         my $probrandomize = &Apache::lonnet::EXT("resource.$Apache::inputtags::partlist[0].type");  
                         my $probrandtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::partlist[0].randomizeontries");  
                         my $num = scalar(@Apache::inputtags::partlist)-1;                          my $num = scalar(@Apache::inputtags::partlist)-1;
                         if ((($probrandomize eq 'randomizetry') || ($Apache::lonhomework::randomizetrypart)) &&                          if ((($Apache::lonhomework::default_type eq 'randomizetry') || 
                               ($Apache::lonhomework::randomizetrypart)) &&
                             ($Apache::lonhomework::type ne 'randomizetry')) {                              ($Apache::lonhomework::type ne 'randomizetry')) {
                             $result .= &randomizetry_part_header($problemstatus,'none',$num);                              $result .= &randomizetry_part_header($problemstatus,'none',$num);
                         } elsif ($Apache::lonhomework::type eq 'randomizetry') {                          } elsif ($Apache::lonhomework::type eq 'randomizetry') {
Line 3072  sub end_part { Line 3196  sub end_part {
     $gradestatus='';      $gradestatus='';
  }   }
  $result.=$gradestatus;   $result.=$gradestatus;
  if ($$tagstack[-2] eq 'td' and $target eq 'tex') {$result.='\end{minipage}';}    if ($$tagstack[-2] eq 'td' and $target eq 'tex') {
               if (not $env{'form.problem_split'}=~/yes/) {
                   $result.='\end{minipage}';
               }
           }
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
  $result.=&Apache::edit::end_table();   $result.=&Apache::edit::end_table();
     } elsif ($target eq 'modified') {      } elsif ($target eq 'modified') {
Line 3371  sub randomizetry_part_header { Line 3499  sub randomizetry_part_header {
     my ($header,$text);      my ($header,$text);
     if ($reqtries eq 'none') {      if ($reqtries eq 'none') {
         $header = &mt('No Question Variation');          $header = &mt('No Question Variation');
         $text = &mt('For this question there will no new variation after a try.');          $text = &mt('For this question there will be no new variation after a try.');
     } elsif ($reqtries > 1) {      } elsif ($reqtries > 1) {
         $header = &mt('New Question Variation After Every [quant,_1,Try,Tries]',$reqtries);          $header = &mt('New Question Variation After Every [quant,_1,Try,Tries]',$reqtries);
         if (($problemstatus eq 'no') ||          if (($problemstatus eq 'no') ||

Removed from v.1.566  
changed lines
  Added in v.1.576


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