--- loncom/lonmap.pm 2011/10/06 10:56:49 1.3 +++ loncom/lonmap.pm 2011/11/29 11:50:53 1.6 @@ -2,7 +2,7 @@ # # Read maps into a 'big hash'. # -# $Id: lonmap.pm,v 1.3 2011/10/06 10:56:49 foxr Exp $ +# $Id: lonmap.pm,v 1.6 2011/11/29 11:50:53 foxr Exp $ # # Copyright Michigan State University Board of Trustees # @@ -40,6 +40,8 @@ use HTML::TokeParser; use LONCAPA; use Apache::lonnet; +use Apache::lonlocal; + use Data::Dumper; @@ -68,6 +70,7 @@ my $retfrid; my $username; # User for whom the map is being read. my $userdomain; # Domain the user lives in. +my $short_name; # Course shortname. my %mapalias_cache; # Keeps track of map aliases -> resources detects duplicates. my %cenv; # Course environment. @@ -95,10 +98,7 @@ my %cenv; # Course environment. sub simplify { my $expression=shift; - my $prior = ''; # This is safe as a null expression is pretty optimal. - - while ($prior ne $expression) { - $prior = $expression; # Stop when the substitutions below do nothing. + # (0&1) = 1 $expression=~s/\(0\&([_\.\d]+)\)/$1/g; # (8)=8 @@ -115,7 +115,8 @@ sub simplify { # ((5&3)|(4&6))|(1&2)=(5&3)|(4&6)|(1&2) $expression=~ s/\((\([_\.\d]+(?:\&[_\.\d]+)*\))((?:\|\([_\.\d]+(?:\&[_\.\d]+)*\))+)\)\|(\([_\.\d]+(?:\&[_\.\d]+)*\))/\($1$2\|$3\)/g; - } + + return $expression; } @@ -373,6 +374,32 @@ sub append_version { return $uri; } +#------------------------------------------------------------------------------ +# +# Misc. utilities that don't fit into the other classifications. + +# Determine if the specified user has an 'advanced' role in a course. +# Parameters: +# cenv - reference to a course environment. +# username - Name of the user we care about. +# domain - Domain in which the user is defined. +# Returns: +# 0 - User does not have an advanced role in the course. +# 1 - User does have an advanced role in the course. +# +sub has_advanced_role { + my ($username, $domain) = @_; + + my %adv_roles = &Apache::lonnet::get_course_adv_roles($short_name); + my $merged_username = $username . ':' . $domain; + foreach my $user (values %adv_roles) { + if ($merged_username eq $user) { + return 1; + } + } + return 0; +} + #-------------------------------------------------------------------------------- # Post processing subs: sub hiddenurls { @@ -405,7 +432,6 @@ sub hiddenurls { my (undef,$id)=split(/\./,$rid); if ($randompickseed{$rid}) { $id=$randompickseed{$rid}; } 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]]=''; } @@ -1208,6 +1234,7 @@ sub read_map { my $ispage = ($filename =~/\.page$/); unless ($ispage || ($filename =~ /\.sequence$/)) { + &Apache::lonnet::logthis("invalid: $filename : $uri"); throw Error::Simple(&mt("
Invalid map: [_1]", $filename)); } @@ -1286,7 +1313,7 @@ sub read_map { # if ($randomize) { - if (!$env{'request.role.adv'}) { + if (!&has_advanced_role($username, $userdomain) ) { my $seed; # In the advanced role, the map's random seed @@ -1308,7 +1335,11 @@ sub read_map { } - my $rndseed=&Apache::lonnet::rndseed($seed, $username, $userdomain); + my $rndseed=&Apache::lonnet::rndseed($seed, '', + $userdomain, $username, + \%cenv); + + &Apache::lonnet::setup_random_from_rndseed($rndseed); # Take the set of map ids we have decoded and permute them to a @@ -1316,10 +1347,8 @@ sub read_map { # processing the randomorder parameter if it is set, not # randompick. - @map_ids=&math::Random::random_permutation(@map_ids); + @map_ids=&Math::Random::random_permutation(@map_ids); } - - my $from = shift(@map_ids); my $from_rid = $lmap_no.'.'.$from; $hash->{'map_start_'.$uri} = $from_rid; @@ -1341,6 +1370,7 @@ sub read_map { $hash->{'type_'.$from_rid}='finish'; } + # The last parsing pass parses the tags that associate a name # with resource ids. @@ -1387,7 +1417,7 @@ sub loadmap { %encurl = (); %hiddenurl = (); %parmhash = (); - @cond = (); + @cond = ('true:normal'); # Initial value for cond 0. $retfrid = ''; $username = ''; $userdomain = ''; @@ -1400,30 +1430,29 @@ sub loadmap { $username = $uname; $userdomain = $udom; - my $short_name = $cdom .'/' . $cnum; + $short_name = $cdom .'/' . $cnum; my $retfurl; try { # Get the information we need about the course. - # Return without filling in anything if we can't get any info: - - %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; - } - &Apache::lonnet::logthis("Course environment: \n" . Dumper(\%cenv)); - - $course_id = $cdom . '_' . $cnum; # Long course id. - - # Load the version information into the hash - - + # Return without filling in anything if we can't get any info: + + %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. + + # Load the version information into the hash + + &process_versions(\%cenv, $target_hash); @@ -1447,6 +1476,7 @@ sub loadmap { $target_hash->{'context.userdom'} = $userdomain; $target_hash->{'context.courseid'} = $course_id; + &read_map($course_uri, '0.0', $target_hash); #