Annotation of loncom/interface/lonparmset.pm, revision 1.213
1.1 www 1: # The LearningOnline Network with CAPA
2: # Handler to set parameters for assessments
3: #
1.213 ! www 4: # $Id: lonparmset.pm,v 1.212 2005/06/06 15:13:46 www Exp $
1.40 albertel 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: #
1.59 matthew 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: ###################################################################
1.1 www 53:
54: package Apache::lonparmset;
55:
56: use strict;
57: use Apache::lonnet;
58: use Apache::Constants qw(:common :http REDIRECT);
1.88 matthew 59: use Apache::lonhtmlcommon();
1.36 albertel 60: use Apache::loncommon;
1.1 www 61: use GDBM_File;
1.57 albertel 62: use Apache::lonhomework;
63: use Apache::lonxml;
1.130 www 64: use Apache::lonlocal;
1.197 www 65: use Apache::lonnavmaps;
1.1 www 66:
1.198 www 67: # --- Caches local to lonparmset
1.2 www 68:
1.199 www 69: my $parmhashid;
70: my %parmhash;
1.201 www 71: my $symbsid;
72: my %symbs;
1.198 www 73:
74: # --- end local caches
75:
1.59 matthew 76: ##################################################
77: ##################################################
78:
79: =pod
80:
81: =item parmval
82:
83: Figure out a cascading parameter.
84:
1.71 albertel 85: Inputs: $what - a parameter spec (incluse part info and name I.E. 0.weight)
1.162 albertel 86: $id - a bighash Id number
1.71 albertel 87: $def - the resource's default value 'stupid emacs
88:
89: Returns: A list, the first item is the index into the remaining list of items of parm valuse that is the active one, the list consists of parm values at the 11 possible levels
90:
1.182 albertel 91: 11 - General Course
92: 10 - Map or Folder level in course
93: 9- resource default
94: 8- map default
1.71 albertel 95: 7 - resource level in course
96: 6 - General for section
1.82 www 97: 5 - Map or Folder level for section
1.71 albertel 98: 4 - resource level in section
99: 3 - General for specific student
1.82 www 100: 2 - Map or Folder level for specific student
1.71 albertel 101: 1 - resource level for specific student
1.2 www 102:
1.59 matthew 103: =cut
104:
105: ##################################################
1.2 www 106: sub parmval {
1.187 www 107: my ($what,$id,$def,$uname,$udom,$csec)=@_;
1.201 www 108: return &parmval_by_symb($what,&symbcache($id),$def,$uname,$udom,$csec);
109: }
110:
111: sub parmval_by_symb {
112: my ($what,$symb,$def,$uname,$udom,$csec)=@_;
1.198 www 113: # load caches
1.200 www 114:
1.198 www 115: &cacheparmhash();
1.200 www 116:
117: my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
118: my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
119: my $useropt=&Apache::lonnet::get_userresdata($uname,$udom);
120: my $courseopt=&Apache::lonnet::get_courseresdata($cnum,$cdom);
121:
1.198 www 122:
1.8 www 123: my $result='';
1.44 albertel 124: my @outpar=();
1.2 www 125: # ----------------------------------------------------- Cascading lookup scheme
1.201 www 126: my $map=(&Apache::lonnet::decode_symb($symb))[0];
1.10 www 127:
1.201 www 128: my $symbparm=$symb.'.'.$what;
129: my $mapparm=$map.'___(all).'.$what;
1.10 www 130:
1.190 albertel 131: my $seclevel=$env{'request.course.id'}.'.['.$csec.'].'.$what;
132: my $seclevelr=$env{'request.course.id'}.'.['.$csec.'].'.$symbparm;
133: my $seclevelm=$env{'request.course.id'}.'.['.$csec.'].'.$mapparm;
134:
135: my $courselevel=$env{'request.course.id'}.'.'.$what;
136: my $courselevelr=$env{'request.course.id'}.'.'.$symbparm;
137: my $courselevelm=$env{'request.course.id'}.'.'.$mapparm;
1.2 www 138:
1.11 www 139:
140:
1.182 albertel 141: # --------------------------------------------------------- first, check course
1.11 www 142:
1.200 www 143: if (defined($$courseopt{$courselevel})) {
144: $outpar[11]=$$courseopt{$courselevel};
1.182 albertel 145: $result=11;
1.43 albertel 146: }
1.11 www 147:
1.200 www 148: if (defined($$courseopt{$courselevelm})) {
149: $outpar[10]=$$courseopt{$courselevelm};
1.182 albertel 150: $result=10;
1.43 albertel 151: }
1.11 www 152:
1.182 albertel 153: # ------------------------------------------------------- second, check default
154:
155: if (defined($def)) { $outpar[9]=$def; $result=9; }
156:
157: # ------------------------------------------------------ third, check map parms
158:
159: my $thisparm=$parmhash{$symbparm};
160: if (defined($thisparm)) { $outpar[8]=$thisparm; $result=8; }
161:
1.200 www 162: if (defined($$courseopt{$courselevelr})) {
163: $outpar[7]=$$courseopt{$courselevelr};
1.43 albertel 164: $result=7;
165: }
1.11 www 166:
1.182 albertel 167: # ------------------------------------------------------ fourth, back to course
1.71 albertel 168: if (defined($csec)) {
1.200 www 169: if (defined($$courseopt{$seclevel})) {
170: $outpar[6]=$$courseopt{$seclevel};
1.43 albertel 171: $result=6;
172: }
1.200 www 173: if (defined($$courseopt{$seclevelm})) {
174: $outpar[5]=$$courseopt{$seclevelm};
1.43 albertel 175: $result=5;
176: }
177:
1.200 www 178: if (defined($$courseopt{$seclevelr})) {
1.201 www 179: $outpar[4]=$$courseopt{$seclevelr};
1.43 albertel 180: $result=4;
181: }
182: }
1.11 www 183:
1.182 albertel 184: # ---------------------------------------------------------- fifth, check user
1.11 www 185:
1.71 albertel 186: if (defined($uname)) {
1.200 www 187: if (defined($$useropt{$courselevel})) {
188: $outpar[3]=$$useropt{$courselevel};
1.43 albertel 189: $result=3;
190: }
1.10 www 191:
1.200 www 192: if (defined($$useropt{$courselevelm})) {
193: $outpar[2]=$$useropt{$courselevelm};
1.43 albertel 194: $result=2;
195: }
1.2 www 196:
1.200 www 197: if (defined($$useropt{$courselevelr})) {
198: $outpar[1]=$$useropt{$courselevelr};
1.43 albertel 199: $result=1;
200: }
201: }
1.44 albertel 202: return ($result,@outpar);
1.2 www 203: }
204:
1.198 www 205: sub resetparmhash {
206: $parmhashid='';
207: }
208:
209: sub cacheparmhash {
210: if ($parmhashid eq $env{'request.course.fn'}) { return; }
211: my %parmhashfile;
212: if (tie(%parmhashfile,'GDBM_File',
213: $env{'request.course.fn'}.'_parms.db',&GDBM_READER(),0640)) {
214: %parmhash=%parmhashfile;
215: untie %parmhashfile;
216: $parmhashid=$env{'request.course.fn'};
217: }
218: }
219:
1.203 www 220: sub resetsymbcache {
221: $symbsid='';
222: }
223:
1.201 www 224: sub symbcache {
225: my $id=shift;
226: if ($symbsid ne $env{'request.course.id'}) {
227: %symbs=();
228: }
229: unless ($symbs{$id}) {
230: my $navmap = Apache::lonnavmaps::navmap->new();
231: if ($id=~/\./) {
232: my $resource=$navmap->getById($id);
233: $symbs{$id}=$resource->symb();
234: } else {
235: my $resource=$navmap->getByMapPc($id);
236: $symbs{$id}=&Apache::lonnet::declutter($resource->src());
237: }
238: $symbsid=$env{'request.course.id'};
239: }
240: return $symbs{$id};
241: }
242:
1.186 www 243: ##################################################
244: ##################################################
245: #
1.197 www 246: # Store a parameter by ID
1.186 www 247: #
248: # Takes
249: # - resource id
250: # - name of parameter
251: # - level
252: # - new value
253: # - new type
1.187 www 254: # - username
255: # - userdomain
256:
1.186 www 257: sub storeparm {
1.187 www 258: my ($sresid,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec)=@_;
1.201 www 259: &storeparm_by_symb(&symbcache($sresid),$spnam,$snum,$nval,$ntype,$uname,$udom,$csec);
1.197 www 260: }
261:
262: #
263: # Store a parameter by symb
264: #
265: # Takes
266: # - symb
267: # - name of parameter
268: # - level
269: # - new value
270: # - new type
271: # - username
272: # - userdomain
273:
274: sub storeparm_by_symb {
275: # ---------------------------------------------------------- Get symb, map, etc
276: my ($symb,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec)=@_;
277: # ---------------------------------------------------------- Construct prefixes
1.186 www 278: $spnam=~s/\_([^\_]+)$/\.$1/;
1.197 www 279: my $map=(&Apache::lonnet::decode_symb($symb))[0];
280: my $symbparm=$symb.'.'.$spnam;
281: my $mapparm=$map.'___(all).'.$spnam;
282:
1.190 albertel 283: my $seclevel=$env{'request.course.id'}.'.['.$csec.'].'.$spnam;
284: my $seclevelr=$env{'request.course.id'}.'.['.$csec.'].'.$symbparm;
285: my $seclevelm=$env{'request.course.id'}.'.['.$csec.'].'.$mapparm;
1.186 www 286:
1.190 albertel 287: my $courselevel=$env{'request.course.id'}.'.'.$spnam;
288: my $courselevelr=$env{'request.course.id'}.'.'.$symbparm;
289: my $courselevelm=$env{'request.course.id'}.'.'.$mapparm;
1.186 www 290:
291: my $storeunder='';
292: if (($snum==11) || ($snum==3)) { $storeunder=$courselevel; }
293: if (($snum==10) || ($snum==2)) { $storeunder=$courselevelm; }
294: if (($snum==7) || ($snum==1)) { $storeunder=$courselevelr; }
295: if ($snum==6) { $storeunder=$seclevel; }
296: if ($snum==5) { $storeunder=$seclevelm; }
297: if ($snum==4) { $storeunder=$seclevelr; }
298:
299: my $delete;
300: if ($nval eq '') { $delete=1;}
301: my %storecontent = ($storeunder => $nval,
302: $storeunder.'.type' => $ntype);
303: my $reply='';
304: if ($snum>3) {
305: # ---------------------------------------------------------------- Store Course
306: #
1.200 www 307: my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
308: my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
1.186 www 309: # Expire sheets
310: &Apache::lonnet::expirespread('','','studentcalc');
311: if (($snum==7) || ($snum==4)) {
1.197 www 312: &Apache::lonnet::expirespread('','','assesscalc',$symb);
1.186 www 313: } elsif (($snum==8) || ($snum==5)) {
1.197 www 314: &Apache::lonnet::expirespread('','','assesscalc',$map);
1.186 www 315: } else {
316: &Apache::lonnet::expirespread('','','assesscalc');
317: }
318: # Store parameter
319: if ($delete) {
320: $reply=&Apache::lonnet::del
1.200 www 321: ('resourcedata',[keys(%storecontent)],$cdom,$cnum);
1.186 www 322: } else {
323: $reply=&Apache::lonnet::cput
1.200 www 324: ('resourcedata',\%storecontent,$cdom,$cnum);
1.186 www 325: }
1.200 www 326: &Apache::lonnet::devalidatecourseresdata($cnum,$cdom);
1.186 www 327: } else {
328: # ------------------------------------------------------------------ Store User
329: #
330: # Expire sheets
331: &Apache::lonnet::expirespread($uname,$udom,'studentcalc');
332: if ($snum==1) {
333: &Apache::lonnet::expirespread
1.197 www 334: ($uname,$udom,'assesscalc',$symb);
1.186 www 335: } elsif ($snum==2) {
336: &Apache::lonnet::expirespread
1.197 www 337: ($uname,$udom,'assesscalc',$map);
1.186 www 338: } else {
339: &Apache::lonnet::expirespread($uname,$udom,'assesscalc');
340: }
341: # Store parameter
342: if ($delete) {
343: $reply=&Apache::lonnet::del
344: ('resourcedata',[keys(%storecontent)],$udom,$uname);
345: } else {
346: $reply=&Apache::lonnet::cput
347: ('resourcedata',\%storecontent,$udom,$uname);
348: }
1.191 albertel 349: &Apache::lonnet::devalidateuserresdata($uname,$udom);
1.186 www 350: }
351:
352: if ($reply=~/^error\:(.*)/) {
353: return "<font color=red>Write Error: $1</font>";
354: }
355: return '';
356: }
357:
1.59 matthew 358: ##################################################
359: ##################################################
360:
361: =pod
362:
363: =item valout
364:
365: Format a value for output.
366:
367: Inputs: $value, $type
368:
369: Returns: $value, formatted for output. If $type indicates it is a date,
370: localtime($value) is returned.
1.9 www 371:
1.59 matthew 372: =cut
373:
374: ##################################################
375: ##################################################
1.9 www 376: sub valout {
377: my ($value,$type)=@_;
1.59 matthew 378: my $result = '';
379: # Values of zero are valid.
380: if (! $value && $value ne '0') {
1.71 albertel 381: $result = ' ';
1.59 matthew 382: } else {
1.66 www 383: if ($type eq 'date_interval') {
384: my ($sec,$min,$hour,$mday,$mon,$year)=gmtime($value);
385: $year=$year-70;
386: $mday--;
387: if ($year) {
388: $result.=$year.' yrs ';
389: }
390: if ($mon) {
391: $result.=$mon.' mths ';
392: }
393: if ($mday) {
394: $result.=$mday.' days ';
395: }
396: if ($hour) {
397: $result.=$hour.' hrs ';
398: }
399: if ($min) {
400: $result.=$min.' mins ';
401: }
402: if ($sec) {
403: $result.=$sec.' secs ';
404: }
405: $result=~s/\s+$//;
1.213 ! www 406: } elsif (&isdateparm($type)) {
1.59 matthew 407: $result = localtime($value);
408: } else {
409: $result = $value;
410: }
411: }
412: return $result;
1.9 www 413: }
414:
1.59 matthew 415: ##################################################
416: ##################################################
417:
418: =pod
1.5 www 419:
1.59 matthew 420: =item plink
421:
422: Produces a link anchor.
423:
424: Inputs: $type,$dis,$value,$marker,$return,$call
425:
426: Returns: scalar with html code for a link which will envoke the
427: javascript function 'pjump'.
428:
429: =cut
430:
431: ##################################################
432: ##################################################
1.5 www 433: sub plink {
434: my ($type,$dis,$value,$marker,$return,$call)=@_;
1.23 www 435: my $winvalue=$value;
436: unless ($winvalue) {
1.213 ! www 437: if (&isdateparm($type)) {
1.190 albertel 438: $winvalue=$env{'form.recent_'.$type};
1.23 www 439: } else {
1.190 albertel 440: $winvalue=$env{'form.recent_'.(split(/\_/,$type))[0]};
1.23 www 441: }
442: }
1.209 www 443:
444:
1.23 www 445: return
1.43 albertel 446: '<a href="javascript:pjump('."'".$type."','".$dis."','".$winvalue."','"
447: .$marker."','".$return."','".$call."'".');">'.
448: &valout($value,$type).'</a><a name="'.$marker.'"></a>';
1.5 www 449: }
450:
1.44 albertel 451: sub startpage {
1.209 www 452: my $r=shift;
1.99 albertel 453:
1.120 www 454: my $bodytag=&Apache::loncommon::bodytag('Set/Modify Course Parameters','',
1.98 www 455: 'onUnload="pclose()"');
1.204 www 456: my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs(undef,'Table Mode Parameter Setting');
1.81 www 457: my $selscript=&Apache::loncommon::studentbrowser_javascript();
1.88 matthew 458: my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition();
1.183 albertel 459: my $html=&Apache::lonxml::xmlbegin();
1.44 albertel 460: $r->print(<<ENDHEAD);
1.183 albertel 461: $html
1.44 albertel 462: <head>
463: <title>LON-CAPA Course Parameters</title>
464: <script>
465:
466: function pclose() {
467: parmwin=window.open("/adm/rat/empty.html","LONCAPAparms",
468: "height=350,width=350,scrollbars=no,menubar=no");
469: parmwin.close();
470: }
471:
1.88 matthew 472: $pjump_def
1.44 albertel 473:
474: function psub() {
475: pclose();
476: if (document.parmform.pres_marker.value!='') {
477: document.parmform.action+='#'+document.parmform.pres_marker.value;
478: var typedef=new Array();
479: typedef=document.parmform.pres_type.value.split('_');
480: if (document.parmform.pres_type.value!='') {
481: if (typedef[0]=='date') {
482: eval('document.parmform.recent_'+
483: document.parmform.pres_type.value+
484: '.value=document.parmform.pres_value.value;');
485: } else {
486: eval('document.parmform.recent_'+typedef[0]+
487: '.value=document.parmform.pres_value.value;');
488: }
489: }
490: document.parmform.submit();
491: } else {
492: document.parmform.pres_value.value='';
493: document.parmform.pres_marker.value='';
494: }
495: }
496:
1.57 albertel 497: function openWindow(url, wdwName, w, h, toolbar,scrollbar) {
498: var options = "width=" + w + ",height=" + h + ",";
499: options += "resizable=yes,scrollbars="+scrollbar+",status=no,";
500: options += "menubar=no,toolbar="+toolbar+",location=no,directories=no";
501: var newWin = window.open(url, wdwName, options);
502: newWin.focus();
503: }
1.44 albertel 504: </script>
1.81 www 505: $selscript
1.44 albertel 506: </head>
1.64 www 507: $bodytag
1.193 albertel 508: $breadcrumbs
509: <form method="post" action="/adm/parmset?action=settable" name="parmform">
1.44 albertel 510: <input type="hidden" value='' name="pres_value">
511: <input type="hidden" value='' name="pres_type">
512: <input type="hidden" value='' name="pres_marker">
1.209 www 513: <input type="hidden" value='1' name="prevvisit">
1.44 albertel 514: ENDHEAD
515: }
516:
1.209 www 517:
1.44 albertel 518: sub print_row {
1.201 www 519: my ($r,$which,$part,$name,$symbp,$rid,$default,$defaulttype,$display,$defbgone,
1.187 www 520: $defbgtwo,$parmlev,$uname,$udom,$csec)=@_;
1.66 www 521: # get the values for the parameter in cascading order
522: # empty levels will remain empty
1.44 albertel 523: my ($result,@outpar)=&parmval($$part{$which}.'.'.$$name{$which},
1.187 www 524: $rid,$$default{$which},$uname,$udom,$csec);
1.66 www 525: # get the type for the parameters
526: # problem: these may not be set for all levels
527: my ($typeresult,@typeoutpar)=&parmval($$part{$which}.'.'.
528: $$name{$which}.'.type',
1.187 www 529: $rid,$$defaulttype{$which},$uname,$udom,$csec);
1.66 www 530: # cascade down manually
1.182 albertel 531: my $cascadetype=$$defaulttype{$which};
532: for (my $i=11;$i>0;$i--) {
1.66 www 533: if ($typeoutpar[$i]) {
534: $cascadetype=$typeoutpar[$i];
535: } else {
536: $typeoutpar[$i]=$cascadetype;
537: }
538: }
1.57 albertel 539: my $parm=$$display{$which};
540:
1.203 www 541: if ($parmlev eq 'full') {
1.57 albertel 542: $r->print('<td bgcolor='.$defbgtwo.' align="center">'
543: .$$part{$which}.'</td>');
544: } else {
545: $parm=~s|\[.*\]\s||g;
546: }
547:
1.159 albertel 548: $r->print('<td bgcolor='.$defbgone.'>'.$parm.'</td>');
1.57 albertel 549:
1.44 albertel 550: my $thismarker=$which;
551: $thismarker=~s/^parameter\_//;
552: my $mprefix=$rid.'&'.$thismarker.'&';
553:
1.57 albertel 554: if ($parmlev eq 'general') {
555:
556: if ($uname) {
1.66 www 557: &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57 albertel 558: } elsif ($csec) {
1.66 www 559: &print_td($r,6,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57 albertel 560: } else {
1.182 albertel 561: &print_td($r,11,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57 albertel 562: }
563: } elsif ($parmlev eq 'map') {
564:
565: if ($uname) {
1.66 www 566: &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57 albertel 567: } elsif ($csec) {
1.66 www 568: &print_td($r,5,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57 albertel 569: } else {
1.182 albertel 570: &print_td($r,10,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57 albertel 571: }
572: } else {
573:
1.182 albertel 574: &print_td($r,11,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57 albertel 575:
1.203 www 576: &print_td($r,10,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
577: &print_td($r,9,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
578: &print_td($r,8,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
579: &print_td($r,7,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
580:
581: if ($csec) {
582: &print_td($r,6,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
583: &print_td($r,5,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
584: &print_td($r,4,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
585: }
586: if ($uname) {
587: &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
588: &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
589: &print_td($r,1,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
590: }
1.57 albertel 591:
592: } # end of $parmlev if/else
593:
1.136 albertel 594: $r->print('<td bgcolor=#CCCCFF align="center">'.
595: &valout($outpar[$result],$typeoutpar[$result]).'</td>');
596:
1.203 www 597: if ($parmlev eq 'full') {
1.136 albertel 598: my $sessionval=&Apache::lonnet::EXT('resource.'.$$part{$which}.
1.201 www 599: '.'.$$name{$which},$$symbp{$rid});
1.136 albertel 600: my $sessionvaltype=$typeoutpar[$result];
601: if (!defined($sessionvaltype)) { $sessionvaltype=$$defaulttype{$which}; }
602: $r->print('<td bgcolor=#999999 align="center"><font color=#FFFFFF>'.
1.66 www 603: &valout($sessionval,$sessionvaltype).' '.
1.57 albertel 604: '</font></td>');
1.136 albertel 605: }
1.44 albertel 606: $r->print('</tr>');
1.57 albertel 607: $r->print("\n");
1.44 albertel 608: }
1.59 matthew 609:
1.44 albertel 610: sub print_td {
1.66 www 611: my ($r,$which,$defbg,$result,$outpar,$mprefix,$value,$typeoutpar,$display)=@_;
1.57 albertel 612: $r->print('<td bgcolor='.(($result==$which)?'"#AAFFAA"':$defbg).
1.114 www 613: ' align="center">');
1.182 albertel 614: if ($which<8 || $which > 9) {
1.114 www 615: $r->print(&plink($$typeoutpar[$which],
616: $$display{$value},$$outpar[$which],
617: $mprefix."$which",'parmform.pres','psub'));
618: } else {
619: $r->print(&valout($$outpar[$which],$$typeoutpar[$which]));
620: }
621: $r->print('</td>'."\n");
1.57 albertel 622: }
623:
1.201 www 624:
1.63 bowersj2 625: =pod
626:
627: =item B<extractResourceInformation>: Given the course data hash, extractResourceInformation extracts lots of information about the course's resources into a variety of hashes.
628:
629: Input: See list below:
630:
631: =over 4
632:
633: =item B<ids>: An array that will contain all of the ids in the course.
634:
635: =item B<typep>: hash, id->type, where "type" contains the extension of the file, thus, I<problem exam quiz assess survey form>.
636:
1.171 www 637: =item B<keyp>: hash, id->key list, will contain a comma separated list of the meta-data keys available for the given id
1.63 bowersj2 638:
639: =item B<allparms>: hash, name of parameter->display value (what is the display value?)
640:
641: =item B<allparts>: hash, part identification->text representation of part, where the text representation is "[Part $part]"
642:
643: =item B<allkeys>: hash, full key to part->display value (what's display value?)
644:
645: =item B<allmaps>: hash, ???
646:
647: =item B<fcat>: ???
648:
649: =item B<defp>: hash, ???
650:
651: =item B<mapp>: ??
652:
653: =item B<symbp>: hash, id->full sym?
654:
655: =back
656:
657: =cut
658:
659: sub extractResourceInformation {
660: my $ids = shift;
661: my $typep = shift;
662: my $keyp = shift;
663: my $allparms = shift;
664: my $allparts = shift;
665: my $allmaps = shift;
666: my $mapp = shift;
667: my $symbp = shift;
1.82 www 668: my $maptitles=shift;
1.196 www 669: my $uris=shift;
1.210 www 670: my $keyorder=shift;
1.211 www 671: my $defkeytype=shift;
1.196 www 672:
1.210 www 673: my $keyordercnt=100;
1.63 bowersj2 674:
1.196 www 675: my $navmap = Apache::lonnavmaps::navmap->new();
676: my @allres=$navmap->retrieveResources(undef,undef,1,undef,1);
677: foreach my $resource (@allres) {
678: my $id=$resource->id();
679: my ($mapid,$resid)=split(/\./,$id);
680: if ($mapid eq '0') { next; }
681: $$ids[$#$ids+1]=$id;
682: my $srcf=$resource->src();
683: $srcf=~/\.(\w+)$/;
684: $$typep{$id}=$1;
685: $$keyp{$id}='';
686: $$uris{$id}=$srcf;
687: foreach (split(/\,/,&Apache::lonnet::metadata($srcf,'allpossiblekeys'))) {
688: if ($_=~/^parameter\_(.*)/) {
689: my $key=$_;
1.209 www 690: # Hidden parameters
691: if (&Apache::lonnet::metadata($srcf,$key.'.hidden') eq 'parm') {
692: next;
1.63 bowersj2 693: }
1.196 www 694: my $display= &Apache::lonnet::metadata($srcf,$key.'.display');
695: my $name=&Apache::lonnet::metadata($srcf,$key.'.name');
696: my $part= &Apache::lonnet::metadata($srcf,$key.'.part');
1.209 www 697: #
698: # allparms is a hash of parameter names
699: #
1.196 www 700: my $parmdis = $display;
1.209 www 701: $parmdis =~ s/\[Part.*$//g;
702: $$allparms{$name}=$parmdis;
1.211 www 703: $$defkeytype{$name}=&Apache::lonnet::metadata($srcf,$key.'.type');
1.209 www 704: #
705: # allparts is a hash of all parts
706: #
707: $$allparts{$part} = "Part: $part";
708: #
709: # Remember all keys going with this resource
710: #
1.196 www 711: if ($$keyp{$id}) {
712: $$keyp{$id}.=','.$key;
1.175 albertel 713: } else {
1.196 www 714: $$keyp{$id}=$key;
1.175 albertel 715: }
1.210 www 716: #
717: # Put in order
718: #
719: unless ($$keyorder{$key}) {
720: $$keyorder{$key}=$keyordercnt;
721: $keyordercnt++;
722: }
723:
1.63 bowersj2 724: }
725: }
1.196 www 726: $$mapp{$id}=
727: &Apache::lonnet::declutter($resource->enclosing_map_src());
728: $$mapp{$mapid}=$$mapp{$id};
729: $$allmaps{$mapid}=$$mapp{$id};
730: if ($mapid eq '1') {
731: $$maptitles{$mapid}='Main Course Documents';
732: } else {
733: $$maptitles{$mapid}=&Apache::lonnet::gettitle(&Apache::lonnet::clutter($$mapp{$id}));
734: }
735: $$maptitles{$$mapp{$id}}=$$maptitles{$mapid};
736: $$symbp{$id}=&Apache::lonnet::encode_symb($$mapp{$id},$resid,$srcf);
737: $$symbp{$mapid}=$$mapp{$id}.'___(all)';
1.63 bowersj2 738: }
739: }
740:
1.208 www 741:
742: ##################################################
743: ##################################################
744:
1.213 ! www 745: sub isdateparm {
! 746: my $type=shift;
! 747: return (($type=~/^date/) && (!($type eq 'date_interval')));
! 748: }
! 749:
1.208 www 750: sub parmmenu {
1.211 www 751: my ($r,$allparms,$pscat,$keyorder)=@_;
1.208 www 752: my $tempkey;
753: $r->print(<<ENDSCRIPT);
754: <script type="text/javascript">
755: function checkall(value, checkName) {
756: for (i=0; i<document.forms.parmform.elements.length; i++) {
757: ele = document.forms.parmform.elements[i];
758: if (ele.name == checkName) {
759: document.forms.parmform.elements[i].checked=value;
760: }
761: }
762: }
1.210 www 763:
764: function checkthis(thisvalue, checkName) {
765: for (i=0; i<document.forms.parmform.elements.length; i++) {
766: ele = document.forms.parmform.elements[i];
767: if (ele.name == checkName) {
768: if (ele.value == thisvalue) {
769: document.forms.parmform.elements[i].checked=true;
770: }
771: }
772: }
773: }
774:
775: function checkdates() {
776: checkthis('duedate','pscat');
777: checkthis('opendate','pscat');
778: checkthis('answerdate','pscat');
779: checkthis('interval','pscat');
780: }
781:
782: function checkvisi() {
783: checkthis('hiddenresource','pscat');
784: checkthis('encrypturl','pscat');
785: checkthis('problemstatus','pscat');
786: checkthis('contentopen','pscat');
787: checkthis('opendate','pscat');
788: }
789:
790: function checkparts() {
791: checkthis('hiddenparts','pscat');
792: checkthis('display','pscat');
793: checkthis('ordered','pscat');
794: }
795:
796: function checkstandard() {
797: checkall(false,'pscat');
798: checkdates();
799: checkthis('weight','pscat');
800: checkthis('maxtries','pscat');
801: }
802:
1.208 www 803: </script>
804: ENDSCRIPT
1.209 www 805: $r->print();
1.208 www 806: $r->print("\n<table><tr>");
807: my $cnt=0;
1.211 www 808: foreach $tempkey (&keysindisplayorder($allparms,$keyorder)) {
1.209 www 809: $r->print("\n<td><font size='-1'><input type='checkbox' name='pscat' ");
1.208 www 810: $r->print('value="'.$tempkey.'"');
811: if ($$pscat[0] eq "all" || grep $_ eq $tempkey, @{$pscat}) {
812: $r->print(' checked');
813: }
1.209 www 814: $r->print('>'.$$allparms{$tempkey}.'</font></td>');
815: $cnt++;
816: if ($cnt==3) {
817: $r->print("</tr>\n<tr>");
818: $cnt=0;
819: }
1.208 www 820: }
821: $r->print('
822: </tr><tr><td>
1.210 www 823: <a href="javascript:checkall(true, \'pscat\')">Select All</a>
824: <a href="javascript:checkstandard()">Select Standard</a>
825: </td><td>
826: <a href="javascript:checkdates()">Select Dates</a>
827: <a href="javascript:checkvisi()">Select Visibilities</a>
828: <a href="javascript:checkparts()">Select Part Parameters</a>
829: </td><td>
830: <a href="javascript:checkall(false, \'pscat\')">Unselect All</a>
1.208 www 831: </td>
832: ');
833: $r->print('</tr></table>');
834: }
835:
1.209 www 836: sub partmenu {
837: my ($r,$allparts,$psprt)=@_;
1.211 www 838: $r->print('<select multiple name="psprt" size="8">');
1.208 www 839: $r->print('<option value="all"');
840: $r->print(' selected') unless (@{$psprt});
841: $r->print('>'.&mt('All Parts').'</option>');
842: my %temphash=();
843: foreach (@{$psprt}) { $temphash{$_}=1; }
1.209 www 844: foreach my $tempkey (sort keys %{$allparts}) {
1.208 www 845: unless ($tempkey =~ /\./) {
846: $r->print('<option value="'.$tempkey.'"');
847: if ($$psprt[0] eq "all" || $temphash{$tempkey}) {
848: $r->print(' selected');
849: }
850: $r->print('>'.$$allparts{$tempkey}.'</option>');
851: }
852: }
1.209 www 853: $r->print('</select>');
854: }
855:
856: sub usermenu {
857: my ($r,$uname,$id,$udom,$csec)=@_;
858: my $chooseopt=&Apache::loncommon::select_dom_form($udom,'udom').' '.
859: &Apache::loncommon::selectstudent_link('parmform','uname','udom');
860: my $selscript=&Apache::loncommon::studentbrowser_javascript();
861: my %lt=&Apache::lonlocal::texthash(
862: 'sg' => "Section/Group",
863: 'fu' => "For User",
864: 'oi' => "or ID",
865: 'ad' => "at Domain"
866: );
867: my %sectionhash=();
868: my $sections='';
869: if (&Apache::loncommon::get_sections(
870: $env{'course.'.$env{'request.course.id'}.'.domain'},
871: $env{'course.'.$env{'request.course.id'}.'.num'},
872: \%sectionhash)) {
873: $sections=$lt{'sg'}.': <select name="csec">';
874: foreach ('',sort keys %sectionhash) {
875: $sections.='<option value="'.$_.'"'.
876: ($_ eq $csec?'selected="selected"':'').'>'.$_.'</option>';
877: }
878: $sections.='</select>';
879: }
880: $r->print(<<ENDMENU);
881: <b>
882: $sections
883: <br />
884: $lt{'fu'}
885: <input type="text" value="$uname" size="12" name="uname" />
886: $lt{'oi'}
887: <input type="text" value="$id" size="12" name="id" />
888: $lt{'ad'}
889: $chooseopt
890: </b>
891: ENDMENU
892: }
893:
894: sub displaymenu {
1.211 www 895: my ($r,$allparms,$allparts,$pscat,$psprt,$keyorder)=@_;
1.209 www 896: $r->print('<table border="1"><tr><th>'.&mt('Select Parameters to View').'</th><th>'.
897: &mt('Select Parts to View').'</th></tr><tr><td>');
1.211 www 898: &parmmenu($r,$allparms,$pscat,$keyorder);
1.209 www 899: $r->print('</td><td>');
900: &partmenu($r,$allparts,$psprt);
901: $r->print('</td></tr></table>');
902: }
903:
904: sub mapmenu {
905: my ($r,$allmaps,$pschp,$maptitles)=@_;
906: $r->print(&mt('Select Enclosing Map or Folder').' ');
907: $r->print('<select name="pschp">');
908: $r->print('<option value="all">'.&mt('All Maps or Folders').'</option>');
909: foreach (sort {$$allmaps{$a} cmp $$allmaps{$b}} keys %{$allmaps}) {
1.208 www 910: $r->print('<option value="'.$_.'"');
1.209 www 911: if (($pschp eq $_)) { $r->print(' selected'); }
912: $r->print('>'.$$maptitles{$_}.($$allmaps{$_}!~/^uploaded/?' ['.$$allmaps{$_}.']':'').'</option>');
913: }
914: $r->print("</select>");
915: }
916:
917: sub levelmenu {
918: my ($r,$alllevs,$parmlev)=@_;
919: $r->print(&mt('Select Parameter Level').
920: &Apache::loncommon::help_open_topic('Course_Parameter_Levels').' ');
921: $r->print('<select name="parmlev">');
922: foreach (reverse sort keys %{$alllevs}) {
923: $r->print('<option value="'.$$alllevs{$_}.'"');
924: if ($parmlev eq $$alllevs{$_}) {
925: $r->print(' selected');
926: }
927: $r->print('>'.$_.'</option>');
1.208 www 928: }
1.209 www 929: $r->print("</select>");
1.208 www 930: }
931:
1.211 www 932:
933: sub sectionmenu {
934: my ($r,$selectedsections)=@_;
1.212 www 935: my %sectionhash=();
1.211 www 936:
1.212 www 937: if (&Apache::loncommon::get_sections(
938: $env{'course.'.$env{'request.course.id'}.'.domain'},
939: $env{'course.'.$env{'request.course.id'}.'.num'},
940: \%sectionhash)) {
941: $r->print('<select name="Section" multiple="true" size="8" >');
942: foreach my $s ('all',sort keys %sectionhash) {
943: $r->print(' <option value="'.$s.'"');
944: foreach (@{$selectedsections}) {
945: if ($s eq $_) {
946: $r->print(' selected');
947: last;
948: }
949: }
950: $r->print('>'.$s."</option>\n");
951: }
952: $r->print("</select>\n");
1.211 www 953: }
954: }
955:
1.210 www 956: sub keysplit {
957: my $keyp=shift;
958: return (split(/\,/,$keyp));
959: }
960:
961: sub keysinorder {
962: my ($name,$keyorder)=@_;
963: return sort {
964: $$keyorder{$a} <=> $$keyorder{$b};
965: } (keys %{$name});
966: }
967:
1.211 www 968: sub keysindisplayorder {
969: my ($name,$keyorder)=@_;
970: return sort {
971: $$keyorder{'parameter_0_'.$a} <=> $$keyorder{'parameter_0_'.$b};
972: } (keys %{$name});
973: }
974:
975: sub standardkeyorder {
976: return ('parameter_0_opendate' => 1,
977: 'parameter_0_duedate' => 2,
978: 'parameter_0_answerdate' => 3,
979: 'parameter_0_interval' => 4,
980: 'parameter_0_weight' => 5,
981: 'parameter_0_maxtries' => 6,
982: 'parameter_0_hinttries' => 7,
983: 'parameter_0_contentopen' => 8,
984: 'parameter_0_contentclose' => 9,
985: 'parameter_0_type' => 10,
986: 'parameter_0_problemstatus' => 11,
987: 'parameter_0_hiddenresource' => 12,
988: 'parameter_0_hiddenparts' => 13,
989: 'parameter_0_display' => 14,
990: 'parameter_0_ordered' => 15,
991: 'parameter_0_tol' => 16,
992: 'parameter_0_sig' => 17,
993: 'parameter_0_turnoffunit' => 18);
994: }
995:
1.59 matthew 996: ##################################################
997: ##################################################
998:
999: =pod
1000:
1001: =item assessparms
1002:
1003: Show assessment data and parameters. This is a large routine that should
1004: be simplified and shortened... someday.
1005:
1006: Inputs: $r
1007:
1008: Returns: nothing
1009:
1.63 bowersj2 1010: Variables used (guessed by Jeremy):
1011:
1012: =over 4
1013:
1014: =item B<pscat>: ParameterS CATegories? ends up a list of the types of parameters that exist, e.g., tol, weight, acc, opendate, duedate, answerdate, sig, maxtries, type.
1015:
1016: =item B<psprt>: ParameterS PaRTs? a list of the parts of a problem that we are displaying? Used to display only selected parts?
1017:
1018: =item B<allmaps>:
1019:
1020: =back
1021:
1.59 matthew 1022: =cut
1023:
1024: ##################################################
1025: ##################################################
1.30 www 1026: sub assessparms {
1.1 www 1027:
1.43 albertel 1028: my $r=shift;
1.201 www 1029:
1030: my @ids=();
1031: my %symbp=();
1032: my %mapp=();
1033: my %typep=();
1034: my %keyp=();
1035: my %uris=();
1036: my %maptitles=();
1037:
1.2 www 1038: # -------------------------------------------------------- Variable declaration
1.209 www 1039:
1.129 www 1040: my %allmaps=();
1041: my %alllevs=();
1.57 albertel 1042:
1.187 www 1043: my $uname;
1044: my $udom;
1045: my $uhome;
1046: my $csec;
1047:
1.190 albertel 1048: my $coursename=$env{'course.'.$env{'request.course.id'}.'.description'};
1.187 www 1049:
1.57 albertel 1050: $alllevs{'Resource Level'}='full';
1051: $alllevs{'Map Level'}='map';
1052: $alllevs{'Course Level'}='general';
1053:
1054: my %allparms;
1055: my %allparts;
1.210 www 1056: #
1057: # Order in which these parameters will be displayed
1058: #
1.211 www 1059: my %keyorder=&standardkeyorder();
1060:
1.43 albertel 1061: @ids=();
1062: %symbp=();
1063: %typep=();
1064:
1065: my $message='';
1066:
1.190 albertel 1067: $csec=$env{'form.csec'};
1.188 www 1068:
1.190 albertel 1069: if ($udom=$env{'form.udom'}) {
1070: } elsif ($udom=$env{'request.role.domain'}) {
1071: } elsif ($udom=$env{'user.domain'}) {
1.172 albertel 1072: } else {
1073: $udom=$r->dir_config('lonDefDomain');
1074: }
1.43 albertel 1075:
1.134 albertel 1076: my @pscat=&Apache::loncommon::get_env_multiple('form.pscat');
1.190 albertel 1077: my $pschp=$env{'form.pschp'};
1.134 albertel 1078: my @psprt=&Apache::loncommon::get_env_multiple('form.psprt');
1.76 www 1079: if (!@psprt) { $psprt[0]='0'; }
1.57 albertel 1080:
1.43 albertel 1081: my $pssymb='';
1.57 albertel 1082: my $parmlev='';
1083:
1.190 albertel 1084: unless ($env{'form.parmlev'}) {
1.57 albertel 1085: $parmlev = 'map';
1086: } else {
1.190 albertel 1087: $parmlev = $env{'form.parmlev'};
1.57 albertel 1088: }
1.26 www 1089:
1.29 www 1090: # ----------------------------------------------- Was this started from grades?
1091:
1.190 albertel 1092: if (($env{'form.command'} eq 'set') && ($env{'form.url'})
1093: && (!$env{'form.dis'})) {
1094: my $url=$env{'form.url'};
1.194 albertel 1095: $url=~s-^http://($ENV{'SERVER_NAME'}|$ENV{'HTTP_HOST'})--;
1.43 albertel 1096: $pssymb=&Apache::lonnet::symbread($url);
1.92 albertel 1097: if (!@pscat) { @pscat=('all'); }
1.43 albertel 1098: $pschp='';
1.57 albertel 1099: $parmlev = 'full';
1.190 albertel 1100: } elsif ($env{'form.symb'}) {
1101: $pssymb=$env{'form.symb'};
1.92 albertel 1102: if (!@pscat) { @pscat=('all'); }
1.43 albertel 1103: $pschp='';
1.57 albertel 1104: $parmlev = 'full';
1.43 albertel 1105: } else {
1.190 albertel 1106: $env{'form.url'}='';
1.43 albertel 1107: }
1108:
1.190 albertel 1109: my $id=$env{'form.id'};
1.43 albertel 1110: if (($id) && ($udom)) {
1111: $uname=(&Apache::lonnet::idget($udom,$id))[1];
1112: if ($uname) {
1113: $id='';
1114: } else {
1115: $message=
1.133 www 1116: "<font color=red>".&mt("Unknown ID")." '$id' ".
1117: &mt('at domain')." '$udom'</font>";
1.43 albertel 1118: }
1119: } else {
1.190 albertel 1120: $uname=$env{'form.uname'};
1.43 albertel 1121: }
1122: unless ($udom) { $uname=''; }
1123: $uhome='';
1124: if ($uname) {
1125: $uhome=&Apache::lonnet::homeserver($uname,$udom);
1126: if ($uhome eq 'no_host') {
1127: $message=
1.133 www 1128: "<font color=red>".&mt("Unknown user")." '$uname' ".
1129: &mt("at domain")." '$udom'</font>";
1.43 albertel 1130: $uname='';
1.12 www 1131: } else {
1.103 albertel 1132: $csec=&Apache::lonnet::getsection($udom,$uname,
1.190 albertel 1133: $env{'request.course.id'});
1.43 albertel 1134: if ($csec eq '-1') {
1135: $message="<font color=red>".
1.133 www 1136: &mt("User")." '$uname' ".&mt("at domain")." '$udom' ".
1137: &mt("not in this course")."</font>";
1.43 albertel 1138: $uname='';
1.190 albertel 1139: $csec=$env{'form.csec'};
1.43 albertel 1140: } else {
1141: my %name=&Apache::lonnet::userenvironment($udom,$uname,
1142: ('firstname','middlename','lastname','generation','id'));
1.133 www 1143: $message="\n<p>\n".&mt("Full Name").": ".
1.43 albertel 1144: $name{'firstname'}.' '.$name{'middlename'}.' '
1145: .$name{'lastname'}.' '.$name{'generation'}.
1.133 www 1146: "<br>\n".&mt('ID').": ".$name{'id'}.'<p>';
1.43 albertel 1147: }
1.12 www 1148: }
1.43 albertel 1149: }
1.2 www 1150:
1.43 albertel 1151: unless ($csec) { $csec=''; }
1.12 www 1152:
1.14 www 1153: # --------------------------------------------------------- Get all assessments
1.210 www 1154: &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps,
1155: \%mapp, \%symbp,\%maptitles,\%uris,
1156: \%keyorder);
1.63 bowersj2 1157:
1.57 albertel 1158: $mapp{'0.0'} = '';
1159: $symbp{'0.0'} = '';
1.99 albertel 1160:
1.14 www 1161: # ---------------------------------------------------------- Anything to store?
1.190 albertel 1162: if ($env{'form.pres_marker'}) {
1.205 www 1163: my @markers=split(/\&\&\&/,$env{'form.pres_marker'});
1164: my @values=split(/\&\&\&/,$env{'form.pres_value'});
1165: my @types=split(/\&\&\&/,$env{'form.pres_type'});
1166: for (my $i=0;$i<=$#markers;$i++) {
1167: $message.=&storeparm(split(/\&/,$markers[$i]),
1168: $values[$i],
1169: $types[$i],
1170: $uname,$udom,$csec);
1171: }
1.68 www 1172: # ---------------------------------------------------------------- Done storing
1.130 www 1173: $message.='<h3>'.&mt('Changes can take up to 10 minutes before being active for all students.').&Apache::loncommon::help_open_topic('Caching').'</h3>';
1.68 www 1174: }
1.57 albertel 1175: #----------------------------------------------- if all selected, fill in array
1.209 www 1176: if ($pscat[0] eq "all") {@pscat = (keys %allparms);}
1177: if (!@pscat) { @pscat=('duedate','opendate','answerdate','weight','maxtries') };
1.57 albertel 1178: if ($psprt[0] eq "all" || !@psprt) {@psprt = (keys %allparts);}
1.2 www 1179: # ------------------------------------------------------------------ Start page
1.63 bowersj2 1180:
1.209 www 1181: &startpage($r);
1.57 albertel 1182:
1.44 albertel 1183: foreach ('tolerance','date_default','date_start','date_end',
1184: 'date_interval','int','float','string') {
1185: $r->print('<input type="hidden" value="'.
1.190 albertel 1186: $env{'form.recent_'.$_}.'" name="recent_'.$_.'">');
1.44 albertel 1187: }
1.57 albertel 1188:
1.44 albertel 1189: if (!$pssymb) {
1.209 www 1190: $r->print('<table border="1"><tr><td>');
1191: &levelmenu($r,\%alllevs,$parmlev);
1.128 albertel 1192: if ($parmlev ne 'general') {
1.209 www 1193: $r->print('<td>');
1194: &mapmenu($r,\%allmaps,$pschp,\%maptitles);
1195: $r->print('</td>');
1.128 albertel 1196: }
1.209 www 1197: $r->print('</td></tr></table>');
1.211 www 1198: &displaymenu($r,\%allparms,\%allparts,\@pscat,\@psprt,\%keyorder);
1.44 albertel 1199: } else {
1.125 www 1200: my ($map,$id,$resource)=&Apache::lonnet::decode_symb($pssymb);
1.209 www 1201: $r->print(&mt('Specific Resource').": ".$resource.
1.212 www 1202: '<input type="hidden" value="'.$pssymb.'" name="symb"><br />');
1.57 albertel 1203: }
1.209 www 1204: &usermenu($r,$uname,$id,$udom,$csec);
1.57 albertel 1205:
1.210 www 1206: $r->print('<p>'.$message.'</p>');
1207:
1.209 www 1208: $r->print('<br /><input type="submit" name="dis" value="'.&mt("Update Parameter Display").'" />');
1.57 albertel 1209:
1210: my @temp_pscat;
1211: map {
1212: my $cat = $_;
1213: push(@temp_pscat, map { $_.'.'.$cat } @psprt);
1214: } @pscat;
1215:
1216: @pscat = @temp_pscat;
1217:
1.209 www 1218: if (($env{'form.prevvisit'}) || ($pschp) || ($pssymb)) {
1.10 www 1219: # ----------------------------------------------------------------- Start Table
1.57 albertel 1220: my @catmarker=map { tr|.|_|; 'parameter_'.$_; } @pscat;
1.190 albertel 1221: my $csuname=$env{'user.name'};
1222: my $csudom=$env{'user.domain'};
1.57 albertel 1223:
1.203 www 1224: if ($parmlev eq 'full') {
1.57 albertel 1225: my $coursespan=$csec?8:5;
1226: $r->print('<p><table border=2>');
1227: $r->print('<tr><td colspan=5></td>');
1.130 www 1228: $r->print('<th colspan='.($coursespan).'>'.&mt('Any User').'</th>');
1.57 albertel 1229: if ($uname) {
1230: $r->print("<th colspan=3 rowspan=2>");
1.130 www 1231: $r->print(&mt("User")." $uname ".&mt('at Domain')." $udom</th>");
1.57 albertel 1232: }
1.133 www 1233: my %lt=&Apache::lonlocal::texthash(
1234: 'pie' => "Parameter in Effect",
1235: 'csv' => "Current Session Value",
1236: 'at' => 'at',
1237: 'rl' => "Resource Level",
1238: 'ic' => 'in Course',
1239: 'aut' => "Assessment URL and Title",
1.143 albertel 1240: 'type' => 'Type',
1.133 www 1241: 'emof' => "Enclosing Map or Folder",
1.143 albertel 1242: 'part' => 'Part',
1.133 www 1243: 'pn' => 'Parameter Name',
1244: 'def' => 'default',
1245: 'femof' => 'from Enclosing Map or Folder',
1246: 'gen' => 'general',
1247: 'foremf' => 'for Enclosing Map or Folder',
1248: 'fr' => 'for Resource'
1249: );
1.57 albertel 1250: $r->print(<<ENDTABLETWO);
1.133 www 1251: <th rowspan=3>$lt{'pie'}</th>
1252: <th rowspan=3>$lt{'csv'}<br>($csuname $lt{'at'} $csudom)</th>
1.182 albertel 1253: </tr><tr><td colspan=5></td><th colspan=2>$lt{'ic'}</th><th colspan=2>$lt{'rl'}</th>
1254: <th colspan=1>$lt{'ic'}</th>
1255:
1.10 www 1256: ENDTABLETWO
1.57 albertel 1257: if ($csec) {
1.133 www 1258: $r->print("<th colspan=3>".
1259: &mt("in Section/Group")." $csec</th>");
1.57 albertel 1260: }
1261: $r->print(<<ENDTABLEHEADFOUR);
1.133 www 1262: </tr><tr><th>$lt{'aut'}</th><th>$lt{'type'}</th>
1263: <th>$lt{'emof'}</th><th>$lt{'part'}</th><th>$lt{'pn'}</th>
1.192 albertel 1264: <th>$lt{'gen'}</th><th>$lt{'foremf'}</th>
1265: <th>$lt{'def'}</th><th>$lt{'femof'}</th><th>$lt{'fr'}</th>
1.10 www 1266: ENDTABLEHEADFOUR
1.57 albertel 1267:
1268: if ($csec) {
1.130 www 1269: $r->print('<th>'.&mt('general').'</th><th>'.&mt('for Enclosing Map or Folder').'</th><th>'.&mt('for Resource').'</th>');
1.57 albertel 1270: }
1271:
1272: if ($uname) {
1.130 www 1273: $r->print('<th>'.&mt('general').'</th><th>'.&mt('for Enclosing Map or Folder').'</th><th>'.&mt('for Resource').'</th>');
1.57 albertel 1274: }
1275:
1276: $r->print('</tr>');
1277:
1278: my $defbgone='';
1279: my $defbgtwo='';
1280:
1281: foreach (@ids) {
1282:
1283: my $rid=$_;
1284: my ($inmapid)=($rid=~/\.(\d+)$/);
1285:
1.152 albertel 1286: if ((!$pssymb &&
1287: (($pschp eq 'all') || ($allmaps{$pschp} eq $mapp{$rid})))
1288: ||
1289: ($pssymb && $pssymb eq $symbp{$rid})) {
1.4 www 1290: # ------------------------------------------------------ Entry for one resource
1.184 albertel 1291: if ($defbgone eq '"#E0E099"') {
1292: $defbgone='"#E0E0DD"';
1.57 albertel 1293: } else {
1.184 albertel 1294: $defbgone='"#E0E099"';
1.57 albertel 1295: }
1.184 albertel 1296: if ($defbgtwo eq '"#FFFF99"') {
1297: $defbgtwo='"#FFFFDD"';
1.57 albertel 1298: } else {
1.184 albertel 1299: $defbgtwo='"#FFFF99"';
1.57 albertel 1300: }
1301: my $thistitle='';
1302: my %name= ();
1303: undef %name;
1304: my %part= ();
1305: my %display=();
1306: my %type= ();
1307: my %default=();
1.196 www 1308: my $uri=&Apache::lonnet::declutter($uris{$rid});
1.57 albertel 1309:
1.210 www 1310: foreach (&keysplit($keyp{$rid})) {
1.57 albertel 1311: my $tempkeyp = $_;
1312: if (grep $_ eq $tempkeyp, @catmarker) {
1313: $part{$_}=&Apache::lonnet::metadata($uri,$_.'.part');
1314: $name{$_}=&Apache::lonnet::metadata($uri,$_.'.name');
1315: $display{$_}=&Apache::lonnet::metadata($uri,$_.'.display');
1316: unless ($display{$_}) { $display{$_}=''; }
1317: $display{$_}.=' ('.$name{$_}.')';
1318: $default{$_}=&Apache::lonnet::metadata($uri,$_);
1319: $type{$_}=&Apache::lonnet::metadata($uri,$_.'.type');
1320: $thistitle=&Apache::lonnet::metadata($uri,$_.'.title');
1321: }
1322: }
1323: my $totalparms=scalar keys %name;
1324: if ($totalparms>0) {
1325: my $firstrow=1;
1.180 albertel 1326: my $title=&Apache::lonnet::gettitle($uri);
1.57 albertel 1327: $r->print('<tr><td bgcolor='.$defbgone.
1328: ' rowspan='.$totalparms.
1329: '><tt><font size=-1>'.
1330: join(' / ',split(/\//,$uri)).
1331: '</font></tt><p><b>'.
1.154 albertel 1332: "<a href=\"javascript:openWindow('".
1333: &Apache::lonnet::clutter($uri).
1.57 albertel 1334: "', 'metadatafile', '450', '500', 'no', 'yes')\";".
1.127 albertel 1335: " TARGET=_self>$title");
1.57 albertel 1336:
1337: if ($thistitle) {
1338: $r->print(' ('.$thistitle.')');
1339: }
1340: $r->print('</a></b></td>');
1341: $r->print('<td bgcolor='.$defbgtwo.
1342: ' rowspan='.$totalparms.'>'.$typep{$rid}.
1343: '</td>');
1344:
1345: $r->print('<td bgcolor='.$defbgone.
1346: ' rowspan='.$totalparms.
1347: '><tt><font size=-1>');
1348:
1349: $r->print(' / res / ');
1350: $r->print(join(' / ', split(/\//,$mapp{$rid})));
1351:
1352: $r->print('</font></tt></td>');
1353:
1.210 www 1354: foreach (&keysinorder(\%name,\%keyorder)) {
1.57 albertel 1355: unless ($firstrow) {
1356: $r->print('<tr>');
1357: } else {
1358: undef $firstrow;
1359: }
1360:
1.201 www 1361: &print_row($r,$_,\%part,\%name,\%symbp,$rid,\%default,
1.57 albertel 1362: \%type,\%display,$defbgone,$defbgtwo,
1.187 www 1363: $parmlev,$uname,$udom,$csec);
1.57 albertel 1364: }
1365: }
1366: }
1367: } # end foreach ids
1.43 albertel 1368: # -------------------------------------------------- End entry for one resource
1.57 albertel 1369: $r->print('</table>');
1.203 www 1370: } # end of full
1.57 albertel 1371: #--------------------------------------------------- Entry for parm level map
1372: if ($parmlev eq 'map') {
1373: my $defbgone = '"E0E099"';
1374: my $defbgtwo = '"FFFF99"';
1375:
1376: my %maplist;
1377:
1378: if ($pschp eq 'all') {
1379: %maplist = %allmaps;
1380: } else {
1381: %maplist = ($pschp => $mapp{$pschp});
1382: }
1383:
1384: #-------------------------------------------- for each map, gather information
1385: my $mapid;
1.60 albertel 1386: foreach $mapid (sort {$maplist{$a} cmp $maplist{$b}} keys %maplist) {
1387: my $maptitle = $maplist{$mapid};
1.57 albertel 1388:
1389: #----------------------- loop through ids and get all parameter types for map
1390: #----------------------------------------- and associated information
1391: my %name = ();
1392: my %part = ();
1393: my %display = ();
1394: my %type = ();
1395: my %default = ();
1396: my $map = 0;
1397:
1398: # $r->print("Catmarker: @catmarker<br />\n");
1399:
1400: foreach (@ids) {
1401: ($map)=(/([\d]*?)\./);
1402: my $rid = $_;
1403:
1404: # $r->print("$mapid:$map: $rid <br /> \n");
1405:
1406: if ($map eq $mapid) {
1.196 www 1407: my $uri=&Apache::lonnet::declutter($uris{$rid});
1.57 albertel 1408: # $r->print("Keys: $keyp{$rid} <br />\n");
1409:
1410: #--------------------------------------------------------------------
1411: # @catmarker contains list of all possible parameters including part #s
1412: # $fullkeyp contains the full part/id # for the extraction of proper parameters
1413: # $tempkeyp contains part 0 only (no ids - ie, subparts)
1414: # When storing information, store as part 0
1415: # When requesting information, request from full part
1416: #-------------------------------------------------------------------
1.210 www 1417: foreach (&keysplit($keyp{$rid})) {
1.57 albertel 1418: my $tempkeyp = $_;
1419: my $fullkeyp = $tempkeyp;
1.73 albertel 1420: $tempkeyp =~ s/_\w+_/_0_/;
1.57 albertel 1421:
1422: if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {
1423: $part{$tempkeyp}="0";
1424: $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name');
1425: $display{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');
1426: unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; }
1427: $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')';
1.73 albertel 1428: $display{$tempkeyp} =~ s/_\w+_/_0_/;
1.57 albertel 1429: $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp);
1430: $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.type');
1431: }
1432: } # end loop through keys
1433: }
1434: } # end loop through ids
1435:
1436: #---------------------------------------------------- print header information
1.133 www 1437: my $foldermap=&mt($maptitle=~/^uploaded/?'Folder':'Map');
1.82 www 1438: my $showtitle=$maptitles{$maptitle}.($maptitle!~/^uploaded/?' ['.$maptitle.']':'');
1.57 albertel 1439: $r->print(<<ENDMAPONE);
1440: <center><h4>
1.135 albertel 1441: Set Defaults for All Resources in $foldermap<br />
1442: <font color="red"><i>$showtitle</i></font><br />
1.57 albertel 1443: Specifically for
1444: ENDMAPONE
1445: if ($uname) {
1446: my %name=&Apache::lonnet::userenvironment($udom,$uname,
1447: ('firstname','middlename','lastname','generation', 'id'));
1448: my $person=$name{'firstname'}.' '.$name{'middlename'}.' '
1449: .$name{'lastname'}.' '.$name{'generation'};
1.135 albertel 1450: $r->print(&mt("User")." <font color=\"red\"><i>$uname \($person\) </i></font> ".
1.130 www 1451: &mt('in')." \n");
1.57 albertel 1452: } else {
1.135 albertel 1453: $r->print("<font color=\"red\"><i>".&mt('all').'</i></font> '.&mt('users in')." \n");
1.57 albertel 1454: }
1455:
1.135 albertel 1456: if ($csec) {$r->print(&mt("Section")." <font color=\"red\"><i>$csec</i></font> ".
1.130 www 1457: &mt('of')." \n")};
1.57 albertel 1458:
1.135 albertel 1459: $r->print("<font color=\"red\"><i>$coursename</i></font><br />");
1460: $r->print("</h4>\n");
1.57 albertel 1461: #---------------------------------------------------------------- print table
1462: $r->print('<p><table border="2">');
1.130 www 1463: $r->print('<tr><th>'.&mt('Parameter Name').'</th>');
1464: $r->print('<th>'.&mt('Default Value').'</th>');
1465: $r->print('<th>'.&mt('Parameter in Effect').'</th></tr>');
1.57 albertel 1466:
1.210 www 1467: foreach (&keysinorder(\%name,\%keyorder)) {
1.168 matthew 1468: $r->print('<tr>');
1.201 www 1469: &print_row($r,$_,\%part,\%name,\%symbp,$mapid,\%default,
1.57 albertel 1470: \%type,\%display,$defbgone,$defbgtwo,
1.187 www 1471: $parmlev,$uname,$udom,$csec);
1.57 albertel 1472: }
1473: $r->print("</table></center>");
1474: } # end each map
1475: } # end of $parmlev eq map
1476: #--------------------------------- Entry for parm level general (Course level)
1477: if ($parmlev eq 'general') {
1478: my $defbgone = '"E0E099"';
1479: my $defbgtwo = '"FFFF99"';
1480:
1481: #-------------------------------------------- for each map, gather information
1482: my $mapid="0.0";
1483: #----------------------- loop through ids and get all parameter types for map
1484: #----------------------------------------- and associated information
1485: my %name = ();
1486: my %part = ();
1487: my %display = ();
1488: my %type = ();
1489: my %default = ();
1490:
1491: foreach (@ids) {
1492: my $rid = $_;
1493:
1.196 www 1494: my $uri=&Apache::lonnet::declutter($uris{$rid});
1.57 albertel 1495:
1496: #--------------------------------------------------------------------
1497: # @catmarker contains list of all possible parameters including part #s
1498: # $fullkeyp contains the full part/id # for the extraction of proper parameters
1499: # $tempkeyp contains part 0 only (no ids - ie, subparts)
1500: # When storing information, store as part 0
1501: # When requesting information, request from full part
1502: #-------------------------------------------------------------------
1.210 www 1503: foreach (&keysplit($keyp{$rid})) {
1.57 albertel 1504: my $tempkeyp = $_;
1505: my $fullkeyp = $tempkeyp;
1.73 albertel 1506: $tempkeyp =~ s/_\w+_/_0_/;
1.57 albertel 1507: if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {
1508: $part{$tempkeyp}="0";
1509: $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name');
1510: $display{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');
1511: unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; }
1512: $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')';
1.73 albertel 1513: $display{$tempkeyp} =~ s/_\w+_/_0_/;
1.57 albertel 1514: $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp);
1515: $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.type');
1516: }
1517: } # end loop through keys
1518: } # end loop through ids
1519:
1520: #---------------------------------------------------- print header information
1.133 www 1521: my $setdef=&mt("Set Defaults for All Resources in Course");
1.57 albertel 1522: $r->print(<<ENDMAPONE);
1.133 www 1523: <center><h4>$setdef
1.135 albertel 1524: <font color="red"><i>$coursename</i></font><br />
1.57 albertel 1525: ENDMAPONE
1526: if ($uname) {
1527: my %name=&Apache::lonnet::userenvironment($udom,$uname,
1528: ('firstname','middlename','lastname','generation', 'id'));
1529: my $person=$name{'firstname'}.' '.$name{'middlename'}.' '
1530: .$name{'lastname'}.' '.$name{'generation'};
1.135 albertel 1531: $r->print(" ".&mt("User")."<font color=\"red\"> <i>$uname \($person\) </i></font> \n");
1.57 albertel 1532: } else {
1.135 albertel 1533: $r->print("<i><font color=\"red\"> ".&mt("ALL")."</i> ".&mt("USERS")."</font> \n");
1.57 albertel 1534: }
1535:
1.135 albertel 1536: if ($csec) {$r->print(&mt("Section")."<font color=\"red\"> <i>$csec</i></font>\n")};
1537: $r->print("</h4>\n");
1.57 albertel 1538: #---------------------------------------------------------------- print table
1539: $r->print('<p><table border="2">');
1.130 www 1540: $r->print('<tr><th>'.&mt('Parameter Name').'</th>');
1541: $r->print('<th>'.&mt('Default Value').'</th>');
1542: $r->print('<th>'.&mt('Parameter in Effect').'</th></tr>');
1.57 albertel 1543:
1.210 www 1544: foreach (&keysinorder(\%name,\%keyorder)) {
1.168 matthew 1545: $r->print('<tr>');
1.201 www 1546: &print_row($r,$_,\%part,\%name,\%symbp,$mapid,\%default,
1.187 www 1547: \%type,\%display,$defbgone,$defbgtwo,$parmlev,$uname,$udom,$csec);
1.57 albertel 1548: }
1549: $r->print("</table></center>");
1550: } # end of $parmlev eq general
1.43 albertel 1551: }
1.44 albertel 1552: $r->print('</form></body></html>');
1.57 albertel 1553: } # end sub assessparms
1.30 www 1554:
1.59 matthew 1555:
1556: ##################################################
1557: ##################################################
1558:
1559: =pod
1560:
1561: =item crsenv
1562:
1.105 matthew 1563: Show and set course data and parameters. This is a large routine that should
1.59 matthew 1564: be simplified and shortened... someday.
1565:
1566: Inputs: $r
1567:
1568: Returns: nothing
1569:
1570: =cut
1571:
1572: ##################################################
1573: ##################################################
1.30 www 1574: sub crsenv {
1575: my $r=shift;
1576: my $setoutput='';
1.64 www 1577: my $bodytag=&Apache::loncommon::bodytag(
1578: 'Set Course Environment Parameters');
1.194 albertel 1579: my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs(undef,
1580: 'Edit Course Environment');
1.190 albertel 1581: my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
1582: my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.105 matthew 1583:
1584: #
1585: # Go through list of changes
1.190 albertel 1586: foreach (keys %env) {
1.105 matthew 1587: next if ($_!~/^form\.(.+)\_setparmval$/);
1588: my $name = $1;
1.190 albertel 1589: my $value = $env{'form.'.$name.'_value'};
1.105 matthew 1590: if ($name eq 'newp') {
1.190 albertel 1591: $name = $env{'form.newp_name'};
1.105 matthew 1592: }
1593: if ($name eq 'url') {
1594: $value=~s/^\/res\///;
1595: my $bkuptime=time;
1596: my @tmp = &Apache::lonnet::get
1597: ('environment',['url'],$dom,$crs);
1.130 www 1598: $setoutput.=&mt('Backing up previous URL').': '.
1.105 matthew 1599: &Apache::lonnet::put
1600: ('environment',
1601: {'top level map backup '.$bkuptime => $tmp[1] },
1602: $dom,$crs).
1603: '<br>';
1604: }
1605: #
1606: # Deal with modified default spreadsheets
1607: if ($name =~ /^spreadsheet_default_(classcalc|
1608: studentcalc|
1609: assesscalc)$/x) {
1610: my $sheettype = $1;
1611: if ($sheettype eq 'classcalc') {
1612: # no need to do anything since viewing the sheet will
1613: # cause it to be updated.
1614: } elsif ($sheettype eq 'studentcalc') {
1615: # expire all the student spreadsheets
1616: &Apache::lonnet::expirespread('','','studentcalc');
1617: } else {
1618: # expire all the assessment spreadsheets
1619: # this includes non-default spreadsheets, but better to
1620: # be safe than sorry.
1621: &Apache::lonnet::expirespread('','','assesscalc');
1622: # expire all the student spreadsheets
1623: &Apache::lonnet::expirespread('','','studentcalc');
1.30 www 1624: }
1.105 matthew 1625: }
1626: #
1.107 matthew 1627: # Deal with the enrollment dates
1628: if ($name =~ /^default_enrollment_(start|end)_date$/) {
1629: $value=&Apache::lonhtmlcommon::get_date_from_form($name.'_value');
1630: }
1.178 raeburn 1631: # Get existing cloners
1632: my @oldcloner = ();
1633: if ($name eq 'cloners') {
1634: my %clonenames=&Apache::lonnet::dump('environment',$dom,$crs,'cloners');
1635: if ($clonenames{'cloners'} =~ /,/) {
1636: @oldcloner = split/,/,$clonenames{'cloners'};
1637: } else {
1638: $oldcloner[0] = $clonenames{'cloners'};
1639: }
1640: }
1.107 matthew 1641: #
1.105 matthew 1642: # Let the user know we made the changes
1.153 albertel 1643: if ($name && defined($value)) {
1.178 raeburn 1644: if ($name eq 'cloners') {
1645: $value =~ s/^,//;
1646: $value =~ s/,$//;
1647: }
1.105 matthew 1648: my $put_result = &Apache::lonnet::put('environment',
1649: {$name=>$value},$dom,$crs);
1650: if ($put_result eq 'ok') {
1.130 www 1651: $setoutput.=&mt('Set').' <b>'.$name.'</b> '.&mt('to').' <b>'.$value.'</b>.<br />';
1.178 raeburn 1652: if ($name eq 'cloners') {
1653: &change_clone($value,\@oldcloner);
1654: }
1.179 raeburn 1655: # Flush the course logs so course description is immediately updated
1656: if ($name eq 'description' && defined($value)) {
1657: &Apache::lonnet::flushcourselogs();
1658: }
1.105 matthew 1659: } else {
1.130 www 1660: $setoutput.=&mt('Unable to set').' <b>'.$name.'</b> '.&mt('to').
1661: ' <b>'.$value.'</b> '.&mt('due to').' '.$put_result.'.<br />';
1.30 www 1662: }
1663: }
1.38 harris41 1664: }
1.108 www 1665: # ------------------------- Re-init course environment entries for this session
1666:
1.190 albertel 1667: &Apache::lonnet::coursedescription($env{'request.course.id'});
1.105 matthew 1668:
1.30 www 1669: # -------------------------------------------------------- Get parameters again
1.45 matthew 1670:
1671: my %values=&Apache::lonnet::dump('environment',$dom,$crs);
1.140 sakharuk 1672: my $SelectStyleFile=&mt('Select Style File');
1.141 sakharuk 1673: my $SelectSpreadsheetFile=&mt('Select Spreadsheet File');
1.30 www 1674: my $output='';
1.45 matthew 1675: if (! exists($values{'con_lost'})) {
1.30 www 1676: my %descriptions=
1.140 sakharuk 1677: ('url' => '<b>'.&mt('Top Level Map').'</b> '.
1.46 matthew 1678: '<a href="javascript:openbrowser'.
1.47 matthew 1679: "('envform','url','sequence')\">".
1.140 sakharuk 1680: &mt('Select Map').'</a><br /><font color=red> '.
1681: &mt('Modification may make assessment data inaccessible').
1682: '</font>',
1683: 'description' => '<b>'.&mt('Course Description').'</b>',
1.158 sakharuk 1684: 'courseid' => '<b>'.&mt('Course ID or number').
1.140 sakharuk 1685: '</b><br />'.
1686: '('.&mt('internal').', '.&mt('optional').')',
1.177 raeburn 1687: 'cloners' => '<b>'.&mt('Users allowed to clone course').'</b><br /><tt>(user:domain,user:domain)</tt><br />'.&mt('Users with active Course Coordinator role in the course automatically have the right to clone it, and can be omitted from list.'),
1.150 www 1688: 'grading' => '<b>'.&mt('Grading').'</b><br />'.
1689: '<tt>"standard", "external", or "spreadsheet"</tt> '.&Apache::loncommon::help_open_topic('GradingOptions'),
1.140 sakharuk 1690: 'default_xml_style' => '<b>'.&mt('Default XML Style File').'</b> '.
1.52 www 1691: '<a href="javascript:openbrowser'.
1692: "('envform','default_xml_style'".
1.140 sakharuk 1693: ",'sty')\">$SelectStyleFile</a><br>",
1.141 sakharuk 1694: 'question.email' => '<b>'.&mt('Feedback Addresses for Resource Content Question').
1695: '</b><br />(<tt>user:domain,'.
1.74 www 1696: 'user:domain(section;section;...;*;...),...</tt>)',
1.141 sakharuk 1697: 'comment.email' => '<b>'.&mt('Feedback Addresses for Course Content Comments').'</b><br />'.
1.74 www 1698: '(<tt>user:domain,user:domain(section;section;...;*;...),...</tt>)',
1.141 sakharuk 1699: 'policy.email' => '<b>'.&mt('Feedback Addresses for Course Policy').'</b>'.
1.75 albertel 1700: '<br />(<tt>user:domain,user:domain(section;section;...;*;...),...</tt>)',
1.141 sakharuk 1701: 'hideemptyrows' => '<b>'.&mt('Hide Empty Rows in Spreadsheets').'</b><br />'.
1.158 sakharuk 1702: '('.&mt('"[_1]" for default hiding','<tt>yes</tt>').')',
1.141 sakharuk 1703: 'pageseparators' => '<b>'.&mt('Visibly Separate Items on Pages').'</b><br />'.
1.158 sakharuk 1704: '('.&mt('"[_1]" for visible separation','<tt>yes</tt>').', '.
1.141 sakharuk 1705: &mt('changes will not show until next login').')',
1.169 matthew 1706: 'student_classlist_view' => '<b>'.&mt('Allow students to view classlist.').'</b>'.&mt('("all":students can view all sections,"section":students can only view their own section.blank or "disabled" prevents student view.'),
1.118 matthew 1707:
1.141 sakharuk 1708: 'plc.roles.denied'=> '<b>'.&mt('Disallow live chatroom use for Roles').
1709: '</b><br />"<tt>st</tt>": '.
1.158 sakharuk 1710: &mt('student').', "<tt>ta</tt>": '.
1.118 matthew 1711: 'TA, "<tt>in</tt>": '.
1.158 sakharuk 1712: &mt('instructor').';<br /><tt>'.&mt('role,role,...').'</tt>) '.
1.118 matthew 1713: Apache::loncommon::help_open_topic("Course_Disable_Discussion"),
1714: 'plc.users.denied' =>
1.141 sakharuk 1715: '<b>'.&mt('Disallow live chatroom use for Users').'</b><br />'.
1.118 matthew 1716: '(<tt>user:domain,user:domain,...</tt>)',
1717:
1.141 sakharuk 1718: 'pch.roles.denied'=> '<b>'.&mt('Disallow Resource Discussion for Roles').
1719: '</b><br />"<tt>st</tt>": '.
1.61 albertel 1720: 'student, "<tt>ta</tt>": '.
1721: 'TA, "<tt>in</tt>": '.
1.75 albertel 1722: 'instructor;<br /><tt>role,role,...</tt>) '.
1.61 albertel 1723: Apache::loncommon::help_open_topic("Course_Disable_Discussion"),
1.53 www 1724: 'pch.users.denied' =>
1.141 sakharuk 1725: '<b>'.&mt('Disallow Resource Discussion for Users').'</b><br />'.
1.53 www 1726: '(<tt>user:domain,user:domain,...</tt>)',
1.49 matthew 1727: 'spreadsheet_default_classcalc'
1.141 sakharuk 1728: => '<b>'.&mt('Default Course Spreadsheet').'</b> '.
1.50 matthew 1729: '<a href="javascript:openbrowser'.
1730: "('envform','spreadsheet_default_classcalc'".
1.141 sakharuk 1731: ",'spreadsheet')\">$SelectSpreadsheetFile</a><br />",
1.49 matthew 1732: 'spreadsheet_default_studentcalc'
1.141 sakharuk 1733: => '<b>'.&mt('Default Student Spreadsheet').'</b> '.
1.50 matthew 1734: '<a href="javascript:openbrowser'.
1735: "('envform','spreadsheet_default_calc'".
1.141 sakharuk 1736: ",'spreadsheet')\">$SelectSpreadsheetFile</a><br />",
1.49 matthew 1737: 'spreadsheet_default_assesscalc'
1.141 sakharuk 1738: => '<b>'.&mt('Default Assessment Spreadsheet').'</b> '.
1.50 matthew 1739: '<a href="javascript:openbrowser'.
1740: "('envform','spreadsheet_default_assesscalc'".
1.141 sakharuk 1741: ",'spreadsheet')\">$SelectSpreadsheetFile</a><br />",
1.75 albertel 1742: 'allow_limited_html_in_feedback'
1.141 sakharuk 1743: => '<b>'.&mt('Allow limited HTML in discussion posts').'</b><br />'.
1.158 sakharuk 1744: '('.&mt('Set value to "[_1]" to allow',"<tt>yes</tt>").')',
1.170 raeburn 1745: 'allow_discussion_post_editing'
1746: => '<b>'.&mt('Allow users to edit/delete their own discussion posts').'</b><br />'.
1747: '('.&mt('Set value to "[_1]" to allow',"<tt>yes</tt>").')',
1.89 albertel 1748: 'rndseed'
1.140 sakharuk 1749: => '<b>'.&mt('Randomization algorithm used').'</b> <br />'.
1750: '<font color="red">'.&mt('Modifying this will make problems').' '.
1751: &mt('have different numbers and answers').'</font>',
1.151 albertel 1752: 'receiptalg'
1753: => '<b>'.&mt('Receipt algorithm used').'</b> <br />'.
1754: &mt('This controls how receipt numbers are generated.'),
1.164 sakharuk 1755: 'suppress_tries'
1756: => '<b>'.&mt('Suppress number of tries in printing').'</b>('.
1757: &mt('yes if supress').')',
1.113 sakharuk 1758: 'problem_stream_switch'
1.141 sakharuk 1759: => '<b>'.&mt('Allow problems to be split over pages').'</b><br />'.
1.158 sakharuk 1760: ' ('.&mt('"[_1]" if allowed, anything else if not','<tt>yes</tt>').')',
1.161 sakharuk 1761: 'default_paper_size'
1762: => '<b>'.&mt('Default paper type').'</b><br />'.
1763: ' ('.&mt('supported types').': Letter [8 1/2x11 in], Legal [8 1/2x14 in],'.
1764: ' Tabloid [11x17 in], Executive [7 1/2x10 in], A2 [420x594 mm],'.
1765: ' A3 [297x420 mm], A4 [210x297 mm], A5 [148x210 mm], A6 [105x148 mm])',
1.111 sakharuk 1766: 'anonymous_quiz'
1.150 www 1767: => '<b>'.&mt('Anonymous quiz/exam').'</b><br />'.
1.141 sakharuk 1768: ' (<tt><b>'.&mt('yes').'</b> '.&mt('to avoid print students names').' </tt>)',
1769: 'default_enrollment_start_date' => '<b>'.&mt('Default beginning date when enrolling students').'</b>',
1770: 'default_enrollment_end_date' => '<b>'.&mt('Default ending date when enrolling students').'</b>',
1.150 www 1771: 'nothideprivileged' => '<b>'.&mt('Privileged users that should not be hidden on staff listings').'</b>'.
1772: '<br />(<tt>user:domain,user:domain,...</tt>)',
1.140 sakharuk 1773: 'languages' => '<b>'.&mt('Languages used').'</b>',
1.115 www 1774: 'disable_receipt_display'
1.141 sakharuk 1775: => '<b>'.&mt('Disable display of problem receipts').'</b><br />'.
1.158 sakharuk 1776: ' ('.&mt('"[_1]" to disable, anything else if not','<tt>yes</tt>').')',
1.163 albertel 1777: 'disablesigfigs'
1778: => '<b>'.&mt('Disable checking of Significant Figures').'</b><br />'.
1779: ' ('.&mt('"[_1]" to disable, anything else if not','<tt>yes</tt>').')',
1.149 albertel 1780: 'tthoptions'
1781: => '<b>'.&mt('Default set of options to pass to tth/m when converting tex').'</b>'
1.107 matthew 1782: );
1.177 raeburn 1783: my @Display_Order = ('url','description','courseid','cloners','grading',
1.107 matthew 1784: 'default_xml_style','pageseparators',
1785: 'question.email','comment.email','policy.email',
1.169 matthew 1786: 'student_classlist_view',
1.118 matthew 1787: 'plc.roles.denied','plc.users.denied',
1.107 matthew 1788: 'pch.roles.denied','pch.users.denied',
1789: 'allow_limited_html_in_feedback',
1.170 raeburn 1790: 'allow_discussion_post_editing',
1.108 www 1791: 'languages',
1.150 www 1792: 'nothideprivileged',
1.107 matthew 1793: 'rndseed',
1.151 albertel 1794: 'receiptalg',
1.107 matthew 1795: 'problem_stream_switch',
1.164 sakharuk 1796: 'suppress_tries',
1.161 sakharuk 1797: 'default_paper_size',
1.115 www 1798: 'disable_receipt_display',
1.107 matthew 1799: 'spreadsheet_default_classcalc',
1800: 'spreadsheet_default_studentcalc',
1801: 'spreadsheet_default_assesscalc',
1802: 'hideemptyrows',
1803: 'default_enrollment_start_date',
1804: 'default_enrollment_end_date',
1.163 albertel 1805: 'tthoptions',
1806: 'disablesigfigs'
1.107 matthew 1807: );
1808: foreach my $parameter (sort(keys(%values))) {
1.142 raeburn 1809: unless ($parameter =~ m/^internal\./) {
1810: if (! $descriptions{$parameter}) {
1811: $descriptions{$parameter}=$parameter;
1812: push(@Display_Order,$parameter);
1813: }
1814: }
1.43 albertel 1815: }
1.107 matthew 1816: foreach my $parameter (@Display_Order) {
1817: my $description = $descriptions{$parameter};
1.51 matthew 1818: # onchange is javascript to automatically check the 'Set' button.
1.69 www 1819: my $onchange = 'onFocus="javascript:window.document.forms'.
1.107 matthew 1820: "['envform'].elements['".$parameter."_setparmval']".
1.51 matthew 1821: '.checked=true;"';
1.107 matthew 1822: $output .= '<tr><td>'.$description.'</td>';
1823: if ($parameter =~ /^default_enrollment_(start|end)_date$/) {
1824: $output .= '<td>'.
1825: &Apache::lonhtmlcommon::date_setter('envform',
1826: $parameter.'_value',
1827: $values{$parameter},
1828: $onchange).
1829: '</td>';
1830: } else {
1831: $output .= '<td>'.
1832: &Apache::lonhtmlcommon::textbox($parameter.'_value',
1833: $values{$parameter},
1834: 40,$onchange).'</td>';
1835: }
1836: $output .= '<td>'.
1837: &Apache::lonhtmlcommon::checkbox($parameter.'_setparmval').
1838: '</td>';
1839: $output .= "</tr>\n";
1.51 matthew 1840: }
1.69 www 1841: my $onchange = 'onFocus="javascript:window.document.forms'.
1.51 matthew 1842: '[\'envform\'].elements[\'newp_setparmval\']'.
1843: '.checked=true;"';
1.130 www 1844: $output.='<tr><td><i>'.&mt('Create New Environment Variable').'</i><br />'.
1.51 matthew 1845: '<input type="text" size=40 name="newp_name" '.
1846: $onchange.' /></td><td>'.
1847: '<input type="text" size=40 name="newp_value" '.
1848: $onchange.' /></td><td>'.
1849: '<input type="checkbox" name="newp_setparmval" /></td></tr>';
1.43 albertel 1850: }
1.157 sakharuk 1851: my %lt=&Apache::lonlocal::texthash(
1852: 'par' => 'Parameter',
1853: 'val' => 'Value',
1854: 'set' => 'Set',
1855: 'sce' => 'Set Course Environment'
1856: );
1857:
1.140 sakharuk 1858: my $Parameter=&mt('Parameter');
1859: my $Value=&mt('Value');
1.141 sakharuk 1860: my $Set=&mt('Set');
1.167 albertel 1861: my $browse_js=&Apache::loncommon::browser_and_searcher_javascript('parmset');
1.183 albertel 1862: my $html=&Apache::lonxml::xmlbegin();
1.190 albertel 1863: $r->print(<<ENDenv);
1.183 albertel 1864: $html
1865: <head>
1.46 matthew 1866: <script type="text/javascript" language="Javascript" >
1.155 albertel 1867: $browse_js
1.46 matthew 1868: </script>
1.30 www 1869: <title>LON-CAPA Course Environment</title>
1870: </head>
1.64 www 1871: $bodytag
1.193 albertel 1872: $breadcrumbs
1873: <form method="post" action="/adm/parmset?action=crsenv" name="envform">
1.30 www 1874: $setoutput
1875: <p>
1876: <table border=2>
1.157 sakharuk 1877: <tr><th>$lt{'par'}</th><th>$lt{'val'}</th><th>$lt{'set'}?</th></tr>
1.30 www 1878: $output
1879: </table>
1.157 sakharuk 1880: <input type="submit" name="crsenv" value="$lt{'sce'}">
1.30 www 1881: </form>
1882: </body>
1883: </html>
1.190 albertel 1884: ENDenv
1.30 www 1885: }
1.120 www 1886: ##################################################
1.207 www 1887: # Overview mode
1888: ##################################################
1.124 www 1889: my $tableopen;
1890:
1891: sub tablestart {
1892: if ($tableopen) {
1893: return '';
1894: } else {
1895: $tableopen=1;
1.130 www 1896: return '<table border="2"><tr><th>'.&mt('Parameter').'</th><th>'.
1897: &mt('Delete').'</th><th>'.&mt('Set to ...').'</th></tr>';
1.124 www 1898: }
1899: }
1900:
1901: sub tableend {
1902: if ($tableopen) {
1903: $tableopen=0;
1904: return '</table>';
1905: } else {
1906: return'';
1907: }
1908: }
1909:
1.207 www 1910: sub readdata {
1911: my ($crs,$dom)=@_;
1912: # Read coursedata
1913: my $resourcedata=&Apache::lonnet::get_courseresdata($crs,$dom);
1914: # Read userdata
1915:
1916: my $classlist=&Apache::loncoursedata::get_classlist();
1917: foreach (keys %$classlist) {
1918: # the following undefs are for 'domain', and 'username' respectively.
1919: if ($_=~/^(\w+)\:(\w+)$/) {
1920: my ($tuname,$tudom)=($1,$2);
1921: my $useropt=&Apache::lonnet::get_userresdata($tuname,$tudom);
1922: foreach my $userkey (keys %{$useropt}) {
1923: if ($userkey=~/^$env{'request.course.id'}/) {
1924: my $newkey=$userkey;
1925: $newkey=~s/^($env{'request.course.id'}\.)/$1\[useropt\:$tuname\:$tudom\]\./;
1926: $$resourcedata{$newkey}=$$useropt{$userkey};
1927: }
1928: }
1929: }
1930: }
1931: return $resourcedata;
1932: }
1933:
1934:
1.124 www 1935: # Setting
1.208 www 1936:
1937: sub storedata {
1938: my ($r,$crs,$dom)=@_;
1.207 www 1939: # Set userlevel immediately
1940: # Do an intermediate store of course level
1941: my $olddata=&readdata($crs,$dom);
1.124 www 1942: my %newdata=();
1943: undef %newdata;
1944: my @deldata=();
1945: undef @deldata;
1.190 albertel 1946: foreach (keys %env) {
1.124 www 1947: if ($_=~/^form\.([a-z]+)\_(.+)$/) {
1948: my $cmd=$1;
1949: my $thiskey=$2;
1.207 www 1950: my ($tuname,$tudom)=&extractuser($thiskey);
1951: my $tkey=$thiskey;
1952: if ($tuname) {
1953: $tkey=~s/\.\[useropt\:$tuname\:$tudom\]\./\./;
1954: }
1.124 www 1955: if ($cmd eq 'set') {
1.190 albertel 1956: my $data=$env{$_};
1.212 www 1957: my $typeof=$env{'form.typeof_'.$thiskey};
1958: if ($$olddata{$thiskey} ne $data) {
1.207 www 1959: if ($tuname) {
1.212 www 1960: if (&Apache::lonnet::put('resourcedata',{$tkey=>$data,
1961: $tkey.'.type' => $typeof},
1962: $tudom,$tuname) eq 'ok') {
1.207 www 1963: $r->print('<br />'.&mt('Stored modified parameter for').' '.
1964: &Apache::loncommon::plainname($tuname,$tudom));
1965: } else {
1966: $r->print('<h2><font color="red">'.
1967: &mt('Error storing parameters').'</font></h2>');
1968: }
1969: &Apache::lonnet::devalidateuserresdata($tuname,$tudom);
1970: } else {
1971: $newdata{$thiskey}=$data;
1.212 www 1972: $newdata{$thiskey.'.type'}=$typeof;
1973: }
1.207 www 1974: }
1.124 www 1975: } elsif ($cmd eq 'del') {
1.207 www 1976: if ($tuname) {
1977: if (&Apache::lonnet::del('resourcedata',[$tkey],$tudom,$tuname) eq 'ok') {
1978: $r->print('<br />'.&mt('Deleted parameter for').' '.&Apache::loncommon::plainname($tuname,$tudom));
1979: } else {
1980: $r->print('<h2><font color="red">'.
1981: &mt('Error deleting parameters').'</font></h2>');
1982: }
1983: &Apache::lonnet::devalidateuserresdata($tuname,$tudom);
1984: } else {
1985: push (@deldata,$thiskey);
1986: }
1.124 www 1987: } elsif ($cmd eq 'datepointer') {
1.190 albertel 1988: my $data=&Apache::lonhtmlcommon::get_date_from_form($env{$_});
1.212 www 1989: my $typeof=$env{'form.typeof_'.$thiskey};
1.207 www 1990: if (defined($data) and $$olddata{$thiskey} ne $data) {
1991: if ($tuname) {
1.212 www 1992: if (&Apache::lonnet::put('resourcedata',{$tkey=>$data,
1993: $tkey.'.type' => $typeof},
1994: $tudom,$tuname) eq 'ok') {
1.207 www 1995: $r->print('<br />'.&mt('Stored modified date for').' '.&Apache::loncommon::plainname($tuname,$tudom));
1996: } else {
1997: $r->print('<h2><font color="red">'.
1998: &mt('Error storing parameters').'</font></h2>');
1999: }
2000: &Apache::lonnet::devalidateuserresdata($tuname,$tudom);
2001: } else {
1.212 www 2002: $newdata{$thiskey}=$data;
2003: $newdata{$thiskey.'.type'}=$typeof;
1.207 www 2004: }
2005: }
1.124 www 2006: }
2007: }
2008: }
1.207 www 2009: # Store all course level
1.144 www 2010: my $delentries=$#deldata+1;
2011: my @newdatakeys=keys %newdata;
2012: my $putentries=$#newdatakeys+1;
2013: if ($delentries) {
2014: if (&Apache::lonnet::del('resourcedata',\@deldata,$dom,$crs) eq 'ok') {
2015: $r->print('<h2>'.&mt('Deleted [_1] parameter(s)</h2>',$delentries));
2016: } else {
2017: $r->print('<h2><font color="red">'.
2018: &mt('Error deleting parameters').'</font></h2>');
2019: }
1.205 www 2020: &Apache::lonnet::devalidatecourseresdata($crs,$dom);
1.144 www 2021: }
2022: if ($putentries) {
2023: if (&Apache::lonnet::put('resourcedata',\%newdata,$dom,$crs) eq 'ok') {
1.212 www 2024: $r->print('<h3>'.&mt('Stored [_1] parameter(s)',$putentries/2).'</h3>');
1.144 www 2025: } else {
2026: $r->print('<h2><font color="red">'.
2027: &mt('Error storing parameters').'</font></h2>');
2028: }
1.205 www 2029: &Apache::lonnet::devalidatecourseresdata($crs,$dom);
1.144 www 2030: }
1.208 www 2031: }
1.207 www 2032:
1.208 www 2033: sub extractuser {
2034: my $key=shift;
2035: return ($key=~/^$env{'request.course.id'}.\[useropt\:(\w+)\:(\w+)\]\./);
2036: }
1.206 www 2037:
1.208 www 2038: sub listdata {
2039: my ($r,$resourcedata,$listdata)=@_;
1.207 www 2040: # Start list output
1.206 www 2041:
1.122 www 2042: my $oldsection='';
2043: my $oldrealm='';
2044: my $oldpart='';
1.123 www 2045: my $pointer=0;
1.124 www 2046: $tableopen=0;
1.145 www 2047: my $foundkeys=0;
1.208 www 2048: foreach my $thiskey (sort keys %{$listdata}) {
1.211 www 2049: if ($$listdata{$thiskey.'.type'}) {
2050: my $thistype=$$listdata{$thiskey.'.type'};
2051: if ($$resourcedata{$thiskey.'.type'}) {
2052: $thistype=$$resourcedata{$thiskey.'.type'};
2053: }
1.207 www 2054: my ($middle,$part,$name)=
2055: ($thiskey=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);
1.130 www 2056: my $section=&mt('All Students');
1.207 www 2057: if ($middle=~/^\[(.*)\]/) {
1.206 www 2058: my $issection=$1;
2059: if ($issection=~/^useropt\:(\w+)\:(\w+)/) {
2060: $section=&mt('User').": ".&Apache::loncommon::plainname($1,$2);
2061: } else {
2062: $section=&mt('Group/Section').': '.$issection;
2063: }
1.207 www 2064: $middle=~s/^\[(.*)\]//;
1.122 www 2065: }
1.207 www 2066: $middle=~s/\.+$//;
2067: $middle=~s/^\.+//;
1.130 www 2068: my $realm='<font color="red">'.&mt('All Resources').'</font>';
1.122 www 2069: if ($middle=~/^(.+)\_\_\_\(all\)$/) {
1.174 albertel 2070: $realm='<font color="green">'.&mt('Folder/Map').': '.&Apache::lonnet::gettitle($1).' <br /><font color="#aaaaaa" size="-2">('.$1.')</font></font>';
1.122 www 2071: } elsif ($middle) {
1.174 albertel 2072: my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle);
2073: $realm='<font color="orange">'.&mt('Resource').': '.&Apache::lonnet::gettitle($middle).' <br /><font color="#aaaaaa" size="-2">('.$url.' in '.$map.' id: '.$id.')</font></font>';
1.122 www 2074: }
2075: if ($section ne $oldsection) {
1.124 www 2076: $r->print(&tableend()."\n<hr /><h1>$section</h1>");
1.122 www 2077: $oldsection=$section;
2078: $oldrealm='';
2079: }
2080: if ($realm ne $oldrealm) {
1.124 www 2081: $r->print(&tableend()."\n<h2>$realm</h2>");
1.122 www 2082: $oldrealm=$realm;
2083: $oldpart='';
2084: }
2085: if ($part ne $oldpart) {
1.124 www 2086: $r->print(&tableend().
1.130 www 2087: "\n<h3><font color='blue'>".&mt('Part').": $part</font></h3>");
1.122 www 2088: $oldpart=$part;
2089: }
1.123 www 2090: #
2091: # Ready to print
2092: #
1.124 www 2093: $r->print(&tablestart().'<tr><td><b>'.$name.
2094: ':</b></td><td><input type="checkbox" name="del_'.
2095: $thiskey.'" /></td><td>');
1.145 www 2096: $foundkeys++;
1.213 ! www 2097: if (&isdateparm($thistype)) {
1.123 www 2098: my $jskey='key_'.$pointer;
2099: $pointer++;
2100: $r->print(
2101: &Apache::lonhtmlcommon::date_setter('overviewform',
2102: $jskey,
1.206 www 2103: $$resourcedata{$thiskey}).
1.123 www 2104: '<input type="hidden" name="datepointer_'.$thiskey.'" value="'.$jskey.'" />'
2105: );
2106: } else {
1.211 www 2107: $r->print('<input type="text" name="set_'.$thiskey.'" value="'.
1.206 www 2108: $$resourcedata{$thiskey}.'">');
1.123 www 2109: }
1.211 www 2110: $r->print('<input type="hidden" name="typeof_'.$thiskey.'" value="'.
2111: $thistype.'">');
1.124 www 2112: $r->print('</td></tr>');
1.122 www 2113: }
1.121 www 2114: }
1.208 www 2115: return $foundkeys;
2116: }
2117:
2118: sub newoverview {
2119: my $r=shift;
2120: my $bodytag=&Apache::loncommon::bodytag(
2121: 'Set Course Assessment Parameters');
2122: my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
2123: my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
2124: my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs(undef,'Overview');
2125: my $html=&Apache::lonxml::xmlbegin();
2126: $r->print(<<ENDOVER);
2127: $html
2128: <head>
2129: <title>LON-CAPA Parameters</title>
2130: </head>
2131: $bodytag
2132: $breadcrumbs
1.211 www 2133: <form method="post" action="/adm/parmset?action=newoverview" name="parmform">
1.208 www 2134: ENDOVER
1.211 www 2135: my @ids=();
2136: my %typep=();
2137: my %keyp=();
2138: my %allparms=();
2139: my %allparts=();
2140: my %allmaps=();
2141: my %mapp=();
2142: my %symbp=();
2143: my %maptitles=();
2144: my %uris=();
2145: my %keyorder=&standardkeyorder();
2146: my %defkeytype=();
2147:
2148: my %alllevs=();
2149: $alllevs{'Resource Level'}='full';
2150: $alllevs{'Map Level'}='map';
2151: $alllevs{'Course Level'}='general';
2152:
2153: my $csec=$env{'form.csec'};
2154:
2155: my @pscat=&Apache::loncommon::get_env_multiple('form.pscat');
2156: my $pschp=$env{'form.pschp'};
2157: my @psprt=&Apache::loncommon::get_env_multiple('form.psprt');
2158: if (!@psprt) { $psprt[0]='0'; }
2159:
2160: my @selected_sections =
2161: &Apache::loncommon::get_env_multiple('form.Section');
2162: @selected_sections = ('all') if (! @selected_sections);
2163: foreach (@selected_sections) {
2164: if ($_ eq 'all') {
2165: @selected_sections = ('all');
2166: }
2167: }
2168:
2169: my $pssymb='';
2170: my $parmlev='';
2171:
2172: unless ($env{'form.parmlev'}) {
2173: $parmlev = 'map';
2174: } else {
2175: $parmlev = $env{'form.parmlev'};
2176: }
2177:
2178: &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps,
2179: \%mapp, \%symbp,\%maptitles,\%uris,
2180: \%keyorder,\%defkeytype);
2181:
2182: # Menu to select levels, etc
2183:
2184: $r->print('<table border="1"><tr><td>');
2185: &levelmenu($r,\%alllevs,$parmlev);
2186: if ($parmlev ne 'general') {
2187: $r->print('<td>');
2188: &mapmenu($r,\%allmaps,$pschp,\%maptitles);
2189: $r->print('</td>');
2190: }
2191: $r->print('</td></tr></table>');
2192:
2193: $r->print('<table border="1"><tr><td>');
2194: &parmmenu($r,\%allparms,\@pscat,\%keyorder);
2195: $r->print('</td><td>');
2196: &partmenu($r,\%allparts,\@psprt);
2197: $r->print('</td><td>');
2198: §ionmenu($r,\@selected_sections);
1.212 www 2199: $r->print('</td></tr></table>'.
2200: '<p><input type="submit" name="dis" value="'.&mt('Display').'" /></p>');
1.211 www 2201:
2202: # Build the list data hash from the specified parms
2203:
2204: my $listdata;
2205: %{$listdata}=();
2206:
2207: foreach my $cat (@pscat) {
2208: foreach my $section (@selected_sections) {
2209: foreach my $part (@psprt) {
1.212 www 2210: my $rootparmkey=$env{'request.course.id'};
1.211 www 2211: if (($section ne 'all') && ($section ne 'none') && ($section)) {
1.212 www 2212: $rootparmkey.='.['.$section.']';
1.211 www 2213: }
2214: if ($parmlev eq 'general') {
2215: # course-level parameter
1.212 www 2216: my $newparmkey=$rootparmkey.'.'.$part.'.'.$cat;
2217: $$listdata{$newparmkey}=1;
2218: $$listdata{$newparmkey.'.type'}=$defkeytype{$cat};
1.211 www 2219: } elsif ($parmlev eq 'map') {
1.212 www 2220: # map-level parameter
2221: foreach my $mapid (keys %allmaps) {
2222: if (($pschp ne 'all') && ($pschp ne $mapid)) { next; }
2223: my $newparmkey=$rootparmkey.'.'.$allmaps{$mapid}.'___(all).'.$part.'.'.$cat;
1.211 www 2224: $$listdata{$newparmkey}=1;
2225: $$listdata{$newparmkey.'.type'}=$defkeytype{$cat};
2226: }
2227: } else {
2228: # resource-level parameter
1.212 www 2229: foreach my $rid (@ids) {
2230: my ($map,$resid,$url)=&Apache::lonnet::decode_symb($symbp{$rid});
2231: if (($pschp ne 'all') && ($allmaps{$pschp} ne $map)) { next; }
2232: my $newparmkey=$rootparmkey.'.'.$symbp{$rid}.'.'.$part.'.'.$cat;
2233: $$listdata{$newparmkey}=1;
2234: $$listdata{$newparmkey.'.type'}=$defkeytype{$cat};
2235: }
1.211 www 2236: }
2237: }
2238: }
2239: }
2240:
1.212 www 2241: if (($env{'form.store'}) || ($env{'form.dis'})) {
1.211 www 2242:
1.212 www 2243: if ($env{'form.store'}) { &storedata($r,$crs,$dom); }
1.211 www 2244:
2245: # Read modified data
2246:
2247: my $resourcedata=&readdata($crs,$dom);
2248:
2249: # List data
2250:
2251: &listdata($r,$resourcedata,$listdata);
2252: }
2253: $r->print(&tableend().
1.212 www 2254: ((($env{'form.store'}) || ($env{'form.dis'}))?'<p><input type="submit" name="store" value="'.&mt('Store').'" /></p>':'').
2255: '</form></body></html>');
1.208 www 2256: }
2257:
2258: sub overview {
2259: my $r=shift;
2260: my $bodytag=&Apache::loncommon::bodytag(
2261: 'Modify Course Assessment Parameters');
2262: my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
2263: my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
2264: my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs(undef,'Overview');
2265: my $html=&Apache::lonxml::xmlbegin();
2266: $r->print(<<ENDOVER);
2267: $html
2268: <head>
2269: <title>LON-CAPA Parameters</title>
2270: </head>
2271: $bodytag
2272: $breadcrumbs
2273: <form method="post" action="/adm/parmset?action=setoverview" name="overviewform">
2274: ENDOVER
2275: # Store modified
2276:
2277: &storedata($r,$crs,$dom);
2278:
2279: # Read modified data
2280:
2281: my $resourcedata=&readdata($crs,$dom);
2282:
2283: # List data
2284:
2285: my $foundkeys=&listdata($r,$resourcedata,$resourcedata);
2286:
1.145 www 2287: $r->print(&tableend().'<p>'.
1.208 www 2288: ($foundkeys?'<input type="submit" value="'.&mt('Modify Parameters').'" />':&mt('There are no parameters.')).'</p></form></body></html>');
1.120 www 2289: }
1.121 www 2290:
1.59 matthew 2291: ##################################################
2292: ##################################################
1.178 raeburn 2293:
2294: =pod
2295:
2296: =item change clone
2297:
2298: Modifies the list of courses a user can clone (stored
2299: in the user's environemnt.db file), called when a
2300: change is made to the list of users allowed to clone
2301: a course.
2302:
2303: Inputs: $action,$cloner
2304: where $action is add or drop, and $cloner is identity of
2305: user for whom cloning ability is to be changed in course.
2306:
2307: Returns:
2308:
2309: =cut
2310:
2311: ##################################################
2312: ##################################################
2313:
2314:
2315: sub change_clone {
2316: my ($clonelist,$oldcloner) = @_;
2317: my ($uname,$udom);
1.190 albertel 2318: my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
2319: my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
1.178 raeburn 2320: my $clone_crs = $cnum.':'.$cdom;
2321:
2322: if ($cnum && $cdom) {
2323: my @allowclone = ();
2324: if ($clonelist =~ /,/) {
2325: @allowclone = split/,/,$clonelist;
2326: } else {
2327: $allowclone[0] = $clonelist;
2328: }
2329: foreach my $currclone (@allowclone) {
2330: if (!grep/^$currclone$/,@$oldcloner) {
2331: ($uname,$udom) = split/:/,$currclone;
2332: if ($uname && $udom) {
2333: unless (&Apache::lonnet::homeserver($uname,$udom) eq 'no_host') {
2334: my %currclonecrs = &Apache::lonnet::dump('environment',$udom,$uname,'cloneable');
2335: if ($currclonecrs{'cloneable'} !~ /\Q$clone_crs\E/) {
2336: if ($currclonecrs{'cloneable'} eq '') {
2337: $currclonecrs{'cloneable'} = $clone_crs;
2338: } else {
2339: $currclonecrs{'cloneable'} .= ','.$clone_crs;
2340: }
2341: &Apache::lonnet::put('environment',\%currclonecrs,$udom,$uname);
2342: }
2343: }
2344: }
2345: }
2346: }
2347: foreach my $oldclone (@$oldcloner) {
2348: if (!grep/^$oldclone$/,@allowclone) {
2349: ($uname,$udom) = split/:/,$oldclone;
2350: if ($uname && $udom) {
2351: unless (&Apache::lonnet::homeserver($uname,$udom) eq 'no_host') {
2352: my %currclonecrs = &Apache::lonnet::dump('environment',$udom,$uname,'cloneable');
2353: my %newclonecrs = ();
2354: if ($currclonecrs{'cloneable'} =~ /\Q$clone_crs\E/) {
2355: if ($currclonecrs{'cloneable'} =~ /,/) {
2356: my @currclonecrs = split/,/,$currclonecrs{'cloneable'};
2357: foreach (@currclonecrs) {
2358: unless ($_ eq $clone_crs) {
2359: $newclonecrs{'cloneable'} .= $_.',';
2360: }
2361: }
2362: $newclonecrs{'cloneable'} =~ s/,$//;
2363: } else {
2364: $newclonecrs{'cloneable'} = '';
2365: }
2366: &Apache::lonnet::put('environment',\%newclonecrs,$udom,$uname);
2367: }
2368: }
2369: }
2370: }
2371: }
2372: }
2373: }
2374:
1.193 albertel 2375:
2376: ##################################################
2377: ##################################################
2378:
2379: =pod
2380:
2381: =item * header
2382:
2383: Output html header for page
2384:
2385: =cut
2386:
2387: ##################################################
2388: ##################################################
2389: sub header {
2390: my $html=&Apache::lonxml::xmlbegin();
2391: my $bodytag=&Apache::loncommon::bodytag('Parameter Manager');
2392: my $title = &mt('LON-CAPA Parameter Manager');
2393: return(<<ENDHEAD);
2394: $html
2395: <head>
2396: <title>$title</title>
2397: </head>
2398: $bodytag
2399: ENDHEAD
2400: }
2401: ##################################################
2402: ##################################################
2403: sub print_main_menu {
2404: my ($r,$parm_permission)=@_;
2405: #
2406: $r->print(<<ENDMAINFORMHEAD);
2407: <form method="post" enctype="multipart/form-data"
2408: action="/adm/parmset" name="studentform">
2409: ENDMAINFORMHEAD
2410: #
1.195 albertel 2411: my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
2412: my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
1.193 albertel 2413: my @menu =
2414: (
2415: { text => 'Set Course Environment Parameters',
1.204 www 2416: action => 'crsenv',
1.193 albertel 2417: permission => $parm_permission,
2418: },
2419: { text => 'Set/Modify Course Assessment Parameters - Helper Mode',
2420: url => '/adm/helper/parameter.helper',
2421: permission => $parm_permission,
2422: },
2423: { text => 'Modify Course Assessment Parameters - Overview Mode',
2424: action => 'setoverview',
2425: permission => $parm_permission,
1.208 www 2426: },
2427: { text => 'Set Course Assessment Parameters - Overview Mode',
2428: action => 'newoverview',
2429: permission => $parm_permission,
1.193 albertel 2430: },
2431: { text => 'Set/Modify Course Assessment Parameters - Table Mode',
2432: action => 'settable',
2433: permission => $parm_permission,
1.204 www 2434: help => 'Cascading_Parameters',
1.193 albertel 2435: },
2436: # { text => 'Set Parameter Default Preferences',
2437: # help => 'Course_View_Class_List',
2438: # action => 'setdefaults',
2439: # permission => $parm_permission,
2440: # },
2441: );
2442: my $menu_html = '';
2443: foreach my $menu_item (@menu) {
2444: next if (! $menu_item->{'permission'});
2445: $menu_html.='<p>';
2446: $menu_html.='<font size="+1">';
2447: if (exists($menu_item->{'url'})) {
2448: $menu_html.=qq{<a href="$menu_item->{'url'}">};
2449: } else {
2450: $menu_html.=
2451: qq{<a href="/adm/parmset?action=$menu_item->{'action'}">};
2452: }
2453: $menu_html.= &mt($menu_item->{'text'}).'</a></font>';
2454: if (exists($menu_item->{'help'})) {
2455: $menu_html.=
2456: &Apache::loncommon::help_open_topic($menu_item->{'help'});
2457: }
2458: $menu_html.='</p>'.$/;
2459: }
2460: $r->print($menu_html);
2461: return;
2462: }
2463:
2464:
2465:
2466:
1.178 raeburn 2467: ##################################################
2468: ##################################################
1.30 www 2469:
1.59 matthew 2470: =pod
2471:
1.83 bowersj2 2472: =item * handler
1.59 matthew 2473:
2474: Main handler. Calls &assessparms and &crsenv subroutines.
2475:
2476: =cut
2477: ##################################################
2478: ##################################################
1.85 bowersj2 2479: use Data::Dumper;
1.30 www 2480: sub handler {
1.43 albertel 2481: my $r=shift;
1.30 www 2482:
1.43 albertel 2483: if ($r->header_only) {
1.126 www 2484: &Apache::loncommon::content_type($r,'text/html');
1.43 albertel 2485: $r->send_http_header;
2486: return OK;
2487: }
1.193 albertel 2488: &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
1.205 www 2489: ['action','state',
2490: 'pres_marker',
2491: 'pres_value',
1.206 www 2492: 'pres_type',
2493: 'udom','uname']);
1.131 www 2494:
1.83 bowersj2 2495:
1.193 albertel 2496: &Apache::lonhtmlcommon::clear_breadcrumbs();
1.194 albertel 2497: &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/parmset",
2498: text=>"Parameter Manager",
1.204 www 2499: faq=>10,
1.194 albertel 2500: bug=>'Instructor Interface'});
1.203 www 2501:
1.30 www 2502: # ----------------------------------------------------- Needs to be in a course
1.194 albertel 2503: my $parm_permission =
2504: (&Apache::lonnet::allowed('opa',$env{'request.course.id'}) ||
1.190 albertel 2505: &Apache::lonnet::allowed('opa',$env{'request.course.id'}.'/'.
1.193 albertel 2506: $env{'request.course.sec'}));
1.194 albertel 2507: if ($env{'request.course.id'} && $parm_permission) {
1.193 albertel 2508:
2509: # Start Page
1.126 www 2510: &Apache::loncommon::content_type($r,'text/html');
1.106 www 2511: $r->send_http_header;
1.30 www 2512:
1.203 www 2513:
2514: # id numbers can change on re-ordering of folders
2515:
2516: &resetsymbcache();
2517:
1.193 albertel 2518: #
2519: # Main switch on form.action and form.state, as appropriate
2520: #
2521: # Check first if coming from someone else headed directly for
2522: # the table mode
2523: if ((($env{'form.command'} eq 'set') && ($env{'form.url'})
2524: && (!$env{'form.dis'})) || ($env{'form.symb'})) {
2525: &assessparms($r);
2526:
2527: } elsif (! exists($env{'form.action'})) {
2528: $r->print(&header());
1.194 albertel 2529: $r->print(&Apache::lonhtmlcommon::breadcrumbs(undef,
2530: 'Parameter Manager'));
1.193 albertel 2531: &print_main_menu($r,$parm_permission);
2532: } elsif ($env{'form.action'} eq 'crsenv' && $parm_permission) {
1.194 albertel 2533: &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=crsenv',
2534: text=>"Course Environment"});
2535: $r->print(&Apache::lonhtmlcommon::breadcrumbs(undef,
2536: 'Edit Course Environment'));
1.193 albertel 2537: &crsenv($r);
2538: } elsif ($env{'form.action'} eq 'setoverview' && $parm_permission) {
1.194 albertel 2539: &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview',
2540: text=>"Overview Mode"});
1.121 www 2541: &overview($r);
1.208 www 2542: } elsif ($env{'form.action'} eq 'newoverview' && $parm_permission) {
2543: &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview',
2544: text=>"Overview Mode"});
2545: &newoverview($r);
1.193 albertel 2546: } elsif ($env{'form.action'} eq 'settable' && $parm_permission) {
1.194 albertel 2547: &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=settable',
1.204 www 2548: text=>"Table Mode",
2549: help => 'Course_Setting_Parameters'});
1.121 www 2550: &assessparms($r);
1.193 albertel 2551: }
2552:
1.43 albertel 2553: } else {
1.1 www 2554: # ----------------------------- Not in a course, or not allowed to modify parms
1.190 albertel 2555: $env{'user.error.msg'}=
1.43 albertel 2556: "/adm/parmset:opa:0:0:Cannot modify assessment parameters";
2557: return HTTP_NOT_ACCEPTABLE;
2558: }
2559: return OK;
1.1 www 2560: }
2561:
2562: 1;
2563: __END__
2564:
1.59 matthew 2565: =pod
1.38 harris41 2566:
2567: =back
2568:
2569: =cut
1.1 www 2570:
2571:
2572:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>