--- loncom/interface/lonparmset.pm 2005/06/01 02:02:41 1.196 +++ loncom/interface/lonparmset.pm 2005/06/02 13:34:14 1.199 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to set parameters for assessments # -# $Id: lonparmset.pm,v 1.196 2005/06/01 02:02:41 www Exp $ +# $Id: lonparmset.pm,v 1.199 2005/06/02 13:34:14 www Exp $ # # Copyright Michigan State University Board of Trustees # @@ -62,11 +62,22 @@ use GDBM_File; use Apache::lonhomework; use Apache::lonxml; use Apache::lonlocal; +use Apache::lonnavmaps; +# --- Caches local to lonparmset + +my $courseoptid; my %courseopt; +my $useroptid; my %useropt; +my $parmhashid; my %parmhash; +# --- end local caches + +# +# FIXME: get rid of items below +# my @ids; my %symbp; my %mapp; @@ -108,6 +119,11 @@ Returns: A list, the first item is the ################################################## sub parmval { my ($what,$id,$def,$uname,$udom,$csec)=@_; +# load caches + &cacheparmhash(); + &cacheuseropt($uname,$udom); + &cachecourseopt(); + my $result=''; my @outpar=(); # ----------------------------------------------------- Cascading lookup scheme @@ -189,11 +205,50 @@ sub parmval { return ($result,@outpar); } +sub resetparmhash { + $parmhashid=''; +} + +sub cacheparmhash { + if ($parmhashid eq $env{'request.course.fn'}) { return; } + my %parmhashfile; + if (tie(%parmhashfile,'GDBM_File', + $env{'request.course.fn'}.'_parms.db',&GDBM_READER(),0640)) { + %parmhash=%parmhashfile; + untie %parmhashfile; + $parmhashid=$env{'request.course.fn'}; + } +} + +sub resetuseropt { + $useroptid=''; +} + +sub cacheuseropt { + my ($uname,$udom)=@_; + unless ($uname) { return; } + if ($useroptid eq $uname.'@'.$udom) { return; } + %useropt=&Apache::lonnet::dump('resourcedata',$udom,$uname); + $useroptid=$uname.'@'.$udom; +} + +sub resetcourseopt { + $courseoptid=''; +} + +sub cachecourseopt { + if ($courseoptid eq $env{'request.course.id'}) { return; }; + %courseopt = &Apache::lonnet::dump + ('resourcedata', + $env{'course.'.$env{'request.course.id'}.'.domain'}, + $env{'course.'.$env{'request.course.id'}.'.num'}); + $courseoptid=$env{'request.course.id'}; +} ################################################## ################################################## # -# Store a parameter +# Store a parameter by ID # # Takes # - resource id @@ -206,12 +261,37 @@ sub parmval { sub storeparm { my ($sresid,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec)=@_; - $spnam=~s/\_([^\_]+)$/\.$1/; + my $navmap = Apache::lonnavmaps::navmap->new(); + if ($sresid=~/\./) { + my $resource=$navmap->getById($sresid); + &storeparm_by_symb($resource->symb(),$spnam,$snum,$nval,$ntype,$uname,$udom,$csec); + } else { + my $resource=$navmap->getByMapPc($sresid); + &storeparm_by_symb(&Apache::lonnet::declutter($resource->src()),$spnam,$snum,$nval,$ntype,$uname,$udom,$csec); + } +} + +# +# Store a parameter by symb +# +# Takes +# - symb +# - name of parameter +# - level +# - new value +# - new type +# - username +# - userdomain + +sub storeparm_by_symb { +# ---------------------------------------------------------- Get symb, map, etc + my ($symb,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec)=@_; # ---------------------------------------------------------- Construct prefixes - - my $symbparm=$symbp{$sresid}.'.'.$spnam; - my $mapparm=$mapp{$sresid}.'___(all).'.$spnam; - + $spnam=~s/\_([^\_]+)$/\.$1/; + my $map=(&Apache::lonnet::decode_symb($symb))[0]; + my $symbparm=$symb.'.'.$spnam; + my $mapparm=$map.'___(all).'.$spnam; + my $seclevel=$env{'request.course.id'}.'.['.$csec.'].'.$spnam; my $seclevelr=$env{'request.course.id'}.'.['.$csec.'].'.$symbparm; my $seclevelm=$env{'request.course.id'}.'.['.$csec.'].'.$mapparm; @@ -239,12 +319,13 @@ sub storeparm { # Expire sheets &Apache::lonnet::expirespread('','','studentcalc'); if (($snum==7) || ($snum==4)) { - &Apache::lonnet::expirespread('','','assesscalc',$symbp{$sresid}); + &Apache::lonnet::expirespread('','','assesscalc',$symb); } elsif (($snum==8) || ($snum==5)) { - &Apache::lonnet::expirespread('','','assesscalc',$mapp{$sresid}); + &Apache::lonnet::expirespread('','','assesscalc',$map); } else { &Apache::lonnet::expirespread('','','assesscalc'); } + &resetcourseopt(); # Store parameter if ($delete) { $reply=&Apache::lonnet::del @@ -264,13 +345,14 @@ sub storeparm { &Apache::lonnet::expirespread($uname,$udom,'studentcalc'); if ($snum==1) { &Apache::lonnet::expirespread - ($uname,$udom,'assesscalc',$symbp{$sresid}); + ($uname,$udom,'assesscalc',$symb); } elsif ($snum==2) { &Apache::lonnet::expirespread - ($uname,$udom,'assesscalc',$mapp{$sresid}); + ($uname,$udom,'assesscalc',$map); } else { &Apache::lonnet::expirespread($uname,$udom,'assesscalc'); } + &resetuseropt(); # Store parameter if ($delete) { $reply=&Apache::lonnet::del @@ -799,8 +881,6 @@ sub assessparms { my %allparts; my %defp; - %courseopt=(); - %useropt=(); @ids=(); %symbp=(); @@ -902,14 +982,6 @@ sub assessparms { my $fcat=$env{'form.fcat'}; unless ($fcat) { $fcat=''; } -# ------------------------------------------------------------------- Tie hashs - - if (!(tie(%parmhash,'GDBM_File', - $env{'request.course.fn'}.'_parms.db',&GDBM_READER(),0640))) { - $r->print("Unable to access parameter data. (File $env{'request.course.fn'}_parms.db not tieable)"); - return ; - } - # --------------------------------------------------------- Get all assessments &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allkeys, \%allmaps, $fcat, \%defp, \%mapp, \%symbp,\%maptitles,\%uris); @@ -930,15 +1002,6 @@ sub assessparms { $env{'course.'.$env{'request.course.id'}.'.num'}, $env{'course.'.$env{'request.course.id'}.'.domain'}); #&Apache::lonnet::clear_EXT_cache_status(); -# -------------------------------------------------------------- Get coursedata - %courseopt = &Apache::lonnet::dump - ('resourcedata', - $env{'course.'.$env{'request.course.id'}.'.domain'}, - $env{'course.'.$env{'request.course.id'}.'.num'}); -# --------------------------------------------------- Get userdata (if present) - if ($uname) { - %useropt=&Apache::lonnet::dump('resourcedata',$udom,$uname); - } # ------------------------------------------------------------------- Sort this @@ -964,10 +1027,6 @@ sub assessparms { $trimheader = 'yes'; &startpage($r,$id,$udom,$csec,$uname,$have_assesments,$trimheader); - if (!$have_assesments) { - untie(%parmhash); - return ''; - } # if ($env{'form.url'}) { # $r->print(''); @@ -1477,7 +1536,6 @@ ENDMAPONE } # end of $parmlev eq general } $r->print(''); - untie(%parmhash); } # end sub assessparms @@ -2160,9 +2218,6 @@ sub handler { # ----------------------------------------------------------- Clear out garbage - %courseopt=(); - %useropt=(); - %parmhash=(); @ids=(); %symbp=();