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