[LON-CAPA-cvs] cvs: loncom / lonmap.pm

foxr foxr at source.lon-capa.org
Thu Oct 6 06:56:49 EDT 2011


foxr		Thu Oct  6 10:56:49 2011 EDT

  Modified files:              
    /loncom	lonmap.pm 
  Log:
  Works correctly for simple maps with random out/randompick.
  (need to take out the log spew of course).
  
  
  
-------------- next part --------------
Index: loncom/lonmap.pm
diff -u loncom/lonmap.pm:1.2 loncom/lonmap.pm:1.3
--- loncom/lonmap.pm:1.2	Tue Sep 13 10:27:52 2011
+++ loncom/lonmap.pm	Thu Oct  6 10:56:49 2011
@@ -2,7 +2,7 @@
 #
 #  Read maps into a 'big hash'.
 #
-# $Id: lonmap.pm,v 1.2 2011/09/13 10:27:52 foxr Exp $
+# $Id: lonmap.pm,v 1.3 2011/10/06 10:56:49 foxr Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -28,7 +28,7 @@
 #
 ###
 
-package lonmap;
+package Apache::lonmap;
 use strict;
 
 #------------- Required external modules.
@@ -40,10 +40,12 @@
 
 use LONCAPA;
 use Apache::lonnet;
+use Data::Dumper;
+
 
 #------------- File scoped variables:
 
-my $map_number = 1;		# keep track of maps within the course.
+my $map_number = 0;		# keep track of maps within the course.
 my $course_id;     		# Will be the id of the course being read in.
 
 #
@@ -67,6 +69,7 @@
 my $username;			# User for whom the map is being read.
 my $userdomain;  		# Domain the user lives in.
 my %mapalias_cache;		# Keeps track of map aliases -> resources detects duplicates.
+my %cenv;			# Course environment.
 
 #------------- Executable code: 
 
@@ -149,8 +152,12 @@
 sub merge_hash {
     my ($parent, $key, $child) = @_;
 
+    if ($key ne '') {
+	$key .= '.';		# If we are prefixing, prefix then .
+    }
+
     foreach my $childkey (keys (%$child)) {
-	$parent->{$key . '.' . $childkey} = $child->{$childkey};
+	$parent->{$key . $childkey} = $child->{$childkey};
     }
 }
 
@@ -308,7 +315,7 @@
 # Returns:
 #   URI with the version cut out.
 #
