# The LearningOnline Network with CAPA # Handler to set parameters for assessments # # $Id: lonparmset.pm,v 1.63 2002/08/19 23:01:27 bowersj2 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/ # ################################################################### ################################################################### =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::loncommon; use GDBM_File; use Apache::lonhomework; use Apache::lonxml; my %courseopt; my %useropt; my %parmhash; my @ids; my %symbp; my %mapp; my %typep; my %keyp; my $uname; my $udom; my $uhome; my $csec; my $coursename; ################################################## ################################################## =pod =item parmval Figure out a cascading parameter. Inputs: $what $id $def Returns: I am not entirely sure. =cut ################################################## ################################################## sub parmval { my ($what,$id,$def)=@_; my $result=''; my @outpar=(); # ----------------------------------------------------- Cascading lookup scheme my $symbparm=$symbp{$id}.'.'.$what; my $mapparm=$mapp{$id}.'___(all).'.$what; my $seclevel=$ENV{'request.course.id'}.'.['.$csec.'].'.$what; my $seclevelr=$ENV{'request.course.id'}.'.['.$csec.'].'.$symbparm; my $seclevelm=$ENV{'request.course.id'}.'.['.$csec.'].'.$mapparm; my $courselevel=$ENV{'request.course.id'}.'.'.$what; my $courselevelr=$ENV{'request.course.id'}.'.'.$symbparm; my $courselevelm=$ENV{'request.course.id'}.'.'.$mapparm; # -------------------------------------------------------- first, check default if ($def) { $outpar[11]=$def; $result=11; } # ----------------------------------------------------- second, check map parms my $thisparm=$parmhash{$symbparm}; if ($thisparm) { $outpar[10]=$thisparm; $result=10; } # --------------------------------------------------------- third, check course if ($courseopt{$courselevel}) { $outpar[9]=$courseopt{$courselevel}; $result=9; } if ($courseopt{$courselevelm}) { $outpar[8]=$courseopt{$courselevelm}; $result=8; } if ($courseopt{$courselevelr}) { $outpar[7]=$courseopt{$courselevelr}; $result=7; } if ($csec) { if ($courseopt{$seclevel}) { $outpar[6]=$courseopt{$seclevel}; $result=6; } if ($courseopt{$seclevelm}) { $outpar[5]=$courseopt{$seclevelm}; $result=5; } if ($courseopt{$seclevelr}) { $outpar[4]=$courseopt{$seclevelr}; $result=4; } } # ---------------------------------------------------------- fourth, check user if ($uname) { if ($useropt{$courselevel}) { $outpar[3]=$useropt{$courselevel}; $result=3; } if ($useropt{$courselevelm}) { $outpar[2]=$useropt{$courselevelm}; $result=2; } if ($useropt{$courselevelr}) { $outpar[1]=$useropt{$courselevelr}; $result=1; } } return ($result,@outpar); } ################################################## ################################################## =pod =item valout Format a value for output. Inputs: $value, $type Returns: $value, formatted for output. If $type indicates it is a date, localtime($value) is returned. =cut ################################################## ################################################## sub valout { my ($value,$type)=@_; my $result = ''; # Values of zero are valid. if (! $value && $value ne '0') { $result = '  '; } else { if ($type=~/^date/) { $result = localtime($value); } else { $result = $value; } } return $result; } ################################################## ################################################## =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; unless ($winvalue) { if ($type=~/^date/) { $winvalue=$ENV{'form.recent_'.$type}; } else { $winvalue=$ENV{'form.recent_'.(split(/\_/,$type))[0]}; } } return ''. &valout($value,$type).''; } 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 } 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); } } elsif ($parmlev eq 'map') { if ($uname) { &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); } =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; 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)'; } } } } ################################################## ################################################## =pod =item assessparms Show assessment data and parameters. This is a large routine that should be simplified and shortened... someday. 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=&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 extractResourceInformation(\%bighash, \@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allkeys, \%allmaps, $fcat, \%defp, \%mapp, \%symbp); $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 &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('\n"); $r->print(''); $r->print(''); $r->print(''); $r->print('\n"); } else { my ($map,$id,$resource)=split(/___/,$pssymb); $r->print(""); $r->print(''); $r->print(''); $r->print(''); } $r->print(''); # $r->print(""); # $r->print(""); # $r->print(""); # $r->print(""); if ($showoptions eq 'show') { my $tempkey; $r->print(''); $r->print(''); $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('

