version 1.512.2.24.2.2, 2023/02/03 17:09:41
|
version 1.512.2.24.2.5, 2023/09/07 20:47:14
|
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 599 sub page_start {
|
Line 600 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 (($is_task) || ($needs_upload)) { |
if ($env{'request.user_in_effect'}) { |
|
$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 676 sub setup_rndseed {
|
Line 679 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 1092 sub initialize_storage {
|
Line 1095 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 1106 sub finalize_storage {
|
Line 1109 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 1115 sub finalize_storage {
|
Line 1120 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); |
my ($laststore,$checkedparts,@parts,%postcorrect,%record); |
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'; |
} |
} |
my %record = &Apache::lonnet::restore($symb,$courseid,$domain,$name); |
%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 1201 sub finalize_storage {
|
Line 1217 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 1210 sub finalize_storage {
|
Line 1316 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 1565 sub start_problem {
|
Line 1759 sub start_problem {
|
$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 1576 sub start_problem {
|
Line 1766 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 1589 sub start_problem {
|
Line 1780 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 1921 sub end_problem {
|
Line 2126 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']; |