-sub vesiontrack {
+sub versiontrack {
     my ($uri, $hash) = @_;
 
 
@@ -371,6 +378,10 @@
 sub hiddenurls {
     my $hash = shift;
 
+    my $uname    = $hash->{'context.username'};
+    my $udom     = $hash->{'context.userdom'};
+    my $courseid = $hash->{'context.courseid'};
+
     my $randomoutentry='';
     foreach my $rid (keys %randompick) {
         my $rndpick=$randompick{$rid};
@@ -393,15 +404,16 @@
 # -------------------------------- randomly eliminate the ones that should stay
 	my (undef,$id)=split(/\./,$rid);
         if ($randompickseed{$rid}) { $id=$randompickseed{$rid}; }
-	my $rndseed=&Apache::lonnet::rndseed($id); # use id instead of symb
+	my $rndseed=&Apache::lonnet::rndseed($id, $courseid, $udom, $uname, \%cenv); # use id instead of symb
+	&Apache::lonnet::logthis("lonmap random seed: $rndseed");
 	&Apache::lonnet::setup_random_from_rndseed($rndseed);
 	my @whichids=&Math::Random::random_permuted_index($#currentrids+1);
         for (my $i=1;$i<=$rndpick;$i++) { $currentrids[$whichids[$i]]=''; }
-	#&Apache::lonnet::logthis("$id,$rndseed,".join(':', at whichids));
+
 # -------------------------------------------------------- delete the leftovers
         for (my $k=0; $k<=$#currentrids; $k++) {
             if ($currentrids[$k]) {
-		$hash->{'randomout_'.$currentrids[$k]}=1;
+		$hash->{'randomout_'.$currentrids[$k]}='1';
                 my ($mapid,$resid)=split(/\./,$currentrids[$k]);
                 $randomoutentry.='&'.
 		    &Apache::lonnet::encode_symb($hash->{'map_id_'.$mapid},
@@ -413,7 +425,7 @@
     }
 # ------------------------------ take care of explicitly hidden urls or folders
     foreach my $rid (keys %hiddenurl) {
-	$hash->{'randomout_'.$rid}=1;
+	$hash->{'randomout_'.$rid}='1';
 	my ($mapid,$resid)=split(/\./,$rid);
 	$randomoutentry.='&'.
 	    &Apache::lonnet::encode_symb($hash->{'map_id_'.$mapid},$resid,
@@ -437,7 +449,7 @@
 #       
 
 sub accinit {
-    my ($uri, $short, $fn, $hash)=@_;
+    my ($uri, $short, $hash)=@_;
     my %acchash=();
     my %captured=();
     my $condcounter=0;
@@ -615,7 +627,7 @@
 				$hash->{'map_start_'.$hash->{'src_'.$rid}},
 				$beenhere,
 				$encflag || $encurl{$rid},
-				$hdnflag || $hiddenurl{$rid});
+				$hdnflag || $hiddenurl{$rid}, $hash);
 	    }
 	}
 
@@ -641,7 +653,7 @@
                 }
 		#  Recurse to resoruces that have to's to us.
                 $newsofar=&traceroute($further,$hash->{'goesto_'.$id},$beenhere,
-				      $encflag,$hdnflag);
+				      $encflag,$hdnflag, $hash);
 	    }
 	}
     }
@@ -931,7 +943,7 @@
     
     if (($turi=~/\.sequence$/) ||
 	($turi=~/\.page$/)) {
-	$hash->{'is_map_'.$rid}=1;
+	$hash->{'is_map_'.$rid}='1'; # String in lonuserstate.
 	&read_map($turi,$rid, $hash);
     } 
     return $token->[2]->{'id'};
@@ -969,7 +981,7 @@
     my $linkid=$lpc.'.'.$linkpc;
     my $goesto=$lpc.'.'.$to;
     my $comesfrom=$lpc.'.'.$from;
-    my $undercond=0;
+    my $undercond='0';
 
 
     # If there is a condition, qualify it with the level counter.
@@ -1152,6 +1164,7 @@
 sub read_map {
     my ($uri, $parent_rid, $hash) = @_;
 
+
     # Check for duplication: A map may only be included once.
 
     if($hash->{'map_pc_' . $uri}) {
@@ -1167,8 +1180,8 @@
     #  map_pc_uri is the map number of the map with that URI.
     #  map_id_$lmap_no is the URI for this map level.
     #
-    $hash->{'map_pc_' . $uri}     = $lmap_no;
-    $hash->{'map_id_' . $lmap_no} = $uri;
+    $hash->{'map_pc_' . $uri}     = "$lmap_no"; # string form in lonuserstate.
+    $hash->{'map_id_' . $lmap_no} = "$uri";
 
     # Create the path up to the top of the course.
     # this is in 'map_hierarchy_mapno'  that's a comma separated path down to us
@@ -1191,6 +1204,8 @@
     # sorts of files that make sense for this sub 
 
     my $filename = &Apache::lonnet::filelocation('', &append_version($uri, $hash));
+
+
     my $ispage = ($filename =~/\.page$/);
     unless ($ispage || ($filename =~ /\.sequence$/)) {
 	throw Error::Simple(&mt("<br />Invalid map: <tt>[_1]</tt>", $filename));
@@ -1202,7 +1217,7 @@
 
     # Repcopy the file and get its contents...report errors if we can't
    
-    my $contents = &Apache::lonet::getfile($filename);
+    my $contents = &Apache::lonnet::getfile($filename);
     if($contents eq -1) {
         throw Error::Simple(&mt('<br />Map not loaded: The file <tt>[_1]</tt> does not exist.',
 				$filename));
@@ -1315,7 +1330,7 @@
 	# if randomorder was set.  This means that for an instructor to choose
 
 	while (my $to = shift(@map_ids)) {
-	    &make_link(++$linkpc,$lmap_no,$to,$from);
+	    &make_link(++$linkpc,$lmap_no,$to,$from, 0, $hash);
 	    my $to_rid =  $lmap_no.'.'.$to;
 	    $hash->{'type_'.$to_rid}='normal';
 	    $from = $to;
@@ -1360,7 +1375,9 @@
 #
 #  
 sub loadmap {
-    my ($cnum, $cdom, $uname, $udom, $filepath, $target_hash) = @_;
+    my ($cnum, $cdom, $uname, $udom,  $target_hash) = @_;
+
+
 
     # Clear the auxillary hashes and the cond array.
 
@@ -1372,6 +1389,10 @@
     %parmhash       = ();
     @cond           = ();
     $retfrid        = '';
+    $username       = '';
+    $userdomain     = '';
+    %mapalias_cache = ();
+    %cenv           = ();
 
     
     # 
@@ -1379,7 +1400,8 @@
     $username   = $uname;
     $userdomain = $udom;
 
-    my $short_name = $cdom . $cnum;
+    my $short_name = $cdom .'/' . $cnum;
+    my $retfurl;
 
     try {
 
@@ -1387,14 +1409,17 @@
 	# Get the information we need about the course.
 	# Return without filling in anything if we can't get any info:
 	
-	my %cenv = &Apache::lonnet::coursedescription($short_name,
+	%cenv = &Apache::lonnet::coursedescription($short_name,
 						     {'freshen_cache' => 1,
 						      'user'          => $uname}); 
+
 	unless ($cenv{'url'}) { 
 	    &Apache::lonnet::logthis("lonmap::loadmap failed: $cnum/$cdom - did not get url");
 	    return; 
 	}
-	$course_id = $cdom . '.' . $cnum; # Long course id.
+	&Apache::lonnet::logthis("Course environment: \n" . Dumper(\%cenv));
+
+	$course_id = $cdom . '_' . $cnum; # Long course id.
 
 	# Load the version information into the hash
 
@@ -1409,16 +1434,27 @@
 	
 	$target_hash->{'src_0.0'}            = &versiontrack($map_uri, $target_hash); 
 	$target_hash->{'title_0.0'}          = &Apache::lonnet::metadata($course_uri, 'title');
+	if(!defined $target_hash->{'title_0.0'}) {
+	    $target_hash->{'title_0.0'} = '';
+	}
 	$target_hash->{'ids_'.$map_uri} = '0.0';
-	$target_hash->{'is_map_0.0'}         = 1;
-        &read_map($course_uri, '0.0', &hash);
+	$target_hash->{'is_map_0.0'}         = '1';
+
+	# In some places we need a username a domain and the courseid...store that
+	# in the target hash in the context.xxxx keys:
+
+	$target_hash->{'context.username'} = $username;
+	$target_hash->{'context.userdom'}  = $userdomain;
+	$target_hash->{'context.courseid'} = $course_id;
+
+        &read_map($course_uri, '0.0', $target_hash);
 
 	# 
 
 	if (defined($target_hash->{'map_start_'.$map_uri})) {
 
-	    &traceroute('0',$target_hash->{'map_start_'.$course_uri},'&', $target_hash);
-	    &accinit($course_uri, $short_name, $filepath, $target_hash);
+	    &traceroute('0',$target_hash->{'map_start_'.$course_uri},'&', 0, 0, $target_hash);
+	    &accinit($course_uri, $short_name,  $target_hash);
 	    &hiddenurls($target_hash);
 	}
 	my $errors = &get_mapalias_errors($target_hash);
@@ -1438,6 +1474,26 @@
 		$target_hash->{$type.&putinversion($url, $target_hash, $short_name)}=$value;
 	    }
 	}
+	#  Mark necrypted URLS.
+
+	foreach my $id (keys(%encurl)) {
+	    $target_hash->{'encrypted_'.$id}=1;
+	}
+
+	# Store first keys.
+
+	$target_hash->{'first_rid'}=$retfrid;
+	my ($mapid,$resid)=split(/\./,$retfrid);
+	$target_hash->{'first_mapurl'}=$target_hash->{'map_id_'.$mapid};
+	my $symb=&Apache::lonnet::encode_symb($target_hash->{'map_id_'.$mapid},
+					      $resid,
+					      $target_hash->{'src_'.$retfrid});
+	$retfurl=&add_get_param($target_hash->{'src_'.$retfrid},{ 'symb' => $symb });
+	if ($target_hash->{'encrypted_'.$retfrid}) {
+	    $retfurl=&Apache::lonenc::encrypted($retfurl,
+						(&Apache::lonnet::allowed('adv') ne 'F'));
+	}
+	$target_hash->{'first_url'}=$retfurl;	
 
 	# Merge in the child hashes in case the caller wants that information as well.
 
@@ -1462,7 +1518,7 @@
 
 #
 #  Module initialization code:
-#
+#  TODO:  Fix the pod docs below.
 
 1;
 __END__


More information about the LON-CAPA-cvs mailing list