Annotation of loncom/interface/lonparmset.pm, revision 1.212
1.1 www 1: # The LearningOnline Network with CAPA
2: # Handler to set parameters for assessments
3: #
1.212 ! www 4: # $Id: lonparmset.pm,v 1.211 2005/06/06 02:25:09 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+$//;
406: } elsif ($type=~/^date/) {
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) {
437: if ($type=~/^date/) {
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:
745: sub parmmenu {
1.211 www 746: my ($r,$allparms,$pscat,$keyorder)=@_;
1.208 www 747: my $tempkey;
748: $r->print(<<ENDSCRIPT);
749: <script type="text/javascript">
750: function checkall(value, checkName) {
751: for (i=0; i<document.forms.parmform.elements.length; i++) {
752: ele = document.forms.parmform.elements[i];
753: if (ele.name == checkName) {
754: document.forms.parmform.elements[i].checked=value;
755: }
756: }
757: }
1.210 www 758:
759: function checkthis(thisvalue, checkName) {
760: for (i=0; i<document.forms.parmform.elements.length; i++) {
761: ele = document.forms.parmform.elements[i];
762: if (ele.name == checkName) {
763: if (ele.value == thisvalue) {
764: document.forms.parmform.elements[i].checked=true;
765: }
766: }
767: }
768: }
769:
770: function checkdates() {
771: checkthis('duedate','pscat');
772: checkthis('opendate','pscat');
773: checkthis('answerdate','pscat');
774: checkthis('interval','pscat');
775: }
776:
777: function checkvisi() {
778: checkthis('hiddenresource','pscat');
779: checkthis('encrypturl','pscat');
780: checkthis('problemstatus','pscat');
781: checkthis('contentopen','pscat');
782: checkthis('opendate','pscat');
783: }
784:
785: function checkparts() {
786: checkthis('hiddenparts','pscat');
787: checkthis('display','pscat');
788: checkthis('ordered','pscat');
789: }
790:
791: function checkstandard() {
792: checkall(false,'pscat');
793: checkdates();
794: checkthis('weight','pscat');
795: checkthis('maxtries','pscat');
796: }
797:
1.208 www 798: </script>
799: ENDSCRIPT
1.209 www 800: $r->print();
1.208 www 801: $r->print("\n<table><tr>");
802: my $cnt=0;
1.211 www 803: foreach $tempkey (&keysindisplayorder($allparms,$keyorder)) {
1.209 www 804: $r->print("\n<td><font size='-1'><input type='checkbox' name='pscat' ");
1.208 www 805: $r->print('value="'.$tempkey.'"');
806: if ($$pscat[0] eq "all" || grep $_ eq $tempkey, @{$pscat}) {
807: $r->print(' checked');
808: }
1.209 www 809: $r->print('>'.$$allparms{$tempkey}.'</font></td>');
810: $cnt++;
811: if ($cnt==3) {
812: $r->print("</tr>\n<tr>");
813: $cnt=0;
814: }
1.208 www 815: }
816: $r->print('
817: </tr><tr><td>
1.210 www 818: <a href="javascript:checkall(true, \'pscat\')">Select All</a>
819: <a href="javascript:checkstandard()">Select Standard</a>
820: </td><td>
821: <a href="javascript:checkdates()">Select Dates</a>
822: <a href="javascript:checkvisi()">Select Visibilities</a>
823: <a href="javascript:checkparts()">Select Part Parameters</a>
824: </td><td>
825: <a href="javascript:checkall(false, \'pscat\')">Unselect All</a>
1.208 www 826: </td>
827: ');
828: $r->print('</tr></table>');
829: }
830:
1.209 www 831: sub partmenu {
832: my ($r,$allparts,$psprt)=@_;
1.211 www 833: $r->print('<select multiple name="psprt" size="8">');
1.208 www 834: $r->print('<option value="all"');
835: $r->print(' selected') unless (@{$psprt});
836: $r->print('>'.&mt('All Parts').'</option>');
837: my %temphash=();
838: foreach (@{$psprt}) { $temphash{$_}=1; }
1.209 www 839: foreach my $tempkey (sort keys %{$allparts}) {
1.208 www 840: unless ($tempkey =~ /\./) {
841: $r->print('<option value="'.$tempkey.'"');
842: if ($$psprt[0] eq "all" || $temphash{$tempkey}) {
843: $r->print(' selected');
844: }
845: $r->print('>'.$$allparts{$tempkey}.'</option>');
846: }
847: }
1.209 www 848: $r->print('</select>');
849: }
850:
851: sub usermenu {
852: my ($r,$uname,$id,$udom,$csec)=@_;
853: my $chooseopt=&Apache::loncommon::select_dom_form($udom,'udom').' '.
854: &Apache::loncommon::selectstudent_link('parmform','uname','udom');
855: my $selscript=&Apache::loncommon::studentbrowser_javascript();
856: my %lt=&Apache::lonlocal::texthash(
857: 'sg' => "Section/Group",
858: 'fu' => "For User",
859: 'oi' => "or ID",
860: 'ad' => "at Domain"
861: );
862: my %sectionhash=();
863: my $sections='';
864: if (&Apache::loncommon::get_sections(
865: $env{'course.'.$env{'request.course.id'}.'.domain'},
866: $env{'course.'.$env{'request.course.id'}.'.num'},
867: \%sectionhash)) {
868: $sections=$lt{'sg'}.': <select name="csec">';
869: foreach ('',sort keys %sectionhash) {
870: $sections.='<option value="'.$_.'"'.
871: ($_ eq $csec?'selected="selected"':'').'>'.$_.'</option>';
872: }
873: $sections.='</select>';
874: }
875: $r->print(<<ENDMENU);
876: <b>
877: $sections
878: <br />
879: $lt{'fu'}
880: <input type="text" value="$uname" size="12" name="uname" />
881: $lt{'oi'}
882: <input type="text" value="$id" size="12" name="id" />
883: $lt{'ad'}
884: $chooseopt
885: </b>
886: ENDMENU
887: }
888:
889: sub displaymenu {
1.211 www 890: my ($r,$allparms,$allparts,$pscat,$psprt,$keyorder)=@_;
1.209 www 891: $r->print('<table border="1"><tr><th>'.&mt('Select Parameters to View').'</th><th>'.
892: &mt('Select Parts to View').'</th></tr><tr><td>');
1.211 www 893: &parmmenu($r,$allparms,$pscat,$keyorder);
1.209 www 894: $r->print('</td><td>');
895: &partmenu($r,$allparts,$psprt);
896: $r->print('</td></tr></table>');
897: }
898:
899: sub mapmenu {
900: my ($r,$allmaps,$pschp,$maptitles)=@_;
901: $r->print(&mt('Select Enclosing Map or Folder').' ');
902: $r->print('<select name="pschp">');
903: $r->print('<option value="all">'.&mt('All Maps or Folders').'</option>');
904: foreach (sort {$$allmaps{$a} cmp $$allmaps{$b}} keys %{$allmaps}) {
1.208 www 905: $r->print('<option value="'.$_.'"');
1.209 www 906: if (($pschp eq $_)) { $r->print(' selected'); }
907: $r->print('>'.$$maptitles{$_}.($$allmaps{$_}!~/^uploaded/?' ['.$$allmaps{$_}.']':'').'</option>');
908: }
909: $r->print("</select>");
910: }
911:
912: sub levelmenu {
913: my ($r,$alllevs,$parmlev)=@_;
914: $r->print(&mt('Select Parameter Level').
915: &Apache::loncommon::help_open_topic('Course_Parameter_Levels').' ');
916: $r->print('<select name="parmlev">');
917: foreach (reverse sort keys %{$alllevs}) {
918: $r->print('<option value="'.$$alllevs{$_}.'"');
919: if ($parmlev eq $$alllevs{$_}) {
920: $r->print(' selected');
921: }
922: $r->print('>'.$_.'</option>');
1.208 www 923: }
1.209 www 924: $r->print("</select>");
1.208 www 925: }
926:
1.211 www 927:
928: sub sectionmenu {
929: my ($r,$selectedsections)=@_;
1.212 ! www 930: my %sectionhash=();
1.211 www 931:
1.212 ! www 932: if (&Apache::loncommon::get_sections(
! 933: $env{'course.'.$env{'request.course.id'}.'.domain'},
! 934: $env{'course.'.$env{'request.course.id'}.'.num'},
! 935: \%sectionhash)) {
! 936: $r->print('<select name="Section" multiple="true" size="8" >');
! 937: foreach my $s ('all',sort keys %sectionhash) {
! 938: $r->print(' <option value="'.$s.'"');
! 939: foreach (@{$selectedsections}) {
! 940: if ($s eq $_) {
! 941: $r->print(' selected');
! 942: last;
! 943: }
! 944: }
! 945: $r->print('>'.$s."</option>\n");
! 946: }
! 947: $r->print("</select>\n");
1.211 www 948: }
949: }
950:
1.210 www 951: sub keysplit {
952: my $keyp=shift;
953: return (split(/\,/,$keyp));
954: }
955:
956: sub keysinorder {
957: my ($name,$keyorder)=@_;
958: return sort {
959: $$keyorder{$a} <=> $$keyorder{$b};
960: } (keys %{$name});
961: }
962:
1.211 www 963: sub keysindisplayorder {
964: my ($name,$keyorder)=@_;
965: return sort {
966: $$keyorder{'parameter_0_'.$a} <=> $$keyorder{'parameter_0_'.$b};
967: } (keys %{$name});
968: }
969:
970: sub standardkeyorder {
971: return ('parameter_0_opendate' => 1,
972: 'parameter_0_duedate' => 2,
973: 'parameter_0_answerdate' => 3,
974: 'parameter_0_interval' => 4,
975: 'parameter_0_weight' => 5,
976: 'parameter_0_maxtries' => 6,
977: 'parameter_0_hinttries' => 7,
978: 'parameter_0_contentopen' => 8,
979: 'parameter_0_contentclose' => 9,
980: 'parameter_0_type' => 10,
981: 'parameter_0_problemstatus' => 11,
982: 'parameter_0_hiddenresource' => 12,
983: 'parameter_0_hiddenparts' => 13,
984: 'parameter_0_display' => 14,
985: 'parameter_0_ordered' => 15,
986: 'parameter_0_tol' => 16,
987: 'parameter_0_sig' => 17,
988: 'parameter_0_turnoffunit' => 18);
989: }
990:
1.59 matthew 991: ##################################################
992: ##################################################
993:
994: =pod
995:
996: =item assessparms
997:
998: Show assessment data and parameters. This is a large routine that should
999: be simplified and shortened... someday.
1000:
1001: Inputs: $r
1002:
1003: Returns: nothing
1004:
1.63 bowersj2 1005: Variables used (guessed by Jeremy):
1006:
1007: =over 4
1008:
1009: =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.
1010:
1011: =item B<psprt>: ParameterS PaRTs? a list of the parts of a problem that we are displaying? Used to display only selected parts?
1012:
1013: =item B<allmaps>:
1014:
1015: =back
1016:
1.59 matthew 1017: =cut
1018:
1019: ##################################################
1020: ##################################################
1.30 www 1021: sub assessparms {
1.1 www 1022:
1.43 albertel 1023: my $r=shift;
1.201 www 1024:
1025: my @ids=();
1026: my %symbp=();
1027: my %mapp=();
1028: my %typep=();
1029: my %keyp=();
1030: my %uris=();
1031: my %maptitles=();
1032:
1.2 www 1033: # -------------------------------------------------------- Variable declaration
1.209 www 1034:
1.129 www 1035: my %allmaps=();
1036: my %alllevs=();
1.57 albertel 1037:
1.187 www 1038: my $uname;
1039: my $udom;
1040: my $uhome;
1041: my $csec;
1042:
1.190 albertel 1043: my $coursename=$env{'course.'.$env{'request.course.id'}.'.description'};
1.187 www 1044:
1.57 albertel 1045: $alllevs{'Resource Level'}='full';
1046: $alllevs{'Map Level'}='map';
1047: $alllevs{'Course Level'}='general';
1048:
1049: my %allparms;
1050: my %allparts;
1.210 www 1051: #
1052: # Order in which these parameters will be displayed
1053: #
1.211 www 1054: my %keyorder=&standardkeyorder();
1055:
1.43 albertel 1056: @ids=();
1057: %symbp=();
1058: %typep=();
1059:
1060: my $message='';
1061:
1.190 albertel 1062: $csec=$env{'form.csec'};
1.188 www 1063:
1.190 albertel 1064: if ($udom=$env{'form.udom'}) {
1065: } elsif ($udom=$env{'request.role.domain'}) {
1066: } elsif ($udom=$env{'user.domain'}) {
1.172 albertel 1067: } else {
1068: $udom=$r->dir_config('lonDefDomain');
1069: }
1.43 albertel 1070:
1.134 albertel 1071: my @pscat=&Apache::loncommon::get_env_multiple('form.pscat');
1.190 albertel 1072: my $pschp=$env{'form.pschp'};
1.134 albertel 1073: my @psprt=&Apache::loncommon::get_env_multiple('form.psprt');
1.76 www 1074: if (!@psprt) { $psprt[0]='0'; }
1.57 albertel 1075:
1.43 albertel 1076: my $pssymb='';
1.57 albertel 1077: my $parmlev='';
1078:
1.190 albertel 1079: unless ($env{'form.parmlev'}) {
1.57 albertel 1080: $parmlev = 'map';
1081: } else {
1.190 albertel 1082: $parmlev = $env{'form.parmlev'};
1.57 albertel 1083: }
1.26 www 1084:
1.29 www 1085: # ----------------------------------------------- Was this started from grades?
1086:
1.190 albertel 1087: if (($env{'form.command'} eq 'set') && ($env{'form.url'})
1088: && (!$env{'form.dis'})) {
1089: my $url=$env{'form.url'};
1.194 albertel 1090: $url=~s-^http://($ENV{'SERVER_NAME'}|$ENV{'HTTP_HOST'})--;
1.43 albertel 1091: $pssymb=&Apache::lonnet::symbread($url);
1.92 albertel 1092: if (!@pscat) { @pscat=('all'); }
1.43 albertel 1093: $pschp='';
1.57 albertel 1094: $parmlev = 'full';
1.190 albertel 1095: } elsif ($env{'form.symb'}) {
1096: $pssymb=$env{'form.symb'};
1.92 albertel 1097: if (!@pscat) { @pscat=('all'); }
1.43 albertel 1098: $pschp='';
1.57 albertel 1099: $parmlev = 'full';
1.43 albertel 1100: } else {
1.190 albertel 1101: $env{'form.url'}='';
1.43 albertel 1102: }
1103:
1.190 albertel 1104: my $id=$env{'form.id'};
1.43 albertel 1105: if (($id) && ($udom)) {
1106: $uname=(&Apache::lonnet::idget($udom,$id))[1];
1107: if ($uname) {
1108: $id='';
1109: } else {
1110: $message=
1.133 www 1111: "<font color=red>".&mt("Unknown ID")." '$id' ".
1112: &mt('at domain')." '$udom'</font>";
1.43 albertel 1113: }
1114: } else {
1.190 albertel 1115: $uname=$env{'form.uname'};
1.43 albertel 1116: }
1117: unless ($udom) { $uname=''; }
1118: $uhome='';
1119: if ($uname) {
1120: $uhome=&Apache::lonnet::homeserver($uname,$udom);
1121: if ($uhome eq 'no_host') {
1122: $message=
1.133 www 1123: "<font color=red>".&mt("Unknown user")." '$uname' ".
1124: &mt("at domain")." '$udom'</font>";
1.43 albertel 1125: $uname='';
1.12 www 1126: } else {
1.103 albertel 1127: $csec=&Apache::lonnet::getsection($udom,$uname,
1.190 albertel 1128: $env{'request.course.id'});
1.43 albertel 1129: if ($csec eq '-1') {
1130: $message="<font color=red>".
1.133 www 1131: &mt("User")." '$uname' ".&mt("at domain")." '$udom' ".
1132: &mt("not in this course")."</font>";
1.43 albertel 1133: $uname='';
1.190 albertel 1134: $csec=$env{'form.csec'};
1.43 albertel 1135: } else {
1136: my %name=&Apache::lonnet::userenvironment($udom,$uname,
1137: ('firstname','middlename','lastname','generation','id'));
1.133 www 1138: $message="\n<p>\n".&mt("Full Name").": ".
1.43 albertel 1139: $name{'firstname'}.' '.$name{'middlename'}.' '
1140: .$name{'lastname'}.' '.$name{'generation'}.
1.133 www 1141: "<br>\n".&mt('ID').": ".$name{'id'}.'<p>';
1.43 albertel 1142: }
1.12 www 1143: }
1.43 albertel 1144: }
1.2 www 1145:
1.43 albertel 1146: unless ($csec) { $csec=''; }
1.12 www 1147:
1.14 www 1148: # --------------------------------------------------------- Get all assessments
1.210 www 1149: &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps,
1150: \%mapp, \%symbp,\%maptitles,\%uris,
1151: \%keyorder);
1.63 bowersj2 1152:
1.57 albertel 1153: $mapp{'0.0'} = '';
1154: $symbp{'0.0'} = '';
1.99 albertel 1155:
1.14 www 1156: # ---------------------------------------------------------- Anything to store?
1.190 albertel 1157: if ($env{'form.pres_marker'}) {
1.205 www 1158: my @markers=split(/\&\&\&/,$env{'form.pres_marker'});
1159: my @values=split(/\&\&\&/,$env{'form.pres_value'});
1160: my @types=split(/\&\&\&/,$env{'form.pres_type'});
1161: for (my $i=0;$i<=$#markers;$i++) {
1162: $message.=&storeparm(split(/\&/,$markers[$i]),
1163: $values[$i],
1164: $types[$i],
1165: $uname,$udom,$csec);
1166: }
1.68 www 1167: # ---------------------------------------------------------------- Done storing
1.130 www 1168: $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 1169: }
1.57 albertel 1170: #----------------------------------------------- if all selected, fill in array
1.209 www 1171: if ($pscat[0] eq "all") {@pscat = (keys %allparms);}
1172: if (!@pscat) { @pscat=('duedate','opendate','answerdate','weight','maxtries') };
1.57 albertel 1173: if ($psprt[0] eq "all" || !@psprt) {@psprt = (keys %allparts);}
1.2 www 1174: # ------------------------------------------------------------------ Start page
1.63 bowersj2 1175:
1.209 www 1176: &startpage($r);
1.57 albertel 1177:
1.44 albertel 1178: foreach ('tolerance','date_default','date_start','date_end',
1179: 'date_interval','int','float','string') {
1180: $r->print('<input type="hidden" value="'.
1.190 albertel 1181: $env{'form.recent_'.$_}.'" name="recent_'.$_.'">');
1.44 albertel 1182: }
1.57 albertel 1183:
1.44 albertel 1184: if (!$pssymb) {
1.209 www 1185: $r->print('<table border="1"><tr><td>');
1186: &levelmenu($r,\%alllevs,$parmlev);
1.128 albertel 1187: if ($parmlev ne 'general') {
1.209 www 1188: $r->print('<td>');
1189: &mapmenu($r,\%allmaps,$pschp,\%maptitles);
1190: $r->print('</td>');
1.128 albertel 1191: }
1.209 www 1192: $r->print('</td></tr></table>');
1.211 www 1193: &displaymenu($r,\%allparms,\%allparts,\@pscat,\@psprt,\%keyorder);
1.44 albertel 1194: } else {
1.125 www 1195: my ($map,$id,$resource)=&Apache::lonnet::decode_symb($pssymb);
1.209 www 1196: $r->print(&mt('Specific Resource').": ".$resource.
1.212 ! www 1197: '<input type="hidden" value="'.$pssymb.'" name="symb"><br />');
1.57 albertel 1198: }
1.209 www 1199: &usermenu($r,$uname,$id,$udom,$csec);
1.57 albertel 1200:
1.210 www 1201: $r->print('<p>'.$message.'</p>');
1202:
1.209 www 1203: $r->print('<br /><input type="submit" name="dis" value="'.&mt("Update Parameter Display").'" />');
1.57 albertel 1204:
1205: my @temp_pscat;
1206: map {
1207: my $cat = $_;
1208: push(@temp_pscat, map { $_.'.'.$cat } @psprt);
1209: } @pscat;
1210:
1211: @pscat = @temp_pscat;
1212:
1.209 www 1213: if (($env{'form.prevvisit'}) || ($pschp) || ($pssymb)) {
1.10 www 1214: # ----------------------------------------------------------------- Start Table
1.57 albertel 1215: my @catmarker=map { tr|.|_|; 'parameter_'.$_; } @pscat;
1.190 albertel 1216: my $csuname=$env{'user.name'};
1217: my $csudom=$env{'user.domain'};
1.57 albertel 1218:
1.203 www 1219: if ($parmlev eq 'full') {
1.57 albertel 1220: my $coursespan=$csec?8:5;
1221: $r->print('<p><table border=2>');
1222: $r->print('<tr><td colspan=5></td>');
1.130 www 1223: $r->print('<th colspan='.($coursespan).'>'.&mt('Any User').'</th>');
1.57 albertel 1224: if ($uname) {
1225: $r->print("<th colspan=3 rowspan=2>");
1.130 www 1226: $r->print(&mt("User")." $uname ".&mt('at Domain')." $udom</th>");
1.57 albertel 1227: }
1.133 www 1228: my %lt=&Apache::lonlocal::texthash(
1229: 'pie' => "Parameter in Effect",
1230: 'csv' => "Current Session Value",
1231: 'at' => 'at',
1232: 'rl' => "Resource Level",
1233: 'ic' => 'in Course',
1234: 'aut' => "Assessment URL and Title",
1.143 albertel 1235: 'type' => 'Type',
1.133 www 1236: 'emof' => "Enclosing Map or Folder",
1.143 albertel 1237: 'part' => 'Part',
1.133 www 1238: 'pn' => 'Parameter Name',
1239: 'def' => 'default',
1240: 'femof' => 'from Enclosing Map or Folder',
1241: 'gen' => 'general',
1242: 'foremf' => 'for Enclosing Map or Folder',
1243: 'fr' => 'for Resource'
1244: );
1.57 albertel 1245: $r->print(<<ENDTABLETWO);
1.133 www 1246: <th rowspan=3>$lt{'pie'}</th>
1247: <th rowspan=3>$lt{'csv'}<br>($csuname $lt{'at'} $csudom)</th>
1.182 albertel 1248: </tr><tr><td colspan=5></td><th colspan=2>$lt{'ic'}</th><th colspan=2>$lt{'rl'}</th>
1249: <th colspan=1>$lt{'ic'}</th>
1250:
1.10 www 1251: ENDTABLETWO
1.57 albertel 1252: if ($csec) {
1.133 www 1253: $r->print("<th colspan=3>".
1254: &mt("in Section/Group")." $csec</th>");
1.57 albertel 1255: }
1256: $r->print(<<ENDTABLEHEADFOUR);
1.133 www 1257: </tr><tr><th>$lt{'aut'}</th><th>$lt{'type'}</th>
1258: <th>$lt{'emof'}</th><th>$lt{'part'}</th><th>$lt{'pn'}</th>
1.192 albertel 1259: <th>$lt{'gen'}</th><th>$lt{'foremf'}</th>
1260: <th>$lt{'def'}</th><th>$lt{'femof'}</th><th>$lt{'fr'}</th>
1.10 www 1261: ENDTABLEHEADFOUR
1.57 albertel 1262:
1263: if ($csec) {
1.130 www 1264: $r->print('<th>'.&mt('general').'</th><th>'.&mt('for Enclosing Map or Folder').'</th><th>'.&mt('for Resource').'</th>');
1.57 albertel 1265: }
1266:
1267: if ($uname) {
1.130 www 1268: $r->print('<th>'.&mt('general').'</th><th>'.&mt('for Enclosing Map or Folder').'</th><th>'.&mt('for Resource').'</th>');
1.57 albertel 1269: }
1270:
1271: $r->print('</tr>');
1272:
1273: my $defbgone='';
1274: my $defbgtwo='';
1275:
1276: foreach (@ids) {
1277:
1278: my $rid=$_;
1279: my ($inmapid)=($rid=~/\.(\d+)$/);
1280:
1.152 albertel 1281: if ((!$pssymb &&
1282: (($pschp eq 'all') || ($allmaps{$pschp} eq $mapp{$rid})))
1283: ||
1284: ($pssymb && $pssymb eq $symbp{$rid})) {
1.4 www 1285: # ------------------------------------------------------ Entry for one resource
1.184 albertel 1286: if ($defbgone eq '"#E0E099"') {
1287: $defbgone='"#E0E0DD"';
1.57 albertel 1288: } else {
1.184 albertel 1289: $defbgone='"#E0E099"';
1.57 albertel 1290: }
1.184 albertel 1291: if ($defbgtwo eq '"#FFFF99"') {
1292: $defbgtwo='"#FFFFDD"';
1.57 albertel 1293: } else {
1.184 albertel 1294: $defbgtwo='"#FFFF99"';
1.57 albertel 1295: }
1296: my $thistitle='';
1297: my %name= ();
1298: undef %name;
1299: my %part= ();
1300: my %display=();
1301: my %type= ();
1302: my %default=();
1.196 www 1303: my $uri=&Apache::lonnet::declutter($uris{$rid});
1.57 albertel 1304:
1.210 www 1305: foreach (&keysplit($keyp{$rid})) {
1.57 albertel 1306: my $tempkeyp = $_;
1307: if (grep $_ eq $tempkeyp, @catmarker) {
1308: $part{$_}=&Apache::lonnet::metadata($uri,$_.'.part');
1309: $name{$_}=&Apache::lonnet::metadata($uri,$_.'.name');
1310: $display{$_}=&Apache::lonnet::metadata($uri,$_.'.display');
1311: unless ($display{$_}) { $display{$_}=''; }
1312: $display{$_}.=' ('.$name{$_}.')';
1313: $default{$_}=&Apache::lonnet::metadata($uri,$_);
1314: $type{$_}=&Apache::lonnet::metadata($uri,$_.'.type');
1315: $thistitle=&Apache::lonnet::metadata($uri,$_.'.title');
1316: }
1317: }
1318: my $totalparms=scalar keys %name;
1319: if ($totalparms>0) {
1320: my $firstrow=1;
1.180 albertel 1321: my $title=&Apache::lonnet::gettitle($uri);
1.57 albertel 1322: $r->print('<tr><td bgcolor='.$defbgone.
1323: ' rowspan='.$totalparms.
1324: '><tt><font size=-1>'.
1325: join(' / ',split(/\//,$uri)).
1326: '</font></tt><p><b>'.
1.154 albertel 1327: "<a href=\"javascript:openWindow('".
1328: &Apache::lonnet::clutter($uri).
1.57 albertel 1329: "', 'metadatafile', '450', '500', 'no', 'yes')\";".
1.127 albertel 1330: " TARGET=_self>$title");
1.57 albertel 1331:
1332: if ($thistitle) {
1333: $r->print(' ('.$thistitle.')');
1334: }
1335: $r->print('</a></b></td>');
1336: $r->print('<td bgcolor='.$defbgtwo.
1337: ' rowspan='.$totalparms.'>'.$typep{$rid}.
1338: '</td>');
1339:
1340: $r->print('<td bgcolor='.$defbgone.
1341: ' rowspan='.$totalparms.
1342: '><tt><font size=-1>');
1343:
1344: $r->print(' / res / ');
1345: $r->print(join(' / ', split(/\//,$mapp{$rid})));
1346:
1347: $r->print('</font></tt></td>');
1348:
1.210 www 1349: foreach (&keysinorder(\%name,\%keyorder)) {
1.57 albertel 1350: unless ($firstrow) {
1351: $r->print('<tr>');
1352: } else {
1353: undef $firstrow;
1354: }
1355:
1.201 www 1356: &print_row($r,$_,\%part,\%name,\%symbp,$rid,\%default,
1.57 albertel 1357: \%type,\%display,$defbgone,$defbgtwo,
1.187 www 1358: $parmlev,$uname,$udom,$csec);
1.57 albertel 1359: }
1360: }
1361: }
1362: } # end foreach ids
1.43 albertel 1363: # -------------------------------------------------- End entry for one resource
1.57 albertel 1364: $r->print('</table>');
1.203 www 1365: } # end of full
1.57 albertel 1366: #--------------------------------------------------- Entry for parm level map
1367: if ($parmlev eq 'map') {
1368: my $defbgone = '"E0E099"';
1369: my $defbgtwo = '"FFFF99"';
1370:
1371: my %maplist;
1372:
1373: if ($pschp eq 'all') {
1374: %maplist = %allmaps;
1375: } else {
1376: %maplist = ($pschp => $mapp{$pschp});
1377: }
1378:
1379: #-------------------------------------------- for each map, gather information
1380: my $mapid;
1.60 albertel 1381: foreach $mapid (sort {$maplist{$a} cmp $maplist{$b}} keys %maplist) {
1382: my $maptitle = $maplist{$mapid};
1.57 albertel 1383:
1384: #----------------------- loop through ids and get all parameter types for map
1385: #----------------------------------------- and associated information
1386: my %name = ();
1387: my %part = ();
1388: my %display = ();
1389: my %type = ();
1390: my %default = ();
1391: my $map = 0;
1392:
1393: # $r->print("Catmarker: @catmarker<br />\n");
1394:
1395: foreach (@ids) {
1396: ($map)=(/([\d]*?)\./);
1397: my $rid = $_;
1398:
1399: # $r->print("$mapid:$map: $rid <br /> \n");
1400:
1401: if ($map eq $mapid) {
1.196 www 1402: my $uri=&Apache::lonnet::declutter($uris{$rid});
1.57 albertel 1403: # $r->print("Keys: $keyp{$rid} <br />\n");
1404:
1405: #--------------------------------------------------------------------
1406: # @catmarker contains list of all possible parameters including part #s
1407: # $fullkeyp contains the full part/id # for the extraction of proper parameters
1408: # $tempkeyp contains part 0 only (no ids - ie, subparts)
1409: # When storing information, store as part 0
1410: # When requesting information, request from full part
1411: #-------------------------------------------------------------------
1.210 www 1412: foreach (&keysplit($keyp{$rid})) {
1.57 albertel 1413: my $tempkeyp = $_;
1414: my $fullkeyp = $tempkeyp;
1.73 albertel 1415: $tempkeyp =~ s/_\w+_/_0_/;
1.57 albertel 1416:
1417: if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {
1418: $part{$tempkeyp}="0";
1419: $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name');
1420: $display{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');
1421: unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; }
1422: $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')';
1.73 albertel 1423: $display{$tempkeyp} =~ s/_\w+_/_0_/;
1.57 albertel 1424: $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp);
1425: $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.type');
1426: }
1427: } # end loop through keys
1428: }
1429: } # end loop through ids
1430:
1431: #---------------------------------------------------- print header information
1.133 www 1432: my $foldermap=&mt($maptitle=~/^uploaded/?'Folder':'Map');
1.82 www 1433: my $showtitle=$maptitles{$maptitle}.($maptitle!~/^uploaded/?' ['.$maptitle.']':'');
1.57 albertel 1434: $r->print(<<ENDMAPONE);
1435: <center><h4>
1.135 albertel 1436: Set Defaults for All Resources in $foldermap<br />
1437: <font color="red"><i>$showtitle</i></font><br />
1.57 albertel 1438: Specifically for
1439: ENDMAPONE
1440: if ($uname) {
1441: my %name=&Apache::lonnet::userenvironment($udom,$uname,
1442: ('firstname','middlename','lastname','generation', 'id'));
1443: my $person=$name{'firstname'}.' '.$name{'middlename'}.' '
1444: .$name{'lastname'}.' '.$name{'generation'};
1.135 albertel 1445: $r->print(&mt("User")." <font color=\"red\"><i>$uname \($person\) </i></font> ".
1.130 www 1446: &mt('in')." \n");
1.57 albertel 1447: } else {
1.135 albertel 1448: $r->print("<font color=\"red\"><i>".&mt('all').'</i></font> '.&mt('users in')." \n");
1.57 albertel 1449: }
1450:
1.135 albertel 1451: if ($csec) {$r->print(&mt("Section")." <font color=\"red\"><i>$csec</i></font> ".
1.130 www 1452: &mt('of')." \n")};
1.57 albertel 1453:
1.135 albertel 1454: $r->print("<font color=\"red\"><i>$coursename</i></font><br />");
1455: $r->print("</h4>\n");
1.57 albertel 1456: #---------------------------------------------------------------- print table
1457: $r->print('<p><table border="2">');
1.130 www 1458: $r->print('<tr><th>'.&mt('Parameter Name').'</th>');
1459: $r->print('<th>'.&mt('Default Value').'</th>');
1460: $r->print('<th>'.&mt('Parameter in Effect').'</th></tr>');
1.57 albertel 1461:
1.210 www 1462: foreach (&keysinorder(\%name,\%keyorder)) {
1.168 matthew 1463: $r->print('<tr>');
1.201 www 1464: &print_row($r,$_,\%part,\%name,\%symbp,$mapid,\%default,
1.57 albertel 1465: \%type,\%display,$defbgone,$defbgtwo,
1.187 www 1466: $parmlev,$uname,$udom,$csec);
1.57 albertel 1467: }
1468: $r->print("</table></center>");
1469: } # end each map
1470: } # end of $parmlev eq map
1471: #--------------------------------- Entry for parm level general (Course level)
1472: if ($parmlev eq 'general') {
1473: my $defbgone = '"E0E099"';
1474: my $defbgtwo = '"FFFF99"';
1475:
1476: #-------------------------------------------- for each map, gather information
1477: my $mapid="0.0";
1478: #----------------------- loop through ids and get all parameter types for map
1479: #----------------------------------------- and associated information
1480: my %name = ();
1481: my %part = ();
1482: my %display = ();
1483: my %type = ();
1484: my %default = ();
1485:
1486: foreach (@ids) {
1487: my $rid = $_;
1488:
1.196 www 1489: my $uri=&Apache::lonnet::declutter($uris{$rid});
1.57 albertel 1490:
1491: #--------------------------------------------------------------------
1492: # @catmarker contains list of all possible parameters including part #s
1493: # $fullkeyp contains the full part/id # for the extraction of proper parameters
1494: # $tempkeyp contains part 0 only (no ids - ie, subparts)
1495: # When storing information, store as part 0
1496: # When requesting information, request from full part
1497: #-------------------------------------------------------------------
1.210 www 1498: foreach (&keysplit($keyp{$rid})) {
1.57 albertel 1499: my $tempkeyp = $_;
1500: my $fullkeyp = $tempkeyp;
1.73 albertel 1501: $tempkeyp =~ s/_\w+_/_0_/;
1.57 albertel 1502: if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {
1503: $part{$tempkeyp}="0";
1504: $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name');
1505: $display{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');
1506: unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; }
1507: $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')';
1.73 albertel 1508: $display{$tempkeyp} =~ s/_\w+_/_0_/;
1.57 albertel 1509: $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp);
1510: $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.type');
1511: }
1512: } # end loop through keys
1513: } # end loop through ids
1514:
1515: #---------------------------------------------------- print header information
1.133 www 1516: my $setdef=&mt("Set Defaults for All Resources in Course");
1.57 albertel 1517: $r->print(<<ENDMAPONE);
1.133 www 1518: <center><h4>$setdef
1.135 albertel 1519: <font color="red"><i>$coursename</i></font><br />
1.57 albertel 1520: ENDMAPONE
1521: if ($uname) {
1522: my %name=&Apache::lonnet::userenvironment($udom,$uname,
1523: ('firstname','middlename','lastname','generation', 'id'));
1524: my $person=$name{'firstname'}.' '.$name{'middlename'}.' '
1525: .$name{'lastname'}.' '.$name{'generation'};
1.135 albertel 1526: $r->print(" ".&mt("User")."<font color=\"red\"> <i>$uname \($person\) </i></font> \n");
1.57 albertel 1527: } else {
1.135 albertel 1528: $r->print("<i><font color=\"red\"> ".&mt("ALL")."</i> ".&mt("USERS")."</font> \n");
1.57 albertel 1529: }
1530:
1.135 albertel 1531: if ($csec) {$r->print(&mt("Section")."<font color=\"red\"> <i>$csec</i></font>\n")};
1532: $r->print("</h4>\n");
1.57 albertel 1533: #---------------------------------------------------------------- print table
1534: $r->print('<p><table border="2">');
1.130 www 1535: $r->print('<tr><th>'.&mt('Parameter Name').'</th>');
1536: $r->print('<th>'.&mt('Default Value').'</th>');
1537: $r->print('<th>'.&mt('Parameter in Effect').'</th></tr>');
1.57 albertel 1538:
1.210 www 1539: foreach (&keysinorder(\%name,\%keyorder)) {
1.168 matthew 1540: $r->print('<tr>');
1.201 www 1541: &print_row($r,$_,\%part,\%name,\%symbp,$mapid,\%default,
1.187 www 1542: \%type,\%display,$defbgone,$defbgtwo,$parmlev,$uname,$udom,$csec);
1.57 albertel 1543: }
1544: $r->print("</table></center>");
1545: } # end of $parmlev eq general
1.43 albertel 1546: }
1.44 albertel 1547: $r->print('</form></body></html>');
1.57 albertel 1548: } # end sub assessparms
1.30 www 1549:
1.59 matthew 1550:
1551: ##################################################
1552: ##################################################
1553:
1554: =pod
1555:
1556: =item crsenv
1557:
1.105 matthew 1558: Show and set course data and parameters. This is a large routine that should
1.59 matthew 1559: be simplified and shortened... someday.
1560:
1561: Inputs: $r
1562:
1563: Returns: nothing
1564:
1565: =cut
1566:
1567: ##################################################
1568: ##################################################
1.30 www 1569: sub crsenv {
1570: my $r=shift;
1571: my $setoutput='';
1.64 www 1572: my $bodytag=&Apache::loncommon::bodytag(
1573: 'Set Course Environment Parameters');
1.194 albertel 1574: my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs(undef,
1575: 'Edit Course Environment');
1.190 albertel 1576: my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
1577: my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.105 matthew 1578:
1579: #
1580: # Go through list of changes
1.190 albertel 1581: foreach (keys %env) {
1.105 matthew 1582: next if ($_!~/^form\.(.+)\_setparmval$/);
1583: my $name = $1;
1.190 albertel 1584: my $value = $env{'form.'.$name.'_value'};
1.105 matthew 1585: if ($name eq 'newp') {
1.190 albertel 1586: $name = $env{'form.newp_name'};
1.105 matthew 1587: }
1588: if ($name eq 'url') {
1589: $value=~s/^\/res\///;
1590: my $bkuptime=time;
1591: my @tmp = &Apache::lonnet::get
1592: ('environment',['url'],$dom,$crs);
1.130 www 1593: $setoutput.=&mt('Backing up previous URL').': '.
1.105 matthew 1594: &Apache::lonnet::put
1595: ('environment',
1596: {'top level map backup '.$bkuptime => $tmp[1] },
1597: $dom,$crs).
1598: '<br>';
1599: }
1600: #
1601: # Deal with modified default spreadsheets
1602: if ($name =~ /^spreadsheet_default_(classcalc|
1603: studentcalc|
1604: assesscalc)$/x) {
1605: my $sheettype = $1;
1606: if ($sheettype eq 'classcalc') {
1607: # no need to do anything since viewing the sheet will
1608: # cause it to be updated.
1609: } elsif ($sheettype eq 'studentcalc') {
1610: # expire all the student spreadsheets
1611: &Apache::lonnet::expirespread('','','studentcalc');
1612: } else {
1613: # expire all the assessment spreadsheets
1614: # this includes non-default spreadsheets, but better to
1615: # be safe than sorry.
1616: &Apache::lonnet::expirespread('','','assesscalc');
1617: # expire all the student spreadsheets
1618: &Apache::lonnet::expirespread('','','studentcalc');
1.30 www 1619: }
1.105 matthew 1620: }
1621: #
1.107 matthew 1622: # Deal with the enrollment dates
1623: if ($name =~ /^default_enrollment_(start|end)_date$/) {
1624: $value=&Apache::lonhtmlcommon::get_date_from_form($name.'_value');
1625: }
1.178 raeburn 1626: # Get existing cloners
1627: my @oldcloner = ();
1628: if ($name eq 'cloners') {
1629: my %clonenames=&Apache::lonnet::dump('environment',$dom,$crs,'cloners');
1630: if ($clonenames{'cloners'} =~ /,/) {
1631: @oldcloner = split/,/,$clonenames{'cloners'};
1632: } else {
1633: $oldcloner[0] = $clonenames{'cloners'};
1634: }
1635: }
1.107 matthew 1636: #
1.105 matthew 1637: # Let the user know we made the changes
1.153 albertel 1638: if ($name && defined($value)) {
1.178 raeburn 1639: if ($name eq 'cloners') {
1640: $value =~ s/^,//;
1641: $value =~ s/,$//;
1642: }
1.105 matthew 1643: my $put_result = &Apache::lonnet::put('environment',
1644: {$name=>$value},$dom,$crs);
1645: if ($put_result eq 'ok') {
1.130 www 1646: $setoutput.=&mt('Set').' <b>'.$name.'</b> '.&mt('to').' <b>'.$value.'</b>.<br />';
1.178 raeburn 1647: if ($name eq 'cloners') {
1648: &change_clone($value,\@oldcloner);
1649: }
1.179 raeburn 1650: # Flush the course logs so course description is immediately updated
1651: if ($name eq 'description' && defined($value)) {
1652: &Apache::lonnet::flushcourselogs();
1653: }
1.105 matthew 1654: } else {
1.130 www 1655: $setoutput.=&mt('Unable to set').' <b>'.$name.'</b> '.&mt('to').
1656: ' <b>'.$value.'</b> '.&mt('due to').' '.$put_result.'.<br />';
1.30 www 1657: }
1658: }
1.38 harris41 1659: }
1.108 www 1660: # ------------------------- Re-init course environment entries for this session
1661:
1.190 albertel 1662: &Apache::lonnet::coursedescription($env{'request.course.id'});
1.105 matthew 1663:
1.30 www 1664: # -------------------------------------------------------- Get parameters again
1.45 matthew 1665:
1666: my %values=&Apache::lonnet::dump('environment',$dom,$crs);
1.140 sakharuk 1667: my $SelectStyleFile=&mt('Select Style File');
1.141 sakharuk 1668: my $SelectSpreadsheetFile=&mt('Select Spreadsheet File');
1.30 www 1669: my $output='';
1.45 matthew 1670: if (! exists($values{'con_lost'})) {
1.30 www 1671: my %descriptions=
1.140 sakharuk 1672: ('url' => '<b>'.&mt('Top Level Map').'</b> '.
1.46 matthew 1673: '<a href="javascript:openbrowser'.
1.47 matthew 1674: "('envform','url','sequence')\">".
1.140 sakharuk 1675: &mt('Select Map').'</a><br /><font color=red> '.
1676: &mt('Modification may make assessment data inaccessible').
1677: '</font>',
1678: 'description' => '<b>'.&mt('Course Description').'</b>',
1.158 sakharuk 1679: 'courseid' => '<b>'.&mt('Course ID or number').
1.140 sakharuk 1680: '</b><br />'.
1681: '('.&mt('internal').', '.&mt('optional').')',
1.177 raeburn 1682: '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 1683: 'grading' => '<b>'.&mt('Grading').'</b><br />'.
1684: '<tt>"standard", "external", or "spreadsheet"</tt> '.&Apache::loncommon::help_open_topic('GradingOptions'),
1.140 sakharuk 1685: 'default_xml_style' => '<b>'.&mt('Default XML Style File').'</b> '.
1.52 www 1686: '<a href="javascript:openbrowser'.
1687: "('envform','default_xml_style'".
1.140 sakharuk 1688: ",'sty')\">$SelectStyleFile</a><br>",
1.141 sakharuk 1689: 'question.email' => '<b>'.&mt('Feedback Addresses for Resource Content Question').
1690: '</b><br />(<tt>user:domain,'.
1.74 www 1691: 'user:domain(section;section;...;*;...),...</tt>)',
1.141 sakharuk 1692: 'comment.email' => '<b>'.&mt('Feedback Addresses for Course Content Comments').'</b><br />'.
1.74 www 1693: '(<tt>user:domain,user:domain(section;section;...;*;...),...</tt>)',
1.141 sakharuk 1694: 'policy.email' => '<b>'.&mt('Feedback Addresses for Course Policy').'</b>'.
1.75 albertel 1695: '<br />(<tt>user:domain,user:domain(section;section;...;*;...),...</tt>)',
1.141 sakharuk 1696: 'hideemptyrows' => '<b>'.&mt('Hide Empty Rows in Spreadsheets').'</b><br />'.
1.158 sakharuk 1697: '('.&mt('"[_1]" for default hiding','<tt>yes</tt>').')',
1.141 sakharuk 1698: 'pageseparators' => '<b>'.&mt('Visibly Separate Items on Pages').'</b><br />'.
1.158 sakharuk 1699: '('.&mt('"[_1]" for visible separation','<tt>yes</tt>').', '.
1.141 sakharuk 1700: &mt('changes will not show until next login').')',
1.169 matthew 1701: '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 1702:
1.141 sakharuk 1703: 'plc.roles.denied'=> '<b>'.&mt('Disallow live chatroom use for Roles').
1704: '</b><br />"<tt>st</tt>": '.
1.158 sakharuk 1705: &mt('student').', "<tt>ta</tt>": '.
1.118 matthew 1706: 'TA, "<tt>in</tt>": '.
1.158 sakharuk 1707: &mt('instructor').';<br /><tt>'.&mt('role,role,...').'</tt>) '.
1.118 matthew 1708: Apache::loncommon::help_open_topic("Course_Disable_Discussion"),
1709: 'plc.users.denied' =>
1.141 sakharuk 1710: '<b>'.&mt('Disallow live chatroom use for Users').'</b><br />'.
1.118 matthew 1711: '(<tt>user:domain,user:domain,...</tt>)',
1712:
1.141 sakharuk 1713: 'pch.roles.denied'=> '<b>'.&mt('Disallow Resource Discussion for Roles').
1714: '</b><br />"<tt>st</tt>": '.
1.61 albertel 1715: 'student, "<tt>ta</tt>": '.
1716: 'TA, "<tt>in</tt>": '.
1.75 albertel 1717: 'instructor;<br /><tt>role,role,...</tt>) '.
1.61 albertel 1718: Apache::loncommon::help_open_topic("Course_Disable_Discussion"),
1.53 www 1719: 'pch.users.denied' =>
1.141 sakharuk 1720: '<b>'.&mt('Disallow Resource Discussion for Users').'</b><br />'.
1.53 www 1721: '(<tt>user:domain,user:domain,...</tt>)',
1.49 matthew 1722: 'spreadsheet_default_classcalc'
1.141 sakharuk 1723: => '<b>'.&mt('Default Course Spreadsheet').'</b> '.
1.50 matthew 1724: '<a href="javascript:openbrowser'.
1725: "('envform','spreadsheet_default_classcalc'".
1.141 sakharuk 1726: ",'spreadsheet')\">$SelectSpreadsheetFile</a><br />",
1.49 matthew 1727: 'spreadsheet_default_studentcalc'
1.141 sakharuk 1728: => '<b>'.&mt('Default Student Spreadsheet').'</b> '.
1.50 matthew 1729: '<a href="javascript:openbrowser'.
1730: "('envform','spreadsheet_default_calc'".
1.141 sakharuk 1731: ",'spreadsheet')\">$SelectSpreadsheetFile</a><br />",
1.49 matthew 1732: 'spreadsheet_default_assesscalc'
1.141 sakharuk 1733: => '<b>'.&mt('Default Assessment Spreadsheet').'</b> '.
1.50 matthew 1734: '<a href="javascript:openbrowser'.
1735: "('envform','spreadsheet_default_assesscalc'".
1.141 sakharuk 1736: ",'spreadsheet')\">$SelectSpreadsheetFile</a><br />",
1.75 albertel 1737: 'allow_limited_html_in_feedback'
1.141 sakharuk 1738: => '<b>'.&mt('Allow limited HTML in discussion posts').'</b><br />'.
1.158 sakharuk 1739: '('.&mt('Set value to "[_1]" to allow',"<tt>yes</tt>").')',
1.170 raeburn 1740: 'allow_discussion_post_editing'
1741: => '<b>'.&mt('Allow users to edit/delete their own discussion posts').'</b><br />'.
1742: '('.&mt('Set value to "[_1]" to allow',"<tt>yes</tt>").')',
1.89 albertel 1743: 'rndseed'
1.140 sakharuk 1744: => '<b>'.&mt('Randomization algorithm used').'</b> <br />'.
1745: '<font color="red">'.&mt('Modifying this will make problems').' '.
1746: &mt('have different numbers and answers').'</font>',
1.151 albertel 1747: 'receiptalg'
1748: => '<b>'.&mt('Receipt algorithm used').'</b> <br />'.
1749: &mt('This controls how receipt numbers are generated.'),
1.164 sakharuk 1750: 'suppress_tries'
1751: => '<b>'.&mt('Suppress number of tries in printing').'</b>('.
1752: &mt('yes if supress').')',
1.113 sakharuk 1753: 'problem_stream_switch'
1.141 sakharuk 1754: => '<b>'.&mt('Allow problems to be split over pages').'</b><br />'.
1.158 sakharuk 1755: ' ('.&mt('"[_1]" if allowed, anything else if not','<tt>yes</tt>').')',
1.161 sakharuk 1756: 'default_paper_size'
1757: => '<b>'.&mt('Default paper type').'</b><br />'.
1758: ' ('.&mt('supported types').': Letter [8 1/2x11 in], Legal [8 1/2x14 in],'.
1759: ' Tabloid [11x17 in], Executive [7 1/2x10 in], A2 [420x594 mm],'.
1760: ' A3 [297x420 mm], A4 [210x297 mm], A5 [148x210 mm], A6 [105x148 mm])',
1.111 sakharuk 1761: 'anonymous_quiz'
1.150 www 1762: => '<b>'.&mt('Anonymous quiz/exam').'</b><br />'.
1.141 sakharuk 1763: ' (<tt><b>'.&mt('yes').'</b> '.&mt('to avoid print students names').' </tt>)',
1764: 'default_enrollment_start_date' => '<b>'.&mt('Default beginning date when enrolling students').'</b>',
1765: 'default_enrollment_end_date' => '<b>'.&mt('Default ending date when enrolling students').'</b>',
1.150 www 1766: 'nothideprivileged' => '<b>'.&mt('Privileged users that should not be hidden on staff listings').'</b>'.
1767: '<br />(<tt>user:domain,user:domain,...</tt>)',
1.140 sakharuk 1768: 'languages' => '<b>'.&mt('Languages used').'</b>',
1.115 www 1769: 'disable_receipt_display'
1.141 sakharuk 1770: => '<b>'.&mt('Disable display of problem receipts').'</b><br />'.
1.158 sakharuk 1771: ' ('.&mt('"[_1]" to disable, anything else if not','<tt>yes</tt>').')',
1.163 albertel 1772: 'disablesigfigs'
1773: => '<b>'.&mt('Disable checking of Significant Figures').'</b><br />'.
1774: ' ('.&mt('"[_1]" to disable, anything else if not','<tt>yes</tt>').')',
1.149 albertel 1775: 'tthoptions'
1776: => '<b>'.&mt('Default set of options to pass to tth/m when converting tex').'</b>'
1.107 matthew 1777: );
1.177 raeburn 1778: my @Display_Order = ('url','description','courseid','cloners','grading',
1.107 matthew 1779: 'default_xml_style','pageseparators',
1780: 'question.email','comment.email','policy.email',
1.169 matthew 1781: 'student_classlist_view',
1.118 matthew 1782: 'plc.roles.denied','plc.users.denied',
1.107 matthew 1783: 'pch.roles.denied','pch.users.denied',
1784: 'allow_limited_html_in_feedback',
1.170 raeburn 1785: 'allow_discussion_post_editing',
1.108 www 1786: 'languages',
1.150 www 1787: 'nothideprivileged',
1.107 matthew 1788: 'rndseed',
1.151 albertel 1789: 'receiptalg',
1.107 matthew 1790: 'problem_stream_switch',
1.164 sakharuk 1791: 'suppress_tries',
1.161 sakharuk 1792: 'default_paper_size',
1.115 www 1793: 'disable_receipt_display',
1.107 matthew 1794: 'spreadsheet_default_classcalc',
1795: 'spreadsheet_default_studentcalc',
1796: 'spreadsheet_default_assesscalc',
1797: 'hideemptyrows',
1798: 'default_enrollment_start_date',
1799: 'default_enrollment_end_date',
1.163 albertel 1800: 'tthoptions',
1801: 'disablesigfigs'
1.107 matthew 1802: );
1803: foreach my $parameter (sort(keys(%values))) {
1.142 raeburn 1804: unless ($parameter =~ m/^internal\./) {
1805: if (! $descriptions{$parameter}) {
1806: $descriptions{$parameter}=$parameter;
1807: push(@Display_Order,$parameter);
1808: }
1809: }
1.43 albertel 1810: }
1.107 matthew 1811: foreach my $parameter (@Display_Order) {
1812: my $description = $descriptions{$parameter};
1.51 matthew 1813: # onchange is javascript to automatically check the 'Set' button.
1.69 www 1814: my $onchange = 'onFocus="javascript:window.document.forms'.
1.107 matthew 1815: "['envform'].elements['".$parameter."_setparmval']".
1.51 matthew 1816: '.checked=true;"';
1.107 matthew 1817: $output .= '<tr><td>'.$description.'</td>';
1818: if ($parameter =~ /^default_enrollment_(start|end)_date$/) {
1819: $output .= '<td>'.
1820: &Apache::lonhtmlcommon::date_setter('envform',
1821: $parameter.'_value',
1822: $values{$parameter},
1823: $onchange).
1824: '</td>';
1825: } else {
1826: $output .= '<td>'.
1827: &Apache::lonhtmlcommon::textbox($parameter.'_value',
1828: $values{$parameter},
1829: 40,$onchange).'</td>';
1830: }
1831: $output .= '<td>'.
1832: &Apache::lonhtmlcommon::checkbox($parameter.'_setparmval').
1833: '</td>';
1834: $output .= "</tr>\n";
1.51 matthew 1835: }
1.69 www 1836: my $onchange = 'onFocus="javascript:window.document.forms'.
1.51 matthew 1837: '[\'envform\'].elements[\'newp_setparmval\']'.
1838: '.checked=true;"';
1.130 www 1839: $output.='<tr><td><i>'.&mt('Create New Environment Variable').'</i><br />'.
1.51 matthew 1840: '<input type="text" size=40 name="newp_name" '.
1841: $onchange.' /></td><td>'.
1842: '<input type="text" size=40 name="newp_value" '.
1843: $onchange.' /></td><td>'.
1844: '<input type="checkbox" name="newp_setparmval" /></td></tr>';
1.43 albertel 1845: }
1.157 sakharuk 1846: my %lt=&Apache::lonlocal::texthash(
1847: 'par' => 'Parameter',
1848: 'val' => 'Value',
1849: 'set' => 'Set',
1850: 'sce' => 'Set Course Environment'
1851: );
1852:
1.140 sakharuk 1853: my $Parameter=&mt('Parameter');
1854: my $Value=&mt('Value');
1.141 sakharuk 1855: my $Set=&mt('Set');
1.167 albertel 1856: my $browse_js=&Apache::loncommon::browser_and_searcher_javascript('parmset');
1.183 albertel 1857: my $html=&Apache::lonxml::xmlbegin();
1.190 albertel 1858: $r->print(<<ENDenv);
1.183 albertel 1859: $html
1860: <head>
1.46 matthew 1861: <script type="text/javascript" language="Javascript" >
1.155 albertel 1862: $browse_js
1.46 matthew 1863: </script>
1.30 www 1864: <title>LON-CAPA Course Environment</title>
1865: </head>
1.64 www 1866: $bodytag
1.193 albertel 1867: $breadcrumbs
1868: <form method="post" action="/adm/parmset?action=crsenv" name="envform">
1.30 www 1869: $setoutput
1870: <p>
1871: <table border=2>
1.157 sakharuk 1872: <tr><th>$lt{'par'}</th><th>$lt{'val'}</th><th>$lt{'set'}?</th></tr>
1.30 www 1873: $output
1874: </table>
1.157 sakharuk 1875: <input type="submit" name="crsenv" value="$lt{'sce'}">
1.30 www 1876: </form>
1877: </body>
1878: </html>
1.190 albertel 1879: ENDenv
1.30 www 1880: }
1.120 www 1881: ##################################################
1.207 www 1882: # Overview mode
1883: ##################################################
1.124 www 1884: my $tableopen;
1885:
1886: sub tablestart {
1887: if ($tableopen) {
1888: return '';
1889: } else {
1890: $tableopen=1;
1.130 www 1891: return '<table border="2"><tr><th>'.&mt('Parameter').'</th><th>'.
1892: &mt('Delete').'</th><th>'.&mt('Set to ...').'</th></tr>';
1.124 www 1893: }
1894: }
1895:
1896: sub tableend {
1897: if ($tableopen) {
1898: $tableopen=0;
1899: return '</table>';
1900: } else {
1901: return'';
1902: }
1903: }
1904:
1.207 www 1905: sub readdata {
1906: my ($crs,$dom)=@_;
1907: # Read coursedata
1908: my $resourcedata=&Apache::lonnet::get_courseresdata($crs,$dom);
1909: # Read userdata
1910:
1911: my $classlist=&Apache::loncoursedata::get_classlist();
1912: foreach (keys %$classlist) {
1913: # the following undefs are for 'domain', and 'username' respectively.
1914: if ($_=~/^(\w+)\:(\w+)$/) {
1915: my ($tuname,$tudom)=($1,$2);
1916: my $useropt=&Apache::lonnet::get_userresdata($tuname,$tudom);
1917: foreach my $userkey (keys %{$useropt}) {
1918: if ($userkey=~/^$env{'request.course.id'}/) {
1919: my $newkey=$userkey;
1920: $newkey=~s/^($env{'request.course.id'}\.)/$1\[useropt\:$tuname\:$tudom\]\./;
1921: $$resourcedata{$newkey}=$$useropt{$userkey};
1922: }
1923: }
1924: }
1925: }
1926: return $resourcedata;
1927: }
1928:
1929:
1.124 www 1930: # Setting
1.208 www 1931:
1932: sub storedata {
1933: my ($r,$crs,$dom)=@_;
1.207 www 1934: # Set userlevel immediately
1935: # Do an intermediate store of course level
1936: my $olddata=&readdata($crs,$dom);
1.124 www 1937: my %newdata=();
1938: undef %newdata;
1939: my @deldata=();
1940: undef @deldata;
1.190 albertel 1941: foreach (keys %env) {
1.124 www 1942: if ($_=~/^form\.([a-z]+)\_(.+)$/) {
1943: my $cmd=$1;
1944: my $thiskey=$2;
1.207 www 1945: my ($tuname,$tudom)=&extractuser($thiskey);
1946: my $tkey=$thiskey;
1947: if ($tuname) {
1948: $tkey=~s/\.\[useropt\:$tuname\:$tudom\]\./\./;
1949: }
1.124 www 1950: if ($cmd eq 'set') {
1.190 albertel 1951: my $data=$env{$_};
1.212 ! www 1952: my $typeof=$env{'form.typeof_'.$thiskey};
! 1953: if ($$olddata{$thiskey} ne $data) {
1.207 www 1954: if ($tuname) {
1.212 ! www 1955: if (&Apache::lonnet::put('resourcedata',{$tkey=>$data,
! 1956: $tkey.'.type' => $typeof},
! 1957: $tudom,$tuname) eq 'ok') {
1.207 www 1958: $r->print('<br />'.&mt('Stored modified parameter for').' '.
1959: &Apache::loncommon::plainname($tuname,$tudom));
1960: } else {
1961: $r->print('<h2><font color="red">'.
1962: &mt('Error storing parameters').'</font></h2>');
1963: }
1964: &Apache::lonnet::devalidateuserresdata($tuname,$tudom);
1965: } else {
1966: $newdata{$thiskey}=$data;
1.212 ! www 1967: $newdata{$thiskey.'.type'}=$typeof;
! 1968: }
1.207 www 1969: }
1.124 www 1970: } elsif ($cmd eq 'del') {
1.207 www 1971: if ($tuname) {
1972: if (&Apache::lonnet::del('resourcedata',[$tkey],$tudom,$tuname) eq 'ok') {
1973: $r->print('<br />'.&mt('Deleted parameter for').' '.&Apache::loncommon::plainname($tuname,$tudom));
1974: } else {
1975: $r->print('<h2><font color="red">'.
1976: &mt('Error deleting parameters').'</font></h2>');
1977: }
1978: &Apache::lonnet::devalidateuserresdata($tuname,$tudom);
1979: } else {
1980: push (@deldata,$thiskey);
1981: }
1.124 www 1982: } elsif ($cmd eq 'datepointer') {
1.190 albertel 1983: my $data=&Apache::lonhtmlcommon::get_date_from_form($env{$_});
1.212 ! www 1984: my $typeof=$env{'form.typeof_'.$thiskey};
1.207 www 1985: if (defined($data) and $$olddata{$thiskey} ne $data) {
1986: if ($tuname) {
1.212 ! www 1987: if (&Apache::lonnet::put('resourcedata',{$tkey=>$data,
! 1988: $tkey.'.type' => $typeof},
! 1989: $tudom,$tuname) eq 'ok') {
1.207 www 1990: $r->print('<br />'.&mt('Stored modified date for').' '.&Apache::loncommon::plainname($tuname,$tudom));
1991: } else {
1992: $r->print('<h2><font color="red">'.
1993: &mt('Error storing parameters').'</font></h2>');
1994: }
1995: &Apache::lonnet::devalidateuserresdata($tuname,$tudom);
1996: } else {
1.212 ! www 1997: $newdata{$thiskey}=$data;
! 1998: $newdata{$thiskey.'.type'}=$typeof;
1.207 www 1999: }
2000: }
1.124 www 2001: }
2002: }
2003: }
1.207 www 2004: # Store all course level
1.144 www 2005: my $delentries=$#deldata+1;
2006: my @newdatakeys=keys %newdata;
2007: my $putentries=$#newdatakeys+1;
2008: if ($delentries) {
2009: if (&Apache::lonnet::del('resourcedata',\@deldata,$dom,$crs) eq 'ok') {
2010: $r->print('<h2>'.&mt('Deleted [_1] parameter(s)</h2>',$delentries));
2011: } else {
2012: $r->print('<h2><font color="red">'.
2013: &mt('Error deleting parameters').'</font></h2>');
2014: }
1.205 www 2015: &Apache::lonnet::devalidatecourseresdata($crs,$dom);
1.144 www 2016: }
2017: if ($putentries) {
2018: if (&Apache::lonnet::put('resourcedata',\%newdata,$dom,$crs) eq 'ok') {
1.212 ! www 2019: $r->print('<h3>'.&mt('Stored [_1] parameter(s)',$putentries/2).'</h3>');
1.144 www 2020: } else {
2021: $r->print('<h2><font color="red">'.
2022: &mt('Error storing parameters').'</font></h2>');
2023: }
1.205 www 2024: &Apache::lonnet::devalidatecourseresdata($crs,$dom);
1.144 www 2025: }
1.208 www 2026: }
1.207 www 2027:
1.208 www 2028: sub extractuser {
2029: my $key=shift;
2030: return ($key=~/^$env{'request.course.id'}.\[useropt\:(\w+)\:(\w+)\]\./);
2031: }
1.206 www 2032:
1.208 www 2033: sub listdata {
2034: my ($r,$resourcedata,$listdata)=@_;
1.207 www 2035: # Start list output
1.206 www 2036:
1.122 www 2037: my $oldsection='';
2038: my $oldrealm='';
2039: my $oldpart='';
1.123 www 2040: my $pointer=0;
1.124 www 2041: $tableopen=0;
1.145 www 2042: my $foundkeys=0;
1.208 www 2043: foreach my $thiskey (sort keys %{$listdata}) {
1.211 www 2044: if ($$listdata{$thiskey.'.type'}) {
2045: my $thistype=$$listdata{$thiskey.'.type'};
2046: if ($$resourcedata{$thiskey.'.type'}) {
2047: $thistype=$$resourcedata{$thiskey.'.type'};
2048: }
1.207 www 2049: my ($middle,$part,$name)=
2050: ($thiskey=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);
1.130 www 2051: my $section=&mt('All Students');
1.207 www 2052: if ($middle=~/^\[(.*)\]/) {
1.206 www 2053: my $issection=$1;
2054: if ($issection=~/^useropt\:(\w+)\:(\w+)/) {
2055: $section=&mt('User').": ".&Apache::loncommon::plainname($1,$2);
2056: } else {
2057: $section=&mt('Group/Section').': '.$issection;
2058: }
1.207 www 2059: $middle=~s/^\[(.*)\]//;
1.122 www 2060: }
1.207 www 2061: $middle=~s/\.+$//;
2062: $middle=~s/^\.+//;
1.130 www 2063: my $realm='<font color="red">'.&mt('All Resources').'</font>';
1.122 www 2064: if ($middle=~/^(.+)\_\_\_\(all\)$/) {
1.174 albertel 2065: $realm='<font color="green">'.&mt('Folder/Map').': '.&Apache::lonnet::gettitle($1).' <br /><font color="#aaaaaa" size="-2">('.$1.')</font></font>';
1.122 www 2066: } elsif ($middle) {
1.174 albertel 2067: my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle);
2068: $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 2069: }
2070: if ($section ne $oldsection) {
1.124 www 2071: $r->print(&tableend()."\n<hr /><h1>$section</h1>");
1.122 www 2072: $oldsection=$section;
2073: $oldrealm='';
2074: }
2075: if ($realm ne $oldrealm) {
1.124 www 2076: $r->print(&tableend()."\n<h2>$realm</h2>");
1.122 www 2077: $oldrealm=$realm;
2078: $oldpart='';
2079: }
2080: if ($part ne $oldpart) {
1.124 www 2081: $r->print(&tableend().
1.130 www 2082: "\n<h3><font color='blue'>".&mt('Part').": $part</font></h3>");
1.122 www 2083: $oldpart=$part;
2084: }
1.123 www 2085: #
2086: # Ready to print
2087: #
1.124 www 2088: $r->print(&tablestart().'<tr><td><b>'.$name.
2089: ':</b></td><td><input type="checkbox" name="del_'.
2090: $thiskey.'" /></td><td>');
1.145 www 2091: $foundkeys++;
1.211 www 2092: if ($thistype=~/^date/) {
1.123 www 2093: my $jskey='key_'.$pointer;
2094: $pointer++;
2095: $r->print(
2096: &Apache::lonhtmlcommon::date_setter('overviewform',
2097: $jskey,
1.206 www 2098: $$resourcedata{$thiskey}).
1.123 www 2099: '<input type="hidden" name="datepointer_'.$thiskey.'" value="'.$jskey.'" />'
2100: );
2101: } else {
1.211 www 2102: $r->print('<input type="text" name="set_'.$thiskey.'" value="'.
1.206 www 2103: $$resourcedata{$thiskey}.'">');
1.123 www 2104: }
1.211 www 2105: $r->print('<input type="hidden" name="typeof_'.$thiskey.'" value="'.
2106: $thistype.'">');
1.124 www 2107: $r->print('</td></tr>');
1.122 www 2108: }
1.121 www 2109: }
1.208 www 2110: return $foundkeys;
2111: }
2112:
2113: sub newoverview {
2114: my $r=shift;
2115: my $bodytag=&Apache::loncommon::bodytag(
2116: 'Set Course Assessment Parameters');
2117: my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
2118: my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
2119: my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs(undef,'Overview');
2120: my $html=&Apache::lonxml::xmlbegin();
2121: $r->print(<<ENDOVER);
2122: $html
2123: <head>
2124: <title>LON-CAPA Parameters</title>
2125: </head>
2126: $bodytag
2127: $breadcrumbs
1.211 www 2128: <form method="post" action="/adm/parmset?action=newoverview" name="parmform">
1.208 www 2129: ENDOVER
1.211 www 2130: my @ids=();
2131: my %typep=();
2132: my %keyp=();
2133: my %allparms=();
2134: my %allparts=();
2135: my %allmaps=();
2136: my %mapp=();
2137: my %symbp=();
2138: my %maptitles=();
2139: my %uris=();
2140: my %keyorder=&standardkeyorder();
2141: my %defkeytype=();
2142:
2143: my %alllevs=();
2144: $alllevs{'Resource Level'}='full';
2145: $alllevs{'Map Level'}='map';
2146: $alllevs{'Course Level'}='general';
2147:
2148: my $csec=$env{'form.csec'};
2149:
2150: my @pscat=&Apache::loncommon::get_env_multiple('form.pscat');
2151: my $pschp=$env{'form.pschp'};
2152: my @psprt=&Apache::loncommon::get_env_multiple('form.psprt');
2153: if (!@psprt) { $psprt[0]='0'; }
2154:
2155: my @selected_sections =
2156: &Apache::loncommon::get_env_multiple('form.Section');
2157: @selected_sections = ('all') if (! @selected_sections);
2158: foreach (@selected_sections) {
2159: if ($_ eq 'all') {
2160: @selected_sections = ('all');
2161: }
2162: }
2163:
2164: my $pssymb='';
2165: my $parmlev='';
2166:
2167: unless ($env{'form.parmlev'}) {
2168: $parmlev = 'map';
2169: } else {
2170: $parmlev = $env{'form.parmlev'};
2171: }
2172:
2173: &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps,
2174: \%mapp, \%symbp,\%maptitles,\%uris,
2175: \%keyorder,\%defkeytype);
2176:
2177: # Menu to select levels, etc
2178:
2179: $r->print('<table border="1"><tr><td>');
2180: &levelmenu($r,\%alllevs,$parmlev);
2181: if ($parmlev ne 'general') {
2182: $r->print('<td>');
2183: &mapmenu($r,\%allmaps,$pschp,\%maptitles);
2184: $r->print('</td>');
2185: }
2186: $r->print('</td></tr></table>');
2187:
2188: $r->print('<table border="1"><tr><td>');
2189: &parmmenu($r,\%allparms,\@pscat,\%keyorder);
2190: $r->print('</td><td>');
2191: &partmenu($r,\%allparts,\@psprt);
2192: $r->print('</td><td>');
2193: §ionmenu($r,\@selected_sections);
1.212 ! www 2194: $r->print('</td></tr></table>'.
! 2195: '<p><input type="submit" name="dis" value="'.&mt('Display').'" /></p>');
1.211 www 2196:
2197: # Build the list data hash from the specified parms
2198:
2199: my $listdata;
2200: %{$listdata}=();
2201:
2202: foreach my $cat (@pscat) {
2203: foreach my $section (@selected_sections) {
2204: foreach my $part (@psprt) {
1.212 ! www 2205: my $rootparmkey=$env{'request.course.id'};
1.211 www 2206: if (($section ne 'all') && ($section ne 'none') && ($section)) {
1.212 ! www 2207: $rootparmkey.='.['.$section.']';
1.211 www 2208: }
2209: if ($parmlev eq 'general') {
2210: # course-level parameter
1.212 ! www 2211: my $newparmkey=$rootparmkey.'.'.$part.'.'.$cat;
! 2212: $$listdata{$newparmkey}=1;
! 2213: $$listdata{$newparmkey.'.type'}=$defkeytype{$cat};
1.211 www 2214: } elsif ($parmlev eq 'map') {
1.212 ! www 2215: # map-level parameter
! 2216: foreach my $mapid (keys %allmaps) {
! 2217: if (($pschp ne 'all') && ($pschp ne $mapid)) { next; }
! 2218: my $newparmkey=$rootparmkey.'.'.$allmaps{$mapid}.'___(all).'.$part.'.'.$cat;
1.211 www 2219: $$listdata{$newparmkey}=1;
2220: $$listdata{$newparmkey.'.type'}=$defkeytype{$cat};
2221: }
2222: } else {
2223: # resource-level parameter
1.212 ! www 2224: foreach my $rid (@ids) {
! 2225: my ($map,$resid,$url)=&Apache::lonnet::decode_symb($symbp{$rid});
! 2226: if (($pschp ne 'all') && ($allmaps{$pschp} ne $map)) { next; }
! 2227: my $newparmkey=$rootparmkey.'.'.$symbp{$rid}.'.'.$part.'.'.$cat;
! 2228: $$listdata{$newparmkey}=1;
! 2229: $$listdata{$newparmkey.'.type'}=$defkeytype{$cat};
! 2230: }
1.211 www 2231: }
2232: }
2233: }
2234: }
2235:
1.212 ! www 2236: if (($env{'form.store'}) || ($env{'form.dis'})) {
1.211 www 2237:
1.212 ! www 2238: if ($env{'form.store'}) { &storedata($r,$crs,$dom); }
1.211 www 2239:
2240: # Read modified data
2241:
2242: my $resourcedata=&readdata($crs,$dom);
2243:
2244: # List data
2245:
2246: &listdata($r,$resourcedata,$listdata);
2247: }
2248: $r->print(&tableend().
1.212 ! www 2249: ((($env{'form.store'}) || ($env{'form.dis'}))?'<p><input type="submit" name="store" value="'.&mt('Store').'" /></p>':'').
! 2250: '</form></body></html>');
1.208 www 2251: }
2252:
2253: sub overview {
2254: my $r=shift;
2255: my $bodytag=&Apache::loncommon::bodytag(
2256: 'Modify Course Assessment Parameters');
2257: my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
2258: my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
2259: my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs(undef,'Overview');
2260: my $html=&Apache::lonxml::xmlbegin();
2261: $r->print(<<ENDOVER);
2262: $html
2263: <head>
2264: <title>LON-CAPA Parameters</title>
2265: </head>
2266: $bodytag
2267: $breadcrumbs
2268: <form method="post" action="/adm/parmset?action=setoverview" name="overviewform">
2269: ENDOVER
2270: # Store modified
2271:
2272: &storedata($r,$crs,$dom);
2273:
2274: # Read modified data
2275:
2276: my $resourcedata=&readdata($crs,$dom);
2277:
2278: # List data
2279:
2280: my $foundkeys=&listdata($r,$resourcedata,$resourcedata);
2281:
1.145 www 2282: $r->print(&tableend().'<p>'.
1.208 www 2283: ($foundkeys?'<input type="submit" value="'.&mt('Modify Parameters').'" />':&mt('There are no parameters.')).'</p></form></body></html>');
1.120 www 2284: }
1.121 www 2285:
1.59 matthew 2286: ##################################################
2287: ##################################################
1.178 raeburn 2288:
2289: =pod
2290:
2291: =item change clone
2292:
2293: Modifies the list of courses a user can clone (stored
2294: in the user's environemnt.db file), called when a
2295: change is made to the list of users allowed to clone
2296: a course.
2297:
2298: Inputs: $action,$cloner
2299: where $action is add or drop, and $cloner is identity of
2300: user for whom cloning ability is to be changed in course.
2301:
2302: Returns:
2303:
2304: =cut
2305:
2306: ##################################################
2307: ##################################################
2308:
2309:
2310: sub change_clone {
2311: my ($clonelist,$oldcloner) = @_;
2312: my ($uname,$udom);
1.190 albertel 2313: my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
2314: my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
1.178 raeburn 2315: my $clone_crs = $cnum.':'.$cdom;
2316:
2317: if ($cnum && $cdom) {
2318: my @allowclone = ();
2319: if ($clonelist =~ /,/) {
2320: @allowclone = split/,/,$clonelist;
2321: } else {
2322: $allowclone[0] = $clonelist;
2323: }
2324: foreach my $currclone (@allowclone) {
2325: if (!grep/^$currclone$/,@$oldcloner) {
2326: ($uname,$udom) = split/:/,$currclone;
2327: if ($uname && $udom) {
2328: unless (&Apache::lonnet::homeserver($uname,$udom) eq 'no_host') {
2329: my %currclonecrs = &Apache::lonnet::dump('environment',$udom,$uname,'cloneable');
2330: if ($currclonecrs{'cloneable'} !~ /\Q$clone_crs\E/) {
2331: if ($currclonecrs{'cloneable'} eq '') {
2332: $currclonecrs{'cloneable'} = $clone_crs;
2333: } else {
2334: $currclonecrs{'cloneable'} .= ','.$clone_crs;
2335: }
2336: &Apache::lonnet::put('environment',\%currclonecrs,$udom,$uname);
2337: }
2338: }
2339: }
2340: }
2341: }
2342: foreach my $oldclone (@$oldcloner) {
2343: if (!grep/^$oldclone$/,@allowclone) {
2344: ($uname,$udom) = split/:/,$oldclone;
2345: if ($uname && $udom) {
2346: unless (&Apache::lonnet::homeserver($uname,$udom) eq 'no_host') {
2347: my %currclonecrs = &Apache::lonnet::dump('environment',$udom,$uname,'cloneable');
2348: my %newclonecrs = ();
2349: if ($currclonecrs{'cloneable'} =~ /\Q$clone_crs\E/) {
2350: if ($currclonecrs{'cloneable'} =~ /,/) {
2351: my @currclonecrs = split/,/,$currclonecrs{'cloneable'};
2352: foreach (@currclonecrs) {
2353: unless ($_ eq $clone_crs) {
2354: $newclonecrs{'cloneable'} .= $_.',';
2355: }
2356: }
2357: $newclonecrs{'cloneable'} =~ s/,$//;
2358: } else {
2359: $newclonecrs{'cloneable'} = '';
2360: }
2361: &Apache::lonnet::put('environment',\%newclonecrs,$udom,$uname);
2362: }
2363: }
2364: }
2365: }
2366: }
2367: }
2368: }
2369:
1.193 albertel 2370:
2371: ##################################################
2372: ##################################################
2373:
2374: =pod
2375:
2376: =item * header
2377:
2378: Output html header for page
2379:
2380: =cut
2381:
2382: ##################################################
2383: ##################################################
2384: sub header {
2385: my $html=&Apache::lonxml::xmlbegin();
2386: my $bodytag=&Apache::loncommon::bodytag('Parameter Manager');
2387: my $title = &mt('LON-CAPA Parameter Manager');
2388: return(<<ENDHEAD);
2389: $html
2390: <head>
2391: <title>$title</title>
2392: </head>
2393: $bodytag
2394: ENDHEAD
2395: }
2396: ##################################################
2397: ##################################################
2398: sub print_main_menu {
2399: my ($r,$parm_permission)=@_;
2400: #
2401: $r->print(<<ENDMAINFORMHEAD);
2402: <form method="post" enctype="multipart/form-data"
2403: action="/adm/parmset" name="studentform">
2404: ENDMAINFORMHEAD
2405: #
1.195 albertel 2406: my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
2407: my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
1.193 albertel 2408: my @menu =
2409: (
2410: { text => 'Set Course Environment Parameters',
1.204 www 2411: action => 'crsenv',
1.193 albertel 2412: permission => $parm_permission,
2413: },
2414: { text => 'Set/Modify Course Assessment Parameters - Helper Mode',
2415: url => '/adm/helper/parameter.helper',
2416: permission => $parm_permission,
2417: },
2418: { text => 'Modify Course Assessment Parameters - Overview Mode',
2419: action => 'setoverview',
2420: permission => $parm_permission,
1.208 www 2421: },
2422: { text => 'Set Course Assessment Parameters - Overview Mode',
2423: action => 'newoverview',
2424: permission => $parm_permission,
1.193 albertel 2425: },
2426: { text => 'Set/Modify Course Assessment Parameters - Table Mode',
2427: action => 'settable',
2428: permission => $parm_permission,
1.204 www 2429: help => 'Cascading_Parameters',
1.193 albertel 2430: },
2431: # { text => 'Set Parameter Default Preferences',
2432: # help => 'Course_View_Class_List',
2433: # action => 'setdefaults',
2434: # permission => $parm_permission,
2435: # },
2436: );
2437: my $menu_html = '';
2438: foreach my $menu_item (@menu) {
2439: next if (! $menu_item->{'permission'});
2440: $menu_html.='<p>';
2441: $menu_html.='<font size="+1">';
2442: if (exists($menu_item->{'url'})) {
2443: $menu_html.=qq{<a href="$menu_item->{'url'}">};
2444: } else {
2445: $menu_html.=
2446: qq{<a href="/adm/parmset?action=$menu_item->{'action'}">};
2447: }
2448: $menu_html.= &mt($menu_item->{'text'}).'</a></font>';
2449: if (exists($menu_item->{'help'})) {
2450: $menu_html.=
2451: &Apache::loncommon::help_open_topic($menu_item->{'help'});
2452: }
2453: $menu_html.='</p>'.$/;
2454: }
2455: $r->print($menu_html);
2456: return;
2457: }
2458:
2459:
2460:
2461:
1.178 raeburn 2462: ##################################################
2463: ##################################################
1.30 www 2464:
1.59 matthew 2465: =pod
2466:
1.83 bowersj2 2467: =item * handler
1.59 matthew 2468:
2469: Main handler. Calls &assessparms and &crsenv subroutines.
2470:
2471: =cut
2472: ##################################################
2473: ##################################################
1.85 bowersj2 2474: use Data::Dumper;
1.30 www 2475: sub handler {
1.43 albertel 2476: my $r=shift;
1.30 www 2477:
1.43 albertel 2478: if ($r->header_only) {
1.126 www 2479: &Apache::loncommon::content_type($r,'text/html');
1.43 albertel 2480: $r->send_http_header;
2481: return OK;
2482: }
1.193 albertel 2483: &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
1.205 www 2484: ['action','state',
2485: 'pres_marker',
2486: 'pres_value',
1.206 www 2487: 'pres_type',
2488: 'udom','uname']);
1.131 www 2489:
1.83 bowersj2 2490:
1.193 albertel 2491: &Apache::lonhtmlcommon::clear_breadcrumbs();
1.194 albertel 2492: &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/parmset",
2493: text=>"Parameter Manager",
1.204 www 2494: faq=>10,
1.194 albertel 2495: bug=>'Instructor Interface'});
1.203 www 2496:
1.30 www 2497: # ----------------------------------------------------- Needs to be in a course
1.194 albertel 2498: my $parm_permission =
2499: (&Apache::lonnet::allowed('opa',$env{'request.course.id'}) ||
1.190 albertel 2500: &Apache::lonnet::allowed('opa',$env{'request.course.id'}.'/'.
1.193 albertel 2501: $env{'request.course.sec'}));
1.194 albertel 2502: if ($env{'request.course.id'} && $parm_permission) {
1.193 albertel 2503:
2504: # Start Page
1.126 www 2505: &Apache::loncommon::content_type($r,'text/html');
1.106 www 2506: $r->send_http_header;
1.30 www 2507:
1.203 www 2508:
2509: # id numbers can change on re-ordering of folders
2510:
2511: &resetsymbcache();
2512:
1.193 albertel 2513: #
2514: # Main switch on form.action and form.state, as appropriate
2515: #
2516: # Check first if coming from someone else headed directly for
2517: # the table mode
2518: if ((($env{'form.command'} eq 'set') && ($env{'form.url'})
2519: && (!$env{'form.dis'})) || ($env{'form.symb'})) {
2520: &assessparms($r);
2521:
2522: } elsif (! exists($env{'form.action'})) {
2523: $r->print(&header());
1.194 albertel 2524: $r->print(&Apache::lonhtmlcommon::breadcrumbs(undef,
2525: 'Parameter Manager'));
1.193 albertel 2526: &print_main_menu($r,$parm_permission);
2527: } elsif ($env{'form.action'} eq 'crsenv' && $parm_permission) {
1.194 albertel 2528: &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=crsenv',
2529: text=>"Course Environment"});
2530: $r->print(&Apache::lonhtmlcommon::breadcrumbs(undef,
2531: 'Edit Course Environment'));
1.193 albertel 2532: &crsenv($r);
2533: } elsif ($env{'form.action'} eq 'setoverview' && $parm_permission) {
1.194 albertel 2534: &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview',
2535: text=>"Overview Mode"});
1.121 www 2536: &overview($r);
1.208 www 2537: } elsif ($env{'form.action'} eq 'newoverview' && $parm_permission) {
2538: &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview',
2539: text=>"Overview Mode"});
2540: &newoverview($r);
1.193 albertel 2541: } elsif ($env{'form.action'} eq 'settable' && $parm_permission) {
1.194 albertel 2542: &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=settable',
1.204 www 2543: text=>"Table Mode",
2544: help => 'Course_Setting_Parameters'});
1.121 www 2545: &assessparms($r);
1.193 albertel 2546: }
2547:
1.43 albertel 2548: } else {
1.1 www 2549: # ----------------------------- Not in a course, or not allowed to modify parms
1.190 albertel 2550: $env{'user.error.msg'}=
1.43 albertel 2551: "/adm/parmset:opa:0:0:Cannot modify assessment parameters";
2552: return HTTP_NOT_ACCEPTABLE;
2553: }
2554: return OK;
1.1 www 2555: }
2556:
2557: 1;
2558: __END__
2559:
1.59 matthew 2560: =pod
1.38 harris41 2561:
2562: =back
2563:
2564: =cut
1.1 www 2565:
2566:
2567:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>