--- loncom/interface/lonparmset.pm 2000/11/23 20:20:39 1.5 +++ loncom/interface/lonparmset.pm 2002/06/14 20:14:30 1.52 @@ -1,209 +1,193 @@ # The LearningOnline Network with CAPA # Handler to set parameters for assessments # +# $Id: lonparmset.pm,v 1.52 2002/06/14 20:14:30 www Exp $ +# +# Copyright Michigan State University Board of Trustees +# +# This file is part of the LearningOnline Network with CAPA (LON-CAPA). +# +# LON-CAPA is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# LON-CAPA is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with LON-CAPA; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# /home/httpd/html/adm/gpl.txt +# +# http://www.lon-capa.org/ +# # (Handler to resolve ambiguous file locations # # (TeX Content Handler # +# YEAR=2000 # 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 Gerd Kortemeyer +# 11/20,11/21,11/22,11/23,11/24,11/25,11/27,11/28, +# 12/08,12/12, +# YEAR=2001 +# 16/01/01,02/08,03/20,03/23,03/24,03/26,05/09, +# 07/05,07/06,08/08,08/09,09/01,09/21 Gerd Kortemeyer +# 12/17 Scott Harrison +# 12/19 Guy Albertelli +# 12/26,12/27 Gerd Kortemeyer +# +### package Apache::lonparmset; use strict; use Apache::lonnet; use Apache::Constants qw(:common :http REDIRECT); +use Apache::loncommon; use GDBM_File; -use Apache::lonmeta; my %courseopt; my %useropt; -my %bighash; my %parmhash; my @ids; my %symbp; +my %mapp; my %typep; +my %keyp; my $uname; my $udom; my $uhome; - my $csec; -my $fcat; - # -------------------------------------------- Figure out a cascading parameter sub parmval { - my ($what,$id)=@_; + my ($what,$id,$def)=@_; + my $result=''; + my @outpar=(); # ----------------------------------------------------- Cascading lookup scheme - my $symbparm=$symbp{$id}.'.'.$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 ($uname) { - 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/'.$bighash{'src_'.$id}.'.meta'; - if (-e $filename) { - my @content; - { - my $fh=Apache::File->new($filename); - @content=<$fh>; - } - if (join('',@content)=~ - /\<$what[^\>]*\>([^\<]*)\<\/$what\>/) { - return $1; - } - } - return ''; -} -# ---------------------------------------------------------------- Sort routine + my $symbparm=$symbp{$id}.'.'.$what; + my $mapparm=$mapp{$id}.'___(all).'.$what; -sub bycat { - if ($fcat eq '') { - $a<=>$b; - } else { - &parmval('0.'.$fcat,$a)<=>&parmval('0.'.$fcat,$b); + 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; } -} -# -------------------------------------------------------- Produces link anchor + if ($courseopt{$courselevelm}) { + $outpar[8]=$courseopt{$courselevelm}; + $result=8; + } -sub plink { - my ($type,$dis,$value,$marker,$return,$call)=@_; - return ''. - (($type=~/^date/)?localtime($value):$value).''; -} + if ($courseopt{$courselevelr}) { + $outpar[7]=$courseopt{$courselevelr}; + $result=7; + } -# ================================================================ Main Handler + 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; + } + } -sub handler { - my $r=shift; +# ---------------------------------------------------------- fourth, check user - if ($r->header_only) { - $r->content_type('text/html'); - $r->send_http_header; - return OK; - } + 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; + } + } -# ----------------------------------------------------- Needs to be in a course + return ($result,@outpar); +} - if (($ENV{'request.course.fn'}) && - (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'}))) { -# -------------------------------------------------------- Variable declaration +# ------------------------------------------------------------ Output for value - %courseopt=(); - %useropt=(); - %bighash=(); - - @ids=(); - %symbp=(); - %typep=(); - - $uname=$ENV{'form.uname'}; - $udom=$ENV{'form.udom'}; - unless ($udom) { $uname=''; } - $uhome=''; - my $message=''; - if ($uname) { - $uhome=&Apache::lonnet::homeserver($uname,$udom); - } - if ($uhome eq 'no_host') { - $message= - "

