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

version 1.512.2.24.2.6, 2023/09/11 12:08:18 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 600  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 679  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 1095  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 1109  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 1120  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 1217  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 1316  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;  
                         if ($scope eq 'resource') {  
                             if ($deeplink_symb eq $symb) {  
                                 $passback = 1;  
                             }  
                         } elsif ($scope eq 'map') {  
                             if (&Apache::lonnet::clutter($deeplink_map) eq $map) {  
                                 $passback = 1;  
                             }  
                         } elsif ($scope eq 'recurse') {  
 #FIXME check if $deeplink_map contains $map  
                             $passback = 1;  
                         }  
                         return ($passback,$scope,$deeplink_map,$deeplink_symb,$crsdef,$itemnum,$lti_in_use);  
                     }  
                 }  
             }  
         }  
     }  
 }  
   
 =pod  =pod
   
 =item check_correctness_changes()  =item check_correctness_changes()
Line 1753  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 1766  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 1780  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 2126  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 3070  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.6  
changed lines
  Added in v.1.512.2.25


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