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

albertel lon-capa-cvs-allow@mail.lon-capa.org
Fri, 08 Jun 2007 19:33:06 -0000


This is a MIME encoded message

--albertel1181331186
Content-Type: text/plain

albertel		Fri Jun  8 15:33:06 2007 EDT

  Modified files:              (Branch: randomize)
    /rat	lonuserstate.pm 
  Log:
  - implements the internals for randomizing the order of resources in a map
     - works by ignoring all <link>s in the map, collecting the list 
       of resources and then <link>s them in a random order
       it throws all of that away and then makes a random linear map
     - works correctly with 'pick n resources'
     
     - TODO
        - currently always on and does all maps, needs conversion to using a parm
        - currently different ordering everytime you reinit a course
        - currently affects everyone 
      
     
  
  
--albertel1181331186
Content-Type: text/plain
Content-Disposition: attachment; filename="albertel-20070608153306.txt"

Index: rat/lonuserstate.pm
diff -u rat/lonuserstate.pm:1.118 rat/lonuserstate.pm:1.118.2.1
--- rat/lonuserstate.pm:1.118	Fri Jul  7 18:01:25 2006
+++ rat/lonuserstate.pm	Fri Jun  8 15:33:06 2007
@@ -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.118 2006/07/07 22:01:25 raeburn Exp $
+# $Id: lonuserstate.pm,v 1.118.2.1 2007/06/08 19:33:06 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -129,194 +129,230 @@
 
     my $instr=&Apache::lonnet::getfile($fn);
 
