--- loncom/homework/structuretags.pm 2019/11/04 19:36:46 1.566 +++ loncom/homework/structuretags.pm 2019/11/07 02:58:37 1.570 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # definition of tags that give a structure to a document # -# $Id: structuretags.pm,v 1.566 2019/11/04 19:36:46 raeburn Exp $ +# $Id: structuretags.pm,v 1.570 2019/11/07 02:58:37 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -667,7 +667,7 @@ sub get_resource_name { } sub setup_rndseed { - my ($safeeval,$target,$probpartlist)=@_; + my ($safeeval,$target,$probpartlist,$prevparttype)=@_; my ($symb)=&Apache::lonnet::whichuser(); my ($questiontype,$set_safespace,$rndseed,$numtries,$reqtries); if ($target eq 'analyze') { @@ -678,10 +678,18 @@ sub setup_rndseed { } 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 $Apache::inputtags::part)) { - $partfortries = $probpartlist->[0]; - if (&Apache::lonnet::EXT("resource.$partfortries.questiontype") eq 'randomizetry') { + if ((@{$probpartlist} == 1) && ($probpartlist->[0] ne $partfortries)) { + if (&Apache::lonnet::EXT('resource.'.$probpartlist->[0].'.type') eq 'randomizetry') { $partfortries = $probpartlist->[0]; } else { $partfortries = ''; @@ -776,11 +784,20 @@ sub setup_rndseed { if ($target eq 'grade') { $Apache::lonhomework::rawrndseed = $rndseed; } + } elsif ($prevparttype eq 'randomizetry') { + if ($env{'form.0.rndseed'} ne '') { + $set_safespace = 1; + $rndseed = $env{'form.0.rndseed'}; + } } if ($set_safespace) { if ($safeeval) { &Apache::lonxml::debug("Setting rndseed to $rndseed"); &Apache::run::run('$external::randomseed="'.$rndseed.'";',$safeeval); + if (($Apache::lonhomework::type eq 'randomizetry') || ($prevparttype eq 'randomizetry')) { + &Apache::lonxml::debug("Setting randomizetrypart to $Apache::inputtags::part"); + &Apache::run::run('$external::randomizetrypart="'.$Apache::inputtags::part.'";',$safeeval); + } } } unless (($env{'request.state'} eq "construct") || ($symb eq '')) { @@ -1814,11 +1831,13 @@ sub start_problem { } elsif ((($target eq 'grade') && ($Apache::lonhomework::type eq 'randomizetry')) || ($target eq 'answer')) { my ($symb)= &Apache::lonnet::whichuser(); - my $navmap = Apache::lonnavmaps::navmap->new(); - if (ref($navmap)) { - my $res = $navmap->getBySymb($symb); - if (ref($res)) { - $probpartlist = $res->parts(); + if ($symb ne '') { + my $navmap = Apache::lonnavmaps::navmap->new(); + if (ref($navmap)) { + my $res = $navmap->getBySymb($symb); + if (ref($res)) { + $probpartlist = $res->parts(); + } } } } @@ -1838,7 +1857,14 @@ sub start_problem { 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') { @@ -1853,7 +1879,6 @@ sub start_problem { } } } - my ($symb)=&Apache::lonnet::whichuser(); if ($env{'request.state'} ne "construct" && ($symb eq '' || $Apache::lonhomework::type eq 'practice')) { @@ -1884,7 +1909,7 @@ sub start_problem { $form_tag_start.=&practice_problem_header(); } $form_tag_start.='
'; - } + } if (($env{'request.state'} ne "construct") && ($Apache::lonhomework::type eq 'randomizetry') && ($status eq 'CAN_ANSWER') && @@ -2934,6 +2959,14 @@ sub start_part { if (($target eq 'grade') && &Apache::response::submitted()) { $Apache::lonhomework::results{"resource.$id.rndseed"}=$rndseed; } + } elsif (@Apache::inputtags::partlist > 1) { + my $prevparttype = &Apache::lonnet::EXT("resource.$Apache::inputtags::partlist[-2].type"); + if ($prevparttype eq 'randomizetry') { + my $rndseed=&setup_rndseed($safeeval,$target,'',$prevparttype); + 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; } @@ -3009,10 +3042,9 @@ 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') || ($Apache::lonhomework::randomizetrypart)) && + 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') { @@ -3371,7 +3403,7 @@ sub randomizetry_part_header { 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.'); + $text = &mt('For this question there will be 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') ||