[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