# The LearningOnline Network with CAPA # Handler to set parameters for assessments # # (Handler to resolve ambiguous file locations # # (TeX Content Handler # # 05/29/00,05/30,10/11 Gerd Kortemeyer) # # 10/11,10/12,10/16 Gerd Kortemeyer) # # 11/20,11/21,11/22,11/23,11/24,11/25,11/27 Gerd Kortemeyer package Apache::lonparmset; use strict; use Apache::lonnet; use Apache::Constants qw(:common :http REDIRECT); use GDBM_File; my %courseopt; my %useropt; my %bighash; my %parmhash; my @outpar; my @ids; my %symbp; my %mapp; my %typep; my %keyp; my %allkeys; my $uname; my $udom; my $uhome; my $csec; my $fcat; # -------------------------------------------- Figure out a cascading parameter sub parmval { my ($what,$id,$def)=@_; my $result=''; @outpar=(); # ----------------------------------------------------- Cascading lookup scheme my $symbparm=$symbp{$id}.'.'.$what; my $mapparm=$mapp{$id}.'___(all).'.$what; my $seclevel= $ENV{'request.course.id'}.'.['. $csec.'].'.$what; my $seclevelr= $ENV{'request.course.id'}.'.['. $csec.'].'.$symbparm; my $seclevelm= $ENV{'request.course.id'}.'.['. $csec.'].'.$mapparm; my $courselevel= $ENV{'request.course.id'}.'.'.$what; my $courselevelr= $ENV{'request.course.id'}.'.'.$symbparm; my $courselevelm= $ENV{'request.course.id'}.'.'.$mapparm; # -------------------------------------------------------- first, check default if ($def) { $outpar[11]=$def; $result=11; } # ----------------------------------------------------- second, check map parms my $thisparm=$parmhash{$symbparm}; if ($thisparm) { $outpar[10]=$thisparm; $result=10; } # --------------------------------------------------------- third, check course if ($courseopt{$courselevel}) { $outpar[9]=$courseopt{$courselevel}; $result=9; } if ($courseopt{$courselevelm}) { $outpar[8]=$courseopt{$courselevelm}; $result=8; } if ($courseopt{$courselevelr}) { $outpar[7]=$courseopt{$courselevelr}; $result=7; } if ($csec) { if ($courseopt{$seclevel}) { $outpar[6]=$courseopt{$seclevel}; $result=6; } if ($courseopt{$seclevelm}) { $outpar[5]=$courseopt{$seclevelm}; $result=5; } if ($courseopt{$seclevelr}) { $outpar[4]=$courseopt{$seclevelr}; $result=4; } } # ---------------------------------------------------------- fourth, check user if ($uname) { if ($useropt{$courselevel}) { $outpar[3]=$useropt{$courselevel}; $result=3; } if ($useropt{$courselevelm}) { $outpar[2]=$useropt{$courselevelm}; $result=2; } if ($useropt{$courselevelr}) { $outpar[1]=$useropt{$courselevelr}; $result=1; } } return $result; } # ---------------------------------------------------------------- Sort routine sub bycat { if ($fcat eq '') { $a<=>$b; } else { &parmval($fcat,$a)<=>&parmval($fcat,$b); } } # ------------------------------------------------------------ Output for value sub valout { my ($value,$type)=@_; return ($value?(($type=~/^date/)?localtime($value):$value):' '); } # -------------------------------------------------------- Produces link anchor sub plink { my ($type,$dis,$value,$marker,$return,$call)=@_; return ''. &valout($value,$type).''; } # ================================================================ Main Handler sub handler { my $r=shift; if ($r->header_only) { $r->content_type('text/html'); $r->send_http_header; return OK; } # ----------------------------------------------------- Needs to be in a course if (($ENV{'request.course.fn'}) && (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'}))) { # -------------------------------------------------------- Variable declaration %courseopt=(); %useropt=(); %bighash=(); @ids=(); %symbp=(); %typep=(); my $message=''; $csec=$ENV{'form.csec'}; $udom=$ENV{'form.udom'}; my $id=$ENV{'form.id'}; if (($id) && ($udom)) { $uname=(&Apache::lonnet::idget($udom,$id))[1]; if ($uname) { $id=''; } else { $message= "
\nFull Name: ".
$name{'firstname'}.' '.$name{'middlename'}
.$name{'lastname'}.' '.$name{'generation'}.
"
\nID: ".$name{'id'}.'
'; } } } unless ($csec) { $csec=''; } $fcat=$ENV{'form.fcat'}; unless ($fcat) { $fcat=''; } # ------------------------------------------------------------------- Tie hashs if ((tie(%bighash,'GDBM_File',$ENV{'request.course.fn'}.'.db', &GDBM_READER,0640)) && (tie(%parmhash,'GDBM_File', $ENV{'request.course.fn'}.'_parms.db',&GDBM_READER,0640))) { # --------------------------------------------------------- Get all assessments %allkeys=(); map { if ($_=~/^src\_(\d+)\.(\d+)$/) { my $mapid=$1; my $resid=$2; my $id=$mapid.'.'.$resid; my $srcf=$bighash{$_}; if ($srcf=~/\.(problem|exam|quiz|assess|survey|form)$/) { $ids[$#ids+1]=$id; $typep{$id}=$1; $keyp{$id}=''; map { if ($_=~/^parameter\_(.*)/) { my $key=$_; my $allkey=$1; my $display= &Apache::lonnet::metadata($srcf,$key.'.display'); unless ($display) { $display= &Apache::lonnet::metadata($srcf,$key.'.name'); } $allkeys{$allkey}=$display; if ($keyp{$id}) { $keyp{$id}.=','.$key; } else { $keyp{$id}=$key; } } } split(/\,/, &Apache::lonnet::metadata($srcf,'keys')); $mapp{$id}= &Apache::lonnet::declutter($bighash{'map_id_'.$mapid}); $symbp{$id}=$mapp{$id}. '___'.$resid.'___'. &Apache::lonnet::declutter($srcf); } } } keys %bighash; # ---------------------------------------------------------- Anything to store? if ($ENV{'form.pres_marker'}) { my ($sresid,$spnam,$snum)=split(/\&/,$ENV{'form.pres_marker'}); $spnam=~s/\_/\./; # ---------------------------------------------------------- Construct prefixes my $symbparm=$symbp{$sresid}.'.'.$spnam; my $mapparm=$mapp{$sresid}.'___(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; my $courselevel= $ENV{'request.course.id'}.'.'.$spnam; my $courselevelr= $ENV{'request.course.id'}.'.'.$symbparm; my $courselevelm= $ENV{'request.course.id'}.'.'.$mapparm; my $storeunder=''; if (($snum==9) || ($snum==3)) { $storeunder=$courselevel; } if (($snum==8) || ($snum==2)) { $storeunder=$courselevelm; } if (($snum==7) || ($snum==1)) { $storeunder=$courselevelr; } if ($snum==6) { $storeunder=$seclevel; } if ($snum==5) { $storeunder=$seclevelm; } if ($snum==4) { $storeunder=$seclevelr; } $storeunder=&Apache::lonnet::escape($storeunder); my $storecontent= $storeunder.'='.&Apache::lonnet::escape($ENV{'form.pres_value'}).'&'. $storeunder.'.type='.&Apache::lonnet::escape($ENV{'form.pres_type'}); my $reply=''; if ($snum>3) { # ---------------------------------------------------------------- Store Course $reply=&Apache::lonnet::critical('put:'. $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.':'. $ENV{'course.'.$ENV{'request.course.id'}.'.num'}.':resourcedata:'. $storecontent, $ENV{'course.'.$ENV{'request.course.id'}.'.home'}); } else { # ------------------------------------------------------------------ Store User $reply= &Apache::lonnet::critical('put:'.$udom.':'.$uname.':resourcedata:'. $storecontent,$uhome); } if ($reply=~/^error\:(.*)/) { $message.="