Unknown User $uname at Domain $udom

"; - $uname=''; - } - - $csec=$ENV{'form.csec'}; - unless ($csec) { $csec=''; } - $fcat=$ENV{'form.fcat'}; - unless ($fcat) { $fcat=''; } +sub valout { + my ($value,$type)=@_; + return ($value?(($type=~/^date/)?localtime($value):$value):'  '); +} -# ------------------------------------------------------------------- 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))) { +# -------------------------------------------------------- Produces link anchor -# -------------------------------------------------------------- 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); - } +sub plink { + my ($type,$dis,$value,$marker,$return,$call)=@_; + my $winvalue=$value; + unless ($winvalue) { + if ($type=~/^date/) { + $winvalue=$ENV{'form.recent_'.$type}; + } else { + $winvalue=$ENV{'form.recent_'.(split(/\_/,$type))[0]}; } -# --------------------------------------------------------- Get all assessments - map { - if ($_=~/^src\_(\d+)\.(\d+)$/) { - my $mapid=$1; - my $resid=$2; - my $id=$mapid.'.'.$resid; - if ($bighash{$_}=~/\.(problem|exam|quiz|assess|survey|form)$/) { - $ids[$#ids+1]=$id; - $typep{$id}=$1; - $symbp{$id}= - &Apache::lonnet::declutter($bighash{'map_id_'.$mapid}). - '___'.$resid.'___'. - &Apache::lonnet::declutter($bighash{$_}); - } - } - } keys %bighash; -# ------------------------------------------------------------------- Sort this - @ids=sort bycat @ids; -# ------------------------------------------------------------------ Start page - $r->content_type('text/html'); - $r->send_http_header; - $r->print(<'. + &valout($value,$type).''; +} + + +sub startpage { + my ($r,$id,$udom,$csec,$uname)=@_; + $r->content_type('text/html'); + $r->send_http_header; + $r->print(< -LON-CAPA Assessment Parameters +LON-CAPA Course Parameters -

Set Assessment Parameters

+

Set Course Parameters

+
+

Course: $ENV{'course.'.$ENV{'request.course.id'}.'.description'}

+

Course Environment

+ +
+
+

Course Assessments

