--- loncom/homework/structuretags.pm 2019/08/11 12:27:11 1.563
+++ 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.563 2019/08/11 12:27:11 raeburn Exp $
+# $Id: structuretags.pm,v 1.567 2019/11/04 20:47:18 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -669,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')
@@ -693,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;
}
@@ -735,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 ++;
}
@@ -749,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;
@@ -1659,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);
@@ -1682,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();
@@ -1841,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'})) {
@@ -1864,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.'";';
@@ -1930,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
@@ -2161,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);
@@ -2961,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);
}
}
@@ -3294,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);
@@ -3314,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 ''.
+ '
'.$header.'
'.$text.'
';
+ } else {
+ return ''.$header.'
'.
+ ''.$text.'
';
+ }
}
sub randomizetry_part_header {