# 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 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 @srcp;
my @typep;
my @resp;
my @mapp;
my @symbp;
my $uname;
my $udom;
my $uhome;
my $csec;
# -------------------------------------------- Figure out a cascading parameter
sub parmval {
my ($what,$idx)=@_;
# ----------------------------------------------------- Cascading lookup scheme
my $symbparm=$symbp[$idx].'.'.$what;
my $reslevel=
$ENV{'request.course.id'}.'.'.$symbparm;
my $seclevel=
$ENV{'request.course.id'}.'.'.
$ENV{'request.course.sec'}.'.'.$what;
my $courselevel=
$ENV{'request.course.id'}.'.'.$what;
# ----------------------------------------------------------- first, check user
if ($useropt{$reslevel}) { return $useropt{$reslevel}; }
if ($useropt{$seclevel}) { return $useropt{$seclevel}; }
if ($useropt{$courselevel}) { return $useropt{$courselevel}; }
# -------------------------------------------------------- second, check course
if ($courseopt{$reslevel}) { return $courseopt{$reslevel}; }
if ($courseopt{$seclevel}) { return $courseopt{$seclevel}; }
if ($courseopt{$courselevel}) { return $courseopt{$courselevel}; }
# ------------------------------------------------------ third, check map parms
my $thisparm=$parmhash{$symbparm};
if ($thisparm) { return $thisparm; }
# --------------------------------------------- last, look in resource metadata
my $filename='/home/httpd/res/'.$srcp[$idx].'.meta';
if (-e $filename) {
my @content;
{
my $fh=Apache::File->new($filename);
@content=<$fh>;
}
if (join('',@content)=~
/\<$what[^\>]*\>([^\<]*)\<\/$what\>/) {
return $1;
}
}
return '';
}
# ================================================================ 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=();
@srcp=();
@typep=();
@resp=();
@mapp=();
@symbp=();
$uname=$ENV{'form.uname'};
$udom=$ENV{'form.udom'};
unless ($udom) { $uname=''; }
$uhome='';
if ($uname) {
$uhome=&Apache::lonnet::homeserver($uname,$udom);
}
$csec=$ENV{'form.csec'};
# ------------------------------------------------------------------- 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 coursedata
my $reply=&Apache::lonnet::reply('dump:'.
$ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.':'.
$ENV{'course.'.$ENV{'request.course.id'}.'.num'}.':resourcedata',
$ENV{'course.'.$ENV{'request.course.id'}.'.home'});
if ($reply!~/^error\:/) {
map {
my ($name,$value)=split(/\=/,$_);
$courseopt{unescape($name)}=unescape($value);
} split(/\&/,$reply);
}
# --------------------------------------------------- Get userdata (if present)
if ($uname) {
my $reply=
&Apache::lonnet::reply('dump:'.$udom.':'.$uname.':resourcedata',$uhome);
if ($reply!~/^error\:/) {
map {
my ($name,$value)=split(/\=/,$_);
$useropt{unescape($name)}=unescape($value);
} split(/\&/,$reply);
}
}
# --------------------------------------------------------- Get all assessments
map {
if ($_=~/^src\_(\d+)\.(\d+)$/) {
my $mapid=$1;
my $resid=$2;
if ($bighash{$_}=~/\.(problem|exam|quiz|assess|survey|form)$/) {
$typep[$#typep+1]=$1;
$mapp[$#mapp+1]=$mapid;
$resp[$#resp+1]=$resid;
$srcp[$#srcp+1]=&Apache::lonnet::declutter($bighash{$_});
$symbp[$#symbp+1]=
&Apache::lonnet::declutter($bighash{'map_id_'.$mapid}).
'___'.$resid.'___'.$srcp[$#srcp];
}
}
} keys %bighash;
# ------------------------------------------------------------------- Sort this
# ------------------------------------------------------------------ Start page
$r->content_type('text/html');
$r->send_http_header;
$r->print('<html><body bgcolor="#FFFFFF">');
$r->print('</body></html>');
untie(%bighash);
untie(%parmhash);
}
} else {
# ----------------------------- Not in a course, or not allowed to modify parms
$ENV{'user.error.msg'}=
"/adm/flip:opa:0:0:Cannot modify assessment parameters";
return HTTP_NOT_ACCEPTABLE;
}
return OK;
}
1;
__END__
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>