--- loncom/interface/lonparmset.pm 2000/11/21 12:22:29 1.2 +++ loncom/interface/lonparmset.pm 2002/08/12 18:21:42 1.58 @@ -1,196 +1,1391 @@ # The LearningOnline Network with CAPA # Handler to set parameters for assessments # +# $Id: lonparmset.pm,v 1.58 2002/08/12 18:21:42 albertel 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 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 +# +# YEAR=2002 +# 7/19 Jeremy Bowers +### package Apache::lonparmset; use strict; use Apache::lonnet; use Apache::Constants qw(:common :http REDIRECT); +use Apache::loncommon; use GDBM_File; +use Apache::lonhomework; +use Apache::lonxml; + my %courseopt; my %useropt; -my %bighash; my %parmhash; -my @srcp; -my @typep; -my @resp; -my @mapp; -my @symbp; +my @ids; +my %symbp; +my %mapp; +my %typep; +my %keyp; my $uname; my $udom; my $uhome; - my $csec; +my $coursename; # -------------------------------------------- Figure out a cascading parameter sub parmval { - my ($what,$idx)=@_; + my ($what,$id,$def)=@_; + my $result=''; + my @outpar=(); # ----------------------------------------------------- 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 ''; + + 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,@outpar); } -# ================================================================ Main Handler +# ------------------------------------------------------------ Output for value -sub handler { - my $r=shift; +sub valout { + my ($value,$type)=@_; + return ($value?(($type=~/^date/)?localtime($value):$value):' '); +} - if ($r->header_only) { - $r->content_type('text/html'); - $r->send_http_header; - return OK; - } +# -------------------------------------------------------- Produces link anchor -# ----------------------------------------------------- Needs to be in a course +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]}; + } + } + return + ''. + &valout($value,$type).''; +} - 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); - } +sub startpage { + my ($r,$id,$udom,$csec,$uname)=@_; + $r->content_type('text/html'); + $r->send_http_header; + $r->print(< + +LON-CAPA Course Parameters + + + +Set Course Parameters for Course: +$ENV{'course.'.$ENV{'request.course.id'}.'.description'} + +Course Environment + + + +Course Assessments + +Section/Group: + + +For User + +or ID + +at Domain + + + + + +ENDHEAD -# ------------------------------------------------------------------- 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); +sub print_row { + my ($r,$which,$part,$name,$rid,$default,$type,$display,$defbgone, + $defbgtwo,$parmlev)=@_; + my ($result,@outpar)=&parmval($$part{$which}.'.'.$$name{$which}, + $rid,$$default{$which}); + 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,$_,$type,$display); + } elsif ($csec) { + &print_td($r,6,$defbgtwo,$result,\@outpar,$mprefix,$_,$type,$display); + } else { + &print_td($r,9,$defbgone,$result,\@outpar,$mprefix,$_,$type,$display); } -# --------------------------------------------------- Get userdata (if present) + } elsif ($parmlev eq 'map') { + 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); + &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$_,$type,$display); + } elsif ($csec) { + &print_td($r,5,$defbgtwo,$result,\@outpar,$mprefix,$_,$type,$display); + } else { + &print_td($r,8,$defbgone,$result,\@outpar,$mprefix,$_,$type,$display); + } + } else { + + &print_td($r,11,'#FFDDDD',$result,\@outpar,$mprefix,$_,$type,$display); + + if ($parmlev eq 'brief') { + + &print_td($r,7,$defbgone,$result,\@outpar,$mprefix,$_,$type,$display); + + if ($csec) { + &print_td($r,4,$defbgtwo,$result,\@outpar,$mprefix,$_,$type,$display); } + if ($uname) { + &print_td($r,1,$defbgone,$result,\@outpar,$mprefix,$_,$type,$display); + } + } else { + + &print_td($r,10,'#FFDDDD',$result,\@outpar,$mprefix,$_,$type,$display); + &print_td($r,9,$defbgone,$result,\@outpar,$mprefix,$_,$type,$display); + &print_td($r,8,$defbgone,$result,\@outpar,$mprefix,$_,$type,$display); + &print_td($r,7,$defbgone,$result,\@outpar,$mprefix,$_,$type,$display); + + if ($csec) { + &print_td($r,6,$defbgtwo,$result,\@outpar,$mprefix,$_,$type,$display); + &print_td($r,5,$defbgtwo,$result,\@outpar,$mprefix,$_,$type,$display); + &print_td($r,4,$defbgtwo,$result,\@outpar,$mprefix,$_,$type,$display); + } + if ($uname) { + &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$_,$type,$display); + &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$_,$type,$display); + &print_td($r,1,$defbgone,$result,\@outpar,$mprefix,$_,$type,$display); + } + } # end of $brief if/else + } # end of $parmlev if/else + + if ($parmlev eq 'full' || $parmlev eq 'brief') { + $r->print(''. + &valout($outpar[$result],$$type{$which}).''); + +} + my $sessionval=&Apache::lonnet::EXT('resource.'.$$part{$which}. + '.'.$$name{$which},$symbp{$rid}); + $r->print(''. + &valout($sessionval,$$type{$which}).' '. + ''); + $r->print(''); + $r->print("\n"); +} +sub print_td { + my ($r,$which,$defbg,$result,$outpar,$mprefix,$value,$type,$display)=@_; + $r->print(''. + &plink($$type{$value},$$display{$value},$$outpar[$which], + $mprefix."$which",'parmform.pres','psub').''."\n"); +} + +sub get_env_multiple { + my ($name) = @_; + my @values; + if (defined($ENV{$name})) { + # exists is it an array + if (ref($ENV{$name})) { + @values=@{ $ENV{$name} }; + } else { + $values[0]=$ENV{$name}; + } + } + return(@values); +} + +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=&get_env_multiple('form.pscat'); + my $pschp=$ENV{'form.pschp'}; + my @psprt=&get_env_multiple('form.psprt'); + my $showoptions=$ENV{'form.showoptions'}; + + my $pssymb=''; + my $parmlev=''; + my $prevvisit=$ENV{'form.prevvisit'}; + +# unless ($parmlev==$ENV{'form.parmlev'}) { +# $parmlev = 'full'; +# } + + 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); + @pscat='all'; + $pschp=''; + $parmlev = 'full'; + } elsif ($ENV{'form.symb'}) { + $pssymb=$ENV{'form.symb'}; + @pscat='all'; + $pschp=''; + $parmlev = 'full'; + } 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 - 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; + 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/\_/\./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}; + $symbp{$id}=$mapp{$id}. + '___'.$resid.'___'. + &Apache::lonnet::declutter($srcf); + $symbp{$mapid}=$mapp{$id}.'___(all)'; + } + } + } + $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 $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; +#----------------------------------------------- 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(''); - - $r->print(''); - untie(%bighash); - untie(%parmhash); - } - } else { + &startpage($r,$id,$udom,$csec,$uname); +# if ($ENV{'form.url'}) { +# $r->print(''); +# } + $r->print(''); + + foreach ('tolerance','date_default','date_start','date_end', + 'date_interval','int','float','string') { + $r->print(''); + } + + $r->print(''.$message.''); + + $r->print(''); + + my $submitmessage; + if (($prevvisit) || ($pschp) || ($pssymb)) { + $submitmessage = "Update Display"; + } else { + $submitmessage = "Display"; + } + if (!$pssymb) { + $r->print('Select Parameter Level'); + $r->print(''); + foreach (reverse sort keys %alllevs) { + $r->print('print(' selected'); + } + $r->print('>'.$_.''); + } + $r->print("\n"); + + $r->print(''); + + $r->print(''); + + $r->print('Select Enclosing Map'); + $r->print(''); + $r->print('All Maps'); + foreach (sort {$allmaps{$a} cmp $allmaps{$b}} keys %allmaps) { + $r->print('print(' selected'); } + $r->print('>/res/'.$allmaps{$_}.''); + } + $r->print("\n"); + } else { + my ($map,$id,$resource)=split(/___/,$pssymb); + $r->print("Specific Resource$resource"); + $r->print(''); + $r->print(''); + $r->print(''); + } + + $r->print('print(" checked ");} + $r->print(' name="showoptions" value="show" onclick="form.submit();">Show More Options'); +# $r->print("Show: $showoptions"); +# $r->print("pscat: @pscat"); +# $r->print("psprt: @psprt"); +# $r->print("fcat: $fcat"); + + if ($showoptions eq 'show') { + my $tempkey; + + $r->print('Select Parameters to View'); + + $r->print(''); + $r->print('print(' checked') unless (@pscat); + $r->print('>All Parameters'); + + my $cnt=0; + + foreach $tempkey (sort { $allparms{$a} cmp $allparms{$b} } + keys %allparms ) { + ++$cnt; + $r->print('') unless ($cnt%2); + $r->print('print('value="'.$tempkey.'"'); + if ($pscat[0] eq "all" || grep $_ eq $tempkey, @pscat) { + $r->print(' checked'); + } + $r->print('>'.$allparms{$tempkey}.''); + } + $r->print(''); + +# $r->print('Select Parts'); + $r->print(''); + $r->print('print(' selected') unless (@psprt); + $r->print('>All Parts'); + foreach $tempkey (sort keys %allparts) { + unless ($tempkey =~ /\./) { + $r->print('print(' selected'); + } + $r->print('>'.$allparts{$tempkey}.''); + } + } + $r->print(''); + + $r->print('Sort list by'); + $r->print(''); + $r->print('Enclosing Map'); + foreach (sort keys %allkeys) { + $r->print('print(' selected'); } + $r->print('>'.$allkeys{$_}.''); + } + $r->print(''); + + $r->print(''); + + } else { # hide options - include any necessary extras here + + $r->print(''."\n"); + + unless (@pscat) { + foreach (keys %allparms ) { + $r->print(''."\n"); + } + } else { + foreach (@pscat) { + $r->print(''."\n"); + } + } + + unless (@psprt) { + foreach (keys %allparts ) { + $r->print(''."\n"); + } + } else { + foreach (@psprt) { + $r->print(''."\n"); + } + } + + } + $r->print(''); + + my @temp_psprt; + map { + my $t = $_; + push(@temp_psprt, + grep {eval (/^$t\./ || ($_ == $t))} (keys %allparts)); + } @psprt; + + @psprt = @temp_psprt; + + my @temp_pscat; + map { + my $cat = $_; + push(@temp_pscat, map { $_.'.'.$cat } @psprt); + } @pscat; + + @pscat = @temp_pscat; + + if (($prevvisit) || ($pschp) || ($pssymb)) { +# ----------------------------------------------------------------- Start Table + my @catmarker=map { tr|.|_|; 'parameter_'.$_; } @pscat; + my $csuname=$ENV{'user.name'}; + my $csudom=$ENV{'user.domain'}; + + + if ($parmlev eq 'full' || $parmlev eq 'brief') { + + my $coursespan=$csec?8:5; + $r->print(''); + $r->print(''); + $r->print('Any User'); + if ($uname) { + $r->print(""); + $r->print("User $uname at Domain $udom"); + } + $r->print(<Parameter in Effect +Current Session Value($csuname at $csudom) +Resource Level +in Course +ENDTABLETWO + if ($csec) { + $r->print("in Section/Group $csec"); + } + $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'); + } + + if ($uname) { + $r->print('generalfor Enclosing Mapfor Resource'); + } + + $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 + 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})) { + my $tempkeyp = $_; + if (grep $_ eq $tempkeyp, @catmarker) { + $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(''. + join(' / ',split(/\//,$uri)). + ''. + "$bighash{'title_'.$rid}"); + + if ($thistitle) { + $r->print(' ('.$thistitle.')'); + } + $r->print(''); + $r->print(''.$typep{$rid}. + ''); + + $r->print(''); + + $r->print(' / res / '); + $r->print(join(' / ', split(/\//,$mapp{$rid}))); + + $r->print(''); + + foreach (sort keys %name) { + unless ($firstrow) { + $r->print(''); + } else { + undef $firstrow; + } + + &print_row($r,$_,\%part,\%name,$rid,\%default, + \%type,\%display,$defbgone,$defbgtwo, + $parmlev); + } + } + } + } # end foreach ids +# -------------------------------------------------- End entry for one resource + $r->print(''); + } # end of brief/full +#--------------------------------------------------- Entry for parm level map + if ($parmlev eq 'map') { + my $defbgone = '"E0E099"'; + my $defbgtwo = '"FFFF99"'; + + my %maplist; + + if ($pschp eq 'all') { + %maplist = %allmaps; + } else { + %maplist = ($pschp => $mapp{$pschp}); + } + +#-------------------------------------------- for each map, gather information + my $mapid; + foreach $mapid (keys %maplist) { + my $maptitle = $allmaps{$mapid}; + +#----------------------- loop through ids and get all parameter types for map +#----------------------------------------- and associated information + my %name = (); + my %part = (); + my %display = (); + my %type = (); + my %default = (); + my $map = 0; + +# $r->print("Catmarker: @catmarker\n"); + + foreach (@ids) { + ($map)=(/([\d]*?)\./); + my $rid = $_; + +# $r->print("$mapid:$map: $rid \n"); + + if ($map eq $mapid) { + my $uri=&Apache::lonnet::declutter($bighash{'src_'.$rid}); +# $r->print("Keys: $keyp{$rid} \n"); + +#-------------------------------------------------------------------- +# @catmarker contains list of all possible parameters including part #s +# $fullkeyp contains the full part/id # for the extraction of proper parameters +# $tempkeyp contains part 0 only (no ids - ie, subparts) +# When storing information, store as part 0 +# When requesting information, request from full part +#------------------------------------------------------------------- + foreach (split(/\,/,$keyp{$rid})) { + my $tempkeyp = $_; + my $fullkeyp = $tempkeyp; + $tempkeyp =~ s/_[\d_]+_/_0_/; + + if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) { + $part{$tempkeyp}="0"; + $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name'); + $display{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.display'); + unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; } + $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')'; + $display{$tempkeyp} =~ s/_[\d_]+_/_0_/; + $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp); + $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.type'); + } + } # end loop through keys + } + } # end loop through ids + +#---------------------------------------------------- print header information + $r->print(< +Set Defaults for All Resources in map +$maptitle +Specifically for +ENDMAPONE + if ($uname) { + my %name=&Apache::lonnet::userenvironment($udom,$uname, + ('firstname','middlename','lastname','generation', 'id')); + my $person=$name{'firstname'}.' '.$name{'middlename'}.' ' + .$name{'lastname'}.' '.$name{'generation'}; + $r->print("User $uname \($person\) in \n"); + } else { + $r->print("all users in \n"); + } + + if ($csec) {$r->print("Section $csec of \n")}; + + $r->print("$coursename"); + $r->print("\n"); +#---------------------------------------------------------------- print table + $r->print(''); + $r->print('Parameter Name'); + $r->print('Default Value'); + $r->print('Parameter in Effect'); + + foreach (sort keys %name) { + &print_row($r,$_,\%part,\%name,$mapid,\%default, + \%type,\%display,$defbgone,$defbgtwo, + $parmlev); +# $r->print("resource.$part{$_}.$name{$_},$symbp{$mapid}\n"); + } + $r->print(""); + } # end each map + } # end of $parmlev eq map +#--------------------------------- Entry for parm level general (Course level) + if ($parmlev eq 'general') { + my $defbgone = '"E0E099"'; + my $defbgtwo = '"FFFF99"'; + +#-------------------------------------------- for each map, gather information + my $mapid="0.0"; +#----------------------- loop through ids and get all parameter types for map +#----------------------------------------- and associated information + my %name = (); + my %part = (); + my %display = (); + my %type = (); + my %default = (); + + foreach (@ids) { + my $rid = $_; + + my $uri=&Apache::lonnet::declutter($bighash{'src_'.$rid}); + +#-------------------------------------------------------------------- +# @catmarker contains list of all possible parameters including part #s +# $fullkeyp contains the full part/id # for the extraction of proper parameters +# $tempkeyp contains part 0 only (no ids - ie, subparts) +# When storing information, store as part 0 +# When requesting information, request from full part +#------------------------------------------------------------------- + foreach (split(/\,/,$keyp{$rid})) { + my $tempkeyp = $_; + my $fullkeyp = $tempkeyp; + $tempkeyp =~ s/_[\d_]+_/_0_/; + if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) { + $part{$tempkeyp}="0"; + $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name'); + $display{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.display'); + unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; } + $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')'; + $display{$tempkeyp} =~ s/_[\d_]+_/_0_/; + $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp); + $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.type'); + } + } # end loop through keys + } # end loop through ids + +#---------------------------------------------------- print header information + $r->print(< +Set Defaults for All Resources in Course +$coursename +ENDMAPONE + if ($uname) { + my %name=&Apache::lonnet::userenvironment($udom,$uname, + ('firstname','middlename','lastname','generation', 'id')); + my $person=$name{'firstname'}.' '.$name{'middlename'}.' ' + .$name{'lastname'}.' '.$name{'generation'}; + $r->print(" User $uname \($person\) \n"); + } else { + $r->print("ALL USERS \n"); + } + + if ($csec) {$r->print("Section $csec\n")}; + $r->print("\n"); +#---------------------------------------------------------------- print table + $r->print(''); + $r->print('Parameter Name'); + $r->print('Default Value'); + $r->print('Parameter in Effect'); + + foreach (sort keys %name) { + &print_row($r,$_,\%part,\%name,$mapid,\%default, + \%type,\%display,$defbgone,$defbgtwo,$parmlev); +# $r->print("resource.$part{$_}.$name{$_},$symbp{$mapid}\n"); + } + $r->print(""); + } # end of $parmlev eq general + } + $r->print('
\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 - 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; + 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/\_/\./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}; + $symbp{$id}=$mapp{$id}. + '___'.$resid.'___'. + &Apache::lonnet::declutter($srcf); + $symbp{$mapid}=$mapp{$id}.'___(all)'; + } + } + } + $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 $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; +#----------------------------------------------- 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('
'. + "$bighash{'title_'.$rid}"); + + if ($thistitle) { + $r->print(' ('.$thistitle.')'); + } + $r->print('