[LON-CAPA-cvs] cvs: loncom /homework grades.pm lonhomework.pm

raeburn raeburn at source.lon-capa.org
Mon Dec 9 17:22:57 EST 2024


raeburn		Mon Dec  9 22:22:57 2024 EDT

  Modified files:              
    /loncom/homework	lonhomework.pm grades.pm 
  Log:
  - Package variable; $registered_cleanup 
    - set to 0 when handler() is called
    - set to 1 if routine to be called in PerlCleanupHandler phase added.
    - @Apache::grades::ltipassback used to store calls added by  grades.pm
    - @Apache::grades::lonhomework used to store calls added by lonhomework.pm
    - Most code in &do_ltipassback() in lonhomework.pm moved to &run_passback()
      to facilitate reuse.
  
  
-------------- next part --------------
Index: loncom/homework/lonhomework.pm
diff -u loncom/homework/lonhomework.pm:1.386 loncom/homework/lonhomework.pm:1.387
--- loncom/homework/lonhomework.pm:1.386	Mon Dec  9 02:46:01 2024
+++ loncom/homework/lonhomework.pm	Mon Dec  9 22:22:57 2024
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # The LON-CAPA Homework handler
 #
-# $Id: lonhomework.pm,v 1.386 2024/12/09 02:46:01 raeburn Exp $
+# $Id: lonhomework.pm,v 1.387 2024/12/09 22:22:57 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -1692,6 +1692,10 @@
     $env{'request.uri'}=$request->uri;
     &setuppermissions();
 
+# -------------------------------------- Flag and buffer for registered cleanup
+    $registered_cleanup=0;
+    undef(@Apache::lonhomework::ltipassback);
+
     my $file=&Apache::lonnet::filelocation("",$request->uri);
 
     #check if we know where we are
@@ -1780,13 +1784,13 @@
         }
 	# just render the page normally outside of construction space
 	&Apache::lonxml::debug("not construct");
-        undef(@Apache::lonhomework::ltipassback);
 	&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}]);
+                $registered_cleanup=1;
             }
         }
     }
@@ -1981,133 +1985,139 @@
         my $lonhost = $Apache::lonnet::perlvar{'lonHostID'};
         my $ip = &Apache::lonnet::get_host_ip($lonhost);
         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 $pbscope = $item->{'pbscope'};
