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