Diff for /loncom/homework/lonhomework.pm between versions 1.344.2.10.4.8 and 1.344.2.11

version 1.344.2.10.4.8, 2024/02/28 21:03:29 version 1.344.2.11, 2024/07/08 01:13:59
Line 49  use Apache::matchresponse(); Line 49  use Apache::matchresponse();
 use Apache::chemresponse();  use Apache::chemresponse();
 use Apache::functionplotresponse();  use Apache::functionplotresponse();
 use Apache::drawimage();  use Apache::drawimage();
 use Apache::loncapamath();  
 use Apache::loncourseuser();  
 use Apache::grades();  
 use Apache::Constants qw(:common);  use Apache::Constants qw(:common);
 use Apache::loncommon();  use Apache::loncommon();
 use Apache::lonparmset();  
 use Apache::lonnavmaps();  
 use Apache::lonlocal;  use Apache::lonlocal;
 use LONCAPA qw(:DEFAULT :match);  
 use LONCAPA::ltiutils();  
 use Time::HiRes qw( gettimeofday tv_interval );  use Time::HiRes qw( gettimeofday tv_interval );
 use HTML::Entities();  use HTML::Entities();
 use File::Copy();  use File::Copy();
   
 # FIXME - improve commenting  # FIXME - improve commenting
   
 my $registered_cleanup;  
   
 BEGIN {  BEGIN {
     &Apache::lonxml::register_insert();      &Apache::lonxml::register_insert();
Line 163  sub get_target { Line 155  sub get_target {
                 return ('web','answer');                  return ('web','answer');
             } elsif (($env{'form.problemmode'} eq 'saveedit') ||              } elsif (($env{'form.problemmode'} eq 'saveedit') ||
                      ($env{'form.problemmode'} eq 'undo')) {                       ($env{'form.problemmode'} eq 'undo')) {
                 my %editors = &Apache::loncommon::permitted_editors();                  return ('modified','no_output_web','edit');
                 if ($editors{'edit'}) {  
                     return ('modified','no_output_web','edit');  
                 } else {  
                     return ('web');  
                 }  
             } elsif ($env{'form.problemmode'} eq 'edit') {              } elsif ($env{'form.problemmode'} eq 'edit') {
                 my %editors = &Apache::loncommon::permitted_editors();   return ('no_output_web','edit');
                 if ($editors{'edit'}) {  
     return ('no_output_web','edit');  
                 } else {  
                     return ('web');  
                 }  
     } else {      } else {
  return ('web');   return ('web');
     }      }
Line 206  sub proctor_checked_in { Line 188  sub proctor_checked_in {
     if ($type eq 'Task') {      if ($type eq 'Task') {
  my $version=$Apache::lonhomework::history{'resource.0.version'};   my $version=$Apache::lonhomework::history{'resource.0.version'};
  $key ="resource.$version.0.checkedin";   $key ="resource.$version.0.checkedin";
     } elsif (($type eq 'problem') || ($type eq 'tool')) {      } elsif ($type eq 'problem') {
  $key ='resource.0.checkedin';   $key ='resource.0.checkedin';
     }      }
     # backward compatability, used to be username@domain,       # backward compatability, used to be username@domain, 
Line 221  sub proctor_checked_in { Line 203  sub proctor_checked_in {
     return 1;      return 1;
  }   }
     }      }
       
     return 0;      return 0;
 }  }
   
