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