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