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