Line 229  sub check_slot_access { Line 212  sub check_slot_access {
   
     # does it pass normal muster      # does it pass normal muster
     my ($status,$datemsg)=&check_access($id,$symb);      my ($status,$datemsg)=&check_access($id,$symb);
       
     my $useslots = &Apache::lonnet::EXT("resource.0.useslots",$symb);      my $useslots = &Apache::lonnet::EXT("resource.0.useslots",$symb);
     if ($useslots ne 'resource' && $useslots ne 'map'       if ($useslots ne 'resource' && $useslots ne 'map' 
  && $useslots ne 'map_map') {   && $useslots ne 'map_map') {
Line 309  sub check_slot_access { Line 292  sub check_slot_access {
      || $Apache::lonhomework::history{"resource.0.solved"} =~ /^correct_/ );       || $Apache::lonhomework::history{"resource.0.solved"} =~ /^correct_/ );
  $checkedin =   $checkedin =
     $Apache::lonhomework::history{"resource.$version.0.checkedin"};      $Apache::lonhomework::history{"resource.$version.0.checkedin"};
     } elsif (($type eq 'problem') || ($type eq 'tool')) {      } elsif ($type eq 'problem') {
         $checkin = 'resource.0.checkedin';          $checkin = 'resource.0.checkedin';
  $checkedin  = $Apache::lonhomework::history{$checkin};   $checkedin  = $Apache::lonhomework::history{$checkin};
     }      }
Line 318  sub check_slot_access { Line 301  sub check_slot_access {
         my %slot=&Apache::lonnet::get_slot($checkinslot);          my %slot=&Apache::lonnet::get_slot($checkinslot);
         $consumed_uniq = $slot{'uniqueperiod'};          $consumed_uniq = $slot{'uniqueperiod'};
     }      }
     if (($type eq 'problem') || ($type eq 'tool')) {      if ($type eq 'problem') {
         if ((ref($partlist) eq 'ARRAY') && (@{$partlist} > 0)) {          if ((ref($partlist) eq 'ARRAY') && (@{$partlist} > 0)) {
             my ($numcorrect,$numgraded) = (0,0);              my ($numcorrect,$numgraded) = (0,0);
             foreach my $part (@{$partlist}) {              foreach my $part (@{$partlist}) {
Line 377  sub check_slot_access { Line 360  sub check_slot_access {
     # However, the problem is not closed, and potentially, another slot might be      # However, the problem is not closed, and potentially, another slot might be
     # used to gain access to it to work on it, until the due date is reached, and the      # used to gain access to it to work on it, until the due date is reached, and the
     # problem then becomes CLOSED.  Therefore return the slotstatus -       # problem then becomes CLOSED.  Therefore return the slotstatus - 
     # (which will be one of: NOT_IN_A_SLOT, RESERVABLE, RESERVABLE_LATER, or NOTRESERVABLE).      # (which will be one of: NOT_IN_A_SLOT, RESERVABLE, RESERVABLE_LATER, or NOTRESERVABLE.
       if (!defined($slot_name) && $type eq 'problem') {
     if (!defined($slot_name) && (($type eq 'problem') || ($type eq 'tool'))) {  
         if ($slotstatus eq 'NOT_IN_A_SLOT') {          if ($slotstatus eq 'NOT_IN_A_SLOT') {
             if (!$num_usable_slots) {              if (!$num_usable_slots) {
                 if ($env{'request.course.id'}) {                  if ($env{'request.course.id'}) {
Line 463  sub check_slot_access { Line 445  sub check_slot_access {
     }      }
   
     if ( $is_correct) {      if ( $is_correct) {
  if (($type eq 'problem') || ($type eq 'tool')) {   if ($type eq 'problem') {
     return ($status);      return ($status);
  }   }
  return ('SHOW_ANSWER');   return ('SHOW_ANSWER');
Line 734  sub setuppermissions { Line 716  sub setuppermissions {
  $env{'request.course.sec'} !~ /^\s*$/) {   $env{'request.course.sec'} !~ /^\s*$/) {
  $viewgrades = &Apache::lonnet::allowed('vgr',$env{'request.course.id'}.   $viewgrades = &Apache::lonnet::allowed('vgr',$env{'request.course.id'}.
                                                '/'.$env{'request.course.sec'});                                                 '/'.$env{'request.course.sec'});
         if ($viewgrades) {  
             $Apache::lonhomework::viewgradessec = $env{'request.course.sec'};  
         }  
     }      }
     $Apache::lonhomework::viewgrades = $viewgrades;      $Apache::lonhomework::viewgrades = $viewgrades;
   
Line 754  sub setuppermissions { Line 733  sub setuppermissions {
  $modifygrades =    $modifygrades = 
     &Apache::lonnet::allowed('mgr',$env{'request.course.id'}.      &Apache::lonnet::allowed('mgr',$env{'request.course.id'}.
      '/'.$env{'request.course.sec'});       '/'.$env{'request.course.sec'});
         if ($modifygrades) {  
             $Apache::lonhomework::modifygradessec = $env{'request.course.sec'};  
         }  
     }      }
     $Apache::lonhomework::modifygrades = $modifygrades;      $Apache::lonhomework::modifygrades = $modifygrades;
   
Line 775  sub setuppermissions { Line 751  sub setuppermissions {
 sub unset_permissions {  sub unset_permissions {
     undef($Apache::lonhomework::queuegrade);      undef($Apache::lonhomework::queuegrade);
     undef($Apache::lonhomework::modifygrades);      undef($Apache::lonhomework::modifygrades);
     undef($Apache::lonhomework::modifygradessec);  
     undef($Apache::lonhomework::viewgrades);      undef($Apache::lonhomework::viewgrades);
     undef($Apache::lonhomework::viewgradessec);  
     undef($Apache::lonhomework::browse);      undef($Apache::lonhomework::browse);
 }  }
   
Line 892  sub analyze_header { Line 866  sub analyze_header {
                                        {'bread_crumbs' => $brcrum,})                                         {'bread_crumbs' => $brcrum,})
        .&Apache::loncommon::head_subbox(         .&Apache::loncommon::head_subbox(
                 &Apache::loncommon::CSTR_pageheader());                  &Apache::loncommon::CSTR_pageheader());
     my %lt = &Apache::lonlocal::texthash(  
                  edit => 'Edit',  
                  editxml => 'EditXML',  
              );  
     $result .=       $result .= 
             '<form name="lonhomework" method="post" action="'.              '<form name="lonhomework" method="post" action="'.
     &HTML::Entities::encode($env{'request.uri'},'<>&"').'">'.      &HTML::Entities::encode($env{'request.uri'},'<>&"').'">'.
             '<input type="hidden" name="problemmode" value="'.              '<input type="hidden" name="problemmode" value="'.
             $env{'form.problemmode'}.'" />'.              $env{'form.problemmode'}.'" />'.
     &Apache::structuretags::remember_problem_state().'      &Apache::structuretags::remember_problem_state().'
             <div class="LC_edit_problem_analyze_header">';              <div class="LC_edit_problem_analyze_header">
      my %editors = &Apache::loncommon::permitted_editors();              <input type="button" name="submitmode" value="'.&mt("EditXML").'" '.
      foreach my $item ('editxml','edit') {              'onclick="javascript:setmode(this.form,'."'editxml'".')" />
          next unless ($editors{$item});              <input type="button" name="submitmode" value="'.&mt('Edit').'" '.
          $result .= '<input type="button" name="submitmode" value="'.$lt{$item}.'" '.              'onclick="javascript:setmode(this.form,'."'edit'".')" />
                     'onclick="javascript:setmode(this.form,'."'$item'".')" />'.              <hr />
                     "\n";  
      }  
      $result .=  
             '<hr />  
             <input type="button" name="submitmode" value="'.&mt("View").'" '.              <input type="button" name="submitmode" value="'.&mt("View").'" '.
             'onclick="javascript:setmode(this.form,'."'view'".')" />              'onclick="javascript:setmode(this.form,'."'view'".')" />
             <hr />              <hr />
Line 1096  sub editxmlmode { Line 1062  sub editxmlmode {
   
  $problem='';   $problem='';
     }      }
   
     if (($env{'form.problemmode'} eq 'saveeditxml') ||      if (($env{'form.problemmode'} eq 'saveeditxml') ||
         ($env{'form.problemmode'} eq 'saveviewxml') ||          ($env{'form.problemmode'} eq 'saveviewxml') || 
         ($env{'form.problemmode'} eq 'undoxml')) {          ($env{'form.problemmode'} eq 'undoxml')) {
  my $error=&handle_save_or_undo($request,\$problem,   my $error=&handle_save_or_undo($request,\$problem,
        \$env{'form.editxmltext'});         \$env{'form.editxmltext'});
Line 1154  sub editxmlmode { Line 1121  sub editxmlmode {
   
     $result .= '<ol class="LC_primary_menu" style="display:inline-block;font-size:90%;vertical-align:middle;">';      $result .= '<ol class="LC_primary_menu" style="display:inline-block;font-size:90%;vertical-align:middle;">';
   
     my $nocodemirror = &Apache::loncommon::nocodemirror();      unless ($env{'environment.nocodemirror'}) {
     unless ($nocodemirror) {  
         # dropdown menus          # dropdown menus
         $result .= Apache::lonmenu::create_submenu("#", "",          $result .= Apache::lonmenu::create_submenu("#", "",
             &mt("Problem Templates"), template_dropdown_datastructure());              &mt("Problem Templates"), template_dropdown_datastructure());
Line 1187  sub editxmlmode { Line 1153  sub editxmlmode {
         '</textarea> <div id="LC_aftertextarea"> </div> </form>';          '</textarea> <div id="LC_aftertextarea"> </div> </form>';
   
     my $resource = $env{'request.ambiguous'};      my $resource = $env{'request.ambiguous'};
     unless ($nocodemirror) {      unless($env{'environment.nocodemirror'}){
         $result .= '<link rel="stylesheet" href="/adm/codemirror/codemirror-combined-xml.css">          $result .= '<link rel="stylesheet" href="/adm/codemirror/codemirror-combined-xml.css">
         <script src="/adm/codemirror/codemirror-compressed-xml.js"></script>          <script src="/adm/codemirror/codemirror-compressed-xml.js"></script>
         <script>          <script>
Line 1234  sub editxmlmode { Line 1200  sub editxmlmode {
 #    Render the page in whatever target desired.  #    Render the page in whatever target desired.
 #  #
 sub renderpage {  sub renderpage {
     my ($request,$file,$targets,$return_string,$donebuttonmsg,$viewasuser,$symb) = @_;      my ($request,$file,$targets,$return_string) = @_;
   
     my @targets = @{$targets || [&get_target()]};      my @targets = @{$targets || [&get_target()]};
     &Apache::lonhomework::showhashsubset(\%env,'form.');      &Apache::lonhomework::showhashsubset(\%env,'form.');
Line 1273  sub renderpage { Line 1239  sub renderpage {
  if ($target eq 'answer') { &showhash(%Apache::lonhomework::history); }   if ($target eq 'answer') { &showhash(%Apache::lonhomework::history); }
  if ($target eq 'web') {&Apache::lonhomework::showhashsubset(\%env,'^form');}   if ($target eq 'web') {&Apache::lonhomework::showhashsubset(\%env,'^form');}
   
         if (($target eq 'web') && ($viewasuser ne '') && ($symb ne '')) {  
             $env{'request.user_in_effect'} = $viewasuser;  
         }  
   
  &Apache::lonxml::debug("Should be parsing now");   &Apache::lonxml::debug("Should be parsing now");
  $result .= &Apache::lonxml::xmlparse($request, $target, $problem,   $result .= &Apache::lonxml::xmlparse($request, $target, $problem,
      &setup_vars($target),%mystyle);       &setup_vars($target),%mystyle);
Line 1289  sub renderpage { Line 1251  sub renderpage {
     if ($target eq 'analyze') {      if ($target eq 'analyze') {
  $result=&Apache::lonnet::hashref2str(\%Apache::lonhomework::analyze);   $result=&Apache::lonnet::hashref2str(\%Apache::lonhomework::analyze);
  undef(%Apache::lonhomework::analyze);   undef(%Apache::lonhomework::analyze);
             } elsif ($target eq 'web') {  
                 if ($donebuttonmsg) {  
                     $result =~ s{</body>}{};  
                     $result.= &Apache::loncommon::confirmwrapper(&Apache::lonhtmlcommon::confirm_success($donebuttonmsg,1))."\n</body>";  
                 }  
     }      }
     #my $td=&tv_interval($t0);      #my $td=&tv_interval($t0);
     #if ( $Apache::lonxml::debug) {      #if ( $Apache::lonxml::debug) {
Line 1302  sub renderpage { Line 1259  sub renderpage {
     #}      #}
 #    $request->print($result);  #    $request->print($result);
     $overall_result.=$result;      $overall_result.=$result;
             if (($target eq 'web') && ($viewasuser ne '') && ($symb ne '')) {  
                 my ($vuname,$vudom) = split(/:/,$viewasuser);  
                 $overall_result .= &Apache::grades::view_as_user($symb,$vuname,$vudom).  
                                    '</body></html>';  
             }  
 #    $request->rflush();  #    $request->rflush();
  }   }
         if (($target eq 'web') && ($viewasuser ne '') && ($symb ne '')) {  
             undef($env{'request.user_in_effect'});  
         }  
  #$request->print(":Result ends");   #$request->print(":Result ends");
  #my $td=&tv_interval($t0);   #my $td=&tv_interval($t0);
     }      }
     if (!$return_string) {      if (!$return_string) {
  &Apache::lonxml::add_messages(\$overall_result);   &Apache::lonxml::add_messages(\$overall_result);
  $request->print($overall_result);   $request->print($overall_result);   
  $request->rflush();   $request->rflush();   
     } else {      } else {
  return $overall_result;   return $overall_result;
     }      }
Line 1329  sub finished_parsing { Line 1278  sub finished_parsing {
     undef($Apache::lonhomework::parsing_a_task);      undef($Apache::lonhomework::parsing_a_task);
 }  }
   
   
 # function extracted from get_template_html  # function extracted from get_template_html
 # returns "key" -> list  # returns "key" -> list
 # key: path of template  # key: path of template
Line 1516  sub update_construct_style { Line 1466  sub update_construct_style {
     }      }
 }  }
   
 #  
 # Sets interval for current user so time left will be zero, either for the entire folder  
 # containing the current resource, or just the resource, depending on value of first item  
 # in interval array retrieved from EXT("resource.0.interval");  
 #  
 sub zero_timer {  
     my ($symb) = @_;  
     my ($hastimeleft,$first_access,$now);  
     my @interval=&Apache::lonnet::EXT("resource.0.interval",$symb);  
     if (@interval > 1) {  
         if ($interval[1] eq 'course') {  
             return ('fail',&mt('Ending of timed events not supported for intervals set course-wide'));  
         } else {  
             my $now = time;  
             my $first_access=&Apache::lonnet::get_first_access($interval[1],$symb);  
             if ($first_access > 0) {  
                 my ($timelimit,$donesuffix) = split(/_/,$interval[0],2);  
                 if ($donesuffix =~ /^done(?:|\:[^\:]+\:)(.*)$/) {  
                     my ($dummy,$proctor,$secret) = split(/_/,$1);  
                     if (($proctor) && ($secret ne '')) {  
                         my $key = $env{'form.LC_interval_done_proctorpass'};  
                         $key =~ s/^\s+//;  
                         $key =~ s/\s+$//;  
                         if ($env{'form.LC_interval_done_proctorpass'} ne $secret) {  
                             return ('fail',  
                                    &mt('Incorrect key entered by proctor'));  
                         }  
                     }  
                     if ($first_access+$timelimit > $now) {  
                         my $done_time = $now - $first_access;  
                         my $snum = 1;  
                         if ($interval[1] eq 'map') {  
                             $snum = 2;  
                         }  
                         my $result =  
                             &Apache::lonparmset::storeparm_by_symb_inner($symb,'0_interval',  
                                                                          $snum,$done_time,  
                                                                          'date_interval',  
                                                                          $env{'user.name'},  
                                                                          $env{'user.domain'});  
                         if ($result eq '') {  
                             # Record action in "User Notes"  
                             &Apache::lonmsg::store_instructor_comment(  
                                 'Pressed Done button for symb:<br />'.$symb,  
                                 $env{'user.name'}, $env{'user.domain'});  
                             return ('ok');  
                         } else {  
                             return ('fail',&mt('Error ending timed event: [_1]',$result));  
                         }  
                     } else {  
                         return ('fail',&mt('Timed event already ended'));  
                     }  
                 } else {  
                     return ('fail',&mt('Timed event can not be ended before the time limit'));  
                 }  
             } else {  
                 return ('fail',&mt('Timer not yet started for this timed event'));  
             }  
         }  
     } else {  
         return ('fail',&mt('No timer in use'));  
     }  
     return();  
 }  
   
 sub handler {  sub handler {
     #my $t0 = [&gettimeofday()];      #my $t0 = [&gettimeofday()];
Line 1592  sub handler { Line 1478  sub handler {
     my $file=&Apache::lonnet::filelocation("",$request->uri);      my $file=&Apache::lonnet::filelocation("",$request->uri);
   
     #check if we know where we are      #check if we know where we are
     if ($env{'request.course.fn'} && !&Apache::lonnet::symbread('','',1,1)) {      if ($env{'request.course.fn'} && !&Apache::lonnet::symbread('','',1,1)) { 
  # if we are browsing we might not be able to know where we are   # if we are browsing we might not be able to know where we are
  if ($Apache::lonhomework::browse ne 'F' &&   if ($Apache::lonhomework::browse ne 'F' && 
     $env{'request.state'} ne "construct") {      $env{'request.state'} ne "construct") {
     #should know where we are, so ask      #should know where we are, so ask
     &unset_permissions();      &unset_permissions();
Line 1606  sub handler { Line 1492  sub handler {
  &unset_permissions();   &unset_permissions();
  return OK;   return OK;
     }      }
   
     &Apache::lonxml::debug("Permissions:$Apache::lonhomework::browse:$Apache::lonhomework::viewgrades:$Apache::lonhomework::modifygrades:$Apache::lonhomework::queuegrade");      &Apache::lonxml::debug("Permissions:$Apache::lonhomework::browse:$Apache::lonhomework::viewgrades:$Apache::lonhomework::modifygrades:$Apache::lonhomework::queuegrade");
     &Apache::lonxml::debug("Problem Mode ".$env{'form.problemmode'});      &Apache::lonxml::debug("Problem Mode ".$env{'form.problemmode'});
     my ($symb) = &Apache::lonnet::whichuser();      my ($symb) = &Apache::lonnet::whichuser();
Line 1623  sub handler { Line 1508  sub handler {
                      ($env{'form.problemmode'} eq 'saveeditxml') ||                       ($env{'form.problemmode'} eq 'saveeditxml') ||
                      ($env{'form.problemmode'} eq 'saveviewxml') ||                       ($env{'form.problemmode'} eq 'saveviewxml') ||
                      ($env{'form.problemmode'} eq 'undoxml')) {                       ($env{'form.problemmode'} eq 'undoxml')) {
                 my %editors = &Apache::loncommon::permitted_editors();   &editxmlmode($request,$file);
                 if (($editors{'xml'}) || ($env{'form.problemmode'} eq 'saveviewxml') || ($env{'form.problemmode'} eq 'undoxml')) {  
     &editxmlmode($request,$file);  
                 } else {  
                     &update_construct_style();  
                     &renderpage($request,$file);  
                 }  
     } elsif ($env{'form.problemmode'} eq 'calcanswers') {      } elsif ($env{'form.problemmode'} eq 'calcanswers') {
  &analyze($request,$file);   &analyze($request,$file);
     } else {      } else {
Line 1643  sub handler { Line 1522  sub handler {
     &newproblem($request);      &newproblem($request);
  }   }
     } else {      } else {
         # Set the event timer to zero if the "done button" was clicked.  The button is  
         # part of the doneButton form created in lonmenu.pm  
         my ($donebuttonresult,$donemsg,$viewasuser);  
         if ($symb && $env{'form.LC_interval_done'} eq 'true') {  
             ($donebuttonresult,$donemsg) = &zero_timer($symb);  
             undef($env{'form.LC_interval_done'});  
             undef($env{'form.LC_interval_done_proctorpass'});  
         }  
         if (($env{'form.LC_viewas'} ne '') && $symb && $env{'request.course.id'} &&  
             ($Apache::lonhomework::viewgrades || $Apache::lonhomework::modifygrades)) {  
             if ($env{'form.LC_viewas'} =~ /^($match_username):($match_domain)$/) {  
                 my ($possuname,$possudom) = ($1,$2);  
                 my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};  
                 my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};  
                 my ($canview,$posssec);  
                 if ($env{'request.course.sec'} ne '') {  
                     if ($Apache::lonhomework::modifygradessec eq $env{'request.course.sec'}) {  
                         $canview = 'section';  
                         $posssec = $env{'request.course.sec'};  
                     } elsif ($Apache::lonhomework::viewgradessec eq $env{'request.course.sec'}) {  
                         $canview = 'section';  
                         $posssec = $env{'request.course.sec'};  
                     }  
                 }  
                 my $crstype = &Apache::loncommon::course_type();  
                 if (&Apache::loncourseuser::is_course_user($possudom,$possuname,$cdom,$cnum,  
                                                            $canview,$crstype,$posssec)) {  
                     $viewasuser = $possuname.':'.$possudom;  
                 }  
             }  
             undef($env{'form.LC_viewas'});  
         }  
  # just render the page normally outside of construction space   # just render the page normally outside of construction space
  &Apache::lonxml::debug("not construct");   &Apache::lonxml::debug("not construct");
         undef(@Apache::lonhomework::ltipassback);   &renderpage($request,$file);
  &renderpage($request,$file,undef,undef,$donemsg,$viewasuser,$symb);  
         if (@Apache::lonhomework::ltipassback) {  
             unless ($registered_cleanup) {  
                 my $handlers = $request->get_handlers('PerlCleanupHandler');  
                 $request->set_handlers('PerlCleanupHandler' =>  
                                        [\&do_ltipassback,@{$handlers}]);  
             }  
         }  
     }      }
     #my $td=&tv_interval($t0);      #my $td=&tv_interval($t0);
     #&Apache::lonxml::debug("Spent $td seconds processing");      #&Apache::lonxml::debug("Spent $td seconds processing");
Line 1837  sub helpmenu_datastructure { Line 1676  sub helpmenu_datastructure {
                     ['Other_Symbols.hlp', &mt('Other Symbols'), 500, 600],                      ['Other_Symbols.hlp', &mt('Other Symbols'), 500, 600],
                     ['Authoring_Output_Tags.hlp', &mt('Output Tags'), 800, 600],                      ['Authoring_Output_Tags.hlp', &mt('Output Tags'), 800, 600],
                     ['Authoring_Multilingual_Problems.hlp', &mt('Languages'), 800, 600],                      ['Authoring_Multilingual_Problems.hlp', &mt('Languages'), 800, 600],
                     ['loncapa.html', &mt('Reference'), 800, 600],  
                    ];                     ];
   
     my $help_structure = [];      my $help_structure = [];
Line 1871  sub convert_for_js { Line 1709  sub convert_for_js {
     return $return;      return $return;
 }  }
   
 sub do_ltipassback {  
     if (@Apache::lonhomework::ltipassback) {  
         foreach my $item (@Apache::lonhomework::ltipassback) {  
             if (ref($item) eq 'HASH') {  
                 if ((ref($item->{'lti'}) eq 'HASH') && ($item->{'cid'} =~ /^($match_domain)_($match_courseid)$/)) {  
                     my ($cdom,$cnum) = ($1,$2);  
                     my $msgformat = $item->{'lti'}->{'passbackformat'};  
                     my $sigmethod = 'HMAC-SHA1';  
                     my $ltinum = $item->{'ltinum'};  
                     my $id = $item->{'pbid'};  
                     my $url = $item->{'pburl'};  
                     my $type = $item->{'pbtype'};  
                     my $scope = $item->{'scope'};  
                     my $map = $item->{'pbmap'};  
                     my $symb = $item->{'pbsymb'};  
                     my $uname = $item->{'uname'};  
                     my $udom = $item->{'udom'};  
                     my $keynum = $item->{'lti'}->{'cipher'};  
                     my $crsdef = $item->{'crsdef'};  
                     my $scoretype = $item->{'format'};  
                     my ($total,$possible);  
                     if ($scope eq 'resource') {  
                         $total = $item->{'total'};  
                         $possible = $item->{'possible'};  
                     } elsif (($scope eq 'map') || ($scope eq 'nonrec')) {  
                         ($total,$possible) = &get_lti_score($uname,$udom,$map,$scope);  
                     } elsif ($scope eq 'course') {  
                         ($total,$possible) = &get_lti_score($uname,$udom);  
                     }  
                     if (($id ne '') && ($url ne '') && ($possible)) {  
                         &LONCAPA::ltiutils::send_grade($cdom,$cnum,$crsdef,$type,$ltinum,$keynum,$id,$url,$scoretype,$sigmethod,$msgformat,$total,$possible);  
                     }  
                 }  
             }  
         }  
         undef(@Apache::lonhomework::ltipassback);  
     }  
 }  
   
 sub get_lti_score {  
     my ($uname,$udom,$mapurl,$scope) = @_;  
     my $navmap = Apache::lonnavmaps::navmap->new($uname,$udom);  
     if (ref($navmap)) {  
         my $iterator;  
         if ($mapurl ne '') {  
             my $map = $navmap->getResourceByUrl($mapurl);  
             my $firstres = $map->map_start();  
             my $finishres = $map->map_finish();  
             my $recursive = 1;  
             if ($scope eq 'nonrec') {  
                 $recursive = 0;  
             }  
             $iterator = $navmap->getIterator($firstres,$finishres,undef,$recursive);  
         } else {  
             $iterator = $navmap->getIterator(undef,undef,undef,1);  
         }  
         if (ref($iterator)) {  
             my $depth = 1;  
             my $total = 0;  
             my $possible = 0;  
             $iterator->next(); # ignore first BEGIN_MAP  
             my $curRes = $iterator->next();  
             while ( $depth > 0 ) {  
                 if ($curRes == $iterator->BEGIN_MAP()) {$depth++;}  
                 if ($curRes == $iterator->END_MAP()) { $depth--; }  
                 if (ref($curRes) && $curRes->is_gradable() && !$curRes->randomout) {  
                     my $parts = $curRes->parts();  
                     foreach my $part (@{$parts}) {  
                         next if ($curRes->solved($part) eq 'excused');  
                         $total += $curRes->weight($part) * $curRes->awarded($part);  
                         $possible += $curRes->weight($part);  
                     }  
                 }  
                 $curRes = $iterator->next();  
             }  
             if ($total > $possible) {  
                 $total = $possible;  
             }  
             return ($total,$possible);  
         }  
     }  
     return;  
 }  
   
 1;  1;
 __END__  __END__

Removed from v.1.344.2.10.4.8  
changed lines
  Added in v.1.344.2.11


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