+ +Section/Group: + +
+For User + +or ID + +at Domain + +
+ + + ENDHEAD - $r->print("

Course: $ENV{'course.'. - $ENV{'request.course.id'}.'.description'}

"); - if ($csec) { - $r->print("

Section/Group: $csec

"); - } - if ($uname) { - $r->print("

For User $uname at Domain $udom"); - } - if ($uhome eq 'no_host') { - $r->print($message); - } - $r->print("\n\n"); - map { + +} + +sub print_row { + my ($r,$which,$part,$name,$rid,$default,$type,$display,$defbgone, + $defbgtwo)=@_; + my ($result,@outpar)=&parmval($$part{$which}.'.'.$$name{$which}, + $rid,$$default{$which}); + $r->print("'); +} + +sub assessparms { + + my $r=shift; +# -------------------------------------------------------- Variable declaration + my %allkeys; + my %allmaps; + my %defp; + %courseopt=(); + %useropt=(); + my %bighash=(); + + @ids=(); + %symbp=(); + %typep=(); + + my $message=''; + + $csec=$ENV{'form.csec'}; + $udom=$ENV{'form.udom'}; + unless ($udom) { $udom=$r->dir_config('lonDefDomain'); } + + my $pscat=$ENV{'form.pscat'}; + my $pschp=$ENV{'form.pschp'}; + my $pssymb=''; + +# ----------------------------------------------- Was this started from grades? + + if (($ENV{'form.command'} eq 'set') && ($ENV{'form.url'}) + && (!$ENV{'form.dis'})) { + my $url=$ENV{'form.url'}; + $url=~s-^http://($ENV{'SERVER_NAME'}|$ENV{'HTTP_HOST'})--; + $pssymb=&Apache::lonnet::symbread($url); + $pscat='all'; + $pschp=''; + } elsif ($ENV{'form.symb'}) { + $pssymb=$ENV{'form.symb'}; + $pscat='all'; + $pschp=''; + } else { + $ENV{'form.url'}=''; + } + + my $id=$ENV{'form.id'}; + if (($id) && ($udom)) { + $uname=(&Apache::lonnet::idget($udom,$id))[1]; + if ($uname) { + $id=''; + } else { + $message= + "Unknown ID '$id' at domain '$udom'"; + } + } else { + $uname=$ENV{'form.uname'}; + } + unless ($udom) { $uname=''; } + $uhome=''; + if ($uname) { + $uhome=&Apache::lonnet::homeserver($uname,$udom); + if ($uhome eq 'no_host') { + $message= + "Unknown user '$uname' at domain '$udom'"; + $uname=''; + } else { + $csec=&Apache::lonnet::usection($udom,$uname, + $ENV{'request.course.id'}); + if ($csec eq '-1') { + $message="". + "User '$uname' at domain '$udom' not ". + "in this course"; + $uname=''; + $csec=$ENV{'form.csec'}; + } else { + my %name=&Apache::lonnet::userenvironment($udom,$uname, + ('firstname','middlename','lastname','generation','id')); + $message="\n

\nFull Name: ". + $name{'firstname'}.' '.$name{'middlename'}.' ' + .$name{'lastname'}.' '.$name{'generation'}. + "
\nID: ".$name{'id'}.'

'; + } + } + } + + unless ($csec) { $csec=''; } + + my $fcat=$ENV{'form.fcat'}; + unless ($fcat) { $fcat=''; } + +# ------------------------------------------------------------------- Tie hashs + if (!(tie(%bighash,'GDBM_File',$ENV{'request.course.fn'}.'.db', + &GDBM_READER,0640))) { + $r->print("Unable to access course data. (File $ENV{'request.course.fn'}.db not tieable)"); + return ; + } + 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 + foreach (keys %bighash) { + 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}=''; + foreach (split(/\,/, + &Apache::lonnet::metadata($srcf,'keys'))) { + if ($_=~/^parameter\_(.*)/) { + my $key=$_; + my $allkey=$1; + $allkey=~s/\_/\./; + my $display= + &Apache::lonnet::metadata($srcf,$key.'.display'); + unless ($display) { + $display= + &Apache::lonnet::metadata($srcf,$key.'.name'); + } + $allkeys{$allkey}=$display; + if ($allkey eq $fcat) { + $defp{$id}= + &Apache::lonnet::metadata($srcf,$key); + } + if ($keyp{$id}) { + $keyp{$id}.=','.$key; + } else { + $keyp{$id}=$key; + } + } + } + $mapp{$id}= + &Apache::lonnet::declutter($bighash{'map_id_'.$mapid}); + $allmaps{$mapid}=$mapp{$id}; + $symbp{$id}=$mapp{$id}. + '___'.$resid.'___'. + &Apache::lonnet::declutter($srcf); + } + } + } +# ---------------------------------------------------------- Anything to store? + if ($ENV{'form.pres_marker'}) { + my ($sresid,$spnam,$snum)=split(/\&/,$ENV{'form.pres_marker'}); + $spnam=~s/\_([^\_]+)$/\.$1/; +# ---------------------------------------------------------- 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; } + + my %storecontent = ($storeunder => $ENV{'form.pres_value'}, + $storeunder.'type' => $ENV{'form.pres_type'}); + my $reply=''; + if ($snum>3) { +# ---------------------------------------------------------------- Store Course +# +# Expire sheets + &Apache::lonnet::expirespread('','','studentcalc'); + if (($snum==7) || ($snum==4)) { + &Apache::lonnet::expirespread('','','assesscalc',$symbp{$sresid}); + } elsif (($snum==8) || ($snum==5)) { + &Apache::lonnet::expirespread('','','assesscalc',$mapp{$sresid}); + } else { + &Apache::lonnet::expirespread('','','assesscalc'); + } +# Store parameter + $reply=&Apache::lonnet::cput + ('resourcedata',\%storecontent, + $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}, + $ENV{'course.'.$ENV{'request.course.id'}.'.num'}); + } else { +# ------------------------------------------------------------------ Store User +# +# Expire sheets + &Apache::lonnet::expirespread($uname,$udom,'studentcalc'); + if ($snum==1) { + &Apache::lonnet::expirespread + ($uname,$udom,'assesscalc',$symbp{$sresid}); + } elsif ($snum==2) { + &Apache::lonnet::expirespread + ($uname,$udom,'assesscalc',$mapp{$sresid}); + } else { + &Apache::lonnet::expirespread($uname,$udom,'assesscalc'); + } +# Store parameter + $reply=&Apache::lonnet::cput + ('resourcedata',\%storecontent,$udom,$uname); + } + + if ($reply=~/^error\:(.*)/) { + $message.="Write Error: $1"; + } +# ---------------------------------------------------------------- Done storing + } +# -------------------------------------------------------------- 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 + + @ids=sort { + if ($fcat eq '') { + $a<=>$b; + } else { + my ($result,@outpar)=&parmval($fcat,$a,$defp{$a}); + my $aparm=$outpar[$result]; + ($result,@outpar)=&parmval($fcat,$b,$defp{$b}); + my $bparm=$outpar[$result]; + 1*$aparm<=>1*$bparm; + } + } @ids; + +# ------------------------------------------------------------------ Start page + &startpage($r,$id,$udom,$csec,$uname); +# if ($ENV{'form.url'}) { +# $r->print(''); +# } + foreach ('tolerance','date_default','date_start','date_end', + 'date_interval','int','float','string') { + $r->print(''); + } + + $r->print('

'.$message.'

'. + &plink($$type{$value},$$display{$value},$$outpar[$which], + $mprefix."$which",'parmform.pres','psub').'
'); + $r->print(''); + } + $r->print('
Sort list by'); + $r->print('
Select Enclosing Map
Specfic Resource 
Select Parameter

'); + if (($pscat) || ($pschp) || ($pssymb)) { +# ----------------------------------------------------------------- Start Table + my $catmarker='parameter_'.$pscat; + $catmarker=~s/\./\_/g; + my $coursespan=$csec?8:5; + my $csuname=$ENV{'user.name'}; + my $csudom=$ENV{'user.domain'}; + $r->print(< + + +ENDTABLEHEAD + if ($uname) { + $r->print(""); + } + $r->print(<Parameter in Effect + + + + +ENDTABLETWO + if ($csec) { + $r->print(""); + } + $r->print(< + + + +ENDTABLEHEADFOUR + if ($csec) { + $r->print(''); + } + if ($uname) { + $r->print(''); + } + $r->print(''); + my $defbgone=''; + my $defbgtwo=''; + foreach (@ids) { + my $rid=$_; + my ($inmapid)=($rid=~/\.(\d+)$/); + if (($pschp eq 'all') || ($allmaps{$pschp} eq $mapp{$rid}) || + ($pssymb eq $symbp{$rid})) { # ------------------------------------------------------ Entry for one resource - my $rid=$_; - my $thistitle=''; - my @part=(0,1,1); - my @name=('deadline','sig','tol'); - my @display=('Deadline','Significant Figures','Tolerance'); - my @type=('date','int','tolerance'); - my %metadata=&Apache::lonmeta::unpackagemeta( -&Apache::lonnet::getfile('/home/httpd/html/'.$bighash{'src_'.$rid}.'.meta'),1); - map { - if ($_=~/^parameter\_(\d+)\_(\w+)$/) { - $part[$#part+1]=$1; - $name[$#name+1]=$2; - ($type[$#type+1],$display[$#display+1])= - split(/\_\_dis\_\_/,$metadata{$_}); - unless ($display[$#display]) { - $display[$#display]=$name[$#name]; - } - } - if ($_ eq 'title') { - $thistitle=$metadata{$_}; - } - } keys %metadata; - my $totalparms=$#name+1; - $r->print(''); - my $i; - for ($i=0;$i<$totalparms;$i++) { - $r->print(""); - $r->print(''); - $r->print("\n"); - } + if ($defbgone eq '"E0E099"') { + $defbgone='"E0E0DD"'; + } else { + $defbgone='"E0E099"'; + } + if ($defbgtwo eq '"FFFF99"') { + $defbgtwo='"FFFFDD"'; + } else { + $defbgtwo='"FFFF99"'; + } + my $thistitle=''; + my %name= (); + undef %name; + my %part= (); + my %display=(); + my %type= (); + my %default=(); + my $uri=&Apache::lonnet::declutter($bighash{'src_'.$rid}); + + foreach (split(/\,/,$keyp{$rid})) { + if (($_ eq $catmarker) || ($pscat eq 'all')) { + $part{$_}=&Apache::lonnet::metadata($uri,$_.'.part'); + $name{$_}=&Apache::lonnet::metadata($uri,$_.'.name'); + $display{$_}=&Apache::lonnet::metadata($uri,$_.'.display'); + unless ($display{$_}) { $display{$_}=''; } + $display{$_}.=' ('.$name{$_}.')'; + $default{$_}=&Apache::lonnet::metadata($uri,$_); + $type{$_}=&Apache::lonnet::metadata($uri,$_.'.type'); + $thistitle=&Apache::lonnet::metadata($uri,$_.'.title'); + } + } + my $totalparms=scalar keys %name; + if ($totalparms>0) { + my $firstrow=1; + $r->print(''); + $r->print(''); + $r->print(''); + foreach (sort keys %name) { + unless ($firstrow) { + $r->print(''); + } else { + $firstrow=0; + } + &print_row($r,$_,\%part,\%name,$rid,\%default, + \%type,\%display,$defbgone,$defbgtwo); + } + } # -------------------------------------------------- End entry for one resource - } @ids; - $r->print('
Any UserUser $uname at Domain $udomCurrent Session Value
($csuname at $csudom)
Resource Levelin Coursein Section/Group $csec
Assessment URL and TitleTypeEnclosing MapPart No.Parameter Namedefaultfrom Enclosing Mapgeneralfor Enclosing Mapfor Resourcegeneralfor Enclosing Mapfor Resourcegeneralfor Enclosing Mapfor Resource
'. - $bighash{'src_'.$rid}.'

'. - $bighash{'title_'.$rid}); - if ($thistitle) { - $r->print(' ('.$thistitle.')'); - } - $r->print('

$part[$i]$display[$i]'.&plink($type[$i],$display[$i],'987684455').'
'. + join(' / ',split(/\//,$uri)). + '

'. + $bighash{'title_'.$rid}); + if ($thistitle) { + $r->print(' ('.$thistitle.')'); + } + $r->print('

'.$typep{$rid}.''. + join(' / ',split(/\//,$mapp{$rid})).'
'); - untie(%bighash); - untie(%parmhash); - } - } else { + } + } + $r->print(''); + } + $r->print(''); + untie(%bighash); + untie(%parmhash); +} + +# Set course environment parameters +sub crsenv { + my $r=shift; + my $setoutput=''; + my $dom = $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}; + my $crs = $ENV{'course.'.$ENV{'request.course.id'}.'.num'}; +# -------------------------------------------------- Go through list of changes + foreach (keys %ENV) { + if ($_=~/^form\.(.+)\_setparmval$/) { + my $name=$1; + my $value=$ENV{'form.'.$name.'_value'}; + if ($name eq 'newp') { + $name=$ENV{'form.newp_name'}; + } + if ($name eq 'url') { + $value=~s/^\/res\///; + my @tmp = &Apache::lonnet::get + ('environment',['url'],$dom,$crs); + $setoutput.='Backing up previous URL: '. + &Apache::lonnet::put + ('environment', + {'top level map backup ' => $tmp[1] }, + $dom,$crs). + '
'; + } + if ($name) { + $setoutput.='Setting '.$name.' to '. + $value.': '. + &Apache::lonnet::put + ('environment',{$name=>$value},$dom,$crs). + '
'; + } + } + } +# -------------------------------------------------------- Get parameters again + + my %values=&Apache::lonnet::dump('environment',$dom,$crs); + my $output=''; + if (! exists($values{'con_lost'})) { + my %descriptions= + ('url' => 'Top Level Map '. + '". + 'Browse
'. + 'Modification may make assessment data '. + 'inaccessible', + 'description' => 'Course Description', + 'courseid' => 'Course ID or number
'. + '(internal, optional)', + 'default_xml_style' => 'Default XML Style File '. + 'Browse
", + 'question.email' => 'Feedback Addresses for Content '. + 'Questions
(user:domain,'. + 'user:domain,...)', + 'comment.email' => 'Feedback Addresses for Comments
'. + '(user:domain,user:domain,...)', + 'policy.email' => 'Feedback Addresses for Course Policy'. + '
(user:domain,user:domain,...)', + 'hideemptyrows' => 'Hide Empty Rows in Spreadsheets
'. + '("yes" for default hiding)', + 'pch.roles.denied'=> 'Disallow Resource Discussion for '. + 'Students
"st": '. + 'student, "ta": '. + 'TA, "in": '. + 'instructor;
role,role,...)', + 'spreadsheet_default_classcalc' + => 'Default Course Spreadsheet '. + 'Browse
", + 'spreadsheet_default_studentcalc' + => 'Default Student Spreadsheet '. + 'Browse
", + 'spreadsheet_default_assesscalc' + => 'Default Assessment Spreadsheet '. + 'Browse
", + ); + foreach (keys(%values)) { + unless ($descriptions{$_}) { + $descriptions{$_}=$_; + } + } + foreach (sort keys %descriptions) { + # onchange is javascript to automatically check the 'Set' button. + my $onchange = 'onchange="javascript:window.document.forms'. + '[\'envform\'].elements[\''.$_.'_setparmval\']'. + '.checked=true;"'; + $output.=''.$descriptions{$_}.''. + ''. + ''. + ''."\n"; + } + my $onchange = 'onchange="javascript:window.document.forms'. + '[\'envform\'].elements[\'newp_setparmval\']'. + '.checked=true;"'; + $output.='Create New Environment Variable
'. + ''. + ''. + ''; + } + $r->print(< + + +LON-CAPA Course Environment + + +

