File:  [LON-CAPA] / loncom / interface / lonparmset.pm
Revision 1.55: download - view: text, annotated - select for diffs
Mon Jul 22 14:23:29 2002 UTC (21 years, 9 months ago) by bowersj2
Branches: MAIN
CVS tags: HEAD
Checking commit of scripts to make sure I don't get too far out of sync. Added help
links to the message sender describing 'critical message', and several help links in
the course parameters screen. (These will not work until some .tex files are checked
in.)

# The LearningOnline Network with CAPA
# Handler to set parameters for assessments
#
# $Id: lonparmset.pm,v 1.55 2002/07/22 14:23:29 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/
#
# (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
#
# 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;


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}).'&nbsp;'.
	      '</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>&nbsp;</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)',
             'default_xml_style' => '<b>Default XML Style File</b> '.
                    '<a href="javascript:openbrowser'.
                    "('envform','default_xml_style'".
                    ",'sty')\">Browse</a><br>",
             '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)',
             'pageseparators'  => '<b>Visibly Separate Items on Pages</b><br>'.
                                 '("<tt>yes</tt>" for visible separation)',
             'pch.roles.denied'=> '<b>Disallow Resource Discussion for '.
                                  'Roles</b> ' . 
	   Apache::loncommon::help_open_topic("Course_Disable_Discussion")
	                          ,
             'pch.users.denied' => 
                          '<b>Disallow Resource Discussion for Users</b><br>'.
                                 '(<tt>user:domain,user:domain,...</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) {
            # onchange is javascript to automatically check the 'Set' button.
            my $onchange = 'onchange="javascript:window.document.forms'.
                '[\'envform\'].elements[\''.$_.'_setparmval\']'.
                '.checked=true;"';
	    $output.='<tr><td>'.$descriptions{$_}.'</td>'.
                '<td><input name="'.$_.'_value" size=40 '.
                'value="'.$values{$_}.'" '.$onchange.' /></td>'.
                '<td><input type=checkbox name="'.$_.'_setparmval"></td>'.
                '</tr>'."\n";
	}
        my $onchange = 'onchange="javascript:window.document.forms'.
            '[\'envform\'].elements[\'newp_setparmval\']'.
            '.checked=true;"';
	$output.='<tr><td><i>Create New Environment Variable</i><br />'.
	    '<input type="text" size=40 name="newp_name" '.
                $onchange.' /></td><td>'.
            '<input type="text" size=40 name="newp_value" '.
                $onchange.' /></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>