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