Diff for /loncom/homework/structuretags.pm between versions 1.512.2.17 and 1.554

version 1.512.2.17, 2019/08/07 21:44:28 version 1.554, 2017/02/06 19:54:19
Line 67  use lib '/home/httpd/lib/perl/'; Line 67  use lib '/home/httpd/lib/perl/';
 use LONCAPA;  use LONCAPA;
     
 BEGIN {  BEGIN {
     &Apache::lonxml::register('Apache::structuretags',('block','languageblock','translated','instructorcomment','while','randomlist','problem','library','web','tex','part','preduedate','postanswerdate','solved','notsolved','problemtype','startpartmarker','startouttext','endpartmarker','endouttext','simpleeditbutton','definetag'));      &Apache::lonxml::register('Apache::structuretags',('block','languageblock','translated','instructorcomment','while','randomlist','problem','library','web','print','tex','part','preduedate','postanswerdate','solved','notsolved','problemtype','startpartmarker','startouttext','endpartmarker','endouttext','simpleeditbutton','definetag'));
 }  }
   
   
Line 192  sub end_web { Line 192  sub end_web {
     return '';      return '';
 }  }
   
   sub start_print {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
       if ($target ne 'edit' && $target ne 'modified') {
           if ($target ne 'tex') {
               my $skip = &Apache::lonxml::get_all_text("/print",$parser,$style);
               &Apache::lonxml::debug("skipping ahead :$skip: $$parser[-1]");
           }
       } elsif ($target eq "edit") {
           my $bodytext = &Apache::lonxml::get_all_text_unbalanced("/print",$parser);
           my $result = &Apache::edit::tag_start($target,$token);
           $result .= &Apache::edit::editfield($token->[1],$bodytext,'',80,1);
           return $result;
       } elsif ($target eq "modified") {
           return $token->[4].&Apache::edit::modifiedfield("/print",$parser);
       }
       return '';
   }
   
   sub end_print {
       return '';
   }
   
 sub start_tex {  sub start_tex {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result='';      my $result='';
Line 226  sub end_tex { Line 248  sub end_tex {
 sub homework_js {  sub homework_js {
     my ($postsubmit,$timeout);      my ($postsubmit,$timeout);
     if (($env{'request.course.id'}) && ($env{'request.state'} ne 'construct')) {      if (($env{'request.course.id'}) && ($env{'request.state'} ne 'construct')) {
         my $crstype;          my $crstype = &Apache::loncommon::course_type();
         if (&Apache::loncommon::course_type() eq 'Community') {          if ($crstype eq 'Community') {
             $crstype = 'community';              $crstype = 'community';
           } elsif ($crstype eq 'Placement') {
               $crstype = 'placement'; 
         } else {          } else {
             if ($env{'course.'.$env{'request.course.id'}.'.internal.coursecode'}) {              if ($env{'course.'.$env{'request.course.id'}.'.internal.coursecode'}) {
                 $crstype = 'official';                  $crstype = 'official';
Line 270  sub homework_js { Line 294  sub homework_js {
         $jstimeout = 1000 * $timeout;          $jstimeout = 1000 * $timeout;
     }      }
     return &Apache::loncommon::resize_textarea_js().      return &Apache::loncommon::resize_textarea_js().
            &Apache::loncommon::colorfuleditor_js().                  &Apache::loncommon::colorfuleditor_js().
            &setmode_javascript().             &setmode_javascript().
  <<"JS";   <<"JS";
 <script type="text/javascript">  <script type="text/javascript">
Line 317  var keypresshandled = 0; Line 341  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 496  sub page_start { Line 520  sub page_start {
             }              }
         }          }
         if ($needs_upload) {          if ($needs_upload) {
             $extra_head .= &Apache::lonhtmlcommon::file_submissionchk_js().              $extra_head .= &Apache::lonhtmlcommon::file_submissionchk_js()
                            '<script type="text/javascript" '.                              .'<script type="text/javascript" 
                            'src="/res/adm/includes/file_upload.js"></script>';                                  src="/res/adm/includes/file_upload.js"></script>';
         }          }
     }      }
   
Line 529  sub page_start { Line 553  sub page_start {
     } elsif (!defined($found{'body'})       } elsif (!defined($found{'body'}) 
      && $env{'request.state'} eq 'construct') {       && $env{'request.state'} eq 'construct') {
  if ($target eq 'web' || $target eq 'edit') {   if ($target eq 'web' || $target eq 'edit') {
         # Breadcrumbs for Authoring Space              unless ($env{'form.inhibitmenu'} eq 'yes') {
         &Apache::lonhtmlcommon::clear_breadcrumbs();                  # Breadcrumbs for Authoring Space
         &Apache::lonhtmlcommon::add_breadcrumb({                  &Apache::lonhtmlcommon::clear_breadcrumbs();
             'text'  => 'Authoring Space',                  &Apache::lonhtmlcommon::add_breadcrumb({
             'href'  => &Apache::loncommon::authorspace($env{'request.uri'}),                      'text'  => 'Authoring Space',
         });                      'href'  => &Apache::loncommon::authorspace($env{'request.uri'}),
         # breadcrumbs (and tools) will be created                   });
         # in start_page->bodytag->innerregister                  # breadcrumbs (and tools) will be created 
                   # in start_page->bodytag->innerregister
   
 # FIXME Where are we?  # FIXME Where are we?
 #        &Apache::lonhtmlcommon::add_breadcrumb({  #                &Apache::lonhtmlcommon::add_breadcrumb({
 #            'text'  => 'Problem Editing', # 'Problem Testing'  #                    'text'  => 'Problem Editing', # 'Problem Testing'
 #            'href'  => '',  #                    'href'  => '',
 #        });  #               });
         $pageheader =&Apache::loncommon::head_subbox(                  $pageheader = &Apache::loncommon::head_subbox(
                 &Apache::loncommon::CSTR_pageheader());                                   &Apache::loncommon::CSTR_pageheader());
  }      }
           }
     } elsif (!defined($found{'body'})) {      } elsif (!defined($found{'body'})) {
  my %add_entries;   my %add_entries;
  my $background=&Apache::lonxml::get_param('background',$parstack,   my $background=&Apache::lonxml::get_param('background',$parstack,
Line 652  sub setup_rndseed { Line 678  sub setup_rndseed {
     unless (defined($questiontype)) {      unless (defined($questiontype)) {
         $questiontype = $Apache::lonhomework::type;          $questiontype = $Apache::lonhomework::type;
     }      }
     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'
         || ($Apache::lonhomework::history{'resource.CODE'})    || $Apache::lonhomework::history{'resource.CODE'}) {
         || (($env{'form.code_for_randomlist'}) && ($target eq 'analyze'))) {  
  &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},   &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
  ['rndseed']);   ['rndseed']);
  $rndseed=$env{'form.rndseed'};   $rndseed=$env{'form.rndseed'};
Line 665  sub setup_rndseed { Line 690  sub setup_rndseed {
     if (!$rndseed) {      if (!$rndseed) {
  $rndseed=time;   $rndseed=time;
     }      }
             unless ($env{'form.code_for_randomlist'}) {      $env{'form.rndseed'}=$rndseed;
                 $env{'form.rndseed'}=$rndseed;  
             }  
  }   }
         if (($env{'request.state'} eq "construct") &&           if (($env{'request.state'} eq "construct") && 
             ($Apache::lonhomework::type eq 'randomizetry')) {              ($Apache::lonhomework::type eq 'randomizetry')) {
Line 677  sub setup_rndseed { Line 700  sub setup_rndseed {
             }              }
             $env{'form.'.$Apache::inputtags::part.'.rndseed'}=$rndseed;              $env{'form.'.$Apache::inputtags::part.'.rndseed'}=$rndseed;
         }          }
  if ( ($env{'form.resetdata'} eq &mt('New Problem Variation')   if ( ($env{'form.resetdata'} eq 'new_problem_variation'
       && $env{'form.submitted'} eq 'yes')  ||        && $env{'form.submitted'} eq 'yes')  ||
     $env{'form.newrandomization'} eq &mt('New Randomization')) {      $env{'form.newrandomization'} eq &mt('New Randomization')) {
     srand(time);      srand(time);
Line 695  sub setup_rndseed { Line 718  sub setup_rndseed {
        $rndseed=join(':',&Apache::lonnet::digest($rndseed));         $rndseed=join(':',&Apache::lonnet::digest($rndseed));
             }              }
         }          }
         if (($env{'form.code_for_randomlist'}) && ($target eq 'analyze')) {          if ($Apache::lonhomework::history{'resource.CODE'}) {
             $env{'form.CODE'} = $env{'form.code_for_randomlist'};  
             $rndseed=&Apache::lonnet::rndseed();  
             undef($env{'form.CODE'});  
         } elsif ($Apache::lonhomework::history{'resource.CODE'}) {  
    $rndseed=&Apache::lonnet::rndseed();     $rndseed=&Apache::lonnet::rndseed();
  }   }
         $set_safespace = 1;          $set_safespace = 1;
Line 801  sub problem_edit_header { Line 820  sub problem_edit_header {
         <div class="LC_edit_problem_header">          <div class="LC_edit_problem_header">
         <div class="LC_edit_problem_header_title">          <div class="LC_edit_problem_header_title">
         '.&mt('Problem Editing').$mode.&Apache::loncommon::help_open_menu('Problem Editing','Problem_Editor_XML_Index',5,'Authoring').'          '.&mt('Problem Editing').$mode.&Apache::loncommon::help_open_menu('Problem Editing','Problem_Editor_XML_Index',5,'Authoring').'
          </div><div class="LC_edit_actionbar" id="actionbar">'.          </div><div class="LC_edit_actionbar" id="actionbar">'.
          '<input type="hidden" name="problemmode" value="saveedit" />'.          '<input type="hidden" name="problemmode" value="saveedit" />'.
          &problem_edit_buttons();          &problem_edit_buttons();
   
     $return .= '</div></div>' . &Apache::lonxml::message_location();      $return .= '</div></div>' . &Apache::lonxml::message_location();
     $return .= '<link rel="stylesheet" href="/adm/codemirror/codemirror-combined.css" />      $return .= '<link rel="stylesheet" href="/adm/codemirror/codemirror-combined.css" />
Line 831  sub problem_edit_header { Line 850  sub problem_edit_header {
     return $return;      return $return;
 }  }
   
   
 sub problem_edit_footer {  sub problem_edit_footer {
     my $resource = $env{'request.ambiguous'};      my $resource = $env{'request.ambiguous'};
     return '</td></tr></table><br />      return '</td></tr></table><br />
Line 907  sub problem_web_to_edit_header { Line 925  sub problem_web_to_edit_header {
 ".&mt("Problem Type:")."  ".&mt("Problem Type:")."
 <select name='problemtype'>  <select name='problemtype'>
   <option value=''></option>    <option value=''></option>
   ".&option('exam'   ,'problemtype').&mt("Exam Problem")."</option>    ".&option('exam'   ,'problemtype').&mt("Bubblesheet Exam Problem")."</option>
   ".&option('problem','problemtype').&mt("Homework Problem")."</option>    ".&option('problem','problemtype').&mt("Homework Problem")."</option>
   ".&option('survey' ,'problemtype').&mt("Survey Question")."</option>    ".&option('survey' ,'problemtype').&mt("Survey Question")."</option>
   ".&option('surveycred' ,'problemtype').&mt("Survey Question (with credit)")."</option>    ".&option('surveycred' ,'problemtype').&mt("Survey Question (with credit)")."</option>
Line 959  $show_all Line 977  $show_all
      </div>       </div>
      <input type="submit" name="changeproblemmode" value="'.&mt("Change View").'" />       <input type="submit" name="changeproblemmode" value="'.&mt("Change View").'" />
      <input type="submit" name="clear_style_file" accesskey="d" value="'.&mt('Show Default View').'" />       <input type="submit" name="clear_style_file" accesskey="d" value="'.&mt('Show Default View').'" />
      <input type="submit" name="resetdata" accesskey="r" value="'.&mt('Reset Submissions').'" />       <button type="submit" name="resetdata" accesskey="r" value="reset_submissions">
        '.&mt('Reset Submissions').'</button>
    </div>     </div>
    <hr />     <hr />
    <div class="LC_edit_problem_header_randomize_row">     <div class="LC_edit_problem_header_randomize_row">
Line 992  $show_all Line 1011  $show_all
                'onclick="javascript:setmode(this.form,'."'edit'".')" />';                 'onclick="javascript:setmode(this.form,'."'edit'".')" />';
     $result .= '<input type="button" name="submitmode" accesskey="x" value="'.&mt('EditXML').'" '.      $result .= '<input type="button" name="submitmode" accesskey="x" value="'.&mt('EditXML').'" '.
                'onclick="javascript:setmode(this.form,'."'editxml'".')" />';                 'onclick="javascript:setmode(this.form,'."'editxml'".')" />';
       if ($env{'browser.type'} ne 'explorer' || $env{'browser.version'} > 9) {
           my $uri = $env{'request.uri'};
           my $daxeurl = '/daxepage'.$uri;
           $result .= '<input type="button" value="'.&mt('Edit with Daxe').'" '.
                     'onclick="window.open(\''.$daxeurl.'\',\'_blank\');" />';
       }
     $result.='      $result.='
    </div>     </div>
    <hr />     <hr />
Line 1018  sub initialize_storage { Line 1043  sub initialize_storage {
  || $Apache::lonhomework::type eq 'practice') {   || $Apache::lonhomework::type eq 'practice') {
   
  my $namespace = $symb || $env{'request.uri'};   my $namespace = $symb || $env{'request.uri'};
  if ($env{'form.resetdata'} eq &mt('Reset Submissions') ||   if ($env{'form.resetdata'} eq 'reset_submissions' ||
     ($env{'form.resetdata'} eq &mt('New Problem Variation')      ($env{'form.resetdata'} eq 'new_problem_variation'
      && $env{'form.submitted'} eq 'yes') ||       && $env{'form.submitted'} eq 'yes') ||
     $env{'form.newrandomization'} eq &mt('New Randomization')) {      $env{'form.newrandomization'} eq &mt('New Randomization')) {
     &Apache::lonnet::tmpreset($namespace,'',$domain,$name);      &Apache::lonnet::tmpreset($namespace,'',$domain,$name);
Line 1027  sub initialize_storage { Line 1052  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 1050  sub initialize_storage { Line 1075  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 1066  sub initialize_storage { Line 1091  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 1194  sub finalize_storage { Line 1219  sub finalize_storage {
 =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 1294  sub store_aggregates { Line 1319  sub store_aggregates {
             } else {              } else {
                 $anoncounter{$symb."\0".$part} = 1;                  $anoncounter{$symb."\0".$part} = 1;
             }              }
             my $needsrelease = $Apache::lonnet::needsrelease{'parameter:type:'.$Apache::lonhomework::results{'resource.'.$part.'.type'}};              my $needsrelease = $Apache::lonnet::needsrelease{'parameter:type:'.$Apache::lonhomework::results{'resource.'.$part.'.type'}.'::'};
             if ($needsrelease) {                 if ($needsrelease) {
                 my $curr_required = $env{'course.'.$env{'request.course.id'}.'.internal.releaserequired'};                  my $curr_required = $env{'course.'.$env{'request.course.id'}.'.internal.releaserequired'};
                 if ($curr_required eq '') {                  if ($curr_required eq '') {
                     &Apache::lonnet::update_released_required($needsrelease);                      &Apache::lonnet::update_released_required($needsrelease);
Line 1328  sub checkout_msg { Line 1353  sub checkout_msg {
  'resource'=>'The resource needs to be checked out',   'resource'=>'The resource needs to be checked out',
  'id_expln'=>'As a resource gets checked out, a unique timestamped ID is given to it, and a permanent record is left in the system.',   'id_expln'=>'As a resource gets checked out, a unique timestamped ID is given to it, and a permanent record is left in the system.',
                 'warning'=>'Checking out resources is subject to course policies, and may exclude future credit even if done erroneously.',                  'warning'=>'Checking out resources is subject to course policies, and may exclude future credit even if done erroneously.',
                 'checkout'=>'Check out Exam for Viewing',                  'checkout'=>'Check out Bubblesheet Exam for Viewing',
  'checkout?'=>'Check out Exam?');   'checkout?'=>'Check out Bubblesheet Exam?');
     my $uri = &Apache::lonenc::check_encrypt($env{'request.uri'});      my $uri = &Apache::lonenc::check_encrypt($env{'request.uri'});
     return (<<ENDCHECKOUT);      return (<<ENDCHECKOUT);
 <h2>$lt{'resource'}</h2>  <h2>$lt{'resource'}</h2>
Line 1526  sub start_problem { Line 1551  sub start_problem {
     my $status;      my $status;
     my $accessmsg;      my $accessmsg;
     my $resource_due;      my $resource_due;
       my $ipused;
   
     my $name= &get_resource_name($parstack,$safeeval);      my $name= &get_resource_name($parstack,$safeeval);
     my ($result,$form_tag_start,$slot_name,$slot,$probpartlist,$firstaccres);      my ($result,$form_tag_start,$slot_name,$slot,$probpartlist);
   
     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') {
         if ($env{'form.markaccess'}) {          if ($env{'form.markaccess'}) {
             my @interval=&Apache::lonnet::EXT("resource.0.interval");              my @interval=&Apache::lonnet::EXT("resource.0.interval");
             my $is_set = &Apache::lonnet::set_first_access($interval[1],$interval[0]);              my ($timelimit) = split(/_/,$interval[0]);
             unless (($is_set eq 'ok') || ($is_set eq 'already_set')) {              &Apache::lonnet::set_first_access($interval[1],$timelimit);
                 $firstaccres = $is_set;  
             }  
         }          }
   
         ($status,$accessmsg,$slot_name,$slot) =  
             &Apache::lonhomework::check_slot_access('0','problem');  
         push (@Apache::inputtags::status,$status);  
     }      }
   
     if ($target eq 'web' || $target eq 'webgrade' || $target eq 'tex'      if ($target eq 'web' || $target eq 'webgrade' || $target eq 'tex'
Line 1550  sub start_problem { Line 1570  sub start_problem {
  ($result,$form_tag_start,$probpartlist) =   ($result,$form_tag_start,$probpartlist) =
     &page_start($target,$token,$tagstack,$parstack,$parser,$safeeval,      &page_start($target,$token,$tagstack,$parstack,$parser,$safeeval,
  $name);   $name);
     } elsif (($target eq 'grade') && ($Apache::lonhomework::type eq 'randomizetry')) {      } elsif ((($target eq 'grade') && ($Apache::lonhomework::type eq 'randomizetry')) ||
                ($target eq 'answer')) {
         my ($symb)= &Apache::lonnet::whichuser();          my ($symb)= &Apache::lonnet::whichuser();
         my $navmap = Apache::lonnavmaps::navmap->new();          my $navmap = Apache::lonnavmaps::navmap->new();
         if (ref($navmap)) {          if (ref($navmap)) {
Line 1561  sub start_problem { Line 1582  sub start_problem {
         }          }
     }      }
   
       if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
           $target eq 'tex') {
   
           my ($symb)= &Apache::lonnet::whichuser();
           ($status,$accessmsg,$slot_name,$slot,$ipused) =
               &Apache::lonhomework::check_slot_access('0','problem',$symb,$probpartlist);
           push (@Apache::inputtags::status,$status);
       }
   
     if ($target eq 'tex' and $env{'request.symb'} =~ m/\.page_/) {$result='';}      if ($target eq 'tex' and $env{'request.symb'} =~ m/\.page_/) {$result='';}
   
     if ($target eq 'analyze') { my $rndseed=&setup_rndseed($safeeval,$target); }      if ($target eq 'analyze') { my $rndseed=&setup_rndseed($safeeval,$target); }
Line 1588  sub start_problem { Line 1618  sub start_problem {
     ($symb eq '' || $Apache::lonhomework::type eq 'practice')) {      ($symb eq '' || $Apache::lonhomework::type eq 'practice')) {
     $form_tag_start.='<input type="hidden" name="rndseed" value="'.      $form_tag_start.='<input type="hidden" name="rndseed" value="'.
  $rndseed.'" />'.   $rndseed.'" />'.
     '<input type="submit" name="resetdata"      '<button type="submit" name="resetdata"
                              value="'.&mt('New Problem Variation').'" />';                          value="new_problem_variation">'.&mt('New Problem Variation').'</button>';
     if (exists($env{'form.username'})) {      if (exists($env{'form.username'})) {
  $form_tag_start.=   $form_tag_start.=
     '<input type="hidden" name="username"      '<input type="hidden" name="username"
Line 1611  sub start_problem { Line 1641  sub start_problem {
     $form_tag_start.='<hr />';      $form_tag_start.='<hr />';
         } elsif (($env{'request.state'} ne "construct") &&          } elsif (($env{'request.state'} ne "construct") &&
                  ($Apache::lonhomework::type eq 'randomizetry') &&                   ($Apache::lonhomework::type eq 'randomizetry') &&
                  ($status eq 'CAN_ANSWER')) {                   ($status eq 'CAN_ANSWER') &&
                    ($env{'course.'.$env{'request.course.id'}.'.type'} ne 'Placement') &&
                    (!$env{'request.role.adv'})) {
   # "New Problem Variation Each Try" header suppressed for Placement Tests, unless course personnel. 
             my $reqtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::part.randomizeontries");              my $reqtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::part.randomizeontries");
             my $problemstatus = &get_problem_status($Apache::inputtags::part);              my $problemstatus = &get_problem_status($Apache::inputtags::part);
             $form_tag_start.=&randomizetry_problem_header($problemstatus,$reqtries);              $form_tag_start.=&randomizetry_problem_header($problemstatus,$reqtries);
Line 1631  sub start_problem { Line 1664  sub start_problem {
             ( $status eq 'NOTRESERVABLE') ||              ( $status eq 'NOTRESERVABLE') ||
             ( $status eq 'RESERVABLE') ||              ( $status eq 'RESERVABLE') ||
             ( $status eq 'RESERVABLE_LATER') ||              ( $status eq 'RESERVABLE_LATER') ||
     ( $status eq 'INVALID_ACCESS')) {      ( $status eq 'INVALID_ACCESS') ||
               ( $status eq 'NEED_DIFFERENT_IP')) {
     my $bodytext=&Apache::lonxml::get_all_text("/problem",$parser,      my $bodytext=&Apache::lonxml::get_all_text("/problem",$parser,
        $style);         $style);
     if ( $target eq "web" ) {      if ( $target eq "web" ) {
Line 1651  sub start_problem { Line 1685  sub start_problem {
  } elsif ($status eq 'UNCHECKEDOUT') {   } elsif ($status eq 'UNCHECKEDOUT') {
     $msg.=&checkout_msg();      $msg.=&checkout_msg();
  } elsif ($status eq 'NOT_YET_VIEWED') {   } elsif ($status eq 'NOT_YET_VIEWED') {
                     if ($firstaccres) {  
                         $msg .= '<p class="LC_error">'.  
                                 &mt('A problem occurred when trying to start the timer.').'</p>';  
                     }  
     $msg.=&firstaccess_msg($accessmsg,$symb);      $msg.=&firstaccess_msg($accessmsg,$symb);
  } elsif ($status eq 'NOT_IN_A_SLOT') {   } elsif ($status eq 'NOT_IN_A_SLOT') {
     $msg.=&Apache::bridgetask::add_request_another_attempt_button("Sign up for time to work");      $msg.=&Apache::bridgetask::add_request_another_attempt_button("Sign up for time to work");
Line 1668  sub start_problem { Line 1698  sub start_problem {
                               &Apache::lonnavmaps::timeToHumanString($accessmsg,'start'));                                &Apache::lonnavmaps::timeToHumanString($accessmsg,'start'));
                 } elsif ($status eq 'NOTRESERVABLE') {                  } elsif ($status eq 'NOTRESERVABLE') {
                     $msg.=&mt('Not available to make a reservation.');                        $msg.=&mt('Not available to make a reservation.');  
  }   } elsif ($status eq 'NEED_DIFFERENT_IP') {
                       if ($ipused) {
                           $msg.=&mt('You must use the same computer ([_1]) you used when you first accessed this resource using your time/place-based reservation.',"IP: $ipused");
                       } else {
                           $msg.=&mt('Each student must use a different computer to access this resource at this time and/or place.').'<br />'.
                                 &mt('Somebody else has already used this particular computer for that purpose.');
                       }
                   }
  $result.=$msg.'<br />';   $result.=$msg.'<br />';
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  my $startminipage = ($env{'form.problem_split'}=~/yes/i)? ''   my $startminipage = ($env{'form.problem_split'}=~/yes/i)? ''
Line 1688  sub start_problem { Line 1725  sub start_problem {
  $result .=    $result .= 
     &Apache::bridgetask::proctor_validation_screen($slot);      &Apache::bridgetask::proctor_validation_screen($slot);
     } elsif ($target eq 'grade') {      } elsif ($target eq 'grade') {
  &Apache::bridgetask::proctor_check_auth($slot_name,$slot,   my $checkinresult = &Apache::bridgetask::proctor_check_auth($slot_name,$slot,
  'problem');                      'problem');
                   if ($checkinresult = /^error:/) {
                       $result .= 'error';
                   }
     }      }
  } elsif ($target eq 'web') {   } elsif ($target eq 'web') {
     if ($status eq 'CAN_ANSWER') {      if ($status eq 'CAN_ANSWER') {
Line 1699  sub start_problem { Line 1739  sub start_problem {
                         $Apache::lonhomework::history{'resource.0.checkedin'};                          $Apache::lonhomework::history{'resource.0.checkedin'};
                     if ($checked_in eq '') {                      if ($checked_in eq '') {
                         # unproctored slot access, self checkin                          # unproctored slot access, self checkin
                         &Apache::bridgetask::check_in('problem',undef,undef,                          my $needsiptied;
                                                       $slot_name);                          if (ref($slot)) {
                         $checked_in =                              $needsiptied = $slot->{'iptied'};
                             $Apache::lonhomework::results{"resource.0.checkedin"};                          }
                           my $check = &Apache::bridgetask::check_in('problem',undef,undef,
                                                                     $slot_name,$needsiptied);
                           if ($check =~ /^error: /) {
                               &Apache::lonnet::logthis("Error during self-checkin of problem (symb: $env{'request.symb'}) using slot: $slot_name");
                           } else {
                               $checked_in =
                                   $Apache::lonhomework::results{"resource.0.checkedin"};
                           }
                     }                      }
                     if ((ref($slot) eq 'HASH') && ($checked_in ne '')) {                      if ((ref($slot) eq 'HASH') && ($checked_in ne '')) {
                         if ($slot->{'starttime'} < time()) {                          if ($slot->{'starttime'} < time()) {
Line 1725  sub start_problem { Line 1773  sub start_problem {
       '<input type="hidden" name="submitted" value="yes" />';        '<input type="hidden" name="submitted" value="yes" />';
     # create a page header and exit      # create a page header and exit
     if ($env{'request.state'} eq "construct") {      if ($env{'request.state'} eq "construct") {
  $result.= &problem_web_to_edit_header($env{'form.rndseed'});                  if ($env{'form.inhibitmenu'} eq 'yes') {
                       # error messages can be useful in any case
                       $result.= &Apache::lonxml::message_location();
                   } else {
       $result.= &problem_web_to_edit_header($env{'form.rndseed'});
                   }
                 if ($Apache::lonhomework::type eq 'practice') {                  if ($Apache::lonhomework::type eq 'practice') {
                     $result.= '<input type="submit" name="resetdata" '.                      $result.= '<button type="submit" name="resetdata" '.
                               'value="'.&mt('New Problem Variation').'" />'.                          'value="new_problem_variation">'.&mt('New Problem Variation').'</button>'.
                               &practice_problem_header().'<hr />';                          &practice_problem_header().'<hr />';
                 }                  }
     }      }
     # if we are viewing someone else preserve that info      # if we are viewing someone else preserve that info
Line 1911  sub end_problem { Line 1964  sub end_problem {
                 # Added separately at end of this routine, after added                  # Added separately at end of this routine, after added
                 # <script></script> so document will be valid xhtml.                  # <script></script> so document will be valid xhtml.
                 #                  #
  $result.= &Apache::loncommon::end_page({'discussion' => 1,                  my $showdisc = 1;
                   if (($env{'course.'.$env{'request.course.id'}.'.type'} eq 'Placement') &&
                       (!$env{'request.role.adv'})) { 
   # For Placement Tests footer with "Post Discussion" and "Send Feedback" links is suppressed.
                       $showdisc = 0;
                       my ($symb)= &Apache::lonnet::whichuser();
                       if ($symb) {
                           my $navmap = Apache::lonnavmaps::navmap->new();
                           if (ref($navmap)) {
                               my $hastries = &Apache::lonplacementtest::has_tries($symb,$navmap);  
   # For Placement Tests test status is displayed if this is the last resource in the course
   # and there are no tries left
                               unless ($hastries) {
                                   if (&Apache::lonplacementtest::is_lastres($symb,$navmap)) {
                                       my ($score,$incomplete) = 
                                           &Apache::lonplacementtest::check_completion(undef,undef,1);
                                       if (!$incomplete) {
                                           $result .= &Apache::lonplacementtest::showresult(1,1);
                                       } elsif ($incomplete < 100) { 
                                           $result.= &Apache::lonplacementtest::showincomplete($incomplete,1);
                                       }
                                   } else {
   # For Placement Tests score is displayed if test has just been completed
                                       my ($score,$incomplete) = &Apache::lonplacementtest::check_completion(undef,undef,1);
                                       if (!$incomplete) {
                                           $result.= &Apache::lonplacementtest::showresult(1,1);
                                       }
                                   }
                               }
                           }
                       }
                   }
    $result.= &Apache::loncommon::end_page({'discussion' => $showdisc,
  'notbody'    => 1});   'notbody'    => 1});
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  my $endminipage = '';   my $endminipage = '';
Line 2008  sub start_library { Line 2093  sub start_library {
   '<input type="hidden" name="submitted" value="yes" />';    '<input type="hidden" name="submitted" value="yes" />';
  $result.=&problem_web_to_edit_header($rndseed);   $result.=&problem_web_to_edit_header($rndseed);
         if ($Apache::lonhomework::type eq 'practice') {          if ($Apache::lonhomework::type eq 'practice') {
             $result.= '<input type="submit" name="resetdata" '.              $result.= '<button type="submit" name="resetdata" '.
                       'value="'.&mt('New Problem Variation').'" />'.                  'value="new_problem_variation">'.&mt('New Problem Variation').'</button>'.
                       &practice_problem_header().'<hr />';                  &practice_problem_header().'<hr />';
         }          }
     }      }
     return $result;      return $result;
Line 2025  sub end_library { Line 2110  sub end_library {
      && ($#$tagstack eq 0 && $$tagstack[0] eq 'library')        && ($#$tagstack eq 0 && $$tagstack[0] eq 'library') 
      && $env{'request.state'} eq "construct") {       && $env{'request.state'} eq "construct") {
  $result.='</form>'.&Apache::loncommon::end_page({'discussion' => 1});   $result.='</form>'.&Apache::loncommon::end_page({'discussion' => 1});
     } elsif ($target eq 'meta') {  
         $result.=&Apache::response::meta_response_order();  
     }      }
     if ( $#$tagstack eq 0 && $$tagstack[0] eq 'library') {      if ( $#$tagstack eq 0 && $$tagstack[0] eq 'library') {
  &reset_problem_globals('library');   &reset_problem_globals('library');
Line 2509  sub start_randomlist { Line 2592  sub start_randomlist {
  }   }
  if (@randomlist) {   if (@randomlist) {
     my @idx_arr = (0 .. $#randomlist);      my @idx_arr = (0 .. $#randomlist);
             if ($env{'form.code_for_randomlist'}) {      &Apache::structuretags::shuffle(\@idx_arr);
                 &Apache::structuretags::shuffle(\@idx_arr,$target);  
                 undef($env{'form.code_for_randomlist'});  
             } else {  
                 &Apache::structuretags::shuffle(\@idx_arr);  
             }  
     my $bodytext = '';      my $bodytext = '';
     my $show=$#randomlist;      my $show=$#randomlist;
     my $showarg=&Apache::lonxml::get_param('show',$parstack,$safeeval);      my $showarg=&Apache::lonxml::get_param('show',$parstack,$safeeval);
Line 2553  sub start_randomlist { Line 2631  sub start_randomlist {
 }  }
   
 sub shuffle {  sub shuffle {
     my ($a,$target) = @_;      my $a=shift;
     my $i;      my $i;
     if (ref($a) eq 'ARRAY' && @$a) {      if (ref($a) eq 'ARRAY' && @$a) {
  &Apache::response::pushrandomnumber(undef,$target);   &Apache::response::pushrandomnumber();
  for($i=@$a;--$i;) {   for($i=@$a;--$i;) {
     my $j=int(&Math::Random::random_uniform() * ($i+1));      my $j=int(&Math::Random::random_uniform() * ($i+1));
     next if $i == $j;      next if $i == $j;
Line 2914  sub start_problemtype { Line 2992  sub start_problemtype {
     ['hide','Hide']]      ['hide','Hide']]
    ,$token);     ,$token);
  $result .=&Apache::edit::checked_arg('When used as type(s):','for',   $result .=&Apache::edit::checked_arg('When used as type(s):','for',
      [ ['exam','Exam/Quiz Problem'],       [ ['exam','Bubblesheet Exam/Quiz Problem'],
        ['survey','Survey'],         ['survey','Survey'],
                                                ['surveycred','Survey (with credit)'],                                                 ['surveycred','Survey (with credit)'],
                                                ['anonsurvey','Anonymous Survey'],                                                 ['anonsurvey','Anonymous Survey'],

Removed from v.1.512.2.17  
changed lines
  Added in v.1.554


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