--- loncom/homework/structuretags.pm 2023/04/02 03:16:28 1.574 +++ loncom/homework/structuretags.pm 2023/06/02 01:20:27 1.575 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # definition of tags that give a structure to a document # -# $Id: structuretags.pm,v 1.574 2023/04/02 03:16:28 raeburn Exp $ +# $Id: structuretags.pm,v 1.575 2023/06/02 01:20:27 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -62,6 +62,7 @@ use Apache::lonxml; use Apache::londefdef; use Apache::lonenc(); use Apache::loncommon(); +use Apache::lonnavmaps; use Time::HiRes qw( gettimeofday tv_interval ); use HTML::Entities(); use lib '/home/httpd/lib/perl/'; @@ -1149,7 +1150,8 @@ sub finalize_storage { delete(@Apache::lonhomework::results{@remove}); my ($symb,$courseid,$domain,$name) = &Apache::lonnet::whichuser($given_symb); - my ($passback,$ltiscope,$ltimap,$ltisymb,$ltiref,$total,$possible,$dopassback); + my ($passback,$pbscope,$pbmap,$pbsymb,$pbtype,$crsdef,$ltinum, + $ltiref,$total,$possible,$dopassback); if ($env{'request.state'} eq 'construct' || $symb eq '' || $Apache::lonhomework::type eq 'practice') { @@ -1163,11 +1165,16 @@ sub finalize_storage { if (($env{'user.name'} eq $name) && ($env{'user.domain'} eq $domain) && (!$Apache::lonhomework::scantronmode) && (!defined($env{'form.grade_symb'})) && (!defined($env{'form.grade_courseid'}))) { - if ($env{'request.lti.login'}) { + if (($env{'request.lti.login'}) || ($env{'request.deeplink.login'})) { my ($map)=&Apache::lonnet::decode_symb($symb); $map = &Apache::lonnet::clutter($map); - ($passback,$ltiscope,$ltimap,$ltisymb,$ltiref) = - &needs_lti_passback($courseid,$symb,$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'}) { $laststore = $Apache::lonhomework::history{'version'}.'='. @@ -1264,7 +1271,7 @@ sub finalize_storage { } } } - if (($dopassback) && ($ltiscope eq 'resource') && ($ltisymb eq $symb)) { + if (($dopassback) && ($pbscope eq 'resource') && ($pbsymb eq $symb)) { $total = 0; $possible = 0; my $navmap = Apache::lonnavmaps::navmap->new(); @@ -1305,24 +1312,39 @@ sub finalize_storage { &store_aggregates($symb,$courseid); if ($dopassback) { my $scoreformat = 'decimal'; - if (ref($ltiref) eq 'HASH') { - if ($ltiref->{'scoreformat'} =~ /^(decimal|ratio|percentage)$/) { - $scoreformat = $1; + 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' => $env{'request.lti.passbackid'}, - 'pburl' => $env{'request.lti.passbackurl'}, - 'scope' => $ltiscope, - 'ltimap' => $ltimap, - 'ltisymb' => $ltisymb, + 'pbid' => $pbid, + 'pburl' => $pburl, + 'pbtype' => $pbtype, + 'scope' => $pbscope, + 'pbmap' => $pbmap, + 'pbsymb' => $pbsymb, 'format' => $scoreformat, }; - if ($ltiscope eq 'resource') { + if ($pbscope eq 'resource') { $ltigrade->{'total'} = $total; $ltigrade->{'possible'} = $possible; } @@ -1343,6 +1365,7 @@ sub needs_lti_passback { 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); @@ -1361,7 +1384,7 @@ sub needs_lti_passback { $passback = 1; } } - return ($passback,$ltiscope,$ltimap,$ltisymb,$lti{$env{'request.lti.login'}}); + return ($passback,$ltiscope,$ltimap,$ltisymb,$itemnum,$lti{$itemnum}); } } } @@ -1369,6 +1392,59 @@ sub needs_lti_passback { 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 =item check_correctness_changes()