Select Parameter Level'); $r->print('

Select Enclosing Map
Specific Resource$resource

print(" checked ");} $r->print(' name="showoptions" value="show" onclick="form.submit();">Show More Options
Show: $showoptions
pscat: @pscat
psprt: @psprt
fcat: $fcat
Select Parameters to View
'); $r->print(''); my $cnt=0; foreach $tempkey (sort { $allparms{$a} cmp $allparms{$b} } keys %allparms ) { ++$cnt; $r->print('') unless ($cnt%2); $r->print(''); } $r->print('
print(' checked') unless (@pscat); $r->print('>All Parameters
print('value="'.$tempkey.'"'); if ($pscat[0] eq "all" || grep $_ eq $tempkey, @pscat) { $r->print(' checked'); } $r->print('>'.$allparms{$tempkey}.'
'); # $r->print('
Select Parts'); $r->print('

Sort list by'); $r->print('

'); my @temp_psprt; foreach my $t (@psprt) { push(@temp_psprt, grep {eval (/^$t\./ || ($_ == $t))} (keys %allparts)); } @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(''); 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 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(''); $r->print(''); $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('
Any User"); $r->print("User $uname at Domain $udomCurrent Session Value
($csuname at $csudom)
Resource Level in Coursein Section/Group $csec
Assessment URL and TitleType Enclosing MapPart No.Parameter Name defaultfrom Enclosing Map generalfor Enclosing Mapfor Resourcegeneralfor Enclosing Mapfor Resourcegeneralfor Enclosing Mapfor Resource
'. join(' / ',split(/\//,$uri)). '

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

'.$typep{$rid}. ''); $r->print(' / res / '); $r->print(join(' / ', split(/\//,$mapp{$rid}))); $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 (sort {$maplist{$a} cmp $maplist{$b}} keys %maplist) { my $maptitle = $maplist{$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(''); $r->print(''); $r->print(''); foreach (sort keys %name) { &print_row($r,$_,\%part,\%name,$mapid,\%default, \%type,\%display,$defbgone,$defbgtwo, $parmlev); # $r->print("\n"); } $r->print("
Parameter NameDefault ValueParameter in Effect
resource.$part{$_}.$name{$_},$symbp{$mapid}
"); } # 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(''); $r->print(''); $r->print(''); foreach (sort keys %name) { &print_row($r,$_,\%part,\%name,$mapid,\%default, \%type,\%display,$defbgone,$defbgtwo,$parmlev); # $r->print("\n"); } $r->print("
Parameter NameDefault ValueParameter in Effect
resource.$part{$_}.$name{$_},$symbp{$mapid}
"); } # end of $parmlev eq general } $r->print('

'); untie(%bighash); untie(%parmhash); } # end sub assessparms ################################################## ################################################## =pod =item crsenv Show course data and parameters. This is a large routine that should be simplified and shortened... someday. Inputs: $r Returns: nothing =cut ################################################## ################################################## 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 $bkuptime=time; my @tmp = &Apache::lonnet::get ('environment',['url'],$dom,$crs); $setoutput.='Backing up previous URL: '. &Apache::lonnet::put ('environment', {'top level map backup '.$bkuptime => $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)', 'pageseparators' => 'Visibly Separate Items on Pages
'. '("yes" for visible separation)', 'pch.roles.denied'=> 'Disallow Resource Discussion for '. 'Roles
"st": '. 'student, "ta": '. 'TA, "in": '. 'instructor;
role,role,...) '. Apache::loncommon::help_open_topic("Course_Disable_Discussion"), 'pch.users.denied' => 'Disallow Resource Discussion for Users
'. '(user:domain,user:domain,...)', '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 } ################################################## ################################################## =pod =item handler Main handler. Calls &assessparms and &crsenv subroutines. =cut ################################################## ################################################## 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'}))) { $coursename=$ENV{'course.'.$ENV{'request.course.id'}.'.description'}; 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/parmset:opa:0:0:Cannot modify assessment parameters"; return HTTP_NOT_ACCEPTABLE; } return OK; } 1; __END__ =pod =back =cut