Diff for /loncom/homework/structuretags.pm between versions 1.512.2.24.2.10 and 1.512.2.25

version 1.512.2.24.2.10, 2024/02/27 19:46:23 version 1.512.2.25, 2023/09/11 13:46:11
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 HTML::Entities();
 use lib '/home/httpd/lib/perl/';  use lib '/home/httpd/lib/perl/';
Line 273  sub homework_js { Line 272  sub homework_js {
     }      }
     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 384  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 585  sub page_start { Line 599  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 ($env{'request.user_in_effect'}) {          if (($is_task) || ($needs_upload)) {
             $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 664  sub setup_rndseed { Line 676  sub setup_rndseed {
             $reqtries = &Apache::lonnet::EXT("resource.$partfortries.randomizeontries");              $reqtries = &Apache::lonnet::EXT("resource.$partfortries.randomizeontries");
         }          }
     }      }
     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'))) {          || (($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']);
Line 1080  sub initialize_storage { Line 1092  sub initialize_storage {
         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 1094  sub finalize_storage { Line 1106  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,$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 1105  sub finalize_storage { Line 1115  sub finalize_storage {
       $namespace,'',$domain,$name);        $namespace,'',$domain,$name);
     &Apache::lonxml::debug('Construct Store return message:'.$result);      &Apache::lonxml::debug('Construct Store return message:'.$result);
  } else {   } else {
             my ($laststore,$checkedparts,@parts,%postcorrect,%record);              my ($laststore,$checkedparts,@parts,%postcorrect);
             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'}) || ($env{'request.deeplink.login'})) {  
                     my ($map)=&Apache::lonnet::decode_symb($symb);  
                     $map = &Apache::lonnet::clutter($map);  
                     if ($env{'request.lti.login'}) {  
                         ($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'}.'='.
                                  $Apache::lonhomework::history{'timestamp'};                                   $Apache::lonhomework::history{'timestamp'};
                 } else {                  } else {
                     $laststore = '0=0';                      $laststore = '0=0';
                 }                  }
                 %record = &Apache::lonnet::restore($symb,$courseid,$domain,$name);                  my %record = &Apache::lonnet::restore($symb,$courseid,$domain,$name);
                 if ($record{'version'}) {                  if ($record{'version'}) {
                     my ($newversion,$oldversion,$oldtimestamp);                      my ($newversion,$oldversion,$oldtimestamp);
                     if ($Apache::lonhomework::history{'version'}) {                      if ($Apache::lonhomework::history{'version'}) {
Line 1202  sub finalize_storage { Line 1201  sub finalize_storage {
                     }                      }
                 }                  }
             }              }
             if ($passback) {  
                 foreach my $key (keys(%Apache::lonhomework::results)) {  
                     if ($key =~ /^resource\.([^\.]+)\.solved$/) {  
                         my $part = $1;  
                         if ((($Apache::lonhomework::results{$key} =~ /^correct_/) ||  
                             ($Apache::lonhomework::results{$key} eq 'incorrect_attempted')) &&  
                             ($Apache::lonhomework::results{"resource.$part.tries"})) {  
                             $dopassback = 1;  
                             last;  
                         }  
                     }  
                 }  
             }  
             if (($dopassback) && ($pbscope eq 'resource') && ($pbsymb eq $symb)) {  
                 $total = 0;  
                 $possible = 0;  
                 my $navmap = Apache::lonnavmaps::navmap->new();  
                 if (ref($navmap)) {  
                     my $res = $navmap->getBySymb($symb);  
                     if (ref($res)) {  
                         my $partlist = $res->parts();  
                         if (ref($partlist) eq 'ARRAY') {  
                             foreach my $part (@{$partlist}) {  
                                 unless (exists($Apache::lonhomework::results{"resource.$part.solved"})) {  
                                     next if ($Apache::lonhomework::record{"resource.$part.solved"} =~/^excused/);  
                                     my $weight = &Apache::lonnet::EXT("resource.$part.weight",$symb);  
                                     $possible += $weight;  
                                     if (($record{'version'}) && (exists($record{"resource.$part.awarded"}))) {  
                                         my $awarded = $record{"resource.$part.awarded"};  
                                         if ($awarded) {  
                                             $total += $weight * $awarded;  
                                         }  
                                     }  
                                 }  
                             }  
                         }  
                     }  
                 }  
                 foreach my $key (keys(%Apache::lonhomework::results)) {  
                     if ($key =~ /^resource\.([^\.]+)\.awarded$/) {  
                         my $part = $1;  
                         my $weight = &Apache::lonnet::EXT("resource.$part.weight",$symb);  
                         $possible += $weight;  
                         my $awarded = $Apache::lonhomework::results{$key};  
                         if ($awarded) {  
                             $total += $weight * $awarded;  
                         }  
                     }  
                 }  
             }  
     &Apache::lonxml::debug('Store return message:'.$result);      &Apache::lonxml::debug('Store return message:'.$result);
             &store_aggregates($symb,$courseid);              &store_aggregates($symb,$courseid);
             if ($dopassback) {  
                 my $scoreformat = 'decimal';  
                 if (($env{'request.lti.login'}) || ($env{'request.deeplink.login'})) {  
                     if (ref($ltiref) eq 'HASH') {  
                         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 = {  
                                  'ltinum'   => $ltinum,  
                                  'lti'      => $ltiref,  
                                  'crsdef'   => $crsdef,  
                                  'cid'      => $courseid,  
                                  'uname'    => $env{'user.name'},  
                                  'udom'     => $env{'user.domain'},  
                                  'pbid'     => $pbid,  
                                  'pburl'    => $pburl,  
                                  'pbtype'   => $pbtype,  
                                  'scope'    => $pbscope,  
                                  'pbmap'    => $pbmap,  
                                  'pbsymb'   => $pbsymb,  
                                  'format'   => $scoreformat,  
                                };  
                 if ($pbscope eq 'resource') {  
                     $ltigrade->{'total'} = $total;  
                     $ltigrade->{'possible'} = $possible;  
                 }  
                 push(@Apache::lonhomework::ltipassback,$ltigrade);  
             }  
  }   }
     } else {      } else {
  &Apache::lonxml::debug('Nothing to store');   &Apache::lonxml::debug('Nothing to store');
Line 1301  sub finalize_storage { Line 1210  sub finalize_storage {
     return $result;      return $result;
 }  }
   
 sub needs_lti_passback {  
     my ($courseid,$symb,$map) = @_;  
     if (($env{'request.lti.passbackid'}) && ($env{'request.lti.passbackurl'})) {  
         if ($courseid =~ /^($LONCAPA::match_domain)_($LONCAPA::match_courseid)$/) {  
             my ($cdom,$cnum) = ($1,$2);  
             my %lti = &Apache::lonnet::get_domain_lti($cdom,'provider');  
             if (ref($lti{$env{'request.lti.login'}}) eq 'HASH') {  
                 if ($lti{$env{'request.lti.login'}}{'passback'}) {  
                     my $itemnum = $env{'request.lti.login'};  
                     my ($ltiscope,$ltiuri,$ltisymb) =  
                         &LONCAPA::ltiutils::lti_provider_scope($env{'request.lti.uri'},  
                                                                $cdom,$cnum,1);  
                     my ($passback,$ltimap);  
                     if ($ltiscope eq 'resource') {  
                         if ($ltisymb eq $symb) {  
                             $passback = 1;  
                         }  
                     } elsif ($ltiscope eq 'map') {  
                         if ($ltiuri eq $map) {  
                             $passback = 1;  
                             $ltimap = $map;  
                         }  
                     } elsif ($ltiscope eq 'course') {  
                         if (($env{'request.lti.uri'} eq "/$cdom/$cnum") || ($env{'request.lti.uri'} eq '')) {  
                             $passback = 1;  
                         }  
                     }  
                     return ($passback,$ltiscope,$ltimap,$ltisymb,$itemnum,$lti{$itemnum});  
                 }  
             }  
         }  
     }  
     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,$pbscope);  
                         if ($scope eq 'res') {  
                             if ($deeplink_symb eq $symb) {  
                                 $passback = 1;  
                                 $pbscope = 'resource';  
                             }  
                         } elsif ($scope eq 'map') {  
                             if (&Apache::lonnet::clutter($deeplink_map) eq $map) {  
                                 $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';  
                                 }  
                             }  
                         }  
                         return ($passback,$pbscope,$deeplink_map,$deeplink_symb,$crsdef,$itemnum,$lti_in_use);  
                     }  
                 }  
             }  
         }  
     }  
 }  
   
 =pod  =pod
   
 =item check_correctness_changes()  =item check_correctness_changes()
