--- loncom/homework/structuretags.pm 2018/12/26 19:40:04 1.562 +++ loncom/homework/structuretags.pm 2019/11/04 20:47:18 1.567 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # definition of tags that give a structure to a document # -# $Id: structuretags.pm,v 1.562 2018/12/26 19:40:04 raeburn Exp $ +# $Id: structuretags.pm,v 1.567 2019/11/04 20:47:18 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -366,12 +366,12 @@ var postsubmit = '$postsubmit'; submithandled = 1; \$( "#msg_"+buttonId ).css({"display": "inline","background-color": "#87cefa", "color": "black","padding": "2px"}) ; - if (( \$(this.form).id == "LC_page" ) && (\$('input[name="all_submit"]').length )) { + if (( \$(this.form).attr("id") == "LC_page" ) && (\$('input[name="all_submit"]').length )) { if (buttonId != "all_submit") { \$( ".LC_status_"+buttonId ).hide(); - if (( "#"+buttonId+"_pressed" ).length) { - \$( "#"+buttonId+"_pressed" ).val( "1" ); - } + } + if (( "#"+buttonId+"_pressed" ).length) { + \$( "#"+buttonId+"_pressed" ).val( "1" ); } } else { \$( ".LC_status_"+buttonId ).hide(); @@ -384,11 +384,9 @@ var postsubmit = '$postsubmit'; if (timeout > 0) { setTimeout(function(){ \$( "#msg_"+buttonId ).css({"display": "none"}); - if (( \$(this.form).id == "LC_page" ) && (\$('input[name="all_submit"]').length )) { - if (buttonId != "all_submit") { - if (( "#"+buttonId+"_pressed" ).length) { - \$( "#"+buttonId+"_pressed" ).val( "" ); - } + if (( \$(this.form).attr("id") == "LC_page" ) && (\$('input[name="all_submit"]').length )) { + if (( "#"+buttonId+"_pressed" ).length) { + \$( "#"+buttonId+"_pressed" ).val( "" ); } } \$( ".LC_hwk_submit" ).prop( "disabled", false); @@ -671,13 +669,30 @@ sub get_resource_name { sub setup_rndseed { my ($safeeval,$target,$probpartlist)=@_; my ($symb)=&Apache::lonnet::whichuser(); - my ($questiontype,$set_safespace,$rndseed); + my ($questiontype,$set_safespace,$rndseed,$numtries,$reqtries); 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; + if (ref($probpartlist) eq 'ARRAY') { + if ((@{$probpartlist} == 1) && ($probpartlist->[0] ne $Apache::inputtags::part)) { + $partfortries = $probpartlist->[0]; + if (&Apache::lonnet::EXT("resource.$partfortries.questiontype") 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') @@ -695,11 +710,15 @@ sub setup_rndseed { $env{'form.rndseed'}=$rndseed; } } - if (($env{'request.state'} eq "construct") && + if ((($env{'request.state'} eq "construct") || ($symb eq '')) && ($Apache::lonhomework::type eq 'randomizetry')) { - my $tries = $Apache::lonhomework::history{"resource.$Apache::inputtags::part.tries"}; - if ($tries) { - $rndseed += $tries; + if ($numtries) { + if (($reqtries =~ /^\d+$/) && ($reqtries > 1)) { + my $inc = int($numtries/$reqtries); + $rndseed += $inc; + } else { + $rndseed += $numtries; + } } $env{'form.'.$Apache::inputtags::part.'.rndseed'}=$rndseed; } @@ -737,13 +756,7 @@ sub setup_rndseed { } unless (($target eq 'analyze') && (defined($rndseed))) { $rndseed=&Apache::lonnet::rndseed(); - my $partfortries = $Apache::inputtags::part; - if (ref($probpartlist) eq 'ARRAY') { - if ((@{$probpartlist} == 1) && ($probpartlist->[0] ne $Apache::inputtags::part)) { - $partfortries = $probpartlist->[0]; - } - } - my $curr_try = $Apache::lonhomework::history{"resource.$partfortries.tries"}; + my $curr_try = $numtries; if ($Apache::inputtags::status[-1] eq 'CAN_ANSWER') { $curr_try ++; } @@ -751,7 +764,6 @@ sub setup_rndseed { $rndseed = $1; } if ($curr_try) { - my $reqtries = &Apache::lonnet::EXT("resource.$partfortries.randomizeontries"); if (($reqtries =~ /^\d+$/) && ($reqtries > 1)) { my $inc = int(($curr_try-1)/$reqtries); $rndseed += $inc; @@ -1661,6 +1673,7 @@ sub init_problem_globals { @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); @@ -1684,6 +1697,7 @@ 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(); @@ -1843,8 +1857,12 @@ sub start_problem { 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.=''. + $rndseedval.'" />'. ''; if (exists($env{'form.username'})) { @@ -1866,15 +1884,22 @@ sub start_problem { $form_tag_start.=&practice_problem_header(); } $form_tag_start.='
'; - } elsif (($env{'request.state'} ne "construct") && - ($Apache::lonhomework::type eq 'randomizetry') && - ($status eq 'CAN_ANSWER') && - ($env{'course.'.$env{'request.course.id'}.'.type'} ne 'Placement') && - (!$env{'request.role.adv'})) { + } + if (($env{'request.state'} ne "construct") && + ($Apache::lonhomework::type eq 'randomizetry') && + ($status eq 'CAN_ANSWER') && + ($env{'course.'.$env{'request.course.id'}.'.type'} ne 'Placement') && + (!$env{'request.role.adv'})) { # "New Problem Variation Each Try" header suppressed for Placement Tests, unless course personnel. - my $reqtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::part.randomizeontries"); - my $problemstatus = &get_problem_status($Apache::inputtags::part); - $form_tag_start.=&randomizetry_problem_header($problemstatus,$reqtries); + my @parts; + if (ref($probpartlist) eq 'ARRAY') { + @parts = @{$probpartlist}; + } + unless (@parts) { + my $reqtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::part.randomizeontries"); + my $problemstatus = &get_problem_status($Apache::inputtags::part); + $form_tag_start.=&randomizetry_problem_header($problemstatus,$reqtries,$symb); + } } my $expression='$external::datestatus="'.$status.'";'; @@ -1932,6 +1957,10 @@ sub start_problem { $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 @@ -2163,7 +2192,24 @@ sub end_problem { } } if ($target eq 'web') { - $result.=&Apache::functionplotresponse::init_script(); + $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 + } + } + } } if ($target eq 'grade') { &Apache::lonhomework::showhash(%Apache::lonhomework::results); @@ -2963,20 +3009,14 @@ 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"); + 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"); $result .= &randomizetry_part_header($problemstatus,$reqtries,$num); } } @@ -3296,7 +3336,7 @@ sub practice_problem_header { } sub randomizetry_problem_header { - my ($problemstatus,$reqtries) = @_; + my ($problemstatus,$reqtries,$symb) = @_; my ($header,$text); if ($reqtries > 1) { $header = &mt('New Problem Variation After Every [quant,_1,Try,Tries]',$reqtries); @@ -3316,8 +3356,13 @@ sub randomizetry_problem_header { $text = &mt('A new variation will be generated after each try until correct or tries limit is reached.'); } } - return '

'.$header.'

'. - ''.$text.'
'; + if (($env{'request.state'} eq "construct") || ($symb eq '')) { + return ''; + } else { + return '

'.$header.'

'. + ''.$text.'
'; + } } sub randomizetry_part_header {