--- loncom/homework/structuretags.pm 2024/03/03 22:51:31 1.512.2.24.2.15 +++ loncom/homework/structuretags.pm 2023/09/11 13:46:11 1.512.2.25 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # definition of tags that give a structure to a document # -# $Id: structuretags.pm,v 1.512.2.24.2.15 2024/03/03 22:51:31 raeburn Exp $ +# $Id: structuretags.pm,v 1.512.2.25 2023/09/11 13:46:11 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -62,14 +62,13 @@ 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/'; use LONCAPA; BEGIN { - &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')); + &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')); } @@ -194,28 +193,6 @@ sub end_web { 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 { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result=''; @@ -295,7 +272,7 @@ sub homework_js { } return &Apache::loncommon::resize_textarea_js(). &Apache::loncommon::colorfuleditor_js(). - &Apache::lonxml::setmode_javascript(). + &setmode_javascript(). <<"JS"; +ENDSCRIPT +} + sub page_start { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$name, $extra_head)=@_; @@ -428,7 +420,7 @@ sub page_start { if (&Apache::lonhtmlcommon::htmlareabrowser()) { my %textarea_args; if (($env{'request.state'} ne 'construct') || - (&Apache::loncommon::nocodemirror())) { + ($env{'environment.nocodemirror'})) { %textarea_args = ( dragmath => 'math', ); @@ -536,25 +528,23 @@ sub page_start { } elsif (!defined($found{'body'}) && $env{'request.state'} eq 'construct') { if ($target eq 'web' || $target eq 'edit') { - unless ($env{'form.inhibitmenu'} eq 'yes') { - # Breadcrumbs for Authoring Space - &Apache::lonhtmlcommon::clear_breadcrumbs(); - &Apache::lonhtmlcommon::add_breadcrumb({ - 'text' => 'Authoring Space', - 'href' => &Apache::loncommon::authorspace($env{'request.uri'}), - }); - # breadcrumbs (and tools) will be created - # in start_page->bodytag->innerregister + # Breadcrumbs for Authoring Space + &Apache::lonhtmlcommon::clear_breadcrumbs(); + &Apache::lonhtmlcommon::add_breadcrumb({ + 'text' => 'Authoring Space', + 'href' => &Apache::loncommon::authorspace($env{'request.uri'}), + }); + # breadcrumbs (and tools) will be created + # in start_page->bodytag->innerregister # FIXME Where are we? -# &Apache::lonhtmlcommon::add_breadcrumb({ -# 'text' => 'Problem Editing', # 'Problem Testing' -# 'href' => '', -# }); - $pageheader = &Apache::loncommon::head_subbox( - &Apache::loncommon::CSTR_pageheader()); - } - } +# &Apache::lonhtmlcommon::add_breadcrumb({ +# 'text' => 'Problem Editing', # 'Problem Testing' +# 'href' => '', +# }); + $pageheader =&Apache::loncommon::head_subbox( + &Apache::loncommon::CSTR_pageheader()); + } } elsif (!defined($found{'body'})) { my %add_entries; my $background=&Apache::lonxml::get_param('background',$parstack, @@ -609,9 +599,7 @@ sub page_start { my ($symb,$courseid,$udom,$uname)=&Apache::lonnet::whichuser(); my ($path,$multiresp) = &Apache::loncommon::get_turnedin_filepath($symb,$uname,$udom); - if ($env{'request.user_in_effect'}) { - $form_tag_start .= ' onsubmit="preventDefault();"'; - } elsif (($is_task) || ($needs_upload)) { + if (($is_task) || ($needs_upload)) { $form_tag_start .= ' onsubmit="return file_submission_check(this,'."'$path','$multiresp'".');"'; } $form_tag_start.='>'."\n"; @@ -688,10 +676,10 @@ sub setup_rndseed { $reqtries = &Apache::lonnet::EXT("resource.$partfortries.randomizeontries"); } } - if (($env{'request.state'} eq "construct") + if (($env{'request.state'} eq "construct") || ($symb eq '') || ($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'}, ['rndseed']); @@ -717,7 +705,7 @@ sub setup_rndseed { } $env{'form.'.$Apache::inputtags::part.'.rndseed'}=$rndseed; } - if ( ($env{'form.resetdata'} eq 'new_problem_variation' + if ( ($env{'form.resetdata'} eq &mt('New Problem Variation') && $env{'form.submitted'} eq 'yes') || $env{'form.newrandomization'} eq &mt('New Randomization')) { srand(time); @@ -800,18 +788,13 @@ sub problem_edit_action_button { sub problem_edit_buttons { my ($mode)=@_; - my %editors = &Apache::loncommon::permitted_editors(); # Buttons that save my $result = '
'; if ($mode eq 'editxml') { - if ($editors{'xml'}) { - $result.=&problem_edit_action_button('subsaveedit','saveeditxml','s','Save and EditXML'); - } + $result.=&problem_edit_action_button('subsaveedit','saveeditxml','s','Save and EditXML'); $result.=&problem_edit_action_button('subsaveview','saveviewxml','v','Save and View'); } else { - if ($editors{'edit'}) { - $result.=&problem_edit_action_button('subsaveedit','saveedit','s','Save and Edit'); - } + $result.=&problem_edit_action_button('subsaveedit','saveedit','s','Save and Edit'); $result.=&problem_edit_action_button('subsaveview','saveview','v','Save and View'); } $result.="\n
\n"; @@ -819,23 +802,13 @@ sub problem_edit_buttons { $result .= '
'. &problem_edit_action_button('subdiscview','discard','d','Discard Edits and View',1); if ($mode eq 'editxml') { - if ($editors{'edit'}) { - $result.=&problem_edit_action_button('subedit','edit','e','Edit',1); - } - if ($editors{'daxe'}) { - $result.=&problem_edit_action_button('subdaxe','daxe','w','Edit with Daxe',1); - } + $result.=&problem_edit_action_button('subedit','edit','e','Edit',1); $result.=&problem_edit_action_button('subundo','undoxml','u','Undo',1); - if (&Apache::loncommon::nocodemirror()) { + if ($env{'environment.nocodemirror'}) { $result.=&Apache::lonhtmlcommon::dragmath_button("LC_editxmltext",1); } } else { - if ($editors{'xml'}) { - $result.=&problem_edit_action_button('subeditxml','editxml','x','EditXML',1); - } - if ($editors{'daxe'}) { - $result.=&problem_edit_action_button('subdaxe','daxe','w','Edit with Daxe',1); - } + $result.=&problem_edit_action_button('subeditxml','editxml','x','EditXML',1); $result.=&problem_edit_action_button('subundo','undo','u','Undo',1); } $result.="\n
"; @@ -849,9 +822,9 @@ sub problem_edit_header {
'.&mt('Problem Editing').$mode.&Apache::loncommon::help_open_menu('Problem Editing','Problem_Editor_XML_Index',5,'Authoring').' -
'. - ''. - &problem_edit_buttons(); +
'. + ''. + &problem_edit_buttons(); $return .= '
' . &Apache::lonxml::message_location(); $return .= ' @@ -908,7 +881,6 @@ sub option { sub problem_web_to_edit_header { my ($rndseed)=@_; - my %editors = &Apache::loncommon::permitted_editors(); my $result .= '
'; if (!$Apache::lonhomework::parsing_a_task) { @@ -1008,8 +980,7 @@ $show_all
- +
@@ -1038,21 +1009,10 @@ $show_all
'; $result.=''; - if ($editors{'edit'}) { - $result .= ''; - } - if ($editors{'xml'}) { - $result .= ''; - } - if (($editors{'daxe'}) && - ($env{'browser.type'} ne 'explorer' || $env{'browser.version'} > 9)) { - my $uri = $env{'request.uri'}; - my $daxeurl = '/daxepage'.$uri; - $result .= ''; - } + $result .= ''; + $result .= ''; $result.='

@@ -1079,8 +1039,8 @@ sub initialize_storage { || $Apache::lonhomework::type eq 'practice') { my $namespace = $symb || $env{'request.uri'}; - if ($env{'form.resetdata'} eq 'reset_submissions' || - ($env{'form.resetdata'} eq 'new_problem_variation' + if ($env{'form.resetdata'} eq &mt('Reset Submissions') || + ($env{'form.resetdata'} eq &mt('New Problem Variation') && $env{'form.submitted'} eq 'yes') || $env{'form.newrandomization'} eq &mt('New Randomization')) { &Apache::lonnet::tmpreset($namespace,'',$domain,$name); @@ -1132,9 +1092,9 @@ sub initialize_storage { for any parts with out-of-order storage (i.e., correct then incorrect, 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. - + =cut @@ -1146,8 +1106,6 @@ sub finalize_storage { delete(@Apache::lonhomework::results{@remove}); my ($symb,$courseid,$domain,$name) = &Apache::lonnet::whichuser($given_symb); - 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') { @@ -1157,28 +1115,17 @@ sub finalize_storage { $namespace,'',$domain,$name); &Apache::lonxml::debug('Construct Store return message:'.$result); } else { - my ($laststore,$checkedparts,@parts,%postcorrect,%record); + my ($laststore,$checkedparts,@parts,%postcorrect); 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'}) || ($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'}) { $laststore = $Apache::lonhomework::history{'version'}.'='. $Apache::lonhomework::history{'timestamp'}; } else { $laststore = '0=0'; } - %record = &Apache::lonnet::restore($symb,$courseid,$domain,$name); + my %record = &Apache::lonnet::restore($symb,$courseid,$domain,$name); if ($record{'version'}) { my ($newversion,$oldversion,$oldtimestamp); if ($Apache::lonhomework::history{'version'}) { @@ -1254,98 +1201,8 @@ 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); &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 { &Apache::lonxml::debug('Nothing to store'); @@ -1353,104 +1210,6 @@ sub finalize_storage { 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,$pbscope); - if ($scope eq 'res') { - if ($deeplink_symb eq $symb) { - $passback = 1; - $pbscope = 'resource'; - } - } elsif ($scope eq 'map') { - if (&Apache::lonnet::clutter($deeplink_map) eq $map) { - $passback = 1; - $pbscope = 'nonrec'; - } - } elsif ($scope eq 'rec') { - if (&Apache::lonnet::clutter($deeplink_map) eq $map) { - $passback = 1; - $pbscope = 'map'; - } else { - my @recurseup = &Apache::lonnet::get_map_hierarchy($map,$env{'request.course.id'}); - if (grep(/^\Q$deeplink_map\E$/,@recurseup)) { - $passback = 1; - $pbscope = 'map'; - } - } - } - return ($passback,$pbscope,$deeplink_map,$deeplink_symb,$crsdef,$itemnum,$lti_in_use); - } - } - } - } - } -} - =pod =item check_correctness_changes() @@ -1585,99 +1344,6 @@ 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.='

'.&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'

'; - } elsif ($status eq 'NOT_IN_A_SLOT') { - $msg.='

'.&mt('You are not currently signed up to work at this time and/or place.').'

'; - } elsif (($status eq 'RESERVABLE') || ($status eq 'RESERVABLE_LATER') || - ($status eq 'NOTRESERVABLE')) { - $msg.='

'.&mt('Access requires reservation to work at specific time/place.').'

'; - } elsif ($status ne 'NOT_YET_VIEWED') { - $msg.='

'.&mt('Not open to be viewed').'

'; - } - 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')). - '
'. - &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.'); - } - $msg.='
'; - } 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.'); - } elsif ($status eq 'CLOSED' || $status eq 'INVALID_ACCESS') { - $msg.=&mt('Problem is not open to be viewed. It')." $accessmsg"; - } else { - $msg.=&mt('Problem is not open to be viewed.'); - } - $msg .= " \\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 $check = &Apache::bridgetask::check_in('problem',undef,undef, - $slot_name); - 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 { my %lt=&Apache::lonlocal::texthash( 'resource'=>'The resource needs to be checked out', @@ -1893,12 +1559,15 @@ sub start_problem { $target eq 'tex') { if ($env{'form.markaccess'}) { my @interval=&Apache::lonnet::EXT("resource.0.interval"); - my ($timelimit) = ($interval[0] =~ /^(\d+)/); - my $is_set = &Apache::lonnet::set_first_access($interval[1],$timelimit); + my $is_set = &Apache::lonnet::set_first_access($interval[1],$interval[0]); unless (($is_set eq 'ok') || ($is_set eq 'already_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' @@ -1906,8 +1575,7 @@ sub start_problem { ($result,$form_tag_start,$probpartlist) = &page_start($target,$token,$tagstack,$parstack,$parser,$safeeval, $name); - } elsif ((($target eq 'grade') && ($Apache::lonhomework::type eq 'randomizetry')) || - ($target eq 'answer')) { + } elsif (($target eq 'grade') && ($Apache::lonhomework::type eq 'randomizetry')) { my ($symb)= &Apache::lonnet::whichuser(); if ($symb ne '') { my $navmap = Apache::lonnavmaps::navmap->new(); @@ -1920,20 +1588,6 @@ 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 'analyze') { my $rndseed=&setup_rndseed($safeeval,$target); } @@ -1971,8 +1625,8 @@ sub start_problem { } $form_tag_start.=''. - ''; + ''; if (exists($env{'form.username'})) { $form_tag_start.= ''; - } - $result .= &access_status_msg('problem',$status,$symb,$target,'',$accessmsg); + if ( $target eq "web" ) { + my $msg; + if ($status eq 'UNAVAILABLE') { + $msg.='

'.&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'

'; + } elsif ($status eq 'NOT_IN_A_SLOT') { + $msg.='

'.&mt('You are not currently signed up to work at this time and/or place.').'

'; + } elsif (($status eq 'RESERVABLE') || ($status eq 'RESERVABLE_LATER') || + ($status eq 'NOTRESERVABLE')) { + $msg.='

'.&mt('Access requires reservation to work at specific time/place.').'

'; + } elsif ($status ne 'NOT_YET_VIEWED') { + $msg.='

'.&mt('Not open to be viewed').'

'; + } + 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') { + if ($firstaccres) { + $msg .= '

'. + &mt('A problem occurred when trying to start the timer.').'

'; + } + $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')). + '
'. + &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.'); + } + $result.=$msg.'
'; + } 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') { my $bodytext=&Apache::lonxml::get_all_text("/problem",$parser, $style); - $result .= &checkin_prompt($target,$slot_name,$slot,'problem'); + if ($target eq 'web') { + $result .= + &Apache::bridgetask::proctor_validation_screen($slot); + } elsif ($target eq 'grade') { + &Apache::bridgetask::proctor_check_auth($slot_name,$slot, + 'problem'); + } } elsif ($target eq 'web') { if ($status eq 'CAN_ANSWER') { $resource_due = &Apache::lonhomework::due_date(0, $env{'request.symb'}); if ($slot_name ne '') { - $resource_due = &selfcheckin_resource($resource_due,$slot_name,$slot, - $env{'request.symb'}); + my $checked_in = + $Apache::lonhomework::history{'resource.0.checkedin'}; + if ($checked_in eq '') { + # unproctored slot access, self checkin + &Apache::bridgetask::check_in('problem',undef,undef, + $slot_name); + $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) { my $time_left = $resource_due - time(); @@ -2051,15 +1769,10 @@ sub start_problem { ''; # create a page header and exit if ($env{'request.state'} eq "construct") { - if ($env{'form.inhibitmenu'} eq 'yes') { - # error messages can be useful in any case - $result.= &Apache::lonxml::message_location(); - } else { - $result.= &problem_web_to_edit_header($env{'form.rndseed'}); - } + $result.= &problem_web_to_edit_header($env{'form.rndseed'}); if ($Apache::lonhomework::type eq 'practice') { - $result.= ''. + $result.= ''. &practice_problem_header().'
'; } elsif ($Apache::lonhomework::type eq 'randomizetry') { my $reqtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::part.randomizeontries"); @@ -2086,6 +1799,8 @@ sub start_problem { } elsif ($target eq 'tex') { $result .= 'INSERTTEXFRONTMATTERHERE'; $result .= &select_metadata_hyphenation(); + + } } elsif ($target eq 'edit') { $result .= $form_tag_start.&problem_edit_header(); @@ -2205,12 +1920,6 @@ sub end_problem { } } $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']; @@ -2365,8 +2074,8 @@ sub start_library { ''; $result.=&problem_web_to_edit_header($rndseed); if ($Apache::lonhomework::type eq 'practice') { - $result.= ''. + $result.= ''. &practice_problem_header().'
'; } } @@ -3149,11 +2858,7 @@ sub end_part { $gradestatus=''; } $result.=$gradestatus; - if ($$tagstack[-2] eq 'td' and $target eq 'tex') { - if (not $env{'form.problem_split'}=~/yes/) { - $result.='\end{minipage}'; - } - } + if ($$tagstack[-2] eq 'td' and $target eq 'tex') {$result.='\end{minipage}';} } elsif ($target eq 'edit') { $result.=&Apache::edit::end_table(); } elsif ($target eq 'modified') { @@ -3318,7 +3023,7 @@ sub end_startouttext { .&Apache::edit::deletelist($target,$token) .'' .''; - if (&Apache::loncommon::nocodemirror()) { + if ($env{'environment.nocodemirror'}) { $result.=&Apache::lonhtmlcommon::dragmath_button($areaid,1); } else { $result.=' ';