--- loncom/homework/structuretags.pm 2024/02/28 00:19:04 1.512.2.24.2.13 +++ loncom/homework/structuretags.pm 2014/05/18 02:13:45 1.519 @@ -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.13 2024/02/28 00:19:04 raeburn Exp $ +# $Id: structuretags.pm,v 1.519 2014/05/18 02:13:45 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -62,9 +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/'; use LONCAPA; @@ -226,55 +224,9 @@ sub end_tex { } sub homework_js { - my ($postsubmit,$timeout); - if (($env{'request.course.id'}) && ($env{'request.state'} ne 'construct')) { - my $crstype; - if (&Apache::loncommon::course_type() eq 'Community') { - $crstype = 'community'; - } else { - if ($env{'course.'.$env{'request.course.id'}.'.internal.coursecode'}) { - $crstype = 'official'; - } elsif ($env{'course.'.$env{'request.course.id'}.'.internal.textbook'}) { - $crstype = 'textbook'; - } else { - $crstype = 'unofficial'; - } - } - $postsubmit = $env{'course.'.$env{'request.course.id'}.'.internal.postsubmit'}; - if ($postsubmit eq '') { - my %domdefs = &Apache::lonnet::get_domain_defaults($env{'course.'.$env{'request.course.id'}.'.domain'}); - $postsubmit = $domdefs{'postsubmit'}; - unless ($postsubmit eq 'off') { - $timeout = $domdefs{$crstype.'postsubtimeout'}; - } - } elsif ($postsubmit eq '0') { - $postsubmit = 'off'; - } elsif ($postsubmit eq '1') { - $postsubmit = 'on'; - $timeout = $env{'course.'.$env{'request.course.id'}.'.internal.postsubtimeout'}; - if ($timeout eq '') { - my %domdefs = &Apache::lonnet::get_domain_defaults($env{'course.'.$env{'request.course.id'}.'.domain'}); - $timeout = $domdefs{$crstype.'postsubtimeout'}; - } - } - if ($timeout eq '') { - $timeout = 60; - } - } else { - my %domdefs = &Apache::lonnet::get_domain_defaults($env{'request.role.domain'}); - $postsubmit = $domdefs{'postsubmit'}; - unless ($postsubmit eq 'off') { - $timeout = 60; - } - } - my $jstimeout = 0; - if ($timeout) { - $jstimeout = 1000 * $timeout; - } return &Apache::loncommon::resize_textarea_js(). - &Apache::loncommon::colorfuleditor_js(). - &Apache::lonxml::setmode_javascript(). - <<"JS"; + &setmode_javascript(). + <<'JS'; JS } +sub setmode_javascript { + return <<"ENDSCRIPT"; + +ENDSCRIPT +} + sub page_start { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$name, $extra_head)=@_; @@ -404,17 +291,13 @@ sub page_start { $extra_head .= &homework_js(). &Apache::lonhtmlcommon::dragmath_js("EditMathPopup"); if (&Apache::lonhtmlcommon::htmlareabrowser()) { - my %textarea_args; - if (($env{'request.state'} ne 'construct') || - (&Apache::loncommon::nocodemirror())) { - %textarea_args = ( + my %textarea_args = ( dragmath => 'math', ); - } $extra_head .= &Apache::lonhtmlcommon::htmlareaselectactive(\%textarea_args); } my $is_task = ($env{'request.uri'} =~ /\.task$/); - my ($needs_upload,$partlist); + my $needs_upload; my ($symb)= &Apache::lonnet::whichuser(); my ($map,$resid,$resurl)=&Apache::lonnet::decode_symb($symb); if ($is_task) { @@ -432,12 +315,6 @@ sub page_start { unless ($is_page) { $needs_upload = 1; } - if ((ref($tagstack) eq 'ARRAY') && ($tagstack->[-1] eq 'problem')) { - my $res = $navmap->getBySymb($symb); - if (ref($res)) { - $partlist = $res->parts(); - } - } } } } else { @@ -449,17 +326,10 @@ sub page_start { if (ref($mapres)) { $is_page = $mapres->is_page(); } - if ($is_page) { - if ((ref($tagstack) eq 'ARRAY') && ($tagstack->[-1] eq 'problem')) { - my $res = $navmap->getBySymb($symb); - if (ref($res)) { - $partlist = $res->parts(); - } - } - } else { + unless ($is_page) { my $res = $navmap->getBySymb($symb); if (ref($res)) { - $partlist = $res->parts(); + my $partlist = $res->parts(); if (ref($partlist) eq 'ARRAY') { foreach my $part (@{$partlist}) { my @types = $res->responseType($part); @@ -481,9 +351,7 @@ sub page_start { } } if ($needs_upload) { - $extra_head .= &Apache::lonhtmlcommon::file_submissionchk_js(). - ''; + $extra_head .= &Apache::lonhtmlcommon::file_submissionchk_js(); } } @@ -502,9 +370,6 @@ sub page_start { "if (typeof swmenu != 'undefined') {swmenu.currentURL=null;}\n". &Apache::loncommon::browser_and_searcher_javascript(). "\n\n"; - if ($target eq 'edit') { - $extra_head .= &Apache::edit::js_update_linknum(); - } } } @@ -585,9 +450,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"; @@ -599,7 +462,7 @@ sub page_start { "\t".''."\n"; } } - return ($page_start,$form_tag_start,$partlist); + return ($page_start,$form_tag_start); } #use Time::HiRes(); @@ -630,45 +493,19 @@ sub get_resource_name { } sub setup_rndseed { - my ($safeeval,$target,$probpartlist)=@_; + my ($safeeval,$target)=@_; my ($symb)=&Apache::lonnet::whichuser(); - my ($questiontype,$set_safespace,$rndseed,$numtries,$reqtries); + my ($questiontype,$set_safespace,$rndseed); if ($target eq 'analyze') { $questiontype = $env{'form.grade_questiontype'}; } unless (defined($questiontype)) { $questiontype = $Apache::lonhomework::type; } - if ($Apache::lonhomework::type eq 'randomizetry') { - my $partfortries = $Apache::inputtags::part; -# -# Where question type is "randomizetry" for a problem containing -# a single part (and unless type is explicitly set to not be -# "randomizetry" for that part), the number of tries used to -# determine randomization will be for that part, and randomization -# from calls to &random() in a perl script block before the part tag, -# will change based on the number of tries, and value of the -# "randomizeontries" parameter in effect for the single part. -# - if (ref($probpartlist) eq 'ARRAY') { - if ((@{$probpartlist} == 1) && ($probpartlist->[0] ne $partfortries)) { - if (&Apache::lonnet::EXT('resource.'.$probpartlist->[0].'.type') eq 'randomizetry') { - $partfortries = $probpartlist->[0]; - } else { - $partfortries = ''; - } - } - } - if ($partfortries ne '') { - $numtries = $Apache::lonhomework::history{"resource.$partfortries.tries"}; - $reqtries = &Apache::lonnet::EXT("resource.$partfortries.randomizeontries"); - } - } - if (($env{'request.state'} eq "construct") - || ($symb eq '') - || ($Apache::lonhomework::type eq 'practice') - || ($Apache::lonhomework::history{'resource.CODE'}) - || (($env{'form.code_for_randomlist'}) && ($target eq 'analyze'))) { + if ($env{'request.state'} eq "construct" + || $symb eq '' + || $Apache::lonhomework::type eq 'practice' + || $Apache::lonhomework::history{'resource.CODE'}) { &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['rndseed']); $rndseed=$env{'form.rndseed'}; @@ -677,23 +514,17 @@ sub setup_rndseed { if (!$rndseed) { $rndseed=time; } - unless ($env{'form.code_for_randomlist'}) { - $env{'form.rndseed'}=$rndseed; - } + $env{'form.rndseed'}=$rndseed; } - if ((($env{'request.state'} eq "construct") || ($symb eq '')) && + if (($env{'request.state'} eq "construct") && ($Apache::lonhomework::type eq 'randomizetry')) { - if ($numtries) { - if (($reqtries =~ /^\d+$/) && ($reqtries > 1)) { - my $inc = int($numtries/$reqtries); - $rndseed += $inc; - } else { - $rndseed += $numtries; - } + my $tries = $Apache::lonhomework::history{"resource.$Apache::inputtags::part.tries"}; + if ($tries) { + $rndseed += $tries; } $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); @@ -711,11 +542,7 @@ sub setup_rndseed { $rndseed=join(':',&Apache::lonnet::digest($rndseed)); } } - 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'}) { + if ($Apache::lonhomework::history{'resource.CODE'}) { $rndseed=&Apache::lonnet::rndseed(); } $set_safespace = 1; @@ -727,7 +554,7 @@ sub setup_rndseed { } unless (($target eq 'analyze') && (defined($rndseed))) { $rndseed=&Apache::lonnet::rndseed(); - my $curr_try = $numtries; + my $curr_try = $Apache::lonhomework::history{"resource.$Apache::inputtags::part.tries"}; if ($Apache::inputtags::status[-1] eq 'CAN_ANSWER') { $curr_try ++; } @@ -735,6 +562,7 @@ sub setup_rndseed { $rndseed = $1; } if ($curr_try) { + my $reqtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::part.randomizeontries"); if (($reqtries =~ /^\d+$/) && ($reqtries > 1)) { my $inc = int(($curr_try-1)/$reqtries); $rndseed += $inc; @@ -744,9 +572,6 @@ sub setup_rndseed { } } $set_safespace = 1; - if ($target eq 'grade') { - $Apache::lonhomework::rawrndseed = $rndseed; - } } if ($set_safespace) { if ($safeeval) { @@ -776,97 +601,53 @@ 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('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('subsaveview','saveview','v','Save and View'); - } - $result.="\n
\n"; # Buttons that do not save - $result .= '
'. + my $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()) { - $result.=&Apache::lonhtmlcommon::dragmath_button("LC_editxmltext",1); - } + $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
"; +# Buttons that save + $result.='
'; + if ($mode eq 'editxml') { + $result.=&problem_edit_action_button('subsaveedit','saveeditxml','s','Save and EditXML'); + $result.=&problem_edit_action_button('subsaveview','saveviewxml','v','Save and View'); + } else { + $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"; return $result; } sub problem_edit_header { - my ($mode)=@_; - my $return = ''. + return ''. &remember_problem_state('edit').' -
-
- '.&mt('Problem Editing').$mode.&Apache::loncommon::help_open_menu('Problem Editing','Problem_Editor_XML_Index',5,'Authoring').' -
'. - ''. - &problem_edit_buttons(); - - $return .= '
' . &Apache::lonxml::message_location(); - $return .= ' - '; - - $return .= ' - - " + $result.=&Apache::edit::start_table($token)."" .'' - .'' + .'' .'' @@ -3389,7 +2648,7 @@ sub practice_problem_header { } sub randomizetry_problem_header { - my ($problemstatus,$reqtries,$symb) = @_; + my ($problemstatus,$reqtries) = @_; my ($header,$text); if ($reqtries > 1) { $header = &mt('New Problem Variation After Every [quant,_1,Try,Tries]',$reqtries); @@ -3409,13 +2668,8 @@ sub randomizetry_problem_header { $text = &mt('A new variation will be generated after each try until correct or tries limit is reached.'); } } - if (($env{'request.state'} eq "construct") || ($symb eq '')) { - return ''; - } else { - return '

