--- loncom/interface/lonparmset.pm 2001/05/10 01:06:06 1.29 +++ loncom/interface/lonparmset.pm 2004/06/04 22:56:45 1.163 @@ -1,142 +1,272 @@ # The LearningOnline Network with CAPA # Handler to set parameters for assessments # -# (Handler to resolve ambiguous file locations +# $Id: lonparmset.pm,v 1.163 2004/06/04 22:56:45 albertel Exp $ # -# (TeX Content Handler +# Copyright Michigan State University Board of Trustees # -# 05/29/00,05/30,10/11 Gerd Kortemeyer) +# This file is part of the LearningOnline Network with CAPA (LON-CAPA). # -# 10/11,10/12,10/16 Gerd Kortemeyer) +# 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. # -# 11/20,11/21,11/22,11/23,11/24,11/25,11/27,11/28, -# 12/08,12/12, -# 16/01/01,02/08,03/20,03/23,03/24,03/26,05/09 Gerd Kortemeyer +# 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/ +# +################################################################### +################################################################### + +=pod + +=head1 NAME + +lonparmset - Handler to set parameters for assessments and course + +=head1 SYNOPSIS + +lonparmset provides an interface to setting course parameters. + +=head1 DESCRIPTION + +This module sets coursewide and assessment parameters. + +=head1 INTERNAL SUBROUTINES + +=over 4 + +=cut + +################################################################### +################################################################### package Apache::lonparmset; use strict; use Apache::lonnet; use Apache::Constants qw(:common :http REDIRECT); +use Apache::lonhtmlcommon(); +use Apache::loncommon; use GDBM_File; - +use Apache::lonhomework; +use Apache::lonxml; +use Apache::lonlocal; my %courseopt; my %useropt; -my %bighash; my %parmhash; -my @outpar; - my @ids; my %symbp; my %mapp; my %typep; my %keyp; -my %defp; -my %allkeys; -my %allmaps; +my %maptitles; my $uname; my $udom; my $uhome; - my $csec; +my $coursename; + +################################################## +################################################## + +=pod + +=item parmval + +Figure out a cascading parameter. + +Inputs: $what - a parameter spec (incluse part info and name I.E. 0.weight) + $id - a bighash Id number + $def - the resource's default value 'stupid emacs -my $fcat; +Returns: A list, the first item is the index into the remaining list of items of parm valuse that is the active one, the list consists of parm values at the 11 possible levels -# -------------------------------------------- Figure out a cascading parameter +11- resource default +10- map default +9 - General Course +8 - Map or Folder level in course +7 - resource level in course +6 - General for section +5 - Map or Folder level for section +4 - resource level in section +3 - General for specific student +2 - Map or Folder level for specific student +1 - resource level for specific student +=cut + +################################################## +################################################## sub parmval { my ($what,$id,$def)=@_; my $result=''; - @outpar=(); + my @outpar=(); # ----------------------------------------------------- Cascading lookup scheme - my $symbparm=$symbp{$id}.'.'.$what; - my $mapparm=$mapp{$id}.'___(all).'.$what; + 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; + 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; } + if (defined($def)) { $outpar[11]=$def; $result=11; } # ----------------------------------------------------- second, check map parms - my $thisparm=$parmhash{$symbparm}; - if ($thisparm) { $outpar[10]=$thisparm; - $result=10; } + my $thisparm=$parmhash{$symbparm}; + if (defined($thisparm)) { $outpar[10]=$thisparm; $result=10; } # --------------------------------------------------------- third, check course - if ($courseopt{$courselevel}) { $outpar[9]=$courseopt{$courselevel}; - $result=9; } + if (defined($courseopt{$courselevel})) { + $outpar[9]=$courseopt{$courselevel}; + $result=9; + } - if ($courseopt{$courselevelm}) { $outpar[8]=$courseopt{$courselevelm}; - $result=8; } + if (defined($courseopt{$courselevelm})) { + $outpar[8]=$courseopt{$courselevelm}; + $result=8; + } - if ($courseopt{$courselevelr}) { $outpar[7]=$courseopt{$courselevelr}; - $result=7; } + if (defined($courseopt{$courselevelr})) { + $outpar[7]=$courseopt{$courselevelr}; + $result=7; + } - if ($csec) { + if (defined($csec)) { + if (defined($courseopt{$seclevel})) { + $outpar[6]=$courseopt{$seclevel}; + $result=6; + } + if (defined($courseopt{$seclevelm})) { + $outpar[5]=$courseopt{$seclevelm}; + $result=5; + } + + if (defined($courseopt{$seclevelr})) { + $outpar[4]=$courseopt{$seclevelr}; + $result=4; + } + } - if ($courseopt{$seclevel}) { $outpar[6]=$courseopt{$seclevel}; - $result=6; } +# ---------------------------------------------------------- fourth, check user - if ($courseopt{$seclevelm}) { $outpar[5]=$courseopt{$seclevelm}; - $result=5; } - - if ($courseopt{$seclevelr}) { $outpar[4]=$courseopt{$seclevelr}; - $result=4; } - - } + if (defined($uname)) { + if (defined($useropt{$courselevel})) { + $outpar[3]=$useropt{$courselevel}; + $result=3; + } + + if (defined($useropt{$courselevelm})) { + $outpar[2]=$useropt{$courselevelm}; + $result=2; + } + + if (defined($useropt{$courselevelr})) { + $outpar[1]=$useropt{$courselevelr}; + $result=1; + } + } + return ($result,@outpar); +} -# ---------------------------------------------------------- fourth, check user - - if ($uname) { +################################################## +################################################## - if ($useropt{$courselevel}) { $outpar[3]=$useropt{$courselevel}; - $result=3; } +=pod - if ($useropt{$courselevelm}) { $outpar[2]=$useropt{$courselevelm}; - $result=2; } +=item valout - if ($useropt{$courselevelr}) { $outpar[1]=$useropt{$courselevelr}; - $result=1; } +Format a value for output. - } - - return $result; -} +Inputs: $value, $type -# ------------------------------------------------------------ Output for value +Returns: $value, formatted for output. If $type indicates it is a date, +localtime($value) is returned. +=cut + +################################################## +################################################## sub valout { my ($value,$type)=@_; - return - ($value?(($type=~/^date/)?localtime($value):$value):'  '); + my $result = ''; + # Values of zero are valid. + if (! $value && $value ne '0') { + $result = '  '; + } else { + if ($type eq 'date_interval') { + my ($sec,$min,$hour,$mday,$mon,$year)=gmtime($value); + $year=$year-70; + $mday--; + if ($year) { + $result.=$year.' yrs '; + } + if ($mon) { + $result.=$mon.' mths '; + } + if ($mday) { + $result.=$mday.' days '; + } + if ($hour) { + $result.=$hour.' hrs '; + } + if ($min) { + $result.=$min.' mins '; + } + if ($sec) { + $result.=$sec.' secs '; + } + $result=~s/\s+$//; + } elsif ($type=~/^date/) { + $result = localtime($value); + } else { + $result = $value; + } + } + return $result; } -# -------------------------------------------------------- Produces link anchor +################################################## +################################################## +=pod + +=item plink + +Produces a link anchor. + +Inputs: $type,$dis,$value,$marker,$return,$call + +Returns: scalar with html code for a link which will envoke the +javascript function 'pjump'. + +=cut + +################################################## +################################################## sub plink { my ($type,$dis,$value,$marker,$return,$call)=@_; my $winvalue=$value; @@ -148,566 +278,1672 @@ sub plink { } } return - ''. - &valout($value,$type).''; + ''. + &valout($value,$type).''; } -# ================================================================ Main Handler -sub handler { - my $r=shift; +sub startpage { + my ($r,$id,$udom,$csec,$uname,$have_assesments,$trimheader)=@_; - if ($r->header_only) { - $r->content_type('text/html'); - $r->send_http_header; - return OK; - } + my $bodytag=&Apache::loncommon::bodytag('Set/Modify Course Parameters','', + 'onUnload="pclose()"'); + my $chooseopt=&Apache::loncommon::select_dom_form($udom,'udom').' '. + &Apache::loncommon::selectstudent_link('parmform','uname','udom'); + my $selscript=&Apache::loncommon::studentbrowser_javascript(); + my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition(); + my %lt=&Apache::lonlocal::texthash( + 'cep' => "Course Environment Parameters", + 'scep' => "Set Course Environment Parameters", + 'smcap' => "Set/Modify Course Assessment Parameter", + 'mcap' => "Modify Course Assessment Parameters", + 'caphm' => "Course Assessment Parameter - Helper Mode", + 'capom' => "Course Assessment Parameters - Overview Mode", + 'captm' => "Course Assessments Parameters - Table Mode", + 'sg' => "Section/Group", + 'fu' => "For User", + 'oi' => "or ID", + 'ad' => "at Domain" + ); + my $overallhelp= + &Apache::loncommon::help_open_topic("Course_Setting_Parameters"). + &Apache::loncommon::help_open_faq(10). + &Apache::loncommon::help_open_bug('Instructor Interface'); + my $assessparmhelp=&Apache::loncommon::help_open_topic("Cascading_Parameters","Assessment Parameters"); + $r->print(< + +LON-CAPA Course Parameters + +$selscript + +$bodytag + +ENDHEAD - 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=''; - } else { - $ENV{'form.url'}=''; - } + unless ($trimheader) {$r->print(< +

