[LON-CAPA-cvs] cvs: loncom /homework structuretags.pm

raeburn raeburn@source.lon-capa.org
Sat, 18 Dec 2010 22:49:33 -0000


This is a MIME encoded message

--raeburn1292712573
Content-Type: text/plain

raeburn		Sat Dec 18 22:49:33 2010 EDT

  Modified files:              
    /loncom/homework	structuretags.pm 
  Log:
  - New Question Type - randomizetry
     - New Variation displayed after N tries (default N=1).
  - New Parameter - randomizeontries (sets N for randomizetry).
    - Implemented by incrementing randseed in &setup_rndseed.   
  
  
--raeburn1292712573
Content-Type: text/plain
Content-Disposition: attachment; filename="raeburn-20101218224933.txt"

Index: loncom/homework/structuretags.pm
diff -u loncom/homework/structuretags.pm:1.478 loncom/homework/structuretags.pm:1.479
--- loncom/homework/structuretags.pm:1.478	Wed Nov  3 17:06:28 2010
+++ loncom/homework/structuretags.pm	Sat Dec 18 22:49:33 2010
@@ -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.479 2010/12/18 22:49:33 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -364,9 +364,15 @@
 }
 
 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 +387,13 @@
 	    }
 	    $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;
+            }
+        }
 	if ( ($env{'form.resetdata'} eq &mt('New Problem Variation')
 	      && $env{'form.submitted'} eq 'yes')  ||
 	    $env{'form.newrandomization'} eq &mt('New Randomization')) {
@@ -396,10 +409,42 @@
         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;
 }
@@ -517,6 +562,7 @@
   ".&option('anonsurvey' ,'problemtype').&mt("Anonymous Survey Question")."</option>
   ".&option('anonsurveycred' ,'problemtype').&mt("Anonymous Survey Question (with credit)")."</option>
   ".&option('practice' ,'problemtype').&mt("Practice Problem")."</option>
+  ".&option('randomizetry' ,'problemtype').&mt("New Randomization Each Try")."</option>
 </select>
 </span>
 $show_all
@@ -671,6 +717,13 @@
 					      $namespace,'',$domain,$name);
 	    &Apache::lonxml::debug('Construct Store return message:'.$result);
 	} else {
+            if ($Apache::lonhomework::type eq 'randomizetry') {
+                foreach my $key (keys(%Apache::lonhomework::results)) {
+                    if ($key =~ /^resource\.([^\.]+)\.tries/) {
+                        $Apache::lonhomework::results{'resource.'.$1.'.rndseed'}=$env{'form.'.$1.'.rndseed'};
+                    }
+                }
+            }
 	    $result=&Apache::lonnet::cstore(\%Apache::lonhomework::results,
 					    $symb,$courseid,$domain,$name);
 	    &Apache::lonxml::debug('Store return message:'.$result);
@@ -694,7 +747,7 @@
 
 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 +777,13 @@
             $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'};
@@ -749,6 +807,10 @@
         &Apache::lonnet::cinc('nohist_anonsurveys',\%anoncounter,
                             $cdomain,$cname);
     }
+    if (keys(%randtrycounter) > 0) {
+        &Apache::lonnet::cinc('nohist_randomizetry',\%randtrycounter,
+                            $cdomain,$cname);
+    }
 }
 
 sub checkout_msg {
@@ -958,16 +1020,22 @@
 
     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.='<input type="hidden" name="rndseed" value="'.
@@ -993,11 +1061,13 @@
                 $form_tag_start.=&practice_problem_header();
             }
 	    $form_tag_start.='<hr />';
-	}
-
-	($status,$accessmsg,my $slot_name,my $slot) = 
-	    &Apache::lonhomework::check_slot_access('0','problem');
-	push (@Apache::inputtags::status,$status);
+        } elsif (($env{'request.state'} ne "construct") &&
+                 ($Apache::lonhomework::type eq 'randomizetry') &&
+                 ($status eq 'CAN_ANSWER')) {
+            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 $expression='$external::datestatus="'.$status.'";';
 	$expression.='$external::gradestatus="'.$Apache::lonhomework::history{"resource.0.solved"}.'";';
@@ -1078,6 +1148,12 @@
 		    $result .= '<input type="hidden" name="grade_'.$field.
 			'" value="'.$env{"form.grade_$field"}.'" />'."\n";
 		}
+                foreach my $field ('trial','questiontype') {
+                    if ($env{"form.grade_$field"} ne '') {
+                        $result .= '<input type="hidden" name="grade_'.$field.
+                            '" value="'.$env{"form.grade_$field"}.'" />'."\n";
+                    }
+                }
 	    }
 	} elsif ($target eq 'tex') {
 	    $result .= 'INSERTTEXFRONTMATTERHERE';
@@ -1310,7 +1386,7 @@
 	($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".	
 		  '<input type="hidden" name="submitted" value="yes" />';
 	$result.=&problem_web_to_edit_header($rndseed);
@@ -1886,6 +1962,25 @@
 
 		    }
 		} 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.='<a name="'.&escape($Apache::inputtags::part).'" ></a>';
 		}
 	    }
@@ -2057,7 +2152,8 @@
                                                ['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') {
@@ -2192,6 +2288,63 @@
            '</span>';
 }
 
+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 '<span class="LC_info"><h3>'.$header.'</h3></span>'.
+           '<span class="LC_info">'.$text.'</span><hr />';
+}
+
+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 .= '<hr />';
+    }
+    $output .=  '<span class="LC_info"><h4>'.$header.'</h4></span>'.
+                  '<span class="LC_info">'.$text.'</span><br /><br />';
+    return $output;
+}
+
 1;
 __END__
 

--raeburn1292712573--