version 1.551, 2016/12/09 20:12:09
|
version 1.563, 2019/08/11 12:27:11
|
Line 67 use lib '/home/httpd/lib/perl/';
|
Line 67 use lib '/home/httpd/lib/perl/';
|
use LONCAPA; |
use LONCAPA; |
|
|
BEGIN { |
BEGIN { |
&Apache::lonxml::register('Apache::structuretags',('block','languageblock','translated','instructorcomment','while','randomlist','problem','library','web','tex','part','preduedate','postanswerdate','solved','notsolved','problemtype','startpartmarker','startouttext','endpartmarker','endouttext','simpleeditbutton','definetag')); |
&Apache::lonxml::register('Apache::structuretags',('block','languageblock','translated','instructorcomment','while','randomlist','problem','library','web','print','tex','part','preduedate','postanswerdate','solved','notsolved','problemtype','startpartmarker','startouttext','endpartmarker','endouttext','simpleeditbutton','definetag')); |
} |
} |
|
|
|
|
Line 192 sub end_web {
|
Line 192 sub end_web {
|
return ''; |
return ''; |
} |
} |
|
|
|
sub start_print { |
|
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; |
|
if ($target ne 'edit' && $target ne 'modified') { |
|
if ($target ne 'tex') { |
|
my $skip = &Apache::lonxml::get_all_text("/print",$parser,$style); |
|
&Apache::lonxml::debug("skipping ahead :$skip: $$parser[-1]"); |
|
} |
|
} elsif ($target eq "edit") { |
|
my $bodytext = &Apache::lonxml::get_all_text_unbalanced("/print",$parser); |
|
my $result = &Apache::edit::tag_start($target,$token); |
|
$result .= &Apache::edit::editfield($token->[1],$bodytext,'',80,1); |
|
return $result; |
|
} elsif ($target eq "modified") { |
|
return $token->[4].&Apache::edit::modifiedfield("/print",$parser); |
|
} |
|
return ''; |
|
} |
|
|
|
sub end_print { |
|
return ''; |
|
} |
|
|
sub start_tex { |
sub start_tex { |
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; |
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; |
my $result=''; |
my $result=''; |
Line 344 var postsubmit = '$postsubmit';
|
Line 366 var postsubmit = '$postsubmit';
|
submithandled = 1; |
submithandled = 1; |
\$( "#msg_"+buttonId ).css({"display": "inline","background-color": "#87cefa", |
\$( "#msg_"+buttonId ).css({"display": "inline","background-color": "#87cefa", |
"color": "black","padding": "2px"}) ; |
"color": "black","padding": "2px"}) ; |
if (( \$(this.form).id == "LC_page" ) && (\$('input[name="all_submit"]').length )) { |
if (( \$(this.form).attr("id") == "LC_page" ) && (\$('input[name="all_submit"]').length )) { |
if (buttonId != "all_submit") { |
if (buttonId != "all_submit") { |
\$( ".LC_status_"+buttonId ).hide(); |
\$( ".LC_status_"+buttonId ).hide(); |
if (( "#"+buttonId+"_pressed" ).length) { |
} |
\$( "#"+buttonId+"_pressed" ).val( "1" ); |
if (( "#"+buttonId+"_pressed" ).length) { |
} |
\$( "#"+buttonId+"_pressed" ).val( "1" ); |
} |
} |
} else { |
} else { |
\$( ".LC_status_"+buttonId ).hide(); |
\$( ".LC_status_"+buttonId ).hide(); |
Line 362 var postsubmit = '$postsubmit';
|
Line 384 var postsubmit = '$postsubmit';
|
if (timeout > 0) { |
if (timeout > 0) { |
setTimeout(function(){ |
setTimeout(function(){ |
\$( "#msg_"+buttonId ).css({"display": "none"}); |
\$( "#msg_"+buttonId ).css({"display": "none"}); |
if (( \$(this.form).id == "LC_page" ) && (\$('input[name="all_submit"]').length )) { |
if (( \$(this.form).attr("id") == "LC_page" ) && (\$('input[name="all_submit"]').length )) { |
if (buttonId != "all_submit") { |
if (( "#"+buttonId+"_pressed" ).length) { |
if (( "#"+buttonId+"_pressed" ).length) { |
\$( "#"+buttonId+"_pressed" ).val( "" ); |
\$( "#"+buttonId+"_pressed" ).val( "" ); |
|
} |
|
} |
} |
} |
} |
\$( ".LC_hwk_submit" ).prop( "disabled", false); |
\$( ".LC_hwk_submit" ).prop( "disabled", false); |
Line 392 sub setmode_javascript {
|
Line 412 sub setmode_javascript {
|
<script type="text/javascript"> |
<script type="text/javascript"> |
// <![CDATA[ |
// <![CDATA[ |
function setmode(form,probmode) { |
function setmode(form,probmode) { |
|
var initial = form.problemmode.value; |
form.problemmode.value = probmode; |
form.problemmode.value = probmode; |
form.submit(); |
form.submit(); |
|
form.problemmode.value = initial; |
} |
} |
// ]]> |
// ]]> |
</script> |
</script> |
Line 654 sub setup_rndseed {
|
Line 676 sub setup_rndseed {
|
unless (defined($questiontype)) { |
unless (defined($questiontype)) { |
$questiontype = $Apache::lonhomework::type; |
$questiontype = $Apache::lonhomework::type; |
} |
} |
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'))) { |
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, |
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, |
['rndseed']); |
['rndseed']); |
$rndseed=$env{'form.rndseed'}; |
$rndseed=$env{'form.rndseed'}; |
Line 666 sub setup_rndseed {
|
Line 689 sub setup_rndseed {
|
if (!$rndseed) { |
if (!$rndseed) { |
$rndseed=time; |
$rndseed=time; |
} |
} |
$env{'form.rndseed'}=$rndseed; |
unless ($env{'form.code_for_randomlist'}) { |
|
$env{'form.rndseed'}=$rndseed; |
|
} |
} |
} |
if (($env{'request.state'} eq "construct") && |
if (($env{'request.state'} eq "construct") && |
($Apache::lonhomework::type eq 'randomizetry')) { |
($Apache::lonhomework::type eq 'randomizetry')) { |
Line 694 sub setup_rndseed {
|
Line 719 sub setup_rndseed {
|
$rndseed=join(':',&Apache::lonnet::digest($rndseed)); |
$rndseed=join(':',&Apache::lonnet::digest($rndseed)); |
} |
} |
} |
} |
if ($Apache::lonhomework::history{'resource.CODE'}) { |
if (($env{'form.code_for_randomlist'}) && ($target eq 'analyze')) { |
|
$env{'form.CODE'} = $env{'form.code_for_randomlist'}; |
|
$rndseed=&Apache::lonnet::rndseed(); |
|
undef($env{'form.CODE'}); |
|
} elsif ($Apache::lonhomework::history{'resource.CODE'}) { |
$rndseed=&Apache::lonnet::rndseed(); |
$rndseed=&Apache::lonnet::rndseed(); |
} |
} |
$set_safespace = 1; |
$set_safespace = 1; |
Line 1086 sub finalize_storage {
|
Line 1115 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); |
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 1095 sub finalize_storage {
|
Line 1125 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'}) { |
|
my ($map)=&Apache::lonnet::decode_symb($symb); |
|
$map = &Apache::lonnet::clutter($map); |
|
($passback,$ltiscope,$ltimap,$ltisymb,$ltiref) = |
|
&needs_lti_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 1181 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) && ($ltiscope eq 'resource') && ($ltisymb 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 (ref($ltiref) eq 'HASH') { |
|
if ($ltiref->{'scoreformat'} =~ /^(decimal|ratio|percentage)$/) { |
|
$scoreformat = $1; |
|
} |
|
} |
|
my $ltigrade = { |
|
'lti' => $ltiref, |
|
'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, |
|
'format' => $scoreformat, |
|
}; |
|
if ($ltiscope 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 1190 sub finalize_storage {
|
Line 1301 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 ($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,$lti{$env{'request.lti.login'}}); |
|
} |
|
} |
|
} |
|
} |
|
return; |
|
} |
|
|
=pod |
=pod |
|
|
=item check_correctness_changes() |
=item check_correctness_changes() |
Line 1324 sub store_aggregates {
|
Line 1469 sub store_aggregates {
|
} |
} |
} |
} |
|
|
|
sub access_status_msg { |
|
my ($mode,$status,$symb,$target,$ipused,$accessmsg) = @_; |
|
my $msg; |
|
if ($target eq 'web') { |
|
if ($status eq 'UNAVAILABLE') { |
|
$msg.='<p class="LC_error">'.&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'</p>'; |
|
} elsif ($status eq 'NOT_IN_A_SLOT') { |
|
$msg.='<p class="LC_warning">'.&mt('You are not currently signed up to work at this time and/or place.').'</p>'; |
|
} elsif (($status eq 'RESERVABLE') || ($status eq 'RESERVABLE_LATER') || |
|
($status eq 'NOTRESERVABLE')) { |
|
$msg.='<p class="LC_warning">'.&mt('Access requires reservation to work at specific time/place.').'</p>'; |
|
} elsif ($status ne 'NOT_YET_VIEWED') { |
|
$msg.='<p class="LC_warning">'.&mt('Not open to be viewed').'</p>'; |
|
} |
|
if ($status eq 'CLOSED' || $status eq 'INVALID_ACCESS') { |
|
$msg.=&mt('The problem ').$accessmsg; |
|
} elsif ($status eq 'UNCHECKEDOUT') { |
|
$msg.=&checkout_msg(); |
|
} elsif ($status eq 'NOT_YET_VIEWED') { |
|
$msg.=&firstaccess_msg($accessmsg,$symb); |
|
} elsif ($status eq 'NOT_IN_A_SLOT') { |
|
$msg.=&Apache::bridgetask::add_request_another_attempt_button("Sign up for time to work"); |
|
} elsif ($status eq 'RESERVABLE') { |
|
$msg.=&mt('Available to make a reservation.').' '.&mt('Reservation window closes [_1].', |
|
&Apache::lonnavmaps::timeToHumanString($accessmsg,'end')). |
|
'<br />'. |
|
&Apache::bridgetask::add_request_another_attempt_button("Sign up for time to work"); |
|
} elsif ($status eq 'RESERVABLE_LATER') { |
|
$msg.=&mt('Window to make a reservation will open [_1].', |
|
&Apache::lonnavmaps::timeToHumanString($accessmsg,'start')); |
|
} elsif ($status eq 'NOTRESERVABLE') { |
|
$msg.=&mt('Not available to make a reservation.'); |
|
} elsif ($status eq 'NEED_DIFFERENT_IP') { |
|
if ($ipused) { |
|
$msg.=&mt('You must use the same computer ([_1]) you used when you first accessed this resource using your time/place-based reservation.',"IP: $ipused"); |
|
} else { |
|
$msg.=&mt('Each student must use a different computer to access this resource at this time and/or place.').'<br />'. |
|
&mt('Somebody else has already used this particular computer for that purpose.'); |
|
} |
|
} |
|
$msg.='<br />'; |
|
} elsif ($target eq 'tex') { |
|
my $startminipage = ($env{'form.problem_split'}=~/yes/i)? '' |
|
: '\begin{minipage}{\textwidth}'; |
|
|
|
$msg ='\noindent \vskip 1 mm '. |
|
$startminipage.'\vskip 0 mm'; |
|
if ($status eq 'UNAVAILABLE') { |
|
$msg.=&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'\vskip 0 mm '; |
|
} else { |
|
$msg.=&mt('Problem is not open to be viewed. It')." $accessmsg \\vskip 0 mm "; |
|
} |
|
} |
|
return $msg; |
|
} |
|
|
|
sub checkin_prompt { |
|
my ($target,$slot_name,$slot,$type) = @_; |
|
my $result; |
|
if ($target eq 'web') { |
|
$result = &Apache::bridgetask::proctor_validation_screen($slot); |
|
} elsif ($target eq 'grade') { |
|
if (!&Apache::bridgetask::proctor_check_auth($slot_name,$slot,$type)) { |
|
$result = &mt('An error occurred during check-in'); |
|
} |
|
} |
|
return $result; |
|
} |
|
|
|
sub selfcheckin_resource { |
|
my ($resource_due,$slot_name,$slot,$symb) = @_; |
|
if ($slot_name ne '') { |
|
my $checked_in = |
|
$Apache::lonhomework::history{'resource.0.checkedin'}; |
|
if ($checked_in eq '') { |
|
# unproctored slot access, self checkin |
|
my $needsiptied; |
|
if (ref($slot)) { |
|
$needsiptied = $slot->{'iptied'}; |
|
} |
|
my $check = &Apache::bridgetask::check_in('problem',undef,undef, |
|
$slot_name,$needsiptied); |
|
if ($check =~ /^error: /) { |
|
&Apache::lonnet::logthis("Error during self-checkin of problem (symb: $symb) using slot: $slot_name"); |
|
} else { |
|
$checked_in = $Apache::lonhomework::results{"resource.0.checkedin"}; |
|
} |
|
} |
|
if ((ref($slot) eq 'HASH') && ($checked_in ne '')) { |
|
if ($slot->{'starttime'} < time()) { |
|
if (!$resource_due) { |
|
$resource_due = $slot->{'endtime'}; |
|
} elsif ($slot->{'endtime'} < $resource_due) { |
|
$resource_due = $slot->{'endtime'}; |
|
} |
|
} |
|
} |
|
} |
|
return $resource_due; |
|
} |
|
|
sub checkout_msg { |
sub checkout_msg { |
my %lt=&Apache::lonlocal::texthash( |
my %lt=&Apache::lonlocal::texthash( |
'resource'=>'The resource needs to be checked out', |
'resource'=>'The resource needs to be checked out', |
Line 1530 sub start_problem {
|
Line 1776 sub start_problem {
|
my $ipused; |
my $ipused; |
|
|
my $name= &get_resource_name($parstack,$safeeval); |
my $name= &get_resource_name($parstack,$safeeval); |
my ($result,$form_tag_start,$slot_name,$slot,$probpartlist); |
my ($result,$form_tag_start,$slot_name,$slot,$probpartlist,$firstaccres); |
|
|
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') { |
if ($env{'form.markaccess'}) { |
if ($env{'form.markaccess'}) { |
my @interval=&Apache::lonnet::EXT("resource.0.interval"); |
my @interval=&Apache::lonnet::EXT("resource.0.interval"); |
my ($timelimit) = split(/_/,$interval[0]); |
my ($timelimit) = split(/_/,$interval[0]); |
&Apache::lonnet::set_first_access($interval[1],$timelimit); |
my $is_set = &Apache::lonnet::set_first_access($interval[1],$timelimit); |
|
unless (($is_set eq 'ok') || ($is_set eq 'already_set')) { |
|
$firstaccres = $is_set; |
|
} |
} |
} |
|
|
($status,$accessmsg,$slot_name,$slot,$ipused) = |
|
&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 1550 sub start_problem {
|
Line 1795 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(); |
my $navmap = Apache::lonnavmaps::navmap->new(); |
my $navmap = Apache::lonnavmaps::navmap->new(); |
if (ref($navmap)) { |
if (ref($navmap)) { |
Line 1561 sub start_problem {
|
Line 1807 sub start_problem {
|
} |
} |
} |
} |
|
|
|
if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' || |
|
$target eq 'tex') { |
|
|
|
my ($symb)= &Apache::lonnet::whichuser(); |
|
($status,$accessmsg,$slot_name,$slot,$ipused) = |
|
&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 1638 sub start_problem {
|
Line 1893 sub start_problem {
|
( $status eq 'NEED_DIFFERENT_IP')) { |
( $status eq 'NEED_DIFFERENT_IP')) { |
my $bodytext=&Apache::lonxml::get_all_text("/problem",$parser, |
my $bodytext=&Apache::lonxml::get_all_text("/problem",$parser, |
$style); |
$style); |
if ( $target eq "web" ) { |
if (($status eq 'NOT_YET_VIEWED') && ($firstaccres)) { |
my $msg; |
$result .= '<p class="LC_error">'. |
if ($status eq 'UNAVAILABLE') { |
&mt('A problem occurred when trying to start the timer.').'</p>'; |
$msg.='<p class="LC_error">'.&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'</p>'; |
} |
} elsif ($status eq 'NOT_IN_A_SLOT') { |
$result .= &access_status_msg('problem',$status,$symb,$target,$ipused,$accessmsg); |
$msg.='<p class="LC_warning">'.&mt('You are not currently signed up to work at this time and/or place.').'</p>'; |
|
} elsif (($status eq 'RESERVABLE') || ($status eq 'RESERVABLE_LATER') || |
|
($status eq 'NOTRESERVABLE')) { |
|
$msg.='<p class="LC_warning">'.&mt('Access requires reservation to work at specific time/place.').'</p>'; |
|
} elsif ($status ne 'NOT_YET_VIEWED') { |
|
$msg.='<p class="LC_warning">'.&mt('Not open to be viewed').'</p>'; |
|
} |
|
if ($status eq 'CLOSED' || $status eq 'INVALID_ACCESS') { |
|
$msg.=&mt('The problem ').$accessmsg; |
|
} elsif ($status eq 'UNCHECKEDOUT') { |
|
$msg.=&checkout_msg(); |
|
} elsif ($status eq 'NOT_YET_VIEWED') { |
|
$msg.=&firstaccess_msg($accessmsg,$symb); |
|
} elsif ($status eq 'NOT_IN_A_SLOT') { |
|
$msg.=&Apache::bridgetask::add_request_another_attempt_button("Sign up for time to work"); |
|
} elsif ($status eq 'RESERVABLE') { |
|
$msg.=&mt('Available to make a reservation.').' '.&mt('Reservation window closes [_1].', |
|
&Apache::lonnavmaps::timeToHumanString($accessmsg,'end')). |
|
'<br />'. |
|
&Apache::bridgetask::add_request_another_attempt_button("Sign up for time to work"); |
|
} elsif ($status eq 'RESERVABLE_LATER') { |
|
$msg.=&mt('Window to make a reservation will open [_1].', |
|
&Apache::lonnavmaps::timeToHumanString($accessmsg,'start')); |
|
} elsif ($status eq 'NOTRESERVABLE') { |
|
$msg.=&mt('Not available to make a reservation.'); |
|
} elsif ($status eq 'NEED_DIFFERENT_IP') { |
|
if ($ipused) { |
|
$msg.=&mt('You must use the same computer ([_1]) you used when you first accessed this resource using your time/place-based reservation.',"IP: $ipused"); |
|
} else { |
|
$msg.=&mt('Each student must use a different computer to access this resource at this time and/or place.').'<br />'. |
|
&mt('Somebody else has already used this particular computer for that purpose.'); |
|
} |
|
} |
|
$result.=$msg.'<br />'; |
|
} elsif ($target eq 'tex') { |
|
my $startminipage = ($env{'form.problem_split'}=~/yes/i)? '' |
|
: '\begin{minipage}{\textwidth}'; |
|
$result.='\noindent \vskip 1 mm '. |
|
$startminipage.'\vskip 0 mm'; |
|
if ($status eq 'UNAVAILABLE') { |
|
$result.=&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'\vskip 0 mm '; |
|
} else { |
|
$result.=&mt('Problem is not open to be viewed. It')." $accessmsg \\vskip 0 mm "; |
|
} |
|
} |
|
} elsif ($status eq 'NEEDS_CHECKIN') { |
} elsif ($status eq 'NEEDS_CHECKIN') { |
my $bodytext=&Apache::lonxml::get_all_text("/problem",$parser, |
my $bodytext=&Apache::lonxml::get_all_text("/problem",$parser, |
$style); |
$style); |
if ($target eq 'web') { |
$result .= &checkin_prompt($target,$slot_name,$slot,'problem'); |
$result .= |
|
&Apache::bridgetask::proctor_validation_screen($slot); |
|
} elsif ($target eq 'grade') { |
|
my $checkinresult = &Apache::bridgetask::proctor_check_auth($slot_name,$slot, |
|
'problem'); |
|
if ($checkinresult = /^error:/) { |
|
$result .= 'error'; |
|
} |
|
} |
|
} elsif ($target eq 'web') { |
} elsif ($target eq 'web') { |
if ($status eq 'CAN_ANSWER') { |
if ($status eq 'CAN_ANSWER') { |
$resource_due = &Apache::lonhomework::due_date(0, $env{'request.symb'}); |
$resource_due = &Apache::lonhomework::due_date(0, $env{'request.symb'}); |
if ($slot_name ne '') { |
if ($slot_name ne '') { |
my $checked_in = |
$resource_due = &selfcheckin_resource($resource_due,$slot_name,$slot, |
$Apache::lonhomework::history{'resource.0.checkedin'}; |
$env{'request.symb'}); |
if ($checked_in eq '') { |
|
# unproctored slot access, self checkin |
|
my $needsiptied; |
|
if (ref($slot)) { |
|
$needsiptied = $slot->{'iptied'}; |
|
} |
|
my $check = &Apache::bridgetask::check_in('problem',undef,undef, |
|
$slot_name,$needsiptied); |
|
if ($check =~ /^error: /) { |
|
&Apache::lonnet::logthis("Error during self-checkin of problem (symb: $env{'request.symb'}) using slot: $slot_name"); |
|
} else { |
|
$checked_in = |
|
$Apache::lonhomework::results{"resource.0.checkedin"}; |
|
} |
|
} |
|
if ((ref($slot) eq 'HASH') && ($checked_in ne '')) { |
|
if ($slot->{'starttime'} < time()) { |
|
if (!$resource_due) { |
|
$resource_due = $slot->{'endtime'}; |
|
} elsif ($slot->{'endtime'} < $resource_due) { |
|
$resource_due = $slot->{'endtime'}; |
|
} |
|
} |
|
} |
|
} |
} |
if ($resource_due) { |
if ($resource_due) { |
my $time_left = $resource_due - time(); |
my $time_left = $resource_due - time(); |
Line 1774 sub start_problem {
|
Line 1951 sub start_problem {
|
} elsif ($target eq 'tex') { |
} elsif ($target eq 'tex') { |
$result .= 'INSERTTEXFRONTMATTERHERE'; |
$result .= 'INSERTTEXFRONTMATTERHERE'; |
$result .= &select_metadata_hyphenation(); |
$result .= &select_metadata_hyphenation(); |
|
|
|
|
} |
} |
} elsif ($target eq 'edit') { |
} elsif ($target eq 'edit') { |
$result .= $form_tag_start.&problem_edit_header(); |
$result .= $form_tag_start.&problem_edit_header(); |
Line 2003 sub end_problem {
|
Line 2178 sub end_problem {
|
@Apache::inputtags::response=(); |
@Apache::inputtags::response=(); |
$result=&Apache::response::mandatory_part_meta; |
$result=&Apache::response::mandatory_part_meta; |
} |
} |
$result.=&Apache::response::meta_part_order(); |
$result.=&Apache::response::meta_part_order('problem'); |
$result.=&Apache::response::meta_response_order(); |
$result.=&Apache::response::meta_response_order(); |
} elsif ($target eq 'edit') { |
} elsif ($target eq 'edit') { |
&Apache::lonxml::debug("in end_problem with $target, edit"); |
&Apache::lonxml::debug("in end_problem with $target, edit"); |
Line 2080 sub end_library {
|
Line 2255 sub end_library {
|
&& ($#$tagstack eq 0 && $$tagstack[0] eq 'library') |
&& ($#$tagstack eq 0 && $$tagstack[0] eq 'library') |
&& $env{'request.state'} eq "construct") { |
&& $env{'request.state'} eq "construct") { |
$result.='</form>'.&Apache::loncommon::end_page({'discussion' => 1}); |
$result.='</form>'.&Apache::loncommon::end_page({'discussion' => 1}); |
|
} elsif ($target eq 'meta') { |
|
$result.=&Apache::response::meta_part_order('library'); |
|
$result.=&Apache::response::meta_response_order(); |
} |
} |
if ( $#$tagstack eq 0 && $$tagstack[0] eq 'library') { |
if ( $#$tagstack eq 0 && $$tagstack[0] eq 'library') { |
&reset_problem_globals('library'); |
&reset_problem_globals('library'); |
Line 2562 sub start_randomlist {
|
Line 2740 sub start_randomlist {
|
} |
} |
if (@randomlist) { |
if (@randomlist) { |
my @idx_arr = (0 .. $#randomlist); |
my @idx_arr = (0 .. $#randomlist); |
&Apache::structuretags::shuffle(\@idx_arr); |
if ($env{'form.code_for_randomlist'}) { |
|
&Apache::structuretags::shuffle(\@idx_arr,$target); |
|
undef($env{'form.code_for_randomlist'}); |
|
} else { |
|
&Apache::structuretags::shuffle(\@idx_arr); |
|
} |
my $bodytext = ''; |
my $bodytext = ''; |
my $show=$#randomlist; |
my $show=$#randomlist; |
my $showarg=&Apache::lonxml::get_param('show',$parstack,$safeeval); |
my $showarg=&Apache::lonxml::get_param('show',$parstack,$safeeval); |
Line 2601 sub start_randomlist {
|
Line 2784 sub start_randomlist {
|
} |
} |
|
|
sub shuffle { |
sub shuffle { |
my $a=shift; |
my ($a,$target) = @_; |
my $i; |
my $i; |
if (ref($a) eq 'ARRAY' && @$a) { |
if (ref($a) eq 'ARRAY' && @$a) { |
&Apache::response::pushrandomnumber(); |
&Apache::response::pushrandomnumber(undef,$target); |
for($i=@$a;--$i;) { |
for($i=@$a;--$i;) { |
my $j=int(&Math::Random::random_uniform() * ($i+1)); |
my $j=int(&Math::Random::random_uniform() * ($i+1)); |
next if $i == $j; |
next if $i == $j; |
Line 3105 sub end_simpleeditbutton {
|
Line 3288 sub end_simpleeditbutton {
|
} |
} |
|
|
sub practice_problem_header { |
sub practice_problem_header { |
return '<span class="LC_info"><h3>'.&mt('Practice Problem').'</h3></span>'. |
return '<h3 class="LC_info">'.&mt('Practice Problem').'</h3>'. |
'<span class="LC_info">'.&mt('Submissions are not permanently recorded'). |
'<span class="LC_info">'.&mt('Submissions are not permanently recorded'). |
'</span>'; |
'</span>'; |
} |
} |
Line 3131 sub randomizetry_problem_header {
|
Line 3314 sub randomizetry_problem_header {
|
$text = &mt('A new variation will be generated after each try until correct or tries limit is reached.'); |
$text = &mt('A new variation will be generated after each try until correct or tries limit is reached.'); |
} |
} |
} |
} |
return '<span class="LC_info"><h3>'.$header.'</h3></span>'. |
return '<h3 class="LC_info">'.$header.'</h3>'. |
'<span class="LC_info">'.$text.'</span><hr />'; |
'<span class="LC_info">'.$text.'</span><hr />'; |
} |
} |
|
|
Line 3162 sub randomizetry_part_header {
|
Line 3345 sub randomizetry_part_header {
|
if ($num > 1) { |
if ($num > 1) { |
$output .= '<hr />'; |
$output .= '<hr />'; |
} |
} |
$output .= '<span class="LC_info"><h4>'.$header.'</h4></span>'. |
$output .= '<h4 class="LC_info">'.$header.'</h4>'. |
'<span class="LC_info">'.$text.'</span><br /><br />'; |
'<span class="LC_info">'.$text.'</span><br /><br />'; |
return $output; |
return $output; |
} |
} |