$lt{'cep'}

+ + +
+$assessparmhelp +
+

$lt{'caphm'}

+ +
+
+
+

$lt{'capom'}

+ +
+
+ENDHEAD2 +} + $r->print(< +

$lt{'captm'}

+ENDHEAD3 + + if (!$have_assesments) { + $r->print(''.&mt('There are no assesment parameters in this course to set.').'
'); + } else { + $r->print(< +$lt{'sg'}: + +
+$lt{'fu'} + +$lt{'oi'} + +$lt{'ad'} +$chooseopt + + + + +ENDHEAD + } +} + +sub print_row { + my ($r,$which,$part,$name,$rid,$default,$defaulttype,$display,$defbgone, + $defbgtwo,$parmlev)=@_; +# get the values for the parameter in cascading order +# empty levels will remain empty + my ($result,@outpar)=&parmval($$part{$which}.'.'.$$name{$which}, + $rid,$$default{$which}); +# get the type for the parameters +# problem: these may not be set for all levels + my ($typeresult,@typeoutpar)=&parmval($$part{$which}.'.'. + $$name{$which}.'.type', + $rid,$$defaulttype{$which}); +# cascade down manually + my $cascadetype=$defaulttype; + for (my $i=$#typeoutpar;$i>0;$i--) { + if ($typeoutpar[$i]) { + $cascadetype=$typeoutpar[$i]; + } else { + $typeoutpar[$i]=$cascadetype; + } + } - 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=''; + my $parm=$$display{$which}; + + if ($parmlev eq 'full' || $parmlev eq 'brief') { + $r->print('' + .$$part{$which}.''); + } else { + $parm=~s|\[.*\]\s||g; + } + + $r->print(''.$parm.''); + + my $thismarker=$which; + $thismarker=~s/^parameter\_//; + my $mprefix=$rid.'&'.$thismarker.'&'; + + if ($parmlev eq 'general') { + + if ($uname) { + &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); + } elsif ($csec) { + &print_td($r,6,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); + } else { + &print_td($r,9,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); + } + } elsif ($parmlev eq 'map') { + + if ($uname) { + &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); + } elsif ($csec) { + &print_td($r,5,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); } 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'}.'

'; - } + &print_td($r,8,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); } - } + } else { - unless ($csec) { $csec=''; } + &print_td($r,11,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); - $fcat=$ENV{'form.fcat'}; - unless ($fcat) { $fcat=''; } + if ($parmlev eq 'brief') { -# ------------------------------------------------------------------- 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))) { + &print_td($r,7,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); -# --------------------------------------------------------- Get all assessments - undef %allkeys; - undef %allmaps; - undef %defp; - 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; - $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; - } - } - } split(/\,/, - &Apache::lonnet::metadata($srcf,'keys')); - $mapp{$id}= - &Apache::lonnet::declutter($bighash{'map_id_'.$mapid}); - $allmaps{$mapid}=$mapp{$id}; - $symbp{$id}=$mapp{$id}. + if ($csec) { + &print_td($r,4,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); + } + if ($uname) { + &print_td($r,1,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); + } + } else { + + &print_td($r,10,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); + &print_td($r,9,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); + &print_td($r,8,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); + &print_td($r,7,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); + + if ($csec) { + &print_td($r,6,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); + &print_td($r,5,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); + &print_td($r,4,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); + } + if ($uname) { + &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); + &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); + &print_td($r,1,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); + } + } # end of $brief if/else + } # end of $parmlev if/else + + $r->print(''. + &valout($outpar[$result],$typeoutpar[$result]).''); + + if ($parmlev eq 'full' || $parmlev eq 'brief') { + my $sessionval=&Apache::lonnet::EXT('resource.'.$$part{$which}. + '.'.$$name{$which},$symbp{$rid}); + +# this doesn't seem to work, and I don't think is correct +# my $sessionvaltype=&Apache::lonnet::EXT('resource.'.$$part{$which}. +# '.'.$$name{$which}.'.type',$symbp{$rid}); +# this seems to work + my $sessionvaltype=$typeoutpar[$result]; + if (!defined($sessionvaltype)) { $sessionvaltype=$$defaulttype{$which}; } + $r->print(''. + &valout($sessionval,$sessionvaltype).' '. + ''); + } + $r->print(''); + $r->print("\n"); +} + +sub print_td { + my ($r,$which,$defbg,$result,$outpar,$mprefix,$value,$typeoutpar,$display)=@_; + $r->print(''); + if ($which<10) { + $r->print(&plink($$typeoutpar[$which], + $$display{$value},$$outpar[$which], + $mprefix."$which",'parmform.pres','psub')); + } else { + $r->print(&valout($$outpar[$which],$$typeoutpar[$which])); + } + $r->print(''."\n"); +} + +=pod + +=item B: Given the course data hash, extractResourceInformation extracts lots of information about the course's resources into a variety of hashes. + +Input: See list below: + +=over 4 + +=item B: An array that will contain all of the ids in the course. + +=item B: hash, id->type, where "type" contains the extension of the file, thus, I. + +=item B: hash, id->key list, will contain a comma seperated list of the meta-data keys available for the given id + +=item B: hash, name of parameter->display value (what is the display value?) + +=item B: hash, part identification->text representation of part, where the text representation is "[Part $part]" + +=item B: hash, full key to part->display value (what's display value?) + +=item B: hash, ??? + +=item B: ??? + +=item B: hash, ??? + +=item B: ?? + +=item B: hash, id->full sym? + +=back + +=cut + +sub extractResourceInformation { + my $bighash = shift; + my $ids = shift; + my $typep = shift; + my $keyp = shift; + my $allparms = shift; + my $allparts = shift; + my $allkeys = shift; + my $allmaps = shift; + my $fcat = shift; + my $defp = shift; + my $mapp = shift; + my $symbp = shift; + my $maptitles=shift; + + 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)$/) { + if (1) { + $$ids[$#$ids+1]=$id; + $$typep{$id}=$1; + $$keyp{$id}=''; + foreach (split(/\,/,&Apache::lonnet::metadata($srcf,'allpossiblekeys'))) { + if ($_=~/^parameter\_(.*)/) { + my $key=$_; + my $allkey=$1; + $allkey=~s/\_/\./g; + my $display= &Apache::lonnet::metadata($srcf,$key.'.display'); + my $name=&Apache::lonnet::metadata($srcf,$key.'.name'); + my $part= &Apache::lonnet::metadata($srcf,$key.'.part'); + my $parmdis = $display; + $parmdis =~ s|(\[Part.*$)||g; + my $partkey = $part; + $partkey =~ tr|_|.|; + $$allparms{$name} = $parmdis; + $$allparts{$part} = "[Part $part]"; + $$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}); + $$mapp{$mapid}=$$mapp{$id}; + $$allmaps{$mapid}=$$mapp{$id}; + $$maptitles{$mapid}= + $$bighash{'title_'.$$bighash{'ids_'.&Apache::lonnet::clutter($$mapp{$id})}}; + $$maptitles{$$mapp{$id}}=$$maptitles{$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 + $$symbp{$mapid}=$$mapp{$id}.'___(all)'; + } + } + } +} + +################################################## +################################################## + +=pod + +=item assessparms - my $symbparm=$symbp{$sresid}.'.'.$spnam; - my $mapparm=$mapp{$sresid}.'___(all).'.$spnam; +Show assessment data and parameters. This is a large routine that should +be simplified and shortened... someday. - 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); +Inputs: $r + +Returns: nothing + +Variables used (guessed by Jeremy): + +=over 4 + +=item B: ParameterS CATegories? ends up a list of the types of parameters that exist, e.g., tol, weight, acc, opendate, duedate, answerdate, sig, maxtries, type. + +=item B: ParameterS PaRTs? a list of the parts of a problem that we are displaying? Used to display only selected parts? + +=item B: + +=back + +=cut + +################################################## +################################################## +sub assessparms { + + my $r=shift; +# -------------------------------------------------------- Variable declaration + my %allkeys=(); + my %allmaps=(); + my %alllevs=(); + + $alllevs{'Resource Level'}='full'; +# $alllevs{'Resource Level [BRIEF]'}='brief'; + $alllevs{'Map Level'}='map'; + $alllevs{'Course Level'}='general'; + + my %allparms; + my %allparts; + + 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=&Apache::loncommon::get_env_multiple('form.pscat'); + my $pschp=$ENV{'form.pschp'}; + my @psprt=&Apache::loncommon::get_env_multiple('form.psprt'); + if (!@psprt) { $psprt[0]='0'; } + my $showoptions=$ENV{'form.showoptions'}; + + my $pssymb=''; + my $parmlev=''; + my $trimheader=''; + my $prevvisit=$ENV{'form.prevvisit'}; + +# unless ($parmlev==$ENV{'form.parmlev'}) { +# $parmlev = 'full'; +# } - my $storecontent= - $storeunder.'='.&Apache::lonnet::escape($ENV{'form.pres_value'}).'&'. - $storeunder.'.type='.&Apache::lonnet::escape($ENV{'form.pres_type'}); + unless ($ENV{'form.parmlev'}) { + $parmlev = 'map'; + } else { + $parmlev = $ENV{'form.parmlev'}; + } + +# ----------------------------------------------- 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); + if (!@pscat) { @pscat=('all'); } + $pschp=''; + $parmlev = 'full'; + $trimheader='yes'; + } elsif ($ENV{'form.symb'}) { + $pssymb=$ENV{'form.symb'}; + if (!@pscat) { @pscat=('all'); } + $pschp=''; + $parmlev = 'full'; + $trimheader='yes'; + } else { + $ENV{'form.url'}=''; + } + + my $id=$ENV{'form.id'}; + if (($id) && ($udom)) { + $uname=(&Apache::lonnet::idget($udom,$id))[1]; + if ($uname) { + $id=''; + } else { + $message= + "".&mt("Unknown ID")." '$id' ". + &mt('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= + "".&mt("Unknown user")." '$uname' ". + &mt("at domain")." '$udom'"; + $uname=''; + } else { + $csec=&Apache::lonnet::getsection($udom,$uname, + $ENV{'request.course.id'}); + if ($csec eq '-1') { + $message="". + &mt("User")." '$uname' ".&mt("at domain")." '$udom' ". + &mt("not in this course").""; + $uname=''; + $csec=$ENV{'form.csec'}; + } else { + my %name=&Apache::lonnet::userenvironment($udom,$uname, + ('firstname','middlename','lastname','generation','id')); + $message="\n

\n".&mt("Full Name").": ". + $name{'firstname'}.' '.$name{'middlename'}.' ' + .$name{'lastname'}.' '.$name{'generation'}. + "
\n".&mt('ID').": ".$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 + extractResourceInformation(\%bighash, \@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allkeys, \%allmaps, $fcat, \%defp, \%mapp, \%symbp,\%maptitles); + + $mapp{'0.0'} = ''; + $symbp{'0.0'} = ''; + +# ---------------------------------------------------------- Anything to store? + if ($ENV{'form.pres_marker'}) { + my ($sresid,$spnam,$snum)=split(/\&/,$ENV{'form.pres_marker'}); + $spnam=~s/\_([^\_]+)$/\.$1/; +# ---------------------------------------------------------- Construct prefixes - my $reply=''; - if ($snum>3) { + 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 $delete; + if ($ENV{'form.pres_value'} eq '') { $delete=1;} + 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'); - } - + 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::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 { + if ($delete) { + $reply=&Apache::lonnet::del + ('resourcedata',[keys(%storecontent)], + $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}, + $ENV{'course.'.$ENV{'request.course.id'}.'.num'}); + } else { + $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) { + if ($snum==1) { &Apache::lonnet::expirespread - ($uname,$udom,'assesscalc',$symbp{$sresid}); - } elsif ($snum==2) { + ($uname,$udom,'assesscalc',$symbp{$sresid}); + } elsif ($snum==2) { &Apache::lonnet::expirespread - ($uname,$udom,'assesscalc',$mapp{$sresid}); - } else { + ($uname,$udom,'assesscalc',$mapp{$sresid}); + } else { &Apache::lonnet::expirespread($uname,$udom,'assesscalc'); - } - + } # Store parameter - $reply= - &Apache::lonnet::critical('put:'.$udom.':'.$uname.':resourcedata:'. - $storecontent,$uhome); - } - - if ($reply=~/^error\:(.*)/) { - $message.="Write Error: $1"; - } + if ($delete) { + $reply=&Apache::lonnet::del + ('resourcedata',[keys(%storecontent)],$udom,$uname); + } else { + $reply=&Apache::lonnet::cput + ('resourcedata',\%storecontent,$udom,$uname); + } + } + + if ($reply=~/^error\:(.*)/) { + $message.="Write Error: $1"; + } # ---------------------------------------------------------------- Done storing - } + $message.='

'.&mt('Changes can take up to 10 minutes before being active for all students.').&Apache::loncommon::help_open_topic('Caching').'

'; + } +# --------------------------------------------- Devalidate cache for this child + &Apache::lonnet::devalidatecourseresdata( + $ENV{'course.'.$ENV{'request.course.id'}.'.num'}, + $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}); + &Apache::lonnet::clear_EXT_cache_status(); # -------------------------------------------------------------- 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{&Apache::lonnet::unescape($name)}= - &Apache::lonnet::unescape($value); - } split(/\&/,$reply); - } + %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) { - my $reply= - &Apache::lonnet::reply('dump:'.$udom.':'.$uname.':resourcedata',$uhome); - if ($reply!~/^error\:/) { - map { - my ($name,$value)=split(/\=/,$_); - $useropt{&Apache::lonnet::unescape($name)}= - &Apache::lonnet::unescape($value); - } split(/\&/,$reply); - } - } + if ($uname) { + %useropt=&Apache::lonnet::dump('resourcedata',$udom,$uname); + } # ------------------------------------------------------------------- Sort this - @ids=sort { - if ($fcat eq '') { - $a<=>$b; - } else { - 1*$outpar[&parmval($fcat,$a,$defp{$a})]<=> - 1*$outpar[&parmval($fcat,$b,$defp{$b})]; - } - } @ids; - + @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; +#----------------------------------------------- if all selected, fill in array + if ($pscat[0] eq "all" || !@pscat) {@pscat = (keys %allparms);} + if ($psprt[0] eq "all" || !@psprt) {@psprt = (keys %allparts);} # ------------------------------------------------------------------ Start page - $r->content_type('text/html'); - $r->send_http_header; - $r->print(< - -LON-CAPA Assessment Parameters - + +LON-CAPA Course Environment - -

Set Assessment Parameters

-
-

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

- -Section/Group: - -
-For User - -or ID - -at Domain - -
- - - -ENDHEAD - if ($ENV{'form.url'}) { - $r->print(''); +$bodytag + +$setoutput +

+ + +$output +
$lt{'par'}$lt{'val'}$lt{'set'}?
+ +

+ + +ENDENV +} +################################################## + +my $tableopen; + +sub tablestart { + if ($tableopen) { + return ''; + } else { + $tableopen=1; + return ''; } - map { - $r->print(''); - } ('tolerance','date_default','date_start','date_end','date_interval', - 'int','float','string'); - - $r->print('

'.$message.'

'.&mt('Parameter').''. + &mt('Delete').''.&mt('Set to ...').'
Sort list by'); - $r->print('
Select Enclosing Map
Select Parameter

' - ); - if (($pscat) || ($pschp) || ($pssymb)) { -# ----------------------------------------------------------------- Start Table - my $catmarker='parameter_'.$pscat; - $catmarker=~s/\./\_/g; - my $coursespan=$csec?8:5; - $r->print(< - - -ENDTABLEHEAD - if ($uname) { - $r->print(""); +} + +sub tableend { + if ($tableopen) { + $tableopen=0; + return '
Any UserUser $uname at Domain $udom
'; + } else { + return''; } - $r->print(<Parameter in Effect -Resource Level -in Course -ENDTABLETWO - if ($csec) { - $r->print("in Section/Group $csec"); +} + +sub overview { + my $r=shift; + my $bodytag=&Apache::loncommon::bodytag( + 'Set/Modify Course Assessment Parameters'); + my $dom = $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}; + my $crs = $ENV{'course.'.$ENV{'request.course.id'}.'.num'}; + $r->print(< + +LON-CAPA Course Environment + +$bodytag +
+ +ENDOVER +# Setting + my %olddata=&Apache::lonnet::dump('resourcedata',$dom,$crs); + my %newdata=(); + undef %newdata; + my @deldata=(); + undef @deldata; + foreach (keys %ENV) { + if ($_=~/^form\.([a-z]+)\_(.+)$/) { + my $cmd=$1; + my $thiskey=$2; + if ($cmd eq 'set') { + my $data=$ENV{$_}; + if ($olddata{$thiskey} ne $data) { $newdata{$thiskey}=$data; } + } elsif ($cmd eq 'del') { + push (@deldata,$thiskey); + } elsif ($cmd eq 'datepointer') { + my $data=&Apache::lonhtmlcommon::get_date_from_form($ENV{$_}); + if (defined($data) and $olddata{$thiskey} ne $data) { $newdata{$thiskey}=$data; } + } + } } - $r->print(<Assessment URL and TitleType -Enclosing MapPart No.Parameter Name -defaultfrom Enclosing Map -generalfor Enclosing Mapfor Resource -ENDTABLEHEADFOUR - if ($csec) { - $r->print('generalfor Enclosing Mapfor Resource'); +# Store + my $delentries=$#deldata+1; + my @newdatakeys=keys %newdata; + my $putentries=$#newdatakeys+1; + if ($delentries) { + if (&Apache::lonnet::del('resourcedata',\@deldata,$dom,$crs) eq 'ok') { + $r->print('

'.&mt('Deleted [_1] parameter(s)

',$delentries)); + } else { + $r->print('

'. + &mt('Error deleting parameters').'

'); + } } - if ($uname) { - $r->print('generalfor Enclosing Mapfor Resource'); + if ($putentries) { + if (&Apache::lonnet::put('resourcedata',\%newdata,$dom,$crs) eq 'ok') { + $r->print('

'.&mt('Stored [_1] parameter(s)

',$putentries)); + } else { + $r->print('

'. + &mt('Error storing parameters').'

'); + } } - $r->print(''); - my $defbgone=''; - my $defbgtwo=''; - map { - my $rid=$_; - my ($inmapid)=($rid=~/\.(\d+)$/); - if (($pschp eq 'all') || ($allmaps{$pschp} eq $mapp{$rid}) || - ($pssymb eq $mapp{$rid}.'___'.$inmapid.'___'. - &Apache::lonnet::declutter($bighash{'src_'.$rid}))) { -# ------------------------------------------------------ Entry for one resource - if ($defbgone eq '"E0E099"') { - $defbgone='"E0E0DD"'; - } else { - $defbgone='"E0E099"'; - } - if ($defbgtwo eq '"FFFF99"') { - $defbgtwo='"FFFFDD"'; - } else { - $defbgtwo='"FFFF99"'; - } - @outpar=(); - my $thistitle=''; - my %name= (); - my %part= (); - my %display=(); - my %type= (); - my %default=(); - my $uri=&Apache::lonnet::declutter($bighash{'src_'.$rid}); - - map { - $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'); - } split(/\,/,$keyp{$rid}); - - my $totalparms=scalar keys %name; - my $isdef=1; - unless ($totalparms) { $totalparms=1; $isdef=0; } - if ($pscat ne 'all') { $totalparms=1; } - $r->print(''. - join(' / ',split(/\//,$uri)). - '

'. - $bighash{'title_'.$rid}); - if ($thistitle) { - $r->print(' ('.$thistitle.')'); - } - $r->print(''); - $r->print(''.$typep{$rid}.''); - $r->print(''. - join(' / ',split(/\//,$mapp{$rid})).''); - if ($isdef) { - map { - if (($_ eq $catmarker) || ($pscat eq 'all')) { - my $result=&parmval($part{$_}.'.'.$name{$_},$rid,$default{$_}); - - $r->print("$part{$_}$display{$_}"); - my $thismarker=$_; - $thismarker=~s/^parameter\_//; - my $mprefix=$rid.'&'.$thismarker.'&'; - - $r->print(''. - &valout($outpar[11],$type{$_}).''); - $r->print(''. - &valout($outpar[10],$type{$_}).''); - - $r->print(''. - &plink($type{$_},$display{$_},$outpar[9],$mprefix.'9', - 'parmform.pres','psub').''); - $r->print(''. - &plink($type{$_},$display{$_},$outpar[8],$mprefix.'8', - 'parmform.pres','psub').''); - $r->print(''. - &plink($type{$_},$display{$_},$outpar[7],$mprefix.'7', - 'parmform.pres','psub').''); - - if ($csec) { - $r->print(''. - &plink($type{$_},$display{$_},$outpar[6],$mprefix.'6', - 'parmform.pres','psub').''); - $r->print(''. - &plink($type{$_},$display{$_},$outpar[5],$mprefix.'5', - 'parmform.pres','psub').''); - $r->print(''. - &plink($type{$_},$display{$_},$outpar[4],$mprefix.'4', - 'parmform.pres','psub').''); - } - - if ($uname) { - $r->print(''. - &plink($type{$_},$display{$_},$outpar[3],$mprefix.'3', - 'parmform.pres','psub').''); - $r->print(''. - &plink($type{$_},$display{$_},$outpar[2],$mprefix.'2', - 'parmform.pres','psub').''); - $r->print(''. - &plink($type{$_},$display{$_},$outpar[1],$mprefix.'1', - 'parmform.pres','psub').''); - } - $r->print( - ''.&valout($outpar[$result],$type{$_}).''); - $r->print("\n"); - } - } sort keys %name; +# Read and display + my %resourcedata=&Apache::lonnet::dump('resourcedata',$dom,$crs); + my $oldsection=''; + my $oldrealm=''; + my $oldpart=''; + my $pointer=0; + $tableopen=0; + my $foundkeys=0; + foreach my $thiskey (sort keys %resourcedata) { + if ($resourcedata{$thiskey.'.type'}) { + my ($course,$middle,$part,$name)= + ($thiskey=~/^(\w+)\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/); + my $section=&mt('All Students'); + if ($middle=~/^\[(.*)\]\./) { + $section=&mt('Group/Section').': '.$1; + $middle=~s/^\[(.*)\]\.//; + } + $middle=~s/\.$//; + my $realm=''.&mt('All Resources').''; + if ($middle=~/^(.+)\_\_\_\(all\)$/) { + $realm=''.&mt('Folder/Map').': '.&Apache::lonnet::gettitle($1).''; + } elsif ($middle) { + $realm=''.&mt('Resource').': '.&Apache::lonnet::gettitle($middle).''; + } + if ($section ne $oldsection) { + $r->print(&tableend()."\n


$section

"); + $oldsection=$section; + $oldrealm=''; + } + if ($realm ne $oldrealm) { + $r->print(&tableend()."\n

$realm

"); + $oldrealm=$realm; + $oldpart=''; + } + if ($part ne $oldpart) { + $r->print(&tableend(). + "\n

".&mt('Part').": $part

"); + $oldpart=$part; + } +# +# Ready to print +# + $r->print(&tablestart().''.$name. + ':'); + $foundkeys++; + if ($resourcedata{$thiskey.'.type'}=~/^date/) { + my $jskey='key_'.$pointer; + $pointer++; + $r->print( + &Apache::lonhtmlcommon::date_setter('overviewform', + $jskey, + $resourcedata{$thiskey}). +'' + ); + } else { + $r->print( + ''); + } + $r->print(''); + } + } + + $r->print(&tableend().'

'. + ($foundkeys?'':&mt('There are no course or section parameters.')).'

'); +} + +################################################## +################################################## + +=pod + +=item * handler + +Main handler. Calls &assessparms and &crsenv subroutines. + +=cut + +################################################## +################################################## + use Data::Dumper; +sub handler { + my $r=shift; + + if ($r->header_only) { + &Apache::loncommon::content_type($r,'text/html'); + $r->send_http_header; + return OK; + } + &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}); + +# ----------------------------------------------------------- Clear out garbage + + %courseopt=(); + %useropt=(); + %parmhash=(); + + @ids=(); + %symbp=(); + %mapp=(); + %typep=(); + %keyp=(); + + %maptitles=(); + +# ----------------------------------------------------- Needs to be in a course + + if (($ENV{'request.course.id'}) && + (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'}))) { + + &Apache::loncommon::content_type($r,'text/html'); + $r->send_http_header; + + $coursename=$ENV{'course.'.$ENV{'request.course.id'}.'.description'}; + + if (($ENV{'form.crsenv'}) || (!$ENV{'request.course.fn'})) { +# ---------------------------------------------- This is for course environment +# -------------------------- also call if toplevel map coudl not be initialized + &crsenv($r); + } elsif ($ENV{'form.overview'}) { +# --------------------------------------------------------------- Overview mode + &overview($r); } else { - $r->print("\n"); - } -# -------------------------------------------------- End entry for one resource - } - } @ids; - $r->print(''); - } - $r->print(''); - untie(%bighash); - untie(%parmhash); - } - } else { +# --------------------------------------------------------- Bring up assessment + &assessparms($r); + } + } else { # ----------------------------- Not in a course, or not allowed to modify parms - $ENV{'user.error.msg'}= - "/adm/parmset: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__ +=pod + +=back + +=cut