--- loncom/homework/structuretags.pm 2010/11/03 17:06:28 1.478 +++ loncom/homework/structuretags.pm 2011/07/04 13:01:57 1.490 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # definition of tags that give a structure to a document # -# $Id: structuretags.pm,v 1.478 2010/11/03 17:06:28 raeburn Exp $ +# $Id: structuretags.pm,v 1.490 2011/07/04 13:01:57 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -128,6 +128,7 @@ sub homework_js { &setmode_javascript(). <<'JS'; JS } @@ -153,49 +154,55 @@ JS sub setmode_javascript { return <<"ENDSCRIPT"; ENDSCRIPT } sub file_delchk_js { - my $delfilewarn = &mt('You have indicated you wish to delete some files previously included for submission.').'\\n'. - &mt('Deleted files will not be graded.').' '. - &mt('Submit Answer?'); + my $delfilewarn = &mt('You have indicated you wish to remove some files previously included in your submission.').'\\n'. + &mt('Continue submission with these files removed?'); return <<"ENDSCRIPT"; ENDSCRIPT } @@ -364,9 +371,15 @@ sub get_resource_name { } sub setup_rndseed { - my ($safeeval)=@_; - my $rndseed; + my ($safeeval,$target)=@_; my ($symb)=&Apache::lonnet::whichuser(); + my ($questiontype,$set_safespace,$rndseed); + if ($target eq 'analyze') { + $questiontype = $env{'form.grade_questiontype'}; + } + unless (defined($questiontype)) { + $questiontype = $Apache::lonhomework::type; + } if ($env{'request.state'} eq "construct" || $symb eq '' || $Apache::lonhomework::type eq 'practice' @@ -381,6 +394,14 @@ sub setup_rndseed { } $env{'form.rndseed'}=$rndseed; } + if (($env{'request.state'} eq "construct") && + ($Apache::lonhomework::type eq 'randomizetry')) { + 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 &mt('New Problem Variation') && $env{'form.submitted'} eq 'yes') || $env{'form.newrandomization'} eq &mt('New Randomization')) { @@ -390,16 +411,54 @@ sub setup_rndseed { delete($env{'form.resetdata'}); delete($env{'form.newrandomization'}); } - if (defined($rndseed) && $rndseed ne int($rndseed)) { - $rndseed=join(':',&Apache::lonnet::digest($rndseed)); + $rndseed=~s/\,/\:/g; + $rndseed=~s/[^\w\d\:\-]//g; + if (defined($rndseed)) { + my ($c1,$c2)=split(/\:/,$rndseed); + unless ($c2) { $c2=0; } + unless (($c1==int($c1)) && ($c2==int($c2))) { + $rndseed=join(':',&Apache::lonnet::digest($rndseed)); + } } if ($Apache::lonhomework::history{'resource.CODE'}) { $rndseed=&Apache::lonnet::rndseed(); } - if ($safeeval) { - &Apache::lonxml::debug("Setting rndseed to $rndseed"); - &Apache::run::run('$external::randomseed="'.$rndseed.'";',$safeeval); - } + $set_safespace = 1; + } elsif ($questiontype eq 'randomizetry') { + if ($target eq 'analyze') { + if (defined($env{'form.grade_rndseed'})) { + $rndseed = $env{'form.grade_rndseed'}; + } + } + unless (($target eq 'analyze') && (defined($rndseed))) { + $rndseed=&Apache::lonnet::rndseed(); + my $curr_try = $Apache::lonhomework::history{"resource.$Apache::inputtags::part.tries"}; + if ($Apache::inputtags::status[-1] eq 'CAN_ANSWER') { + $curr_try ++; + } + if ($rndseed =~/^(\d+)[,:](\d+)$/) { + $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; + } else { + $rndseed += $curr_try; + } + } + } + $set_safespace = 1; + } + if ($set_safespace) { + if ($safeeval) { + &Apache::lonxml::debug("Setting rndseed to $rndseed"); + &Apache::run::run('$external::randomseed="'.$rndseed.'";',$safeeval); + } + } + unless (($env{'request.state'} eq "construct") || ($symb eq '')) { + $env{'form.'.$Apache::inputtags::part.'.rndseed'}=$rndseed; } return $rndseed; } @@ -411,27 +470,48 @@ sub remember_problem_state { '; } +sub problem_edit_action_button { + my ($name,$action,$accesskey,$text,$flag)=@_; + my $actionscript="setmode(this.form,'$action')"; + return "\n"; +} + sub problem_edit_buttons { - return ' -
- - - -
-
- - -
'; + my ($mode)=@_; +# Buttons that do not save + my $result='
'. + &problem_edit_action_button('subdiscview','discard','d','Discard Edits and View',1); + if ($mode eq 'editxml') { + $result.=&problem_edit_action_button('subedit','edit','e','Edit',1); + $result.=&problem_edit_action_button('subundo','undoxml','u','Undo',1); + $result.=&Apache::lonhtmlcommon::dragmath_button("LC_editxmltext",1); + } else { + $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 { - return ''. - &Apache::structuretags::remember_problem_state().' + return ''. + &remember_problem_state('edit').'
'.&mt('Problem Editing').&Apache::loncommon::help_open_menu('Problem Editing','Problem_Editor_XML_Index',5,'Authoring').'
'. +''. &problem_edit_buttons().'
'.&Apache::lonxml::message_location().' @@ -517,6 +597,7 @@ sub problem_web_to_edit_header { ".&option('anonsurvey' ,'problemtype').&mt("Anonymous Survey Question")." ".&option('anonsurveycred' ,'problemtype').&mt("Anonymous Survey Question (with credit)")." ".&option('practice' ,'problemtype').&mt("Practice Problem")." + ".&option('randomizetry' ,'problemtype').&mt("New Randomization Each Try")." $show_all @@ -567,7 +648,7 @@ $show_all
- '; @@ -694,7 +775,7 @@ item store_aggregates() sub store_aggregates { my ($symb,$courseid) = @_; - my (%aggregate,%anoncounter); + my (%aggregate,%anoncounter,%randtrycounter); my @parts; my $cdomain = $env{'course.'.$env{'request.course.id'}.'.domain'}; my $cname = $env{'course.'.$env{'request.course.id'}.'.num'}; @@ -724,8 +805,13 @@ sub store_aggregates { $aggregate{$symb."\0".$part."\0attempts"} = 1; } if (($Apache::lonhomework::results{'resource.'.$part.'.type'} eq 'anonsurvey') || - ($Apache::lonhomework::results{'resource.'.$part.'.type'} eq 'anonsurveycred')) { - $anoncounter{$symb."\0".$part} = 1; + ($Apache::lonhomework::results{'resource.'.$part.'.type'} eq 'anonsurveycred') || + ($Apache::lonhomework::results{'resource.'.$part.'.type'} eq 'randomizetry')) { + if ($Apache::lonhomework::results{'resource.'.$part.'.type'} eq 'randomizetry') { + $randtrycounter{$symb."\0".$part} = 1; + } else { + $anoncounter{$symb."\0".$part} = 1; + } my $needsrelease = $Apache::lonnet::needsrelease{'parameter:type:'.$Apache::lonhomework::results{'resource.'.$part.'.type'}}; if ($needsrelease) { my $curr_required = $env{'course.'.$env{'request.course.id'}.'.internal.releaserequired'}; @@ -746,8 +832,12 @@ sub store_aggregates { $cdomain,$cname); } if (keys(%anoncounter) > 0) { - &Apache::lonnet::cinc('nohist_anonsurveys',\%anoncounter, - $cdomain,$cname); + &Apache::lonnet::cput('nohist_anonsurveys',\%anoncounter, + $cdomain,$cname); + } + if (keys(%randtrycounter) > 0) { + &Apache::lonnet::cput('nohist_randomizetry',\%randtrycounter, + $cdomain,$cname); } } @@ -958,16 +1048,22 @@ sub start_problem { if ($target eq 'tex' and $env{'request.symb'} =~ m/\.page_/) {$result='';} - if ($target eq 'analyze') { my $rndseed=&setup_rndseed($safeeval); } + if ($target eq 'analyze') { my $rndseed=&setup_rndseed($safeeval,$target); } 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"); &Apache::lonnet::set_first_access($interval[1]); } + + ($status,$accessmsg,my $slot_name,my $slot) = + &Apache::lonhomework::check_slot_access('0','problem'); + push (@Apache::inputtags::status,$status); + #handle rand seed in construction space - my $rndseed=&setup_rndseed($safeeval); + my $rndseed=&setup_rndseed($safeeval,$target); my ($symb)=&Apache::lonnet::whichuser(); + if ($env{'request.state'} ne "construct" && ($symb eq '' || $Apache::lonhomework::type eq 'practice')) { $form_tag_start.=''."\n"; } + foreach my $field ('trial','questiontype') { + if ($env{"form.grade_$field"} ne '') { + $result .= ''."\n"; + } + } } + if ($env{'form.grade_imsexport'}) { + $result = ''; + } } elsif ($target eq 'tex') { $result .= 'INSERTTEXFRONTMATTERHERE'; @@ -1217,7 +1324,8 @@ sub end_problem { } } elsif ( ($target eq 'web' || $target eq 'tex') && $Apache::inputtags::part eq '0' && - $status ne 'UNCHECKEDOUT' && $status ne 'NOT_YET_VIEWED') { + $status ne 'UNCHECKEDOUT' && $status ne 'NOT_YET_VIEWED' + && !$env{'form.grade_imsexport'}) { # if part is zero, no s existed, so we need show the current # grading status my $gradestatus = &Apache::inputtags::gradestatus($Apache::inputtags::part,$target); @@ -1227,8 +1335,9 @@ sub end_problem { (($target eq 'web') && ($env{'request.state'} ne 'construct')) || ($target eq 'answer') || ($target eq 'tex') ) { - if ($target ne 'tex' && - $env{'form.answer_output_mode'} ne 'tex') { + if (($target ne 'tex') && + ($env{'form.answer_output_mode'} ne 'tex') && + (!$env{'form.grade_imsexport'})) { $result.=""; } if ($target eq 'web') { @@ -1310,7 +1419,7 @@ sub start_library { ($result,$form_tag_start)= &page_start($target,$token,$tagstack,$parstack,$parser,$safeeval, $name); - my $rndseed=&setup_rndseed($safeeval); + my $rndseed=&setup_rndseed($safeeval,$target); $result.=" \n $form_tag_start". ''; $result.=&problem_web_to_edit_header($rndseed); @@ -1886,6 +1995,25 @@ 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 ($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); + } + } $result.=''; } } @@ -1932,7 +2060,8 @@ sub end_part { !$hidden && $in_order_show) { my $gradestatus=&Apache::inputtags::gradestatus($Apache::inputtags::part, $target); - if ($Apache::lonhomework::type eq 'exam' && $target eq 'tex') { + if (($Apache::lonhomework::type eq 'exam' && $target eq 'tex') || + ($env{'form.grade_imsexport'})) { $gradestatus=''; } $result.=$gradestatus; @@ -2057,7 +2186,8 @@ sub start_problemtype { ['anonsurvey','Anonymous Survey'], ['anonsurveycred','Anonymous Survey (with credit)'], ['problem','Homework Problem'], - ['practice','Practice Problem'] ] + ['practice','Practice Problem'], + ['randomizetry','New Randomization Each Try'] ] ,$token); $result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row(); } elsif ($target eq 'modified') { @@ -2172,11 +2302,12 @@ sub start_simpleeditbutton { # .&mt('Note: it can take up to 10 minutes for changes to take effect for all users.') # .&Apache::loncommon::help_open_topic('Caching') # .'

'; - $result.=&Apache::lonhtmlcommon::start_funclist() + $result.=&Apache::loncommon::head_subbox( + &Apache::lonhtmlcommon::start_funclist() .&Apache::lonhtmlcommon::add_item_funclist( '' .&mt('Edit').'') - .&Apache::lonhtmlcommon::end_funclist(); + .&Apache::lonhtmlcommon::end_funclist()); } return $result; @@ -2192,6 +2323,63 @@ sub practice_problem_header { ''; } +sub randomizetry_problem_header { + my ($problemstatus,$reqtries) = @_; + my ($header,$text); + if ($reqtries > 1) { + $header = &mt('New Problem Variation After Every [quant,_1,Try,Tries]',$reqtries); + if (($problemstatus eq 'no') || + ($problemstatus eq 'no_feedback_ever')) { + $text = &mt('A new variation will be generated after every [quant,_1,try,tries], until the tries limit is reached.',$reqtries); + } else { + $text = &mt('A new variation will be generated after every [quant,_1,try,tries], until correct or tries limit is reached.',$reqtries); + } + } else { + $header = &mt('New Problem Variation Each Try'); + if (($problemstatus eq 'no') || + ($problemstatus eq 'no_feedback_ever')) { + $text = &mt('A new variation will be generated after each try until the tries limit is reached.'); + + } else { + $text = &mt('A new variation will be generated after each try until correct or tries limit is reached.'); + } + } + return '

'.$header.'

'. + ''.$text.'
'; +} + +sub randomizetry_part_header { + my ($problemstatus,$reqtries,$num) = @_; + my ($header,$text); + if ($reqtries eq 'none') { + $header = &mt('No Question Variation'); + $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') || + ($problemstatus eq 'no_feedback_ever')) { + $text = &mt('For this question a new variation will be generated after every [quant,_1,try,tries], until the tries limit is reached.',$reqtries); + } else { + $text = &mt('For this question a new variation will be generated after every [quant,_1,try,tries], until correct or tries limit is reached.',$reqtries); + } + } else { + $header = &mt('New Question Variation For Each Try'); + if (($problemstatus eq 'no') || + ($problemstatus eq 'no_feedback_ever')) { + $text = &mt('For this question a new variation will be generated after each try until the tries limit is reached.'); + } else { + $text = &mt('For this question a new variation will be generated after each try until correct or tries limit is reached.'); + } + } + my $output; + if ($num > 1) { + $output .= '
'; + } + $output .= '

'.$header.'

'. + ''.$text.'

'; + return $output; +} + 1; __END__