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