--- loncom/homework/structuretags.pm 2019/10/31 16:14:09 1.512.2.19 +++ loncom/homework/structuretags.pm 2019/11/05 18:14:39 1.512.2.22 @@ -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.19 2019/10/31 16:14:09 raeburn Exp $ +# $Id: structuretags.pm,v 1.512.2.22 2019/11/05 18:14:39 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -652,13 +652,28 @@ 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 ((@{$probpartlist} == 1) && ($probpartlist->[0] ne $partfortries)) { + if (&Apache::lonnet::EXT('resource.'.$probpartlist->[0].'.type') eq 'randomizetry') { + $partfortries = $probpartlist->[0]; + } else { + $partfortries = ''; + } } } - $numtries = $Apache::lonhomework::history{"resource.$partfortries.tries"}; - $reqtries = &Apache::lonnet::EXT("resource.$partfortries.randomizeontries"); + 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 '') @@ -677,7 +692,7 @@ 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')) { if ($numtries) { if (($reqtries =~ /^\d+$/) && ($reqtries > 1)) { @@ -1417,6 +1432,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); @@ -1440,6 +1456,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(); @@ -1557,11 +1574,13 @@ sub start_problem { $name); } elsif (($target eq 'grade') && ($Apache::lonhomework::type eq 'randomizetry')) { 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(); + } } } } @@ -1572,7 +1591,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') { @@ -1587,12 +1613,15 @@ sub start_problem { } } } - 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.=''. + $rndseedval.'" />'. ''; if (exists($env{'form.username'})) { @@ -1614,12 +1643,19 @@ sub start_problem { $form_tag_start.=&practice_problem_header(); } $form_tag_start.='