File:
[LON-CAPA] /
loncom /
interface /
lonparmset.pm
Revision
1.62:
download - view:
text,
annotated -
select for diffs
Sat Aug 17 20:04:18 2002 UTC (22 years ago) by
www
Branches:
MAIN
CVS tags:
HEAD
Between versions 1.44 and 1.45 the timestamp had gotten lost on the
backed up course URL. Even though this looks ugly, for data recovery,
all previous versions and the timestamp are important. People should
not get into the habit of changing course URLs anyway. The new "uploaded"
coursedocs-based mechanism should make changing welcome pages, etc, easier,
anyway.
1: # The LearningOnline Network with CAPA
2: # Handler to set parameters for assessments
3: #
4: # $Id: lonparmset.pm,v 1.62 2002/08/17 20:04:18 www Exp $
5: #
6: # Copyright Michigan State University Board of Trustees
7: #
8: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
9: #
10: # LON-CAPA is free software; you can redistribute it and/or modify
11: # it under the terms of the GNU General Public License as published by
12: # the Free Software Foundation; either version 2 of the License, or
13: # (at your option) any later version.
14: #
15: # LON-CAPA is distributed in the hope that it will be useful,
16: # but WITHOUT ANY WARRANTY; without even the implied warranty of
17: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18: # GNU General Public License for more details.
19: #
20: # You should have received a copy of the GNU General Public License
21: # along with LON-CAPA; if not, write to the Free Software
22: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23: #
24: # /home/httpd/html/adm/gpl.txt
25: #
26: # http://www.lon-capa.org/
27: #
28: ###################################################################
29: ###################################################################
30:
31: =pod
32:
33: =head1 NAME
34:
35: lonparmset - Handler to set parameters for assessments and course
36:
37: =head1 SYNOPSIS
38:
39: lonparmset provides an interface to setting course parameters.
40:
41: =head1 DESCRIPTION
42:
43: This module sets coursewide and assessment parameters.
44:
45: =head1 INTERNAL SUBROUTINES
46:
47: =over 4
48:
49: =cut
50:
51: ###################################################################
52: ###################################################################
53:
54: package Apache::lonparmset;
55:
56: use strict;
57: use Apache::lonnet;
58: use Apache::Constants qw(:common :http REDIRECT);
59: use Apache::loncommon;
60: use GDBM_File;
61: use Apache::lonhomework;
62: use Apache::lonxml;
63:
64:
65: my %courseopt;
66: my %useropt;
67: my %parmhash;
68:
69: my @ids;
70: my %symbp;
71: my %mapp;
72: my %typep;
73: my %keyp;
74:
75: my $uname;
76: my $udom;
77: my $uhome;
78: my $csec;
79: my $coursename;
80:
81: ##################################################
82: ##################################################
83:
84: =pod
85:
86: =item parmval
87:
88: Figure out a cascading parameter.
89:
90: Inputs: $what $id $def
91:
92: Returns: I am not entirely sure.
93:
94: =cut
95:
96: ##################################################
97: ##################################################
98: sub parmval {
99: my ($what,$id,$def)=@_;
100: my $result='';
101: my @outpar=();
102: # ----------------------------------------------------- Cascading lookup scheme
103:
104: my $symbparm=$symbp{$id}.'.'.$what;
105: my $mapparm=$mapp{$id}.'___(all).'.$what;
106:
107: my $seclevel=$ENV{'request.course.id'}.'.['.$csec.'].'.$what;
108: my $seclevelr=$ENV{'request.course.id'}.'.['.$csec.'].'.$symbparm;
109: my $seclevelm=$ENV{'request.course.id'}.'.['.$csec.'].'.$mapparm;
110:
111: my $courselevel=$ENV{'request.course.id'}.'.'.$what;
112: my $courselevelr=$ENV{'request.course.id'}.'.'.$symbparm;
113: my $courselevelm=$ENV{'request.course.id'}.'.'.$mapparm;
114:
115: # -------------------------------------------------------- first, check default
116:
117: if ($def) { $outpar[11]=$def; $result=11; }
118:
119: # ----------------------------------------------------- second, check map parms
120:
121: my $thisparm=$parmhash{$symbparm};
122: if ($thisparm) { $outpar[10]=$thisparm; $result=10; }
123:
124: # --------------------------------------------------------- third, check course
125:
126: if ($courseopt{$courselevel}) {
127: $outpar[9]=$courseopt{$courselevel};
128: $result=9;
129: }
130:
131: if ($courseopt{$courselevelm}) {
132: $outpar[8]=$courseopt{$courselevelm};
133: $result=8;
134: }
135:
136: if ($courseopt{$courselevelr}) {
137: $outpar[7]=$courseopt{$courselevelr};
138: $result=7;
139: }
140:
141: if ($csec) {
142: if ($courseopt{$seclevel}) {
143: $outpar[6]=$courseopt{$seclevel};
144: $result=6;
145: }
146: if ($courseopt{$seclevelm}) {
147: $outpar[5]=$courseopt{$seclevelm};
148: $result=5;
149: }
150:
151: if ($courseopt{$seclevelr}) {
152: $outpar[4]=$courseopt{$seclevelr};
153: $result=4;
154: }
155: }
156:
157: # ---------------------------------------------------------- fourth, check user
158:
159: if ($uname) {
160: if ($useropt{$courselevel}) {
161: $outpar[3]=$useropt{$courselevel};
162: $result=3;
163: }
164:
165: if ($useropt{$courselevelm}) {
166: $outpar[2]=$useropt{$courselevelm};
167: $result=2;
168: }
169:
170: if ($useropt{$courselevelr}) {
171: $outpar[1]=$useropt{$courselevelr};
172: $result=1;
173: }
174: }
175:
176: return ($result,@outpar);
177: }
178:
179: ##################################################
180: ##################################################
181:
182: =pod
183:
184: =item valout
185:
186: Format a value for output.
187:
188: Inputs: $value, $type
189:
190: Returns: $value, formatted for output. If $type indicates it is a date,
191: localtime($value) is returned.
192:
193: =cut
194:
195: ##################################################
196: ##################################################
197: sub valout {
198: my ($value,$type)=@_;
199: my $result = '';
200: # Values of zero are valid.
201: if (! $value && $value ne '0') {
202: $result = ' ';
203: } else {
204: if ($type=~/^date/) {
205: $result = localtime($value);
206: } else {
207: $result = $value;
208: }
209: }
210: return $result;
211: }
212:
213: ##################################################
214: ##################################################
215:
216: =pod
217:
218: =item plink
219:
220: Produces a link anchor.
221:
222: Inputs: $type,$dis,$value,$marker,$return,$call
223:
224: Returns: scalar with html code for a link which will envoke the
225: javascript function 'pjump'.
226:
227: =cut
228:
229: ##################################################
230: ##################################################
231: sub plink {
232: my ($type,$dis,$value,$marker,$return,$call)=@_;
233: my $winvalue=$value;
234: unless ($winvalue) {
235: if ($type=~/^date/) {
236: $winvalue=$ENV{'form.recent_'.$type};
237: } else {
238: $winvalue=$ENV{'form.recent_'.(split(/\_/,$type))[0]};
239: }
240: }
241: return
242: '<a href="javascript:pjump('."'".$type."','".$dis."','".$winvalue."','"
243: .$marker."','".$return."','".$call."'".');">'.
244: &valout($value,$type).'</a><a name="'.$marker.'"></a>';
245: }
246:
247:
248: sub startpage {
249: my ($r,$id,$udom,$csec,$uname)=@_;
250: $r->content_type('text/html');
251: $r->send_http_header;
252: $r->print(<<ENDHEAD);
253: <html>
254: <head>
255: <title>LON-CAPA Course Parameters</title>
256: <script>
257:
258: function pclose() {
259: parmwin=window.open("/adm/rat/empty.html","LONCAPAparms",
260: "height=350,width=350,scrollbars=no,menubar=no");
261: parmwin.close();
262: }
263:
264: function pjump(type,dis,value,marker,ret,call) {
265: document.parmform.pres_marker.value='';
266: parmwin=window.open("/adm/rat/parameter.html?type="+escape(type)
267: +"&value="+escape(value)+"&marker="+escape(marker)
268: +"&return="+escape(ret)
269: +"&call="+escape(call)+"&name="+escape(dis),"LONCAPAparms",
270: "height=350,width=350,scrollbars=no,menubar=no");
271:
272: }
273:
274: function psub() {
275: pclose();
276: if (document.parmform.pres_marker.value!='') {
277: document.parmform.action+='#'+document.parmform.pres_marker.value;
278: var typedef=new Array();
279: typedef=document.parmform.pres_type.value.split('_');
280: if (document.parmform.pres_type.value!='') {
281: if (typedef[0]=='date') {
282: eval('document.parmform.recent_'+
283: document.parmform.pres_type.value+
284: '.value=document.parmform.pres_value.value;');
285: } else {
286: eval('document.parmform.recent_'+typedef[0]+
287: '.value=document.parmform.pres_value.value;');
288: }
289: }
290: document.parmform.submit();
291: } else {
292: document.parmform.pres_value.value='';
293: document.parmform.pres_marker.value='';
294: }
295: }
296:
297: function openWindow(url, wdwName, w, h, toolbar,scrollbar) {
298: var options = "width=" + w + ",height=" + h + ",";
299: options += "resizable=yes,scrollbars="+scrollbar+",status=no,";
300: options += "menubar=no,toolbar="+toolbar+",location=no,directories=no";
301: var newWin = window.open(url, wdwName, options);
302: newWin.focus();
303: }
304: </script>
305: </head>
306: <body bgcolor="#FFFFFF" onUnload="pclose()">
307: <h1>Set Course Parameters for Course:
308: $ENV{'course.'.$ENV{'request.course.id'}.'.description'}</h1>
309: <form method="post" action="/adm/parmset" name="envform">
310: <h3>Course Environment</h3>
311: <input type="submit" name="crsenv" value="Set Course Environment">
312: </form>
313: <form method="post" action="/adm/parmset" name="parmform">
314: <h3>Course Assessments</h3>
315: <b>
316: Section/Group:
317: <input type="text" value="$csec" size="6" name="csec">
318: <br>
319: For User
320: <input type="text" value="$uname" size="12" name="uname">
321: or ID
322: <input type="text" value="$id" size="12" name="id">
323: at Domain
324: <input type="text" value="$udom" size="6" name="udom">
325: </b>
326: <input type="hidden" value='' name="pres_value">
327: <input type="hidden" value='' name="pres_type">
328: <input type="hidden" value='' name="pres_marker">
329: ENDHEAD
330:
331: }
332:
333: sub print_row {
334: my ($r,$which,$part,$name,$rid,$default,$type,$display,$defbgone,
335: $defbgtwo,$parmlev)=@_;
336: my ($result,@outpar)=&parmval($$part{$which}.'.'.$$name{$which},
337: $rid,$$default{$which});
338: my $parm=$$display{$which};
339:
340: if ($parmlev eq 'full' || $parmlev eq 'brief') {
341: $r->print('<td bgcolor='.$defbgtwo.' align="center">'
342: .$$part{$which}.'</td>');
343: } else {
344: $parm=~s|\[.*\]\s||g;
345: }
346:
347: $r->print('<td bgcolor='.$defbgone.'>'.$parm.'</td>');
348:
349: my $thismarker=$which;
350: $thismarker=~s/^parameter\_//;
351: my $mprefix=$rid.'&'.$thismarker.'&';
352:
353: if ($parmlev eq 'general') {
354:
355: if ($uname) {
356: &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$_,$type,$display);
357: } elsif ($csec) {
358: &print_td($r,6,$defbgtwo,$result,\@outpar,$mprefix,$_,$type,$display);
359: } else {
360: &print_td($r,9,$defbgone,$result,\@outpar,$mprefix,$_,$type,$display);
361: }
362: } elsif ($parmlev eq 'map') {
363:
364: if ($uname) {
365: &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$_,$type,$display);
366: } elsif ($csec) {
367: &print_td($r,5,$defbgtwo,$result,\@outpar,$mprefix,$_,$type,$display);
368: } else {
369: &print_td($r,8,$defbgone,$result,\@outpar,$mprefix,$_,$type,$display);
370: }
371: } else {
372:
373: &print_td($r,11,'#FFDDDD',$result,\@outpar,$mprefix,$_,$type,$display);
374:
375: if ($parmlev eq 'brief') {
376:
377: &print_td($r,7,$defbgone,$result,\@outpar,$mprefix,$_,$type,$display);
378:
379: if ($csec) {
380: &print_td($r,4,$defbgtwo,$result,\@outpar,$mprefix,$_,$type,$display);
381: }
382: if ($uname) {
383: &print_td($r,1,$defbgone,$result,\@outpar,$mprefix,$_,$type,$display);
384: }
385: } else {
386:
387: &print_td($r,10,'#FFDDDD',$result,\@outpar,$mprefix,$_,$type,$display);
388: &print_td($r,9,$defbgone,$result,\@outpar,$mprefix,$_,$type,$display);
389: &print_td($r,8,$defbgone,$result,\@outpar,$mprefix,$_,$type,$display);
390: &print_td($r,7,$defbgone,$result,\@outpar,$mprefix,$_,$type,$display);
391:
392: if ($csec) {
393: &print_td($r,6,$defbgtwo,$result,\@outpar,$mprefix,$_,$type,$display);
394: &print_td($r,5,$defbgtwo,$result,\@outpar,$mprefix,$_,$type,$display);
395: &print_td($r,4,$defbgtwo,$result,\@outpar,$mprefix,$_,$type,$display);
396: }
397: if ($uname) {
398: &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$_,$type,$display);
399: &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$_,$type,$display);
400: &print_td($r,1,$defbgone,$result,\@outpar,$mprefix,$_,$type,$display);
401: }
402: } # end of $brief if/else
403: } # end of $parmlev if/else
404:
405: if ($parmlev eq 'full' || $parmlev eq 'brief') {
406: $r->print('<td bgcolor=#CCCCFF align="center">'.
407: &valout($outpar[$result],$$type{$which}).'</td>');
408: }
409: my $sessionval=&Apache::lonnet::EXT('resource.'.$$part{$which}.
410: '.'.$$name{$which},$symbp{$rid});
411: $r->print('<td bgcolor=#999999 align="center"><font color=#FFFFFF>'.
412: &valout($sessionval,$$type{$which}).' '.
413: '</font></td>');
414: $r->print('</tr>');
415: $r->print("\n");
416: }
417:
418: sub print_td {
419: my ($r,$which,$defbg,$result,$outpar,$mprefix,$value,$type,$display)=@_;
420: $r->print('<td bgcolor='.(($result==$which)?'"#AAFFAA"':$defbg).
421: ' align="center">'.
422: &plink($$type{$value},$$display{$value},$$outpar[$which],
423: $mprefix."$which",'parmform.pres','psub').'</td>'."\n");
424: }
425:
426: sub get_env_multiple {
427: my ($name) = @_;
428: my @values;
429: if (defined($ENV{$name})) {
430: # exists is it an array
431: if (ref($ENV{$name})) {
432: @values=@{ $ENV{$name} };
433: } else {
434: $values[0]=$ENV{$name};
435: }
436: }
437: return(@values);
438: }
439:
440: ##################################################
441: ##################################################
442:
443: =pod
444:
445: =item assessparms
446:
447: Show assessment data and parameters. This is a large routine that should
448: be simplified and shortened... someday.
449:
450: Inputs: $r
451:
452: Returns: nothing
453:
454: =cut
455:
456: ##################################################
457: ##################################################
458: sub assessparms {
459:
460: my $r=shift;
461: # -------------------------------------------------------- Variable declaration
462: my %allkeys;
463: my %allmaps;
464: my %alllevs;
465:
466: $alllevs{'Resource Level'}='full';
467: # $alllevs{'Resource Level [BRIEF]'}='brief';
468: $alllevs{'Map Level'}='map';
469: $alllevs{'Course Level'}='general';
470:
471: my %allparms;
472: my %allparts;
473:
474: my %defp;
475: %courseopt=();
476: %useropt=();
477: my %bighash=();
478:
479: @ids=();
480: %symbp=();
481: %typep=();
482:
483: my $message='';
484:
485: $csec=$ENV{'form.csec'};
486: $udom=$ENV{'form.udom'};
487: unless ($udom) { $udom=$r->dir_config('lonDefDomain'); }
488:
489: my @pscat=&get_env_multiple('form.pscat');
490: my $pschp=$ENV{'form.pschp'};
491: my @psprt=&get_env_multiple('form.psprt');
492: my $showoptions=$ENV{'form.showoptions'};
493:
494: my $pssymb='';
495: my $parmlev='';
496: my $prevvisit=$ENV{'form.prevvisit'};
497:
498: # unless ($parmlev==$ENV{'form.parmlev'}) {
499: # $parmlev = 'full';
500: # }
501:
502: unless ($ENV{'form.parmlev'}) {
503: $parmlev = 'map';
504: } else {
505: $parmlev = $ENV{'form.parmlev'};
506: }
507:
508: # ----------------------------------------------- Was this started from grades?
509:
510: if (($ENV{'form.command'} eq 'set') && ($ENV{'form.url'})
511: && (!$ENV{'form.dis'})) {
512: my $url=$ENV{'form.url'};
513: $url=~s-^http://($ENV{'SERVER_NAME'}|$ENV{'HTTP_HOST'})--;
514: $pssymb=&Apache::lonnet::symbread($url);
515: @pscat='all';
516: $pschp='';
517: $parmlev = 'full';
518: } elsif ($ENV{'form.symb'}) {
519: $pssymb=$ENV{'form.symb'};
520: @pscat='all';
521: $pschp='';
522: $parmlev = 'full';
523: } else {
524: $ENV{'form.url'}='';
525: }
526:
527: my $id=$ENV{'form.id'};
528: if (($id) && ($udom)) {
529: $uname=(&Apache::lonnet::idget($udom,$id))[1];
530: if ($uname) {
531: $id='';
532: } else {
533: $message=
534: "<font color=red>Unknown ID '$id' at domain '$udom'</font>";
535: }
536: } else {
537: $uname=$ENV{'form.uname'};
538: }
539: unless ($udom) { $uname=''; }
540: $uhome='';
541: if ($uname) {
542: $uhome=&Apache::lonnet::homeserver($uname,$udom);
543: if ($uhome eq 'no_host') {
544: $message=
545: "<font color=red>Unknown user '$uname' at domain '$udom'</font>";
546: $uname='';
547: } else {
548: $csec=&Apache::lonnet::usection($udom,$uname,
549: $ENV{'request.course.id'});
550: if ($csec eq '-1') {
551: $message="<font color=red>".
552: "User '$uname' at domain '$udom' not ".
553: "in this course</font>";
554: $uname='';
555: $csec=$ENV{'form.csec'};
556: } else {
557: my %name=&Apache::lonnet::userenvironment($udom,$uname,
558: ('firstname','middlename','lastname','generation','id'));
559: $message="\n<p>\nFull Name: ".
560: $name{'firstname'}.' '.$name{'middlename'}.' '
561: .$name{'lastname'}.' '.$name{'generation'}.
562: "<br>\nID: ".$name{'id'}.'<p>';
563: }
564: }
565: }
566:
567: unless ($csec) { $csec=''; }
568:
569: my $fcat=$ENV{'form.fcat'};
570: unless ($fcat) { $fcat=''; }
571:
572: # ------------------------------------------------------------------- Tie hashs
573: if (!(tie(%bighash,'GDBM_File',$ENV{'request.course.fn'}.'.db',
574: &GDBM_READER(),0640))) {
575: $r->print("Unable to access course data. (File $ENV{'request.course.fn'}.db not tieable)");
576: return ;
577: }
578: if (!(tie(%parmhash,'GDBM_File',
579: $ENV{'request.course.fn'}.'_parms.db',&GDBM_READER(),0640))) {
580: $r->print("Unable to access parameter data. (File $ENV{'request.course.fn'}_parms.db not tieable)");
581: return ;
582: }
583: # --------------------------------------------------------- Get all assessments
584: foreach (keys %bighash) {
585: if ($_=~/^src\_(\d+)\.(\d+)$/) {
586: my $mapid=$1;
587: my $resid=$2;
588: my $id=$mapid.'.'.$resid;
589: my $srcf=$bighash{$_};
590: if ($srcf=~/\.(problem|exam|quiz|assess|survey|form)$/) {
591: $ids[$#ids+1]=$id;
592: $typep{$id}=$1;
593: $keyp{$id}='';
594: foreach (split(/\,/,&Apache::lonnet::metadata($srcf,'keys'))) {
595: if ($_=~/^parameter\_(.*)/) {
596: my $key=$_;
597: my $allkey=$1;
598: $allkey=~s/\_/\./g;
599: my $display= &Apache::lonnet::metadata($srcf,$key.'.display');
600: my $name=&Apache::lonnet::metadata($srcf,$key.'.name');
601: my $part= &Apache::lonnet::metadata($srcf,$key.'.part');
602: my $parmdis = $display;
603: $parmdis =~ s|(\[Part.*$)||g;
604: my $partkey = $part;
605: $partkey =~ tr|_|.|;
606: $allparms{$name} = $parmdis;
607: $allparts{$part} = "[Part $part]";
608: $allkeys{$allkey}=$display;
609: if ($allkey eq $fcat) {
610: $defp{$id}= &Apache::lonnet::metadata($srcf,$key);
611: }
612: if ($keyp{$id}) {
613: $keyp{$id}.=','.$key;
614: } else {
615: $keyp{$id}=$key;
616: }
617: }
618: }
619: $mapp{$id}=
620: &Apache::lonnet::declutter($bighash{'map_id_'.$mapid});
621: $mapp{$mapid}=$mapp{$id};
622: $allmaps{$mapid}=$mapp{$id};
623: $symbp{$id}=$mapp{$id}.
624: '___'.$resid.'___'.
625: &Apache::lonnet::declutter($srcf);
626: $symbp{$mapid}=$mapp{$id}.'___(all)';
627: }
628: }
629: }
630: $mapp{'0.0'} = '';
631: $symbp{'0.0'} = '';
632: # ---------------------------------------------------------- Anything to store?
633: if ($ENV{'form.pres_marker'}) {
634: my ($sresid,$spnam,$snum)=split(/\&/,$ENV{'form.pres_marker'});
635: $spnam=~s/\_([^\_]+)$/\.$1/;
636: # ---------------------------------------------------------- Construct prefixes
637:
638: my $symbparm=$symbp{$sresid}.'.'.$spnam;
639: my $mapparm=$mapp{$sresid}.'___(all).'.$spnam;
640:
641: my $seclevel=$ENV{'request.course.id'}.'.['.$csec.'].'.$spnam;
642: my $seclevelr=$ENV{'request.course.id'}.'.['.$csec.'].'.$symbparm;
643: my $seclevelm=$ENV{'request.course.id'}.'.['.$csec.'].'.$mapparm;
644:
645: my $courselevel=$ENV{'request.course.id'}.'.'.$spnam;
646: my $courselevelr=$ENV{'request.course.id'}.'.'.$symbparm;
647: my $courselevelm=$ENV{'request.course.id'}.'.'.$mapparm;
648:
649: my $storeunder='';
650: if (($snum==9) || ($snum==3)) { $storeunder=$courselevel; }
651: if (($snum==8) || ($snum==2)) { $storeunder=$courselevelm; }
652: if (($snum==7) || ($snum==1)) { $storeunder=$courselevelr; }
653: if ($snum==6) { $storeunder=$seclevel; }
654: if ($snum==5) { $storeunder=$seclevelm; }
655: if ($snum==4) { $storeunder=$seclevelr; }
656:
657: my %storecontent = ($storeunder => $ENV{'form.pres_value'},
658: $storeunder.'type' => $ENV{'form.pres_type'});
659: my $reply='';
660: if ($snum>3) {
661: # ---------------------------------------------------------------- Store Course
662: #
663: # Expire sheets
664: &Apache::lonnet::expirespread('','','studentcalc');
665: if (($snum==7) || ($snum==4)) {
666: &Apache::lonnet::expirespread('','','assesscalc',$symbp{$sresid});
667: } elsif (($snum==8) || ($snum==5)) {
668: &Apache::lonnet::expirespread('','','assesscalc',$mapp{$sresid});
669: } else {
670: &Apache::lonnet::expirespread('','','assesscalc');
671: }
672: # Store parameter
673: $reply=&Apache::lonnet::cput
674: ('resourcedata',\%storecontent,
675: $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},
676: $ENV{'course.'.$ENV{'request.course.id'}.'.num'});
677: } else {
678: # ------------------------------------------------------------------ Store User
679: #
680: # Expire sheets
681: &Apache::lonnet::expirespread($uname,$udom,'studentcalc');
682: if ($snum==1) {
683: &Apache::lonnet::expirespread
684: ($uname,$udom,'assesscalc',$symbp{$sresid});
685: } elsif ($snum==2) {
686: &Apache::lonnet::expirespread
687: ($uname,$udom,'assesscalc',$mapp{$sresid});
688: } else {
689: &Apache::lonnet::expirespread($uname,$udom,'assesscalc');
690: }
691: # Store parameter
692: $reply=&Apache::lonnet::cput
693: ('resourcedata',\%storecontent,$udom,$uname);
694: }
695:
696: if ($reply=~/^error\:(.*)/) {
697: $message.="<font color=red>Write Error: $1</font>";
698: }
699: # ---------------------------------------------------------------- Done storing
700: }
701: # -------------------------------------------------------------- Get coursedata
702: %courseopt = &Apache::lonnet::dump
703: ('resourcedata',
704: $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},
705: $ENV{'course.'.$ENV{'request.course.id'}.'.num'});
706: # --------------------------------------------------- Get userdata (if present)
707: if ($uname) {
708: %useropt=&Apache::lonnet::dump('resourcedata',$udom,$uname);
709: }
710:
711: # ------------------------------------------------------------------- Sort this
712:
713: @ids=sort {
714: if ($fcat eq '') {
715: $a<=>$b;
716: } else {
717: my ($result,@outpar)=&parmval($fcat,$a,$defp{$a});
718: my $aparm=$outpar[$result];
719: ($result,@outpar)=&parmval($fcat,$b,$defp{$b});
720: my $bparm=$outpar[$result];
721: 1*$aparm<=>1*$bparm;
722: }
723: } @ids;
724: #----------------------------------------------- if all selected, fill in array
725: if ($pscat[0] eq "all" || !@pscat) {@pscat = (keys %allparms);}
726: if ($psprt[0] eq "all" || !@psprt) {@psprt = (keys %allparts);}
727: # ------------------------------------------------------------------ Start page
728: &startpage($r,$id,$udom,$csec,$uname);
729: # if ($ENV{'form.url'}) {
730: # $r->print('<input type="hidden" value="'.$ENV{'form.url'}.
731: # '" name="url"><input type="hidden" name="command" value="set">');
732: # }
733: $r->print('<input type="hidden" value="true" name="prevvisit">');
734:
735: foreach ('tolerance','date_default','date_start','date_end',
736: 'date_interval','int','float','string') {
737: $r->print('<input type="hidden" value="'.
738: $ENV{'form.recent_'.$_}.'" name="recent_'.$_.'">');
739: }
740:
741: $r->print('<h2>'.$message.'</h2><table>');
742:
743: $r->print('<tr><td><hr /></td></tr>');
744:
745: my $submitmessage;
746: if (($prevvisit) || ($pschp) || ($pssymb)) {
747: $submitmessage = "Update Display";
748: } else {
749: $submitmessage = "Display";
750: }
751: if (!$pssymb) {
752: $r->print('<tr><td>Select Parameter Level</td><td>');
753: $r->print('<select name="parmlev">');
754: foreach (reverse sort keys %alllevs) {
755: $r->print('<option value="'.$alllevs{$_}.'"');
756: if ($parmlev eq $alllevs{$_}) {
757: $r->print(' selected');
758: }
759: $r->print('>'.$_.'</option>');
760: }
761: $r->print("</select></td>\n");
762:
763: $r->print('<td><input type="submit" name="dis" value="'.$submitmessage.'"></td>');
764:
765: $r->print('</tr><tr><td><hr /></td>');
766:
767: $r->print('<tr><td>Select Enclosing Map</td>');
768: $r->print('<td colspan="2"><select name="pschp">');
769: $r->print('<option value="all">All Maps</option>');
770: foreach (sort {$allmaps{$a} cmp $allmaps{$b}} keys %allmaps) {
771: $r->print('<option value="'.$_.'"');
772: if (($pschp eq $_)) { $r->print(' selected'); }
773: $r->print('>/res/'.$allmaps{$_}.'</option>');
774: }
775: $r->print("</select></td></tr>\n");
776: } else {
777: my ($map,$id,$resource)=split(/___/,$pssymb);
778: $r->print("<tr><td>Specific Resource</td><td>$resource</td>");
779: $r->print('<td><input type="submit" name="dis" value="'.$submitmessage.'"></td>');
780: $r->print('</tr>');
781: $r->print('<input type="hidden" value="'.$pssymb.'" name="symb">');
782: }
783:
784: $r->print('<tr><td colspan="3"><hr /><input type="checkbox"');
785: if ($showoptions eq 'show') {$r->print(" checked ");}
786: $r->print(' name="showoptions" value="show" onclick="form.submit();">Show More Options<hr /></td></tr>');
787: # $r->print("<tr><td>Show: $showoptions</td></tr>");
788: # $r->print("<tr><td>pscat: @pscat</td></tr>");
789: # $r->print("<tr><td>psprt: @psprt</td></tr>");
790: # $r->print("<tr><td>fcat: $fcat</td></tr>");
791:
792: if ($showoptions eq 'show') {
793: my $tempkey;
794:
795: $r->print('<tr><td colspan="3" align="center">Select Parameters to View</td></tr>');
796:
797: $r->print('<tr><td colspan="2"><table>');
798: $r->print('<tr><td><input type="checkbox" name="pscat" value="all"');
799: $r->print(' checked') unless (@pscat);
800: $r->print('>All Parameters</td>');
801:
802: my $cnt=0;
803:
804: foreach $tempkey (sort { $allparms{$a} cmp $allparms{$b} }
805: keys %allparms ) {
806: ++$cnt;
807: $r->print('</tr><tr>') unless ($cnt%2);
808: $r->print('<td><input type="checkbox" name="pscat" ');
809: $r->print('value="'.$tempkey.'"');
810: if ($pscat[0] eq "all" || grep $_ eq $tempkey, @pscat) {
811: $r->print(' checked');
812: }
813: $r->print('>'.$allparms{$tempkey}.'</td>');
814: }
815: $r->print('</tr></table>');
816:
817: # $r->print('<tr><td>Select Parts</td><td>');
818: $r->print('<td><select multiple name="psprt" size="5">');
819: $r->print('<option value="all"');
820: $r->print(' selected') unless (@psprt);
821: $r->print('>All Parts</option>');
822: foreach $tempkey (sort keys %allparts) {
823: unless ($tempkey =~ /\./) {
824: $r->print('<option value="'.$tempkey.'"');
825: if ($psprt[0] eq "all" || grep $_ == $tempkey, @psprt) {
826: $r->print(' selected');
827: }
828: $r->print('>'.$allparts{$tempkey}.'</option>');
829: }
830: }
831: $r->print('</select></td></tr><tr><td colspan="3"><hr /></td></tr>');
832:
833: $r->print('<tr><td>Sort list by</td><td>');
834: $r->print('<select name="fcat">');
835: $r->print('<option value="">Enclosing Map</option>');
836: foreach (sort keys %allkeys) {
837: $r->print('<option value="'.$_.'"');
838: if ($fcat eq $_) { $r->print(' selected'); }
839: $r->print('>'.$allkeys{$_}.'</option>');
840: }
841: $r->print('</select></td>');
842:
843: $r->print('</tr><tr><td colspan="3"><hr /></td></tr>');
844:
845: } else { # hide options - include any necessary extras here
846:
847: $r->print('<input type="hidden" name="fcat" value="'.$fcat.'">'."\n");
848:
849: unless (@pscat) {
850: foreach (keys %allparms ) {
851: $r->print('<input type="hidden" name="pscat" value="'.$_.'">'."\n");
852: }
853: } else {
854: foreach (@pscat) {
855: $r->print('<input type="hidden" name="pscat" value="'.$_.'">'."\n");
856: }
857: }
858:
859: unless (@psprt) {
860: foreach (keys %allparts ) {
861: $r->print('<input type="hidden" name="psprt" value="'.$_.'">'."\n");
862: }
863: } else {
864: foreach (@psprt) {
865: $r->print('<input type="hidden" name="psprt" value="'.$_.'">'."\n");
866: }
867: }
868:
869: }
870: $r->print('</table>');
871:
872: my @temp_psprt;
873: foreach my $t (@psprt) {
874: push(@temp_psprt, grep {eval (/^$t\./ || ($_ == $t))} (keys %allparts));
875: }
876:
877: @psprt = @temp_psprt;
878:
879: my @temp_pscat;
880: map {
881: my $cat = $_;
882: push(@temp_pscat, map { $_.'.'.$cat } @psprt);
883: } @pscat;
884:
885: @pscat = @temp_pscat;
886:
887: if (($prevvisit) || ($pschp) || ($pssymb)) {
888: # ----------------------------------------------------------------- Start Table
889: my @catmarker=map { tr|.|_|; 'parameter_'.$_; } @pscat;
890: my $csuname=$ENV{'user.name'};
891: my $csudom=$ENV{'user.domain'};
892:
893:
894: if ($parmlev eq 'full' || $parmlev eq 'brief') {
895:
896: my $coursespan=$csec?8:5;
897: $r->print('<p><table border=2>');
898: $r->print('<tr><td colspan=5></td>');
899: $r->print('<th colspan='.($coursespan).'>Any User</th>');
900: if ($uname) {
901: $r->print("<th colspan=3 rowspan=2>");
902: $r->print("User $uname at Domain $udom</th>");
903: }
904: $r->print(<<ENDTABLETWO);
905: <th rowspan=3>Parameter in Effect</th>
906: <th rowspan=3>Current Session Value<br>($csuname at $csudom)</th>
907: </tr><tr><td colspan=5></td><th colspan=2>Resource Level</th>
908: <th colspan=3>in Course</th>
909: ENDTABLETWO
910: if ($csec) {
911: $r->print("<th colspan=3>in Section/Group $csec</th>");
912: }
913: $r->print(<<ENDTABLEHEADFOUR);
914: </tr><tr><th>Assessment URL and Title</th><th>Type</th>
915: <th>Enclosing Map</th><th>Part No.</th><th>Parameter Name</th>
916: <th>default</th><th>from Enclosing Map</th>
917: <th>general</th><th>for Enclosing Map</th><th>for Resource</th>
918: ENDTABLEHEADFOUR
919:
920: if ($csec) {
921: $r->print('<th>general</th><th>for Enclosing Map</th><th>for Resource</th>');
922: }
923:
924: if ($uname) {
925: $r->print('<th>general</th><th>for Enclosing Map</th><th>for Resource</th>');
926: }
927:
928: $r->print('</tr>');
929:
930: my $defbgone='';
931: my $defbgtwo='';
932:
933: foreach (@ids) {
934:
935: my $rid=$_;
936: my ($inmapid)=($rid=~/\.(\d+)$/);
937:
938: if (($pschp eq 'all') || ($allmaps{$pschp} eq $mapp{$rid}) ||
939: ($pssymb eq $symbp{$rid})) {
940: # ------------------------------------------------------ Entry for one resource
941: if ($defbgone eq '"E0E099"') {
942: $defbgone='"E0E0DD"';
943: } else {
944: $defbgone='"E0E099"';
945: }
946: if ($defbgtwo eq '"FFFF99"') {
947: $defbgtwo='"FFFFDD"';
948: } else {
949: $defbgtwo='"FFFF99"';
950: }
951: my $thistitle='';
952: my %name= ();
953: undef %name;
954: my %part= ();
955: my %display=();
956: my %type= ();
957: my %default=();
958: my $uri=&Apache::lonnet::declutter($bighash{'src_'.$rid});
959:
960: foreach (split(/\,/,$keyp{$rid})) {
961: my $tempkeyp = $_;
962: if (grep $_ eq $tempkeyp, @catmarker) {
963: $part{$_}=&Apache::lonnet::metadata($uri,$_.'.part');
964: $name{$_}=&Apache::lonnet::metadata($uri,$_.'.name');
965: $display{$_}=&Apache::lonnet::metadata($uri,$_.'.display');
966: unless ($display{$_}) { $display{$_}=''; }
967: $display{$_}.=' ('.$name{$_}.')';
968: $default{$_}=&Apache::lonnet::metadata($uri,$_);
969: $type{$_}=&Apache::lonnet::metadata($uri,$_.'.type');
970: $thistitle=&Apache::lonnet::metadata($uri,$_.'.title');
971: }
972: }
973: my $totalparms=scalar keys %name;
974: if ($totalparms>0) {
975: my $firstrow=1;
976:
977: $r->print('<tr><td bgcolor='.$defbgone.
978: ' rowspan='.$totalparms.
979: '><tt><font size=-1>'.
980: join(' / ',split(/\//,$uri)).
981: '</font></tt><p><b>'.
982: "<a href=\"javascript:openWindow('/res/".$uri.
983: "', 'metadatafile', '450', '500', 'no', 'yes')\";".
984: " TARGET=_self>$bighash{'title_'.$rid}");
985:
986: if ($thistitle) {
987: $r->print(' ('.$thistitle.')');
988: }
989: $r->print('</a></b></td>');
990: $r->print('<td bgcolor='.$defbgtwo.
991: ' rowspan='.$totalparms.'>'.$typep{$rid}.
992: '</td>');
993:
994: $r->print('<td bgcolor='.$defbgone.
995: ' rowspan='.$totalparms.
996: '><tt><font size=-1>');
997:
998: $r->print(' / res / ');
999: $r->print(join(' / ', split(/\//,$mapp{$rid})));
1000:
1001: $r->print('</font></tt></td>');
1002:
1003: foreach (sort keys %name) {
1004: unless ($firstrow) {
1005: $r->print('<tr>');
1006: } else {
1007: undef $firstrow;
1008: }
1009:
1010: &print_row($r,$_,\%part,\%name,$rid,\%default,
1011: \%type,\%display,$defbgone,$defbgtwo,
1012: $parmlev);
1013: }
1014: }
1015: }
1016: } # end foreach ids
1017: # -------------------------------------------------- End entry for one resource
1018: $r->print('</table>');
1019: } # end of brief/full
1020: #--------------------------------------------------- Entry for parm level map
1021: if ($parmlev eq 'map') {
1022: my $defbgone = '"E0E099"';
1023: my $defbgtwo = '"FFFF99"';
1024:
1025: my %maplist;
1026:
1027: if ($pschp eq 'all') {
1028: %maplist = %allmaps;
1029: } else {
1030: %maplist = ($pschp => $mapp{$pschp});
1031: }
1032:
1033: #-------------------------------------------- for each map, gather information
1034: my $mapid;
1035: foreach $mapid (sort {$maplist{$a} cmp $maplist{$b}} keys %maplist) {
1036: my $maptitle = $maplist{$mapid};
1037:
1038: #----------------------- loop through ids and get all parameter types for map
1039: #----------------------------------------- and associated information
1040: my %name = ();
1041: my %part = ();
1042: my %display = ();
1043: my %type = ();
1044: my %default = ();
1045: my $map = 0;
1046:
1047: # $r->print("Catmarker: @catmarker<br />\n");
1048:
1049: foreach (@ids) {
1050: ($map)=(/([\d]*?)\./);
1051: my $rid = $_;
1052:
1053: # $r->print("$mapid:$map: $rid <br /> \n");
1054:
1055: if ($map eq $mapid) {
1056: my $uri=&Apache::lonnet::declutter($bighash{'src_'.$rid});
1057: # $r->print("Keys: $keyp{$rid} <br />\n");
1058:
1059: #--------------------------------------------------------------------
1060: # @catmarker contains list of all possible parameters including part #s
1061: # $fullkeyp contains the full part/id # for the extraction of proper parameters
1062: # $tempkeyp contains part 0 only (no ids - ie, subparts)
1063: # When storing information, store as part 0
1064: # When requesting information, request from full part
1065: #-------------------------------------------------------------------
1066: foreach (split(/\,/,$keyp{$rid})) {
1067: my $tempkeyp = $_;
1068: my $fullkeyp = $tempkeyp;
1069: $tempkeyp =~ s/_[\d_]+_/_0_/;
1070:
1071: if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {
1072: $part{$tempkeyp}="0";
1073: $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name');
1074: $display{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');
1075: unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; }
1076: $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')';
1077: $display{$tempkeyp} =~ s/_[\d_]+_/_0_/;
1078: $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp);
1079: $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.type');
1080: }
1081: } # end loop through keys
1082: }
1083: } # end loop through ids
1084:
1085: #---------------------------------------------------- print header information
1086: $r->print(<<ENDMAPONE);
1087: <center><h4>
1088: <font color="red">Set Defaults for All Resources in map
1089: <i>$maptitle</i><br />
1090: Specifically for
1091: ENDMAPONE
1092: if ($uname) {
1093: my %name=&Apache::lonnet::userenvironment($udom,$uname,
1094: ('firstname','middlename','lastname','generation', 'id'));
1095: my $person=$name{'firstname'}.' '.$name{'middlename'}.' '
1096: .$name{'lastname'}.' '.$name{'generation'};
1097: $r->print("User <i>$uname \($person\) </i> in \n");
1098: } else {
1099: $r->print("<i>all</i> users in \n");
1100: }
1101:
1102: if ($csec) {$r->print("Section <i>$csec</i> of \n")};
1103:
1104: $r->print("<i>$coursename</i><br />");
1105: $r->print("</font></h4>\n");
1106: #---------------------------------------------------------------- print table
1107: $r->print('<p><table border="2">');
1108: $r->print('<tr><th>Parameter Name</th>');
1109: $r->print('<th>Default Value</th>');
1110: $r->print('<th>Parameter in Effect</th></tr>');
1111:
1112: foreach (sort keys %name) {
1113: &print_row($r,$_,\%part,\%name,$mapid,\%default,
1114: \%type,\%display,$defbgone,$defbgtwo,
1115: $parmlev);
1116: # $r->print("<tr><td>resource.$part{$_}.$name{$_},$symbp{$mapid}</td></tr>\n");
1117: }
1118: $r->print("</table></center>");
1119: } # end each map
1120: } # end of $parmlev eq map
1121: #--------------------------------- Entry for parm level general (Course level)
1122: if ($parmlev eq 'general') {
1123: my $defbgone = '"E0E099"';
1124: my $defbgtwo = '"FFFF99"';
1125:
1126: #-------------------------------------------- for each map, gather information
1127: my $mapid="0.0";
1128: #----------------------- loop through ids and get all parameter types for map
1129: #----------------------------------------- and associated information
1130: my %name = ();
1131: my %part = ();
1132: my %display = ();
1133: my %type = ();
1134: my %default = ();
1135:
1136: foreach (@ids) {
1137: my $rid = $_;
1138:
1139: my $uri=&Apache::lonnet::declutter($bighash{'src_'.$rid});
1140:
1141: #--------------------------------------------------------------------
1142: # @catmarker contains list of all possible parameters including part #s
1143: # $fullkeyp contains the full part/id # for the extraction of proper parameters
1144: # $tempkeyp contains part 0 only (no ids - ie, subparts)
1145: # When storing information, store as part 0
1146: # When requesting information, request from full part
1147: #-------------------------------------------------------------------
1148: foreach (split(/\,/,$keyp{$rid})) {
1149: my $tempkeyp = $_;
1150: my $fullkeyp = $tempkeyp;
1151: $tempkeyp =~ s/_[\d_]+_/_0_/;
1152: if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {
1153: $part{$tempkeyp}="0";
1154: $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name');
1155: $display{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');
1156: unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; }
1157: $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')';
1158: $display{$tempkeyp} =~ s/_[\d_]+_/_0_/;
1159: $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp);
1160: $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.type');
1161: }
1162: } # end loop through keys
1163: } # end loop through ids
1164:
1165: #---------------------------------------------------- print header information
1166: $r->print(<<ENDMAPONE);
1167: <center><h4>
1168: <font color="red">Set Defaults for All Resources in Course
1169: <i>$coursename</i><br />
1170: ENDMAPONE
1171: if ($uname) {
1172: my %name=&Apache::lonnet::userenvironment($udom,$uname,
1173: ('firstname','middlename','lastname','generation', 'id'));
1174: my $person=$name{'firstname'}.' '.$name{'middlename'}.' '
1175: .$name{'lastname'}.' '.$name{'generation'};
1176: $r->print(" User <i>$uname \($person\) </i> \n");
1177: } else {
1178: $r->print("<i>ALL</i> USERS \n");
1179: }
1180:
1181: if ($csec) {$r->print("Section <i>$csec</i>\n")};
1182: $r->print("</font></h4>\n");
1183: #---------------------------------------------------------------- print table
1184: $r->print('<p><table border="2">');
1185: $r->print('<tr><th>Parameter Name</th>');
1186: $r->print('<th>Default Value</th>');
1187: $r->print('<th>Parameter in Effect</th></tr>');
1188:
1189: foreach (sort keys %name) {
1190: &print_row($r,$_,\%part,\%name,$mapid,\%default,
1191: \%type,\%display,$defbgone,$defbgtwo,$parmlev);
1192: # $r->print("<tr><td>resource.$part{$_}.$name{$_},$symbp{$mapid}</td></tr>\n");
1193: }
1194: $r->print("</table></center>");
1195: } # end of $parmlev eq general
1196: }
1197: $r->print('</form></body></html>');
1198: untie(%bighash);
1199: untie(%parmhash);
1200: } # end sub assessparms
1201:
1202:
1203: ##################################################
1204: ##################################################
1205:
1206: =pod
1207:
1208: =item crsenv
1209:
1210: Show course data and parameters. This is a large routine that should
1211: be simplified and shortened... someday.
1212:
1213: Inputs: $r
1214:
1215: Returns: nothing
1216:
1217: =cut
1218:
1219: ##################################################
1220: ##################################################
1221: sub crsenv {
1222: my $r=shift;
1223: my $setoutput='';
1224: my $dom = $ENV{'course.'.$ENV{'request.course.id'}.'.domain'};
1225: my $crs = $ENV{'course.'.$ENV{'request.course.id'}.'.num'};
1226: # -------------------------------------------------- Go through list of changes
1227: foreach (keys %ENV) {
1228: if ($_=~/^form\.(.+)\_setparmval$/) {
1229: my $name=$1;
1230: my $value=$ENV{'form.'.$name.'_value'};
1231: if ($name eq 'newp') {
1232: $name=$ENV{'form.newp_name'};
1233: }
1234: if ($name eq 'url') {
1235: $value=~s/^\/res\///;
1236: my $bkuptime=time;
1237: my @tmp = &Apache::lonnet::get
1238: ('environment',['url'],$dom,$crs);
1239: $setoutput.='Backing up previous URL: '.
1240: &Apache::lonnet::put
1241: ('environment',
1242: {'top level map backup '.$bkuptime => $tmp[1] },
1243: $dom,$crs).
1244: '<br>';
1245: }
1246: if ($name) {
1247: $setoutput.='Setting <tt>'.$name.'</tt> to <tt>'.
1248: $value.'</tt>: '.
1249: &Apache::lonnet::put
1250: ('environment',{$name=>$value},$dom,$crs).
1251: '<br>';
1252: }
1253: }
1254: }
1255: # -------------------------------------------------------- Get parameters again
1256:
1257: my %values=&Apache::lonnet::dump('environment',$dom,$crs);
1258: my $output='';
1259: if (! exists($values{'con_lost'})) {
1260: my %descriptions=
1261: ('url' => '<b>Top Level Map</b> '.
1262: '<a href="javascript:openbrowser'.
1263: "('envform','url','sequence')\">".
1264: 'Browse</a><br><font color=red> '.
1265: 'Modification may make assessment data '.
1266: 'inaccessible</font>',
1267: 'description' => '<b>Course Description</b>',
1268: 'courseid' => '<b>Course ID or number</b><br>'.
1269: '(internal, optional)',
1270: 'default_xml_style' => '<b>Default XML Style File</b> '.
1271: '<a href="javascript:openbrowser'.
1272: "('envform','default_xml_style'".
1273: ",'sty')\">Browse</a><br>",
1274: 'question.email' => '<b>Feedback Addresses for Content '.
1275: 'Questions</b><br>(<tt>user:domain,'.
1276: 'user:domain,...</tt>)',
1277: 'comment.email' => '<b>Feedback Addresses for Comments</b><br>'.
1278: '(<tt>user:domain,user:domain,...</tt>)',
1279: 'policy.email' => '<b>Feedback Addresses for Course Policy</b>'.
1280: '<br>(<tt>user:domain,user:domain,...</tt>)',
1281: 'hideemptyrows' => '<b>Hide Empty Rows in Spreadsheets</b><br>'.
1282: '("<tt>yes</tt>" for default hiding)',
1283: 'pageseparators' => '<b>Visibly Separate Items on Pages</b><br>'.
1284: '("<tt>yes</tt>" for visible separation)',
1285: 'pch.roles.denied'=> '<b>Disallow Resource Discussion for '.
1286: 'Roles</b><br>"<tt>st</tt>": '.
1287: 'student, "<tt>ta</tt>": '.
1288: 'TA, "<tt>in</tt>": '.
1289: 'instructor;<br><tt>role,role,...</tt>) '.
1290: Apache::loncommon::help_open_topic("Course_Disable_Discussion"),
1291: 'pch.users.denied' =>
1292: '<b>Disallow Resource Discussion for Users</b><br>'.
1293: '(<tt>user:domain,user:domain,...</tt>)',
1294: 'spreadsheet_default_classcalc'
1295: => '<b>Default Course Spreadsheet</b> '.
1296: '<a href="javascript:openbrowser'.
1297: "('envform','spreadsheet_default_classcalc'".
1298: ",'spreadsheet')\">Browse</a><br>",
1299: 'spreadsheet_default_studentcalc'
1300: => '<b>Default Student Spreadsheet</b> '.
1301: '<a href="javascript:openbrowser'.
1302: "('envform','spreadsheet_default_calc'".
1303: ",'spreadsheet')\">Browse</a><br>",
1304: 'spreadsheet_default_assesscalc'
1305: => '<b>Default Assessment Spreadsheet</b> '.
1306: '<a href="javascript:openbrowser'.
1307: "('envform','spreadsheet_default_assesscalc'".
1308: ",'spreadsheet')\">Browse</a><br>",
1309: );
1310: foreach (keys(%values)) {
1311: unless ($descriptions{$_}) {
1312: $descriptions{$_}=$_;
1313: }
1314: }
1315: foreach (sort keys %descriptions) {
1316: # onchange is javascript to automatically check the 'Set' button.
1317: my $onchange = 'onchange="javascript:window.document.forms'.
1318: '[\'envform\'].elements[\''.$_.'_setparmval\']'.
1319: '.checked=true;"';
1320: $output.='<tr><td>'.$descriptions{$_}.'</td>'.
1321: '<td><input name="'.$_.'_value" size=40 '.
1322: 'value="'.$values{$_}.'" '.$onchange.' /></td>'.
1323: '<td><input type=checkbox name="'.$_.'_setparmval"></td>'.
1324: '</tr>'."\n";
1325: }
1326: my $onchange = 'onchange="javascript:window.document.forms'.
1327: '[\'envform\'].elements[\'newp_setparmval\']'.
1328: '.checked=true;"';
1329: $output.='<tr><td><i>Create New Environment Variable</i><br />'.
1330: '<input type="text" size=40 name="newp_name" '.
1331: $onchange.' /></td><td>'.
1332: '<input type="text" size=40 name="newp_value" '.
1333: $onchange.' /></td><td>'.
1334: '<input type="checkbox" name="newp_setparmval" /></td></tr>';
1335: }
1336: $r->print(<<ENDENV);
1337: <html>
1338: <script type="text/javascript" language="Javascript" >
1339: var editbrowser;
1340: function openbrowser(formname,elementname,only,omit) {
1341: var url = '/res/?';
1342: if (editbrowser == null) {
1343: url += 'launch=1&';
1344: }
1345: url += 'catalogmode=interactive&';
1346: url += 'mode=parmset&';
1347: url += 'form=' + formname + '&';
1348: if (only != null) {
1349: url += 'only=' + only + '&';
1350: }
1351: if (omit != null) {
1352: url += 'omit=' + omit + '&';
1353: }
1354: url += 'element=' + elementname + '';
1355: var title = 'Browser';
1356: var options = 'scrollbars=1,resizable=1,menubar=0';
1357: options += ',width=700,height=600';
1358: editbrowser = open(url,title,options,'1');
1359: editbrowser.focus();
1360: }
1361: </script>
1362: <head>
1363: <title>LON-CAPA Course Environment</title>
1364: </head>
1365: <body bgcolor="#FFFFFF">
1366: <h1>Set Course Parameters</h1>
1367: <form method="post" action="/adm/parmset" name="envform">
1368: <h2>Course: $ENV{'course.'.$ENV{'request.course.id'}.'.description'}</h2>
1369: <h3>Course Environment</h3>
1370: $setoutput
1371: <p>
1372: <table border=2>
1373: <tr><th>Parameter</th><th>Value</th><th>Set?</th></tr>
1374: $output
1375: </table>
1376: <input type="submit" name="crsenv" value="Set Course Environment">
1377: </form>
1378: </body>
1379: </html>
1380: ENDENV
1381: }
1382:
1383: ##################################################
1384: ##################################################
1385:
1386: =pod
1387:
1388: =item handler
1389:
1390: Main handler. Calls &assessparms and &crsenv subroutines.
1391:
1392: =cut
1393:
1394: ##################################################
1395: ##################################################
1396: sub handler {
1397: my $r=shift;
1398:
1399: if ($r->header_only) {
1400: $r->content_type('text/html');
1401: $r->send_http_header;
1402: return OK;
1403: }
1404: &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'});
1405: # ----------------------------------------------------- Needs to be in a course
1406:
1407: if (($ENV{'request.course.id'}) &&
1408: (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'}))) {
1409:
1410: $coursename=$ENV{'course.'.$ENV{'request.course.id'}.'.description'};
1411:
1412: unless (($ENV{'form.crsenv'}) || (!$ENV{'request.course.fn'})) {
1413: # --------------------------------------------------------- Bring up assessment
1414: &assessparms($r);
1415: # ---------------------------------------------- This is for course environment
1416: } else {
1417: &crsenv($r);
1418: }
1419: } else {
1420: # ----------------------------- Not in a course, or not allowed to modify parms
1421: $ENV{'user.error.msg'}=
1422: "/adm/parmset:opa:0:0:Cannot modify assessment parameters";
1423: return HTTP_NOT_ACCEPTABLE;
1424: }
1425: return OK;
1426: }
1427:
1428: 1;
1429: __END__
1430:
1431: =pod
1432:
1433: =back
1434:
1435: =cut
1436:
1437:
1438:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>