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