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