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