[LON-CAPA-cvs] cvs: rat / lonuserstate.pm

www lon-capa-cvs@mail.lon-capa.org
Mon, 24 Jun 2002 14:09:49 -0000


www		Mon Jun 24 10:09:49 2002 EDT

  Modified files:              
    /rat	lonuserstate.pm 
  Log:
  Towards bug 150.
  
  Puts "randomout_(resID)" into coursemap hash for resources that are
  randomly NOT selected based on randompick parameter.
  
  
Index: rat/lonuserstate.pm
diff -u rat/lonuserstate.pm:1.28 rat/lonuserstate.pm:1.29
--- rat/lonuserstate.pm:1.28	Mon Jun 17 12:40:24 2002
+++ rat/lonuserstate.pm	Mon Jun 24 10:09:49 2002
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Construct and maintain state and binary representation of course for user
 #
-# $Id: lonuserstate.pm,v 1.28 2002/06/17 16:40:24 www Exp $
+# $Id: lonuserstate.pm,v 1.29 2002/06/24 14:09:49 www Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -67,7 +67,7 @@
 my @cond;    # Array with all of the conditions
 my $errtext; # variable with all errors
 my $retfurl; # variable with the very first URL in the course
-
+my %randompick; # randomly picked resources
 # --------------------------------------------------------- Loads map from disk
 
 sub loadmap { 
@@ -233,9 +233,12 @@
                     } else {
                         $hash{'param_'.$referid}=''.$newparam;
                     }
-                    if ($token->[2]->{'name'} eq 'mapalias') {
+                    if ($token->[2]->{'name'} eq 'parameter_mapalias') {
 			$hash{'mapalias_'.$token->[2]->{'value'}}=$referid;
                     }
+                    if ($token->[2]->{'name'} eq 'parameter_randompick') {
+			$randompick{$referid}=$token->[2]->{'value'};
+                    }
                 } 
 
             }
@@ -275,7 +278,12 @@
     unless ($beenhere=~/\&$rid\&/) {
        $beenhere.=$rid.'&';  
        if ($retfurl eq '') {
-           $retfurl=$hash{'src_'.$rid};
+           my ($mapid,$resid)=split(/\./,$rid);
+           $retfurl=$hash{'src_'.$rid}.'?symb='.
+           &Apache::lonnet::symbclean(
+                           &Apache::lonnet::declutter($hash{'map_id_'.$mapid}).
+                           '___'.$resid.'___'.
+                           &Apache::lonnet::declutter($hash{'src_'.$rid}));
        }
        if (defined($hash{'conditions_'.$rid})) {
 	   $hash{'conditions_'.$rid}=simplify(
@@ -398,6 +406,40 @@
                             "request.course.uri" => $courseuri); 
 }
 
+# ------------------------------------- Selectively delete from randompick maps
+
+sub pickrandom {
+    foreach my $rid (keys %randompick) {
+        my $rndpick=$randompick{$rid};
+        my $mpc=$hash{'map_pc_'.$hash{'src_'.$rid}};
+# ------------------------------------------- put existing resources into array
+        my @currentrids=();
+        foreach (keys %hash) {
+	    if ($_=~/^src_($mpc\.\d+)/) {
+		if ($hash{'src_'.$1}) { push @currentrids, $1; }
+            }
+        }
+        next if ($#currentrids<$rndpick);
+# -------------------------------- randomly eliminate the ones that should stay
+	srand(&Apache::lonnet::rndseed($rid)); # use rid instead of symb
+        for (my $i=1;$i<=$#currentrids+1-$rndpick;$i++) {
+            while (1) {
+		my $randomidx=int(rand($#currentrids+1));
+                if ($currentrids[$randomidx]) {
+		    $currentrids[$randomidx]='';
+                    last;
+                }
+            }
+        }
+# -------------------------------------------------------- delete the leftovers
+        for (my $k=0; $k<=$#currentrids; $k++) {
+            if ($currentrids[$k]) {
+		$hash{'randomout_'.$currentrids[$k]}=1;
+            }
+        }
+    }
+}
+
 # ---------------------------------------------------- Read map and all submaps
 
 sub readmap {
@@ -417,6 +459,7 @@
    unlink($fn.'_symb.db');
    unlink($fn.'.state');
    unlink($fn.'parms.db');
+   undef %randompick;
    $retfurl='';
    if ((tie(%hash,'GDBM_File',"$fn.db",&GDBM_WRCREAT,0640)) &&
        (tie(%parmhash,'GDBM_File',$fn.'_parms.db',&GDBM_WRCREAT,0640))) {
@@ -428,6 +471,7 @@
     if (defined($hash{'map_start_'.$uri})) {
         &traceroute('0',$hash{'map_start_'.$uri},'&');
         &accinit($uri,$short,$fn);
+        &pickrandom();
     }
     unless ((untie(%hash)) && (untie(%parmhash))) {
       &Apache::lonnet::logthis("<font color=blue>WARNING: ".