-    unless ($instr eq -1) {
+    if ($instr eq -1) {
+        $errtext.=&mt('<br />Map not loaded: The file <tt>[_1]</tt> does not exist.',$fn);
+	return;
+    }
 
 # Successfully got file, parse it
 
-        my $parser = HTML::TokeParser->new(\$instr);
-	$parser->attr_encoded(1);
-        my $token;
+    my $parser = HTML::TokeParser->new(\$instr);
+    $parser->attr_encoded(1);
 
-        my $linkpc=0;
+    my $linkpc=0;
 
-        $fn=~/\.(\w+)$/;
+    $fn=~/\.(\w+)$/;
 
-        $hash{'map_type_'.$lpc}=$1;
-
-        while ($token = $parser->get_token) {
-	    if ($token->[0] eq 'S') {
-                if ($token->[1] eq 'resource') {
-# -------------------------------------------------------------------- Resource
-                    if ($token->[2]->{'type'} eq 'zombie') { next; }
-                    my $rid=$lpc.'.'.$token->[2]->{'id'};
+    $hash{'map_type_'.$lpc}=$1;
 
-                    $hash{'kind_'.$rid}='res';
-                    $hash{'title_'.$rid}=$token->[2]->{'title'};
-                    my $turi=&versiontrack($token->[2]->{'src'});
-                    if ($token->[2]->{'version'}) {
-			unless ($hash{'version_'.$turi}) {
-			    $hash{'version_'.$turi}=$1;
-			}
-		    }
-		    my $title=$token->[2]->{'title'};
-		    $title=~s/\&colon\;/\:/gs;
-#		    my $symb=&Apache::lonnet::encode_symb($uri,
-#							  $token->[2]->{'id'},
-#							  $turi);
-#		    &Apache::lonnet::do_cache_new('title',$symb,$title);
-                    unless ($ispage) {
-                        $turi=~/\.(\w+)$/;
-                        my $embstyle=&Apache::loncommon::fileembstyle($1);
-                        if ($token->[2]->{'external'} eq 'true') { # external
-                            $turi=~s/^http\:\/\//\/adm\/wrapper\/ext\//;
-                        } elsif ($turi=~/^\/*uploaded\//) { # uploaded
-			    if (($embstyle eq 'img') 
-				|| ($embstyle eq 'emb')
-				|| ($embstyle eq 'wrp')) {
-                                $turi='/adm/wrapper'.$turi;
-			    } elsif ($embstyle eq 'ssi') {
-				#do nothing with these
-			    } elsif ($turi!~/\.(sequence|page)$/) {
-				$turi='/adm/coursedocs/showdoc'.$turi;
-                            }
-                        } elsif ($turi=~/\S/) { # normal non-empty internal resource
-			    my $mapdir=$uri;
-			    $mapdir=~s/[^\/]+$//;
-			    $turi=&Apache::lonnet::hreflocation($mapdir,$turi);
-			    if (($embstyle eq 'img') 
-				|| ($embstyle eq 'emb')
-				|| ($embstyle eq 'wrp')) {
-				$turi='/adm/wrapper'.$turi;
-			    }
-                        }
-		    }
-# Store reverse lookup, remove query string
-		    my $idsuri=$turi;
-		    $idsuri=~s/\?.+$//;
-                    if (defined($hash{'ids_'.$idsuri})) {
-                        $hash{'ids_'.$idsuri}.=','.$rid;
-                    } else {
-                        $hash{'ids_'.$idsuri}=''.$rid;
-                    }
-               
-                    if ($turi=~/\/(syllabus|aboutme|navmaps|smppg|bulletinboard)$/) {
-			$turi.='?register=1';
-		    }
+    my $randomize=1;
+    my @map_ids;
+    while (my $token = $parser->get_token) {
+	next if ($token->[0] ne 'S');
+	if ($token->[1] eq 'resource') {
+	    push(@map_ids,&parse_resource($token,$lpc,$ispage,$uri));
+	} elsif ($token->[1] eq 'link' && !$randomize) {
+# ----------------------------------------------------------------------- Links
+	    &make_link(++$linkpc,$lpc,$token->[2]->{'to'},
+		       $token->[2]->{'from'},
+		       $token->[2]->{'condition'});
+	} elsif ($token->[1] eq 'condition' && !$randomize) {
+	    &parse_condition($token,$lpc);
+	} elsif ($token->[1] eq 'param') {
+	    &parse_param($token,$lpc);
+	} 
+    }
+
+    if ($randomize) {
+	my @map_ids=&Math::Random::random_permutation(@map_ids);
+	my $from = shift(@map_ids);
+	my $from_rid = $lpc.'.'.$from;
+	$hash{'map_start_'.$uri} = $from_rid;
+	$hash{'type_'.$from_rid}='start';
+
+	while (my $to = shift(@map_ids)) {
+	    &make_link(++$linkpc,$lpc,$to,$from);
+	    my $to_rid =  $lpc.'.'.$to;
+	    $hash{'type_'.$to_rid}='normal';
+	    $from = $to;
+	    $from_rid = $to_rid;
+	}
 
-                    $hash{'src_'.$rid}=$turi;
+	$hash{'map_finish_'.$uri}= $from_rid;
+	$hash{'type_'.$from_rid}='finish';
+    }
+}
 
-                    if ($token->[2]->{'external'} eq 'true') {
-                        $hash{'ext_'.$rid}='true:';
-                    } else {
-                        $hash{'ext_'.$rid}='false:';
-                    }
-                    if ($token->[2]->{'type'}) {
-			$hash{'type_'.$rid}=$token->[2]->{'type'};
-                        if ($token->[2]->{'type'} eq 'start') {
-			    $hash{'map_start_'.$uri}="$rid";
-                        }
-                        if ($token->[2]->{'type'} eq 'finish') {
-			    $hash{'map_finish_'.$uri}="$rid";
-                        }
-                    }  else {
-                        $hash{'type_'.$rid}='normal';
-                    }
-
-                    if (($turi=~/\.sequence$/) ||
-                        ($turi=~/\.page$/)) {
-                        $hash{'is_map_'.$rid}=1;
-                        &loadmap($turi);
-                    } 
-                    
-                } elsif ($token->[1] eq 'condition') {
-# ------------------------------------------------------------------- Condition
 
-                    my $rid=$lpc.'.'.$token->[2]->{'id'};
+# -------------------------------------------------------------------- Resource
+sub parse_resource {
+    my ($token,$lpc,$ispage,$uri) = @_;
+    if ($token->[2]->{'type'} eq 'zombie') { next; }
+    my $rid=$lpc.'.'.$token->[2]->{'id'};
+	    
+    $hash{'kind_'.$rid}='res';
+    $hash{'title_'.$rid}=$token->[2]->{'title'};
+    my $turi=&versiontrack($token->[2]->{'src'});
+    if ($token->[2]->{'version'}) {
+	unless ($hash{'version_'.$turi}) {
+	    $hash{'version_'.$turi}=$1;
+	}
+    }
+    my $title=$token->[2]->{'title'};
+    $title=~s/\&colon\;/\:/gs;
+#   my $symb=&Apache::lonnet::encode_symb($uri,
+#					  $token->[2]->{'id'},
+#					  $turi);
+#   &Apache::lonnet::do_cache_new('title',$symb,$title);
+    unless ($ispage) {
+	$turi=~/\.(\w+)$/;
+	my $embstyle=&Apache::loncommon::fileembstyle($1);
+	if ($token->[2]->{'external'} eq 'true') { # external
+	    $turi=~s/^http\:\/\//\/adm\/wrapper\/ext\//;
+	} elsif ($turi=~/^\/*uploaded\//) { # uploaded
+	    if (($embstyle eq 'img') 
+		|| ($embstyle eq 'emb')
+		|| ($embstyle eq 'wrp')) {
+		$turi='/adm/wrapper'.$turi;
+	    } elsif ($embstyle eq 'ssi') {
+		#do nothing with these
+	    } elsif ($turi!~/\.(sequence|page)$/) {
+		$turi='/adm/coursedocs/showdoc'.$turi;
+	    }
+	} elsif ($turi=~/\S/) { # normal non-empty internal resource
+	    my $mapdir=$uri;
+	    $mapdir=~s/[^\/]+$//;
+	    $turi=&Apache::lonnet::hreflocation($mapdir,$turi);
+	    if (($embstyle eq 'img') 
+		|| ($embstyle eq 'emb')
+		|| ($embstyle eq 'wrp')) {
+		$turi='/adm/wrapper'.$turi;
+	    }
+	}
+    }
+# Store reverse lookup, remove query string
+    my $idsuri=$turi;
+    $idsuri=~s/\?.+$//;
+    if (defined($hash{'ids_'.$idsuri})) {
+	$hash{'ids_'.$idsuri}.=','.$rid;
+    } else {
+	$hash{'ids_'.$idsuri}=''.$rid;
+    }
+    
+    if ($turi=~/\/(syllabus|aboutme|navmaps|smppg|bulletinboard)$/) {
+	$turi.='?register=1';
+    }
+    
+    $hash{'src_'.$rid}=$turi;
+    
+    if ($token->[2]->{'external'} eq 'true') {
+	$hash{'ext_'.$rid}='true:';
+    } else {
+	$hash{'ext_'.$rid}='false:';
+    }
+    if ($token->[2]->{'type'}) {
+	$hash{'type_'.$rid}=$token->[2]->{'type'};
+	if ($token->[2]->{'type'} eq 'start') {
+	    $hash{'map_start_'.$uri}="$rid";
+	}
+	if ($token->[2]->{'type'} eq 'finish') {
+	    $hash{'map_finish_'.$uri}="$rid";
+	}
+    }  else {
+	$hash{'type_'.$rid}='normal';
+    }
+    
+    if (($turi=~/\.sequence$/) ||
+	($turi=~/\.page$/)) {
+	$hash{'is_map_'.$rid}=1;
+	&loadmap($turi);
+    } 
+    return $token->[2]->{'id'};
+}
 
-                    $hash{'kind_'.$rid}='cond';
-                    $cond[$#cond+1]=$token->[2]->{'value'};
-                    $hash{'condid_'.$rid}=$#cond;
-                    if ($token->[2]->{'type'}) {
-                        $cond[$#cond].=':'.$token->[2]->{'type'};
-                    }  else {
-                        $cond[$#cond].=':normal';
-                    }
+sub make_link {
+    my ($linkpc,$lpc,$to,$from,$condition) = @_;
+    
+    my $linkid=$lpc.'.'.$linkpc;
+    my $goesto=$lpc.'.'.$to;
+    my $comesfrom=$lpc.'.'.$from;
+    my $undercond=0;
+
+    if ($condition) {
+	$undercond=$lpc.'.'.$condition;
+    }
+
+    $hash{'goesto_'.$linkid}=$goesto;
+    $hash{'comesfrom_'.$linkid}=$comesfrom;
+    $hash{'undercond_'.$linkid}=$undercond;
 
-                } elsif ($token->[1] eq 'link') {
-# ----------------------------------------------------------------------- Links
+    if (defined($hash{'to_'.$comesfrom})) {
+	$hash{'to_'.$comesfrom}.=','.$linkid;
+    } else {
+	$hash{'to_'.$comesfrom}=''.$linkid;
+    }
+    if (defined($hash{'from_'.$goesto})) {
+	$hash{'from_'.$goesto}.=','.$linkid;
+    } else {
+	$hash{'from_'.$goesto}=''.$linkid;
+    }
+}
 
-                    $linkpc++;
-                    my $linkid=$lpc.'.'.$linkpc;
+# ------------------------------------------------------------------- Condition
+sub parse_condition {
+    my ($token,$lpc) = @_;
+    my $rid=$lpc.'.'.$token->[2]->{'id'};
+    
+    $hash{'kind_'.$rid}='cond';
+    $cond[$#cond+1]=$token->[2]->{'value'};
+    $hash{'condid_'.$rid}=$#cond;
+    if ($token->[2]->{'type'}) {
+	$cond[$#cond].=':'.$token->[2]->{'type'};
+    }  else {
+	$cond[$#cond].=':normal';
+    }
+}
 
-                    my $goesto=$lpc.'.'.$token->[2]->{'to'};
-                    my $comesfrom=$lpc.'.'.$token->[2]->{'from'};
-                    my $undercond=0;
-
-                    if ($token->[2]->{'condition'}) {
-			$undercond=$lpc.'.'.$token->[2]->{'condition'};
-                    }
-
-                    $hash{'goesto_'.$linkid}=$goesto;
-                    $hash{'comesfrom_'.$linkid}=$comesfrom;
-                    $hash{'undercond_'.$linkid}=$undercond;
-
-                    if (defined($hash{'to_'.$comesfrom})) {
-                        $hash{'to_'.$comesfrom}.=','.$linkid;
-                    } else {
-                        $hash{'to_'.$comesfrom}=''.$linkid;
-                    }
-                    if (defined($hash{'from_'.$goesto})) {
-                        $hash{'from_'.$goesto}.=','.$linkid;
-                    } else {
-                        $hash{'from_'.$goesto}=''.$linkid;
-                    }
-                } elsif ($token->[1] eq 'param') {
 # ------------------------------------------------------------------- Parameter
 
-                    my $referid=$lpc.'.'.$token->[2]->{'to'};
-		    my $name=$token->[2]->{'name'};
-		    my $part;
-		    if ($name=~/^parameter_(.*)_/) {
-			$part=$1;
-		    } else {
-			$part=0;
-		    }
-		    $name=~s/^.*_([^_]*)$/$1/;
-                    my $newparam=
-			&escape($token->[2]->{'type'}).':'.
-			&escape($part.'.'.$name).'='.
-			&escape($token->[2]->{'value'});
-                    if (defined($hash{'param_'.$referid})) {
-                        $hash{'param_'.$referid}.='&'.$newparam;
-                    } else {
-                        $hash{'param_'.$referid}=''.$newparam;
-                    }
-                    if ($token->[2]->{'name'}=~/^parameter_(0_)*mapalias$/) {
-			$hash{'mapalias_'.$token->[2]->{'value'}}=$referid;
-                    }
-                    if ($token->[2]->{'name'}=~/^parameter_(0_)*randompick$/) {
-			$randompick{$referid}=$token->[2]->{'value'};
-                    }
-                    if ($token->[2]->{'name'}=~/^parameter_(0_)*randompickseed$/) {
-			$randompick{$referid}=$token->[2]->{'value'};
-                    }
-                    if ($token->[2]->{'name'}=~/^parameter_(0_)*encrypturl$/) {
-			if ($token->[2]->{'value'}=~/^yes$/i) {
-			    $encurl{$referid}=1;
-			}
-                    }
-                    if ($token->[2]->{'name'}=~/^parameter_(0_)*hiddenresource$/) {
-			if ($token->[2]->{'value'}=~/^yes$/i) {
-			    $hiddenurl{$referid}=1;
-			}
-                    }
-                } 
-		
-            }
-        }
-
+sub parse_param {
+    my ($token,$lpc) = @_;
+    my $referid=$lpc.'.'.$token->[2]->{'to'};
+    my $name=$token->[2]->{'name'};
+    my $part;
+    if ($name=~/^parameter_(.*)_/) {
+	$part=$1;
     } else {
-        $errtext.=&mt('<br />Map not loaded: The file <tt>[_1]</tt> does not exist.',$fn);
+	$part=0;
+    }
+    $name=~s/^.*_([^_]*)$/$1/;
+    my $newparam=
+	&escape($token->[2]->{'type'}).':'.
+	&escape($part.'.'.$name).'='.
+	&escape($token->[2]->{'value'});
+    if (defined($hash{'param_'.$referid})) {
+	$hash{'param_'.$referid}.='&'.$newparam;
+    } else {
+	$hash{'param_'.$referid}=''.$newparam;
+    }
+    if ($token->[2]->{'name'}=~/^parameter_(0_)*mapalias$/) {
+	$hash{'mapalias_'.$token->[2]->{'value'}}=$referid;
+    }
+    if ($token->[2]->{'name'}=~/^parameter_(0_)*randompick$/) {
+	$randompick{$referid}=$token->[2]->{'value'};
+    }
+    if ($token->[2]->{'name'}=~/^parameter_(0_)*randompickseed$/) {
+	$randompick{$referid}=$token->[2]->{'value'};
+    }
+    if ($token->[2]->{'name'}=~/^parameter_(0_)*encrypturl$/) {
+	if ($token->[2]->{'value'}=~/^yes$/i) {
+	    $encurl{$referid}=1;
+	}
+    }
+    if ($token->[2]->{'name'}=~/^parameter_(0_)*hiddenresource$/) {
+	if ($token->[2]->{'value'}=~/^yes$/i) {
+	    $hiddenurl{$referid}=1;
+	}
     }
 }
 

--albertel1181331186--