File:
[LON-CAPA] /
loncom /
interface /
lonparmset.pm
Revision
1.49:
download - view:
text,
annotated -
select for diffs
Tue Apr 9 18:39:30 2002 UTC (23 years, 1 month ago) by
matthew
Branches:
MAIN
CVS tags:
HEAD
Added descriptions of spreadsheet parameters. Included (but commented out)
code to allow the user to browse for a new *.spreadsheet file. This code
will be activated when the whole spreadsheet specification mess is sorted
out.
# The LearningOnline Network with CAPA
# Handler to set parameters for assessments
#
# $Id: lonparmset.pm,v 1.49 2002/04/09 18:39:30 matthew Exp $
#
# Copyright Michigan State University Board of Trustees
#
# This file is part of the LearningOnline Network with CAPA (LON-CAPA).
#
# LON-CAPA is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# LON-CAPA is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with LON-CAPA; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# /home/httpd/html/adm/gpl.txt
#
# http://www.lon-capa.org/
#
# (Handler to resolve ambiguous file locations
#
# (TeX Content Handler
#
# YEAR=2000
# 05/29/00,05/30,10/11 Gerd Kortemeyer)
#
# 10/11,10/12,10/16 Gerd Kortemeyer)
#
# 11/20,11/21,11/22,11/23,11/24,11/25,11/27,11/28,
# 12/08,12/12,
# YEAR=2001
# 16/01/01,02/08,03/20,03/23,03/24,03/26,05/09,
# 07/05,07/06,08/08,08/09,09/01,09/21 Gerd Kortemeyer
# 12/17 Scott Harrison
# 12/19 Guy Albertelli
# 12/26,12/27 Gerd Kortemeyer
#
###
package Apache::lonparmset;
use strict;
use Apache::lonnet;
use Apache::Constants qw(:common :http REDIRECT);
use Apache::loncommon;
use GDBM_File;
my %courseopt;
my %useropt;
my %parmhash;
my @ids;
my %symbp;
my %mapp;
my %typep;
my %keyp;
my $uname;
my $udom;
my $uhome;
my $csec;
# -------------------------------------------- Figure out a cascading parameter
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);
}
# ------------------------------------------------------------ Output for value
sub valout {
my ($value,$type)=@_;
return ($value?(($type=~/^date/)?localtime($value):$value):' ');
}
# -------------------------------------------------------- Produces link anchor
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
'<a href="javascript:pjump('."'".$type."','".$dis."','".$winvalue."','"
.$marker."','".$return."','".$call."'".');">'.
&valout($value,$type).'</a><a name="'.$marker.'"></a>';
}
sub startpage {
my ($r,$id,$udom,$csec,$uname)=@_;
$r->content_type('text/html');
$r->send_http_header;
$r->print(<<ENDHEAD);
<html>
<head>
<title>LON-CAPA Course Parameters</title>
<script>
function pclose() {
parmwin=window.open("/adm/rat/empty.html","LONCAPAparms",
"height=350,width=350,scrollbars=no,menubar=no");
parmwin.close();
}
function pjump(type,dis,value,marker,ret,call) {
document.parmform.pres_marker.value='';
parmwin=window.open("/adm/rat/parameter.html?type="+escape(type)
+"&value="+escape(value)+"&marker="+escape(marker)
+"&return="+escape(ret)
+"&call="+escape(call)+"&name="+escape(dis),"LONCAPAparms",
"height=350,width=350,scrollbars=no,menubar=no");
}
function psub() {
pclose();
if (document.parmform.pres_marker.value!='') {
document.parmform.action+='#'+document.parmform.pres_marker.value;
var typedef=new Array();
typedef=document.parmform.pres_type.value.split('_');
if (document.parmform.pres_type.value!='') {
if (typedef[0]=='date') {
eval('document.parmform.recent_'+
document.parmform.pres_type.value+
'.value=document.parmform.pres_value.value;');
} else {
eval('document.parmform.recent_'+typedef[0]+
'.value=document.parmform.pres_value.value;');
}
}
document.parmform.submit();
} else {
document.parmform.pres_value.value='';
document.parmform.pres_marker.value='';
}
}
</script>
</head>
<body bgcolor="#FFFFFF" onUnload="pclose()">
<h1>Set Course Parameters</h1>
<form method="post" action="/adm/parmset" name="envform">
<h2>Course: $ENV{'course.'.$ENV{'request.course.id'}.'.description'}</h2>
<h3>Course Environment</h3>
<input type="submit" name="crsenv" value="Set Course Environment">
</form>
<form method="post" action="/adm/parmset" name="parmform">
<h3>Course Assessments</h3>
<b>
Section/Group:
<input type="text" value="$csec" size="6" name="csec">
<br>
For User
<input type="text" value="$uname" size="12" name="uname">
or ID
<input type="text" value="$id" size="12" name="id">
at Domain
<input type="text" value="$udom" size="6" name="udom">
</b>
<input type="hidden" value='' name="pres_value">
<input type="hidden" value='' name="pres_type">
<input type="hidden" value='' name="pres_marker">
ENDHEAD
}
sub print_row {
my ($r,$which,$part,$name,$rid,$default,$type,$display,$defbgone,
$defbgtwo)=@_;
my ($result,@outpar)=&parmval($$part{$which}.'.'.$$name{$which},
$rid,$$default{$which});
$r->print("<td bgcolor=".$defbgtwo.
'>'.$$part{$which}.'</td><td bgcolor='.$defbgone.
'>'.$$display{$which}.'</td>');
my $thismarker=$which;
$thismarker=~s/^parameter\_//;
my $mprefix=$rid.'&'.$thismarker.'&';
&print_td($r,11,'#FFDDDD',$result,\@outpar,$mprefix,$_,$type,$display);
&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);
}
$r->print('<td bgcolor=#CCCCFF>'.&valout($outpar[$result],$$type{$which}).'</td>');
my $sessionval=&Apache::lonnet::EXT('resource.'.$$part{$which}.
'.'.$$name{$which},$symbp{$rid});
$r->print('<td bgcolor=#999999><font color=#FFFFFF>'.
&valout($sessionval,$$type{$which}).' '.
'</font></td>');
$r->print('</tr>');
}
sub print_td {
my ($r,$which,$defbg,$result,$outpar,$mprefix,$value,$type,$display)=@_;
$r->print('<td bgcolor='.(($result==$which)?'"#AAFFAA"':$defbg).'>'.
&plink($$type{$value},$$display{$value},$$outpar[$which],
$mprefix."$which",'parmform.pres','psub').'</td>');
}
sub assessparms {
my $r=shift;
# -------------------------------------------------------- Variable declaration
my %allkeys;
my %allmaps;
my %defp;
%courseopt=();
%useropt=();
my %bighash=();
@ids=();
%symbp=();
%typep=();
my $message='';
$csec=$ENV{'form.csec'};
$udom=$ENV{'form.udom'};
unless ($udom) { $udom=$r->dir_config('lonDefDomain'); }
my $pscat=$ENV{'form.pscat'};
my $pschp=$ENV{'form.pschp'};
my $pssymb='';
# ----------------------------------------------- Was this started from grades?
if (($ENV{'form.command'} eq 'set') && ($ENV{'form.url'})
&& (!$ENV{'form.dis'})) {
my $url=$ENV{'form.url'};
$url=~s-^http://($ENV{'SERVER_NAME'}|$ENV{'HTTP_HOST'})--;
$pssymb=&Apache::lonnet::symbread($url);
$pscat='all';
$pschp='';
} elsif ($ENV{'form.symb'}) {
$pssymb=$ENV{'form.symb'};
$pscat='all';
$pschp='';
} else {
$ENV{'form.url'}='';
}
my $id=$ENV{'form.id'};
if (($id) && ($udom)) {
$uname=(&Apache::lonnet::idget($udom,$id))[1];
if ($uname) {
$id='';
} else {
$message=
"<font color=red>Unknown ID '$id' at domain '$udom'</font>";
}
} else {
$uname=$ENV{'form.uname'};
}
unless ($udom) { $uname=''; }
$uhome='';
if ($uname) {
$uhome=&Apache::lonnet::homeserver($uname,$udom);
if ($uhome eq 'no_host') {
$message=
"<font color=red>Unknown user '$uname' at domain '$udom'</font>";
$uname='';
} else {
$csec=&Apache::lonnet::usection($udom,$uname,
$ENV{'request.course.id'});
if ($csec eq '-1') {
$message="<font color=red>".
"User '$uname' at domain '$udom' not ".
"in this course</font>";
$uname='';
$csec=$ENV{'form.csec'};
} else {
my %name=&Apache::lonnet::userenvironment($udom,$uname,
('firstname','middlename','lastname','generation','id'));
$message="\n<p>\nFull Name: ".
$name{'firstname'}.' '.$name{'middlename'}.' '
.$name{'lastname'}.' '.$name{'generation'}.
"<br>\nID: ".$name{'id'}.'<p>';
}
}
}
unless ($csec) { $csec=''; }
my $fcat=$ENV{'form.fcat'};
unless ($fcat) { $fcat=''; }
# ------------------------------------------------------------------- Tie hashs
if (!(tie(%bighash,'GDBM_File',$ENV{'request.course.fn'}.'.db',
&GDBM_READER,0640))) {
$r->print("Unable to access course data. (File $ENV{'request.course.fn'}.db not tieable)");
return ;
}
if (!(tie(%parmhash,'GDBM_File',
$ENV{'request.course.fn'}.'_parms.db',&GDBM_READER,0640))) {
$r->print("Unable to access parameter data. (File $ENV{'request.course.fn'}_parms.db not tieable)");
return ;
}
# --------------------------------------------------------- Get all assessments
foreach (keys %bighash) {
if ($_=~/^src\_(\d+)\.(\d+)$/) {
my $mapid=$1;
my $resid=$2;
my $id=$mapid.'.'.$resid;
my $srcf=$bighash{$_};
if ($srcf=~/\.(problem|exam|quiz|assess|survey|form)$/) {
$ids[$#ids+1]=$id;
$typep{$id}=$1;
$keyp{$id}='';
foreach (split(/\,/,
&Apache::lonnet::metadata($srcf,'keys'))) {
if ($_=~/^parameter\_(.*)/) {
my $key=$_;
my $allkey=$1;
$allkey=~s/\_/\./;
my $display=
&Apache::lonnet::metadata($srcf,$key.'.display');
unless ($display) {
$display=
&Apache::lonnet::metadata($srcf,$key.'.name');
}
$allkeys{$allkey}=$display;
if ($allkey eq $fcat) {
$defp{$id}=
&Apache::lonnet::metadata($srcf,$key);
}
if ($keyp{$id}) {
$keyp{$id}.=','.$key;
} else {
$keyp{$id}=$key;
}
}
}
$mapp{$id}=
&Apache::lonnet::declutter($bighash{'map_id_'.$mapid});
$allmaps{$mapid}=$mapp{$id};
$symbp{$id}=$mapp{$id}.
'___'.$resid.'___'.
&Apache::lonnet::declutter($srcf);
}
}
}
# ---------------------------------------------------------- Anything to store?
if ($ENV{'form.pres_marker'}) {
my ($sresid,$spnam,$snum)=split(/\&/,$ENV{'form.pres_marker'});
$spnam=~s/\_([^\_]+)$/\.$1/;
# ---------------------------------------------------------- Construct prefixes
my $symbparm=$symbp{$sresid}.'.'.$spnam;
my $mapparm=$mapp{$sresid}.'___(all).'.$spnam;
my $seclevel=$ENV{'request.course.id'}.'.['.$csec.'].'.$spnam;
my $seclevelr=$ENV{'request.course.id'}.'.['.$csec.'].'.$symbparm;
my $seclevelm=$ENV{'request.course.id'}.'.['.$csec.'].'.$mapparm;
my $courselevel=$ENV{'request.course.id'}.'.'.$spnam;
my $courselevelr=$ENV{'request.course.id'}.'.'.$symbparm;
my $courselevelm=$ENV{'request.course.id'}.'.'.$mapparm;
my $storeunder='';
if (($snum==9) || ($snum==3)) { $storeunder=$courselevel; }
if (($snum==8) || ($snum==2)) { $storeunder=$courselevelm; }
if (($snum==7) || ($snum==1)) { $storeunder=$courselevelr; }
if ($snum==6) { $storeunder=$seclevel; }
if ($snum==5) { $storeunder=$seclevelm; }
if ($snum==4) { $storeunder=$seclevelr; }
my %storecontent = ($storeunder => $ENV{'form.pres_value'},
$storeunder.'type' => $ENV{'form.pres_type'});
my $reply='';
if ($snum>3) {
# ---------------------------------------------------------------- Store Course
#
# Expire sheets
&Apache::lonnet::expirespread('','','studentcalc');
if (($snum==7) || ($snum==4)) {
&Apache::lonnet::expirespread('','','assesscalc',$symbp{$sresid});
} elsif (($snum==8) || ($snum==5)) {
&Apache::lonnet::expirespread('','','assesscalc',$mapp{$sresid});
} else {
&Apache::lonnet::expirespread('','','assesscalc');
}
# Store parameter
$reply=&Apache::lonnet::cput
('resourcedata',\%storecontent,
$ENV{'course.'.$ENV{'request.course.id'}.'.domain'},
$ENV{'course.'.$ENV{'request.course.id'}.'.num'});
} else {
# ------------------------------------------------------------------ Store User
#
# Expire sheets
&Apache::lonnet::expirespread($uname,$udom,'studentcalc');
if ($snum==1) {
&Apache::lonnet::expirespread
($uname,$udom,'assesscalc',$symbp{$sresid});
} elsif ($snum==2) {
&Apache::lonnet::expirespread
($uname,$udom,'assesscalc',$mapp{$sresid});
} else {
&Apache::lonnet::expirespread($uname,$udom,'assesscalc');
}
# Store parameter
$reply=&Apache::lonnet::cput
('resourcedata',\%storecontent,$udom,$uname);
}
if ($reply=~/^error\:(.*)/) {
$message.="<font color=red>Write Error: $1</font>";
}
# ---------------------------------------------------------------- Done storing
}
# -------------------------------------------------------------- Get coursedata
%courseopt = &Apache::lonnet::dump
('resourcedata',
$ENV{'course.'.$ENV{'request.course.id'}.'.domain'},
$ENV{'course.'.$ENV{'request.course.id'}.'.num'});
# --------------------------------------------------- Get userdata (if present)
if ($uname) {
%useropt=&Apache::lonnet::dump('resourcedata',$udom,$uname);
}
# ------------------------------------------------------------------- Sort this
@ids=sort {
if ($fcat eq '') {
$a<=>$b;
} else {
my ($result,@outpar)=&parmval($fcat,$a,$defp{$a});
my $aparm=$outpar[$result];
($result,@outpar)=&parmval($fcat,$b,$defp{$b});
my $bparm=$outpar[$result];
1*$aparm<=>1*$bparm;
}
} @ids;
# ------------------------------------------------------------------ Start page
&startpage($r,$id,$udom,$csec,$uname);
# if ($ENV{'form.url'}) {
# $r->print('<input type="hidden" value="'.$ENV{'form.url'}.
# '" name="url"><input type="hidden" name="command" value="set">');
# }
foreach ('tolerance','date_default','date_start','date_end',
'date_interval','int','float','string') {
$r->print('<input type="hidden" value="'.
$ENV{'form.recent_'.$_}.'" name="recent_'.$_.'">');
}
$r->print('<h2>'.$message.'</h2><table><tr><td>Sort list by</td><td>');
$r->print('<select name="fcat">');
$r->print('<option value="">Enclosing Map</option>');
foreach (reverse sort keys %allkeys) {
$r->print('<option value="'.$_.'"');
if ($fcat eq $_) { $r->print(' selected'); }
$r->print('>'.$allkeys{$_}.'</option>');
}
if (!$pssymb) {
$r->print('</select></tr><tr><td>Select Enclosing Map</td><td><select name=pschp>');
$r->print('<option value=all>All Maps</option>');
foreach (sort keys %allmaps) {
$r->print('<option value="'.$_.'"');
if (($pssymb=~/^$allmaps{$_}/) ||
($pschp eq $_)) { $r->print(' selected'); }
$r->print('>'.$allmaps{$_}.'</option>');
}
} else {
my ($map,$id,$resource)=split(/___/,$pssymb);
$r->print('<tr><td>Specfic Resource</td><td> </td></tr>');
$r->print('<input type="hidden" value="'.$pssymb.'" name="symb">');
}
$r->print('</select></td></tr><tr><td>Select Parameter</td><td><select name=pscat>');
$r->print('<option value=all>All Parameters</option>');
foreach (reverse sort keys %allkeys) {
$r->print('<option value="'.$_.'"');
if ($pscat eq $_) { $r->print(' selected'); }
$r->print('>'.$allkeys{$_}.'</option>');
}
$r->print('</select></td></tr></table><br><input name=dis type="submit" value="Display">');
if (($pscat) || ($pschp) || ($pssymb)) {
# ----------------------------------------------------------------- Start Table
my $catmarker='parameter_'.$pscat;
$catmarker=~s/\./\_/g;
my $coursespan=$csec?8:5;
my $csuname=$ENV{'user.name'};
my $csudom=$ENV{'user.domain'};
$r->print(<<ENDTABLEHEAD);
<p><table border=2>
<tr><td colspan=5></td>
<th colspan=$coursespan>Any User</th>
ENDTABLEHEAD
if ($uname) {
$r->print("<th colspan=3 rowspan=2>User $uname at Domain $udom</th>");
}
$r->print(<<ENDTABLETWO);
<th rowspan=3>Parameter in Effect</th>
<th rowspan=3>Current Session Value<br>($csuname at $csudom)</th>
</tr><tr><td colspan=5></td>
<th colspan=2>Resource Level</th>
<th colspan=3>in Course</th>
ENDTABLETWO
if ($csec) {
$r->print("<th colspan=3>in Section/Group $csec</th>");
}
$r->print(<<ENDTABLEHEADFOUR);
</tr><tr><th>Assessment URL and Title</th><th>Type</th>
<th>Enclosing Map</th><th>Part No.</th><th>Parameter Name</th>
<th>default</th><th>from Enclosing Map</th>
<th>general</th><th>for Enclosing Map</th><th>for Resource</th>
ENDTABLEHEADFOUR
if ($csec) {
$r->print('<th>general</th><th>for Enclosing Map</th><th>for Resource</th>');
}
if ($uname) {
$r->print('<th>general</th><th>for Enclosing Map</th><th>for Resource</th>');
}
$r->print('</tr>');
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})) {
if (($_ eq $catmarker) || ($pscat eq 'all')) {
$part{$_}=&Apache::lonnet::metadata($uri,$_.'.part');
$name{$_}=&Apache::lonnet::metadata($uri,$_.'.name');
$display{$_}=&Apache::lonnet::metadata($uri,$_.'.display');
unless ($display{$_}) { $display{$_}=''; }
$display{$_}.=' ('.$name{$_}.')';
$default{$_}=&Apache::lonnet::metadata($uri,$_);
$type{$_}=&Apache::lonnet::metadata($uri,$_.'.type');
$thistitle=&Apache::lonnet::metadata($uri,$_.'.title');
}
}
my $totalparms=scalar keys %name;
if ($totalparms>0) {
my $firstrow=1;
$r->print('<tr><td bgcolor='.$defbgone.
' rowspan='.$totalparms.'><tt><font size=-1>'.
join(' / ',split(/\//,$uri)).
'</font></tt><p><b>'.
$bighash{'title_'.$rid});
if ($thistitle) {
$r->print(' ('.$thistitle.')');
}
$r->print('</b></td>');
$r->print('<td bgcolor='.$defbgtwo.
' rowspan='.$totalparms.'>'.$typep{$rid}.'</td>');
$r->print('<td bgcolor='.$defbgone.
' rowspan='.$totalparms.'><tt><font size=-1>'.
join(' / ',split(/\//,$mapp{$rid})).'</font></tt></td>');
foreach (sort keys %name) {
unless ($firstrow) {
$r->print('<tr>');
} else {
$firstrow=0;
}
&print_row($r,$_,\%part,\%name,$rid,\%default,
\%type,\%display,$defbgone,$defbgtwo);
}
}
# -------------------------------------------------- End entry for one resource
}
}
$r->print('</table>');
}
$r->print('</form></body></html>');
untie(%bighash);
untie(%parmhash);
}
# Set course environment parameters
sub crsenv {
my $r=shift;
my $setoutput='';
my $dom = $ENV{'course.'.$ENV{'request.course.id'}.'.domain'};
my $crs = $ENV{'course.'.$ENV{'request.course.id'}.'.num'};
# -------------------------------------------------- Go through list of changes
foreach (keys %ENV) {
if ($_=~/^form\.(.+)\_setparmval$/) {
my $name=$1;
my $value=$ENV{'form.'.$name.'_value'};
if ($name eq 'newp') {
$name=$ENV{'form.newp_name'};
}
if ($name eq 'url') {
$value=~s/^\/res\///;
my @tmp = &Apache::lonnet::get
('environment',['url'],$dom,$crs);
$setoutput.='Backing up previous URL: '.
&Apache::lonnet::put
('environment',
{'top level map backup ' => $tmp[1] },
$dom,$crs).
'<br>';
}
if ($name) {
$setoutput.='Setting <tt>'.$name.'</tt> to <tt>'.
$value.'</tt>: '.
&Apache::lonnet::put
('environment',{$name=>$value},$dom,$crs).
'<br>';
}
}
}
# -------------------------------------------------------- Get parameters again
my %values=&Apache::lonnet::dump('environment',$dom,$crs);
my $output='';
if (! exists($values{'con_lost'})) {
my %descriptions=
('url' => '<b>Top Level Map</b> '.
'<a href="javascript:openbrowser'.
"('envform','url','sequence')\">".
'Browse</a><br><font color=red> '.
'Modification may make assessment data '.
'inaccessible</font>',
'description' => '<b>Course Description</b>',
'courseid' => '<b>Course ID or number</b><br>'.
'(internal, optional)',
'question.email' => '<b>Feedback Addresses for Content '.
'Questions</b><br>(<tt>user:domain,'.
'user:domain,...</tt>)',
'comment.email' => '<b>Feedback Addresses for Comments</b><br>'.
'(<tt>user:domain,user:domain,...</tt>)',
'policy.email' => '<b>Feedback Addresses for Course Policy</b>'.
'<br>(<tt>user:domain,user:domain,...</tt>)',
'hideemptyrows' => '<b>Hide Empty Rows in Spreadsheets</b><br>'.
'("<tt>yes</tt>" for default hiding)',
'pch.roles.denied'=> '<b>Disallow Resource Discussion for '.
'Students</b><br>"<tt>st</tt>": '.
'student, "<tt>ta</tt>": '.
'TA, "<tt>in</tt>": '.
'instructor;<br><tt>role,role,...</tt>)',
'spreadsheet_default_classcalc'
=> '<b>Default course spreadsheet</b>',
# '<a href="javascript:openbrowser'.
# "('envform','spreadsheet_default_classcalc'".
# ",'spreadsheet')\">Browse</a><br>",
'spreadsheet_default_studentcalc'
=> '<b>Default student spreadsheet</b>',
# '<a href="javascript:openbrowser'.
# "('envform','spreadsheet_default_calc'".
# ",'spreadsheet')\">Browse</a><br>",
'spreadsheet_default_assesscalc'
=> '<b>Default assessment spreadsheet</b>'
# '<a href="javascript:openbrowser'.
# "('envform','spreadsheet_default_assesscalc'".
# ",'spreadsheet')\">Browse</a><br>",
);
foreach (keys(%values)) {
unless ($descriptions{$_}) {
$descriptions{$_}=$_;
}
}
foreach (sort keys %descriptions) {
$output.='<tr><td>'.$descriptions{$_}.'</td><td><input name="'.
$_.'_value" size=40 value="'.
$values{$_}.'"></td><td><input type=checkbox name="'.
$_.'_setparmval"></td></tr>';
}
$output.='<tr><td><i>Create New Environment Variable</i><br>'.
'<input type="text" size=40 name="newp_name" ></td><td>'.
'<input type="text" size=40 name="newp_value" ></td><td>'.
'<input type="checkbox" name="newp_setparmval"></td></tr>';
}
$r->print(<<ENDENV);
<html>
<script type="text/javascript" language="Javascript" >
var editbrowser;
function openbrowser(formname,elementname,only,omit) {
var url = '/res/?';
if (editbrowser == null) {
url += 'launch=1&';
}
url += 'catalogmode=interactive&';
url += 'mode=parmset&';
url += 'form=' + formname + '&';
if (only != null) {
url += 'only=' + only + '&';
}
if (omit != null) {
url += 'omit=' + omit + '&';
}
url += 'element=' + elementname + '';
var title = 'Browser';
var options = 'scrollbars=1,resizable=1,menubar=0';
options += ',width=700,height=600';
editbrowser = open(url,title,options,'1');
editbrowser.focus();
}
</script>
<head>
<title>LON-CAPA Course Environment</title>
</head>
<body bgcolor="#FFFFFF">
<h1>Set Course Parameters</h1>
<form method="post" action="/adm/parmset" name="envform">
<h2>Course: $ENV{'course.'.$ENV{'request.course.id'}.'.description'}</h2>
<h3>Course Environment</h3>
$setoutput
<p>
<table border=2>
<tr><th>Parameter</th><th>Value</th><th>Set?</th></tr>
$output
</table>
<input type="submit" name="crsenv" value="Set Course Environment">
</form>
</body>
</html>
ENDENV
}
# ================================================================ Main Handler
sub handler {
my $r=shift;
if ($r->header_only) {
$r->content_type('text/html');
$r->send_http_header;
return OK;
}
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'});
# ----------------------------------------------------- Needs to be in a course
if (($ENV{'request.course.id'}) &&
(&Apache::lonnet::allowed('opa',$ENV{'request.course.id'}))) {
unless (($ENV{'form.crsenv'}) || (!$ENV{'request.course.fn'})) {
# --------------------------------------------------------- Bring up assessment
&assessparms($r);
# ---------------------------------------------- This is for course environment
} else {
&crsenv($r);
}
} else {
# ----------------------------- Not in a course, or not allowed to modify parms
$ENV{'user.error.msg'}=
"/adm/parmset:opa:0:0:Cannot modify assessment parameters";
return HTTP_NOT_ACCEPTABLE;
}
return OK;
}
1;
__END__
=head1 NAME
Apache::lonparmset - Handler to set parameters for assessments
=head1 SYNOPSIS
Invoked by /etc/httpd/conf/srm.conf:
<Location /adm/parmset>
PerlAccessHandler Apache::lonacc
SetHandler perl-script
PerlHandler Apache::lonparmset
ErrorDocument 403 /adm/login
ErrorDocument 406 /adm/roles
ErrorDocument 500 /adm/errorhandler
</Location>
=head1 INTRODUCTION
This module sets assessment parameters.
This is part of the LearningOnline Network with CAPA project
described at http://www.lon-capa.org.
=head1 HANDLER SUBROUTINE
This routine is called by Apache and mod_perl.
=over 4
=item *
need to be in course
=item *
bring up assessment screen or course environment
=back
=head1 OTHER SUBROUTINES
=over 4
=item *
parmval() : figure out a cascading parameter
=item *
valout() : format a value for output
=item *
plink() : produces link anchor
=item *
assessparms() : show assess data and parameters
=item *
crsenv() : for the course environment
=back
=cut
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>