Set Course Parameters

+
+

Course: $ENV{'course.'.$ENV{'request.course.id'}.'.description'}

+

Course Environment

+$setoutput +

+ + +$output +
ParameterValueSet?
+ +

+ + +ENDENV +} + +# ================================================================ Main Handler + +sub handler { + my $r=shift; + + if ($r->header_only) { + $r->content_type('text/html'); + $r->send_http_header; + return OK; + } + &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}); +# ----------------------------------------------------- Needs to be in a course + + if (($ENV{'request.course.id'}) && + (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'}))) { + + unless (($ENV{'form.crsenv'}) || (!$ENV{'request.course.fn'})) { +# --------------------------------------------------------- Bring up assessment + &assessparms($r); +# ---------------------------------------------- This is for course environment + } else { + &crsenv($r); + } + } 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; + $ENV{'user.error.msg'}= + "/adm/parmset:opa:0:0:Cannot modify assessment parameters"; + return HTTP_NOT_ACCEPTABLE; + } + return OK; } 1; __END__ +=head1 NAME + +Apache::lonparmset - Handler to set parameters for assessments + +=head1 SYNOPSIS + +Invoked by /etc/httpd/conf/srm.conf: + + + PerlAccessHandler Apache::lonacc + SetHandler perl-script + PerlHandler Apache::lonparmset + ErrorDocument 403 /adm/login + ErrorDocument 406 /adm/roles + ErrorDocument 500 /adm/errorhandler + + +=head1 INTRODUCTION + +This module sets assessment parameters. + +This is part of the LearningOnline Network with CAPA project +described at http://www.lon-capa.org. + +=head1 HANDLER SUBROUTINE + +This routine is called by Apache and mod_perl. + +=over 4 + +=item * + +need to be in course + +=item * + +bring up assessment screen or course environment + +=back + +=head1 OTHER SUBROUTINES + +=over 4 + +=item * + +parmval() : figure out a cascading parameter + +=item * + +valout() : format a value for output + +=item * + +plink() : produces link anchor + +=item * + +assessparms() : show assess data and parameters + +=item * + +crsenv() : for the course environment +=back +=cut