--- rat/lonuserstate.pm 2000/10/02 16:16:06 1.10 +++ rat/lonuserstate.pm 2000/11/01 22:21:36 1.15 @@ -11,7 +11,7 @@ # 7/1,7/3,7/4,7/7,7/8,7/10 Gerd Kortemeyer) # # 7/15,7/17,7/18,8/1,8/2,8/4,8/5,8/21,8/22,8/23,8/30, -# 9/2,9/4,9/29,9/30,10/2 Gerd Kortemeyer +# 9/2,9/4,9/29,9/30,10/2,10/11,10/30,10/31,11/1 Gerd Kortemeyer package Apache::lonuserstate; @@ -21,6 +21,10 @@ use Apache::File; use HTML::TokeParser; use Apache::lonnet(); use GDBM_File; +use Apache::lonmsg; +use Safe; +use Opcode; + # ---------------------------------------------------- Globals for this package @@ -249,7 +253,7 @@ sub accinit { map { my $sub=$_; my $orig=$_; - $sub=~/\(\((\d+\&(:?\d+\&)*)(?:\d+\&*)+\)(?:\|\(\1(?:\d+\&*)+\))+\)/; + $sub=~/\(\((\d+\&(:?\d+\&)*)(?:\d+\&*)+\)(?:\|\(\1(?:\d+\&*)+\))+\)/; my $factor=$1; $sub=~s/$factor//g; $sub=~s/^\(/\($factor\(/; @@ -268,27 +272,38 @@ sub accinit { } keys %hash; map { if ($_=~/^ids/) { - my $resid=$hash{$_}; + map { + my $resid=$_; my $uri=$hash{'src_'.$resid}; my @uriparts=split(/\//,$uri); my $urifile=$uriparts[$#uriparts]; $#uriparts--; my $uripath=join('/',@uriparts); $uripath=~s/^\/res\///; + my $uricond='0'; if (defined($hash{'conditions_'.$resid})) { - $urifile.=':'.$captured{$hash{'conditions_'.$resid}}; - } else { - $urifile.=':0'; + $uricond=$captured{$hash{'conditions_'.$resid}}; } if (defined($acchash{'acc.res.'.$short.'.'.$uripath})) { - $acchash{'acc.res.'.$short.'.'.$uripath}.=$urifile.'&'; + if ($acchash{'acc.res.'.$short.'.'.$uripath}=~ + /(\&$urifile\:[^\&]*)/) { + my $replace=$1; + $acchash{'acc.res.'.$short.'.'.$uripath} + =~s/$replace/$replace\|$uricond/; + } else { + $acchash{'acc.res.'.$short.'.'.$uripath}.= + $urifile.':'.$uricond.'&'; + } } else { - $acchash{'acc.res.'.$short.'.'.$uripath}='&'.$urifile.'&'; - } - } + $acchash{'acc.res.'.$short.'.'.$uripath}= + '&'.$urifile.':'.$uricond.'&'; + } + } split(/\,/,$hash{$_}); + } } keys %hash; my $courseuri=$uri; $courseuri=~s/^\/res\///; + &Apache::lonnet::delenv('(acc\.|httpref\.)'); &Apache::lonnet::appenv(%acchash, "request.course.id" => $short, "request.course.fn" => $fn, @@ -310,6 +325,9 @@ sub readmap { return 'No course data available.'; } @cond=('true:normal'); + unlink($fn.'.db'); + unlink($fn.'_symb.db'); + unlink($fn.'.state'); if (tie(%hash,'GDBM_File',"$fn.db",&GDBM_WRCREAT,0640)) { %hash=(); $errtext=''; @@ -336,9 +354,51 @@ sub readmap { &Apache::lonnet::logthis("WARNING: ". "Could not tie coursemap $fn for $uri."); } + &Apache::lonmsg::author_res_msg($ENV{'request.course.uri'},$errtext); + &evalstate(); return $errtext; } - + +# ------------------------------------------------------- Evaluate state string + +sub evalstate { + my $safeeval = new Safe; + my $fn=$ENV{'request.course.fn'}.'.state'; + my $state='2'; + if (-e $fn) { + my @conditions=(); + { + my $fh=Apache::File->new($fn); + @conditions=<$fh>; + } + $safeeval->permit("entereval"); + $safeeval->permit(":base_math"); + $safeeval->deny(":base_io"); + $safeeval->share_from('Apache::lonnet',['&varval']); + map { + my $line=$_; + chomp($line); + my ($condition,$weight)=split(/\:/,$_); + $condition=~s/\&([\w\.]+)/\&varval\(\'$1\'\)/g; + if ($safeeval->reval($condition)) { + if ($weight eq 'force') { + $state.='3'; + } else { + $state.='2'; + } + } else { + if ($weight eq 'stop') { + $state.='0'; + } else { + $state.='1'; + } + } + } @conditions; + } + &Apache::lonnet::appenv('user.state.'.$ENV{'request.course.id'} => $state); + return $state; +} + 1; __END__