-                    my $map = $item->{'pbmap'};
-                    my $symb = $item->{'pbsymb'};
-                    my $uname = $item->{'uname'};
-                    my $udom = $item->{'udom'};
-                    my $uhome = $item->{'uhome'};
-                    my $keynum = $item->{'lti'}->{'cipher'};
-                    my $crsdef = $item->{'crsdef'};
-                    my $scoretype = $item->{'format'};
-                    my $scope = $item->{'scope'};
-                    my $clientip = $item->{'clientip'};
-                    my ($total,$possible,%total_by_symb,%possible_by_symb);
-                    if ((exists($item->{'total_s'})) && (ref($item->{'total_s'}) eq 'HASH')) {
-                        %total_by_symb = %{$item->{'total_s'}};
-                        if ($pbscope eq 'resource') {
-                            if (exists($total_by_symb{$symb})) {
-                                $total = $total_by_symb{$symb};
-                            } else {
-                                $total = $item->{'total'};
-                            }
-                        }
-                    } elsif ($pbscope eq 'resource') {
+            &Apache::lonhomework::run_passback($item,$lonhost,$ip);
+        }
+        undef(@Apache::lonhomework::ltipassback);
+    }
+}
+
+sub run_passback {
+    my ($item,$lonhost,$ip) = @_;
+    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 $pbscope = $item->{'pbscope'};
+            my $map = $item->{'pbmap'};
+            my $symb = $item->{'pbsymb'};
+            my $uname = $item->{'uname'};
+            my $udom = $item->{'udom'};
+            my $uhome = $item->{'uhome'};
+            my $keynum = $item->{'lti'}->{'cipher'};
+            my $crsdef = $item->{'crsdef'};
+            my $scoretype = $item->{'format'};
+            my $scope = $item->{'scope'};
+            my $clientip = $item->{'clientip'};
+            my ($total,$possible,%total_by_symb,%possible_by_symb);
+            if ((exists($item->{'total_s'})) && (ref($item->{'total_s'}) eq 'HASH')) {
+                %total_by_symb = %{$item->{'total_s'}};
+                if ($pbscope eq 'resource') {
+                    if (exists($total_by_symb{$symb})) {
+                        $total = $total_by_symb{$symb};
+                    } else {
                         $total = $item->{'total'};
                     }
-                    if ((exists($item->{'possible_s'})) && (ref($item->{'possible_s'}) eq 'HASH')) {
-                        %possible_by_symb = %{$item->{'possible_s'}};
-                        if ($pbscope eq 'resource') {
-                            if (exists($possible_by_symb{$symb})) {
-                                $possible = $possible_by_symb{$symb};
-                            } else {
-                                $possible = $item->{'possible'};
-                            }
-                        }
-                    } elsif ($pbscope eq 'resource') {
+                }
+            } elsif ($pbscope eq 'resource') {
+                $total = $item->{'total'};
+            }
+            if ((exists($item->{'possible_s'})) && (ref($item->{'possible_s'}) eq 'HASH')) {
+                %possible_by_symb = %{$item->{'possible_s'}};
+                if ($pbscope eq 'resource') {
+                    if (exists($possible_by_symb{$symb})) {
+                        $possible = $possible_by_symb{$symb};
+                    } else {
                         $possible = $item->{'possible'};
                     }
-                    if (($pbscope eq 'map') || ($pbscope eq 'nonrec')) {
-                        if ((keys(%total_by_symb)) && (keys(%possible_by_symb))) {
-                            ($total,$possible) =
-                                &get_lti_score($uname,$udom,$map,$pbscope,\%total_by_symb,\%possible_by_symb);
-                        } else {
-                            ($total,$possible) = &get_lti_score($uname,$udom,$map,$pbscope);
+                }
+            } elsif ($pbscope eq 'resource') {
+                $possible = $item->{'possible'};
+            }
+            if (($pbscope eq 'map') || ($pbscope eq 'nonrec')) {
+                if ((keys(%total_by_symb)) && (keys(%possible_by_symb))) {
+                    ($total,$possible) =
+                    &get_lti_score($uname,$udom,$map,$pbscope,\%total_by_symb,\%possible_by_symb);
+                } else {
+                   ($total,$possible) = &get_lti_score($uname,$udom,$map,$pbscope);
+                }
+            } elsif ($pbscope eq 'course') {
+                ($total,$possible) = &get_lti_score($uname,$udom);
+            }
+            $item->{'total'} = $total;
+            $item->{'possible'} = $possible;
+            if (($id ne '') && ($url ne '') && ($possible)) {
+                my ($sent,$score,$code,$result) =
+                    &LONCAPA::ltiutils::send_grade($cdom,$cnum,$crsdef,$type,$ltinum,$keynum,$id,
+                                                   $url,$scoretype,$sigmethod,$msgformat,$total,$possible);
+                $item->{'score'} = $score;
+                my ($linkprotector,$linkuri,$no_passback,$appname);
+                if ($item->{'linkprot'}) {
+                    ($linkprotector,$linkuri) = split(/:/,$item->{'linkprot'});
+                }
+                if ($sent) {
+                    if ($code == 200) {
+                        if ($item->{'linkprot'}) {
+                            my $skey = join("\0",($linkuri,$linkprotector,$scope));
+                            my $namespace = $cdom.'_'.$cnum.'_lp_passback';
+                            my $store = {
+                                          'score' => $score,
+                                          'ip' => $ip,
+                                          'host' => $Apache::lonnet::perlvar{'lonHostID'},
+                                          'protector' => $linkprotector,
+                                          'deeplink' => $linkuri,
+                                          'scope' => $scope,
+                                          'url' => $url,
+                                          'id' => $id,
+                                          'clientip' => $clientip,
+                                          'whodoneit' => $env{'user.name'}.':'.$env{'user.domain'},
+                                        };
+                            my $value='';
+                            foreach my $key (keys(%{$store})) {
+                                $value.=&escape($key).'='.&Apache::lonnet::freeze_escape($store->{$key}).'&';
+                            }
+                            $value=~s/\&$//;
+                            &Apache::lonnet::courselog(&escape($linkuri).':'.$uname.':'.$udom.':EXPORT:'.$value);
+                            &Apache::lonnet::cstore({'score' => $score},$skey,$namespace,$udom,$uname,'',$ip,1);
                         }
-                    } elsif ($pbscope eq 'course') {
-                        ($total,$possible) = &get_lti_score($uname,$udom);
-                    }
-                    $item->{'total'} = $total;
-                    $item->{'possible'} = $possible;
-                    if (($id ne '') && ($url ne '') && ($possible)) {
-                        my ($sent,$score,$code,$result) =
-                            &LONCAPA::ltiutils::send_grade($cdom,$cnum,$crsdef,$type,$ltinum,$keynum,$id,
-                                                           $url,$scoretype,$sigmethod,$msgformat,$total,$possible);
-                        $item->{'score'} = $score;
-                        my ($linkprotector,$linkuri,$no_passback,$appname);
+                    } else {
                         if ($item->{'linkprot'}) {
-                            ($linkprotector,$linkuri) = split(/:/,$item->{'linkprot'});
+                           $no_passback = "Passback response was $code ($result).";
                         }
-                        if ($sent) {
-                            if ($code == 200) {
-                                if ($item->{'linkprot'}) {
-                                    my $skey = join("\0",($linkuri,$linkprotector,$scope));
-                                    my $namespace = $cdom.'_'.$cnum.'_lp_passback';
-                                    my $store = {
-                                                 'score' => $score,
-                                                 'ip' => $ip,
-                                                 'host' => $Apache::lonnet::perlvar{'lonHostID'},
-                                                 'protector' => $linkprotector,
-                                                 'deeplink' => $linkuri,
-                                                 'scope' => $scope,
-                                                 'url' => $url,
-                                                 'id' => $id,
-                                                 'clientip' => $clientip,
-                                                 'whodoneit' => $env{'user.name'}.':'.$env{'user.domain'},
-                                                };
-                                    my $value='';
-                                    foreach my $key (keys(%{$store})) {
-                                        $value.=&escape($key).'='.&Apache::lonnet::freeze_escape($store->{$key}).'&';
-                                    }
-                                    $value=~s/\&$//;
-                                    &Apache::lonnet::courselog(&escape($linkuri).':'.$uname.':'.$udom.':EXPORT:'.$value);
-                                    &Apache::lonnet::cstore({'score' => $score},$skey,$namespace,$udom,$uname,'',$ip,1);
-                                }
-                            } else {
-                                if ($item->{'linkprot'}) {
-                                    $no_passback = "Passback response was $code ($result).";
-                                }
-                            }
-                        } else {
-                            if ($item->{'linkprot'}) {
-                                $no_passback = 'No passback of scores.';
+                    }
+                } else {
+                    if ($item->{'linkprot'}) {
+                        $no_passback = 'No passback of scores.';
+                    }
+                }
+                if ($no_passback) {
+                    if ($item->{'linkprot'}) {
+                        my ($ltinum,$ltitype) = ($linkprotector =~ /^(\d+)(c|d)$/);
+                        if ($ltitype eq 'c') {
+                            my %lti = &Apache::lonnet::get_course_lti($cnum,$cdom,'provider');
+                            if (ref($lti{$ltinum}) eq 'HASH') {
+                                $appname = $lti{$ltinum}{'name'};
                             }
-                        }
-                        if ($no_passback) {
-                            if ($item->{'linkprot'}) {
-                                my ($ltinum,$ltitype) = ($linkprotector =~ /^(\d+)(c|d)$/);
-                                if ($ltitype eq 'c') {
-                                    my %lti = &Apache::lonnet::get_course_lti($cnum,$cdom,'provider');
-                                    if (ref($lti{$ltinum}) eq 'HASH') {
-                                        $appname = $lti{$ltinum}{'name'};
-                                    }
-                                } elsif ($ltitype eq 'd') {
-                                    my %lti = &Apache::lonnet::get_domain_lti($cdom,'linkprot');
-                                    if (ref($lti{$ltinum}) eq 'HASH') {
-                                        $appname = $lti{$ltinum}{'name'};
-                                    }
-                                }
-                                $no_passback .= " LTI launcher $linkprotector ($appname) for $linkuri (${cdom}_${cnum})";
-                                &Apache::lonnet::logthis($no_passback." for $uname:$udom");
-                                &Apache::lonnet::log($udom,$uname,$uhome,"$no_passback score=$score total=$total poss=$possible");
-                                &Apache::lonnet::put('linkprot_passback_pending',$item,$cdom,$cnum);
+                        } elsif ($ltitype eq 'd') {
+                            my %lti = &Apache::lonnet::get_domain_lti($cdom,'linkprot');
+                            if (ref($lti{$ltinum}) eq 'HASH') {
+                                $appname = $lti{$ltinum}{'name'};
                             }
                         }
+                        $no_passback .= " LTI launcher $linkprotector ($appname) for $linkuri (${cdom}_${cnum})";
+                        &Apache::lonnet::logthis($no_passback." for $uname:$udom");
+                        &Apache::lonnet::log($udom,$uname,$uhome,"$no_passback score=$score total=$total poss=$possible");
+                        &Apache::lonnet::put('linkprot_passback_pending',$item,$cdom,$cnum);
                     }
                 }
             }
         }
-        undef(@Apache::lonhomework::ltipassback);
     }
+    return;
 }
 
 sub get_lti_score {
Index: loncom/homework/grades.pm
diff -u loncom/homework/grades.pm:1.800 loncom/homework/grades.pm:1.801
--- loncom/homework/grades.pm:1.800	Mon Dec  9 22:01:01 2024
+++ loncom/homework/grades.pm	Mon Dec  9 22:22:57 2024
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # The LON-CAPA Grading handler
 #
-# $Id: grades.pm,v 1.800 2024/12/09 22:01:01 raeburn Exp $
+# $Id: grades.pm,v 1.801 2024/12/09 22:22:57 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -1840,7 +1840,7 @@
                                         'total_s'    => \%total_by_symb,
                                         'possible_s' => \%possible_by_symb,
                         };
-                        push(@Apache::lonhomework::ltipassback,$ltigrade);
+                        push(@Apache::grades::ltipassback,$ltigrade);
                         next;
                     }
                     my ($total,$possible);
@@ -4251,7 +4251,7 @@
                             if ($message ne '') {
 			        my ($baseurl,$showsymb) = 
 				    &get_feedurl_and_symb($symb,$collaborator,
-					   	          $udom);
+						          $udom);
 			        if ($env{'form.withgrades'.$ctr}) {
 				    $messagetail = " for <a href=\"".
                                         $baseurl."?symb=$showsymb\">$restitle</a>";
@@ -6179,7 +6179,7 @@
 	      $request->print('.');
 # Remove from grading queue
               &Apache::bridgetask::remove_from_queue('gradingqueue',$symb,$cdom,$cnum,
-                                             $domain,$username);
+						     $domain,$username);
               $countdone++;
               if ($passback) {
                   my @parts_in_upload;
@@ -6952,7 +6952,6 @@
     $request->print($hidemsg.$grademsg.$studentTable);
 
     if (@updates) {
-        undef(@Apache::lonhomework::ltipassback);
         my (@allsymbs,$mapsymb, at recurseup,%parentmapsymbs,%possmappb,%possrespb);
         @allsymbs = @updates;
         if (ref($map)) {
@@ -7012,11 +7011,12 @@
             my @symbs = keys(%uniqsymbs);
             &process_passbacks('updatebypage',\@symbs,$cdom,$cnum,$udom,$uname,\%weights,
                                \%awardeds,\%excuseds,\%needpb,\%skip_passback,\%pbsave,\%pbids);
-            if (@Apache::lonhomework::ltipassback) {
+            if (@Apache::grades::ltipassback) {
                 unless ($registered_cleanup) {
                     my $handlers = $request->get_handlers('PerlCleanupHandler');
                     $request->set_handlers('PerlCleanupHandler' =>
-                                           [\&Apache::lonhomework::do_ltipassback,@{$handlers}]);
+                                           [\&Apache::grades::make_passback,@{$handlers}]);
+                    $registered_cleanup=1;
                 }
             }
         }
@@ -7024,6 +7024,17 @@
     return '';
 }
 
+sub make_passback {
+    if (@Apache::grades::ltipassback) {
+        my $lonhost = $Apache::lonnet::perlvar{'lonHostID'};
+        my $ip = &Apache::lonnet::get_host_ip($lonhost);
+        foreach my $item (@Apache::grades::ltipassback) {
+            &Apache::lonhomework::run_passback($item,$lonhost,$ip);
+        }
+        undef(@Apache::grades::ltipassback);
+    }
+}
+
 #-------- end of section for handling grading by page/sequence ---------
 #
 #-------------------------------------------------------------------
@@ -12808,6 +12819,10 @@
 	&Apache::lonnet::logthis("grades got multiple commands ".join(':', at commands));
     }
 
+# -------------------------------------- Flag and buffer for registered cleanup
+    $registered_cleanup=0;
+    undef(@Apache::grades::ltipassback);
+
 # see what the symb is
 
     my $symb=$env{'form.symb'};


More information about the LON-CAPA-cvs mailing list