Line 1533  sub store_aggregates { Line 1344  sub store_aggregates {
     }      }
 }  }
   
 sub access_status_msg {  
     my ($mode,$status,$symb,$target,$ipused,$accessmsg) = @_;  
     my $msg;  
     if ($target eq 'web') {  
         if ($status eq 'UNAVAILABLE') {  
             $msg.='<p class="LC_error">'.&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'</p>';  
         } elsif ($status eq 'NOT_IN_A_SLOT') {  
             $msg.='<p class="LC_warning">'.&mt('You are not currently signed up to work at this time and/or place.').'</p>';  
         } elsif (($status eq 'RESERVABLE') || ($status eq 'RESERVABLE_LATER') ||  
                  ($status eq 'NOTRESERVABLE')) {  
             $msg.='<p class="LC_warning">'.&mt('Access requires reservation to work at specific time/place.').'</p>';  
         } elsif ($status ne 'NOT_YET_VIEWED') {  
             $msg.='<p class="LC_warning">'.&mt('Not open to be viewed').'</p>';  
         }  
         if ($status eq 'CLOSED' || $status eq 'INVALID_ACCESS') {  
             $msg.=&mt('The problem ').$accessmsg;  
         } elsif ($status eq 'UNCHECKEDOUT') {  
             $msg.=&checkout_msg();  
         } elsif ($status eq 'NOT_YET_VIEWED') {  
             $msg.=&firstaccess_msg($accessmsg,$symb);  
         } elsif ($status eq 'NOT_IN_A_SLOT') {  
             $msg.=&Apache::bridgetask::add_request_another_attempt_button("Sign up for time to work");  
         } elsif ($status eq 'RESERVABLE') {  
             $msg.=&mt('Available to make a reservation.').' '.&mt('Reservation window closes [_1].',  
                       &Apache::lonnavmaps::timeToHumanString($accessmsg,'end')).  
                       '<br />'.  
                       &Apache::bridgetask::add_request_another_attempt_button("Sign up for time to work");  
         } elsif ($status eq 'RESERVABLE_LATER') {  
             $msg.=&mt('Window to make a reservation will open [_1].',  
                       &Apache::lonnavmaps::timeToHumanString($accessmsg,'start'));  
         } elsif ($status eq 'NOTRESERVABLE') {  
             $msg.=&mt('Not available to make a reservation.');  
         }  
         $msg.='<br />';  
     } elsif ($target eq 'tex') {  
         my $startminipage = ($env{'form.problem_split'}=~/yes/i)? ''  
                              : '\begin{minipage}{\textwidth}';  
   
         $msg ='\noindent \vskip 1 mm '.  
               $startminipage.'\vskip 0 mm';  
         if ($status eq 'UNAVAILABLE') {  
             $msg.=&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'\vskip 0 mm ';  
         } else {  
             $msg.=&mt('Problem is not open to be viewed. It')." $accessmsg \\vskip 0 mm ";  
         }  
     }  
     return $msg;  
 }  
   
 sub checkin_prompt {  
     my ($target,$slot_name,$slot,$type) = @_;  
     my $result;  
     if ($target eq 'web') {  
         $result = &Apache::bridgetask::proctor_validation_screen($slot);  
     } elsif ($target eq 'grade') {  
         if (!&Apache::bridgetask::proctor_check_auth($slot_name,$slot,$type)) {  
             $result = &mt('An error occurred during check-in');  
         }  
     }  
     return $result;  
 }  
   
 sub selfcheckin_resource {  
     my ($resource_due,$slot_name,$slot,$symb) = @_;  
     if ($slot_name ne '') {  
         my $checked_in =  
             $Apache::lonhomework::history{'resource.0.checkedin'};  
         if ($checked_in eq '') {  
             # unproctored slot access, self checkin  
             my $check = &Apache::bridgetask::check_in('problem',undef,undef,  
                                                       $slot_name);  
             if ($check =~ /^error: /) {  
                 &Apache::lonnet::logthis("Error during self-checkin of problem (symb: $symb) using slot: $slot_name");  
             } else {  
                 $checked_in = $Apache::lonhomework::results{"resource.0.checkedin"};  
             }  
         }  
         if ((ref($slot) eq 'HASH') && ($checked_in ne '')) {  
             if ($slot->{'starttime'} < time()) {  
                 if (!$resource_due) {  
                     $resource_due = $slot->{'endtime'};  
                 } elsif ($slot->{'endtime'} < $resource_due) {  
                     $resource_due = $slot->{'endtime'};  
                 }  
             }  
         }  
     }  
     return $resource_due;  
 }  
   
 sub checkout_msg {  sub checkout_msg {
     my %lt=&Apache::lonlocal::texthash(       my %lt=&Apache::lonlocal::texthash( 
  'resource'=>'The resource needs to be checked out',   'resource'=>'The resource needs to be checked out',
Line 1838  sub start_problem { Line 1559  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 $is_set = &Apache::lonnet::set_first_access($interval[1],$interval[0]);
             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;
             }              }
         }          }
   
           ($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 1851  sub start_problem { Line 1575  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();
         if ($symb ne '') {          if ($symb ne '') {
             my $navmap = Apache::lonnavmaps::navmap->new();              my $navmap = Apache::lonnavmaps::navmap->new();
Line 1865  sub start_problem { Line 1588  sub start_problem {
         }          }
     }      }
   
     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' ||  
         $target eq 'tex') {  
   
         my ($symb)= &Apache::lonnet::whichuser();  
         ($status,$accessmsg,$slot_name,$slot) =  
             &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 1969  sub start_problem { Line 1678  sub start_problem {
     ( $status eq 'INVALID_ACCESS')) {      ( $status eq 'INVALID_ACCESS')) {
     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 ( $target eq "web" ) {
                 $result .= '<p class="LC_error">'.   my $msg;
                            &mt('A problem occurred when trying to start the timer.').'</p>';   if ($status eq 'UNAVAILABLE') {
             }      $msg.='<p class="LC_error">'.&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'</p>';
             $result .= &access_status_msg('problem',$status,$symb,$target,$ipused,$accessmsg);                  } elsif ($status eq 'NOT_IN_A_SLOT') {
                       $msg.='<p class="LC_warning">'.&mt('You are not currently signed up to work at this time and/or place.').'</p>';
                   } elsif (($status eq 'RESERVABLE') || ($status eq 'RESERVABLE_LATER') ||
                            ($status eq 'NOTRESERVABLE')) {
                       $msg.='<p class="LC_warning">'.&mt('Access requires reservation to work at specific time/place.').'</p>';
    } elsif ($status ne 'NOT_YET_VIEWED') {
       $msg.='<p class="LC_warning">'.&mt('Not open to be viewed').'</p>';
                   }
    if ($status eq 'CLOSED' || $status eq 'INVALID_ACCESS') {
       $msg.=&mt('The problem ').$accessmsg;
    } elsif ($status eq 'UNCHECKEDOUT') {
       $msg.=&checkout_msg();
    } 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);
    } elsif ($status eq 'NOT_IN_A_SLOT') {
       $msg.=&Apache::bridgetask::add_request_another_attempt_button("Sign up for time to work");
                   } elsif ($status eq 'RESERVABLE') {
                       $msg.=&mt('Available to make a reservation.').' '.&mt('Reservation window closes [_1].',
                                 &Apache::lonnavmaps::timeToHumanString($accessmsg,'end')).
                             '<br />'.
                             &Apache::bridgetask::add_request_another_attempt_button("Sign up for time to work");
                   } elsif ($status eq 'RESERVABLE_LATER') {
                       $msg.=&mt('Window to make a reservation will open [_1].',
                                 &Apache::lonnavmaps::timeToHumanString($accessmsg,'start'));
                   } elsif ($status eq 'NOTRESERVABLE') {
                       $msg.=&mt('Not available to make a reservation.');  
    }
    $result.=$msg.'<br />';
       } elsif ($target eq 'tex') {
    my $startminipage = ($env{'form.problem_split'}=~/yes/i)? ''
                       : '\begin{minipage}{\textwidth}';
    $result.='\noindent \vskip 1 mm '.
       $startminipage.'\vskip 0 mm';
    if ($status eq 'UNAVAILABLE') {
       $result.=&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'\vskip 0 mm ';
    } else {
       $result.=&mt('Problem is not open to be viewed. It')." $accessmsg \\vskip 0 mm ";
    }
       }
  } 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);
             $result .= &checkin_prompt($target,$slot_name,$slot,'problem');      if ($target eq 'web') {
    $result .= 
       &Apache::bridgetask::proctor_validation_screen($slot);
       } elsif ($target eq 'grade') {
    &Apache::bridgetask::proctor_check_auth($slot_name,$slot,
    'problem');
       }
  } elsif ($target eq 'web') {   } elsif ($target eq 'web') {
     if ($status eq 'CAN_ANSWER') {      if ($status eq 'CAN_ANSWER') {
                 $resource_due = &Apache::lonhomework::due_date(0, $env{'request.symb'});                  $resource_due = &Apache::lonhomework::due_date(0, $env{'request.symb'});
                 if ($slot_name ne '') {                  if ($slot_name ne '') {
                     $resource_due = &selfcheckin_resource($resource_due,$slot_name,$slot,                      my $checked_in =
                                                           $env{'request.symb'});                          $Apache::lonhomework::history{'resource.0.checkedin'};
                       if ($checked_in eq '') {
                           # unproctored slot access, self checkin
                           &Apache::bridgetask::check_in('problem',undef,undef,
                                                         $slot_name);
                           $checked_in =
                               $Apache::lonhomework::results{"resource.0.checkedin"};
                       }
                       if ((ref($slot) eq 'HASH') && ($checked_in ne '')) {
                           if ($slot->{'starttime'} < time()) {
                               if (!$resource_due) {
                                   $resource_due = $slot->{'endtime'};
                               } elsif ($slot->{'endtime'} < $resource_due) {
                                   $resource_due = $slot->{'endtime'};
                               }
                           }
                       }
                 }                  }
                 if ($resource_due) {                  if ($resource_due) {
                     my $time_left = $resource_due - time();                      my $time_left = $resource_due - time();
Line 2026  sub start_problem { Line 1799  sub start_problem {
  } elsif ($target eq 'tex') {   } elsif ($target eq 'tex') {
     $result .= 'INSERTTEXFRONTMATTERHERE';      $result .= 'INSERTTEXFRONTMATTERHERE';
     $result .= &select_metadata_hyphenation();      $result .= &select_metadata_hyphenation();
       
   
  }   }
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
  $result .= $form_tag_start.&problem_edit_header();   $result .= $form_tag_start.&problem_edit_header();
Line 2145  sub end_problem { Line 1920  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 3089  sub end_part { Line 2858  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') {$result.='\end{minipage}';} 
             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') {

Removed from v.1.512.2.24.2.10  
changed lines
  Added in v.1.512.2.25


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