version 1.569, 2019/11/06 16:20:06
|
version 1.575, 2023/06/02 01:20:27
|
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 lib '/home/httpd/lib/perl/'; |
use lib '/home/httpd/lib/perl/'; |
use LONCAPA; |
use LONCAPA; |
|
|
Line 624 sub page_start {
|
Line 626 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 667 sub get_resource_name {
|
Line 671 sub get_resource_name {
|
} |
} |
|
|
sub setup_rndseed { |
sub setup_rndseed { |
my ($safeeval,$target,$probpartlist)=@_; |
my ($safeeval,$target,$probpartlist,$prevparttype)=@_; |
my ($symb)=&Apache::lonnet::whichuser(); |
my ($symb)=&Apache::lonnet::whichuser(); |
my ($questiontype,$set_safespace,$rndseed,$numtries,$reqtries); |
my ($questiontype,$set_safespace,$rndseed,$numtries,$reqtries); |
if ($target eq 'analyze') { |
if ($target eq 'analyze') { |
Line 784 sub setup_rndseed {
|
Line 788 sub setup_rndseed {
|
if ($target eq 'grade') { |
if ($target eq 'grade') { |
$Apache::lonhomework::rawrndseed = $rndseed; |
$Apache::lonhomework::rawrndseed = $rndseed; |
} |
} |
|
} elsif ($prevparttype eq 'randomizetry') { |
|
if ($env{'form.0.rndseed'} ne '') { |
|
$set_safespace = 1; |
|
$rndseed = $env{'form.0.rndseed'}; |
|
} |
} |
} |
if ($set_safespace) { |
if ($set_safespace) { |
if ($safeeval) { |
if ($safeeval) { |
&Apache::lonxml::debug("Setting rndseed to $rndseed"); |
&Apache::lonxml::debug("Setting rndseed to $rndseed"); |
&Apache::run::run('$external::randomseed="'.$rndseed.'";',$safeeval); |
&Apache::run::run('$external::randomseed="'.$rndseed.'";',$safeeval); |
my $prevparttype; |
|
if (@Apache::inputtags::partlist > 1) { |
|
$prevparttype = &Apache::lonnet::EXT("resource.$Apache::inputtags::partlist[-2].type"); |
|
} |
|
if (($Apache::lonhomework::type eq 'randomizetry') || ($prevparttype eq 'randomizetry')) { |
if (($Apache::lonhomework::type eq 'randomizetry') || ($prevparttype eq 'randomizetry')) { |
&Apache::lonxml::debug("Setting randomizetrypart to $Apache::inputtags::part"); |
&Apache::lonxml::debug("Setting randomizetrypart to $Apache::inputtags::part"); |
&Apache::run::run('$external::randomizetrypart="'.$Apache::inputtags::part.'";',$safeeval); |
&Apache::run::run('$external::randomizetrypart="'.$Apache::inputtags::part.'";',$safeeval); |
Line 1145 sub finalize_storage {
|
Line 1150 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,$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' |
if ($env{'request.state'} eq 'construct' |
|| $symb eq '' |
|| $symb eq '' |
|| $Apache::lonhomework::type eq 'practice') { |
|| $Apache::lonhomework::type eq 'practice') { |
Line 1159 sub finalize_storage {
|
Line 1165 sub finalize_storage {
|
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'}) { |
if (($env{'request.lti.login'}) || ($env{'request.deeplink.login'})) { |
my ($map)=&Apache::lonnet::decode_symb($symb); |
my ($map)=&Apache::lonnet::decode_symb($symb); |
$map = &Apache::lonnet::clutter($map); |
$map = &Apache::lonnet::clutter($map); |
($passback,$ltiscope,$ltimap,$ltisymb,$ltiref) = |
if ($env{'request.lti.login'}) { |
&needs_lti_passback($courseid,$symb,$map); |
($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'}.'='. |
Line 1260 sub finalize_storage {
|
Line 1271 sub finalize_storage {
|
} |
} |
} |
} |
} |
} |
if (($dopassback) && ($ltiscope eq 'resource') && ($ltisymb eq $symb)) { |
if (($dopassback) && ($pbscope eq 'resource') && ($pbsymb eq $symb)) { |
$total = 0; |
$total = 0; |
$possible = 0; |
$possible = 0; |
my $navmap = Apache::lonnavmaps::navmap->new(); |
my $navmap = Apache::lonnavmaps::navmap->new(); |
Line 1301 sub finalize_storage {
|
Line 1312 sub finalize_storage {
|
&store_aggregates($symb,$courseid); |
&store_aggregates($symb,$courseid); |
if ($dopassback) { |
if ($dopassback) { |
my $scoreformat = 'decimal'; |
my $scoreformat = 'decimal'; |
if (ref($ltiref) eq 'HASH') { |
if (($env{'request.lti.login'}) || ($env{'request.deeplink.login'})) { |
if ($ltiref->{'scoreformat'} =~ /^(decimal|ratio|percentage)$/) { |
if (ref($ltiref) eq 'HASH') { |
$scoreformat = $1; |
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 = { |
my $ltigrade = { |
|
'ltinum' => $ltinum, |
'lti' => $ltiref, |
'lti' => $ltiref, |
|
'crsdef' => $crsdef, |
'cid' => $courseid, |
'cid' => $courseid, |
'uname' => $env{'user.name'}, |
'uname' => $env{'user.name'}, |
'udom' => $env{'user.domain'}, |
'udom' => $env{'user.domain'}, |
'pbid' => $env{'request.lti.passbackid'}, |
'pbid' => $pbid, |
'pburl' => $env{'request.lti.passbackurl'}, |
'pburl' => $pburl, |
'scope' => $ltiscope, |
'pbtype' => $pbtype, |
'ltimap' => $ltimap, |
'scope' => $pbscope, |
'ltisymb' => $ltisymb, |
'pbmap' => $pbmap, |
|
'pbsymb' => $pbsymb, |
'format' => $scoreformat, |
'format' => $scoreformat, |
}; |
}; |
if ($ltiscope eq 'resource') { |
if ($pbscope eq 'resource') { |
$ltigrade->{'total'} = $total; |
$ltigrade->{'total'} = $total; |
$ltigrade->{'possible'} = $possible; |
$ltigrade->{'possible'} = $possible; |
} |
} |
Line 1339 sub needs_lti_passback {
|
Line 1365 sub needs_lti_passback {
|
my %lti = &Apache::lonnet::get_domain_lti($cdom,'provider'); |
my %lti = &Apache::lonnet::get_domain_lti($cdom,'provider'); |
if (ref($lti{$env{'request.lti.login'}}) eq 'HASH') { |
if (ref($lti{$env{'request.lti.login'}}) eq 'HASH') { |
if ($lti{$env{'request.lti.login'}}{'passback'}) { |
if ($lti{$env{'request.lti.login'}}{'passback'}) { |
|
my $itemnum = $env{'request.lti.login'}; |
my ($ltiscope,$ltiuri,$ltisymb) = |
my ($ltiscope,$ltiuri,$ltisymb) = |
&LONCAPA::ltiutils::lti_provider_scope($env{'request.lti.uri'}, |
&LONCAPA::ltiutils::lti_provider_scope($env{'request.lti.uri'}, |
$cdom,$cnum,1); |
$cdom,$cnum,1); |
Line 1357 sub needs_lti_passback {
|
Line 1384 sub needs_lti_passback {
|
$passback = 1; |
$passback = 1; |
} |
} |
} |
} |
return ($passback,$ltiscope,$ltimap,$ltisymb,$lti{$env{'request.lti.login'}}); |
return ($passback,$ltiscope,$ltimap,$ltisymb,$itemnum,$lti{$itemnum}); |
} |
} |
} |
} |
} |
} |
Line 1365 sub needs_lti_passback {
|
Line 1392 sub needs_lti_passback {
|
return; |
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 1645 sub firstaccess_msg {
|
Line 1725 sub firstaccess_msg {
|
my $uri = &Apache::lonenc::check_encrypt($env{'request.uri'}); |
my $uri = &Apache::lonenc::check_encrypt($env{'request.uri'}); |
my $buttontext = &mt('Show Resource'); |
my $buttontext = &mt('Show Resource'); |
my $timertext = &mt('Start Timer?'); |
my $timertext = &mt('Start Timer?'); |
|
my $shownsymb = &HTML::Entities::encode(&Apache::lonenc::check_encrypt($symb),'\'"<>&'); |
$result .= (<<ENDCHECKOUT); |
$result .= (<<ENDCHECKOUT); |
<form name="markaccess" method="post" action="$uri"> |
<form name="markaccess" method="post" action="$uri"> |
<input type="hidden" name="markaccess" value="yes" /> |
<input type="hidden" name="markaccess" value="yes" /> |
|
<input type="hidden" name="symb" value="$shownsymb" /> |
<input type="button" name="accessbutton" value="$buttontext" onclick="javascript:if (confirm('$timertext')) { document.markaccess.submit(); }" /> |
<input type="button" name="accessbutton" value="$buttontext" onclick="javascript:if (confirm('$timertext')) { document.markaccess.submit(); }" /> |
</form> |
</form> |
ENDCHECKOUT |
ENDCHECKOUT |
Line 1841 sub start_problem {
|
Line 1923 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' || |
if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' || |
$target eq 'tex') { |
$target eq 'tex') { |
|
|
Line 1908 sub start_problem {
|
Line 1995 sub start_problem {
|
$form_tag_start.=&practice_problem_header(); |
$form_tag_start.=&practice_problem_header(); |
} |
} |
$form_tag_start.='<hr />'; |
$form_tag_start.='<hr />'; |
} |
} |
if (($env{'request.state'} ne "construct") && |
if (($env{'request.state'} ne "construct") && |
($Apache::lonhomework::type eq 'randomizetry') && |
($Apache::lonhomework::type eq 'randomizetry') && |
($status eq 'CAN_ANSWER') && |
($status eq 'CAN_ANSWER') && |
Line 2125 sub end_problem {
|
Line 2212 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']; |
Line 2958 sub start_part {
|
Line 3051 sub start_part {
|
if (($target eq 'grade') && &Apache::response::submitted()) { |
if (($target eq 'grade') && &Apache::response::submitted()) { |
$Apache::lonhomework::results{"resource.$id.rndseed"}=$rndseed; |
$Apache::lonhomework::results{"resource.$id.rndseed"}=$rndseed; |
} |
} |
|
} elsif (@Apache::inputtags::partlist > 1) { |
|
my $prevparttype = &Apache::lonnet::EXT("resource.$Apache::inputtags::partlist[-2].type"); |
|
if ($prevparttype eq 'randomizetry') { |
|
my $rndseed=&setup_rndseed($safeeval,$target,'',$prevparttype); |
|
if (($target eq 'grade') && &Apache::response::submitted()) { |
|
$Apache::lonhomework::results{"resource.$id.rndseed"}=$rndseed; |
|
} |
|
} |
} elsif (($target eq 'grade') && &Apache::response::submitted()) { |
} elsif (($target eq 'grade') && &Apache::response::submitted()) { |
$Apache::lonhomework::results{"resource.$id.rndseed"}=$Apache::lonhomework::rawrndseed; |
$Apache::lonhomework::results{"resource.$id.rndseed"}=$Apache::lonhomework::rawrndseed; |
} |
} |
Line 3095 sub end_part {
|
Line 3196 sub end_part {
|
$gradestatus=''; |
$gradestatus=''; |
} |
} |
$result.=$gradestatus; |
$result.=$gradestatus; |
if ($$tagstack[-2] eq 'td' and $target eq 'tex') {$result.='\end{minipage}';} |
if ($$tagstack[-2] eq 'td' and $target eq 'tex') { |
|
if (not $env{'form.problem_split'}=~/yes/) { |
|
$result.='\end{minipage}'; |
|
} |
|
} |
} elsif ($target eq 'edit') { |
} elsif ($target eq 'edit') { |
$result.=&Apache::edit::end_table(); |
$result.=&Apache::edit::end_table(); |
} elsif ($target eq 'modified') { |
} elsif ($target eq 'modified') { |
Line 3394 sub randomizetry_part_header {
|
Line 3499 sub randomizetry_part_header {
|
my ($header,$text); |
my ($header,$text); |
if ($reqtries eq 'none') { |
if ($reqtries eq 'none') { |
$header = &mt('No Question Variation'); |
$header = &mt('No Question Variation'); |
$text = &mt('For this question there will no new variation after a try.'); |
$text = &mt('For this question there will be no new variation after a try.'); |
} elsif ($reqtries > 1) { |
} elsif ($reqtries > 1) { |
$header = &mt('New Question Variation After Every [quant,_1,Try,Tries]',$reqtries); |
$header = &mt('New Question Variation After Every [quant,_1,Try,Tries]',$reqtries); |
if (($problemstatus eq 'no') || |
if (($problemstatus eq 'no') || |