'.$header.'

'. - ''.$text.'
'; - } + return '

'.$header.'

'. + ''.$text.'
'; } sub randomizetry_part_header { @@ -3423,7 +2677,7 @@ sub randomizetry_part_header { my ($header,$text); if ($reqtries eq 'none') { $header = &mt('No Question Variation'); - $text = &mt('For this question there will be no new variation after a try.'); + $text = &mt('For this question there will no new variation after a try.'); } elsif ($reqtries > 1) { $header = &mt('New Question Variation After Every [quant,_1,Try,Tries]',$reqtries); if (($problemstatus eq 'no') ||
'; - return $return; +
+
+'.&mt('Problem Editing').&Apache::loncommon::help_open_menu('Problem Editing','Problem_Editor_XML_Index',5,'Authoring').' +
'. +''. +&problem_edit_buttons().' +
+'.&Apache::lonxml::message_location().' +
+'. + '
'; } - sub problem_edit_footer { - my $resource = $env{'request.ambiguous'}; return '

'. "\n\n".&Apache::loncommon::end_page(); @@ -884,7 +665,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) { @@ -932,7 +712,7 @@ sub problem_web_to_edit_header { ".&mt("Problem Type:")." - +

@@ -1014,21 +793,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.='

@@ -1055,8 +823,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); @@ -1064,7 +832,7 @@ sub initialize_storage { } %Apache::lonhomework::history= &Apache::lonnet::tmprestore($namespace,'',$domain,$name); - my ($temp)=keys(%Apache::lonhomework::history); + my ($temp)=keys %Apache::lonhomework::history ; &Apache::lonxml::debug("Return message of $temp"); } else { %Apache::lonhomework::history= @@ -1072,7 +840,7 @@ sub initialize_storage { } #ignore error conditions - my ($temp)=keys(%Apache::lonhomework::history); + my ($temp)=keys %Apache::lonhomework::history ; if ($temp =~ m/^error:.*/) { %Apache::lonhomework::history=(); } } @@ -1080,37 +848,12 @@ sub initialize_storage { =item finalize_storage() - Stores away the result hash to a student's environment; - checks form.grade_ for specific values, otherwise stores - to the running user's environment. - - &check_correctness_changes() is called in two circumstances - in which the results hash is to be stored permanently, for - grading triggered by a student's submission, where feedback on - correctness is to be provided to the student. - - 1. Immediately prior to storing the results hash - - To handle the case where a student's submission (and award) were - stored after history was retrieved in &initialize_storage(), e.g., - if a student submitted answers in quick succession (e.g., from - multiple tabs). &Apache::inputtags::hidealldata() is called for - any parts with out-of-order storage (i.e., correct then incorrect, - where awarded >= 1 when correct). - - 2. Immediately after storing the results hash - - To handle the case where lond on the student's homeserver returns - delay:N -- where N is the number of transactions between the last - retrieved in &initialize_storage() and the last stored immediately - before permanent storage of the current transaction via - lond::store_handler(). &Apache::grades::makehidden() is called - 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, - students, and corrects, if running user has student role. - + Stores away the result has to a student's environment + checks form.grade_ for specific values, other wises stores + to the running users environment + Will increment totals for attempts, students, and corrects + if running user has student role. + =cut @@ -1122,8 +865,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') { @@ -1133,195 +874,10 @@ sub finalize_storage { $namespace,'',$domain,$name); &Apache::lonxml::debug('Construct Store return message:'.$result); } else { - my ($laststore,$checkedparts,@parts,%postcorrect,%record); - 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); - if ($record{'version'}) { - my ($newversion,$oldversion,$oldtimestamp); - if ($Apache::lonhomework::history{'version'}) { - $oldversion = $Apache::lonhomework::history{'version'}; - $oldtimestamp = $Apache::lonhomework::history{'timestamp'}; - } else { - $oldversion = 0; - $oldtimestamp = 0; - } - if ($record{'version'} > $oldversion) { - if ($record{'timestamp'} >= $oldtimestamp) { - $laststore = $record{'version'}.'='.$record{'timestamp'}; - $newversion = $record{'version'} + 1; - $checkedparts = 1; - foreach my $key (keys(%Apache::lonhomework::results)) { - if ($key =~ /^resource\.([^\.]+)\.solved$/) { - my $part = $1; - if ($Apache::lonhomework::results{$key} eq 'incorrect_attempted') { - push(@parts,$part); - } - } - } - if (@parts) { - my @parts_to_hide = &check_correctness_changes($symb,$courseid,$domain,$name, - \%record,\@parts,$newversion, - $oldversion); - if (@parts_to_hide) { - foreach my $part (@parts_to_hide) { - $postcorrect{$part} = 1; - &Apache::inputtags::hidealldata($part); - } - } - } - } - } - } - } $result=&Apache::lonnet::cstore(\%Apache::lonhomework::results, - $symb,$courseid,$domain,$name,$laststore); - if ($result =~ /^delay\:(\d+)$/) { - my $numtrans = $1; - my ($oldversion) = split(/=/,$laststore); - if ($numtrans) { - my $newversion = $oldversion + 1 + $numtrans; - my @possparts; - if ($checkedparts) { - foreach my $part (@parts) { - unless ($postcorrect{$part}) { - push(@possparts,$part); - } - } - } else { - foreach my $key (keys(%Apache::lonhomework::results)) { - if ($key =~ /^resource\.([^\.]+)\.solved$/) { - my $part = $1; - unless ($postcorrect{$part}) { - if ($Apache::lonhomework::results{$key} eq 'incorrect_attempted') { - push(@possparts,$part); - } - } - } - } - } - if (@possparts) { - my %newrecord = &Apache::lonnet::restore($symb,$courseid,$domain,$name); - my @parts_to_hide = &check_correctness_changes($symb,$courseid,$domain,$name, - \%newrecord,\@possparts,$newversion, - $oldversion); - if (@parts_to_hide) { - my $partslist = join(',',@parts_to_hide); - &Apache::grades::makehidden($newversion,$partslist,\%newrecord,$symb,$domain,$name,1); - } - } - } - } - 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; - } - } - } - } + $symb,$courseid,$domain,$name); &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'); @@ -1329,160 +885,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() - - For all parts for which current results contain a solved status - of "incorrect_attempted", check if there was a transaction in which - solved was set to "correct_by_student" in the time since the last - transaction (retrieved when &initialize_storage() was called i.e., - when &start_problem() was called), unless: - (a) questiontype parameter is set to survey or anonymous survey (+/- credit) - (b) problemstatus is set to no or no_feedback_ever - If such a transaction exists, and did not occur after "reset status" - by a user with grading privileges, then the current transaction is an - example of an out-of-order transaction (i.e., incorrect occurring after - correct). Accordingly, the current transaction should be hidden. - -=cut - - -sub check_correctness_changes { - my ($symb,$courseid,$domain,$name,$record,$parts,$newversion,$oldversion) = @_; - my @parts_to_hide; - unless ((ref($record) eq 'HASH') && (ref($parts) eq 'ARRAY')) { - return @parts_to_hide; - } - if (@{$parts}) { - my $usec; - if (($env{'user.name'} eq $name) && ($env{'user.domain'} eq $domain) && - ($env{'request.course.id'} eq $courseid)) { - $usec = $env{'request.course.sec'}; - } else { - $usec = &Apache::lonnet::getsection($domain,$name,$courseid); - } - foreach my $id (@{$parts}) { - next if (($Apache::lonhomework::results{'resource.'.$id.'.type'} =~ /survey/) || - (&Apache::lonnet::EXT("resource.$id.problemstatus",$symb, - $domain,$name,$usec,undef,$courseid) =~ /^no/)); - my $reset; - for (my $i=$newversion-1; $i>=$oldversion; $i--) { - if (($record->{$i.':resource.'.$id.'.regrader'}) && - ($record->{$i.':resource.'.$id.'.tries'} eq '') && - ($record->{$i.':resource.'.$id.'.award'} eq '')) { - $reset = 1; - } elsif (($record->{$i.":resource.$id.solved"} eq 'correct_by_student') && - ($record->{$i.":resource.$id.awarded"} >= 1)) { - unless ($reset) { - push(@parts_to_hide,$id); - last; - } - } - } - } - } - return @parts_to_hide; -} - =pod item store_aggregates() @@ -1547,7 +949,7 @@ sub store_aggregates { } } } - if (keys(%aggregate) > 0) { + if (keys (%aggregate) > 0) { &Apache::lonnet::cinc('nohist_resourcetracker',\%aggregate, $cdomain,$cname); } @@ -1561,106 +963,13 @@ 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', 'id_expln'=>'As a resource gets checked out, a unique timestamped ID is given to it, and a permanent record is left in the system.', 'warning'=>'Checking out resources is subject to course policies, and may exclude future credit even if done erroneously.', - 'checkout'=>'Check out Exam for Viewing', - 'checkout?'=>'Check out Exam?'); + 'checkout'=>'Check out Bubblesheet Exam for Viewing', + 'checkout?'=>'Check out Bubblesheet Exam?'); my $uri = &Apache::lonenc::check_encrypt($env{'request.uri'}); return (<$lt{'resource'} @@ -1699,11 +1008,9 @@ sub firstaccess_msg { my $uri = &Apache::lonenc::check_encrypt($env{'request.uri'}); my $buttontext = &mt('Show Resource'); my $timertext = &mt('Start Timer?'); - my $shownsymb = &HTML::Entities::encode(&Apache::lonenc::check_encrypt($symb),'\'"<>&'); $result .= (< - ENDCHECKOUT @@ -1739,13 +1046,11 @@ sub init_problem_globals { @Apache::inputtags::importlist = (); @Apache::inputtags::previous=(); @Apache::inputtags::previous_version=(); - $Apache::inputtags::leniency=''; $Apache::structuretags::printanswer='No'; @Apache::structuretags::whileconds=(); @Apache::structuretags::whilebody=(); @Apache::structuretags::whileline=(); $Apache::lonhomework::scantronmode=0; - $Apache::lonhomework::randomizetrypart=0; undef($Apache::lonhomework::name); undef($Apache::lonhomework::default_type); undef($Apache::lonhomework::type); @@ -1756,11 +1061,8 @@ sub reset_problem_globals { undef(%Apache::lonhomework::history); undef(%Apache::lonhomework::results); undef($Apache::inputtags::part); - undef($Apache::inputtags::leniency); if ($type eq 'Task') { undef($Apache::inputtags::slot_name); - } elsif ($type eq 'problem') { - undef($Apache::lonhomework::rawrndseed); } #don't undef this, lonhomework.pm takes care of this, we use this to #detect if we try to do 2 problems in one file @@ -1769,7 +1071,6 @@ sub reset_problem_globals { undef($Apache::lonhomework::default_type); undef($Apache::lonhomework::type); undef($Apache::lonhomework::scantronmode); - undef($Apache::inputtags::randomizetrypart); undef($Apache::lonhomework::ignore_response_errors); undef(@Apache::functionplotresponse::callscripts); &Apache::lonhomework::reset_show_problem_status(); @@ -1863,92 +1164,43 @@ sub start_problem { my $resource_due; my $name= &get_resource_name($parstack,$safeeval); - my ($result,$form_tag_start,$slot_name,$slot,$probpartlist,$firstaccres); + my ($result,$form_tag_start,$slot_name,$slot); if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' || $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); - unless (($is_set eq 'ok') || ($is_set eq 'already_set')) { - $firstaccres = $is_set; - } + &Apache::lonnet::set_first_access($interval[1],$interval[0]); } + + ($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' || $target eq 'edit') { - ($result,$form_tag_start,$probpartlist) = + ($result,$form_tag_start) = &page_start($target,$token,$tagstack,$parstack,$parser,$safeeval, $name); - } elsif ((($target eq 'grade') && ($Apache::lonhomework::type eq 'randomizetry')) || - ($target eq 'answer')) { - my ($symb)= &Apache::lonnet::whichuser(); - if ($symb ne '') { - my $navmap = Apache::lonnavmaps::navmap->new(); - if (ref($navmap)) { - my $res = $navmap->getBySymb($symb); - if (ref($res)) { - $probpartlist = $res->parts(); - } - } - } } - 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); } if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' || $target eq 'tex') { - my ($symb) = &Apache::lonnet::whichuser(); #handle rand seed in construction space - if (($env{'request.state'} eq 'construct') || ($symb eq '')) { - my $partorder=&Apache::lonnet::metadata($env{'request.uri'},'partorder'); - if ($partorder ne '') { - @{$probpartlist} = split(/,/,$partorder); - } - } - my $rndseed=&setup_rndseed($safeeval,$target,$probpartlist); - if (($target eq 'grade') && &Apache::response::submitted()) { - if ($Apache::lonhomework::type eq 'randomizetry') { - $Apache::lonhomework::results{'resource.0.rndseed'}=$rndseed; - } else { - my @parts; - if (ref($probpartlist) eq 'ARRAY') { - @parts = @{$probpartlist}; - } - unless (@parts) { - $Apache::lonhomework::results{'resource.0.rndseed'}=$Apache::lonhomework::rawrndseed; - } - } - } + my $rndseed=&setup_rndseed($safeeval,$target); + my ($symb)=&Apache::lonnet::whichuser(); if ($env{'request.state'} ne "construct" && ($symb eq '' || $Apache::lonhomework::type eq 'practice')) { - my $rndseedval = $rndseed; - if (($symb eq '') && ($Apache::lonhomework::type eq 'randomizetry')) { - $rndseedval = $env{'form.rndseed'}; - } $form_tag_start.=''. - ''; + $rndseed.'" />'. + ''; 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') { + $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(); @@ -2029,13 +1334,9 @@ sub start_problem { if ($env{'request.state'} eq "construct") { $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"); - my $problemstatus = &get_problem_status($Apache::inputtags::part); - $result.=&randomizetry_problem_header($problemstatus,$reqtries); } } # if we are viewing someone else preserve that info @@ -2057,6 +1358,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(); @@ -2097,7 +1400,7 @@ sub end_problem { my $id = $Apache::inputtags::part; my $weight = &Apache::lonnet::EXT("resource.$id.weight"); my $packages=&Apache::lonnet::metadata($env{'request.uri'},'packages'); - my @packages = split(/,/,$packages); + my @packages = split /,/,$packages; my $allow_print_points = 0; foreach my $partial_key (@packages) { if ($partial_key=~m/^part_0$/) { @@ -2176,12 +1479,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']; @@ -2241,24 +1538,7 @@ sub end_problem { } } if ($target eq 'web') { - $result.=&Apache::functionplotresponse::init_script(); - if ($Apache::lonhomework::default_type eq 'randomizetry') { - my ($symb) = &Apache::lonnet::whichuser(); - if ((($env{'request.state'} eq 'construct') || ($symb eq '')) && - ($status eq 'CAN_ANSWER')) { - unless (@Apache::inputtags::partlist > 1) { - $result.= <<"ENDJS"; - -ENDJS - } - } - } + $result.=&Apache::functionplotresponse::init_script(); } if ($target eq 'grade') { &Apache::lonhomework::showhash(%Apache::lonhomework::results); @@ -2296,8 +1576,7 @@ ENDJS # computation: # if ($target eq 'web') { - $result .= &Apache::lonhtmlcommon::dash_to_minus_js(). - &Apache::lonhtmlcommon::set_compute_end_time(); + $result .= &Apache::lonhtmlcommon::set_compute_end_time(); # # Closing tags delayed so any tags # not in head can appear inside body, for valid xhtml. @@ -2336,8 +1615,8 @@ sub start_library { ''; $result.=&problem_web_to_edit_header($rndseed); if ($Apache::lonhomework::type eq 'practice') { - $result.= ''. + $result.= ''. &practice_problem_header().'
'; } } @@ -2353,8 +1632,6 @@ sub end_library { && ($#$tagstack eq 0 && $$tagstack[0] eq 'library') && $env{'request.state'} eq "construct") { $result.=''.&Apache::loncommon::end_page({'discussion' => 1}); - } elsif ($target eq 'meta') { - $result.=&Apache::response::meta_response_order(); } if ( $#$tagstack eq 0 && $$tagstack[0] eq 'library') { &reset_problem_globals('library'); @@ -2837,12 +2114,7 @@ sub start_randomlist { } if (@randomlist) { my @idx_arr = (0 .. $#randomlist); - if ($env{'form.code_for_randomlist'}) { - &Apache::structuretags::shuffle(\@idx_arr,$target); - undef($env{'form.code_for_randomlist'}); - } else { - &Apache::structuretags::shuffle(\@idx_arr); - } + &Apache::structuretags::shuffle(\@idx_arr); my $bodytext = ''; my $show=$#randomlist; my $showarg=&Apache::lonxml::get_param('show',$parstack,$safeeval); @@ -2862,8 +2134,8 @@ sub start_randomlist { } } } - for my $i (0 .. $show) { - $bodytext .= "$randomlist[ $idx_arr[$i] ]"; + for(0 .. $show) { + $bodytext .= "$randomlist[ $idx_arr[$_] ]"; } &Apache::lonxml::newparser($parser,\$bodytext); } @@ -2881,10 +2153,10 @@ sub start_randomlist { } sub shuffle { - my ($a,$target) = @_; + my $a=shift; my $i; if (ref($a) eq 'ARRAY' && @$a) { - &Apache::response::pushrandomnumber(undef,$target); + &Apache::response::pushrandomnumber(); for($i=@$a;--$i;) { my $j=int(&Math::Random::random_uniform() * ($i+1)); next if $i == $j; @@ -2968,7 +2240,6 @@ sub start_part { my $id= &Apache::lonxml::get_id($parstack,$safeeval); $Apache::inputtags::part=$id; push(@Apache::inputtags::partlist,$id); - $Apache::inputtags::leniency=''; @Apache::inputtags::response=(); @Apache::inputtags::previous=(); @Apache::inputtags::previous_version=(); @@ -2978,14 +2249,6 @@ sub start_part { my $hidden=&Apache::loncommon::check_if_partid_hidden($Apache::inputtags::part); my $newtype=&Apache::lonnet::EXT("resource.$id.type"); if ($newtype) { $Apache::lonhomework::type=$newtype; } - if ($Apache::lonhomework::type eq 'randomizetry') { - my $rndseed=&setup_rndseed($safeeval,$target); - if (($target eq 'grade') && &Apache::response::submitted()) { - $Apache::lonhomework::results{"resource.$id.rndseed"}=$rndseed; - } - } elsif (($target eq 'grade') && &Apache::response::submitted()) { - $Apache::lonhomework::results{"resource.$id.rndseed"}=$Apache::lonhomework::rawrndseed; - } my $in_order_show=&ordered_show_check(); my $expression='$external::part=\''.$Apache::inputtags::part.'\';'; $expression.='$external::type=\''.$Apache::lonhomework::type.'\';'; @@ -3036,7 +2299,7 @@ sub start_part { } my $weight = &Apache::lonnet::EXT("resource.$id.weight"); my $allkeys=&Apache::lonnet::metadata($env{'request.uri'},'packages'); - my @allkeys = split(/,/,$allkeys); + my @allkeys = split /,/,$allkeys; my $allow_print_points = 0; foreach my $partial_key (@allkeys) { if ($partial_key=~m/^part_(.*)$/) { @@ -3058,14 +2321,20 @@ sub start_part { } elsif ($target eq 'web') { if ($status eq 'CAN_ANSWER') { my $problemstatus = &get_problem_status($Apache::inputtags::part); + my $probrandomize = &Apache::lonnet::EXT("resource.$Apache::inputtags::partlist[0].type"); + my $probrandtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::partlist[0].randomizeontries"); my $num = scalar(@Apache::inputtags::partlist)-1; - if ((($Apache::lonhomework::default_type eq 'randomizetry') || - ($Apache::lonhomework::randomizetrypart)) && - ($Apache::lonhomework::type ne 'randomizetry')) { - $result .= &randomizetry_part_header($problemstatus,'none',$num); - } elsif ($Apache::lonhomework::type eq 'randomizetry') { - $Apache::lonhomework::randomizetrypart = 1; - my $reqtries = &Apache::lonnet::EXT("resource.$id.randomizeontries"); + if ($probrandomize eq 'randomizetry') { + if (&Apache::lonnet::EXT("resource.$Apache::inputtags::part.type") ne 'randomizetry') { + $result .= &randomizetry_part_header($problemstatus,'none',$num); + } else { + my $reqtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::part.randomizeontries"); + if ($probrandtries ne $reqtries) { + $result .= &randomizetry_part_header($problemstatus,$reqtries,$num); + } + } + } elsif (&Apache::lonnet::EXT("resource.$Apache::inputtags::part.type") eq 'randomizetry') { + my $reqtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::part.randomizeontries"); $result .= &randomizetry_part_header($problemstatus,$reqtries,$num); } } @@ -3120,11 +2389,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') { @@ -3132,7 +2397,6 @@ sub end_part { } pop @Apache::inputtags::status; $Apache::inputtags::part=''; - $Apache::inputtags::leniency=''; $Apache::lonhomework::type = $Apache::lonhomework::default_type; return $result; } @@ -3240,7 +2504,7 @@ sub start_problemtype { ['hide','Hide']] ,$token); $result .=&Apache::edit::checked_arg('When used as type(s):','for', - [ ['exam','Exam/Quiz Problem'], + [ ['exam','Bubblesheet Exam/Quiz Problem'], ['survey','Survey'], ['surveycred','Survey (with credit)'], ['anonsurvey','Anonymous Survey'], @@ -3283,18 +2547,13 @@ sub end_startouttext { if ($target eq 'edit') { my $areaid = 'homework_edit_'.$Apache::lonxml::curdepth; $text=&Apache::lonxml::get_all_text("endouttext",$parser,$style); - $result.=&Apache::edit::start_table($token)."
".&Apache::loncommon::insert_folding_button() - ." ".&mt('Text Block')."
".&mt('Text Block')."'.&mt('Delete?').' ' .&Apache::edit::deletelist($target,$token) .''; - if (&Apache::loncommon::nocodemirror()) { - $result.=&Apache::lonhtmlcommon::dragmath_button($areaid,1); - } else { - $result.=' '; - } - $result.='' + .&Apache::lonhtmlcommon::dragmath_button($areaid,1) + .'' .&Apache::edit::insertlist($target,$token) .'