Diff for /loncom/homework/structuretags.pm between versions 1.512.2.24.2.14 and 1.577

version 1.512.2.24.2.14, 2024/03/01 17:05:45 version 1.577, 2023/07/12 17:43:24
Line 69  use lib '/home/httpd/lib/perl/'; Line 69  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 194  sub end_web { Line 194  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 228  sub end_tex { Line 250  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 272  sub homework_js { Line 296  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().
            &Apache::lonxml::setmode_javascript().             &setmode_javascript().
  <<"JS";   <<"JS";
 <script type="text/javascript">  <script type="text/javascript">
 // <![CDATA[  // <![CDATA[
Line 385  var postsubmit = '$postsubmit'; Line 409  var postsubmit = '$postsubmit';
 JS  JS
 }  }
   
   sub setmode_javascript {
       return <<"ENDSCRIPT";
   <script type="text/javascript">
   // <![CDATA[
   function setmode(form,probmode) {
       var initial = form.problemmode.value;
       form.problemmode.value = probmode;
       form.submit();
       form.problemmode.value = initial;
   }
   // ]]>
   </script>
   ENDSCRIPT
   }
   
 sub page_start {  sub page_start {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$name,      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$name,
  $extra_head)=@_;   $extra_head)=@_;
Line 406  sub page_start { Line 445  sub page_start {
     if (&Apache::lonhtmlcommon::htmlareabrowser()) {      if (&Apache::lonhtmlcommon::htmlareabrowser()) {
         my %textarea_args;          my %textarea_args;
         if (($env{'request.state'} ne 'construct') ||          if (($env{'request.state'} ne 'construct') ||
             (&Apache::loncommon::nocodemirror())) {              ($env{'environment.nocodemirror'})) {
             %textarea_args = (              %textarea_args = (
                                 dragmath => 'math',                                  dragmath => 'math',
                               );                                );
Line 481  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 515  sub page_start { Line 554  sub page_start {
      && $env{'request.state'} eq 'construct') {       && $env{'request.state'} eq 'construct') {
  if ($target eq 'web' || $target eq 'edit') {   if ($target eq 'web' || $target eq 'edit') {
             unless ($env{'form.inhibitmenu'} eq 'yes') {              unless ($env{'form.inhibitmenu'} eq 'yes') {
                   my $text = 'Authoring Space';
                   my $href = &Apache::loncommon::authorspace($env{'request.uri'});
                   if ($env{'request.course.id'}) {
                       my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
                       my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                       if ($href eq "/priv/$cdom/$cnum/") {
                           $text = &mt('Course Authoring Space');
                       }
                   }
                 # Breadcrumbs for Authoring Space                  # Breadcrumbs for Authoring Space
                 &Apache::lonhtmlcommon::clear_breadcrumbs();                  &Apache::lonhtmlcommon::clear_breadcrumbs();
                 &Apache::lonhtmlcommon::add_breadcrumb({                  &Apache::lonhtmlcommon::add_breadcrumb({
                     'text'  => 'Authoring Space',                      'text'  => $text,
                     'href'  => &Apache::loncommon::authorspace($env{'request.uri'}),                      'href'  => $href,
                 });                  });
                 # breadcrumbs (and tools) will be created                   # breadcrumbs (and tools) will be created 
                 # in start_page->bodytag->innerregister                  # in start_page->bodytag->innerregister
Line 632  sub get_resource_name { Line 680  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 749  sub setup_rndseed { Line 797  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 778  sub problem_edit_action_button { Line 835  sub problem_edit_action_button {
   
 sub problem_edit_buttons {  sub problem_edit_buttons {
    my ($mode)=@_;     my ($mode)=@_;
    my %editors = &Apache::loncommon::permitted_editors();  
 # Buttons that save  # Buttons that save
    my $result = '<div style="float:right">';     my $result = '<div style="float:right">';
    if ($mode eq 'editxml') {     if ($mode eq 'editxml') {
        if ($editors{'xml'}) {         $result.=&problem_edit_action_button('subsaveedit','saveeditxml','s','Save and EditXML');
            $result.=&problem_edit_action_button('subsaveedit','saveeditxml','s','Save and EditXML');  
        }  
        $result.=&problem_edit_action_button('subsaveview','saveviewxml','v','Save and View');         $result.=&problem_edit_action_button('subsaveview','saveviewxml','v','Save and View');
    } else {     } else {
        if ($editors{'edit'}) {         $result.=&problem_edit_action_button('subsaveedit','saveedit','s','Save and Edit');
            $result.=&problem_edit_action_button('subsaveedit','saveedit','s','Save and Edit');  
        }  
        $result.=&problem_edit_action_button('subsaveview','saveview','v','Save and View');         $result.=&problem_edit_action_button('subsaveview','saveview','v','Save and View');
    }     }
    $result.="\n</div>\n";     $result.="\n</div>\n";
Line 797  sub problem_edit_buttons { Line 849  sub problem_edit_buttons {
    $result .= '<div>'.     $result .= '<div>'.
               &problem_edit_action_button('subdiscview','discard','d','Discard Edits and View',1);                &problem_edit_action_button('subdiscview','discard','d','Discard Edits and View',1);
    if ($mode eq 'editxml') {     if ($mode eq 'editxml') {
        if ($editors{'edit'}) {         $result.=&problem_edit_action_button('subedit','edit','e','Edit',1);
            $result.=&problem_edit_action_button('subedit','edit','e','Edit',1);  
        }  
        if ($editors{'daxe'}) {  
            $result.=&problem_edit_action_button('subdaxe','daxe','w','Edit with Daxe',1);  
        }  
        $result.=&problem_edit_action_button('subundo','undoxml','u','Undo',1);         $result.=&problem_edit_action_button('subundo','undoxml','u','Undo',1);
        if (&Apache::loncommon::nocodemirror()) {         if ($env{'environment.nocodemirror'}) {
            $result.=&Apache::lonhtmlcommon::dragmath_button("LC_editxmltext",1);             $result.=&Apache::lonhtmlcommon::dragmath_button("LC_editxmltext",1);
        }         }
    } else {     } else {
        if ($editors{'xml'}) {         $result.=&problem_edit_action_button('subeditxml','editxml','x','EditXML',1);
            $result.=&problem_edit_action_button('subeditxml','editxml','x','EditXML',1);  
        }  
        if ($editors{'daxe'}) {  
            $result.=&problem_edit_action_button('subdaxe','daxe','w','Edit with Daxe',1);  
        }  
        $result.=&problem_edit_action_button('subundo','undo','u','Undo',1);         $result.=&problem_edit_action_button('subundo','undo','u','Undo',1);
    }     }
    $result.="\n</div>";     $result.="\n</div>";
Line 857  sub problem_edit_header { Line 899  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 886  sub option { Line 927  sub option {
   
 sub problem_web_to_edit_header {  sub problem_web_to_edit_header {
     my ($rndseed)=@_;      my ($rndseed)=@_;
     my %editors = &Apache::loncommon::permitted_editors();  
     my $result .= '<div class="LC_edit_problem_header">';      my $result .= '<div class="LC_edit_problem_header">';
   
     if (!$Apache::lonhomework::parsing_a_task) {      if (!$Apache::lonhomework::parsing_a_task) {
Line 934  sub problem_web_to_edit_header { Line 974  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 1016  $show_all Line 1056  $show_all
    <hr />     <hr />
    <div>';     <div>';
     $result.='<input type="hidden" name="problemmode" value="view" />';      $result.='<input type="hidden" name="problemmode" value="view" />';
     if ($editors{'edit'}) {      $result .= '<input type="button" name="submitmode" accesskey="e" value="'.&mt('Edit').'" '.
         $result .= '<input type="button" name="submitmode" accesskey="e" value="'.&mt('Edit').'" '.                 'onclick="javascript:setmode(this.form,'."'edit'".')" />';
                    'onclick="javascript:setmode(this.form,'."'edit'".')" />';      $result .= '<input type="button" name="submitmode" accesskey="x" value="'.&mt('EditXML').'" '.
     }                 'onclick="javascript:setmode(this.form,'."'editxml'".')" />';
     if ($editors{'xml'}) {      if ($env{'browser.type'} ne 'explorer' || $env{'browser.version'} > 9) {
         $result .= '<input type="button" name="submitmode" accesskey="x" value="'.&mt('EditXML').'" '.  
                    'onclick="javascript:setmode(this.form,'."'editxml'".')" />';  
     }  
     if (($editors{'daxe'}) &&  
         ($env{'browser.type'} ne 'explorer' || $env{'browser.version'} > 9)) {  
         my $uri = $env{'request.uri'};          my $uri = $env{'request.uri'};
         my $daxeurl = '/daxepage'.$uri;          my $daxeurl = '/daxepage'.$uri;
         $result .= '<input type="button" accesskey="w" value="'.&mt('Edit with Daxe').'" '.          $result .= '<input type="button" value="'.&mt('Edit with Daxe').'" '.
                    'onclick="javascript:setmode(this.form,'."'daxe'".')" />';                    'onclick="window.open(\''.$daxeurl.'\',\'_blank\');" />';
     }      }
     $result.='      $result.='
    </div>     </div>
Line 1057  sub initialize_storage { Line 1092  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 'reset_submissions' ||   if ($env{'form.resetdata'} eq 'reset_submissions' ||
             ($env{'form.resetdata'} eq '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 1111  sub initialize_storage { Line 1146  sub initialize_storage {
         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 1398  sub needs_linkprot_passback { Line 1433  sub needs_linkprot_passback {
                             $lti_in_use = $domlti{$itemnum};                              $lti_in_use = $domlti{$itemnum};
                         }                          }
                         my ($state,$others,$listed,$scope,$protect,$display,$target,$exit) = split(/,/,$deeplink);                          my ($state,$others,$listed,$scope,$protect,$display,$target,$exit) = split(/,/,$deeplink);
                         my ($passback,$pbscope);                          my $passback;
                         if ($scope eq 'res') {                          if ($scope eq 'resource') {
                             if ($deeplink_symb eq $symb) {                              if ($deeplink_symb eq $symb) {
                                 $passback = 1;                                  $passback = 1;
                                 $pbscope = 'resource';  
                             }                              }
                         } elsif ($scope eq 'map') {                          } elsif ($scope eq 'map') {
                             if (&Apache::lonnet::clutter($deeplink_map) eq $map) {                              if (&Apache::lonnet::clutter($deeplink_map) eq $map) {
                                 $passback = 1;                                  $passback = 1;
                                 $pbscope = 'nonrec';  
                             }  
                         } elsif ($scope eq 'rec') {  
                             if (&Apache::lonnet::clutter($deeplink_map) eq $map) {  
                                 $passback = 1;  
                                 $pbscope = 'map';  
                             } else {  
                                 my @recurseup = &Apache::lonnet::get_map_hierarchy($map,$env{'request.course.id'});  
                                 if (grep(/^\Q$deeplink_map\E$/,@recurseup)) {  
                                     $passback = 1;  
                                     $pbscope = 'map';  
                                 }  
                             }                              }
                           } elsif ($scope eq 'recurse') {
   #FIXME check if $deeplink_map contains $map
                               $passback = 1;
                         }                          }
                         return ($passback,$pbscope,$deeplink_map,$deeplink_symb,$crsdef,$itemnum,$lti_in_use);                          return ($passback,$scope,$deeplink_map,$deeplink_symb,$crsdef,$itemnum,$lti_in_use);
                     }                      }
                 }                  }
             }              }
Line 1534  sub store_aggregates { Line 1559  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 1595  sub access_status_msg { Line 1620  sub access_status_msg {
                       &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.');
               }
         }          }
         $msg.='<br />';          $msg.='<br />';
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
Line 1604  sub access_status_msg { Line 1636  sub access_status_msg {
         $msg ='\noindent \vskip 1 mm '.          $msg ='\noindent \vskip 1 mm '.
               $startminipage.'\vskip 0 mm';                $startminipage.'\vskip 0 mm';
         if ($status eq 'UNAVAILABLE') {          if ($status eq 'UNAVAILABLE') {
             $msg.=&mt('Unable to determine if this resource is open due to network problems. Please try again later.');              $msg.=&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'\vskip 0 mm ';
         } elsif ($status eq 'CLOSED' || $status eq 'INVALID_ACCESS') {  
             $msg.=&mt('Problem is not open to be viewed. It')." $accessmsg";  
         } else {          } else {
             $msg.=&mt('Problem is not open to be viewed.');              $msg.=&mt('Problem is not open to be viewed. It')." $accessmsg \\vskip 0 mm ";
         }          }
         $msg .= " \\vskip 0 mm ";  
     }      }
     return $msg;      return $msg;
 }  }
   
 sub checkin_prompt {  sub checkin_prompt {
     my ($target,$slot_name,$slot,$type) = @_;      my ($target,$slot_name,$slot,$type) = @_;
     my $result;      my $result; 
     if ($target eq 'web') {      if ($target eq 'web') {
         $result = &Apache::bridgetask::proctor_validation_screen($slot);          $result = &Apache::bridgetask::proctor_validation_screen($slot);
     } elsif ($target eq 'grade') {      } elsif ($target eq 'grade') {
Line 1635  sub selfcheckin_resource { Line 1664  sub selfcheckin_resource {
             $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
               my $needsiptied;
               if (ref($slot)) {
                   $needsiptied = $slot->{'iptied'};
               }
             my $check = &Apache::bridgetask::check_in('problem',undef,undef,              my $check = &Apache::bridgetask::check_in('problem',undef,undef,
                                                       $slot_name);                                                        $slot_name,$needsiptied);
             if ($check =~ /^error: /) {              if ($check =~ /^error: /) {
                 &Apache::lonnet::logthis("Error during self-checkin of problem (symb: $symb) using slot: $slot_name");                  &Apache::lonnet::logthis("Error during self-checkin of problem (symb: $symb) using slot: $slot_name");
             } else {              } else {
Line 1661  sub checkout_msg { Line 1694  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 1863  sub start_problem { Line 1896  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,$firstaccres);
Line 1871  sub start_problem { Line 1905  sub start_problem {
         $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 ($timelimit) = ($interval[0] =~ /^(\d+)/);              my ($timelimit) = split(/_/,$interval[0]);
             my $is_set = &Apache::lonnet::set_first_access($interval[1],$timelimit);              my $is_set = &Apache::lonnet::set_first_access($interval[1],$timelimit);
             unless (($is_set eq 'ok') || ($is_set eq 'already_set')) {              unless (($is_set eq 'ok') || ($is_set eq 'already_set')) {
                 $firstaccres = $is_set;                  $firstaccres = $is_set;
Line 1907  sub start_problem { Line 1941  sub start_problem {
         $target eq 'tex') {          $target eq 'tex') {
   
         my ($symb)= &Apache::lonnet::whichuser();          my ($symb)= &Apache::lonnet::whichuser();
         ($status,$accessmsg,$slot_name,$slot) =          ($status,$accessmsg,$slot_name,$slot,$ipused) =
             &Apache::lonhomework::check_slot_access('0','problem',$symb,$probpartlist);              &Apache::lonhomework::check_slot_access('0','problem',$symb,$probpartlist);
         push (@Apache::inputtags::status,$status);          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='';}
   
Line 1973  sub start_problem { Line 2007  sub start_problem {
         }          }
         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') &&
               ($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 @parts;              my @parts;
             if (ref($probpartlist) eq 'ARRAY') {              if (ref($probpartlist) eq 'ARRAY') {
                 @parts = @{$probpartlist};                  @parts = @{$probpartlist};
Line 1999  sub start_problem { Line 2036  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 (($status eq 'NOT_YET_VIEWED') && ($firstaccres)) {              if (($status eq 'NOT_YET_VIEWED') && ($firstaccres)) {
                 $result .= '<p class="LC_error">'.                  $result .= '<p class="LC_error">'.
                            &mt('A problem occurred when trying to start the timer.').'</p>';                             &mt('A problem occurred when trying to start the timer.').'</p>';
             }              }
             $result .= &access_status_msg('problem',$status,$symb,$target,'',$accessmsg);              $result .= &access_status_msg('problem',$status,$symb,$target,$ipused,$accessmsg);
  } elsif ($status eq 'NEEDS_CHECKIN') {   } elsif ($status eq 'NEEDS_CHECKIN') {
     my $bodytext=&Apache::lonxml::get_all_text("/problem",$parser,      my $bodytext=&Apache::lonxml::get_all_text("/problem",$parser,
        $style);         $style);
Line 2037  sub start_problem { Line 2075  sub start_problem {
                 }                  }
                 if ($Apache::lonhomework::type eq 'practice') {                  if ($Apache::lonhomework::type eq 'practice') {
                     $result.= '<button type="submit" name="resetdata" '.                      $result.= '<button type="submit" name="resetdata" '.
                               'value="new_problem_variation">'.&mt('New Problem Variation').'</button>'.                          'value="new_problem_variation">'.&mt('New Problem Variation').'</button>'.
                               &practice_problem_header().'<hr />';                          &practice_problem_header().'<hr />';
                 } elsif ($Apache::lonhomework::type eq 'randomizetry') {                  } elsif ($Apache::lonhomework::type eq 'randomizetry') {
                     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);
Line 2228  sub end_problem { Line 2266  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 2282  ENDJS Line 2352  ENDJS
     @Apache::inputtags::response=();      @Apache::inputtags::response=();
     $result=&Apache::response::mandatory_part_meta;      $result=&Apache::response::mandatory_part_meta;
  }   }
  $result.=&Apache::response::meta_part_order();   $result.=&Apache::response::meta_part_order('problem');
  $result.=&Apache::response::meta_response_order();   $result.=&Apache::response::meta_response_order();
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
  &Apache::lonxml::debug("in end_problem with $target, edit");   &Apache::lonxml::debug("in end_problem with $target, edit");
Line 2303  ENDJS Line 2373  ENDJS
     # computation:      # computation:
     #      #
     if ($target eq 'web') {      if ($target eq 'web') {
         $result .= &Apache::lonhtmlcommon::dash_to_minus_js().          $result .= &Apache::lonhtmlcommon::set_compute_end_time();
                    &Apache::lonhtmlcommon::set_compute_end_time();  
         #          #
         # Closing tags delayed so any <script></script> tags           # Closing tags delayed so any <script></script> tags 
         # not in head can appear inside body, for valid xhtml.          # not in head can appear inside body, for valid xhtml.
Line 2344  sub start_library { Line 2413  sub start_library {
  $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.= '<button type="submit" name="resetdata" '.              $result.= '<button type="submit" name="resetdata" '.
                       'value="new_problem_variation">'.&mt('New Problem Variation').'</button>'.                  'value="new_problem_variation">'.&mt('New Problem Variation').'</button>'.
                       &practice_problem_header().'<hr />';                  &practice_problem_header().'<hr />';
         }          }
     }      }
     return $result;      return $result;
Line 2361  sub end_library { Line 2430  sub end_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') {      } elsif ($target eq 'meta') {
           $result.=&Apache::response::meta_part_order('library');
         $result.=&Apache::response::meta_response_order();          $result.=&Apache::response::meta_response_order();
     }      }
     if ( $#$tagstack eq 0 && $$tagstack[0] eq 'library') {      if ( $#$tagstack eq 0 && $$tagstack[0] eq 'library') {
Line 2990  sub start_part { Line 3060  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 3066  sub start_part { Line 3144  sub start_part {
                     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 $num = scalar(@Apache::inputtags::partlist)-1;                          my $num = scalar(@Apache::inputtags::partlist)-1;
                         if ((($Apache::lonhomework::default_type eq 'randomizetry') ||                          if ((($Apache::lonhomework::default_type eq 'randomizetry') || 
                              ($Apache::lonhomework::randomizetrypart)) &&                              ($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 3127  sub end_part { Line 3205  sub end_part {
     $gradestatus='';      $gradestatus='';
  }   }
  $result.=$gradestatus;   $result.=$gradestatus;
         if ($$tagstack[-2] eq 'td' and $target eq 'tex') {   if ($$tagstack[-2] eq 'td' and $target eq 'tex') {
             if (not $env{'form.problem_split'}=~/yes/) {              if (not $env{'form.problem_split'}=~/yes/) {
                 $result.='\end{minipage}';                  $result.='\end{minipage}';
             }              }
Line 3247  sub start_problemtype { Line 3325  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'],
Line 3296  sub end_startouttext { Line 3374  sub end_startouttext {
                  .&Apache::edit::deletelist($target,$token)                   .&Apache::edit::deletelist($target,$token)
                  .'</span></td>'                   .'</span></td>'
          .'<td><span id="math_'.$areaid.'">';           .'<td><span id="math_'.$areaid.'">';
  if (&Apache::loncommon::nocodemirror()) {   if ($env{'environment.nocodemirror'}) {
     $result.=&Apache::lonhtmlcommon::dragmath_button($areaid,1);      $result.=&Apache::lonhtmlcommon::dragmath_button($areaid,1);
  } else {   } else {
     $result.='&nbsp;';      $result.='&nbsp;';
Line 3390  sub end_simpleeditbutton { Line 3468  sub end_simpleeditbutton {
 }  }
   
 sub practice_problem_header {  sub practice_problem_header {
     return '<span class="LC_info"><h3>'.&mt('Practice Problem').'</h3></span>'.      return '<h3 class="LC_info">'.&mt('Practice Problem').'</h3>'.
            '<span class="LC_info">'.&mt('Submissions are not permanently recorded').             '<span class="LC_info">'.&mt('Submissions are not permanently recorded').
            '</span>';             '</span>';
 }  }
Line 3452  sub randomizetry_part_header { Line 3530  sub randomizetry_part_header {
     if ($num > 1) {      if ($num > 1) {
         $output .= '<hr />';          $output .= '<hr />';
     }      }
     $output .=  '<span class="LC_info"><h4>'.$header.'</h4></span>'.      $output .=  '<h4 class="LC_info">'.$header.'</h4>'.
                   '<span class="LC_info">'.$text.'</span><br /><br />';                    '<span class="LC_info">'.$text.'</span><br /><br />';
     return $output;      return $output;
 }  }

Removed from v.1.512.2.24.2.14  
changed lines
  Added in v.1.577


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