Annotation of loncom/interface/lonparmset.pm, revision 1.375
1.1 www 1: # The LearningOnline Network with CAPA
2: # Handler to set parameters for assessments
3: #
1.375 ! albertel 4: # $Id: lonparmset.pm,v 1.374 2007/08/07 02:02:01 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;
1.363 albertel 938: foreach my $key (split(/\,/,&Apache::lonnet::metadata($srcf,'allpossiblekeys'))) {
939: next if ($key!~/^parameter_/);
940:
1.209 www 941: # Hidden parameters
1.363 albertel 942: next if (&Apache::lonnet::metadata($srcf,$key.'.hidden') eq 'parm');
1.209 www 943: #
944: # allparms is a hash of parameter names
945: #
1.363 albertel 946: my $name=&Apache::lonnet::metadata($srcf,$key.'.name');
1.375 ! albertel 947: if (!exists($$allparms{$name}) || $$allparms{$name} =~ m/^\s*$/ ) {
1.363 albertel 948: my $display= &Apache::lonnet::metadata($srcf,$key.'.display');
1.196 www 949: my $parmdis = $display;
1.209 www 950: $parmdis =~ s/\[Part.*$//g;
1.363 albertel 951: $$allparms{$name}=$parmdis;
952: if (ref($defkeytype)) {
953: $$defkeytype{$name}=
954: &Apache::lonnet::metadata($srcf,$key.'.type');
955: }
956: }
957:
1.209 www 958: #
959: # allparts is a hash of all parts
960: #
1.363 albertel 961: my $part= &Apache::lonnet::metadata($srcf,$key.'.part');
962: $$allparts{$part} = "Part: $part";
1.209 www 963: #
964: # Remember all keys going with this resource
965: #
1.363 albertel 966: if ($$keyp{$id}) {
967: $$keyp{$id}.=','.$key;
968: } else {
969: $$keyp{$id}=$key;
970: }
1.210 www 971: #
972: # Put in order
973: #
1.363 albertel 974: unless ($$keyorder{$key}) {
975: $$keyorder{$key}=$keyordercnt;
976: $keyordercnt++;
977: }
978: }
1.210 www 979:
1.363 albertel 980:
981: if (!exists($$mapp{$mapid})) {
982: $$mapp{$id}=
983: &Apache::lonnet::declutter($resource->enclosing_map_src());
984: $$mapp{$mapid}=$$mapp{$id};
985: $$allmaps{$mapid}=$$mapp{$id};
986: if ($mapid eq '1') {
987: $$maptitles{$mapid}='Main Course Documents';
988: } else {
989: $$maptitles{$mapid}=
990: &Apache::lonnet::gettitle($$mapp{$id});
1.63 bowersj2 991: }
1.363 albertel 992: $$maptitles{$$mapp{$id}}=$$maptitles{$mapid};
993: $$symbp{$mapid}=$$mapp{$id}.'___(all)';
1.196 www 994: } else {
1.363 albertel 995: $$mapp{$id} = $$mapp{$mapid};
1.196 www 996: }
997: $$symbp{$id}=&Apache::lonnet::encode_symb($$mapp{$id},$resid,$srcf);
1.63 bowersj2 998: }
999: }
1000:
1.208 www 1001:
1002: ##################################################
1003: ##################################################
1004:
1.213 www 1005: sub isdateparm {
1006: my $type=shift;
1007: return (($type=~/^date/) && (!($type eq 'date_interval')));
1008: }
1009:
1.208 www 1010: sub parmmenu {
1.211 www 1011: my ($r,$allparms,$pscat,$keyorder)=@_;
1.208 www 1012: my $tempkey;
1013: $r->print(<<ENDSCRIPT);
1014: <script type="text/javascript">
1015: function checkall(value, 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: document.forms.parmform.elements[i].checked=value;
1020: }
1021: }
1022: }
1.210 www 1023:
1024: function checkthis(thisvalue, checkName) {
1025: for (i=0; i<document.forms.parmform.elements.length; i++) {
1026: ele = document.forms.parmform.elements[i];
1027: if (ele.name == checkName) {
1028: if (ele.value == thisvalue) {
1029: document.forms.parmform.elements[i].checked=true;
1030: }
1031: }
1032: }
1033: }
1034:
1035: function checkdates() {
1036: checkthis('duedate','pscat');
1037: checkthis('opendate','pscat');
1038: checkthis('answerdate','pscat');
1.218 www 1039: }
1040:
1041: function checkdisset() {
1042: checkthis('discussend','pscat');
1043: checkthis('discusshide','pscat');
1044: }
1045:
1046: function checkcontdates() {
1047: checkthis('contentopen','pscat');
1048: checkthis('contentclose','pscat');
1049: }
1050:
1.210 www 1051:
1052: function checkvisi() {
1053: checkthis('hiddenresource','pscat');
1054: checkthis('encrypturl','pscat');
1055: checkthis('problemstatus','pscat');
1056: checkthis('contentopen','pscat');
1057: checkthis('opendate','pscat');
1058: }
1059:
1060: function checkparts() {
1061: checkthis('hiddenparts','pscat');
1062: checkthis('display','pscat');
1063: checkthis('ordered','pscat');
1064: }
1065:
1066: function checkstandard() {
1067: checkall(false,'pscat');
1068: checkdates();
1069: checkthis('weight','pscat');
1070: checkthis('maxtries','pscat');
1071: }
1072:
1.208 www 1073: </script>
1074: ENDSCRIPT
1.209 www 1075: $r->print();
1.317 albertel 1076: $r->print("\n<table id=\"LC_parm_overview_parm_menu\"><tr>");
1.208 www 1077: my $cnt=0;
1.211 www 1078: foreach $tempkey (&keysindisplayorder($allparms,$keyorder)) {
1.317 albertel 1079: $r->print("\n<td><label><input type='checkbox' name='pscat' ");
1.208 www 1080: $r->print('value="'.$tempkey.'"');
1081: if ($$pscat[0] eq "all" || grep $_ eq $tempkey, @{$pscat}) {
1082: $r->print(' checked');
1083: }
1.375 ! albertel 1084: $r->print('>'.($$allparms{$tempkey}=~/\S/ ? $$allparms{$tempkey}
! 1085: : $tempkey)
! 1086: .'</label></td>');
1.209 www 1087: $cnt++;
1088: if ($cnt==3) {
1089: $r->print("</tr>\n<tr>");
1090: $cnt=0;
1091: }
1.208 www 1092: }
1093: $r->print('
1.317 albertel 1094: </tr><tr id=\"LC_parm_overview_parm_menu_selectors\"><td>
1.233 albertel 1095: <a href="javascript:checkall(true, \'pscat\')">Select All</a><br />
1096: <a href="javascript:checkstandard()">Select Common Only</a>
1.210 www 1097: </td><td>
1.233 albertel 1098: <a href="javascript:checkdates()">Add Problem Dates</a>
1099: <a href="javascript:checkcontdates()">Add Content Dates</a><br />
1100: <a href="javascript:checkdisset()">Add Discussion Settings</a>
1101: <a href="javascript:checkvisi()">Add Visibilities</a><br />
1102: <a href="javascript:checkparts()">Add Part Parameters</a>
1.210 www 1103: </td><td>
1.233 albertel 1104: <a href="javascript:checkall(false, \'pscat\')">Unselect All</a>
1.208 www 1105: </td>
1106: ');
1107: $r->print('</tr></table>');
1108: }
1109:
1.209 www 1110: sub partmenu {
1111: my ($r,$allparts,$psprt)=@_;
1.211 www 1112: $r->print('<select multiple name="psprt" size="8">');
1.208 www 1113: $r->print('<option value="all"');
1114: $r->print(' selected') unless (@{$psprt});
1115: $r->print('>'.&mt('All Parts').'</option>');
1116: my %temphash=();
1117: foreach (@{$psprt}) { $temphash{$_}=1; }
1.234 albertel 1118: foreach my $tempkey (sort {
1119: if ($a==$b) { return ($a cmp $b) } else { return ($a <=> $b); }
1120: } keys(%{$allparts})) {
1.208 www 1121: unless ($tempkey =~ /\./) {
1122: $r->print('<option value="'.$tempkey.'"');
1123: if ($$psprt[0] eq "all" || $temphash{$tempkey}) {
1124: $r->print(' selected');
1125: }
1126: $r->print('>'.$$allparts{$tempkey}.'</option>');
1127: }
1128: }
1.209 www 1129: $r->print('</select>');
1130: }
1131:
1132: sub usermenu {
1.275 raeburn 1133: my ($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,$usersgroups)=@_;
1.209 www 1134: my $chooseopt=&Apache::loncommon::select_dom_form($udom,'udom').' '.
1135: &Apache::loncommon::selectstudent_link('parmform','uname','udom');
1136: my $selscript=&Apache::loncommon::studentbrowser_javascript();
1137: my %lt=&Apache::lonlocal::texthash(
1.269 raeburn 1138: 'se' => "Section",
1139: 'gr' => "Group",
1.209 www 1140: 'fu' => "For User",
1141: 'oi' => "or ID",
1142: 'ad' => "at Domain"
1143: );
1144: my $sections='';
1.300 albertel 1145: my %sectionhash = &Apache::loncommon::get_sections();
1146:
1.269 raeburn 1147: my $groups;
1.307 raeburn 1148: my %grouphash = &Apache::longroup::coursegroups();
1.299 albertel 1149:
1.300 albertel 1150: if (%sectionhash) {
1.269 raeburn 1151: $sections=$lt{'se'}.': <select name="csec"';
1.299 albertel 1152: if (%grouphash && $parmlev ne 'full') {
1.269 raeburn 1153: $sections .= qq| onchange="group_or_section('csec')" |;
1154: }
1155: $sections .= '>';
1.275 raeburn 1156: foreach my $section ('',sort keys %sectionhash) {
1157: $sections.='<option value="'.$section.'" '.
1158: ($section eq $csec?'selected="selected"':'').'>'.$section.
1159: '</option>';
1.209 www 1160: }
1161: $sections.='</select>';
1.269 raeburn 1162: }
1.300 albertel 1163: if (%sectionhash && %grouphash && $parmlev ne 'full') {
1.269 raeburn 1164: $sections .= ' or ';
1165: $sections .= qq|
1166: <script type="text/javascript">
1167: function group_or_section(caller) {
1168: if (caller == "cgroup") {
1169: if (document.parmform.cgroup.selectedIndex != 0) {
1170: document.parmform.csec.selectedIndex = 0;
1171: }
1172: } else {
1173: if (document.parmform.csec.selectedIndex != 0) {
1174: document.parmform.cgroup.selectedIndex = 0;
1175: }
1176: }
1177: }
1178: </script>
1179: |;
1180: } else {
1181: $sections .= qq|
1182: <script type="text/javascript">
1183: function group_or_section(caller) {
1184: return;
1185: }
1186: </script>
1187: |;
1188: }
1.299 albertel 1189:
1190: if (%grouphash) {
1.269 raeburn 1191: $groups=$lt{'gr'}.': <select name="cgroup"';
1.300 albertel 1192: if (%sectionhash && $env{'form.action'} eq 'settable') {
1.269 raeburn 1193: $groups .= qq| onchange="group_or_section('cgroup')" |;
1194: }
1195: $groups .= '>';
1.275 raeburn 1196: foreach my $grp ('',sort keys %grouphash) {
1197: $groups.='<option value="'.$grp.'" ';
1198: if ($grp eq $cgroup) {
1199: unless ((defined($uname)) && ($grp eq '')) {
1200: $groups .= 'selected="selected" ';
1201: }
1202: } elsif (!defined($cgroup)) {
1203: if (@{$usersgroups} == 1) {
1204: if ($grp eq $$usersgroups[0]) {
1205: $groups .= 'selected="selected" ';
1206: }
1207: }
1208: }
1209: $groups .= '>'.$grp.'</option>';
1.269 raeburn 1210: }
1211: $groups.='</select>';
1212: }
1213: $r->print(<<ENDMENU);
1.209 www 1214: <b>
1215: $sections
1.269 raeburn 1216: $groups
1.209 www 1217: <br />
1218: $lt{'fu'}
1219: <input type="text" value="$uname" size="12" name="uname" />
1220: $lt{'oi'}
1221: <input type="text" value="$id" size="12" name="id" />
1222: $lt{'ad'}
1223: $chooseopt
1224: </b>
1225: ENDMENU
1226: }
1227:
1228: sub displaymenu {
1.211 www 1229: my ($r,$allparms,$allparts,$pscat,$psprt,$keyorder)=@_;
1.209 www 1230: $r->print('<table border="1"><tr><th>'.&mt('Select Parameters to View').'</th><th>'.
1231: &mt('Select Parts to View').'</th></tr><tr><td>');
1.211 www 1232: &parmmenu($r,$allparms,$pscat,$keyorder);
1.209 www 1233: $r->print('</td><td>');
1234: &partmenu($r,$allparts,$psprt);
1235: $r->print('</td></tr></table>');
1236: }
1237:
1238: sub mapmenu {
1239: my ($r,$allmaps,$pschp,$maptitles)=@_;
1.231 www 1240: $r->print('<b>'.&mt('Select Enclosing Map or Folder').'</b> ');
1.209 www 1241: $r->print('<select name="pschp">');
1242: $r->print('<option value="all">'.&mt('All Maps or Folders').'</option>');
1243: foreach (sort {$$allmaps{$a} cmp $$allmaps{$b}} keys %{$allmaps}) {
1.208 www 1244: $r->print('<option value="'.$_.'"');
1.209 www 1245: if (($pschp eq $_)) { $r->print(' selected'); }
1246: $r->print('>'.$$maptitles{$_}.($$allmaps{$_}!~/^uploaded/?' ['.$$allmaps{$_}.']':'').'</option>');
1247: }
1248: $r->print("</select>");
1249: }
1250:
1251: sub levelmenu {
1252: my ($r,$alllevs,$parmlev)=@_;
1.231 www 1253: $r->print('<b>'.&mt('Select Parameter Level').
1254: &Apache::loncommon::help_open_topic('Course_Parameter_Levels').'</b> ');
1.209 www 1255: $r->print('<select name="parmlev">');
1256: foreach (reverse sort keys %{$alllevs}) {
1257: $r->print('<option value="'.$$alllevs{$_}.'"');
1258: if ($parmlev eq $$alllevs{$_}) {
1259: $r->print(' selected');
1260: }
1261: $r->print('>'.$_.'</option>');
1.208 www 1262: }
1.209 www 1263: $r->print("</select>");
1.208 www 1264: }
1265:
1.211 www 1266:
1267: sub sectionmenu {
1268: my ($r,$selectedsections)=@_;
1.300 albertel 1269: my %sectionhash = &Apache::loncommon::get_sections();
1270: return if (!%sectionhash);
1271:
1272: $r->print('<select name="Section" multiple="true" size="8" >');
1273: foreach my $s ('all',sort keys %sectionhash) {
1274: $r->print(' <option value="'.$s.'"');
1275: foreach (@{$selectedsections}) {
1276: if ($s eq $_) {
1277: $r->print(' selected');
1278: last;
1.212 www 1279: }
1280: }
1.300 albertel 1281: $r->print('>'.$s."</option>\n");
1282: }
1283: $r->print("</select>\n");
1.269 raeburn 1284: }
1285:
1286: sub groupmenu {
1287: my ($r,$selectedgroups)=@_;
1.307 raeburn 1288: my %grouphash = &Apache::longroup::coursegroups();
1.299 albertel 1289: return if (!%grouphash);
1290:
1291: $r->print('<select name="Group" multiple="true" size="8" >');
1292: foreach my $group (sort(keys(%grouphash))) {
1293: $r->print(' <option value="'.$group.'"');
1294: foreach (@{$selectedgroups}) {
1295: if ($group eq $_) {
1296: $r->print(' selected');
1297: last;
1298: }
1299: }
1300: $r->print('>'.$group."</option>\n");
1.211 www 1301: }
1.299 albertel 1302: $r->print("</select>\n");
1.211 www 1303: }
1304:
1.269 raeburn 1305:
1.210 www 1306: sub keysplit {
1307: my $keyp=shift;
1308: return (split(/\,/,$keyp));
1309: }
1310:
1311: sub keysinorder {
1312: my ($name,$keyorder)=@_;
1313: return sort {
1314: $$keyorder{$a} <=> $$keyorder{$b};
1315: } (keys %{$name});
1316: }
1317:
1.236 albertel 1318: sub keysinorder_bytype {
1319: my ($name,$keyorder)=@_;
1320: return sort {
1321: my $ta=(split('_',$a))[-1];
1322: my $tb=(split('_',$b))[-1];
1323: if ($$keyorder{'parameter_0_'.$ta} == $$keyorder{'parameter_0_'.$tb}) {
1324: return ($a cmp $b);
1325: }
1326: $$keyorder{'parameter_0_'.$ta} <=> $$keyorder{'parameter_0_'.$tb};
1327: } (keys %{$name});
1328: }
1329:
1.211 www 1330: sub keysindisplayorder {
1331: my ($name,$keyorder)=@_;
1332: return sort {
1333: $$keyorder{'parameter_0_'.$a} <=> $$keyorder{'parameter_0_'.$b};
1334: } (keys %{$name});
1335: }
1336:
1.214 www 1337: sub sortmenu {
1338: my ($r,$sortorder)=@_;
1.236 albertel 1339: $r->print('<br /><label><input type="radio" name="sortorder" value="realmstudent"');
1.214 www 1340: if ($sortorder eq 'realmstudent') {
1341: $r->print(' checked="on"');
1342: }
1343: $r->print(' />'.&mt('Sort by realm first, then student (group/section)'));
1.236 albertel 1344: $r->print('</label><br /><label><input type="radio" name="sortorder" value="studentrealm"');
1.214 www 1345: if ($sortorder eq 'studentrealm') {
1346: $r->print(' checked="on"');
1347: }
1.236 albertel 1348: $r->print(' />'.&mt('Sort by student (group/section) first, then realm').
1349: '</label>');
1.214 www 1350: }
1351:
1.211 www 1352: sub standardkeyorder {
1353: return ('parameter_0_opendate' => 1,
1354: 'parameter_0_duedate' => 2,
1355: 'parameter_0_answerdate' => 3,
1356: 'parameter_0_interval' => 4,
1357: 'parameter_0_weight' => 5,
1358: 'parameter_0_maxtries' => 6,
1359: 'parameter_0_hinttries' => 7,
1360: 'parameter_0_contentopen' => 8,
1361: 'parameter_0_contentclose' => 9,
1362: 'parameter_0_type' => 10,
1363: 'parameter_0_problemstatus' => 11,
1364: 'parameter_0_hiddenresource' => 12,
1365: 'parameter_0_hiddenparts' => 13,
1366: 'parameter_0_display' => 14,
1367: 'parameter_0_ordered' => 15,
1368: 'parameter_0_tol' => 16,
1369: 'parameter_0_sig' => 17,
1.218 www 1370: 'parameter_0_turnoffunit' => 18,
1371: 'parameter_0_discussend' => 19,
1372: 'parameter_0_discusshide' => 20);
1.211 www 1373: }
1374:
1.59 matthew 1375: ##################################################
1376: ##################################################
1377:
1378: =pod
1379:
1380: =item assessparms
1381:
1382: Show assessment data and parameters. This is a large routine that should
1383: be simplified and shortened... someday.
1384:
1385: Inputs: $r
1386:
1387: Returns: nothing
1388:
1.63 bowersj2 1389: Variables used (guessed by Jeremy):
1390:
1391: =over 4
1392:
1393: =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.
1394:
1395: =item B<psprt>: ParameterS PaRTs? a list of the parts of a problem that we are displaying? Used to display only selected parts?
1396:
1397: =item B<allmaps>:
1398:
1399: =back
1400:
1.59 matthew 1401: =cut
1402:
1403: ##################################################
1404: ##################################################
1.30 www 1405: sub assessparms {
1.1 www 1406:
1.43 albertel 1407: my $r=shift;
1.201 www 1408:
1409: my @ids=();
1410: my %symbp=();
1411: my %mapp=();
1412: my %typep=();
1413: my %keyp=();
1414: my %uris=();
1415: my %maptitles=();
1416:
1.2 www 1417: # -------------------------------------------------------- Variable declaration
1.209 www 1418:
1.129 www 1419: my %allmaps=();
1420: my %alllevs=();
1.57 albertel 1421:
1.187 www 1422: my $uname;
1423: my $udom;
1424: my $uhome;
1425: my $csec;
1.269 raeburn 1426: my $cgroup;
1.275 raeburn 1427: my @usersgroups = ();
1.187 www 1428:
1.190 albertel 1429: my $coursename=$env{'course.'.$env{'request.course.id'}.'.description'};
1.187 www 1430:
1.57 albertel 1431: $alllevs{'Resource Level'}='full';
1.215 www 1432: $alllevs{'Map/Folder Level'}='map';
1.57 albertel 1433: $alllevs{'Course Level'}='general';
1434:
1435: my %allparms;
1436: my %allparts;
1.210 www 1437: #
1438: # Order in which these parameters will be displayed
1439: #
1.211 www 1440: my %keyorder=&standardkeyorder();
1441:
1.43 albertel 1442: @ids=();
1443: %symbp=();
1444: %typep=();
1445:
1446: my $message='';
1447:
1.190 albertel 1448: $csec=$env{'form.csec'};
1.269 raeburn 1449: $cgroup=$env{'form.cgroup'};
1.188 www 1450:
1.190 albertel 1451: if ($udom=$env{'form.udom'}) {
1452: } elsif ($udom=$env{'request.role.domain'}) {
1453: } elsif ($udom=$env{'user.domain'}) {
1.172 albertel 1454: } else {
1455: $udom=$r->dir_config('lonDefDomain');
1456: }
1.43 albertel 1457:
1.134 albertel 1458: my @pscat=&Apache::loncommon::get_env_multiple('form.pscat');
1.190 albertel 1459: my $pschp=$env{'form.pschp'};
1.134 albertel 1460: my @psprt=&Apache::loncommon::get_env_multiple('form.psprt');
1.76 www 1461: if (!@psprt) { $psprt[0]='0'; }
1.57 albertel 1462:
1.43 albertel 1463: my $pssymb='';
1.57 albertel 1464: my $parmlev='';
1465:
1.190 albertel 1466: unless ($env{'form.parmlev'}) {
1.57 albertel 1467: $parmlev = 'map';
1468: } else {
1.190 albertel 1469: $parmlev = $env{'form.parmlev'};
1.57 albertel 1470: }
1.26 www 1471:
1.29 www 1472: # ----------------------------------------------- Was this started from grades?
1473:
1.190 albertel 1474: if (($env{'form.command'} eq 'set') && ($env{'form.url'})
1475: && (!$env{'form.dis'})) {
1476: my $url=$env{'form.url'};
1.194 albertel 1477: $url=~s-^http://($ENV{'SERVER_NAME'}|$ENV{'HTTP_HOST'})--;
1.43 albertel 1478: $pssymb=&Apache::lonnet::symbread($url);
1.92 albertel 1479: if (!@pscat) { @pscat=('all'); }
1.43 albertel 1480: $pschp='';
1.57 albertel 1481: $parmlev = 'full';
1.190 albertel 1482: } elsif ($env{'form.symb'}) {
1483: $pssymb=$env{'form.symb'};
1.92 albertel 1484: if (!@pscat) { @pscat=('all'); }
1.43 albertel 1485: $pschp='';
1.57 albertel 1486: $parmlev = 'full';
1.43 albertel 1487: } else {
1.190 albertel 1488: $env{'form.url'}='';
1.43 albertel 1489: }
1490:
1.190 albertel 1491: my $id=$env{'form.id'};
1.43 albertel 1492: if (($id) && ($udom)) {
1493: $uname=(&Apache::lonnet::idget($udom,$id))[1];
1494: if ($uname) {
1495: $id='';
1496: } else {
1497: $message=
1.314 albertel 1498: '<span class="LC_error">'.&mt("Unknown ID")." '$id' ".
1499: &mt('at domain')." '$udom'</span>";
1.43 albertel 1500: }
1501: } else {
1.190 albertel 1502: $uname=$env{'form.uname'};
1.43 albertel 1503: }
1504: unless ($udom) { $uname=''; }
1505: $uhome='';
1506: if ($uname) {
1507: $uhome=&Apache::lonnet::homeserver($uname,$udom);
1508: if ($uhome eq 'no_host') {
1509: $message=
1.314 albertel 1510: '<span class="LC_error">'.&mt("Unknown user")." '$uname' ".
1511: &mt("at domain")." '$udom'</span>";
1.43 albertel 1512: $uname='';
1.12 www 1513: } else {
1.103 albertel 1514: $csec=&Apache::lonnet::getsection($udom,$uname,
1.190 albertel 1515: $env{'request.course.id'});
1.269 raeburn 1516:
1.43 albertel 1517: if ($csec eq '-1') {
1.314 albertel 1518: $message='<span class="LC_error">'.
1.133 www 1519: &mt("User")." '$uname' ".&mt("at domain")." '$udom' ".
1.314 albertel 1520: &mt("not in this course")."</span>";
1.43 albertel 1521: $uname='';
1.190 albertel 1522: $csec=$env{'form.csec'};
1.269 raeburn 1523: $cgroup=$env{'form.cgroup'};
1.43 albertel 1524: } else {
1525: my %name=&Apache::lonnet::userenvironment($udom,$uname,
1526: ('firstname','middlename','lastname','generation','id'));
1.133 www 1527: $message="\n<p>\n".&mt("Full Name").": ".
1.43 albertel 1528: $name{'firstname'}.' '.$name{'middlename'}.' '
1529: .$name{'lastname'}.' '.$name{'generation'}.
1.336 albertel 1530: "<br />\n".&mt('ID').": ".$name{'id'}.'<p>';
1.43 albertel 1531: }
1.297 raeburn 1532: @usersgroups = &Apache::lonnet::get_users_groups(
1.275 raeburn 1533: $udom,$uname,$env{'request.course.id'});
1.297 raeburn 1534: if (@usersgroups > 0) {
1.306 albertel 1535: unless (grep(/^\Q$cgroup\E$/,@usersgroups)) {
1.275 raeburn 1536: $cgroup = $usersgroups[0];
1.297 raeburn 1537: }
1.269 raeburn 1538: }
1.12 www 1539: }
1.43 albertel 1540: }
1.2 www 1541:
1.43 albertel 1542: unless ($csec) { $csec=''; }
1.269 raeburn 1543: unless ($cgroup) { $cgroup=''; }
1.12 www 1544:
1.14 www 1545: # --------------------------------------------------------- Get all assessments
1.210 www 1546: &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps,
1547: \%mapp, \%symbp,\%maptitles,\%uris,
1548: \%keyorder);
1.63 bowersj2 1549:
1.57 albertel 1550: $mapp{'0.0'} = '';
1551: $symbp{'0.0'} = '';
1.99 albertel 1552:
1.14 www 1553: # ---------------------------------------------------------- Anything to store?
1.190 albertel 1554: if ($env{'form.pres_marker'}) {
1.205 www 1555: my @markers=split(/\&\&\&/,$env{'form.pres_marker'});
1556: my @values=split(/\&\&\&/,$env{'form.pres_value'});
1557: my @types=split(/\&\&\&/,$env{'form.pres_type'});
1558: for (my $i=0;$i<=$#markers;$i++) {
1559: $message.=&storeparm(split(/\&/,$markers[$i]),
1560: $values[$i],
1561: $types[$i],
1.269 raeburn 1562: $uname,$udom,$csec,$cgroup);
1.205 www 1563: }
1.68 www 1564: # ---------------------------------------------------------------- Done storing
1.130 www 1565: $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 1566: }
1.57 albertel 1567: #----------------------------------------------- if all selected, fill in array
1.209 www 1568: if ($pscat[0] eq "all") {@pscat = (keys %allparms);}
1569: if (!@pscat) { @pscat=('duedate','opendate','answerdate','weight','maxtries') };
1.57 albertel 1570: if ($psprt[0] eq "all" || !@psprt) {@psprt = (keys %allparts);}
1.2 www 1571: # ------------------------------------------------------------------ Start page
1.63 bowersj2 1572:
1.209 www 1573: &startpage($r);
1.57 albertel 1574:
1.44 albertel 1575: foreach ('tolerance','date_default','date_start','date_end',
1576: 'date_interval','int','float','string') {
1577: $r->print('<input type="hidden" value="'.
1.336 albertel 1578: $env{'form.recent_'.$_}.'" name="recent_'.$_.'" />');
1.44 albertel 1579: }
1.57 albertel 1580:
1.44 albertel 1581: if (!$pssymb) {
1.209 www 1582: $r->print('<table border="1"><tr><td>');
1583: &levelmenu($r,\%alllevs,$parmlev);
1.128 albertel 1584: if ($parmlev ne 'general') {
1.209 www 1585: $r->print('<td>');
1586: &mapmenu($r,\%allmaps,$pschp,\%maptitles);
1587: $r->print('</td>');
1.128 albertel 1588: }
1.209 www 1589: $r->print('</td></tr></table>');
1.211 www 1590: &displaymenu($r,\%allparms,\%allparts,\@pscat,\@psprt,\%keyorder);
1.44 albertel 1591: } else {
1.125 www 1592: my ($map,$id,$resource)=&Apache::lonnet::decode_symb($pssymb);
1.312 albertel 1593: my $title = &Apache::lonnet::gettitle($pssymb);
1594: $r->print(&mt('Specific Resource: [_1] ([_2])',$title,$resource).
1595: '<input type="hidden" value="'.$pssymb.'" name="symb" />'.
1.238 www 1596: '<br /><label><b>'.&mt('Show all parts').': <input type="checkbox" name="psprt" value="all"'.
1597: ($env{'form.psprt'}?' checked="checked"':'').' /></b></label><br />');
1.57 albertel 1598: }
1.275 raeburn 1599: &usermenu($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,\@usersgroups);
1.57 albertel 1600:
1.210 www 1601: $r->print('<p>'.$message.'</p>');
1602:
1.209 www 1603: $r->print('<br /><input type="submit" name="dis" value="'.&mt("Update Parameter Display").'" />');
1.57 albertel 1604:
1605: my @temp_pscat;
1606: map {
1607: my $cat = $_;
1608: push(@temp_pscat, map { $_.'.'.$cat } @psprt);
1609: } @pscat;
1610:
1611: @pscat = @temp_pscat;
1612:
1.209 www 1613: if (($env{'form.prevvisit'}) || ($pschp) || ($pssymb)) {
1.10 www 1614: # ----------------------------------------------------------------- Start Table
1.57 albertel 1615: my @catmarker=map { tr|.|_|; 'parameter_'.$_; } @pscat;
1.190 albertel 1616: my $csuname=$env{'user.name'};
1617: my $csudom=$env{'user.domain'};
1.57 albertel 1618:
1.203 www 1619: if ($parmlev eq 'full') {
1.57 albertel 1620: my $coursespan=$csec?8:5;
1.275 raeburn 1621: my $userspan=3;
1.269 raeburn 1622: if ($cgroup ne '') {
1623: $coursespan += 3;
1624: }
1625:
1.57 albertel 1626: $r->print('<p><table border=2>');
1627: $r->print('<tr><td colspan=5></td>');
1.130 www 1628: $r->print('<th colspan='.($coursespan).'>'.&mt('Any User').'</th>');
1.57 albertel 1629: if ($uname) {
1.275 raeburn 1630: if (@usersgroups > 1) {
1631: $userspan ++;
1632: }
1633: $r->print('<th colspan="'.$userspan.'" rowspan="2">');
1.130 www 1634: $r->print(&mt("User")." $uname ".&mt('at Domain')." $udom</th>");
1.57 albertel 1635: }
1.133 www 1636: my %lt=&Apache::lonlocal::texthash(
1637: 'pie' => "Parameter in Effect",
1638: 'csv' => "Current Session Value",
1639: 'at' => 'at',
1640: 'rl' => "Resource Level",
1641: 'ic' => 'in Course',
1642: 'aut' => "Assessment URL and Title",
1.143 albertel 1643: 'type' => 'Type',
1.133 www 1644: 'emof' => "Enclosing Map or Folder",
1.143 albertel 1645: 'part' => 'Part',
1.133 www 1646: 'pn' => 'Parameter Name',
1647: 'def' => 'default',
1648: 'femof' => 'from Enclosing Map or Folder',
1649: 'gen' => 'general',
1650: 'foremf' => 'for Enclosing Map or Folder',
1651: 'fr' => 'for Resource'
1652: );
1.57 albertel 1653: $r->print(<<ENDTABLETWO);
1.133 www 1654: <th rowspan=3>$lt{'pie'}</th>
1.336 albertel 1655: <th rowspan=3>$lt{'csv'}<br />($csuname $lt{'at'} $csudom)</th>
1.182 albertel 1656: </tr><tr><td colspan=5></td><th colspan=2>$lt{'ic'}</th><th colspan=2>$lt{'rl'}</th>
1657: <th colspan=1>$lt{'ic'}</th>
1658:
1.10 www 1659: ENDTABLETWO
1.57 albertel 1660: if ($csec) {
1.133 www 1661: $r->print("<th colspan=3>".
1.269 raeburn 1662: &mt("in Section")." $csec</th>");
1663: }
1664: if ($cgroup) {
1665: $r->print("<th colspan=3>".
1666: &mt("in Group")." $cgroup</th>");
1.57 albertel 1667: }
1668: $r->print(<<ENDTABLEHEADFOUR);
1.133 www 1669: </tr><tr><th>$lt{'aut'}</th><th>$lt{'type'}</th>
1670: <th>$lt{'emof'}</th><th>$lt{'part'}</th><th>$lt{'pn'}</th>
1.192 albertel 1671: <th>$lt{'gen'}</th><th>$lt{'foremf'}</th>
1672: <th>$lt{'def'}</th><th>$lt{'femof'}</th><th>$lt{'fr'}</th>
1.10 www 1673: ENDTABLEHEADFOUR
1.57 albertel 1674:
1675: if ($csec) {
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:
1.269 raeburn 1679: if ($cgroup) {
1680: $r->print('<th>'.&mt('general').'</th><th>'.&mt('for Enclosing Map or Folder').'</th><th>'.&mt('for Resource').'</th>');
1681: }
1682:
1.57 albertel 1683: if ($uname) {
1.275 raeburn 1684: if (@usersgroups > 1) {
1685: $r->print('<th>'.&mt('Control by other group?').'</th>');
1686: }
1.130 www 1687: $r->print('<th>'.&mt('general').'</th><th>'.&mt('for Enclosing Map or Folder').'</th><th>'.&mt('for Resource').'</th>');
1.57 albertel 1688: }
1689:
1690: $r->print('</tr>');
1691:
1692: my $defbgone='';
1693: my $defbgtwo='';
1.269 raeburn 1694: my $defbgthree = '';
1.57 albertel 1695:
1696: foreach (@ids) {
1697:
1698: my $rid=$_;
1699: my ($inmapid)=($rid=~/\.(\d+)$/);
1700:
1.152 albertel 1701: if ((!$pssymb &&
1702: (($pschp eq 'all') || ($allmaps{$pschp} eq $mapp{$rid})))
1703: ||
1704: ($pssymb && $pssymb eq $symbp{$rid})) {
1.4 www 1705: # ------------------------------------------------------ Entry for one resource
1.184 albertel 1706: if ($defbgone eq '"#E0E099"') {
1707: $defbgone='"#E0E0DD"';
1.57 albertel 1708: } else {
1.184 albertel 1709: $defbgone='"#E0E099"';
1.57 albertel 1710: }
1.184 albertel 1711: if ($defbgtwo eq '"#FFFF99"') {
1712: $defbgtwo='"#FFFFDD"';
1.57 albertel 1713: } else {
1.184 albertel 1714: $defbgtwo='"#FFFF99"';
1.57 albertel 1715: }
1.269 raeburn 1716: if ($defbgthree eq '"#FFBB99"') {
1717: $defbgthree='"#FFBBDD"';
1718: } else {
1719: $defbgthree='"#FFBB99"';
1720: }
1721:
1.57 albertel 1722: my $thistitle='';
1723: my %name= ();
1724: undef %name;
1725: my %part= ();
1726: my %display=();
1727: my %type= ();
1728: my %default=();
1.196 www 1729: my $uri=&Apache::lonnet::declutter($uris{$rid});
1.57 albertel 1730:
1.210 www 1731: foreach (&keysplit($keyp{$rid})) {
1.57 albertel 1732: my $tempkeyp = $_;
1733: if (grep $_ eq $tempkeyp, @catmarker) {
1734: $part{$_}=&Apache::lonnet::metadata($uri,$_.'.part');
1735: $name{$_}=&Apache::lonnet::metadata($uri,$_.'.name');
1736: $display{$_}=&Apache::lonnet::metadata($uri,$_.'.display');
1737: unless ($display{$_}) { $display{$_}=''; }
1738: $display{$_}.=' ('.$name{$_}.')';
1739: $default{$_}=&Apache::lonnet::metadata($uri,$_);
1740: $type{$_}=&Apache::lonnet::metadata($uri,$_.'.type');
1741: $thistitle=&Apache::lonnet::metadata($uri,$_.'.title');
1742: }
1743: }
1744: my $totalparms=scalar keys %name;
1745: if ($totalparms>0) {
1746: my $firstrow=1;
1.274 albertel 1747: my $title=&Apache::lonnet::gettitle($symbp{$rid});
1.57 albertel 1748: $r->print('<tr><td bgcolor='.$defbgone.
1749: ' rowspan='.$totalparms.
1750: '><tt><font size=-1>'.
1751: join(' / ',split(/\//,$uri)).
1752: '</font></tt><p><b>'.
1.154 albertel 1753: "<a href=\"javascript:openWindow('".
1.274 albertel 1754: &Apache::lonnet::clutter($uri).'?symb='.
1.308 www 1755: &escape($symbp{$rid}).
1.336 albertel 1756: "', 'metadatafile', '450', '500', 'no', 'yes');\"".
1757: " target=\"_self\">$title");
1.57 albertel 1758:
1759: if ($thistitle) {
1760: $r->print(' ('.$thistitle.')');
1761: }
1762: $r->print('</a></b></td>');
1763: $r->print('<td bgcolor='.$defbgtwo.
1764: ' rowspan='.$totalparms.'>'.$typep{$rid}.
1765: '</td>');
1766:
1767: $r->print('<td bgcolor='.$defbgone.
1768: ' rowspan='.$totalparms.
1.238 www 1769: '>'.$maptitles{$mapp{$rid}}.'</td>');
1.57 albertel 1770:
1.236 albertel 1771: foreach (&keysinorder_bytype(\%name,\%keyorder)) {
1.57 albertel 1772: unless ($firstrow) {
1773: $r->print('<tr>');
1774: } else {
1775: undef $firstrow;
1776: }
1.201 www 1777: &print_row($r,$_,\%part,\%name,\%symbp,$rid,\%default,
1.57 albertel 1778: \%type,\%display,$defbgone,$defbgtwo,
1.269 raeburn 1779: $defbgthree,$parmlev,$uname,$udom,$csec,
1.275 raeburn 1780: $cgroup,\@usersgroups);
1.57 albertel 1781: }
1782: }
1783: }
1784: } # end foreach ids
1.43 albertel 1785: # -------------------------------------------------- End entry for one resource
1.57 albertel 1786: $r->print('</table>');
1.203 www 1787: } # end of full
1.57 albertel 1788: #--------------------------------------------------- Entry for parm level map
1789: if ($parmlev eq 'map') {
1790: my $defbgone = '"E0E099"';
1791: my $defbgtwo = '"FFFF99"';
1.269 raeburn 1792: my $defbgthree = '"FFBB99"';
1.57 albertel 1793:
1794: my %maplist;
1795:
1796: if ($pschp eq 'all') {
1797: %maplist = %allmaps;
1798: } else {
1799: %maplist = ($pschp => $mapp{$pschp});
1800: }
1801:
1802: #-------------------------------------------- for each map, gather information
1803: my $mapid;
1.60 albertel 1804: foreach $mapid (sort {$maplist{$a} cmp $maplist{$b}} keys %maplist) {
1805: my $maptitle = $maplist{$mapid};
1.57 albertel 1806:
1807: #----------------------- loop through ids and get all parameter types for map
1808: #----------------------------------------- and associated information
1809: my %name = ();
1810: my %part = ();
1811: my %display = ();
1812: my %type = ();
1813: my %default = ();
1814: my $map = 0;
1815:
1816: # $r->print("Catmarker: @catmarker<br />\n");
1817:
1818: foreach (@ids) {
1819: ($map)=(/([\d]*?)\./);
1820: my $rid = $_;
1821:
1822: # $r->print("$mapid:$map: $rid <br /> \n");
1823:
1824: if ($map eq $mapid) {
1.196 www 1825: my $uri=&Apache::lonnet::declutter($uris{$rid});
1.57 albertel 1826: # $r->print("Keys: $keyp{$rid} <br />\n");
1827:
1828: #--------------------------------------------------------------------
1829: # @catmarker contains list of all possible parameters including part #s
1830: # $fullkeyp contains the full part/id # for the extraction of proper parameters
1831: # $tempkeyp contains part 0 only (no ids - ie, subparts)
1832: # When storing information, store as part 0
1833: # When requesting information, request from full part
1834: #-------------------------------------------------------------------
1.210 www 1835: foreach (&keysplit($keyp{$rid})) {
1.57 albertel 1836: my $tempkeyp = $_;
1837: my $fullkeyp = $tempkeyp;
1.73 albertel 1838: $tempkeyp =~ s/_\w+_/_0_/;
1.57 albertel 1839:
1840: if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {
1841: $part{$tempkeyp}="0";
1842: $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name');
1843: $display{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');
1844: unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; }
1845: $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')';
1.73 albertel 1846: $display{$tempkeyp} =~ s/_\w+_/_0_/;
1.57 albertel 1847: $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp);
1848: $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.type');
1849: }
1850: } # end loop through keys
1851: }
1852: } # end loop through ids
1853:
1854: #---------------------------------------------------- print header information
1.133 www 1855: my $foldermap=&mt($maptitle=~/^uploaded/?'Folder':'Map');
1.82 www 1856: my $showtitle=$maptitles{$maptitle}.($maptitle!~/^uploaded/?' ['.$maptitle.']':'');
1.57 albertel 1857: $r->print(<<ENDMAPONE);
1858: <center><h4>
1.135 albertel 1859: Set Defaults for All Resources in $foldermap<br />
1860: <font color="red"><i>$showtitle</i></font><br />
1.57 albertel 1861: Specifically for
1862: ENDMAPONE
1863: if ($uname) {
1.267 albertel 1864: my $person=&Apache::loncommon::plainname($uname,$udom);
1.135 albertel 1865: $r->print(&mt("User")." <font color=\"red\"><i>$uname \($person\) </i></font> ".
1.130 www 1866: &mt('in')." \n");
1.57 albertel 1867: } else {
1.135 albertel 1868: $r->print("<font color=\"red\"><i>".&mt('all').'</i></font> '.&mt('users in')." \n");
1.57 albertel 1869: }
1.269 raeburn 1870: if ($cgroup) {
1871: $r->print(&mt("Group")." <font color=\"red\"><i>$cgroup".
1872: "</i></font> ".&mt('of')." \n");
1873: $csec = '';
1874: } elsif ($csec) {
1875: $r->print(&mt("Section")." <font color=\"red\"><i>$csec".
1876: "</i></font> ".&mt('of')." \n");
1877: }
1.135 albertel 1878: $r->print("<font color=\"red\"><i>$coursename</i></font><br />");
1879: $r->print("</h4>\n");
1.57 albertel 1880: #---------------------------------------------------------------- print table
1881: $r->print('<p><table border="2">');
1.130 www 1882: $r->print('<tr><th>'.&mt('Parameter Name').'</th>');
1883: $r->print('<th>'.&mt('Default Value').'</th>');
1884: $r->print('<th>'.&mt('Parameter in Effect').'</th></tr>');
1.57 albertel 1885:
1.210 www 1886: foreach (&keysinorder(\%name,\%keyorder)) {
1.168 matthew 1887: $r->print('<tr>');
1.201 www 1888: &print_row($r,$_,\%part,\%name,\%symbp,$mapid,\%default,
1.269 raeburn 1889: \%type,\%display,$defbgone,$defbgtwo,$defbgthree,
1890: $parmlev,$uname,$udom,$csec,$cgroup);
1.57 albertel 1891: }
1892: $r->print("</table></center>");
1893: } # end each map
1894: } # end of $parmlev eq map
1895: #--------------------------------- Entry for parm level general (Course level)
1896: if ($parmlev eq 'general') {
1897: my $defbgone = '"E0E099"';
1898: my $defbgtwo = '"FFFF99"';
1.269 raeburn 1899: my $defbgthree = '"FFBB99"';
1.57 albertel 1900:
1901: #-------------------------------------------- for each map, gather information
1902: my $mapid="0.0";
1903: #----------------------- loop through ids and get all parameter types for map
1904: #----------------------------------------- and associated information
1905: my %name = ();
1906: my %part = ();
1907: my %display = ();
1908: my %type = ();
1909: my %default = ();
1910:
1911: foreach (@ids) {
1912: my $rid = $_;
1913:
1.196 www 1914: my $uri=&Apache::lonnet::declutter($uris{$rid});
1.57 albertel 1915:
1916: #--------------------------------------------------------------------
1917: # @catmarker contains list of all possible parameters including part #s
1918: # $fullkeyp contains the full part/id # for the extraction of proper parameters
1919: # $tempkeyp contains part 0 only (no ids - ie, subparts)
1920: # When storing information, store as part 0
1921: # When requesting information, request from full part
1922: #-------------------------------------------------------------------
1.210 www 1923: foreach (&keysplit($keyp{$rid})) {
1.57 albertel 1924: my $tempkeyp = $_;
1925: my $fullkeyp = $tempkeyp;
1.73 albertel 1926: $tempkeyp =~ s/_\w+_/_0_/;
1.57 albertel 1927: if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {
1928: $part{$tempkeyp}="0";
1929: $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name');
1930: $display{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');
1931: unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; }
1932: $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')';
1.73 albertel 1933: $display{$tempkeyp} =~ s/_\w+_/_0_/;
1.57 albertel 1934: $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp);
1935: $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.type');
1936: }
1937: } # end loop through keys
1938: } # end loop through ids
1939:
1940: #---------------------------------------------------- print header information
1.133 www 1941: my $setdef=&mt("Set Defaults for All Resources in Course");
1.57 albertel 1942: $r->print(<<ENDMAPONE);
1.133 www 1943: <center><h4>$setdef
1.135 albertel 1944: <font color="red"><i>$coursename</i></font><br />
1.57 albertel 1945: ENDMAPONE
1946: if ($uname) {
1.267 albertel 1947: my $person=&Apache::loncommon::plainname($uname,$udom);
1.135 albertel 1948: $r->print(" ".&mt("User")."<font color=\"red\"> <i>$uname \($person\) </i></font> \n");
1.57 albertel 1949: } else {
1.135 albertel 1950: $r->print("<i><font color=\"red\"> ".&mt("ALL")."</i> ".&mt("USERS")."</font> \n");
1.57 albertel 1951: }
1952:
1.135 albertel 1953: if ($csec) {$r->print(&mt("Section")."<font color=\"red\"> <i>$csec</i></font>\n")};
1.306 albertel 1954: if ($cgroup) {$r->print(&mt("Group")."<font color=\"red\"> <i>$cgroup</i></font>\n")};
1.135 albertel 1955: $r->print("</h4>\n");
1.57 albertel 1956: #---------------------------------------------------------------- print table
1957: $r->print('<p><table border="2">');
1.130 www 1958: $r->print('<tr><th>'.&mt('Parameter Name').'</th>');
1959: $r->print('<th>'.&mt('Default Value').'</th>');
1960: $r->print('<th>'.&mt('Parameter in Effect').'</th></tr>');
1.57 albertel 1961:
1.210 www 1962: foreach (&keysinorder(\%name,\%keyorder)) {
1.168 matthew 1963: $r->print('<tr>');
1.201 www 1964: &print_row($r,$_,\%part,\%name,\%symbp,$mapid,\%default,
1.269 raeburn 1965: \%type,\%display,$defbgone,$defbgtwo,$defbgthree,
1966: $parmlev,$uname,$udom,$csec,$cgroup);
1.57 albertel 1967: }
1968: $r->print("</table></center>");
1969: } # end of $parmlev eq general
1.43 albertel 1970: }
1.280 albertel 1971: $r->print('</form>'.&Apache::loncommon::end_page());
1.57 albertel 1972: } # end sub assessparms
1.30 www 1973:
1.59 matthew 1974:
1975: ##################################################
1976: ##################################################
1977:
1978: =pod
1979:
1980: =item crsenv
1981:
1.105 matthew 1982: Show and set course data and parameters. This is a large routine that should
1.59 matthew 1983: be simplified and shortened... someday.
1984:
1985: Inputs: $r
1986:
1987: Returns: nothing
1988:
1989: =cut
1990:
1991: ##################################################
1992: ##################################################
1.30 www 1993: sub crsenv {
1994: my $r=shift;
1995: my $setoutput='';
1.280 albertel 1996:
1.298 albertel 1997: my $breadcrumbs =
1998: &Apache::lonhtmlcommon::breadcrumbs('Edit Course Environment');
1.190 albertel 1999: my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
2000: my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.105 matthew 2001:
2002: #
2003: # Go through list of changes
1.190 albertel 2004: foreach (keys %env) {
1.105 matthew 2005: next if ($_!~/^form\.(.+)\_setparmval$/);
2006: my $name = $1;
1.190 albertel 2007: my $value = $env{'form.'.$name.'_value'};
1.105 matthew 2008: if ($name eq 'newp') {
1.190 albertel 2009: $name = $env{'form.newp_name'};
1.105 matthew 2010: }
2011: if ($name eq 'url') {
2012: $value=~s/^\/res\///;
2013: my $bkuptime=time;
2014: my @tmp = &Apache::lonnet::get
2015: ('environment',['url'],$dom,$crs);
1.130 www 2016: $setoutput.=&mt('Backing up previous URL').': '.
1.105 matthew 2017: &Apache::lonnet::put
2018: ('environment',
2019: {'top level map backup '.$bkuptime => $tmp[1] },
2020: $dom,$crs).
1.336 albertel 2021: '<br />';
1.105 matthew 2022: }
2023: #
2024: # Deal with modified default spreadsheets
2025: if ($name =~ /^spreadsheet_default_(classcalc|
2026: studentcalc|
2027: assesscalc)$/x) {
2028: my $sheettype = $1;
2029: if ($sheettype eq 'classcalc') {
2030: # no need to do anything since viewing the sheet will
2031: # cause it to be updated.
2032: } elsif ($sheettype eq 'studentcalc') {
2033: # expire all the student spreadsheets
2034: &Apache::lonnet::expirespread('','','studentcalc');
2035: } else {
2036: # expire all the assessment spreadsheets
2037: # this includes non-default spreadsheets, but better to
2038: # be safe than sorry.
2039: &Apache::lonnet::expirespread('','','assesscalc');
2040: # expire all the student spreadsheets
2041: &Apache::lonnet::expirespread('','','studentcalc');
1.30 www 2042: }
1.105 matthew 2043: }
2044: #
1.107 matthew 2045: # Deal with the enrollment dates
2046: if ($name =~ /^default_enrollment_(start|end)_date$/) {
2047: $value=&Apache::lonhtmlcommon::get_date_from_form($name.'_value');
2048: }
1.364 albertel 2049: #
2050: # Deal with the emails
2051: if ($name =~ /\.email$/) {
1.371 albertel 2052: foreach my $specifier (split(',',$value)) {
2053: my ($user,$sections_or_groups)=
2054: ($specifier=~/^([^\(]+)\(([^\)]+)\)/);
2055: if (!$sections_or_groups) {
2056: $user = $specifier;
2057: }
2058: my ($name,$domain) = split(':',$user);
2059: if (!defined($user) || !defined($domain)) {
2060: $setoutput.= '<br /> <span class="LC_error">'.
2061: &mt("Invalid email address specified, address must be of the form username:domain what was specified was ([_1])",$user).
2062: '</span>';
2063: undef($value);
2064: } elsif (&Apache::lonnet::homeserver($user,$domain) eq 'no_host') {
2065: $setoutput.= '<br /> <span class="LC_error">'.
2066: &mt("Invalid email address specified, user [_1] is unknown.",$name).
2067: '</span>';
2068: undef($value);
2069: }
1.364 albertel 2070: }
2071: }
1.178 raeburn 2072: # Get existing cloners
2073: my @oldcloner = ();
2074: if ($name eq 'cloners') {
2075: my %clonenames=&Apache::lonnet::dump('environment',$dom,$crs,'cloners');
2076: if ($clonenames{'cloners'} =~ /,/) {
2077: @oldcloner = split/,/,$clonenames{'cloners'};
2078: } else {
2079: $oldcloner[0] = $clonenames{'cloners'};
2080: }
2081: }
1.107 matthew 2082: #
1.105 matthew 2083: # Let the user know we made the changes
1.153 albertel 2084: if ($name && defined($value)) {
1.239 raeburn 2085: my $failed_cloners;
1.178 raeburn 2086: if ($name eq 'cloners') {
1.239 raeburn 2087: $value =~ s/\s//g;
1.178 raeburn 2088: $value =~ s/^,//;
2089: $value =~ s/,$//;
1.239 raeburn 2090: # check requested clones are valid users.
2091: $failed_cloners = &check_cloners(\$value,\@oldcloner);
1.178 raeburn 2092: }
1.105 matthew 2093: my $put_result = &Apache::lonnet::put('environment',
2094: {$name=>$value},$dom,$crs);
2095: if ($put_result eq 'ok') {
1.130 www 2096: $setoutput.=&mt('Set').' <b>'.$name.'</b> '.&mt('to').' <b>'.$value.'</b>.<br />';
1.178 raeburn 2097: if ($name eq 'cloners') {
2098: &change_clone($value,\@oldcloner);
2099: }
1.179 raeburn 2100: # Flush the course logs so course description is immediately updated
2101: if ($name eq 'description' && defined($value)) {
2102: &Apache::lonnet::flushcourselogs();
2103: }
1.105 matthew 2104: } else {
1.130 www 2105: $setoutput.=&mt('Unable to set').' <b>'.$name.'</b> '.&mt('to').
2106: ' <b>'.$value.'</b> '.&mt('due to').' '.$put_result.'.<br />';
1.30 www 2107: }
1.239 raeburn 2108: if (($name eq 'cloners') && ($failed_cloners)) {
2109: $setoutput.= &mt('Unable to include').' - <b>'.$failed_cloners.'</b>, '.
2110: &mt('reason').' - '.&mt('LON-CAPA user(s) do(es) not exist').
2111: '.<br />'.&mt('Please ').
2112: ' <a href="/adm/createuser">'.
2113: &mt('add the user(s)').'</a>, '.
2114: &mt('and then return to the ').
2115: '<a href="/admparmset?action=crsenv">'.
2116: &mt('Course Parameters page').'</a> '.
2117: &mt('to add the new user(s) to the list of possible cloners').
2118: '.<br />';
2119: }
1.30 www 2120: }
1.38 harris41 2121: }
1.315 albertel 2122:
2123: my $start_table =&Apache::loncommon::start_data_table();
2124: my $start_header_row=&Apache::loncommon::start_data_table_header_row();
2125: my $end_header_row =&Apache::loncommon::end_data_table_header_row();
1.108 www 2126: # ------------------------- Re-init course environment entries for this session
2127:
1.302 albertel 2128: &Apache::lonnet::coursedescription($env{'request.course.id'},
1.296 albertel 2129: {'freshen_cache' => 1});
1.105 matthew 2130:
1.30 www 2131: # -------------------------------------------------------- Get parameters again
1.45 matthew 2132:
2133: my %values=&Apache::lonnet::dump('environment',$dom,$crs);
1.140 sakharuk 2134: my $SelectStyleFile=&mt('Select Style File');
1.141 sakharuk 2135: my $SelectSpreadsheetFile=&mt('Select Spreadsheet File');
1.30 www 2136: my $output='';
1.45 matthew 2137: if (! exists($values{'con_lost'})) {
1.30 www 2138: my %descriptions=
1.140 sakharuk 2139: ('url' => '<b>'.&mt('Top Level Map').'</b> '.
1.46 matthew 2140: '<a href="javascript:openbrowser'.
1.47 matthew 2141: "('envform','url','sequence')\">".
1.314 albertel 2142: &mt('Select Map').'</a><br /><span class="LC_warning"> '.
1.140 sakharuk 2143: &mt('Modification may make assessment data inaccessible').
1.314 albertel 2144: '</span>',
1.140 sakharuk 2145: 'description' => '<b>'.&mt('Course Description').'</b>',
1.158 sakharuk 2146: 'courseid' => '<b>'.&mt('Course ID or number').
1.140 sakharuk 2147: '</b><br />'.
2148: '('.&mt('internal').', '.&mt('optional').')',
1.177 raeburn 2149: '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 2150: 'grading' => '<b>'.&mt('Grading').'</b><br />'.
2151: '<tt>"standard", "external", or "spreadsheet"</tt> '.&Apache::loncommon::help_open_topic('GradingOptions'),
1.373 albertel 2152: 'task_grading' => '<b>'.&mt('Bridge Task Grading').'</b><br />'.
2153: &mt('Instructors and TAs in sections, when grading bridge tasks, should be allowed to grade other sections, "[_1]" they are allowed (this is the default), "[_2]" no, they can only grade their own section','<tt>any</tt>','<tt>section</tt>'),
1.140 sakharuk 2154: 'default_xml_style' => '<b>'.&mt('Default XML Style File').'</b> '.
1.52 www 2155: '<a href="javascript:openbrowser'.
2156: "('envform','default_xml_style'".
1.336 albertel 2157: ",'sty')\">$SelectStyleFile</a><br />",
1.141 sakharuk 2158: 'question.email' => '<b>'.&mt('Feedback Addresses for Resource Content Question').
2159: '</b><br />(<tt>user:domain,'.
1.74 www 2160: 'user:domain(section;section;...;*;...),...</tt>)',
1.360 www 2161: 'question.email.text' => '<b>'.&mt('Custom Text for Resource Content Question Option in Feedback').
2162: '</b>',
1.141 sakharuk 2163: 'comment.email' => '<b>'.&mt('Feedback Addresses for Course Content Comments').'</b><br />'.
1.74 www 2164: '(<tt>user:domain,user:domain(section;section;...;*;...),...</tt>)',
1.360 www 2165: 'comment.email.text' => '<b>'.&mt('Custom Text for Course Content Option in Feedback').
2166: '</b>',
1.141 sakharuk 2167: 'policy.email' => '<b>'.&mt('Feedback Addresses for Course Policy').'</b>'.
1.75 albertel 2168: '<br />(<tt>user:domain,user:domain(section;section;...;*;...),...</tt>)',
1.360 www 2169: 'policy.email.text' => '<b>'.&mt('Custom Text for Course Policy Option in Feedback').
2170: '</b>',
1.141 sakharuk 2171: 'hideemptyrows' => '<b>'.&mt('Hide Empty Rows in Spreadsheets').'</b><br />'.
1.158 sakharuk 2172: '('.&mt('"[_1]" for default hiding','<tt>yes</tt>').')',
1.141 sakharuk 2173: 'pageseparators' => '<b>'.&mt('Visibly Separate Items on Pages').'</b><br />'.
1.158 sakharuk 2174: '('.&mt('"[_1]" for visible separation','<tt>yes</tt>').', '.
1.141 sakharuk 2175: &mt('changes will not show until next login').')',
1.169 matthew 2176: '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.372 raeburn 2177: 'student_classlist_portfiles' => '<b>'.&mt('Include link to accessible portfolio files').'</b><br />'.&mt('"[_1]" for link to each a listing of each student\'s files.','<tt>yes</tt>'),
2178: 'student_classlist_opt_in' => '<b>'.&mt("Student's agreement needed for listing in student-viewable roster").'</b><br />'.&mt('"[_1]" to require students to opt-in to listing in the roster (on the roster page).','<tt>yes</tt>'),
1.141 sakharuk 2179: 'plc.roles.denied'=> '<b>'.&mt('Disallow live chatroom use for Roles').
2180: '</b><br />"<tt>st</tt>": '.
1.158 sakharuk 2181: &mt('student').', "<tt>ta</tt>": '.
1.118 matthew 2182: 'TA, "<tt>in</tt>": '.
1.158 sakharuk 2183: &mt('instructor').';<br /><tt>'.&mt('role,role,...').'</tt>) '.
1.118 matthew 2184: Apache::loncommon::help_open_topic("Course_Disable_Discussion"),
2185: 'plc.users.denied' =>
1.141 sakharuk 2186: '<b>'.&mt('Disallow live chatroom use for Users').'</b><br />'.
1.118 matthew 2187: '(<tt>user:domain,user:domain,...</tt>)',
2188:
1.141 sakharuk 2189: 'pch.roles.denied'=> '<b>'.&mt('Disallow Resource Discussion for Roles').
2190: '</b><br />"<tt>st</tt>": '.
1.61 albertel 2191: 'student, "<tt>ta</tt>": '.
2192: 'TA, "<tt>in</tt>": '.
1.75 albertel 2193: 'instructor;<br /><tt>role,role,...</tt>) '.
1.61 albertel 2194: Apache::loncommon::help_open_topic("Course_Disable_Discussion"),
1.53 www 2195: 'pch.users.denied' =>
1.141 sakharuk 2196: '<b>'.&mt('Disallow Resource Discussion for Users').'</b><br />'.
1.53 www 2197: '(<tt>user:domain,user:domain,...</tt>)',
1.49 matthew 2198: 'spreadsheet_default_classcalc'
1.141 sakharuk 2199: => '<b>'.&mt('Default Course Spreadsheet').'</b> '.
1.50 matthew 2200: '<a href="javascript:openbrowser'.
2201: "('envform','spreadsheet_default_classcalc'".
1.141 sakharuk 2202: ",'spreadsheet')\">$SelectSpreadsheetFile</a><br />",
1.49 matthew 2203: 'spreadsheet_default_studentcalc'
1.141 sakharuk 2204: => '<b>'.&mt('Default Student Spreadsheet').'</b> '.
1.50 matthew 2205: '<a href="javascript:openbrowser'.
2206: "('envform','spreadsheet_default_calc'".
1.141 sakharuk 2207: ",'spreadsheet')\">$SelectSpreadsheetFile</a><br />",
1.49 matthew 2208: 'spreadsheet_default_assesscalc'
1.141 sakharuk 2209: => '<b>'.&mt('Default Assessment Spreadsheet').'</b> '.
1.50 matthew 2210: '<a href="javascript:openbrowser'.
2211: "('envform','spreadsheet_default_assesscalc'".
1.141 sakharuk 2212: ",'spreadsheet')\">$SelectSpreadsheetFile</a><br />",
1.75 albertel 2213: 'allow_limited_html_in_feedback'
1.141 sakharuk 2214: => '<b>'.&mt('Allow limited HTML in discussion posts').'</b><br />'.
1.158 sakharuk 2215: '('.&mt('Set value to "[_1]" to allow',"<tt>yes</tt>").')',
1.170 raeburn 2216: 'allow_discussion_post_editing'
1.276 raeburn 2217: => '<b>'.&mt('Allow users with specified roles to edit/delete their own discussion posts').'</b><br />"<tt>st</tt>": '.
2218: &mt('student').', "<tt>ta</tt>": '.
2219: 'TA, "<tt>in</tt>": '.
2220: &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 />'.
2221: '('.&mt('or set value to "[_1]" to allow all roles',"<tt>yes</tt>").')',
1.89 albertel 2222: 'rndseed'
1.140 sakharuk 2223: => '<b>'.&mt('Randomization algorithm used').'</b> <br />'.
1.314 albertel 2224: '<span class="LC_error">'.&mt('Modifying this will make problems').' '.
2225: &mt('have different numbers and answers').'</span>',
1.151 albertel 2226: 'receiptalg'
2227: => '<b>'.&mt('Receipt algorithm used').'</b> <br />'.
2228: &mt('This controls how receipt numbers are generated.'),
1.164 sakharuk 2229: 'suppress_tries'
1.272 albertel 2230: => '<b>'.&mt('Suppress number of tries in printing').'</b><br />'.
1.273 www 2231: ' ('.&mt('"[_1]" to suppress, anything else to not suppress','<tt>yes</tt>').')',
1.113 sakharuk 2232: 'problem_stream_switch'
1.141 sakharuk 2233: => '<b>'.&mt('Allow problems to be split over pages').'</b><br />'.
1.158 sakharuk 2234: ' ('.&mt('"[_1]" if allowed, anything else if not','<tt>yes</tt>').')',
1.161 sakharuk 2235: 'default_paper_size'
2236: => '<b>'.&mt('Default paper type').'</b><br />'.
2237: ' ('.&mt('supported types').': Letter [8 1/2x11 in], Legal [8 1/2x14 in],'.
2238: ' Tabloid [11x17 in], Executive [7 1/2x10 in], A2 [420x594 mm],'.
2239: ' A3 [297x420 mm], A4 [210x297 mm], A5 [148x210 mm], A6 [105x148 mm])',
1.319 foxr 2240: 'print_header_format'
1.369 albertel 2241: => &mtn('<b> Print header format; substitutions </b>: %n student name %c course id %a assignment note, numbers after the % limit the field size.').'</b>',
1.217 albertel 2242: 'default_enrollment_start_date' => '<b>'.&mt('Default beginning date for student access.').'</b>',
2243: 'default_enrollment_end_date' => '<b>'.&mt('Default ending date for student access.').'</b>',
1.150 www 2244: 'nothideprivileged' => '<b>'.&mt('Privileged users that should not be hidden on staff listings').'</b>'.
2245: '<br />(<tt>user:domain,user:domain,...</tt>)',
1.140 sakharuk 2246: 'languages' => '<b>'.&mt('Languages used').'</b>',
1.115 www 2247: 'disable_receipt_display'
1.141 sakharuk 2248: => '<b>'.&mt('Disable display of problem receipts').'</b><br />'.
1.158 sakharuk 2249: ' ('.&mt('"[_1]" to disable, anything else if not','<tt>yes</tt>').')',
1.313 albertel 2250: 'task_messages'
1.360 www 2251: => '<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 2252: 'disablesigfigs'
2253: => '<b>'.&mt('Disable checking of Significant Figures').'</b><br />'.
2254: ' ('.&mt('"[_1]" to disable, anything else if not','<tt>yes</tt>').')',
1.251 albertel 2255: 'disableexampointprint'
2256: => '<b>'.&mt('Disable automatically printing point values onto exams.').'</b><br />'.
2257: ' ('.&mt('"[_1]" to disable, anything else if not','<tt>yes</tt>').')',
1.278 www 2258: 'externalsyllabus'
1.279 www 2259: => '<b>'.&mt('URL of Syllabus (not using internal handler)').'</b>',
1.149 albertel 2260: 'tthoptions'
1.367 albertel 2261: => '<b>'.&mt('Default set of options to pass to tth/m when converting tex').'</b>',
2262:
2263: 'texengine'
1.368 albertel 2264: => '<b>'.&mt('Force all students in the course to use a specific math rendering engine.').'</b><br />'.&mt('(Valid options are [_1].)','"tth", "jsMath", "mimetex"').'</b>',
1.107 matthew 2265: );
1.177 raeburn 2266: my @Display_Order = ('url','description','courseid','cloners','grading',
1.278 www 2267: 'externalsyllabus',
1.107 matthew 2268: 'default_xml_style','pageseparators',
1.360 www 2269: 'question.email','question.email.text','comment.email','comment.email.text','policy.email','policy.email.text',
1.169 matthew 2270: 'student_classlist_view',
1.372 raeburn 2271: 'student_classlist_opt_in',
2272: 'student_classlist_portfiles',
1.118 matthew 2273: 'plc.roles.denied','plc.users.denied',
1.107 matthew 2274: 'pch.roles.denied','pch.users.denied',
2275: 'allow_limited_html_in_feedback',
1.170 raeburn 2276: 'allow_discussion_post_editing',
1.108 www 2277: 'languages',
1.150 www 2278: 'nothideprivileged',
1.107 matthew 2279: 'rndseed',
1.151 albertel 2280: 'receiptalg',
1.107 matthew 2281: 'problem_stream_switch',
1.164 sakharuk 2282: 'suppress_tries',
1.161 sakharuk 2283: 'default_paper_size',
1.319 foxr 2284: 'print_header_format',
1.115 www 2285: 'disable_receipt_display',
1.107 matthew 2286: 'spreadsheet_default_classcalc',
2287: 'spreadsheet_default_studentcalc',
2288: 'spreadsheet_default_assesscalc',
2289: 'hideemptyrows',
2290: 'default_enrollment_start_date',
2291: 'default_enrollment_end_date',
1.163 albertel 2292: 'tthoptions',
1.367 albertel 2293: 'texengine',
1.251 albertel 2294: 'disablesigfigs',
1.313 albertel 2295: 'disableexampointprint',
1.373 albertel 2296: 'task_messages','task_grading',
1.107 matthew 2297: );
2298: foreach my $parameter (sort(keys(%values))) {
1.244 banghart 2299: unless (($parameter =~ m/^internal\./)||($parameter =~ m/^metadata\./)) {
1.142 raeburn 2300: if (! $descriptions{$parameter}) {
2301: $descriptions{$parameter}=$parameter;
2302: push(@Display_Order,$parameter);
2303: }
2304: }
1.43 albertel 2305: }
1.315 albertel 2306:
1.107 matthew 2307: foreach my $parameter (@Display_Order) {
2308: my $description = $descriptions{$parameter};
1.51 matthew 2309: # onchange is javascript to automatically check the 'Set' button.
1.69 www 2310: my $onchange = 'onFocus="javascript:window.document.forms'.
1.107 matthew 2311: "['envform'].elements['".$parameter."_setparmval']".
1.51 matthew 2312: '.checked=true;"';
1.315 albertel 2313: $output .= &Apache::loncommon::start_data_table_row().
2314: '<td>'.$description.'</td>';
1.107 matthew 2315: if ($parameter =~ /^default_enrollment_(start|end)_date$/) {
2316: $output .= '<td>'.
2317: &Apache::lonhtmlcommon::date_setter('envform',
2318: $parameter.'_value',
2319: $values{$parameter},
2320: $onchange).
2321: '</td>';
2322: } else {
2323: $output .= '<td>'.
2324: &Apache::lonhtmlcommon::textbox($parameter.'_value',
2325: $values{$parameter},
2326: 40,$onchange).'</td>';
2327: }
2328: $output .= '<td>'.
2329: &Apache::lonhtmlcommon::checkbox($parameter.'_setparmval').
2330: '</td>';
1.315 albertel 2331: $output .= &Apache::loncommon::end_data_table_row()."\n";
1.51 matthew 2332: }
1.69 www 2333: my $onchange = 'onFocus="javascript:window.document.forms'.
1.51 matthew 2334: '[\'envform\'].elements[\'newp_setparmval\']'.
2335: '.checked=true;"';
1.315 albertel 2336: $output.=&Apache::loncommon::start_data_table_row().
2337: '<td><i>'.&mt('Create New Environment Variable').'</i><br />'.
1.51 matthew 2338: '<input type="text" size=40 name="newp_name" '.
2339: $onchange.' /></td><td>'.
2340: '<input type="text" size=40 name="newp_value" '.
2341: $onchange.' /></td><td>'.
1.315 albertel 2342: '<input type="checkbox" name="newp_setparmval" /></td>'.
2343: &Apache::loncommon::end_data_table_row()."\n";
1.43 albertel 2344: }
1.157 sakharuk 2345: my %lt=&Apache::lonlocal::texthash(
2346: 'par' => 'Parameter',
2347: 'val' => 'Value',
2348: 'set' => 'Set',
2349: 'sce' => 'Set Course Environment'
2350: );
2351:
1.140 sakharuk 2352: my $Parameter=&mt('Parameter');
2353: my $Value=&mt('Value');
1.141 sakharuk 2354: my $Set=&mt('Set');
1.280 albertel 2355: my $browse_js=
2356: '<script type="text/javascript" language="Javascript">'.
2357: &Apache::loncommon::browser_and_searcher_javascript('parmset').
2358: '</script>';
2359:
2360: my $start_page =
1.323 albertel 2361: &Apache::loncommon::start_page('Set Course Environment',
1.280 albertel 2362: $browse_js);
2363: my $end_page =
2364: &Apache::loncommon::end_page();
1.315 albertel 2365: my $end_table=&Apache::loncommon::end_data_table();
1.280 albertel 2366: $r->print(<<ENDENV);
2367: $start_page
1.193 albertel 2368: $breadcrumbs
2369: <form method="post" action="/adm/parmset?action=crsenv" name="envform">
1.30 www 2370: $setoutput
1.315 albertel 2371: $start_table
2372: $start_header_row
2373: <th>$lt{'par'}</th><th>$lt{'val'}</th><th>$lt{'set'}?</th>
2374: $end_header_row
1.30 www 2375: $output
1.315 albertel 2376: $end_table
1.369 albertel 2377: <input type="submit" name="crsenv" value="$lt{'sce'}" />
1.30 www 2378: </form>
1.280 albertel 2379: $end_page
2380: ENDENV
1.30 www 2381: }
1.120 www 2382: ##################################################
1.207 www 2383: # Overview mode
2384: ##################################################
1.124 www 2385: my $tableopen;
2386:
2387: sub tablestart {
2388: if ($tableopen) {
2389: return '';
2390: } else {
2391: $tableopen=1;
1.295 albertel 2392: return &Apache::loncommon::start_data_table().'<tr><th>'.&mt('Parameter').'</th><th>'.
1.130 www 2393: &mt('Delete').'</th><th>'.&mt('Set to ...').'</th></tr>';
1.124 www 2394: }
2395: }
2396:
2397: sub tableend {
2398: if ($tableopen) {
2399: $tableopen=0;
1.295 albertel 2400: return &Apache::loncommon::end_data_table();
1.124 www 2401: } else {
2402: return'';
2403: }
2404: }
2405:
1.207 www 2406: sub readdata {
2407: my ($crs,$dom)=@_;
2408: # Read coursedata
2409: my $resourcedata=&Apache::lonnet::get_courseresdata($crs,$dom);
2410: # Read userdata
2411:
2412: my $classlist=&Apache::loncoursedata::get_classlist();
2413: foreach (keys %$classlist) {
1.350 albertel 2414: if ($_=~/^($match_username)\:($match_domain)$/) {
1.207 www 2415: my ($tuname,$tudom)=($1,$2);
2416: my $useropt=&Apache::lonnet::get_userresdata($tuname,$tudom);
2417: foreach my $userkey (keys %{$useropt}) {
2418: if ($userkey=~/^$env{'request.course.id'}/) {
2419: my $newkey=$userkey;
2420: $newkey=~s/^($env{'request.course.id'}\.)/$1\[useropt\:$tuname\:$tudom\]\./;
2421: $$resourcedata{$newkey}=$$useropt{$userkey};
2422: }
2423: }
2424: }
2425: }
2426: return $resourcedata;
2427: }
2428:
2429:
1.124 www 2430: # Setting
1.208 www 2431:
2432: sub storedata {
2433: my ($r,$crs,$dom)=@_;
1.207 www 2434: # Set userlevel immediately
2435: # Do an intermediate store of course level
2436: my $olddata=&readdata($crs,$dom);
1.124 www 2437: my %newdata=();
2438: undef %newdata;
2439: my @deldata=();
2440: undef @deldata;
1.190 albertel 2441: foreach (keys %env) {
1.124 www 2442: if ($_=~/^form\.([a-z]+)\_(.+)$/) {
2443: my $cmd=$1;
2444: my $thiskey=$2;
1.207 www 2445: my ($tuname,$tudom)=&extractuser($thiskey);
2446: my $tkey=$thiskey;
2447: if ($tuname) {
2448: $tkey=~s/\.\[useropt\:$tuname\:$tudom\]\./\./;
2449: }
1.124 www 2450: if ($cmd eq 'set') {
1.190 albertel 2451: my $data=$env{$_};
1.212 www 2452: my $typeof=$env{'form.typeof_'.$thiskey};
2453: if ($$olddata{$thiskey} ne $data) {
1.207 www 2454: if ($tuname) {
1.212 www 2455: if (&Apache::lonnet::put('resourcedata',{$tkey=>$data,
2456: $tkey.'.type' => $typeof},
2457: $tudom,$tuname) eq 'ok') {
1.290 www 2458: &log_parmset({$tkey=>$data,$tkey.'.type' => $typeof},0,$tuname,$tudom);
1.365 albertel 2459: $r->print('<br />'.&mt('Saved modified parameter for').' '.
1.207 www 2460: &Apache::loncommon::plainname($tuname,$tudom));
2461: } else {
1.314 albertel 2462: $r->print('<div class="LC_error">'.
1.365 albertel 2463: &mt('Error saving parameters').'</div>');
1.207 www 2464: }
2465: &Apache::lonnet::devalidateuserresdata($tuname,$tudom);
2466: } else {
2467: $newdata{$thiskey}=$data;
1.212 www 2468: $newdata{$thiskey.'.type'}=$typeof;
2469: }
1.207 www 2470: }
1.124 www 2471: } elsif ($cmd eq 'del') {
1.207 www 2472: if ($tuname) {
2473: if (&Apache::lonnet::del('resourcedata',[$tkey],$tudom,$tuname) eq 'ok') {
1.290 www 2474: &log_parmset({$tkey=>''},1,$tuname,$tudom);
1.207 www 2475: $r->print('<br />'.&mt('Deleted parameter for').' '.&Apache::loncommon::plainname($tuname,$tudom));
2476: } else {
1.314 albertel 2477: $r->print('<div class="LC_error">'.
2478: &mt('Error deleting parameters').'</div>');
1.207 www 2479: }
2480: &Apache::lonnet::devalidateuserresdata($tuname,$tudom);
2481: } else {
1.333 albertel 2482: push (@deldata,$thiskey,$thiskey.'.type');
1.207 www 2483: }
1.124 www 2484: } elsif ($cmd eq 'datepointer') {
1.190 albertel 2485: my $data=&Apache::lonhtmlcommon::get_date_from_form($env{$_});
1.212 www 2486: my $typeof=$env{'form.typeof_'.$thiskey};
1.207 www 2487: if (defined($data) and $$olddata{$thiskey} ne $data) {
2488: if ($tuname) {
1.212 www 2489: if (&Apache::lonnet::put('resourcedata',{$tkey=>$data,
2490: $tkey.'.type' => $typeof},
2491: $tudom,$tuname) eq 'ok') {
1.290 www 2492: &log_parmset({$tkey=>$data,$tkey.'.type' => $typeof},0,$tuname,$tudom);
1.365 albertel 2493: $r->print('<br />'.&mt('Saved modified date for').' '.&Apache::loncommon::plainname($tuname,$tudom));
1.207 www 2494: } else {
1.314 albertel 2495: $r->print('<div class="LC_error">'.
1.365 albertel 2496: &mt('Error saving parameters').'</div>');
1.207 www 2497: }
2498: &Apache::lonnet::devalidateuserresdata($tuname,$tudom);
2499: } else {
1.212 www 2500: $newdata{$thiskey}=$data;
2501: $newdata{$thiskey.'.type'}=$typeof;
1.207 www 2502: }
2503: }
1.124 www 2504: }
2505: }
2506: }
1.207 www 2507: # Store all course level
1.144 www 2508: my $delentries=$#deldata+1;
2509: my @newdatakeys=keys %newdata;
2510: my $putentries=$#newdatakeys+1;
2511: if ($delentries) {
2512: if (&Apache::lonnet::del('resourcedata',\@deldata,$dom,$crs) eq 'ok') {
1.290 www 2513: my %loghash=map { $_ => '' } @deldata;
2514: &log_parmset(\%loghash,1);
1.144 www 2515: $r->print('<h2>'.&mt('Deleted [_1] parameter(s)</h2>',$delentries));
2516: } else {
1.314 albertel 2517: $r->print('<div class="LC_error">'.
2518: &mt('Error deleting parameters').'</div>');
1.144 www 2519: }
1.205 www 2520: &Apache::lonnet::devalidatecourseresdata($crs,$dom);
1.144 www 2521: }
2522: if ($putentries) {
2523: if (&Apache::lonnet::put('resourcedata',\%newdata,$dom,$crs) eq 'ok') {
1.290 www 2524: &log_parmset(\%newdata,0);
1.365 albertel 2525: $r->print('<h3>'.&mt('Saved [_1] parameter(s)',$putentries/2).'</h3>');
1.144 www 2526: } else {
1.314 albertel 2527: $r->print('<div class="LC_error">'.
1.365 albertel 2528: &mt('Error saving parameters').'</div>');
1.144 www 2529: }
1.205 www 2530: &Apache::lonnet::devalidatecourseresdata($crs,$dom);
1.144 www 2531: }
1.208 www 2532: }
1.207 www 2533:
1.208 www 2534: sub extractuser {
2535: my $key=shift;
1.350 albertel 2536: return ($key=~/^$env{'request.course.id'}.\[useropt\:($match_username)\:($match_domain)\]\./);
1.208 www 2537: }
1.206 www 2538:
1.208 www 2539: sub listdata {
1.214 www 2540: my ($r,$resourcedata,$listdata,$sortorder)=@_;
1.207 www 2541: # Start list output
1.206 www 2542:
1.122 www 2543: my $oldsection='';
2544: my $oldrealm='';
2545: my $oldpart='';
1.123 www 2546: my $pointer=0;
1.124 www 2547: $tableopen=0;
1.145 www 2548: my $foundkeys=0;
1.248 albertel 2549: my %keyorder=&standardkeyorder();
1.214 www 2550: foreach my $thiskey (sort {
2551: if ($sortorder eq 'realmstudent') {
1.247 albertel 2552: my ($astudent,$arealm)=($a=~/^\Q$env{'request.course.id'}\E\.\[([^\.]+)\]\.(.+)\.[^\.]+$/);
2553: my ($bstudent,$brealm)=($b=~/^\Q$env{'request.course.id'}\E\.\[([^\.]+)\]\.(.+)\.[^\.]+$/);
2554: if (!defined($astudent)) {
2555: ($arealm)=($a=~/^\Q$env{'request.course.id'}\E\.(.+)$/);
1.237 albertel 2556: }
1.247 albertel 2557: if (!defined($bstudent)) {
2558: ($brealm)=($b=~/^\Q$env{'request.course.id'}\E\.(.+)$/);
2559: }
1.248 albertel 2560: $arealm=~s/\.type//;
2561: my ($ares, $aparm) = ($arealm=~/^(.*)\.(.*)$/);
2562: $aparm=$keyorder{'parameter_0_'.$aparm};
2563: $brealm=~s/\.type//;
2564: my ($bres, $bparm) = ($brealm=~/^(.*)\.(.*)$/);
2565: $bparm=$keyorder{'parameter_0_'.$bparm};
2566: if ($ares eq $bres) {
2567: if (defined($aparm) && defined($bparm)) {
2568: ($aparm <=> $bparm);
2569: } elsif (defined($aparm)) {
2570: -1;
2571: } elsif (defined($bparm)) {
2572: 1;
2573: } else {
2574: ($arealm cmp $brealm) || ($astudent cmp $bstudent);
2575: }
2576: } else {
2577: ($arealm cmp $brealm) || ($astudent cmp $bstudent);
2578: }
1.214 www 2579: } else {
2580: $a cmp $b;
2581: }
2582: } keys %{$listdata}) {
1.247 albertel 2583:
1.211 www 2584: if ($$listdata{$thiskey.'.type'}) {
2585: my $thistype=$$listdata{$thiskey.'.type'};
2586: if ($$resourcedata{$thiskey.'.type'}) {
2587: $thistype=$$resourcedata{$thiskey.'.type'};
2588: }
1.207 www 2589: my ($middle,$part,$name)=
2590: ($thiskey=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);
1.130 www 2591: my $section=&mt('All Students');
1.207 www 2592: if ($middle=~/^\[(.*)\]/) {
1.206 www 2593: my $issection=$1;
1.350 albertel 2594: if ($issection=~/^useropt\:($match_username)\:($match_domain)/) {
1.206 www 2595: $section=&mt('User').": ".&Apache::loncommon::plainname($1,$2);
2596: } else {
2597: $section=&mt('Group/Section').': '.$issection;
2598: }
1.207 www 2599: $middle=~s/^\[(.*)\]//;
1.122 www 2600: }
1.207 www 2601: $middle=~s/\.+$//;
2602: $middle=~s/^\.+//;
1.316 albertel 2603: my $realm='<span class="LC_parm_scope_all">'.&mt('All Resources').'</span>';
1.122 www 2604: if ($middle=~/^(.+)\_\_\_\(all\)$/) {
1.316 albertel 2605: $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 2606: } elsif ($middle) {
1.174 albertel 2607: my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle);
1.316 albertel 2608: $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 2609: }
1.214 www 2610: if ($sortorder eq 'realmstudent') {
2611: if ($realm ne $oldrealm) {
2612: $r->print(&tableend()."\n<hr /><h1>$realm</h1>");
2613: $oldrealm=$realm;
2614: $oldsection='';
2615: }
2616: if ($section ne $oldsection) {
2617: $r->print(&tableend()."\n<h2>$section</h2>");
2618: $oldsection=$section;
2619: $oldpart='';
2620: }
2621: } else {
2622: if ($section ne $oldsection) {
2623: $r->print(&tableend()."\n<hr /><h1>$section</h1>");
2624: $oldsection=$section;
2625: $oldrealm='';
2626: }
2627: if ($realm ne $oldrealm) {
2628: $r->print(&tableend()."\n<h2>$realm</h2>");
2629: $oldrealm=$realm;
2630: $oldpart='';
2631: }
1.122 www 2632: }
2633: if ($part ne $oldpart) {
1.124 www 2634: $r->print(&tableend().
1.316 albertel 2635: "\n<span class=\"LC_parm_part\">".&mt('Part').": $part</span>");
1.122 www 2636: $oldpart=$part;
2637: }
1.123 www 2638: #
2639: # Ready to print
2640: #
1.295 albertel 2641: $r->print(&tablestart().
2642: &Apache::loncommon::start_data_table_row().
2643: '<td><b>'.&standard_parameter_names($name).
1.293 www 2644: '</b></td><td><input type="checkbox" name="del_'.
1.124 www 2645: $thiskey.'" /></td><td>');
1.145 www 2646: $foundkeys++;
1.213 www 2647: if (&isdateparm($thistype)) {
1.123 www 2648: my $jskey='key_'.$pointer;
2649: $pointer++;
2650: $r->print(
1.232 albertel 2651: &Apache::lonhtmlcommon::date_setter('parmform',
1.123 www 2652: $jskey,
1.219 www 2653: $$resourcedata{$thiskey},
1.325 www 2654: '',1,'','').
1.277 www 2655: '<input type="hidden" name="datepointer_'.$thiskey.'" value="'.$jskey.'" />'.
2656: &date_sanity_info($$resourcedata{$thiskey})
1.123 www 2657: );
1.219 www 2658: } elsif ($thistype eq 'string_yesno') {
1.230 www 2659: my $showval;
2660: if (defined($$resourcedata{$thiskey})) {
2661: $showval=$$resourcedata{$thiskey};
2662: }
1.219 www 2663: $r->print('<label><input type="radio" name="set_'.$thiskey.
2664: '" value="yes"');
1.230 www 2665: if ($showval eq 'yes') {
1.219 www 2666: $r->print(' checked="checked"');
2667: }
2668: $r->print(' />'.&mt('Yes').'</label> ');
2669: $r->print('<label><input type="radio" name="set_'.$thiskey.
2670: '" value="no"');
1.230 www 2671: if ($showval eq 'no') {
1.219 www 2672: $r->print(' checked="checked"');
2673: }
2674: $r->print(' />'.&mt('No').'</label>');
1.123 www 2675: } else {
1.230 www 2676: my $showval;
2677: if (defined($$resourcedata{$thiskey})) {
2678: $showval=$$resourcedata{$thiskey};
2679: }
1.211 www 2680: $r->print('<input type="text" name="set_'.$thiskey.'" value="'.
1.230 www 2681: $showval.'">');
1.123 www 2682: }
1.211 www 2683: $r->print('<input type="hidden" name="typeof_'.$thiskey.'" value="'.
2684: $thistype.'">');
1.295 albertel 2685: $r->print('</td>'.&Apache::loncommon::end_data_table_row());
1.122 www 2686: }
1.121 www 2687: }
1.208 www 2688: return $foundkeys;
2689: }
2690:
2691: sub newoverview {
1.280 albertel 2692: my ($r) = @_;
2693:
1.208 www 2694: my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
2695: my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.280 albertel 2696: my $start_page = &Apache::loncommon::start_page('Set Parameters');
1.298 albertel 2697: my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Overview');
1.208 www 2698: $r->print(<<ENDOVER);
1.280 albertel 2699: $start_page
1.208 www 2700: $breadcrumbs
1.232 albertel 2701: <form method="post" action="/adm/parmset?action=newoverview" name="parmform">
1.208 www 2702: ENDOVER
1.211 www 2703: my @ids=();
2704: my %typep=();
2705: my %keyp=();
2706: my %allparms=();
2707: my %allparts=();
2708: my %allmaps=();
2709: my %mapp=();
2710: my %symbp=();
2711: my %maptitles=();
2712: my %uris=();
2713: my %keyorder=&standardkeyorder();
2714: my %defkeytype=();
2715:
2716: my %alllevs=();
2717: $alllevs{'Resource Level'}='full';
1.215 www 2718: $alllevs{'Map/Folder Level'}='map';
1.211 www 2719: $alllevs{'Course Level'}='general';
2720:
2721: my $csec=$env{'form.csec'};
1.269 raeburn 2722: my $cgroup=$env{'form.cgroup'};
1.211 www 2723:
2724: my @pscat=&Apache::loncommon::get_env_multiple('form.pscat');
2725: my $pschp=$env{'form.pschp'};
2726: my @psprt=&Apache::loncommon::get_env_multiple('form.psprt');
2727: if (!@psprt) { $psprt[0]='0'; }
2728:
2729: my @selected_sections =
2730: &Apache::loncommon::get_env_multiple('form.Section');
2731: @selected_sections = ('all') if (! @selected_sections);
1.374 albertel 2732: foreach my $sec (@selected_sections) {
2733: if ($sec eq 'all') {
1.211 www 2734: @selected_sections = ('all');
2735: }
2736: }
1.269 raeburn 2737: my @selected_groups =
2738: &Apache::loncommon::get_env_multiple('form.Group');
1.211 www 2739:
2740: my $pssymb='';
2741: my $parmlev='';
2742:
2743: unless ($env{'form.parmlev'}) {
2744: $parmlev = 'map';
2745: } else {
2746: $parmlev = $env{'form.parmlev'};
2747: }
2748:
2749: &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps,
2750: \%mapp, \%symbp,\%maptitles,\%uris,
2751: \%keyorder,\%defkeytype);
2752:
1.374 albertel 2753: if (grep {$_ eq 'all'} (@psprt)) {
2754: @psprt = keys(%allparts);
2755: }
1.211 www 2756: # Menu to select levels, etc
2757:
1.317 albertel 2758: $r->print('<table id="LC_parm_overview_scope">
2759: <tr><td class="LC_parm_overview_level_menu">');
1.211 www 2760: &levelmenu($r,\%alllevs,$parmlev);
2761: if ($parmlev ne 'general') {
1.317 albertel 2762: $r->print('<td class="LC_parm_overview_map_menu">');
1.211 www 2763: &mapmenu($r,\%allmaps,$pschp,\%maptitles);
2764: $r->print('</td>');
2765: }
2766: $r->print('</td></tr></table>');
2767:
1.317 albertel 2768: $r->print('<table id="LC_parm_overview_controls">
2769: <tr><td class="LC_parm_overview_parm_selectors">');
1.211 www 2770: &parmmenu($r,\%allparms,\@pscat,\%keyorder);
1.317 albertel 2771: $r->print('</td><td class="LC_parm_overview_restrictions">
2772: <table class="LC_parm_overview_restrictions">'.
2773: '<tr><th>'.&mt('Parts').'</th><th>'.&mt('Section(s)').
2774: '</th><th>'.&mt('Group(s)').'</th></tr><tr><td>');
1.211 www 2775: &partmenu($r,\%allparts,\@psprt);
1.317 albertel 2776: $r->print('</td><td>');
1.211 www 2777: §ionmenu($r,\@selected_sections);
1.317 albertel 2778: $r->print('</td><td>');
1.269 raeburn 2779: &groupmenu($r,\@selected_groups);
2780: $r->print('</td></tr></table>');
1.214 www 2781: $r->print('</td></tr></table>');
2782:
2783: my $sortorder=$env{'form.sortorder'};
2784: unless ($sortorder) { $sortorder='realmstudent'; }
2785: &sortmenu($r,$sortorder);
2786:
2787: $r->print('<p><input type="submit" name="dis" value="'.&mt('Display').'" /></p>');
1.211 www 2788:
2789: # Build the list data hash from the specified parms
2790:
2791: my $listdata;
2792: %{$listdata}=();
2793:
2794: foreach my $cat (@pscat) {
1.269 raeburn 2795: &secgroup_lister($cat,$pschp,$parmlev,$listdata,\@psprt,\@selected_sections,\%defkeytype,\%allmaps,\@ids,\%symbp);
2796: &secgroup_lister($cat,$pschp,$parmlev,$listdata,\@psprt,\@selected_groups,\%defkeytype,\%allmaps,\@ids,\%symbp);
1.211 www 2797: }
2798:
1.212 www 2799: if (($env{'form.store'}) || ($env{'form.dis'})) {
1.211 www 2800:
1.212 www 2801: if ($env{'form.store'}) { &storedata($r,$crs,$dom); }
1.211 www 2802:
2803: # Read modified data
2804:
2805: my $resourcedata=&readdata($crs,$dom);
2806:
2807: # List data
2808:
1.214 www 2809: &listdata($r,$resourcedata,$listdata,$sortorder);
1.211 www 2810: }
2811: $r->print(&tableend().
1.365 albertel 2812: ((($env{'form.store'}) || ($env{'form.dis'}))?'<p><input type="submit" name="store" value="'.&mt('Save').'" /></p>':'').
1.280 albertel 2813: '</form>'.&Apache::loncommon::end_page());
1.208 www 2814: }
2815:
1.269 raeburn 2816: sub secgroup_lister {
2817: my ($cat,$pschp,$parmlev,$listdata,$psprt,$selections,$defkeytype,$allmaps,$ids,$symbp) = @_;
2818: foreach my $item (@{$selections}) {
2819: foreach my $part (@{$psprt}) {
2820: my $rootparmkey=$env{'request.course.id'};
2821: if (($item ne 'all') && ($item ne 'none') && ($item)) {
2822: $rootparmkey.='.['.$item.']';
2823: }
2824: if ($parmlev eq 'general') {
2825: # course-level parameter
2826: my $newparmkey=$rootparmkey.'.'.$part.'.'.$cat;
2827: $$listdata{$newparmkey}=1;
2828: $$listdata{$newparmkey.'.type'}=$$defkeytype{$cat};
2829: } elsif ($parmlev eq 'map') {
2830: # map-level parameter
2831: foreach my $mapid (keys %{$allmaps}) {
2832: if (($pschp ne 'all') && ($pschp ne $mapid)) { next; }
2833: my $newparmkey=$rootparmkey.'.'.$$allmaps{$mapid}.'___(all).'.$part.'.'.$cat;
2834: $$listdata{$newparmkey}=1;
2835: $$listdata{$newparmkey.'.type'}=$$defkeytype{$cat};
2836: }
2837: } else {
2838: # resource-level parameter
2839: foreach my $rid (@{$ids}) {
2840: my ($map,$resid,$url)=&Apache::lonnet::decode_symb($$symbp{$rid});
2841: if (($pschp ne 'all') && ($$allmaps{$pschp} ne $map)) { next; }
2842: my $newparmkey=$rootparmkey.'.'.$$symbp{$rid}.'.'.$part.'.'.$cat;
2843: $$listdata{$newparmkey}=1;
2844: $$listdata{$newparmkey.'.type'}=$$defkeytype{$cat};
2845: }
2846: }
2847: }
2848: }
2849: }
2850:
1.208 www 2851: sub overview {
1.280 albertel 2852: my ($r) = @_;
1.208 www 2853: my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
2854: my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.280 albertel 2855:
2856: my $start_page=&Apache::loncommon::start_page('Modify Parameters');
1.298 albertel 2857: my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Overview');
1.208 www 2858: $r->print(<<ENDOVER);
1.280 albertel 2859: $start_page
1.208 www 2860: $breadcrumbs
1.232 albertel 2861: <form method="post" action="/adm/parmset?action=setoverview" name="parmform">
1.208 www 2862: ENDOVER
2863: # Store modified
2864:
2865: &storedata($r,$crs,$dom);
2866:
2867: # Read modified data
2868:
2869: my $resourcedata=&readdata($crs,$dom);
2870:
1.214 www 2871:
2872: my $sortorder=$env{'form.sortorder'};
2873: unless ($sortorder) { $sortorder='realmstudent'; }
2874: &sortmenu($r,$sortorder);
2875:
1.208 www 2876: # List data
2877:
1.214 www 2878: my $foundkeys=&listdata($r,$resourcedata,$resourcedata,$sortorder);
1.208 www 2879:
1.145 www 2880: $r->print(&tableend().'<p>'.
1.280 albertel 2881: ($foundkeys?'<input type="submit" value="'.&mt('Modify Parameters').'" />':&mt('There are no parameters.')).'</p></form>'.
2882: &Apache::loncommon::end_page());
1.120 www 2883: }
1.121 www 2884:
1.333 albertel 2885: sub clean_parameters {
2886: my ($r) = @_;
2887: my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
2888: my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
2889:
2890: my $start_page=&Apache::loncommon::start_page('Clean Parameters');
2891: my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Clean');
2892: $r->print(<<ENDOVER);
2893: $start_page
2894: $breadcrumbs
2895: <form method="post" action="/adm/parmset?action=cleanparameters" name="parmform">
2896: ENDOVER
2897: # Store modified
2898:
2899: &storedata($r,$crs,$dom);
2900:
2901: # Read modified data
2902:
2903: my $resourcedata=&readdata($crs,$dom);
2904:
2905: # List data
2906:
2907: $r->print('<h3>'.
2908: &mt('These parameters refer to resources that do not exist.').
2909: '</h3>'.
2910: '<input type="submit" value="'.&mt('Delete Checked Parameters').'" />'.'<br />'.
2911: '<br />');
2912: $r->print(&Apache::loncommon::start_data_table().
2913: '<tr>'.
2914: '<th>'.&mt('Delete').'</th>'.
2915: '<th>'.&mt('Parameter').'</th>'.
2916: '</tr>');
2917: foreach my $thiskey (sort(keys(%{$resourcedata}))) {
2918: next if (!exists($resourcedata->{$thiskey.'.type'})
2919: && $thiskey=~/\.type$/);
2920: my %data = &parse_key($thiskey);
2921: if (exists($data{'realm_exists'})
2922: && !$data{'realm_exists'}) {
2923: $r->print(&Apache::loncommon::start_data_table_row().
2924: '<tr>'.
2925: '<td><input type="checkbox" name="del_'.$thiskey.'" /></td>' );
2926:
2927: $r->print('<td>');
1.362 albertel 2928: my $display_value = $resourcedata->{$thiskey};
2929: if (&isdateparm($resourcedata->{$thiskey.'.type'})) {
2930: $display_value =
2931: &Apache::lonlocal::locallocaltime($display_value);
2932: }
1.333 albertel 2933: $r->print(&mt('Parameter: "[_1]" with value: "[_2]"',
2934: &standard_parameter_names($data{'parameter_name'}),
2935: $resourcedata->{$thiskey}));
2936: $r->print('<br />');
2937: if ($data{'scope_type'} eq 'all') {
2938: $r->print(&mt('All users'));
2939: } elsif ($data{'scope_type'} eq 'user') {
2940: $r->print(&mt('User: [_1]',join(':',@{$data{'scope'}})));
2941: } elsif ($data{'scope_type'} eq 'section') {
2942: $r->print(&mt('Section: [_1]',$data{'scope'}));
2943: } elsif ($data{'scope_type'} eq 'group') {
2944: $r->print(&mt('Group: [_1]',$data{'scope'}));
2945: }
2946: $r->print('<br />');
2947: if ($data{'realm_type'} eq 'all') {
2948: $r->print(&mt('All Resources'));
2949: } elsif ($data{'realm_type'} eq 'folder') {
2950: $r->print(&mt('Folder: [_1]'),$data{'realm'});
2951: } elsif ($data{'realm_type'} eq 'symb') {
2952: my ($map,$resid,$url) =
2953: &Apache::lonnet::decode_symb($data{'realm'});
2954: $r->print(&mt('Resource: [_1] <br /> with ID: [_2] <br /> in folder [_3]',
2955: $url,$resid,$map));
2956: }
1.362 albertel 2957: $r->print(' <br /> '.&mt('Part: [_1]',$data{'parameter_part'}));
1.333 albertel 2958: $r->print('</td></tr>');
2959:
2960: }
2961: }
2962: $r->print(&Apache::loncommon::end_data_table().'<p>'.
2963: '<input type="submit" value="'.&mt('Delete Checked Parameters').'" />'.
2964: '</p></form>'.
2965: &Apache::loncommon::end_page());
2966: }
2967:
2968: sub parse_key {
2969: my ($key) = @_;
2970: my %data;
2971: my ($middle,$part,$name)=
2972: ($key=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);
2973: $data{'scope_type'} = 'all';
2974: if ($middle=~/^\[(.*)\]/) {
2975: $data{'scope'} = $1;
1.350 albertel 2976: if ($data{'scope'}=~/^useropt\:($match_username)\:($match_domain)/) {
1.333 albertel 2977: $data{'scope_type'} = 'user';
2978: $data{'scope'} = [$1,$2];
2979: } else {
2980: #FIXME check for group scope
2981: $data{'scope_type'} = 'section';
2982: }
2983: $middle=~s/^\[(.*)\]//;
2984: }
2985: $middle=~s/\.+$//;
2986: $middle=~s/^\.+//;
2987: $data{'realm_type'}='all';
2988: if ($middle=~/^(.+)\_\_\_\(all\)$/) {
2989: $data{'realm'} = $1;
2990: $data{'realm_type'} = 'folder';
2991: $data{'realm_title'} = &Apache::lonnet::gettitle($data{'realm'});
2992: ($data{'realm_exists'}) = &Apache::lonnet::is_on_map($data{'realm'});
2993: &Apache::lonnet::logthis($1." siad ". $data{'realm_exists'} );
2994: } elsif ($middle) {
2995: $data{'realm'} = $middle;
2996: $data{'realm_type'} = 'symb';
2997: $data{'realm_title'} = &Apache::lonnet::gettitle($data{'realm'});
2998: my ($map,$resid,$url) = &Apache::lonnet::decode_symb($data{'realm'});
2999: $data{'realm_exists'} = &Apache::lonnet::symbverify($data{'realm'},$url);
3000: }
3001:
3002: $data{'parameter_part'} = $part;
3003: $data{'parameter_name'} = $name;
3004:
3005: return %data;
3006: }
3007:
1.59 matthew 3008: ##################################################
3009: ##################################################
1.333 albertel 3010:
1.178 raeburn 3011: =pod
1.239 raeburn 3012:
3013: =item check_cloners
3014:
3015: Checks if new users included in list of allowed cloners
3016: are valid users. Replaces supplied list with
3017: cleaned list containing only users with valid usernames
3018: and domains.
3019:
3020: Inputs: $clonelist, $oldcloner
3021: where $clonelist is ref to array of requested cloners,
3022: and $oldcloner is ref to array of currently allowed
3023: cloners.
3024:
3025: Returns: string - comma separated list of requested
3026: cloners (username:domain) who do not exist in system.
3027:
3028: =item change_clone
3029:
1.178 raeburn 3030: Modifies the list of courses a user can clone (stored
1.239 raeburn 3031: in the user's environment.db file), called when a
1.178 raeburn 3032: change is made to the list of users allowed to clone
3033: a course.
1.239 raeburn 3034:
1.178 raeburn 3035: Inputs: $action,$cloner
3036: where $action is add or drop, and $cloner is identity of
3037: user for whom cloning ability is to be changed in course.
3038:
3039: =cut
3040:
3041: ##################################################
3042: ##################################################
3043:
1.239 raeburn 3044: sub extract_cloners {
3045: my ($clonelist,$allowclone) = @_;
3046: if ($clonelist =~ /,/) {
3047: @{$allowclone} = split/,/,$clonelist;
3048: } else {
3049: $$allowclone[0] = $clonelist;
3050: }
3051: }
3052:
3053:
3054: sub check_cloners {
3055: my ($clonelist,$oldcloner) = @_;
3056: my ($clean_clonelist,$disallowed);
3057: my @allowclone = ();
3058: &extract_cloners($$clonelist,\@allowclone);
3059: foreach my $currclone (@allowclone) {
3060: if (!grep/^$currclone$/,@$oldcloner) {
3061: my ($uname,$udom) = split/:/,$currclone;
3062: if ($uname && $udom) {
3063: if (&Apache::lonnet::homeserver($uname,$udom) eq 'no_host') {
3064: $disallowed .= $currclone.',';
3065: } else {
3066: $clean_clonelist .= $currclone.',';
3067: }
3068: }
3069: } else {
3070: $clean_clonelist .= $currclone.',';
3071: }
3072: }
3073: if ($disallowed) {
3074: $disallowed =~ s/,$//;
3075: }
3076: if ($clean_clonelist) {
3077: $clean_clonelist =~ s/,$//;
3078: }
3079: $$clonelist = $clean_clonelist;
3080: return $disallowed;
3081: }
1.178 raeburn 3082:
3083: sub change_clone {
3084: my ($clonelist,$oldcloner) = @_;
3085: my ($uname,$udom);
1.190 albertel 3086: my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
3087: my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
1.178 raeburn 3088: my $clone_crs = $cnum.':'.$cdom;
3089:
3090: if ($cnum && $cdom) {
1.239 raeburn 3091: my @allowclone;
3092: &extract_cloners($clonelist,\@allowclone);
1.178 raeburn 3093: foreach my $currclone (@allowclone) {
3094: if (!grep/^$currclone$/,@$oldcloner) {
3095: ($uname,$udom) = split/:/,$currclone;
3096: if ($uname && $udom) {
3097: unless (&Apache::lonnet::homeserver($uname,$udom) eq 'no_host') {
3098: my %currclonecrs = &Apache::lonnet::dump('environment',$udom,$uname,'cloneable');
3099: if ($currclonecrs{'cloneable'} !~ /\Q$clone_crs\E/) {
3100: if ($currclonecrs{'cloneable'} eq '') {
3101: $currclonecrs{'cloneable'} = $clone_crs;
3102: } else {
3103: $currclonecrs{'cloneable'} .= ','.$clone_crs;
3104: }
3105: &Apache::lonnet::put('environment',\%currclonecrs,$udom,$uname);
3106: }
3107: }
3108: }
3109: }
3110: }
3111: foreach my $oldclone (@$oldcloner) {
3112: if (!grep/^$oldclone$/,@allowclone) {
3113: ($uname,$udom) = split/:/,$oldclone;
3114: if ($uname && $udom) {
3115: unless (&Apache::lonnet::homeserver($uname,$udom) eq 'no_host') {
3116: my %currclonecrs = &Apache::lonnet::dump('environment',$udom,$uname,'cloneable');
3117: my %newclonecrs = ();
3118: if ($currclonecrs{'cloneable'} =~ /\Q$clone_crs\E/) {
3119: if ($currclonecrs{'cloneable'} =~ /,/) {
3120: my @currclonecrs = split/,/,$currclonecrs{'cloneable'};
3121: foreach (@currclonecrs) {
3122: unless ($_ eq $clone_crs) {
3123: $newclonecrs{'cloneable'} .= $_.',';
3124: }
3125: }
3126: $newclonecrs{'cloneable'} =~ s/,$//;
3127: } else {
3128: $newclonecrs{'cloneable'} = '';
3129: }
3130: &Apache::lonnet::put('environment',\%newclonecrs,$udom,$uname);
3131: }
3132: }
3133: }
3134: }
3135: }
3136: }
3137: }
3138:
1.193 albertel 3139:
3140: ##################################################
3141: ##################################################
3142:
3143: =pod
3144:
3145: =item * header
3146:
3147: Output html header for page
3148:
3149: =cut
3150:
3151: ##################################################
3152: ##################################################
3153: sub header {
1.280 albertel 3154: return &Apache::loncommon::start_page('Parameter Manager');
1.193 albertel 3155: }
3156: ##################################################
3157: ##################################################
3158: sub print_main_menu {
3159: my ($r,$parm_permission)=@_;
3160: #
3161: $r->print(<<ENDMAINFORMHEAD);
3162: <form method="post" enctype="multipart/form-data"
3163: action="/adm/parmset" name="studentform">
3164: ENDMAINFORMHEAD
3165: #
1.195 albertel 3166: my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
3167: my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
1.268 albertel 3168: my $vgr = &Apache::lonnet::allowed('vgr',$env{'request.course.id'});
1.366 albertel 3169: my $mgr = &Apache::lonnet::allowed('mgr',$env{'request.course.id'});
1.268 albertel 3170:
1.193 albertel 3171: my @menu =
1.322 www 3172: ( { divider=>'Settings for Your Course',
3173: },
1.323 albertel 3174: { text => 'Set Course Environment',
1.204 www 3175: action => 'crsenv',
1.193 albertel 3176: permission => $parm_permission,
1.324 www 3177: help => 'Course_Environment',
1.193 albertel 3178: },
1.255 banghart 3179: { text => 'Set Portfolio Metadata',
1.259 banghart 3180: action => 'setrestrictmeta',
1.240 banghart 3181: permission => $parm_permission,
3182: },
1.271 www 3183: { text => 'Manage Course Slots',
1.268 albertel 3184: url => '/adm/slotrequest?command=showslots',
3185: permission => $vgr,
3186: },
1.366 albertel 3187: { text => 'Reset Student Access Times',
3188: url => '/adm/helper/resettimes.helper',
3189: permission => $mgr,
3190: },
3191:
1.322 www 3192: { text => 'Set Parameter Setting Default Actions',
3193: action => 'setdefaults',
3194: permission => $parm_permission,
3195: },
3196: { divider => 'New and Existing Parameter Settings for Your Resources',
1.268 albertel 3197: },
1.216 www 3198: { text => 'Set/Modify Resource Parameters - Helper Mode',
1.193 albertel 3199: url => '/adm/helper/parameter.helper',
3200: permission => $parm_permission,
1.324 www 3201: help => 'Parameter_Helper',
1.193 albertel 3202: },
1.322 www 3203: { text => 'Set/Modify Resource Parameters - Overview Mode',
1.208 www 3204: action => 'newoverview',
3205: permission => $parm_permission,
1.324 www 3206: help => 'Parameter_Overview',
1.193 albertel 3207: },
1.216 www 3208: { text => 'Set/Modify Resource Parameters - Table Mode',
1.193 albertel 3209: action => 'settable',
3210: permission => $parm_permission,
1.324 www 3211: help => 'Table_Mode',
1.193 albertel 3212: },
1.322 www 3213: { divider => 'Existing Parameter Settings for Your Resources',
3214: },
3215: { text => 'Modify Resource Parameters - Overview Mode',
3216: action => 'setoverview',
1.220 www 3217: permission => $parm_permission,
1.324 www 3218: help => 'Parameter_Overview',
1.322 www 3219: },
1.292 www 3220: { text => 'Parameter Change Log and Course Blog Posting/User Notification',
1.284 www 3221: action => 'parameterchangelog',
3222: permission => $parm_permission,
1.220 www 3223: },
1.193 albertel 3224: );
3225: my $menu_html = '';
3226: foreach my $menu_item (@menu) {
1.268 albertel 3227: if ($menu_item->{'divider'}) {
1.322 www 3228: $menu_html .= '<h3>'.&mt($menu_item->{'divider'}).'</h3>';
1.268 albertel 3229: next;
3230: }
1.193 albertel 3231: next if (! $menu_item->{'permission'});
3232: $menu_html.='<p>';
1.316 albertel 3233: $menu_html.='<span class="LC_parm_menu_item">';
1.193 albertel 3234: if (exists($menu_item->{'url'})) {
3235: $menu_html.=qq{<a href="$menu_item->{'url'}">};
3236: } else {
3237: $menu_html.=
3238: qq{<a href="/adm/parmset?action=$menu_item->{'action'}">};
3239: }
1.316 albertel 3240: $menu_html.= &mt($menu_item->{'text'}).'</a></span>';
1.193 albertel 3241: if (exists($menu_item->{'help'})) {
3242: $menu_html.=
3243: &Apache::loncommon::help_open_topic($menu_item->{'help'});
3244: }
3245: $menu_html.='</p>'.$/;
3246: }
3247: $r->print($menu_html);
3248: return;
3249: }
1.255 banghart 3250: ### Set portfolio metadata
1.252 banghart 3251: sub output_row {
1.347 banghart 3252: my ($r, $field_name, $field_text, $added_flag) = @_;
1.252 banghart 3253: my $output;
1.263 banghart 3254: my $options=$env{'course.'.$env{'request.course.id'}.'.metadata.'.$field_name.'.options'};
3255: my $values=$env{'course.'.$env{'request.course.id'}.'.metadata.'.$field_name.'.values'};
1.337 banghart 3256: if (!defined($options)) {
1.254 banghart 3257: $options = 'active,stuadd';
1.261 banghart 3258: $values = '';
1.252 banghart 3259: }
1.337 banghart 3260: if (!($options =~ /deleted/)) {
3261: my @options= ( ['active', 'Show to student'],
1.351 banghart 3262: ['stuadd', 'Provide text area for students to type catalog information'],
3263: ['choices','Provide choices for students to select from']);
3264: # ['onlyone','Student may select only one choice']);
1.337 banghart 3265: if ($added_flag) {
3266: push @options,['deleted', 'Delete Metadata Field'];
3267: }
1.351 banghart 3268: $output = &Apache::loncommon::start_data_table_row();
3269: $output .= '<td><span class="LC_metadata"><strong>'.$field_text.':</strong></span></td>';
3270: $output .= &Apache::loncommon::end_data_table_row();
1.337 banghart 3271: foreach my $opt (@options) {
3272: my $checked = ($options =~ m/$opt->[0]/) ? ' checked="checked" ' : '' ;
1.347 banghart 3273: $output .= &Apache::loncommon::continue_data_table_row();
1.351 banghart 3274: $output .= '<td>'.(' ' x 5).'<span class="LC_metadata"><label>
3275: <input type="checkbox" name="'.
3276: $field_name.'_'.$opt->[0].'" value="yes"'.$checked.' />'.
3277: &mt($opt->[1]).'</label></span> </td>';
1.347 banghart 3278: $output .= &Apache::loncommon::end_data_table_row();
1.337 banghart 3279: }
1.351 banghart 3280: $output .= &Apache::loncommon::continue_data_table_row();
3281: $output .= '<td>'.(' ' x 10).'<span class="LC_metadata"><input name="'.$field_name.'_values" type="text" value="'.$values.'" size="80" /></span></td>';
3282: $output .= &Apache::loncommon::end_data_table_row();
3283: my $multiple_checked;
3284: my $single_checked;
3285: if ($options =~ m/onlyone/) {
3286: $multiple_checked = "";
3287: $single_checked = " CHECKED ";
3288: } else {
3289: $multiple_checked = " CHECKED ";
3290: $single_checked = "";
3291: }
3292: $output .= &Apache::loncommon::continue_data_table_row();
3293: $output .= '<td>'.(' ' x 10).'<span class="LC_metadata">
3294: <input type="radio" name="'.$field_name.'_onlyone" value="multiple" '.$multiple_checked .'/>
3295: Student may select multiple choices from list</span></td>';
3296: $output .= &Apache::loncommon::end_data_table_row();
3297: $output .= &Apache::loncommon::continue_data_table_row();
3298: $output .= '<td>'.(' ' x 10).'<span class="LC_metadata">
3299: <input type="radio" name="'.$field_name.'_onlyone" value="single" '.$single_checked.'/>
3300: Student may select only one choice from list</span></td>';
3301: $output .= &Apache::loncommon::end_data_table_row();
1.252 banghart 3302: }
3303: return ($output);
3304: }
1.340 banghart 3305: sub order_meta_fields {
3306: my ($r)=@_;
3307: my $idx = 1;
3308: my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
3309: my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.341 banghart 3310: $r->print(&Apache::loncommon::start_page('Order Metadata Fields'));
1.345 banghart 3311: &Apache::lonhtmlcommon::add_breadcrumb
3312: ({href=>"/adm/parmset?action=setrestrictmeta",
3313: text=>"Restrict Metadata"},
3314: {text=>"Order Metadata"});
3315: $r->print(&Apache::lonhtmlcommon::breadcrumbs('Order Metadata'));
1.340 banghart 3316: if ($env{'form.storeorder'}) {
3317: my $newpos = $env{'form.newpos'} - 1;
3318: my $currentpos = $env{'form.currentpos'} - 1;
3319: my @neworder = ();
3320: my @oldorder = split /,/,$env{'course.'.$env{'request.course.id'}.'.metadata.addedorder'};
3321: my $i;
1.341 banghart 3322: if ($newpos > $currentpos) {
1.340 banghart 3323: # moving stuff up
3324: for ($i=0;$i<$currentpos;$i++) {
3325: $neworder[$i]=$oldorder[$i];
3326: }
3327: for ($i=$currentpos;$i<$newpos;$i++) {
3328: $neworder[$i]=$oldorder[$i+1];
3329: }
3330: $neworder[$newpos]=$oldorder[$currentpos];
3331: for ($i=$newpos+1;$i<=$#oldorder;$i++) {
3332: $neworder[$i]=$oldorder[$i];
3333: }
3334: } else {
3335: # moving stuff down
3336: for ($i=0;$i<$newpos;$i++) {
3337: $neworder[$i]=$oldorder[$i];
3338: }
3339: $neworder[$newpos]=$oldorder[$currentpos];
3340: for ($i=$newpos+1;$i<$currentpos+1;$i++) {
3341: $neworder[$i]=$oldorder[$i-1];
3342: }
3343: for ($i=$currentpos+1;$i<=$#oldorder;$i++) {
3344: $neworder[$i]=$oldorder[$i];
3345: }
3346: }
3347: my $ordered_fields = join ",", @neworder;
1.343 banghart 3348: my $put_result = &Apache::lonnet::put('environment',
3349: {'metadata.addedorder'=>$ordered_fields},$dom,$crs);
1.342 banghart 3350: &Apache::lonnet::appenv('course.'.$env{'request.course.id'}.'.metadata.addedorder' => $ordered_fields);
1.340 banghart 3351: }
1.357 raeburn 3352: my $fields = &get_added_meta_fieldnames($env{'request.course.id'});
1.341 banghart 3353: my $ordered_fields;
1.340 banghart 3354: my @fields_in_order = split /,/,$env{'course.'.$env{'request.course.id'}.'.metadata.addedorder'};
3355: if (!@fields_in_order) {
3356: # no order found, pick sorted order then create metadata.addedorder key.
3357: foreach my $key (sort keys %$fields) {
3358: push @fields_in_order, $key;
1.341 banghart 3359: $ordered_fields = join ",", @fields_in_order;
1.340 banghart 3360: }
1.341 banghart 3361: my $put_result = &Apache::lonnet::put('environment',
3362: {'metadata.addedorder'=>$ordered_fields},$dom,$crs);
3363: }
1.340 banghart 3364: $r->print('<table>');
3365: my $num_fields = scalar(@fields_in_order);
3366: foreach my $key (@fields_in_order) {
3367: $r->print('<tr><td>');
3368: $r->print('<form method="post" action="">');
3369: $r->print('<select name="newpos" onChange="this.form.submit()">');
3370: for (my $i = 1;$i le $num_fields;$i ++) {
3371: if ($i eq $idx) {
3372: $r->print('<option value="'.$i.'" SELECTED>('.$i.')</option>');
3373: } else {
3374: $r->print('<option value="'.$i.'">'.$i.'</option>');
3375: }
3376: }
3377: $r->print('</select></td><td>');
3378: $r->print('<input type="hidden" name="currentpos" value="'.$idx.'" />');
3379: $r->print('<input type="hidden" name="storeorder" value="true" />');
3380: $r->print('</form>');
3381: $r->print($$fields{$key}.'</td></tr>');
3382: $idx ++;
3383: }
3384: $r->print('</table>');
3385: return 'ok';
3386: }
1.359 banghart 3387: sub continue {
3388: my $output;
3389: $output .= '<form action="" method="post">';
3390: $output .= '<input type="hidden" name="action" value="setrestrictmeta" />';
3391: $output .= '<input type="submit" value="Continue" />';
3392: return ($output);
3393: }
1.334 banghart 3394: sub addmetafield {
3395: my ($r)=@_;
3396: $r->print(&Apache::loncommon::start_page('Add Metadata Field'));
3397: $r->print(&Apache::lonhtmlcommon::breadcrumbs('Add Metadata Field'));
1.335 banghart 3398: my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
3399: my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.339 banghart 3400: if (exists($env{'form.undelete'})) {
1.358 banghart 3401: my @meta_fields = &Apache::loncommon::get_env_multiple('form.undeletefield');
1.339 banghart 3402: foreach my $meta_field(@meta_fields) {
3403: my $options = $env{'course.'.$env{'request.course.id'}.'.metadata.'.$meta_field.'.options'};
3404: $options =~ s/deleted//;
3405: $options =~ s/,,/,/;
3406: my $put_result = &Apache::lonnet::put('environment',
3407: {'metadata.'.$meta_field.'.options'=>$options},$dom,$crs);
3408:
3409: $r->print('Undeleted Metadata Field <strong>'.$env{'course.'.$env{'request.course.id'}.'.metadata.'.$meta_field.'.added'}."</strong> with result ".$put_result.'<br />');
3410: }
1.359 banghart 3411: $r->print(&continue());
1.339 banghart 3412: } elsif (exists($env{'form.fieldname'})) {
1.335 banghart 3413: my $meta_field = $env{'form.fieldname'};
3414: my $display_field = $env{'form.fieldname'};
3415: $meta_field =~ s/\W/_/g;
1.338 banghart 3416: $meta_field =~ tr/A-Z/a-z/;
1.335 banghart 3417: my $put_result = &Apache::lonnet::put('environment',
3418: {'metadata.'.$meta_field.'.values'=>"",
3419: 'metadata.'.$meta_field.'.added'=>"$display_field",
3420: 'metadata.'.$meta_field.'.options'=>""},$dom,$crs);
1.359 banghart 3421: $r->print('Added new Metadata Field <strong>'.$env{'form.fieldname'}."</strong> with result ".$put_result.'<br />');
3422: $r->print(&continue());
1.335 banghart 3423: } else {
1.357 raeburn 3424: my $fields = &get_deleted_meta_fieldnames($env{'request.course.id'});
1.339 banghart 3425: if ($fields) {
3426: $r->print('You may undelete previously deleted fields.<br />Check those you wish to undelete and click Undelete.<br />');
3427: $r->print('<form method="post" action="">');
3428: foreach my $key(keys(%$fields)) {
1.358 banghart 3429: $r->print('<input type="checkbox" name="undeletefield" value="'.$key.'" />'.$$fields{$key}.'<br /');
1.339 banghart 3430: }
3431: $r->print('<input type="submit" name="undelete" value="Undelete" />');
3432: $r->print('</form>');
3433: }
3434: $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 3435: $r->print('<input type="text" name="fieldname" /><br />');
3436: $r->print('<input type="submit" value="Add Metadata Field" />');
1.334 banghart 3437: }
1.361 albertel 3438: $r->print('</form>');
1.334 banghart 3439: }
1.259 banghart 3440: sub setrestrictmeta {
1.240 banghart 3441: my ($r)=@_;
1.242 banghart 3442: my $next_meta;
1.244 banghart 3443: my $output;
1.245 banghart 3444: my $item_num;
1.246 banghart 3445: my $put_result;
1.280 albertel 3446: $r->print(&Apache::loncommon::start_page('Restrict Metadata'));
1.298 albertel 3447: $r->print(&Apache::lonhtmlcommon::breadcrumbs('Restrict Metadata'));
1.240 banghart 3448: my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
3449: my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.259 banghart 3450: my $key_base = $env{'course.'.$env{'request.course.id'}.'.'};
1.252 banghart 3451: my $save_field = '';
1.259 banghart 3452: if ($env{'form.restrictmeta'}) {
1.254 banghart 3453: foreach my $field (sort(keys(%env))) {
1.252 banghart 3454: if ($field=~m/^form.(.+)_(.+)$/) {
1.254 banghart 3455: my $options;
1.252 banghart 3456: my $meta_field = $1;
3457: my $meta_key = $2;
1.253 banghart 3458: if ($save_field ne $meta_field) {
1.252 banghart 3459: $save_field = $meta_field;
1.253 banghart 3460: if ($env{'form.'.$meta_field.'_stuadd'}) {
1.254 banghart 3461: $options.='stuadd,';
3462: }
1.351 banghart 3463: if ($env{'form.'.$meta_field.'_choices'}) {
3464: $options.='choices,';
3465: }
3466: if ($env{'form.'.$meta_field.'_onlyone'} eq 'single') {
1.254 banghart 3467: $options.='onlyone,';
3468: }
3469: if ($env{'form.'.$meta_field.'_active'}) {
3470: $options.='active,';
1.253 banghart 3471: }
1.337 banghart 3472: if ($env{'form.'.$meta_field.'_deleted'}) {
3473: $options.='deleted,';
3474: }
1.259 banghart 3475: my $name = $save_field;
1.253 banghart 3476: $put_result = &Apache::lonnet::put('environment',
1.262 banghart 3477: {'metadata.'.$meta_field.'.options'=>$options,
3478: 'metadata.'.$meta_field.'.values'=>$env{'form.'.$meta_field.'_values'},
1.253 banghart 3479: },$dom,$crs);
1.252 banghart 3480: }
3481: }
3482: }
3483: }
1.296 albertel 3484: &Apache::lonnet::coursedescription($env{'request.course.id'},
3485: {'freshen_cache' => 1});
1.335 banghart 3486: # Get the default metadata fields
1.258 albertel 3487: my %metadata_fields = &Apache::lonmeta::fieldnames('portfolio');
1.335 banghart 3488: # Now get possible added metadata fields
1.357 raeburn 3489: my $added_metadata_fields = &get_added_meta_fieldnames($env{'request.course.id'});
1.346 banghart 3490: my $row_alt = 1;
1.347 banghart 3491: $output .= &Apache::loncommon::start_data_table();
1.258 albertel 3492: foreach my $field (sort(keys(%metadata_fields))) {
1.265 banghart 3493: if ($field ne 'courserestricted') {
1.346 banghart 3494: $row_alt = $row_alt ? 0 : 1;
1.347 banghart 3495: $output.= &output_row($r, $field, $metadata_fields{$field});
1.265 banghart 3496: }
1.255 banghart 3497: }
1.351 banghart 3498: my $buttons = (<<ENDButtons);
3499: <input type="submit" name="restrictmeta" value="Save" />
3500: </form><br />
3501: <form method="post" action="/adm/parmset?action=addmetadata" name="form1">
3502: <input type="submit" name="restrictmeta" value="Add a Metadata Field" />
3503: </form>
3504: <br />
3505: <form method="post" action="/adm/parmset?action=ordermetadata" name="form2">
3506: <input type="submit" name="restrictmeta" value="Order Metadata Fields" />
3507: ENDButtons
1.337 banghart 3508: my $added_flag = 1;
1.335 banghart 3509: foreach my $field (sort(keys(%$added_metadata_fields))) {
1.346 banghart 3510: $row_alt = $row_alt ? 0 : 1;
3511: $output.= &output_row($r, $field, $$added_metadata_fields{$field},$added_flag, $row_alt);
1.335 banghart 3512: }
1.347 banghart 3513: $output .= &Apache::loncommon::end_data_table();
1.244 banghart 3514: $r->print(<<ENDenv);
1.259 banghart 3515: <form method="post" action="/adm/parmset?action=setrestrictmeta" name="form">
1.244 banghart 3516: $output
1.351 banghart 3517: $buttons
1.340 banghart 3518: </form>
1.244 banghart 3519: ENDenv
1.280 albertel 3520: $r->print(&Apache::loncommon::end_page());
1.240 banghart 3521: return 'ok';
3522: }
1.220 www 3523: ##################################################
1.335 banghart 3524: sub get_added_meta_fieldnames {
1.357 raeburn 3525: my ($cid) = @_;
1.335 banghart 3526: my %fields;
3527: foreach my $key(%env) {
1.357 raeburn 3528: if ($key =~ m/\Q$cid\E\.metadata\.(.+)\.added$/) {
1.335 banghart 3529: my $field_name = $1;
3530: my ($display_field_name) = $env{$key};
3531: $fields{$field_name} = $display_field_name;
3532: }
3533: }
3534: return \%fields;
3535: }
1.339 banghart 3536: sub get_deleted_meta_fieldnames {
1.357 raeburn 3537: my ($cid) = @_;
1.339 banghart 3538: my %fields;
3539: foreach my $key(%env) {
1.357 raeburn 3540: if ($key =~ m/\Q$cid\E\.metadata\.(.+)\.added$/) {
1.339 banghart 3541: my $field_name = $1;
3542: if ($env{'course.'.$env{'request.course.id'}.'.metadata.'.$field_name.'.options'} =~ m/deleted/) {
3543: my ($display_field_name) = $env{$key};
3544: $fields{$field_name} = $display_field_name;
3545: }
3546: }
3547: }
3548: return \%fields;
3549: }
1.220 www 3550: sub defaultsetter {
1.280 albertel 3551: my ($r) = @_;
3552:
3553: my $start_page =
3554: &Apache::loncommon::start_page('Parameter Setting Default Actions');
1.298 albertel 3555: my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Defaults');
1.220 www 3556: $r->print(<<ENDDEFHEAD);
1.280 albertel 3557: $start_page
1.220 www 3558: $breadcrumbs
3559: <form method="post" action="/adm/parmset?action=setdefaults" name="defaultform">
3560: ENDDEFHEAD
1.280 albertel 3561:
3562: my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
3563: my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.221 www 3564: my @ids=();
3565: my %typep=();
3566: my %keyp=();
3567: my %allparms=();
3568: my %allparts=();
3569: my %allmaps=();
3570: my %mapp=();
3571: my %symbp=();
3572: my %maptitles=();
3573: my %uris=();
3574: my %keyorder=&standardkeyorder();
3575: my %defkeytype=();
3576:
3577: &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps,
3578: \%mapp, \%symbp,\%maptitles,\%uris,
3579: \%keyorder,\%defkeytype);
1.224 www 3580: if ($env{'form.storerules'}) {
3581: my %newrules=();
3582: my @delrules=();
1.226 www 3583: my %triggers=();
1.225 albertel 3584: foreach my $key (keys(%env)) {
3585: if ($key=~/^form\.(\w+)\_action$/) {
1.224 www 3586: my $tempkey=$1;
1.226 www 3587: my $action=$env{$key};
3588: if ($action) {
3589: $newrules{$tempkey.'_action'}=$action;
3590: if ($action ne 'default') {
3591: my ($whichaction,$whichparm)=($action=~/^(.*\_)([^\_]+)$/);
3592: $triggers{$whichparm}.=$tempkey.':';
3593: }
3594: $newrules{$tempkey.'_type'}=$defkeytype{$tempkey};
1.224 www 3595: if (&isdateparm($defkeytype{$tempkey})) {
1.227 www 3596: $newrules{$tempkey.'_days'}=$env{'form.'.$tempkey.'_days'};
1.224 www 3597: $newrules{$tempkey.'_hours'}=$env{'form.'.$tempkey.'_hours'};
3598: $newrules{$tempkey.'_min'}=$env{'form.'.$tempkey.'_min'};
3599: $newrules{$tempkey.'_sec'}=$env{'form.'.$tempkey.'_sec'};
3600: } else {
3601: $newrules{$tempkey.'_value'}=$env{'form.'.$tempkey.'_value'};
1.227 www 3602: $newrules{$tempkey.'_triggervalue'}=$env{'form.'.$tempkey.'_triggervalue'};
1.224 www 3603: }
3604: } else {
1.225 albertel 3605: push(@delrules,$tempkey.'_action');
1.226 www 3606: push(@delrules,$tempkey.'_type');
1.225 albertel 3607: push(@delrules,$tempkey.'_hours');
3608: push(@delrules,$tempkey.'_min');
3609: push(@delrules,$tempkey.'_sec');
3610: push(@delrules,$tempkey.'_value');
1.224 www 3611: }
3612: }
3613: }
1.226 www 3614: foreach my $key (keys %allparms) {
3615: $newrules{$key.'_triggers'}=$triggers{$key};
3616: }
1.224 www 3617: &Apache::lonnet::put('parmdefactions',\%newrules,$dom,$crs);
3618: &Apache::lonnet::del('parmdefactions',\@delrules,$dom,$crs);
3619: &resetrulescache();
3620: }
1.227 www 3621: my %lt=&Apache::lonlocal::texthash('days' => 'Days',
3622: 'hours' => 'Hours',
1.221 www 3623: 'min' => 'Minutes',
3624: 'sec' => 'Seconds',
3625: 'yes' => 'Yes',
3626: 'no' => 'No');
1.222 www 3627: my @standardoptions=('','default');
3628: my @standarddisplay=('',&mt('Default value when manually setting'));
3629: my @dateoptions=('','default');
3630: my @datedisplay=('',&mt('Default value when manually setting'));
3631: foreach my $tempkey (&keysindisplayorder(\%allparms,\%keyorder)) {
3632: unless ($tempkey) { next; }
3633: push @standardoptions,'when_setting_'.$tempkey;
3634: push @standarddisplay,&mt('Automatically set when setting ').$tempkey;
3635: if (&isdateparm($defkeytype{$tempkey})) {
3636: push @dateoptions,'later_than_'.$tempkey;
3637: push @datedisplay,&mt('Automatically set later than ').$tempkey;
3638: push @dateoptions,'earlier_than_'.$tempkey;
3639: push @datedisplay,&mt('Automatically set earlier than ').$tempkey;
3640: }
3641: }
1.231 www 3642: $r->print(&mt('Manual setting rules apply to all interfaces.').'<br />'.
3643: &mt('Automatic setting rules apply to table mode interfaces only.'));
1.318 albertel 3644: $r->print("\n".&Apache::loncommon::start_data_table().
3645: &Apache::loncommon::start_data_table_header_row().
3646: "<th>".&mt('Rule for parameter').'</th><th>'.
3647: &mt('Action').'</th><th>'.&mt('Value').'</th>'.
3648: &Apache::loncommon::end_data_table_header_row());
1.221 www 3649: foreach my $tempkey (&keysindisplayorder(\%allparms,\%keyorder)) {
1.222 www 3650: unless ($tempkey) { next; }
1.318 albertel 3651: $r->print("\n".&Apache::loncommon::start_data_table_row().
3652: "<td>".$allparms{$tempkey}."\n<br />(".$tempkey.')</td><td>');
1.222 www 3653: my $action=&rulescache($tempkey.'_action');
3654: $r->print('<select name="'.$tempkey.'_action">');
3655: if (&isdateparm($defkeytype{$tempkey})) {
3656: for (my $i=0;$i<=$#dateoptions;$i++) {
3657: if ($dateoptions[$i]=~/\_$tempkey$/) { next; }
3658: $r->print("\n<option value='$dateoptions[$i]'".
3659: ($dateoptions[$i] eq $action?' selected="selected"':'').
3660: ">$datedisplay[$i]</option>");
3661: }
3662: } else {
3663: for (my $i=0;$i<=$#standardoptions;$i++) {
3664: if ($standardoptions[$i]=~/\_$tempkey$/) { next; }
3665: $r->print("\n<option value='$standardoptions[$i]'".
3666: ($standardoptions[$i] eq $action?' selected="selected"':'').
3667: ">$standarddisplay[$i]</option>");
3668: }
3669: }
3670: $r->print('</select>');
1.227 www 3671: unless (&isdateparm($defkeytype{$tempkey})) {
3672: $r->print("\n<br />".&mt('Triggering value(s) of other parameter (optional, comma-separated):').
3673: '<input type="text" size="20" name="'.$tempkey.'_triggervalue" value="'.&rulescache($tempkey.'_triggervalue').'" />');
3674: }
1.222 www 3675: $r->print("\n</td><td>\n");
3676:
1.221 www 3677: if (&isdateparm($defkeytype{$tempkey})) {
1.227 www 3678: my $days=&rulescache($tempkey.'_days');
1.222 www 3679: my $hours=&rulescache($tempkey.'_hours');
3680: my $min=&rulescache($tempkey.'_min');
3681: my $sec=&rulescache($tempkey.'_sec');
1.221 www 3682: $r->print(<<ENDINPUTDATE);
1.227 www 3683: <input name="$tempkey\_days" type="text" size="4" value="$days" />$lt{'days'}<br />
1.222 www 3684: <input name="$tempkey\_hours" type="text" size="4" value="$hours" />$lt{'hours'}<br />
3685: <input name="$tempkey\_min" type="text" size="4" value="$min" />$lt{'min'}<br />
3686: <input name="$tempkey\_sec" type="text" size="4" value="$sec" />$lt{'sec'}
1.221 www 3687: ENDINPUTDATE
3688: } elsif ($defkeytype{$tempkey} eq 'string_yesno') {
1.222 www 3689: my $yeschecked='';
3690: my $nochecked='';
3691: if (&rulescache($tempkey.'_value') eq 'yes') { $yeschecked='checked="checked"'; }
3692: if (&rulescache($tempkey.'_value') eq 'no') { $nochecked='checked="checked"'; }
3693:
1.221 www 3694: $r->print(<<ENDYESNO);
1.224 www 3695: <label><input type="radio" name="$tempkey\_value" value="yes" $yeschecked /> $lt{'yes'}</label><br />
3696: <label><input type="radio" name="$tempkey\_value" value="no" $nochecked /> $lt{'no'}</label>
1.221 www 3697: ENDYESNO
3698: } else {
1.224 www 3699: $r->print('<input type="text" size="20" name="'.$tempkey.'_value" value="'.&rulescache($tempkey.'_value').'" />');
1.221 www 3700: }
1.318 albertel 3701: $r->print('</td>'.&Apache::loncommon::end_data_table_row());
1.221 www 3702: }
1.318 albertel 3703: $r->print(&Apache::loncommon::end_data_table().
3704: "\n<input type='submit' name='storerules' value='".
1.365 albertel 3705: &mt('Save Rules')."' /></form>\n".
1.280 albertel 3706: &Apache::loncommon::end_page());
1.220 www 3707: return;
3708: }
1.193 albertel 3709:
1.290 www 3710: sub components {
1.330 albertel 3711: my ($key,$uname,$udom,$exeuser,$exedomain,$typeflag)=@_;
3712:
3713: if ($typeflag) {
1.290 www 3714: $key=~s/\.type$//;
3715: }
1.330 albertel 3716:
3717: my ($middle,$part,$name)=
3718: ($key=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);
1.291 www 3719: my $issection;
1.330 albertel 3720:
1.290 www 3721: my $section=&mt('All Students');
3722: if ($middle=~/^\[(.*)\]/) {
1.291 www 3723: $issection=$1;
3724: $section=&mt('Group/Section').': '.$issection;
1.290 www 3725: $middle=~s/^\[(.*)\]//;
3726: }
3727: $middle=~s/\.+$//;
3728: $middle=~s/^\.+//;
1.291 www 3729: if ($uname) {
3730: $section=&mt('User').": ".&Apache::loncommon::plainname($uname,$udom);
3731: $issection='';
3732: }
1.316 albertel 3733: my $realm='<span class="LC_parm_scope_all">'.&mt('All Resources').'</span>';
1.304 www 3734: my $realmdescription=&mt('all resources');
1.290 www 3735: if ($middle=~/^(.+)\_\_\_\(all\)$/) {
1.316 albertel 3736: $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 3737: $realmdescription=&mt('folder').' '.&Apache::lonnet::gettitle($1);
3738: } elsif ($middle) {
1.290 www 3739: my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle);
1.316 albertel 3740: $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 3741: $realmdescription=&mt('resource').' '.&Apache::lonnet::gettitle($middle);
1.290 www 3742: }
1.291 www 3743: my $what=$part.'.'.$name;
1.330 albertel 3744: return ($realm,$section,$name,$part,
1.304 www 3745: $what,$middle,$uname,$udom,$issection,$realmdescription);
1.290 www 3746: }
1.293 www 3747:
1.328 albertel 3748: my %standard_parms;
3749: sub load_parameter_names {
3750: open(my $config,"<$Apache::lonnet::perlvar{'lonTabDir'}/packages.tab");
3751: while (my $configline=<$config>) {
3752: if ($configline !~ /\S/ || $configline=~/^\#/) { next; }
3753: chomp($configline);
3754: my ($short,$plain)=split(/:/,$configline);
3755: my (undef,$name,$type)=split(/\&/,$short,3);
3756: if ($type eq 'display') {
3757: $standard_parms{$name} = $plain;
3758: }
3759: }
3760: close($config);
3761: $standard_parms{'int_pos'} = 'Positive Integer';
3762: $standard_parms{'int_zero_pos'} = 'Positive Integer or Zero';
3763: %standard_parms=&Apache::lonlocal::texthash(%standard_parms);
3764: }
3765:
1.292 www 3766: sub standard_parameter_names {
3767: my ($name)=@_;
1.328 albertel 3768: if (!%standard_parms) {
3769: &load_parameter_names();
3770: }
1.292 www 3771: if ($standard_parms{$name}) {
3772: return $standard_parms{$name};
3773: } else {
3774: return $name;
3775: }
3776: }
1.290 www 3777:
1.309 www 3778: #
3779: # Parameter Change Log
3780: #
3781:
3782:
1.285 albertel 3783: sub parm_change_log {
1.284 www 3784: my ($r)=@_;
1.327 albertel 3785: $r->print(&Apache::loncommon::start_page('Parameter Change Log'));
3786: $r->print(&Apache::lonhtmlcommon::breadcrumbs('Parameter Change Log'));
3787:
1.286 www 3788: my %parmlog=&Apache::lonnet::dump('nohist_parameterlog',
3789: $env{'course.'.$env{'request.course.id'}.'.domain'},
3790: $env{'course.'.$env{'request.course.id'}.'.num'});
1.311 albertel 3791:
1.301 www 3792: if ((keys(%parmlog))[0]=~/^error\:/) { undef(%parmlog); }
1.311 albertel 3793:
1.327 albertel 3794: $r->print('<form action="/adm/parmset?action=parameterchangelog"
3795: method="post" name="parameterlog">');
1.311 albertel 3796:
3797: my %saveable_parameters = ('show' => 'scalar',);
3798: &Apache::loncommon::store_course_settings('parameter_log',
3799: \%saveable_parameters);
3800: &Apache::loncommon::restore_course_settings('parameter_log',
3801: \%saveable_parameters);
1.348 www 3802: $r->print(&Apache::loncommon::display_filter().
1.326 www 3803: '<label>'.&Apache::lonhtmlcommon::checkbox('includetypes',$env{'form.includetypes'},'1').
3804: ' '.&mt('Include parameter types').'</label>'.
1.327 albertel 3805: '<input type="submit" value="'.&mt('Display').'" /></form>');
1.301 www 3806:
1.291 www 3807: my $courseopt=&Apache::lonnet::get_courseresdata($env{'course.'.$env{'request.course.id'}.'.num'},
3808: $env{'course.'.$env{'request.course.id'}.'.domain'});
1.301 www 3809: $r->print(&Apache::loncommon::start_data_table().&Apache::loncommon::start_data_table_header_row().
3810: '<th>'.&mt('Time').'</th><th>'.&mt('User').'</th><th>'.&mt('Extent').'</th><th>'.&mt('Users').'</th><th>'.
3811: &mt('Parameter').'</th><th>'.&mt('Part').'</th><th>'.&mt('New Value').'</th><th>'.&mt('Announce').'</th>'.
3812: &Apache::loncommon::end_data_table_header_row());
1.309 www 3813: my $shown=0;
1.349 www 3814: my $folder='';
3815: if ($env{'form.displayfilter'} eq 'currentfolder') {
3816: my $last='';
3817: if (tie(my %hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db',
3818: &GDBM_READER(),0640)) {
3819: $last=$hash{'last_known'};
3820: untie(%hash);
3821: }
3822: if ($last) { ($folder) = &Apache::lonnet::decode_symb($last); }
3823: }
1.356 albertel 3824: foreach my $id (sort
3825: {
3826: if ($parmlog{$b}{'exe_time'} ne $parmlog{$a}{'exe_time'}) {
3827: return $parmlog{$b}{'exe_time'} <=>$parmlog{$a}{'exe_time'}
3828: }
3829: my $aid = (split('00000',$a))[-1];
3830: my $bid = (split('00000',$b))[-1];
3831: return $bid<=>$aid;
3832: } (keys(%parmlog))) {
1.294 www 3833: my @changes=keys(%{$parmlog{$id}{'logentry'}});
1.332 albertel 3834: my $count = 0;
1.288 albertel 3835: my $time =
1.294 www 3836: &Apache::lonlocal::locallocaltime($parmlog{$id}{'exe_time'});
1.289 www 3837: my $plainname =
1.294 www 3838: &Apache::loncommon::plainname($parmlog{$id}{'exe_uname'},
3839: $parmlog{$id}{'exe_udom'});
1.288 albertel 3840: my $about_me_link =
1.289 www 3841: &Apache::loncommon::aboutmewrapper($plainname,
1.294 www 3842: $parmlog{$id}{'exe_uname'},
3843: $parmlog{$id}{'exe_udom'});
1.293 www 3844: my $send_msg_link='';
1.294 www 3845: if ((($parmlog{$id}{'exe_uname'} ne $env{'user.name'})
3846: || ($parmlog{$id}{'exe_udom'} ne $env{'user.domain'}))) {
1.293 www 3847: $send_msg_link ='<br />'.
1.288 albertel 3848: &Apache::loncommon::messagewrapper(&mt('Send message'),
1.294 www 3849: $parmlog{$id}{'exe_uname'},
3850: $parmlog{$id}{'exe_udom'});
1.288 albertel 3851: }
1.301 www 3852: my $row_start=&Apache::loncommon::start_data_table_row();
1.290 www 3853: my $makenewrow=0;
3854: my %istype=();
1.332 albertel 3855: my $output;
1.293 www 3856: foreach my $changed (reverse(sort(@changes))) {
1.330 albertel 3857: my $value=$parmlog{$id}{'logentry'}{$changed};
1.331 albertel 3858: my $typeflag = ($changed =~/\.type$/ &&
3859: !exists($parmlog{$id}{'logentry'}{$changed.'.type'}));
1.330 albertel 3860: my ($realm,$section,$parmname,$part,$what,$middle,$uname,$udom,$issection,$realmdescription)=
3861: &components($changed,$parmlog{$id}{'uname'},$parmlog{$id}{'udom'},undef,undef,$typeflag);
1.349 www 3862: if ($env{'form.displayfilter'} eq 'currentfolder') {
3863: if ($folder) {
3864: if ($middle!~/^\Q$folder\E/) { next; }
3865: }
3866: }
1.326 www 3867: if ($typeflag) {
1.329 albertel 3868: $istype{$parmname}=$value;
1.326 www 3869: if (!$env{'form.includetypes'}) { next; }
3870: }
1.332 albertel 3871: $count++;
3872: if ($makenewrow) {
3873: $output .= $row_start;
3874: } else {
3875: $makenewrow=1;
3876: }
3877: $output .='<td>'.$realm.'</td><td>'.$section.'</td><td>'.
1.292 www 3878: &standard_parameter_names($parmname).'</td><td>'.
1.332 albertel 3879: ($part?&mt('Part: [_1]',$part):&mt('All Parts')).'</td><td>';
1.291 www 3880: my $stillactive=0;
1.332 albertel 3881: if ($parmlog{$id}{'delflag'}) {
3882: $output .= &mt('Deleted');
1.288 albertel 3883: } else {
1.290 www 3884: if ($typeflag) {
1.332 albertel 3885: $output .= &mt('Type: [_1]',&standard_parameter_names($value));
1.290 www 3886: } else {
1.291 www 3887: my ($level,@all)=&parmval_by_symb($what,$middle,&Apache::lonnet::metadata($middle,$what),
3888: $uname,$udom,$issection,$issection,$courseopt);
3889: if (&isdateparm($istype{$parmname})) {
1.332 albertel 3890: $output .= &Apache::lonlocal::locallocaltime($value);
1.291 www 3891: } else {
1.332 albertel 3892: $output .= $value;
1.291 www 3893: }
3894: if ($value ne $all[$level]) {
1.332 albertel 3895: $output .= '<br /><span class="LC_warning">'.&mt('Not active anymore').'</span>';
1.291 www 3896: } else {
3897: $stillactive=1;
3898: }
1.290 www 3899: }
1.288 albertel 3900: }
1.332 albertel 3901: $output .= '</td><td>';
1.291 www 3902: if ($stillactive) {
1.304 www 3903: my $title=&mt('Changed [_1]',&standard_parameter_names($parmname));
3904: my $description=&mt('Changed [_1] for [_2] to [_3]',&standard_parameter_names($parmname),$realmdescription,
3905: (&isdateparm($istype{$parmname})?&Apache::lonlocal::locallocaltime($value):$value));
1.292 www 3906: if (($uname) && ($udom)) {
1.332 albertel 3907: $output .=
3908: &Apache::loncommon::messagewrapper('Notify User',
3909: $uname,$udom,$title,
3910: $description);
1.292 www 3911: } else {
1.332 albertel 3912: $output .=
3913: &Apache::lonrss::course_blog_link($id,$title,
3914: $description);
1.292 www 3915: }
1.291 www 3916: }
1.332 albertel 3917: $output .= '</td>'.&Apache::loncommon::end_data_table_row();
1.288 albertel 3918: }
1.349 www 3919: if ($env{'form.displayfilter'} eq 'containing') {
3920: my $wholeentry=$about_me_link.':'.
3921: $parmlog{$id}{'exe_uname'}.':'.$parmlog{$id}{'exe_udom'}.':'.
3922: $output;
3923: if ($wholeentry!~/\Q$env{'form.containingphrase'}\E/i) { next; }
3924: }
3925: if ($count) {
3926: $r->print($row_start.'<td rowspan="'.$count.'">'.$time.'</td>
1.332 albertel 3927: <td rowspan="'.$count.'">'.$about_me_link.
3928: '<br /><tt>'.$parmlog{$id}{'exe_uname'}.
3929: ':'.$parmlog{$id}{'exe_udom'}.'</tt>'.
3930: $send_msg_link.'</td>'.$output);
1.349 www 3931: $shown++;
3932: }
1.311 albertel 3933: if (!($env{'form.show'} eq &mt('all')
3934: || $shown<=$env{'form.show'})) { last; }
1.286 www 3935: }
1.301 www 3936: $r->print(&Apache::loncommon::end_data_table());
1.284 www 3937: $r->print(&Apache::loncommon::end_page());
3938: }
3939:
1.355 albertel 3940: sub check_for_course_info {
3941: my $navmap = Apache::lonnavmaps::navmap->new();
3942: return 1 if ($navmap);
3943: return 0;
3944: }
3945:
1.178 raeburn 3946: ##################################################
3947: ##################################################
1.30 www 3948:
1.59 matthew 3949: =pod
3950:
1.83 bowersj2 3951: =item * handler
1.59 matthew 3952:
3953: Main handler. Calls &assessparms and &crsenv subroutines.
3954:
3955: =cut
3956: ##################################################
3957: ##################################################
1.220 www 3958: # use Data::Dumper;
3959:
1.259 banghart 3960:
1.30 www 3961: sub handler {
1.43 albertel 3962: my $r=shift;
1.30 www 3963:
1.43 albertel 3964: if ($r->header_only) {
1.126 www 3965: &Apache::loncommon::content_type($r,'text/html');
1.43 albertel 3966: $r->send_http_header;
3967: return OK;
3968: }
1.193 albertel 3969: &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
1.205 www 3970: ['action','state',
3971: 'pres_marker',
3972: 'pres_value',
1.206 www 3973: 'pres_type',
1.243 banghart 3974: 'udom','uname','symb','serial']);
1.131 www 3975:
1.83 bowersj2 3976:
1.193 albertel 3977: &Apache::lonhtmlcommon::clear_breadcrumbs();
1.194 albertel 3978: &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/parmset",
3979: text=>"Parameter Manager",
1.204 www 3980: faq=>10,
1.324 www 3981: bug=>'Instructor Interface',
3982: help => 'Parameter_Manager'});
1.203 www 3983:
1.30 www 3984: # ----------------------------------------------------- Needs to be in a course
1.194 albertel 3985: my $parm_permission =
3986: (&Apache::lonnet::allowed('opa',$env{'request.course.id'}) ||
1.190 albertel 3987: &Apache::lonnet::allowed('opa',$env{'request.course.id'}.'/'.
1.193 albertel 3988: $env{'request.course.sec'}));
1.355 albertel 3989: my $exists = &check_for_course_info();
3990:
3991: if ($env{'request.course.id'} && $parm_permission && $exists) {
1.193 albertel 3992:
3993: # Start Page
1.126 www 3994: &Apache::loncommon::content_type($r,'text/html');
1.106 www 3995: $r->send_http_header;
1.30 www 3996:
1.203 www 3997:
3998: # id numbers can change on re-ordering of folders
3999:
4000: &resetsymbcache();
4001:
1.193 albertel 4002: #
4003: # Main switch on form.action and form.state, as appropriate
4004: #
4005: # Check first if coming from someone else headed directly for
4006: # the table mode
4007: if ((($env{'form.command'} eq 'set') && ($env{'form.url'})
4008: && (!$env{'form.dis'})) || ($env{'form.symb'})) {
1.324 www 4009: &Apache::lonhtmlcommon::add_breadcrumb({help=>'Problem_Parameters',
4010: text=>"Problem Parameters"});
1.193 albertel 4011: &assessparms($r);
4012:
4013: } elsif (! exists($env{'form.action'})) {
4014: $r->print(&header());
1.298 albertel 4015: $r->print(&Apache::lonhtmlcommon::breadcrumbs('Parameter Manager'));
1.193 albertel 4016: &print_main_menu($r,$parm_permission);
4017: } elsif ($env{'form.action'} eq 'crsenv' && $parm_permission) {
1.194 albertel 4018: &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=crsenv',
4019: text=>"Course Environment"});
1.193 albertel 4020: &crsenv($r);
4021: } elsif ($env{'form.action'} eq 'setoverview' && $parm_permission) {
1.194 albertel 4022: &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview',
4023: text=>"Overview Mode"});
1.121 www 4024: &overview($r);
1.334 banghart 4025: } elsif ($env{'form.action'} eq 'addmetadata' && $parm_permission) {
4026: &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=addmetadata',
4027: text=>"Add Metadata Field"});
4028: &addmetafield($r);
1.340 banghart 4029: } elsif ($env{'form.action'} eq 'ordermetadata' && $parm_permission) {
4030: &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=addmetadata',
4031: text=>"Add Metadata Field"});
4032: &order_meta_fields($r);
1.259 banghart 4033: } elsif ($env{'form.action'} eq 'setrestrictmeta' && $parm_permission) {
4034: &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setrestrictmeta',
4035: text=>"Restrict Metadata"});
4036: &setrestrictmeta($r);
1.208 www 4037: } elsif ($env{'form.action'} eq 'newoverview' && $parm_permission) {
4038: &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview',
4039: text=>"Overview Mode"});
4040: &newoverview($r);
1.220 www 4041: } elsif ($env{'form.action'} eq 'setdefaults' && $parm_permission) {
4042: &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setdefaults',
4043: text=>"Set Defaults"});
4044: &defaultsetter($r);
4045: } elsif ($env{'form.action'} eq 'settable' && $parm_permission) {
1.194 albertel 4046: &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=settable',
1.204 www 4047: text=>"Table Mode",
4048: help => 'Course_Setting_Parameters'});
1.121 www 4049: &assessparms($r);
1.284 www 4050: } elsif ($env{'form.action'} eq 'parameterchangelog' && $parm_permission) {
4051: &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=settable',
1.292 www 4052: text=>"Parameter Change Log"});
1.285 albertel 4053: &parm_change_log($r);
1.333 albertel 4054: } elsif ($env{'form.action'} eq 'cleanparameters' && $parm_permission) {
4055: &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=cleanparameters',
4056: text=>"Clean Parameters"});
4057: &clean_parameters($r);
1.284 www 4058: }
1.43 albertel 4059: } else {
1.1 www 4060: # ----------------------------- Not in a course, or not allowed to modify parms
1.355 albertel 4061: if ($exists) {
4062: $env{'user.error.msg'}=
4063: "/adm/parmset:opa:0:0:Cannot modify assessment parameters";
4064: } else {
4065: $env{'user.error.msg'}=
4066: "/adm/parmset::0:1:Course environment gone, reinitialize the course";
4067: }
1.43 albertel 4068: return HTTP_NOT_ACCEPTABLE;
4069: }
4070: return OK;
1.1 www 4071: }
4072:
4073: 1;
4074: __END__
4075:
1.59 matthew 4076: =pod
1.38 harris41 4077:
4078: =back
4079:
4080: =cut
1.1 www 4081:
4082:
4083:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>