--- rat/lonuserstate.pm 2009/11/16 20:26:04 1.128.2.3
+++ rat/lonuserstate.pm 2011/10/06 23:30:06 1.137.2.1
@@ -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.128.2.3 2009/11/16 20:26:04 raeburn Exp $
+# $Id: lonuserstate.pm,v 1.137.2.1 2011/10/06 23:30:06 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -62,6 +62,12 @@ my %hiddenurl; # this URL (or complete f
# ----------------------------------- Remove version from URL and store in hash
+sub versionerror {
+ my ($uri,$usedversion,$unusedversion)=@_;
+ return '
'.&mt('Version discrepancy: resource [_1] included in both version [_2] and version [_3]. Using version [_2].',
+ $uri,$usedversion,$unusedversion).'
';
+}
+
sub versiontrack {
my $uri=shift;
if ($uri=~/\.(\d+)\.\w+$/) {
@@ -69,7 +75,9 @@ sub versiontrack {
$uri=~s/\.\d+\.(\w+)$/\.$1/;
unless ($hash{'version_'.$uri}) {
$hash{'version_'.$uri}=$version;
- }
+ } elsif ($version!=$hash{'version_'.$uri}) {
+ $errtext.=&versionerror($uri,$hash{'version_'.$uri},$version);
+ }
}
return $uri;
}
@@ -118,6 +126,15 @@ sub loadmap {
my $lpc=$pc;
$hash{'map_pc_'.$uri}=$lpc;
$hash{'map_id_'.$lpc}=$uri;
+ if ($parent_rid =~ /^(\d+)\.\d+$/) {
+ my $parent_pc = $1;
+ if (defined($hash{'map_hierarchy_'.$parent_pc})) {
+ $hash{'map_hierarchy_'.$lpc}=$hash{'map_hierarchy_'.$parent_pc}.','.
+ $parent_pc;
+ } else {
+ $hash{'map_hierarchy_'.$lpc}=$parent_pc;
+ }
+ }
# Determine and check filename
my $fn=&Apache::lonnet::filelocation('',&putinversion($uri));
@@ -278,7 +295,7 @@ sub parse_resource {
$hash{'ids_'.$idsuri}=''.$rid;
}
- if ($turi=~/\/(syllabus|aboutme|navmaps|smppg|bulletinboard)$/) {
+ if ($turi=~/\/(syllabus|aboutme|navmaps|smppg|bulletinboard|viewclasslist)$/) {
$turi.='?register=1';
}
@@ -420,7 +437,7 @@ sub simplify {
# 8&8=8
$expression=~s/([^_\.\d])([_\.\d]+)\&\2([^_\.\d])/$1$2$3/g;
# 8|8=8
- $expression=~s/([^_\.\d])([_\.\d]+)\|\2([^_\.\d])/$1$2$3/g;
+ $expression=~s/([^_\.\d])([_\.\d]+)(?:\|\2)+([^_\.\d])/$1$2$3/g;
# (5&3)&4=5&3&4
$expression=~s/\(([_\.\d]+)((?:\&[_\.\d]+)+)\)\&([_\.\d]+[^_\.\d])/$1$2\&$3/g;
# (((5&3)|(4&6)))=((5&3)|(4&6))
@@ -688,9 +705,9 @@ sub readmap {
'Could not untie coursemap hash '.$fn.' for '.$uri.'.');
}
}
- flock(LOCKFILE,LOCK_UN);
+ flock(LOCKFILE,LOCK_UN);
}
- unless ($lock && $tiedhash && $tiedparmhash) {
+ unless ($lock && $tiedhash && $tiedparmhash) {
# if we are here it is likely because we are already trying to
# initialize the course in another child, busy wait trying to
# tie the hashes for the next 90 seconds, if we succeed forward
@@ -703,7 +720,7 @@ sub readmap {
}
if ($tiedhash) {
unless($untiedhash) {
- untie(%hash);
+ untie(%hash);
}
}
if ($tiedparmhash) {
@@ -711,8 +728,8 @@ sub readmap {
untie(%parmhash);
}
}
- &Apache::lonnet::logthis('WARNING: '.
- "Could not tie coursemap $fn for $uri.");
+ &Apache::lonnet::logthis('WARNING: '.
+ "Could not tie coursemap $fn for $uri.");
$tiedhash = '';
$tiedparmhash = '';
my $i=0;
@@ -728,18 +745,18 @@ sub readmap {
if (-e "$fn.state") {
$retfurl='/adm/navmaps';
&Apache::lonnet::appenv({"request.course.id" => $short,
- "request.course.fn" => $fn,
+ "request.course.fn" => $fn,
"request.course.uri" => $uri});
- $untiedhash = untie(%hash);
- $untiedparmhash = untie(%parmhash);
+ $untiedhash = untie(%hash);
+ $untiedparmhash = untie(%parmhash);
$gotstate = 1;
last;
- }
+ }
$untiedparmhash = untie(%parmhash);
- }
- $untiedhash = untie(%hash);
- }
- }
+ }
+ $untiedhash = untie(%hash);
+ }
+ }
}
if ($lock) {
flock(LOCKFILE,LOCK_UN);
@@ -889,7 +906,7 @@ sub build_tmp_hashes {
sub unlink_tmpfiles {
my ($fn) = @_;
- if ($fn =~ m{^\Q$Apache::lonnet::perlvar{'lonUsersDir'}\E/tmp/}) {
+ if ($fn =~ m{^\Q$Apache::lonnet::perlvar{'lonDaemons'}\E/tmp/}) {
my @files = qw (.db _symb.db .state _parms.db);
foreach my $file (@files) {
if (-e $fn.$file) {
@@ -1002,37 +1019,33 @@ of course for user.
This is part of the LearningOnline Network with CAPA project
described at http://www.lon-capa.org.
-=head1 HANDLER SUBROUTINE
-
-There is no handler subroutine.
-
-=head1 OTHER SUBROUTINES
+=head1 SUBROUTINES
-=over 4
+=over
-=item *
+=item loadmap()
-loadmap() : Loads map from disk
+Loads map from disk
-=item *
+=item simplify()
-simplify() : Simplify expression
+Simplify expression
-=item *
+=item traceroute()
-traceroute() : Build condition hash
+Build condition hash
-=item *
+=item accinit()
-accinit() : Cascading conditions, quick access, parameters
+Cascading conditions, quick access, parameters
-=item *
+=item readmap()
-readmap() : Read map and all submaps
+Read map and all submaps
-=item *
+=item evalstate()
-evalstate() : Evaluate state string
+Evaluate state string
=back