Annotation of loncom/interface/lonparmset.pm, revision 1.496
1.1 www 1: # The LearningOnline Network with CAPA
2: # Handler to set parameters for assessments
3: #
1.496 ! raeburn 4: # $Id: lonparmset.pm,v 1.495 2010/04/13 21:47:24 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.463 bisitz 1739: $r->print(&Apache::loncommon::start_data_table()
1740: .&Apache::loncommon::start_data_table_row()
1741: .'<td>'.$icon
1742: .'<label> '
1743: .'<input type="radio" name="pschp" checked="checked" value="all" />'
1744: .&mt('All Maps or Folders')
1745: .'</label></td>'
1746: .&Apache::loncommon::end_data_table_row()
1747: );
1.464 bisitz 1748: my $whitespace = '<img src="'
1749: .&Apache::loncommon::lonhttpdurl("/adm/lonIcons/whitespace_21.gif")
1750: .'" alt="" />';
1.468 amueller 1751: if (exists($$allmaps{1})) {
1752: $r->print(&Apache::loncommon::start_data_table_row()
1753: .'<td>'.$icon
1754: .'<label> '
1755: .'<input type="radio" name="pschp" value="1"'
1756: );
1757: if ($pschp eq 1) {
1758: $r->print(' checked="checked"');
1759: }
1760: $r->print('/>'
1761: .$$maptitles{1}
1762: .($$allmaps{1} !~/^uploaded/?' ['.$$allmaps{1}.']':'')
1763: .'</label>'
1764: .'</td>'
1765: .&Apache::loncommon::end_data_table_row()
1766: );
1767: }
1768: foreach my $id (@{$tree}) {
1769: my ($mapid,$resid)=split(/\./,$id);
1.464 bisitz 1770: # Indentation
1.468 amueller 1771: my $depth = $treeinfo->{$id}->{'depth'};
1.464 bisitz 1772: my $indent;
1773: for (my $i = 0; $i < $depth; $i++) {
1774: $indent.= $whitespace;
1775: }
1.461 neumanie 1776: $icon = '<img src="/adm/lonIcons/navmap.folder.open.gif" alt="" />';
1.468 amueller 1777: if ($treeinfo->{$id}->{'type'} eq 'page') {
1.461 neumanie 1778: $icon = '<img src="/adm/lonIcons/navmap.page.open.gif" alt="" />';
1779: }
1.468 amueller 1780: my $symb_name = $$symbp{$id};
1781: my ($front, $tail) = split (/___${resid}___/, $symb_name);
1782: $symb_name = $tail;
1.463 bisitz 1783: $r->print(&Apache::loncommon::start_data_table_row()
1784: .'<td>'.$indent.$icon
1785: .'<label> '
1.468 amueller 1786: .'<input type ="radio" name="pschp" value="'.$allmaps_inverted{$symb_name}.'"'
1.463 bisitz 1787: );
1.468 amueller 1788: if ($pschp eq $allmaps_inverted{$symb_name}) {
1.461 neumanie 1789: $r->print(' checked="checked"');
1790: }
1.463 bisitz 1791: $r->print('/>'
1.468 amueller 1792: .$treeinfo->{$id}->{name}
1.463 bisitz 1793: .($$allmaps{$mapid}!~/^uploaded/?' ['.$$allmaps{$mapid}.']':'')
1794: .'</label>'
1795: .'</td>'
1796: .&Apache::loncommon::end_data_table_row()
1797: );
1.461 neumanie 1798: }
1.462 neumanie 1799: $r->print(&Apache::loncommon::end_data_table());
1.209 www 1800: }
1801: }
1802:
1.482 amueller 1803: # Build up the select Box to choose if your parameter specification should work for the resource, map/folder or the course level
1804: # 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 1805: sub levelmenu {
1.446 bisitz 1806: my ($r,$alllevs,$parmlev)=@_;
1807:
1.445 neumanie 1808: $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parameter Level').&Apache::loncommon::help_open_topic('Course_Parameter_Levels')));
1.474 amueller 1809: $r->print('<select id="parmlev" name="parmlev" onchange="showHide_courseContent()">');
1.209 www 1810: foreach (reverse sort keys %{$alllevs}) {
1.473 amueller 1811: $r->print('<option value="'.$$alllevs{$_}.'"');
1812: if ($parmlev eq $$alllevs{$_}) {
1813: $r->print(' selected="selected"');
1814: }
1815: $r->print('>'.&mt($_).'</option>');
1.208 www 1816: }
1.446 bisitz 1817: $r->print("</select>");
1.208 www 1818: }
1819:
1.211 www 1820:
1821: sub sectionmenu {
1822: my ($r,$selectedsections)=@_;
1.300 albertel 1823: my %sectionhash = &Apache::loncommon::get_sections();
1824: return if (!%sectionhash);
1825:
1.421 bisitz 1826: $r->print('<select name="Section" multiple="multiple" size="8">');
1.300 albertel 1827: foreach my $s ('all',sort keys %sectionhash) {
1.473 amueller 1828: $r->print(' <option value="'.$s.'"');
1829: foreach (@{$selectedsections}) {
1830: if ($s eq $_) {
1831: $r->print(' selected="selected"');
1832: last;
1833: }
1834: }
1835: $r->print('>'.$s."</option>\n");
1.300 albertel 1836: }
1837: $r->print("</select>\n");
1.269 raeburn 1838: }
1839:
1840: sub groupmenu {
1841: my ($r,$selectedgroups)=@_;
1.307 raeburn 1842: my %grouphash = &Apache::longroup::coursegroups();
1.299 albertel 1843: return if (!%grouphash);
1844:
1.421 bisitz 1845: $r->print('<select name="Group" multiple="multiple" size="8">');
1.299 albertel 1846: foreach my $group (sort(keys(%grouphash))) {
1.473 amueller 1847: $r->print(' <option value="'.$group.'"');
1848: foreach (@{$selectedgroups}) {
1849: if ($group eq $_) {
1850: $r->print(' selected="selected"');
1851: last;
1852: }
1853: }
1854: $r->print('>'.$group."</option>\n");
1.211 www 1855: }
1.299 albertel 1856: $r->print("</select>\n");
1.211 www 1857: }
1858:
1.269 raeburn 1859:
1.210 www 1860: sub keysplit {
1861: my $keyp=shift;
1862: return (split(/\,/,$keyp));
1863: }
1864:
1865: sub keysinorder {
1866: my ($name,$keyorder)=@_;
1867: return sort {
1.473 amueller 1868: $$keyorder{$a} <=> $$keyorder{$b};
1.210 www 1869: } (keys %{$name});
1870: }
1871:
1.236 albertel 1872: sub keysinorder_bytype {
1873: my ($name,$keyorder)=@_;
1874: return sort {
1.473 amueller 1875: my $ta=(split('_',$a))[-1];
1876: my $tb=(split('_',$b))[-1];
1877: if ($$keyorder{'parameter_0_'.$ta} == $$keyorder{'parameter_0_'.$tb}) {
1878: return ($a cmp $b);
1879: }
1880: $$keyorder{'parameter_0_'.$ta} <=> $$keyorder{'parameter_0_'.$tb};
1.236 albertel 1881: } (keys %{$name});
1882: }
1883:
1.211 www 1884: sub keysindisplayorder {
1885: my ($name,$keyorder)=@_;
1886: return sort {
1.473 amueller 1887: $$keyorder{'parameter_0_'.$a} <=> $$keyorder{'parameter_0_'.$b};
1.211 www 1888: } (keys %{$name});
1889: }
1890:
1.214 www 1891: sub sortmenu {
1892: my ($r,$sortorder)=@_;
1.236 albertel 1893: $r->print('<br /><label><input type="radio" name="sortorder" value="realmstudent"');
1.214 www 1894: if ($sortorder eq 'realmstudent') {
1.422 bisitz 1895: $r->print(' checked="checked"');
1.214 www 1896: }
1897: $r->print(' />'.&mt('Sort by realm first, then student (group/section)'));
1.236 albertel 1898: $r->print('</label><br /><label><input type="radio" name="sortorder" value="studentrealm"');
1.214 www 1899: if ($sortorder eq 'studentrealm') {
1.422 bisitz 1900: $r->print(' checked="checked"');
1.214 www 1901: }
1.236 albertel 1902: $r->print(' />'.&mt('Sort by student (group/section) first, then realm').
1.473 amueller 1903: '</label>');
1.214 www 1904: }
1905:
1.211 www 1906: sub standardkeyorder {
1907: return ('parameter_0_opendate' => 1,
1.473 amueller 1908: 'parameter_0_duedate' => 2,
1909: 'parameter_0_answerdate' => 3,
1910: 'parameter_0_interval' => 4,
1911: 'parameter_0_weight' => 5,
1912: 'parameter_0_maxtries' => 6,
1913: 'parameter_0_hinttries' => 7,
1914: 'parameter_0_contentopen' => 8,
1915: 'parameter_0_contentclose' => 9,
1916: 'parameter_0_type' => 10,
1917: 'parameter_0_problemstatus' => 11,
1918: 'parameter_0_hiddenresource' => 12,
1919: 'parameter_0_hiddenparts' => 13,
1920: 'parameter_0_display' => 14,
1921: 'parameter_0_ordered' => 15,
1922: 'parameter_0_tol' => 16,
1923: 'parameter_0_sig' => 17,
1924: 'parameter_0_turnoffunit' => 18,
1.218 www 1925: 'parameter_0_discussend' => 19,
1926: 'parameter_0_discusshide' => 20);
1.211 www 1927: }
1928:
1.59 matthew 1929:
1.30 www 1930: sub assessparms {
1.1 www 1931:
1.43 albertel 1932: my $r=shift;
1.201 www 1933:
1934: my @ids=();
1935: my %symbp=();
1936: my %mapp=();
1937: my %typep=();
1938: my %keyp=();
1939: my %uris=();
1940: my %maptitles=();
1941:
1.2 www 1942: # -------------------------------------------------------- Variable declaration
1.209 www 1943:
1.129 www 1944: my %allmaps=();
1945: my %alllevs=();
1.57 albertel 1946:
1.187 www 1947: my $uname;
1948: my $udom;
1949: my $uhome;
1950: my $csec;
1.269 raeburn 1951: my $cgroup;
1.275 raeburn 1952: my @usersgroups = ();
1.446 bisitz 1953:
1.190 albertel 1954: my $coursename=$env{'course.'.$env{'request.course.id'}.'.description'};
1.187 www 1955:
1.57 albertel 1956: $alllevs{'Resource Level'}='full';
1.215 www 1957: $alllevs{'Map/Folder Level'}='map';
1.57 albertel 1958: $alllevs{'Course Level'}='general';
1959:
1960: my %allparms;
1961: my %allparts;
1.210 www 1962: #
1963: # Order in which these parameters will be displayed
1964: #
1.211 www 1965: my %keyorder=&standardkeyorder();
1966:
1.43 albertel 1967: @ids=();
1968: %symbp=();
1969: %typep=();
1970:
1971: my $message='';
1972:
1.190 albertel 1973: $csec=$env{'form.csec'};
1.269 raeburn 1974: $cgroup=$env{'form.cgroup'};
1.188 www 1975:
1.190 albertel 1976: if ($udom=$env{'form.udom'}) {
1977: } elsif ($udom=$env{'request.role.domain'}) {
1978: } elsif ($udom=$env{'user.domain'}) {
1.172 albertel 1979: } else {
1.473 amueller 1980: $udom=$r->dir_config('lonDefDomain');
1.172 albertel 1981: }
1.468 amueller 1982:
1.43 albertel 1983:
1.134 albertel 1984: my @pscat=&Apache::loncommon::get_env_multiple('form.pscat');
1.190 albertel 1985: my $pschp=$env{'form.pschp'};
1.134 albertel 1986: my @psprt=&Apache::loncommon::get_env_multiple('form.psprt');
1.76 www 1987: if (!@psprt) { $psprt[0]='0'; }
1.57 albertel 1988:
1.43 albertel 1989: my $pssymb='';
1.57 albertel 1990: my $parmlev='';
1.446 bisitz 1991:
1.190 albertel 1992: unless ($env{'form.parmlev'}) {
1.57 albertel 1993: $parmlev = 'map';
1994: } else {
1.190 albertel 1995: $parmlev = $env{'form.parmlev'};
1.57 albertel 1996: }
1.26 www 1997:
1.29 www 1998: # ----------------------------------------------- Was this started from grades?
1999:
1.190 albertel 2000: if (($env{'form.command'} eq 'set') && ($env{'form.url'})
1.473 amueller 2001: && (!$env{'form.dis'})) {
2002: my $url=$env{'form.url'};
2003: $url=~s-^http://($ENV{'SERVER_NAME'}|$ENV{'HTTP_HOST'})--;
2004: $pssymb=&Apache::lonnet::symbread($url);
2005: if (!@pscat) { @pscat=('all'); }
2006: $pschp='';
1.57 albertel 2007: $parmlev = 'full';
1.190 albertel 2008: } elsif ($env{'form.symb'}) {
1.473 amueller 2009: $pssymb=$env{'form.symb'};
2010: if (!@pscat) { @pscat=('all'); }
2011: $pschp='';
1.57 albertel 2012: $parmlev = 'full';
1.43 albertel 2013: } else {
1.473 amueller 2014: $env{'form.url'}='';
1.43 albertel 2015: }
2016:
1.190 albertel 2017: my $id=$env{'form.id'};
1.43 albertel 2018: if (($id) && ($udom)) {
1.473 amueller 2019: $uname=(&Apache::lonnet::idget($udom,$id))[1];
2020: if ($uname) {
2021: $id='';
2022: } else {
2023: $message=
2024: '<span class="LC_error">'.&mt("Unknown ID")." '$id' ".
2025: &mt('at domain')." '$udom'</span>";
2026: }
1.43 albertel 2027: } else {
1.473 amueller 2028: $uname=$env{'form.uname'};
1.43 albertel 2029: }
2030: unless ($udom) { $uname=''; }
2031: $uhome='';
2032: if ($uname) {
1.473 amueller 2033: $uhome=&Apache::lonnet::homeserver($uname,$udom);
1.43 albertel 2034: if ($uhome eq 'no_host') {
1.473 amueller 2035: $message=
2036: '<span class="LC_error">'.&mt("Unknown user")." '$uname' ".
2037: &mt("at domain")." '$udom'</span>";
2038: $uname='';
1.12 www 2039: } else {
1.473 amueller 2040: $csec=&Apache::lonnet::getsection($udom,$uname,
2041: $env{'request.course.id'});
2042: if ($csec eq '-1') {
2043: $message='<span class="LC_error">'.
2044: &mt("User")." '$uname' ".&mt("at domain")." '$udom' ".
2045: &mt("not in this course")."</span>";
2046: $uname='';
2047: $csec=$env{'form.csec'};
1.269 raeburn 2048: $cgroup=$env{'form.cgroup'};
1.473 amueller 2049: } else {
2050: my %name=&Apache::lonnet::userenvironment($udom,$uname,
2051: ('firstname','middlename','lastname','generation','id'));
2052: $message="\n<p>\n".&mt("Full Name").": ".
2053: $name{'firstname'}.' '.$name{'middlename'}.' '
2054: .$name{'lastname'}.' '.$name{'generation'}.
2055: "<br />\n".&mt('ID').": ".$name{'id'}.'<p>';
2056: }
1.297 raeburn 2057: @usersgroups = &Apache::lonnet::get_users_groups(
1.275 raeburn 2058: $udom,$uname,$env{'request.course.id'});
1.297 raeburn 2059: if (@usersgroups > 0) {
1.306 albertel 2060: unless (grep(/^\Q$cgroup\E$/,@usersgroups)) {
1.275 raeburn 2061: $cgroup = $usersgroups[0];
1.297 raeburn 2062: }
1.269 raeburn 2063: }
1.12 www 2064: }
1.43 albertel 2065: }
1.2 www 2066:
1.43 albertel 2067: unless ($csec) { $csec=''; }
1.269 raeburn 2068: unless ($cgroup) { $cgroup=''; }
1.12 www 2069:
1.14 www 2070: # --------------------------------------------------------- Get all assessments
1.446 bisitz 2071: &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps,
1.473 amueller 2072: \%mapp, \%symbp,\%maptitles,\%uris,
2073: \%keyorder);
1.63 bowersj2 2074:
1.57 albertel 2075: $mapp{'0.0'} = '';
2076: $symbp{'0.0'} = '';
1.99 albertel 2077:
1.14 www 2078: # ---------------------------------------------------------- Anything to store?
1.190 albertel 2079: if ($env{'form.pres_marker'}) {
1.205 www 2080: my @markers=split(/\&\&\&/,$env{'form.pres_marker'});
2081: my @values=split(/\&\&\&/,$env{'form.pres_value'});
2082: my @types=split(/\&\&\&/,$env{'form.pres_type'});
1.473 amueller 2083: for (my $i=0;$i<=$#markers;$i++) {
1.437 raeburn 2084: if ($markers[$i] =~ /^[\d.]+\&0_availablestudent\&(1|2|3)$/) {
2085: my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
2086: my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
2087: my (@ok_slots,@fail_slots,@del_slots);
2088: my $courseopt=&Apache::lonnet::get_courseresdata($cnum,$cdom);
2089: my ($level,@all) =
2090: &parmval_by_symb('0.availablestudent',$pssymb,'',$uname,$udom,
2091: $csec,$cgroup,$courseopt);
2092: foreach my $slot_name (split(/:/,$values[$i])) {
2093: next if ($slot_name eq '');
2094: if (&update_slots($slot_name,$cdom,$cnum,$pssymb,$uname,$udom) eq 'ok') {
2095: push(@ok_slots,$slot_name);
2096:
2097: } else {
2098: push(@fail_slots,$slot_name);
2099: }
2100: }
2101: if (@ok_slots) {
2102: $values[$i] = join(':',@ok_slots);
2103: } else {
2104: $values[$i] = '';
2105: }
2106: if ($all[$level] ne '') {
2107: my @existing = split(/:/,$all[$level]);
2108: foreach my $slot_name (@existing) {
2109: if (!grep(/^\Q$slot_name\E$/,split(/:/,$values[$i]))) {
2110: if (&delete_slots($slot_name,$cdom,$cnum,$uname,$udom,$pssymb) eq 'ok') {
2111: push(@del_slots,$slot_name);
2112: }
2113: }
2114: }
2115: }
2116: }
1.473 amueller 2117: $message.=&storeparm(split(/\&/,$markers[$i]),
2118: $values[$i],
2119: $types[$i],
2120: $uname,$udom,$csec,$cgroup);
2121: }
1.68 www 2122: # ---------------------------------------------------------------- Done storing
1.473 amueller 2123: $message.='<p class="LC_warning">'
1.459 bisitz 2124: .&mt('Changes can take up to 10 minutes before being active for all students.')
2125: .&Apache::loncommon::help_open_topic('Caching')
2126: .'</p>';
1.68 www 2127: }
1.57 albertel 2128: #----------------------------------------------- if all selected, fill in array
1.209 www 2129: if ($pscat[0] eq "all") {@pscat = (keys %allparms);}
1.446 bisitz 2130: if (!@pscat) { @pscat=('duedate','opendate','answerdate','weight','maxtries') };
1.57 albertel 2131: if ($psprt[0] eq "all" || !@psprt) {@psprt = (keys %allparts);}
1.2 www 2132: # ------------------------------------------------------------------ Start page
1.63 bowersj2 2133:
1.209 www 2134: &startpage($r);
1.57 albertel 2135:
1.44 albertel 2136: foreach ('tolerance','date_default','date_start','date_end',
1.473 amueller 2137: 'date_interval','int','float','string') {
2138: $r->print('<input type="hidden" value="'.
2139: &HTML::Entities::encode($env{'form.recent_'.$_},'"&<>').
2140: '" name="recent_'.$_.'" />');
1.44 albertel 2141: }
1.446 bisitz 2142:
1.459 bisitz 2143: # ----- Start Parameter Selection
2144:
2145: # Hide parm selection?
2146: $r->print(<<ENDPARMSELSCRIPT);
2147: <script type="text/javascript">
2148: // <![CDATA[
2149: function parmsel_show() {
2150: document.getElementById('parmsel').style.display = "";
2151: document.getElementById('parmsellink').style.display = "none";
2152: }
2153: // ]]>
2154: </script>
2155: ENDPARMSELSCRIPT
1.474 amueller 2156:
1.445 neumanie 2157: if (!$pssymb) {
1.486 www 2158: my $parmselhiddenstyle=' style="display:none"';
2159: if($env{'form.hideparmsel'} eq 'hidden') {
2160: $r->print('<div id="parmsel"'.$parmselhiddenstyle.'>');
2161: } else {
2162: $r->print('<div id="parmsel">');
2163: }
2164:
1.491 bisitz 2165: # Step 1
1.479 raeburn 2166: $r->print(&Apache::lonhtmlcommon::topic_bar(1,&mt('Resource Specification')));
1.474 amueller 2167: $r->print(<<COURSECONTENTSCRIPT);
2168: <script type="text/javascript">
2169: // <![CDATA[
2170: function showHide_courseContent(){
2171: var parmlevValue=document.getElementById("parmlev").value;
2172: if (parmlevValue == 'general') {
2173: document.getElementById('mapmenu').style.display="none";
2174: } else {
2175: if ((parmlevValue == "full") || (parmlevValue == "map")) {
2176: document.getElementById('mapmenu').style.display ="";
2177: } else {
2178: document.getElementById('mapmenu').style.display="none";
2179: }
2180: }
2181: }
2182: // ]]>
2183: </script>
2184: COURSECONTENTSCRIPT
2185:
1.445 neumanie 2186: $r->print(&Apache::lonhtmlcommon::start_pick_box());
1.209 www 2187: &levelmenu($r,\%alllevs,$parmlev);
1.491 bisitz 2188: $r->print(&Apache::lonhtmlcommon::row_closure());
1.474 amueller 2189: &mapmenu($r,\%allmaps,$pschp,\%maptitles, \%symbp);
1.491 bisitz 2190: $r->print(&Apache::lonhtmlcommon::row_closure());
2191: $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parts to View')));
2192: &partmenu($r,\%allparts,\@psprt);
1.474 amueller 2193: $r->print(&Apache::lonhtmlcommon::row_closure(1));
2194: $r->print(&Apache::lonhtmlcommon::end_pick_box());
1.491 bisitz 2195:
2196: # Step 2
1.479 raeburn 2197: $r->print(&Apache::lonhtmlcommon::topic_bar(2,&mt('Parameter Specification')));
1.473 amueller 2198: &displaymenu($r,\%allparms,\%allparts,\@pscat,\@psprt,\%keyorder);
1.491 bisitz 2199:
2200: # Step 3
1.479 raeburn 2201: $r->print(&Apache::lonhtmlcommon::topic_bar(3,&mt('User Specification (optional)')));
1.486 www 2202: $r->print(&Apache::lonhtmlcommon::start_pick_box());
2203: &usermenu($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,\@usersgroups);
2204: $r->print(&Apache::lonhtmlcommon::row_closure(1));
2205: $r->print(&Apache::lonhtmlcommon::end_pick_box());
1.491 bisitz 2206:
2207: # Update Display Button
1.486 www 2208: $r->print('<p>'
2209: .'<input type="submit" name="dis"'
2210: .' value="'.&mt('Update Parameter Display').'" />'
2211: .'<input type="hidden" name="hideparmsel" value="hidden" />'
2212: .'</p>');
2213: $r->print('</div>');
1.491 bisitz 2214:
1.486 www 2215: # Offer link to display parameter selection again
2216: $r->print('<p id="parmsellink"');
2217: if ($env{'form.hideparmsel'} ne 'hidden') {
2218: $r->print($parmselhiddenstyle);
2219: }
2220: $r->print('>'
2221: .'<a href="javascript:parmsel_show()">'
2222: .&mt('Change Parameter Selection')
2223: .'</a>'
2224: .'</p>');
1.44 albertel 2225: } else {
1.478 amueller 2226: # parameter screen for a single resource.
1.486 www 2227: my ($map,$iid,$resource)=&Apache::lonnet::decode_symb($pssymb);
1.473 amueller 2228: my $title = &Apache::lonnet::gettitle($pssymb);
1.312 albertel 2229: $r->print(&mt('Specific Resource: [_1] ([_2])',$title,$resource).
1.472 amueller 2230: '<input type="hidden" value="'.$pssymb.'" name="symb" />'.
1.486 www 2231: '<br />');
2232: $r->print(&Apache::lonhtmlcommon::topic_bar('',&mt('Additional Display Specification (optional)')));
2233: $r->print(&Apache::lonhtmlcommon::start_pick_box());
2234: $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parts to View')).
2235: '<label>'.&mt('Show all parts').': <input type="checkbox" name="psprt" value="all"'.
2236: ($env{'form.psprt'}?' checked="checked"':'').' /></label></td></tr>');
2237: &usermenu($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,\@usersgroups);
2238: $r->print(&Apache::lonhtmlcommon::row_closure(1));
2239: $r->print(&Apache::lonhtmlcommon::end_pick_box());
2240: $r->print('<p>'
1.459 bisitz 2241: .'<input type="submit" name="dis"'
2242: .' value="'.&mt('Update Parameter Display').'" />'
2243: .'<input type="hidden" name="hideparmsel" value="hidden" />'
1.486 www 2244: .'</p>');
1.459 bisitz 2245: }
1.478 amueller 2246:
1.486 www 2247: # ----- End Parameter Selection
1.57 albertel 2248:
1.459 bisitz 2249: # Display Messages
2250: $r->print('<div>'.$message.'</div>');
1.210 www 2251:
1.57 albertel 2252:
2253: my @temp_pscat;
2254: map {
2255: my $cat = $_;
2256: push(@temp_pscat, map { $_.'.'.$cat } @psprt);
2257: } @pscat;
2258:
2259: @pscat = @temp_pscat;
2260:
1.209 www 2261: if (($env{'form.prevvisit'}) || ($pschp) || ($pssymb)) {
1.10 www 2262: # ----------------------------------------------------------------- Start Table
1.57 albertel 2263: my @catmarker=map { tr|.|_|; 'parameter_'.$_; } @pscat;
1.190 albertel 2264: my $csuname=$env{'user.name'};
2265: my $csudom=$env{'user.domain'};
1.57 albertel 2266:
1.203 www 2267: if ($parmlev eq 'full') {
1.473 amueller 2268: my $coursespan=$csec?8:5;
2269: my $userspan=3;
2270: if ($cgroup ne '') {
2271: $coursespan += 3;
2272: }
2273:
2274: $r->print('<p><table border="2">');
2275: $r->print('<tr><td colspan="5"></td>');
2276: $r->print('<th colspan="'.($coursespan).'">'.&mt('Any User').'</th>');
2277: if ($uname) {
2278: if (@usersgroups > 1) {
2279: $userspan ++;
2280: }
2281: $r->print('<th colspan="'.$userspan.'" rowspan="2">');
2282: $r->print(&mt("User")." $uname ".&mt('at Domain')." $udom</th>");
2283: }
2284: my %lt=&Apache::lonlocal::texthash(
2285: 'pie' => "Parameter in Effect",
2286: 'csv' => "Current Session Value",
1.472 amueller 2287: 'at' => 'at',
2288: 'rl' => "Resource Level",
1.473 amueller 2289: 'ic' => 'in Course',
2290: 'aut' => "Assessment URL and Title",
2291: 'type' => 'Type',
2292: 'emof' => "Enclosing Map or Folder",
2293: 'part' => 'Part',
1.472 amueller 2294: 'pn' => 'Parameter Name',
1.473 amueller 2295: 'def' => 'default',
2296: 'femof' => 'from Enclosing Map or Folder',
2297: 'gen' => 'general',
2298: 'foremf' => 'for Enclosing Map or Folder',
2299: 'fr' => 'for Resource'
2300: );
2301: $r->print(<<ENDTABLETWO);
1.419 bisitz 2302: <th rowspan="3">$lt{'pie'}</th>
2303: <th rowspan="3">$lt{'csv'}<br />($csuname $lt{'at'} $csudom)</th>
2304: </tr><tr><td colspan="5"></td><th colspan="2">$lt{'ic'}</th><th colspan="2">$lt{'rl'}</th>
2305: <th colspan="1">$lt{'ic'}</th>
1.182 albertel 2306:
1.10 www 2307: ENDTABLETWO
1.473 amueller 2308: if ($csec) {
2309: $r->print('<th colspan="3">'.
2310: &mt("in Section")." $csec</th>");
2311: }
2312: if ($cgroup) {
1.419 bisitz 2313: $r->print('<th colspan="3">'.
1.472 amueller 2314: &mt("in Group")." $cgroup</th>");
1.473 amueller 2315: }
2316: $r->print(<<ENDTABLEHEADFOUR);
1.133 www 2317: </tr><tr><th>$lt{'aut'}</th><th>$lt{'type'}</th>
2318: <th>$lt{'emof'}</th><th>$lt{'part'}</th><th>$lt{'pn'}</th>
1.192 albertel 2319: <th>$lt{'gen'}</th><th>$lt{'foremf'}</th>
2320: <th>$lt{'def'}</th><th>$lt{'femof'}</th><th>$lt{'fr'}</th>
1.10 www 2321: ENDTABLEHEADFOUR
1.57 albertel 2322:
1.473 amueller 2323: if ($csec) {
2324: $r->print('<th>'.&mt('general').'</th><th>'.&mt('for Enclosing Map or Folder').'</th><th>'.&mt('for Resource').'</th>');
2325: }
2326:
2327: if ($cgroup) {
2328: $r->print('<th>'.&mt('general').'</th><th>'.&mt('for Enclosing Map or Folder').'</th><th>'.&mt('for Resource').'</th>');
2329: }
2330:
2331: if ($uname) {
2332: if (@usersgroups > 1) {
2333: $r->print('<th>'.&mt('Control by other group?').'</th>');
2334: }
2335: $r->print('<th>'.&mt('general').'</th><th>'.&mt('for Enclosing Map or Folder').'</th><th>'.&mt('for Resource').'</th>');
2336: }
2337:
2338: $r->print('</tr>');
2339:
2340: my $defbgone='';
2341: my $defbgtwo='';
2342: my $defbgthree = '';
1.57 albertel 2343:
1.473 amueller 2344: foreach (@ids) {
1.57 albertel 2345:
1.473 amueller 2346: my $rid=$_;
1.57 albertel 2347: my ($inmapid)=($rid=~/\.(\d+)$/);
2348:
1.446 bisitz 2349: if ((!$pssymb &&
1.473 amueller 2350: (($pschp eq 'all') || ($allmaps{$pschp} eq $mapp{$rid})))
2351: ||
2352: ($pssymb && $pssymb eq $symbp{$rid})) {
1.4 www 2353: # ------------------------------------------------------ Entry for one resource
1.473 amueller 2354: if ($defbgone eq '#E0E099') {
2355: $defbgone='#E0E0DD';
1.57 albertel 2356: } else {
1.419 bisitz 2357: $defbgone='#E0E099';
1.57 albertel 2358: }
1.419 bisitz 2359: if ($defbgtwo eq '#FFFF99') {
1.473 amueller 2360: $defbgtwo='#FFFFDD';
1.57 albertel 2361: } else {
1.473 amueller 2362: $defbgtwo='#FFFF99';
1.57 albertel 2363: }
1.419 bisitz 2364: if ($defbgthree eq '#FFBB99') {
2365: $defbgthree='#FFBBDD';
1.269 raeburn 2366: } else {
1.419 bisitz 2367: $defbgthree='#FFBB99';
1.269 raeburn 2368: }
2369:
1.57 albertel 2370: my $thistitle='';
2371: my %name= ();
2372: undef %name;
2373: my %part= ();
2374: my %display=();
2375: my %type= ();
2376: my %default=();
1.196 www 2377: my $uri=&Apache::lonnet::declutter($uris{$rid});
1.57 albertel 2378:
1.210 www 2379: foreach (&keysplit($keyp{$rid})) {
1.57 albertel 2380: my $tempkeyp = $_;
2381: if (grep $_ eq $tempkeyp, @catmarker) {
2382: $part{$_}=&Apache::lonnet::metadata($uri,$_.'.part');
2383: $name{$_}=&Apache::lonnet::metadata($uri,$_.'.name');
1.433 raeburn 2384: my $parmdis=&Apache::lonnet::metadata($uri,$_.'.display');
2385: if ($allparms{$name{$_}} ne '') {
2386: my $identifier;
2387: if ($parmdis =~ /(\s*\[Part.*)$/) {
2388: $identifier = $1;
2389: }
2390: $display{$_} = $allparms{$name{$_}}.$identifier;
2391: } else {
2392: $display{$_} = $parmdis;
2393: }
1.57 albertel 2394: unless ($display{$_}) { $display{$_}=''; }
2395: $display{$_}.=' ('.$name{$_}.')';
2396: $default{$_}=&Apache::lonnet::metadata($uri,$_);
2397: $type{$_}=&Apache::lonnet::metadata($uri,$_.'.type');
2398: $thistitle=&Apache::lonnet::metadata($uri,$_.'.title');
2399: }
2400: }
2401: my $totalparms=scalar keys %name;
2402: if ($totalparms>0) {
1.473 amueller 2403: my $firstrow=1;
2404: my $title=&Apache::lonnet::gettitle($symbp{$rid});
1.419 bisitz 2405: $r->print('<tr><td style="background-color:'.$defbgone.';"'.
1.57 albertel 2406: ' rowspan='.$totalparms.
1.419 bisitz 2407: '><tt><font size="-1">'.
1.57 albertel 2408: join(' / ',split(/\//,$uri)).
2409: '</font></tt><p><b>'.
1.154 albertel 2410: "<a href=\"javascript:openWindow('".
1.473 amueller 2411: &Apache::lonnet::clutter($uri).'?symb='.
2412: &escape($symbp{$rid}).
1.336 albertel 2413: "', 'metadatafile', '450', '500', 'no', 'yes');\"".
2414: " target=\"_self\">$title");
1.57 albertel 2415:
2416: if ($thistitle) {
1.473 amueller 2417: $r->print(' ('.$thistitle.')');
1.57 albertel 2418: }
2419: $r->print('</a></b></td>');
1.419 bisitz 2420: $r->print('<td style="background-color:'.$defbgtwo.';"'.
1.57 albertel 2421: ' rowspan='.$totalparms.'>'.$typep{$rid}.
2422: '</td>');
2423:
1.419 bisitz 2424: $r->print('<td style="background-color:'.$defbgone.';"'.
1.57 albertel 2425: ' rowspan='.$totalparms.
1.238 www 2426: '>'.$maptitles{$mapp{$rid}}.'</td>');
1.57 albertel 2427:
1.236 albertel 2428: foreach (&keysinorder_bytype(\%name,\%keyorder)) {
1.57 albertel 2429: unless ($firstrow) {
2430: $r->print('<tr>');
2431: } else {
2432: undef $firstrow;
2433: }
1.201 www 2434: &print_row($r,$_,\%part,\%name,\%symbp,$rid,\%default,
1.57 albertel 2435: \%type,\%display,$defbgone,$defbgtwo,
1.269 raeburn 2436: $defbgthree,$parmlev,$uname,$udom,$csec,
1.275 raeburn 2437: $cgroup,\@usersgroups);
1.57 albertel 2438: }
2439: }
2440: }
2441: } # end foreach ids
1.43 albertel 2442: # -------------------------------------------------- End entry for one resource
1.57 albertel 2443: $r->print('</table>');
1.203 www 2444: } # end of full
1.57 albertel 2445: #--------------------------------------------------- Entry for parm level map
2446: if ($parmlev eq 'map') {
1.419 bisitz 2447: my $defbgone = '#E0E099';
2448: my $defbgtwo = '#FFFF99';
2449: my $defbgthree = '#FFBB99';
1.57 albertel 2450:
2451: my %maplist;
2452:
2453: if ($pschp eq 'all') {
1.446 bisitz 2454: %maplist = %allmaps;
1.57 albertel 2455: } else {
2456: %maplist = ($pschp => $mapp{$pschp});
2457: }
2458:
2459: #-------------------------------------------- for each map, gather information
2460: my $mapid;
1.473 amueller 2461: foreach $mapid (sort {$maplist{$a} cmp $maplist{$b}} keys %maplist) {
1.60 albertel 2462: my $maptitle = $maplist{$mapid};
1.57 albertel 2463:
2464: #----------------------- loop through ids and get all parameter types for map
2465: #----------------------------------------- and associated information
2466: my %name = ();
2467: my %part = ();
2468: my %display = ();
2469: my %type = ();
2470: my %default = ();
2471: my $map = 0;
2472:
1.473 amueller 2473: # $r->print("Catmarker: @catmarker<br />\n");
1.446 bisitz 2474:
1.57 albertel 2475: foreach (@ids) {
1.473 amueller 2476: ($map)=(/([\d]*?)\./);
2477: my $rid = $_;
1.446 bisitz 2478:
1.57 albertel 2479: # $r->print("$mapid:$map: $rid <br /> \n");
2480:
1.473 amueller 2481: if ($map eq $mapid) {
2482: my $uri=&Apache::lonnet::declutter($uris{$rid});
1.57 albertel 2483: # $r->print("Keys: $keyp{$rid} <br />\n");
2484:
2485: #--------------------------------------------------------------------
2486: # @catmarker contains list of all possible parameters including part #s
2487: # $fullkeyp contains the full part/id # for the extraction of proper parameters
2488: # $tempkeyp contains part 0 only (no ids - ie, subparts)
2489: # When storing information, store as part 0
2490: # When requesting information, request from full part
2491: #-------------------------------------------------------------------
1.473 amueller 2492: foreach (&keysplit($keyp{$rid})) {
2493: my $tempkeyp = $_;
2494: my $fullkeyp = $tempkeyp;
2495: $tempkeyp =~ s/_\w+_/_0_/;
2496:
2497: if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {
2498: $part{$tempkeyp}="0";
2499: $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name');
2500: my $parmdis=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');
2501: if ($allparms{$name{$tempkeyp}} ne '') {
2502: my $identifier;
2503: if ($parmdis =~ /(\s*\[Part.*)$/) {
2504: $identifier = $1;
2505: }
2506: $display{$tempkeyp} = $allparms{$name{$tempkeyp}}.$identifier;
2507: } else {
2508: $display{$tempkeyp} = $parmdis;
2509: }
2510: unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; }
2511: $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')';
2512: $display{$tempkeyp} =~ s/_\w+_/_0_/;
2513: $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp);
2514: $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.type');
2515: }
2516: } # end loop through keys
2517: }
1.57 albertel 2518: } # end loop through ids
1.446 bisitz 2519:
1.57 albertel 2520: #---------------------------------------------------- print header information
1.133 www 2521: my $foldermap=&mt($maptitle=~/^uploaded/?'Folder':'Map');
1.82 www 2522: my $showtitle=$maptitles{$maptitle}.($maptitle!~/^uploaded/?' ['.$maptitle.']':'');
1.401 bisitz 2523: my $tmp="";
1.57 albertel 2524: if ($uname) {
1.473 amueller 2525: my $person=&Apache::loncommon::plainname($uname,$udom);
1.401 bisitz 2526: $tmp.=&mt("User")." <font color=\"red\"><i>$uname \($person\) </i></font> ".
2527: &mt('in')." \n";
1.57 albertel 2528: } else {
1.401 bisitz 2529: $tmp.="<font color=\"red\"><i>".&mt('all').'</i></font> '.&mt('users in')." \n";
1.57 albertel 2530: }
1.269 raeburn 2531: if ($cgroup) {
1.401 bisitz 2532: $tmp.=&mt("Group")." <font color=\"red\"><i>$cgroup".
2533: "</i></font> ".&mt('of')." \n";
1.269 raeburn 2534: $csec = '';
2535: } elsif ($csec) {
1.401 bisitz 2536: $tmp.=&mt("Section")." <font color=\"red\"><i>$csec".
2537: "</i></font> ".&mt('of')." \n";
1.269 raeburn 2538: }
1.401 bisitz 2539: $r->print('<div align="center"><h4>'
2540: .&mt('Set Defaults for All Resources in [_1]Specifically for [_2][_3]'
1.404 bisitz 2541: ,$foldermap.'<br /><font color="red"><i>'.$showtitle.'</i></font><br />'
1.401 bisitz 2542: ,$tmp
2543: ,'<font color="red"><i>'.$coursename.'</i></font>'
2544: )
2545: ."<br /></h4>\n"
1.422 bisitz 2546: );
1.57 albertel 2547: #---------------------------------------------------------------- print table
1.419 bisitz 2548: $r->print('<p>'.&Apache::loncommon::start_data_table()
2549: .&Apache::loncommon::start_data_table_header_row()
2550: .'<th>'.&mt('Parameter Name').'</th>'
2551: .'<th>'.&mt('Default Value').'</th>'
2552: .'<th>'.&mt('Parameter in Effect').'</th>'
2553: .&Apache::loncommon::end_data_table_header_row()
2554: );
1.57 albertel 2555:
1.473 amueller 2556: foreach (&keysinorder(\%name,\%keyorder)) {
2557: $r->print(&Apache::loncommon::start_data_table_row());
1.201 www 2558: &print_row($r,$_,\%part,\%name,\%symbp,$mapid,\%default,
1.269 raeburn 2559: \%type,\%display,$defbgone,$defbgtwo,$defbgthree,
2560: $parmlev,$uname,$udom,$csec,$cgroup);
1.57 albertel 2561: }
1.422 bisitz 2562: $r->print(&Apache::loncommon::end_data_table().'</p>'
2563: .'</div>'
2564: );
1.57 albertel 2565: } # end each map
2566: } # end of $parmlev eq map
2567: #--------------------------------- Entry for parm level general (Course level)
2568: if ($parmlev eq 'general') {
1.473 amueller 2569: my $defbgone = '#E0E099';
1.419 bisitz 2570: my $defbgtwo = '#FFFF99';
2571: my $defbgthree = '#FFBB99';
1.57 albertel 2572:
2573: #-------------------------------------------- for each map, gather information
2574: my $mapid="0.0";
2575: #----------------------- loop through ids and get all parameter types for map
2576: #----------------------------------------- and associated information
2577: my %name = ();
2578: my %part = ();
2579: my %display = ();
2580: my %type = ();
2581: my %default = ();
1.446 bisitz 2582:
1.57 albertel 2583: foreach (@ids) {
2584: my $rid = $_;
1.446 bisitz 2585:
1.196 www 2586: my $uri=&Apache::lonnet::declutter($uris{$rid});
1.57 albertel 2587:
2588: #--------------------------------------------------------------------
2589: # @catmarker contains list of all possible parameters including part #s
2590: # $fullkeyp contains the full part/id # for the extraction of proper parameters
2591: # $tempkeyp contains part 0 only (no ids - ie, subparts)
2592: # When storing information, store as part 0
2593: # When requesting information, request from full part
2594: #-------------------------------------------------------------------
1.473 amueller 2595: foreach (&keysplit($keyp{$rid})) {
2596: my $tempkeyp = $_;
2597: my $fullkeyp = $tempkeyp;
2598: $tempkeyp =~ s/_\w+_/_0_/;
2599: if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {
2600: $part{$tempkeyp}="0";
2601: $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name');
2602: my $parmdis=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');
2603: if ($allparms{$name{$tempkeyp}} ne '') {
2604: my $identifier;
2605: if ($parmdis =~ /(\s*\[Part.*)$/) {
2606: $identifier = $1;
2607: }
2608: $display{$tempkeyp} = $allparms{$name{$tempkeyp}}.$identifier;
2609: } else {
2610: $display{$tempkeyp} = $parmdis;
2611: }
2612: unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; }
2613: $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')';
2614: $display{$tempkeyp} =~ s/_\w+_/_0_/;
2615: $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp);
2616: $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.type');
2617: }
1.57 albertel 2618: } # end loop through keys
2619: } # end loop through ids
1.446 bisitz 2620:
1.57 albertel 2621: #---------------------------------------------------- print header information
1.473 amueller 2622: my $setdef=&mt("Set Defaults for All Resources in Course");
1.57 albertel 2623: $r->print(<<ENDMAPONE);
1.419 bisitz 2624: <center>
2625: <h4>$setdef
1.135 albertel 2626: <font color="red"><i>$coursename</i></font><br />
1.57 albertel 2627: ENDMAPONE
2628: if ($uname) {
1.473 amueller 2629: my $person=&Apache::loncommon::plainname($uname,$udom);
1.135 albertel 2630: $r->print(" ".&mt("User")."<font color=\"red\"> <i>$uname \($person\) </i></font> \n");
1.57 albertel 2631: } else {
1.135 albertel 2632: $r->print("<i><font color=\"red\"> ".&mt("ALL")."</i> ".&mt("USERS")."</font> \n");
1.57 albertel 2633: }
1.446 bisitz 2634:
1.135 albertel 2635: if ($csec) {$r->print(&mt("Section")."<font color=\"red\"> <i>$csec</i></font>\n")};
1.306 albertel 2636: if ($cgroup) {$r->print(&mt("Group")."<font color=\"red\"> <i>$cgroup</i></font>\n")};
1.135 albertel 2637: $r->print("</h4>\n");
1.57 albertel 2638: #---------------------------------------------------------------- print table
1.419 bisitz 2639: $r->print('<p>'.&Apache::loncommon::start_data_table()
2640: .&Apache::loncommon::start_data_table_header_row()
2641: .'<th>'.&mt('Parameter Name').'</th>'
2642: .'<th>'.&mt('Default Value').'</th>'
2643: .'<th>'.&mt('Parameter in Effect').'</th>'
2644: .&Apache::loncommon::end_data_table_header_row()
2645: );
1.57 albertel 2646:
1.473 amueller 2647: foreach (&keysinorder(\%name,\%keyorder)) {
1.419 bisitz 2648: $r->print(&Apache::loncommon::start_data_table_row());
1.201 www 2649: &print_row($r,$_,\%part,\%name,\%symbp,$mapid,\%default,
1.269 raeburn 2650: \%type,\%display,$defbgone,$defbgtwo,$defbgthree,
2651: $parmlev,$uname,$udom,$csec,$cgroup);
1.57 albertel 2652: }
1.419 bisitz 2653: $r->print(&Apache::loncommon::end_data_table()
2654: .'</p>'
2655: .'</center>'
2656: );
1.57 albertel 2657: } # end of $parmlev eq general
1.43 albertel 2658: }
1.280 albertel 2659: $r->print('</form>'.&Apache::loncommon::end_page());
1.57 albertel 2660: } # end sub assessparms
1.30 www 2661:
1.120 www 2662: ##################################################
1.207 www 2663: # Overview mode
2664: ##################################################
1.124 www 2665: my $tableopen;
2666:
2667: sub tablestart {
2668: if ($tableopen) {
1.473 amueller 2669: return '';
1.124 www 2670: } else {
1.473 amueller 2671: $tableopen=1;
2672: return &Apache::loncommon::start_data_table().'<tr><th>'.&mt('Parameter').'</th><th>'.
2673: &mt('Delete').'</th><th>'.&mt('Set to ...').'</th></tr>';
1.124 www 2674: }
2675: }
2676:
2677: sub tableend {
2678: if ($tableopen) {
1.473 amueller 2679: $tableopen=0;
2680: return &Apache::loncommon::end_data_table();
1.124 www 2681: } else {
1.473 amueller 2682: return'';
1.124 www 2683: }
2684: }
2685:
1.207 www 2686: sub readdata {
2687: my ($crs,$dom)=@_;
2688: # Read coursedata
2689: my $resourcedata=&Apache::lonnet::get_courseresdata($crs,$dom);
2690: # Read userdata
2691:
2692: my $classlist=&Apache::loncoursedata::get_classlist();
2693: foreach (keys %$classlist) {
1.350 albertel 2694: if ($_=~/^($match_username)\:($match_domain)$/) {
1.473 amueller 2695: my ($tuname,$tudom)=($1,$2);
2696: my $useropt=&Apache::lonnet::get_userresdata($tuname,$tudom);
1.207 www 2697: foreach my $userkey (keys %{$useropt}) {
1.473 amueller 2698: if ($userkey=~/^$env{'request.course.id'}/) {
1.207 www 2699: my $newkey=$userkey;
1.473 amueller 2700: $newkey=~s/^($env{'request.course.id'}\.)/$1\[useropt\:$tuname\:$tudom\]\./;
2701: $$resourcedata{$newkey}=$$useropt{$userkey};
2702: }
2703: }
2704: }
1.207 www 2705: }
2706: return $resourcedata;
2707: }
2708:
2709:
1.124 www 2710: # Setting
1.208 www 2711:
2712: sub storedata {
2713: my ($r,$crs,$dom)=@_;
1.207 www 2714: # Set userlevel immediately
2715: # Do an intermediate store of course level
2716: my $olddata=&readdata($crs,$dom);
1.124 www 2717: my %newdata=();
2718: undef %newdata;
2719: my @deldata=();
2720: undef @deldata;
1.190 albertel 2721: foreach (keys %env) {
1.473 amueller 2722: if ($_=~/^form\.([a-z]+)\_(.+)$/) {
2723: my $cmd=$1;
2724: my $thiskey=$2;
2725: my ($tuname,$tudom)=&extractuser($thiskey);
2726: my $tkey=$thiskey;
2727: if ($tuname) {
2728: $tkey=~s/\.\[useropt\:$tuname\:$tudom\]\./\./;
2729: }
2730: if ($cmd eq 'set' || $cmd eq 'datepointer' || $cmd eq 'dateinterval') {
2731: my ($data, $typeof, $text);
2732: if ($cmd eq 'set') {
2733: $data=$env{$_};
2734: $typeof=$env{'form.typeof_'.$thiskey};
2735: $text = &mt('Saved modified parameter for');
2736: } elsif ($cmd eq 'datepointer') {
2737: $data=&Apache::lonhtmlcommon::get_date_from_form($env{$_});
2738: $typeof=$env{'form.typeof_'.$thiskey};
2739: $text = &mt('Saved modified date for');
2740: } elsif ($cmd eq 'dateinterval') {
2741: $data=&get_date_interval_from_form($thiskey);
2742: $typeof=$env{'form.typeof_'.$thiskey};
2743: $text = &mt('Saved modified date for');
2744: }
2745: if (defined($data) and $$olddata{$thiskey} ne $data) {
1.207 www 2746: if ($tuname) {
1.473 amueller 2747: if (&Apache::lonnet::put('resourcedata',{$tkey=>$data,
2748: $tkey.'.type' => $typeof},
2749: $tudom,$tuname) eq 'ok') {
2750: &log_parmset({$tkey=>$data,$tkey.'.type' => $typeof},0,$tuname,$tudom);
2751: $r->print('<br />'.$text.' '.
2752: &Apache::loncommon::plainname($tuname,$tudom));
2753: } else {
2754: $r->print('<div class="LC_error">'.
2755: &mt('Error saving parameters').'</div>');
2756: }
2757: &Apache::lonnet::devalidateuserresdata($tuname,$tudom);
2758: } else {
2759: $newdata{$thiskey}=$data;
2760: $newdata{$thiskey.'.type'}=$typeof;
1.446 bisitz 2761: }
1.473 amueller 2762: }
2763: } elsif ($cmd eq 'del') {
2764: if ($tuname) {
2765: if (&Apache::lonnet::del('resourcedata',[$tkey],$tudom,$tuname) eq 'ok') {
2766: &log_parmset({$tkey=>''},1,$tuname,$tudom);
2767: $r->print('<br />'.&mt('Deleted parameter for').' '.&Apache::loncommon::plainname($tuname,$tudom));
2768: } else {
2769: $r->print('<div class="LC_error">'.
2770: &mt('Error deleting parameters').'</div>');
2771: }
2772: &Apache::lonnet::devalidateuserresdata($tuname,$tudom);
2773: } else {
2774: push (@deldata,$thiskey,$thiskey.'.type');
2775: }
2776: }
2777: }
1.124 www 2778: }
1.207 www 2779: # Store all course level
1.144 www 2780: my $delentries=$#deldata+1;
2781: my @newdatakeys=keys %newdata;
2782: my $putentries=$#newdatakeys+1;
2783: if ($delentries) {
1.473 amueller 2784: if (&Apache::lonnet::del('resourcedata',\@deldata,$dom,$crs) eq 'ok') {
2785: my %loghash=map { $_ => '' } @deldata;
2786: &log_parmset(\%loghash,1);
2787: $r->print('<h2>'.&mt('Deleted [_1] parameter(s)</h2>',$delentries));
2788: } else {
2789: $r->print('<div class="LC_error">'.
2790: &mt('Error deleting parameters').'</div>');
2791: }
2792: &Apache::lonnet::devalidatecourseresdata($crs,$dom);
1.144 www 2793: }
2794: if ($putentries) {
1.473 amueller 2795: if (&Apache::lonnet::put('resourcedata',\%newdata,$dom,$crs) eq 'ok') {
2796: &log_parmset(\%newdata,0);
2797: $r->print('<h3>'.&mt('Saved [_1] parameter(s)',$putentries/2).'</h3>');
2798: } else {
2799: $r->print('<div class="LC_error">'.
2800: &mt('Error saving parameters').'</div>');
2801: }
2802: &Apache::lonnet::devalidatecourseresdata($crs,$dom);
1.144 www 2803: }
1.208 www 2804: }
1.207 www 2805:
1.208 www 2806: sub extractuser {
2807: my $key=shift;
1.350 albertel 2808: return ($key=~/^$env{'request.course.id'}.\[useropt\:($match_username)\:($match_domain)\]\./);
1.208 www 2809: }
1.206 www 2810:
1.381 albertel 2811: sub parse_listdata_key {
2812: my ($key,$listdata) = @_;
2813: # split into student/section affected, and
2814: # the realm (folder/resource part and parameter
1.446 bisitz 2815: my ($student,$realm) =
1.473 amueller 2816: ($key=~/^\Q$env{'request.course.id'}\E\.\[([^\.]+)\]\.(.+)$/);
1.381 albertel 2817: # if course wide student would be undefined
2818: if (!defined($student)) {
1.473 amueller 2819: ($realm)=($key=~/^\Q$env{'request.course.id'}\E\.(.+)$/);
1.381 albertel 2820: }
2821: # strip off the .type if it's not the Question type parameter
2822: if ($realm=~/\.type$/ && !exists($listdata->{$key.'.type'})) {
1.473 amueller 2823: $realm=~s/\.type//;
1.381 albertel 2824: }
2825: # split into resource+part and parameter name
1.388 albertel 2826: my ($res, $parm) = ($realm=~/^(.*)\.(.*)$/);
2827: ($res, my $part) = ($res =~/^(.*)\.(.*)$/);
1.381 albertel 2828: return ($student,$res,$part,$parm);
2829: }
2830:
1.208 www 2831: sub listdata {
1.214 www 2832: my ($r,$resourcedata,$listdata,$sortorder)=@_;
1.207 www 2833: # Start list output
1.206 www 2834:
1.122 www 2835: my $oldsection='';
2836: my $oldrealm='';
2837: my $oldpart='';
1.123 www 2838: my $pointer=0;
1.124 www 2839: $tableopen=0;
1.145 www 2840: my $foundkeys=0;
1.248 albertel 2841: my %keyorder=&standardkeyorder();
1.381 albertel 2842:
1.214 www 2843: foreach my $thiskey (sort {
1.473 amueller 2844: my ($astudent,$ares,$apart,$aparm) = &parse_listdata_key($a,$listdata);
2845: my ($bstudent,$bres,$bpart,$bparm) = &parse_listdata_key($b,$listdata);
1.381 albertel 2846:
1.473 amueller 2847: # get the numerical order for the param
2848: $aparm=$keyorder{'parameter_0_'.$aparm};
2849: $bparm=$keyorder{'parameter_0_'.$bparm};
1.381 albertel 2850:
1.473 amueller 2851: my $result=0;
1.381 albertel 2852:
1.473 amueller 2853: if ($sortorder eq 'realmstudent') {
1.381 albertel 2854: if ($ares ne $bres ) {
1.473 amueller 2855: $result = ($ares cmp $bres);
1.446 bisitz 2856: } elsif ($astudent ne $bstudent) {
1.473 amueller 2857: $result = ($astudent cmp $bstudent);
2858: } elsif ($apart ne $bpart ) {
2859: $result = ($apart cmp $bpart);
2860: }
2861: } else {
2862: if ($astudent ne $bstudent) {
2863: $result = ($astudent cmp $bstudent);
2864: } elsif ($ares ne $bres ) {
2865: $result = ($ares cmp $bres);
2866: } elsif ($apart ne $bpart ) {
2867: $result = ($apart cmp $bpart);
2868: }
2869: }
1.446 bisitz 2870:
1.473 amueller 2871: if (!$result) {
1.381 albertel 2872: if (defined($aparm) && defined($bparm)) {
1.473 amueller 2873: $result = ($aparm <=> $bparm);
1.381 albertel 2874: } elsif (defined($aparm)) {
1.473 amueller 2875: $result = -1;
1.381 albertel 2876: } elsif (defined($bparm)) {
1.473 amueller 2877: $result = 1;
2878: }
2879: }
1.381 albertel 2880:
1.473 amueller 2881: $result;
1.214 www 2882: } keys %{$listdata}) {
1.381 albertel 2883:
1.473 amueller 2884: if ($$listdata{$thiskey.'.type'}) {
1.211 www 2885: my $thistype=$$listdata{$thiskey.'.type'};
2886: if ($$resourcedata{$thiskey.'.type'}) {
1.473 amueller 2887: $thistype=$$resourcedata{$thiskey.'.type'};
2888: }
2889: my ($middle,$part,$name)=
2890: ($thiskey=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);
2891: my $section=&mt('All Students');
2892: if ($middle=~/^\[(.*)\]/) {
2893: my $issection=$1;
2894: if ($issection=~/^useropt\:($match_username)\:($match_domain)/) {
2895: $section=&mt('User').": ".&Apache::loncommon::plainname($1,$2);
2896: } else {
2897: $section=&mt('Group/Section').': '.$issection;
2898: }
2899: $middle=~s/^\[(.*)\]//;
2900: }
2901: $middle=~s/\.+$//;
2902: $middle=~s/^\.+//;
2903: my $realm='<span class="LC_parm_scope_all">'.&mt('All Resources').'</span>';
2904: if ($middle=~/^(.+)\_\_\_\(all\)$/) {
2905: $realm='<span class="LC_parm_scope_folder">'.&mt('Folder/Map').': '.&Apache::lonnet::gettitle($1).' <br /><span class="LC_parm_folder">('.$1.')</span></span>';
2906: } elsif ($middle) {
2907: my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle);
2908: $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>';
2909: }
2910: if ($sortorder eq 'realmstudent') {
2911: if ($realm ne $oldrealm) {
2912: $r->print(&tableend()."\n<hr /><h1>$realm</h1>");
2913: $oldrealm=$realm;
2914: $oldsection='';
2915: }
2916: if ($section ne $oldsection) {
2917: $r->print(&tableend()."\n<h2>$section</h2>");
2918: $oldsection=$section;
2919: $oldpart='';
2920: }
2921: } else {
2922: if ($section ne $oldsection) {
2923: $r->print(&tableend()."\n<hr /><h1>$section</h1>");
2924: $oldsection=$section;
2925: $oldrealm='';
2926: }
2927: if ($realm ne $oldrealm) {
2928: $r->print(&tableend()."\n<h2>$realm</h2>");
2929: $oldrealm=$realm;
2930: $oldpart='';
2931: }
2932: }
2933: if ($part ne $oldpart) {
2934: $r->print(&tableend().
2935: "\n".'<span class="LC_parm_part">'.&mt('Part').": $part</span>");
2936: $oldpart=$part;
2937: }
1.123 www 2938: #
2939: # Ready to print
2940: #
1.470 raeburn 2941: my $parmitem = &standard_parameter_names($name);
1.473 amueller 2942: $r->print(&tablestart().
2943: &Apache::loncommon::start_data_table_row().
2944: '<td><b>'.&mt($parmitem).
2945: '</b></td><td><input type="checkbox" name="del_'.
2946: $thiskey.'" /></td><td>');
2947: $foundkeys++;
2948: if (&isdateparm($thistype)) {
2949: my $jskey='key_'.$pointer;
2950: $pointer++;
2951: $r->print(
2952: &Apache::lonhtmlcommon::date_setter('parmform',
2953: $jskey,
2954: $$resourcedata{$thiskey},
2955: '',1,'','').
1.277 www 2956: '<input type="hidden" name="datepointer_'.$thiskey.'" value="'.$jskey.'" />'.
1.413 bisitz 2957: (($$resourcedata{$thiskey}!=0)?'<span class="LC_nobreak"><a href="/adm/parmset?&action=dateshift1&timebase='.$$resourcedata{$thiskey}.'">'.
2958: &mt('Shift all dates based on this date').'</a></span>':'').
1.277 www 2959: &date_sanity_info($$resourcedata{$thiskey})
1.473 amueller 2960: );
2961: } elsif ($thistype eq 'date_interval') {
2962: $r->print(&date_interval_selector($thiskey,
2963: $$resourcedata{$thiskey}));
2964: } elsif ($thistype =~ m/^string/) {
2965: $r->print(&string_selector($thistype,$thiskey,
2966: $$resourcedata{$thiskey}));
2967: } else {
2968: $r->print(&default_selector($thiskey,$$resourcedata{$thiskey}));
2969: }
2970: $r->print('<input type="hidden" name="typeof_'.$thiskey.'" value="'.
2971: $thistype.'" />');
2972: $r->print('</td>'.&Apache::loncommon::end_data_table_row());
2973: }
1.121 www 2974: }
1.208 www 2975: return $foundkeys;
2976: }
2977:
1.385 albertel 2978:
2979: sub date_interval_selector {
2980: my ($thiskey, $showval) = @_;
2981: my $result;
2982: foreach my $which (['days', 86400, 31],
1.473 amueller 2983: ['hours', 3600, 23],
2984: ['minutes', 60, 59],
2985: ['seconds', 1, 59]) {
2986: my ($name, $factor, $max) = @{ $which };
2987: my $amount = int($showval/$factor);
2988: $showval %= $factor;
2989: my %select = ((map {$_ => $_} (0..$max)),
2990: 'select_form_order' => [0..$max]);
2991: $result .= &Apache::loncommon::select_form($amount,$name.'_'.$thiskey,
1.496 ! raeburn 2992: \%select);
1.473 amueller 2993: $result .= ' '.&mt($name);
1.385 albertel 2994: }
2995: $result .= '<input type="hidden" name="dateinterval_'.$thiskey.'" />';
2996: return $result;
2997:
2998: }
2999:
3000: sub get_date_interval_from_form {
3001: my ($key) = @_;
3002: my $seconds = 0;
3003: foreach my $which (['days', 86400],
1.473 amueller 3004: ['hours', 3600],
3005: ['minutes', 60],
3006: ['seconds', 1]) {
3007: my ($name, $factor) = @{ $which };
3008: if (defined($env{'form.'.$name.'_'.$key})) {
3009: $seconds += $env{'form.'.$name.'_'.$key} * $factor;
3010: }
1.385 albertel 3011: }
3012: return $seconds;
3013: }
3014:
3015:
1.383 albertel 3016: sub default_selector {
3017: my ($thiskey, $showval) = @_;
1.385 albertel 3018: return '<input type="text" name="set_'.$thiskey.'" value="'.$showval.'" />';
1.383 albertel 3019: }
3020:
1.446 bisitz 3021: my %strings =
1.383 albertel 3022: (
3023: 'string_yesno'
3024: => [[ 'yes', 'Yes' ],
1.473 amueller 3025: [ 'no', 'No' ]],
1.383 albertel 3026: 'string_problemstatus'
3027: => [[ 'yes', 'Yes' ],
1.473 amueller 3028: [ 'answer', 'Yes, and show correct answer if they exceed the maximum number of tries.' ],
3029: [ 'no', 'No, don\'t show correct/incorrect feedback.' ],
3030: [ 'no_feedback_ever', 'No, show no feedback at all.' ]],
1.383 albertel 3031: );
3032:
3033:
3034: sub string_selector {
3035: my ($thistype, $thiskey, $showval) = @_;
1.446 bisitz 3036:
1.383 albertel 3037: if (!exists($strings{$thistype})) {
1.473 amueller 3038: return &default_selector($thiskey,$showval);
1.383 albertel 3039: }
3040:
3041: my $result;
3042: foreach my $possibilities (@{ $strings{$thistype} }) {
1.473 amueller 3043: my ($name, $description) = @{ $possibilities };
3044: $result .= '<label><input type="radio" name="set_'.$thiskey.
3045: '" value="'.$name.'"';
3046: if ($showval eq $name) {
3047: $result .= ' checked="checked"';
3048: }
3049: $result .= ' />'.&mt($description).'</label> ';
1.383 albertel 3050: }
3051: return $result;
3052: }
3053:
1.389 www 3054: #
3055: # Shift all start and end dates by $shift
3056: #
3057:
3058: sub dateshift {
3059: my ($shift)=@_;
3060: my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
3061: my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
3062: my %data=&Apache::lonnet::dump('resourcedata',$dom,$crs);
3063: # ugly retro fix for broken version of types
3064: foreach my $key (keys %data) {
3065: if ($key=~/\wtype$/) {
3066: my $newkey=$key;
3067: $newkey=~s/type$/\.type/;
3068: $data{$newkey}=$data{$key};
3069: delete $data{$key};
3070: }
3071: }
1.391 www 3072: my %storecontent=();
1.389 www 3073: # go through all parameters and look for dates
3074: foreach my $key (keys %data) {
3075: if ($data{$key.'.type'}=~/^date_(start|end)$/) {
3076: my $newdate=$data{$key}+$shift;
1.391 www 3077: $storecontent{$key}=$newdate;
1.389 www 3078: }
3079: }
1.391 www 3080: my $reply=&Apache::lonnet::cput
3081: ('resourcedata',\%storecontent,$dom,$crs);
3082: if ($reply eq 'ok') {
3083: &log_parmset(\%storecontent);
3084: }
3085: &Apache::lonnet::devalidatecourseresdata($crs,$dom);
3086: return $reply;
1.389 www 3087: }
3088:
1.208 www 3089: sub newoverview {
1.280 albertel 3090: my ($r) = @_;
3091:
1.208 www 3092: my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
3093: my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.414 droeschl 3094: &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview',
1.473 amueller 3095: text=>"Overview Mode"});
1.280 albertel 3096: my $start_page = &Apache::loncommon::start_page('Set Parameters');
1.298 albertel 3097: my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Overview');
1.208 www 3098: $r->print(<<ENDOVER);
1.280 albertel 3099: $start_page
1.208 www 3100: $breadcrumbs
1.232 albertel 3101: <form method="post" action="/adm/parmset?action=newoverview" name="parmform">
1.208 www 3102: ENDOVER
1.211 www 3103: my @ids=();
3104: my %typep=();
3105: my %keyp=();
3106: my %allparms=();
3107: my %allparts=();
3108: my %allmaps=();
3109: my %mapp=();
3110: my %symbp=();
3111: my %maptitles=();
3112: my %uris=();
3113: my %keyorder=&standardkeyorder();
3114: my %defkeytype=();
3115:
3116: my %alllevs=();
3117: $alllevs{'Resource Level'}='full';
1.215 www 3118: $alllevs{'Map/Folder Level'}='map';
1.211 www 3119: $alllevs{'Course Level'}='general';
3120:
3121: my $csec=$env{'form.csec'};
1.269 raeburn 3122: my $cgroup=$env{'form.cgroup'};
1.211 www 3123:
3124: my @pscat=&Apache::loncommon::get_env_multiple('form.pscat');
3125: my $pschp=$env{'form.pschp'};
3126: my @psprt=&Apache::loncommon::get_env_multiple('form.psprt');
3127: if (!@psprt) { $psprt[0]='0'; }
3128:
1.446 bisitz 3129: my @selected_sections =
1.473 amueller 3130: &Apache::loncommon::get_env_multiple('form.Section');
1.211 www 3131: @selected_sections = ('all') if (! @selected_sections);
1.374 albertel 3132: foreach my $sec (@selected_sections) {
3133: if ($sec eq 'all') {
1.211 www 3134: @selected_sections = ('all');
3135: }
3136: }
1.269 raeburn 3137: my @selected_groups =
3138: &Apache::loncommon::get_env_multiple('form.Group');
1.211 www 3139:
3140: my $pssymb='';
3141: my $parmlev='';
1.446 bisitz 3142:
1.211 www 3143: unless ($env{'form.parmlev'}) {
3144: $parmlev = 'map';
3145: } else {
3146: $parmlev = $env{'form.parmlev'};
3147: }
3148:
1.446 bisitz 3149: &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps,
1.473 amueller 3150: \%mapp, \%symbp,\%maptitles,\%uris,
3151: \%keyorder,\%defkeytype);
1.211 www 3152:
1.374 albertel 3153: if (grep {$_ eq 'all'} (@psprt)) {
1.481 amueller 3154: @psprt = keys(%allparts);
1.374 albertel 3155: }
1.211 www 3156: # Menu to select levels, etc
3157:
1.456 bisitz 3158: $r->print('<div class="LC_Box">');
1.445 neumanie 3159: #$r->print('<h2 class="LC_hcell">Step 1</h2>');
1.452 bisitz 3160: $r->print('<div>');
1.445 neumanie 3161: $r->print(&Apache::lonhtmlcommon::start_pick_box());
1.211 www 3162: &levelmenu($r,\%alllevs,$parmlev);
3163: if ($parmlev ne 'general') {
1.447 bisitz 3164: $r->print(&Apache::lonhtmlcommon::row_closure());
1.483 amueller 3165: &mapmenu($r,\%allmaps,$pschp,\%maptitles,\%symbp);
1.211 www 3166: }
1.447 bisitz 3167: $r->print(&Apache::lonhtmlcommon::row_closure(1));
1.445 neumanie 3168: $r->print(&Apache::lonhtmlcommon::end_pick_box());
3169: $r->print('</div></div>');
1.446 bisitz 3170:
1.456 bisitz 3171: $r->print('<div class="LC_Box">');
1.452 bisitz 3172: $r->print('<div>');
1.446 bisitz 3173: $r->print(&Apache::lonhtmlcommon::start_pick_box());
1.445 neumanie 3174: &parmmenu($r,\%allparms,\@pscat,\%keyorder);
1.453 schualex 3175: $r->print(&Apache::lonhtmlcommon::end_pick_box());
3176: &parmboxes($r,\%allparms,\@pscat,\%keyorder);
3177: $r->print(&Apache::lonhtmlcommon::start_pick_box());
1.446 bisitz 3178: $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parts to View')));
1.481 amueller 3179: $r->print('<table>'.
1.317 albertel 3180: '<tr><th>'.&mt('Parts').'</th><th>'.&mt('Section(s)').
3181: '</th><th>'.&mt('Group(s)').'</th></tr><tr><td>');
1.211 www 3182: &partmenu($r,\%allparts,\@psprt);
1.317 albertel 3183: $r->print('</td><td>');
1.211 www 3184: §ionmenu($r,\@selected_sections);
1.317 albertel 3185: $r->print('</td><td>');
1.269 raeburn 3186: &groupmenu($r,\@selected_groups);
3187: $r->print('</td></tr></table>');
1.445 neumanie 3188: #$r->print('</td></tr></table>');
1.447 bisitz 3189: $r->print(&Apache::lonhtmlcommon::row_closure(1));
1.445 neumanie 3190: $r->print(&Apache::lonhtmlcommon::end_pick_box());
3191: $r->print('</div></div>');
3192:
1.456 bisitz 3193: $r->print('<div class="LC_Box">');
1.452 bisitz 3194: $r->print('<div>');
1.214 www 3195: my $sortorder=$env{'form.sortorder'};
3196: unless ($sortorder) { $sortorder='realmstudent'; }
3197: &sortmenu($r,$sortorder);
1.445 neumanie 3198: $r->print('</div></div>');
1.446 bisitz 3199:
1.214 www 3200: $r->print('<p><input type="submit" name="dis" value="'.&mt('Display').'" /></p>');
1.446 bisitz 3201:
1.211 www 3202: # Build the list data hash from the specified parms
3203:
3204: my $listdata;
3205: %{$listdata}=();
3206:
3207: foreach my $cat (@pscat) {
1.269 raeburn 3208: &secgroup_lister($cat,$pschp,$parmlev,$listdata,\@psprt,\@selected_sections,\%defkeytype,\%allmaps,\@ids,\%symbp);
3209: &secgroup_lister($cat,$pschp,$parmlev,$listdata,\@psprt,\@selected_groups,\%defkeytype,\%allmaps,\@ids,\%symbp);
1.211 www 3210: }
3211:
1.212 www 3212: if (($env{'form.store'}) || ($env{'form.dis'})) {
1.211 www 3213:
1.481 amueller 3214: if ($env{'form.store'}) { &storedata($r,$crs,$dom); }
1.211 www 3215:
3216: # Read modified data
3217:
1.481 amueller 3218: my $resourcedata=&readdata($crs,$dom);
1.211 www 3219:
3220: # List data
3221:
1.481 amueller 3222: &listdata($r,$resourcedata,$listdata,$sortorder);
1.211 www 3223: }
3224: $r->print(&tableend().
1.473 amueller 3225: ((($env{'form.store'}) || ($env{'form.dis'}))?'<p><input type="submit" name="store" value="'.&mt('Save').'" /></p>':'').
3226: '</form>'.&Apache::loncommon::end_page());
1.208 www 3227: }
3228:
1.269 raeburn 3229: sub secgroup_lister {
3230: my ($cat,$pschp,$parmlev,$listdata,$psprt,$selections,$defkeytype,$allmaps,$ids,$symbp) = @_;
3231: foreach my $item (@{$selections}) {
3232: foreach my $part (@{$psprt}) {
3233: my $rootparmkey=$env{'request.course.id'};
3234: if (($item ne 'all') && ($item ne 'none') && ($item)) {
3235: $rootparmkey.='.['.$item.']';
3236: }
3237: if ($parmlev eq 'general') {
3238: # course-level parameter
3239: my $newparmkey=$rootparmkey.'.'.$part.'.'.$cat;
3240: $$listdata{$newparmkey}=1;
3241: $$listdata{$newparmkey.'.type'}=$$defkeytype{$cat};
3242: } elsif ($parmlev eq 'map') {
3243: # map-level parameter
3244: foreach my $mapid (keys %{$allmaps}) {
3245: if (($pschp ne 'all') && ($pschp ne $mapid)) { next; }
3246: my $newparmkey=$rootparmkey.'.'.$$allmaps{$mapid}.'___(all).'.$part.'.'.$cat;
3247: $$listdata{$newparmkey}=1;
3248: $$listdata{$newparmkey.'.type'}=$$defkeytype{$cat};
3249: }
3250: } else {
3251: # resource-level parameter
3252: foreach my $rid (@{$ids}) {
3253: my ($map,$resid,$url)=&Apache::lonnet::decode_symb($$symbp{$rid});
3254: if (($pschp ne 'all') && ($$allmaps{$pschp} ne $map)) { next; }
3255: my $newparmkey=$rootparmkey.'.'.$$symbp{$rid}.'.'.$part.'.'.$cat;
3256: $$listdata{$newparmkey}=1;
3257: $$listdata{$newparmkey.'.type'}=$$defkeytype{$cat};
3258: }
3259: }
3260: }
3261: }
3262: }
3263:
1.208 www 3264: sub overview {
1.280 albertel 3265: my ($r) = @_;
1.208 www 3266: my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
3267: my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.280 albertel 3268:
1.414 droeschl 3269: &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview',
1.473 amueller 3270: text=>"Overview Mode"});
1.280 albertel 3271: my $start_page=&Apache::loncommon::start_page('Modify Parameters');
1.298 albertel 3272: my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Overview');
1.208 www 3273: $r->print(<<ENDOVER);
1.280 albertel 3274: $start_page
1.208 www 3275: $breadcrumbs
1.232 albertel 3276: <form method="post" action="/adm/parmset?action=setoverview" name="parmform">
1.208 www 3277: ENDOVER
3278: # Store modified
3279:
3280: &storedata($r,$crs,$dom);
3281:
3282: # Read modified data
3283:
3284: my $resourcedata=&readdata($crs,$dom);
3285:
1.214 www 3286:
3287: my $sortorder=$env{'form.sortorder'};
3288: unless ($sortorder) { $sortorder='realmstudent'; }
3289: &sortmenu($r,$sortorder);
3290:
1.208 www 3291: # List data
3292:
1.214 www 3293: my $foundkeys=&listdata($r,$resourcedata,$resourcedata,$sortorder);
1.208 www 3294:
1.145 www 3295: $r->print(&tableend().'<p>'.
1.473 amueller 3296: ($foundkeys?'<input type="submit" value="'.&mt('Save').'" />':&mt('There are no parameters.')).'</p></form>'.
3297: &Apache::loncommon::end_page());
1.120 www 3298: }
1.121 www 3299:
1.333 albertel 3300: sub clean_parameters {
3301: my ($r) = @_;
3302: my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
3303: my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
3304:
1.414 droeschl 3305: &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=cleanparameters',
1.473 amueller 3306: text=>"Clean Parameters"});
1.333 albertel 3307: my $start_page=&Apache::loncommon::start_page('Clean Parameters');
3308: my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Clean');
3309: $r->print(<<ENDOVER);
3310: $start_page
3311: $breadcrumbs
3312: <form method="post" action="/adm/parmset?action=cleanparameters" name="parmform">
3313: ENDOVER
3314: # Store modified
3315:
3316: &storedata($r,$crs,$dom);
3317:
3318: # Read modified data
3319:
3320: my $resourcedata=&readdata($crs,$dom);
3321:
3322: # List data
3323:
3324: $r->print('<h3>'.
1.473 amueller 3325: &mt('These parameters refer to resources that do not exist.').
3326: '</h3>'.
3327: '<input type="submit" value="'.&mt('Delete Selected').'" />'.'<br />'.
3328: '<br />');
1.333 albertel 3329: $r->print(&Apache::loncommon::start_data_table().
1.473 amueller 3330: '<tr>'.
3331: '<th>'.&mt('Delete').'</th>'.
3332: '<th>'.&mt('Parameter').'</th>'.
3333: '</tr>');
1.333 albertel 3334: foreach my $thiskey (sort(keys(%{$resourcedata}))) {
1.473 amueller 3335: next if (!exists($resourcedata->{$thiskey.'.type'})
3336: && $thiskey=~/\.type$/);
3337: my %data = &parse_key($thiskey);
3338: if (1) { #exists($data{'realm_exists'})
3339: #&& !$data{'realm_exists'}) {
3340: $r->print(&Apache::loncommon::start_data_table_row().
3341: '<tr>'.
3342: '<td><input type="checkbox" name="del_'.$thiskey.'" /></td>' );
3343:
3344: $r->print('<td>');
3345: my $display_value = $resourcedata->{$thiskey};
3346: if (&isdateparm($resourcedata->{$thiskey.'.type'})) {
3347: $display_value =
3348: &Apache::lonlocal::locallocaltime($display_value);
3349: }
1.470 raeburn 3350: my $parmitem = &standard_parameter_names($data{'parameter_name'});
3351: $parmitem = &mt($parmitem);
1.473 amueller 3352: $r->print(&mt('Parameter: "[_1]" with value: "[_2]"',
3353: $parmitem,$resourcedata->{$thiskey}));
3354: $r->print('<br />');
3355: if ($data{'scope_type'} eq 'all') {
3356: $r->print(&mt('All users'));
3357: } elsif ($data{'scope_type'} eq 'user') {
3358: $r->print(&mt('User: [_1]',join(':',@{$data{'scope'}})));
3359: } elsif ($data{'scope_type'} eq 'section') {
3360: $r->print(&mt('Section: [_1]',$data{'scope'}));
3361: } elsif ($data{'scope_type'} eq 'group') {
3362: $r->print(&mt('Group: [_1]',$data{'scope'}));
3363: }
3364: $r->print('<br />');
3365: if ($data{'realm_type'} eq 'all') {
3366: $r->print(&mt('All Resources'));
3367: } elsif ($data{'realm_type'} eq 'folder') {
3368: $r->print(&mt('Folder: [_1]'),$data{'realm'});
3369: } elsif ($data{'realm_type'} eq 'symb') {
3370: my ($map,$resid,$url) =
3371: &Apache::lonnet::decode_symb($data{'realm'});
3372: $r->print(&mt('Resource: [_1] <br /> with ID: [_2] <br /> in folder [_3]',
3373: $url,$resid,$map));
3374: }
3375: $r->print(' <br /> '.&mt('Part: [_1]',$data{'parameter_part'}));
3376: $r->print('</td></tr>');
1.446 bisitz 3377:
1.473 amueller 3378: }
1.333 albertel 3379: }
3380: $r->print(&Apache::loncommon::end_data_table().'<p>'.
1.473 amueller 3381: '<input type="submit" value="'.&mt('Delete Selected').'" />'.
3382: '</p></form>'.
3383: &Apache::loncommon::end_page());
1.333 albertel 3384: }
3385:
1.390 www 3386: sub date_shift_one {
3387: my ($r) = @_;
3388: my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
3389: my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
3390:
1.414 droeschl 3391: &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=dateshift1&timebase='.$env{'form.timebase'},
1.473 amueller 3392: text=>"Shifting Dates"});
1.390 www 3393: my $start_page=&Apache::loncommon::start_page('Shift Dates');
3394: my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Shift');
3395: $r->print(<<ENDOVER);
3396: $start_page
3397: $breadcrumbs
3398: ENDOVER
3399: $r->print('<form name="shiftform" method="post">'.
3400: '<table><tr><td>'.&mt('Currently set date:').'</td><td>'.
3401: &Apache::lonlocal::locallocaltime($env{'form.timebase'}).'</td></tr>'.
3402: '<tr><td>'.&mt('Shifted date:').'</td><td>'.
3403: &Apache::lonhtmlcommon::date_setter('shiftform',
3404: 'timeshifted',
3405: $env{'form.timebase'},,
3406: '').
3407: '</td></tr></table>'.
3408: '<input type="hidden" name="action" value="dateshift2" />'.
3409: '<input type="hidden" name="timebase" value="'.$env{'form.timebase'}.'" />'.
3410: '<input type="submit" value="'.&mt('Shift all dates accordingly').'" /></form>');
3411: $r->print(&Apache::loncommon::end_page());
3412: }
3413:
3414: sub date_shift_two {
3415: my ($r) = @_;
3416: my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
3417: my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.414 droeschl 3418: &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=dateshift1&timebase='.$env{'form.timebase'},
1.473 amueller 3419: text=>"Shifting Dates"});
1.390 www 3420: my $start_page=&Apache::loncommon::start_page('Shift Dates');
3421: my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Shift');
3422: $r->print(<<ENDOVER);
3423: $start_page
3424: $breadcrumbs
3425: ENDOVER
3426: my $timeshifted=&Apache::lonhtmlcommon::get_date_from_form('timeshifted');
3427: $r->print(&mt('Shifting all dates such that [_1] becomes [_2]',
3428: &Apache::lonlocal::locallocaltime($env{'form.timebase'}),
3429: &Apache::lonlocal::locallocaltime($timeshifted)));
3430: my $delta=$timeshifted-$env{'form.timebase'};
3431: &dateshift($delta);
3432: $r->print(&Apache::loncommon::end_page());
3433: }
3434:
1.333 albertel 3435: sub parse_key {
3436: my ($key) = @_;
3437: my %data;
3438: my ($middle,$part,$name)=
1.473 amueller 3439: ($key=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);
1.333 albertel 3440: $data{'scope_type'} = 'all';
3441: if ($middle=~/^\[(.*)\]/) {
1.473 amueller 3442: $data{'scope'} = $1;
3443: if ($data{'scope'}=~/^useropt\:($match_username)\:($match_domain)/) {
3444: $data{'scope_type'} = 'user';
3445: $data{'scope'} = [$1,$2];
3446: } else {
3447: #FIXME check for group scope
3448: $data{'scope_type'} = 'section';
3449: }
3450: $middle=~s/^\[(.*)\]//;
1.333 albertel 3451: }
3452: $middle=~s/\.+$//;
3453: $middle=~s/^\.+//;
3454: $data{'realm_type'}='all';
3455: if ($middle=~/^(.+)\_\_\_\(all\)$/) {
1.473 amueller 3456: $data{'realm'} = $1;
3457: $data{'realm_type'} = 'folder';
3458: $data{'realm_title'} = &Apache::lonnet::gettitle($data{'realm'});
3459: ($data{'realm_exists'}) = &Apache::lonnet::is_on_map($data{'realm'});
1.333 albertel 3460: } elsif ($middle) {
1.473 amueller 3461: $data{'realm'} = $middle;
3462: $data{'realm_type'} = 'symb';
3463: $data{'realm_title'} = &Apache::lonnet::gettitle($data{'realm'});
3464: my ($map,$resid,$url) = &Apache::lonnet::decode_symb($data{'realm'});
3465: $data{'realm_exists'} = &Apache::lonnet::symbverify($data{'realm'},$url);
1.333 albertel 3466: }
1.446 bisitz 3467:
1.333 albertel 3468: $data{'parameter_part'} = $part;
3469: $data{'parameter_name'} = $name;
3470:
3471: return %data;
3472: }
3473:
1.239 raeburn 3474:
1.416 jms 3475: sub header {
3476: return &Apache::loncommon::start_page('Parameter Manager');
3477: }
1.193 albertel 3478:
3479:
3480:
3481: sub print_main_menu {
3482: my ($r,$parm_permission)=@_;
3483: #
1.414 droeschl 3484: $r->print(&header());
3485: $r->print(&Apache::lonhtmlcommon::breadcrumbs('Parameter Manager'));
1.193 albertel 3486: $r->print(<<ENDMAINFORMHEAD);
3487: <form method="post" enctype="multipart/form-data"
3488: action="/adm/parmset" name="studentform">
3489: ENDMAINFORMHEAD
3490: #
1.195 albertel 3491: my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
3492: my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
1.268 albertel 3493: my $vgr = &Apache::lonnet::allowed('vgr',$env{'request.course.id'});
1.366 albertel 3494: my $mgr = &Apache::lonnet::allowed('mgr',$env{'request.course.id'});
1.268 albertel 3495:
1.477 raeburn 3496: my $crstype = &Apache::loncommon::course_type();
3497: my $lc_crstype = lc($crstype);
1.417 droeschl 3498:
1.193 albertel 3499: my @menu =
1.477 raeburn 3500: ( { categorytitle=>"Settings for this $crstype",
1.473 amueller 3501: items => [
3502: { linktext => 'Portfolio Metadata',
3503: url => '/adm/parmset?action=setrestrictmeta',
3504: permission => $parm_permission,
1.477 raeburn 3505: linktitle => "Restrict metadata for this $lc_crstype." ,
1.473 amueller 3506: icon =>'contact-new.png' ,
3507: },
3508: { linktext => 'Reset Student Access Times',
3509: url => '/adm/helper/resettimes.helper',
3510: permission => $mgr,
1.477 raeburn 3511: linktitle => "Reset access times for folders/maps, resources or the $lc_crstype." ,
1.473 amueller 3512: icon => 'start-here.png' ,
3513: },
3514:
3515: { linktext => 'Set Parameter Setting Default Actions',
3516: url => '/adm/parmset?action=setdefaults',
3517: permission => $parm_permission,
3518: linktitle =>'Set default actions for parameters.' ,
3519: icon => 'folder-new.png' ,
3520: }]},
3521: { categorytitle => 'New and Existing Parameter Settings for Resources',
3522: items => [
3523: { linktext => 'Edit Resource Parameters - Helper Mode',
3524: url => '/adm/helper/parameter.helper',
3525: permission => $parm_permission,
3526: linktitle =>'Set/Modify resource parameters in helper mode.' ,
3527: icon => 'dialog-information.png' ,
3528: #help => 'Parameter_Helper',
3529: },
3530: { linktext => 'Edit Resource Parameters - Overview Mode',
3531: url => '/adm/parmset?action=newoverview',
3532: permission => $parm_permission,
3533: linktitle =>'Set/Modify resource parameters in overview mode.' ,
3534: icon => 'edit-find.png' ,
3535: #help => 'Parameter_Overview',
3536: },
3537: { linktext => 'Edit Resource Parameters - Table Mode',
3538: url => '/adm/parmset?action=settable',
3539: permission => $parm_permission,
3540: linktitle =>'Set/Modify resource parameters in table mode.' ,
3541: icon => 'edit-copy.png' ,
3542: #help => 'Table_Mode',
3543: }]},
1.417 droeschl 3544: { categorytitle => 'Existing Parameter Settings for Resources',
1.473 amueller 3545: items => [
3546: { linktext => 'Modify Resource Parameters - Overview Mode',
3547: url => '/adm/parmset?action=setoverview',
3548: permission => $parm_permission,
3549: linktitle =>'Set/Modify existing resource parameters in overview mode.' ,
3550: icon => 'preferences-desktop-wallpaper.png' ,
3551: #help => 'Parameter_Overview',
3552: },
3553: { linktext => 'Change Log',
3554: url => '/adm/parmset?action=parameterchangelog',
3555: permission => $parm_permission,
1.477 raeburn 3556: linktitle =>"View parameter and $lc_crstype blog posting/user notification change log." ,
1.487 wenzelju 3557: icon => 'document-properties.png',
1.473 amueller 3558: }]}
1.193 albertel 3559: );
1.414 droeschl 3560: $r->print(&Apache::lonhtmlcommon::generate_menu(@menu));
1.193 albertel 3561: return;
3562: }
1.414 droeschl 3563:
1.416 jms 3564:
3565:
1.252 banghart 3566: sub output_row {
1.347 banghart 3567: my ($r, $field_name, $field_text, $added_flag) = @_;
1.252 banghart 3568: my $output;
1.263 banghart 3569: my $options=$env{'course.'.$env{'request.course.id'}.'.metadata.'.$field_name.'.options'};
3570: my $values=$env{'course.'.$env{'request.course.id'}.'.metadata.'.$field_name.'.values'};
1.337 banghart 3571: if (!defined($options)) {
1.254 banghart 3572: $options = 'active,stuadd';
1.261 banghart 3573: $values = '';
1.252 banghart 3574: }
1.337 banghart 3575: if (!($options =~ /deleted/)) {
3576: my @options= ( ['active', 'Show to student'],
1.418 schafran 3577: ['stuadd', 'Provide text area for students to type metadata'],
1.351 banghart 3578: ['choices','Provide choices for students to select from']);
1.473 amueller 3579: # ['onlyone','Student may select only one choice']);
1.337 banghart 3580: if ($added_flag) {
3581: push @options,['deleted', 'Delete Metadata Field'];
3582: }
1.351 banghart 3583: $output = &Apache::loncommon::start_data_table_row();
1.451 bisitz 3584: $output .= '<td><strong>'.$field_text.':</strong></td>';
1.351 banghart 3585: $output .= &Apache::loncommon::end_data_table_row();
1.337 banghart 3586: foreach my $opt (@options) {
1.473 amueller 3587: my $checked = ($options =~ m/$opt->[0]/) ? ' checked="checked" ' : '' ;
3588: $output .= &Apache::loncommon::continue_data_table_row();
3589: $output .= '<td>'.(' ' x 5).'<label>
3590: <input type="checkbox" name="'.
3591: $field_name.'_'.$opt->[0].'" value="yes"'.$checked.' />'.
3592: &mt($opt->[1]).'</label></td>';
3593: $output .= &Apache::loncommon::end_data_table_row();
3594: }
1.351 banghart 3595: $output .= &Apache::loncommon::continue_data_table_row();
1.451 bisitz 3596: $output .= '<td>'.(' ' x 10).'<input name="'.$field_name.'_values" type="text" value="'.$values.'" size="80" /></td>';
1.351 banghart 3597: $output .= &Apache::loncommon::end_data_table_row();
3598: my $multiple_checked;
3599: my $single_checked;
3600: if ($options =~ m/onlyone/) {
1.422 bisitz 3601: $multiple_checked = '';
1.423 bisitz 3602: $single_checked = ' checked="checked"';
1.351 banghart 3603: } else {
1.423 bisitz 3604: $multiple_checked = ' checked="checked"';
1.422 bisitz 3605: $single_checked = '';
1.351 banghart 3606: }
1.473 amueller 3607: $output .= &Apache::loncommon::continue_data_table_row();
3608: $output .= '<td>'.(' ' x 10).'
3609: <input type="radio" name="'.$field_name.'_onlyone" value="multiple"'.$multiple_checked .' />
3610: '.&mt('Student may select multiple choices from list').'</td>';
3611: $output .= &Apache::loncommon::end_data_table_row();
3612: $output .= &Apache::loncommon::continue_data_table_row();
3613: $output .= '<td>'.(' ' x 10).'
3614: <input type="radio" name="'.$field_name.'_onlyone" value="single"'.$single_checked.' />
3615: '.&mt('Student may select only one choice from list').'</td>';
3616: $output .= &Apache::loncommon::end_data_table_row();
1.252 banghart 3617: }
3618: return ($output);
3619: }
1.416 jms 3620:
3621:
3622:
1.340 banghart 3623: sub order_meta_fields {
3624: my ($r)=@_;
3625: my $idx = 1;
3626: my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
3627: my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.341 banghart 3628: $r->print(&Apache::loncommon::start_page('Order Metadata Fields'));
1.414 droeschl 3629: &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=addmetadata',
1.473 amueller 3630: text=>"Add Metadata Field"});
1.345 banghart 3631: &Apache::lonhtmlcommon::add_breadcrumb
3632: ({href=>"/adm/parmset?action=setrestrictmeta",
3633: text=>"Restrict Metadata"},
3634: {text=>"Order Metadata"});
3635: $r->print(&Apache::lonhtmlcommon::breadcrumbs('Order Metadata'));
1.340 banghart 3636: if ($env{'form.storeorder'}) {
3637: my $newpos = $env{'form.newpos'} - 1;
3638: my $currentpos = $env{'form.currentpos'} - 1;
3639: my @neworder = ();
3640: my @oldorder = split /,/,$env{'course.'.$env{'request.course.id'}.'.metadata.addedorder'};
3641: my $i;
1.341 banghart 3642: if ($newpos > $currentpos) {
1.340 banghart 3643: # moving stuff up
3644: for ($i=0;$i<$currentpos;$i++) {
1.473 amueller 3645: $neworder[$i]=$oldorder[$i];
1.340 banghart 3646: }
3647: for ($i=$currentpos;$i<$newpos;$i++) {
1.473 amueller 3648: $neworder[$i]=$oldorder[$i+1];
1.340 banghart 3649: }
3650: $neworder[$newpos]=$oldorder[$currentpos];
3651: for ($i=$newpos+1;$i<=$#oldorder;$i++) {
1.473 amueller 3652: $neworder[$i]=$oldorder[$i];
1.340 banghart 3653: }
3654: } else {
3655: # moving stuff down
1.473 amueller 3656: for ($i=0;$i<$newpos;$i++) {
3657: $neworder[$i]=$oldorder[$i];
3658: }
3659: $neworder[$newpos]=$oldorder[$currentpos];
3660: for ($i=$newpos+1;$i<$currentpos+1;$i++) {
3661: $neworder[$i]=$oldorder[$i-1];
3662: }
3663: for ($i=$currentpos+1;$i<=$#oldorder;$i++) {
3664: $neworder[$i]=$oldorder[$i];
3665: }
1.340 banghart 3666: }
1.473 amueller 3667: my $ordered_fields = join ",", @neworder;
1.343 banghart 3668: my $put_result = &Apache::lonnet::put('environment',
1.446 bisitz 3669: {'metadata.addedorder'=>$ordered_fields},$dom,$crs);
1.473 amueller 3670: &Apache::lonnet::appenv({'course.'.$env{'request.course.id'}.'.metadata.addedorder' => $ordered_fields});
1.340 banghart 3671: }
1.357 raeburn 3672: my $fields = &get_added_meta_fieldnames($env{'request.course.id'});
1.341 banghart 3673: my $ordered_fields;
1.340 banghart 3674: my @fields_in_order = split /,/,$env{'course.'.$env{'request.course.id'}.'.metadata.addedorder'};
3675: if (!@fields_in_order) {
3676: # no order found, pick sorted order then create metadata.addedorder key.
3677: foreach my $key (sort keys %$fields) {
3678: push @fields_in_order, $key;
1.341 banghart 3679: $ordered_fields = join ",", @fields_in_order;
1.340 banghart 3680: }
1.341 banghart 3681: my $put_result = &Apache::lonnet::put('environment',
1.446 bisitz 3682: {'metadata.addedorder'=>$ordered_fields},$dom,$crs);
3683: }
1.340 banghart 3684: $r->print('<table>');
3685: my $num_fields = scalar(@fields_in_order);
3686: foreach my $key (@fields_in_order) {
3687: $r->print('<tr><td>');
3688: $r->print('<form method="post" action="">');
3689: $r->print('<select name="newpos" onChange="this.form.submit()">');
3690: for (my $i = 1;$i le $num_fields;$i ++) {
3691: if ($i eq $idx) {
3692: $r->print('<option value="'.$i.'" SELECTED>('.$i.')</option>');
3693: } else {
3694: $r->print('<option value="'.$i.'">'.$i.'</option>');
3695: }
3696: }
3697: $r->print('</select></td><td>');
3698: $r->print('<input type="hidden" name="currentpos" value="'.$idx.'" />');
3699: $r->print('<input type="hidden" name="storeorder" value="true" />');
3700: $r->print('</form>');
3701: $r->print($$fields{$key}.'</td></tr>');
3702: $idx ++;
3703: }
3704: $r->print('</table>');
3705: return 'ok';
3706: }
1.416 jms 3707:
3708:
1.359 banghart 3709: sub continue {
3710: my $output;
3711: $output .= '<form action="" method="post">';
3712: $output .= '<input type="hidden" name="action" value="setrestrictmeta" />';
3713: $output .= '<input type="submit" value="Continue" />';
3714: return ($output);
3715: }
1.416 jms 3716:
3717:
1.334 banghart 3718: sub addmetafield {
3719: my ($r)=@_;
1.414 droeschl 3720: &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=addmetadata',
1.473 amueller 3721: text=>"Add Metadata Field"});
1.334 banghart 3722: $r->print(&Apache::loncommon::start_page('Add Metadata Field'));
3723: $r->print(&Apache::lonhtmlcommon::breadcrumbs('Add Metadata Field'));
1.335 banghart 3724: my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
3725: my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.339 banghart 3726: if (exists($env{'form.undelete'})) {
1.358 banghart 3727: my @meta_fields = &Apache::loncommon::get_env_multiple('form.undeletefield');
1.339 banghart 3728: foreach my $meta_field(@meta_fields) {
3729: my $options = $env{'course.'.$env{'request.course.id'}.'.metadata.'.$meta_field.'.options'};
3730: $options =~ s/deleted//;
3731: $options =~ s/,,/,/;
3732: my $put_result = &Apache::lonnet::put('environment',
3733: {'metadata.'.$meta_field.'.options'=>$options},$dom,$crs);
1.446 bisitz 3734:
1.339 banghart 3735: $r->print('Undeleted Metadata Field <strong>'.$env{'course.'.$env{'request.course.id'}.'.metadata.'.$meta_field.'.added'}."</strong> with result ".$put_result.'<br />');
3736: }
1.359 banghart 3737: $r->print(&continue());
1.339 banghart 3738: } elsif (exists($env{'form.fieldname'})) {
1.335 banghart 3739: my $meta_field = $env{'form.fieldname'};
3740: my $display_field = $env{'form.fieldname'};
3741: $meta_field =~ s/\W/_/g;
1.338 banghart 3742: $meta_field =~ tr/A-Z/a-z/;
1.335 banghart 3743: my $put_result = &Apache::lonnet::put('environment',
3744: {'metadata.'.$meta_field.'.values'=>"",
3745: 'metadata.'.$meta_field.'.added'=>"$display_field",
3746: 'metadata.'.$meta_field.'.options'=>""},$dom,$crs);
1.359 banghart 3747: $r->print('Added new Metadata Field <strong>'.$env{'form.fieldname'}."</strong> with result ".$put_result.'<br />');
3748: $r->print(&continue());
1.335 banghart 3749: } else {
1.357 raeburn 3750: my $fields = &get_deleted_meta_fieldnames($env{'request.course.id'});
1.339 banghart 3751: if ($fields) {
3752: $r->print('You may undelete previously deleted fields.<br />Check those you wish to undelete and click Undelete.<br />');
3753: $r->print('<form method="post" action="">');
3754: foreach my $key(keys(%$fields)) {
1.358 banghart 3755: $r->print('<input type="checkbox" name="undeletefield" value="'.$key.'" />'.$$fields{$key}.'<br /');
1.339 banghart 3756: }
3757: $r->print('<input type="submit" name="undelete" value="Undelete" />');
3758: $r->print('</form>');
3759: }
3760: $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 3761: $r->print('<input type="text" name="fieldname" /><br />');
3762: $r->print('<input type="submit" value="Add Metadata Field" />');
1.334 banghart 3763: }
1.361 albertel 3764: $r->print('</form>');
1.334 banghart 3765: }
1.416 jms 3766:
3767:
3768:
1.259 banghart 3769: sub setrestrictmeta {
1.240 banghart 3770: my ($r)=@_;
1.242 banghart 3771: my $next_meta;
1.244 banghart 3772: my $output;
1.245 banghart 3773: my $item_num;
1.246 banghart 3774: my $put_result;
1.414 droeschl 3775: &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setrestrictmeta',
1.473 amueller 3776: text=>"Restrict Metadata"});
1.280 albertel 3777: $r->print(&Apache::loncommon::start_page('Restrict Metadata'));
1.298 albertel 3778: $r->print(&Apache::lonhtmlcommon::breadcrumbs('Restrict Metadata'));
1.240 banghart 3779: my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
3780: my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.259 banghart 3781: my $key_base = $env{'course.'.$env{'request.course.id'}.'.'};
1.252 banghart 3782: my $save_field = '';
1.259 banghart 3783: if ($env{'form.restrictmeta'}) {
1.254 banghart 3784: foreach my $field (sort(keys(%env))) {
1.252 banghart 3785: if ($field=~m/^form.(.+)_(.+)$/) {
1.254 banghart 3786: my $options;
1.252 banghart 3787: my $meta_field = $1;
3788: my $meta_key = $2;
1.253 banghart 3789: if ($save_field ne $meta_field) {
1.252 banghart 3790: $save_field = $meta_field;
1.473 amueller 3791: if ($env{'form.'.$meta_field.'_stuadd'}) {
3792: $options.='stuadd,';
3793: }
3794: if ($env{'form.'.$meta_field.'_choices'}) {
3795: $options.='choices,';
3796: }
3797: if ($env{'form.'.$meta_field.'_onlyone'} eq 'single') {
3798: $options.='onlyone,';
3799: }
3800: if ($env{'form.'.$meta_field.'_active'}) {
3801: $options.='active,';
3802: }
3803: if ($env{'form.'.$meta_field.'_deleted'}) {
3804: $options.='deleted,';
3805: }
1.259 banghart 3806: my $name = $save_field;
1.253 banghart 3807: $put_result = &Apache::lonnet::put('environment',
1.262 banghart 3808: {'metadata.'.$meta_field.'.options'=>$options,
3809: 'metadata.'.$meta_field.'.values'=>$env{'form.'.$meta_field.'_values'},
1.253 banghart 3810: },$dom,$crs);
1.252 banghart 3811: }
3812: }
3813: }
3814: }
1.296 albertel 3815: &Apache::lonnet::coursedescription($env{'request.course.id'},
1.473 amueller 3816: {'freshen_cache' => 1});
1.335 banghart 3817: # Get the default metadata fields
1.258 albertel 3818: my %metadata_fields = &Apache::lonmeta::fieldnames('portfolio');
1.335 banghart 3819: # Now get possible added metadata fields
1.357 raeburn 3820: my $added_metadata_fields = &get_added_meta_fieldnames($env{'request.course.id'});
1.346 banghart 3821: my $row_alt = 1;
1.347 banghart 3822: $output .= &Apache::loncommon::start_data_table();
1.258 albertel 3823: foreach my $field (sort(keys(%metadata_fields))) {
1.265 banghart 3824: if ($field ne 'courserestricted') {
1.346 banghart 3825: $row_alt = $row_alt ? 0 : 1;
1.473 amueller 3826: $output.= &output_row($r, $field, $metadata_fields{$field});
3827: }
1.255 banghart 3828: }
1.351 banghart 3829: my $buttons = (<<ENDButtons);
3830: <input type="submit" name="restrictmeta" value="Save" />
3831: </form><br />
3832: <form method="post" action="/adm/parmset?action=addmetadata" name="form1">
3833: <input type="submit" name="restrictmeta" value="Add a Metadata Field" />
3834: </form>
3835: <br />
3836: <form method="post" action="/adm/parmset?action=ordermetadata" name="form2">
3837: <input type="submit" name="restrictmeta" value="Order Metadata Fields" />
3838: ENDButtons
1.337 banghart 3839: my $added_flag = 1;
1.335 banghart 3840: foreach my $field (sort(keys(%$added_metadata_fields))) {
1.346 banghart 3841: $row_alt = $row_alt ? 0 : 1;
3842: $output.= &output_row($r, $field, $$added_metadata_fields{$field},$added_flag, $row_alt);
1.335 banghart 3843: }
1.347 banghart 3844: $output .= &Apache::loncommon::end_data_table();
1.446 bisitz 3845: $r->print(<<ENDenv);
1.259 banghart 3846: <form method="post" action="/adm/parmset?action=setrestrictmeta" name="form">
1.244 banghart 3847: $output
1.351 banghart 3848: $buttons
1.340 banghart 3849: </form>
1.244 banghart 3850: ENDenv
1.280 albertel 3851: $r->print(&Apache::loncommon::end_page());
1.240 banghart 3852: return 'ok';
3853: }
1.416 jms 3854:
3855:
3856:
1.335 banghart 3857: sub get_added_meta_fieldnames {
1.357 raeburn 3858: my ($cid) = @_;
1.335 banghart 3859: my %fields;
3860: foreach my $key(%env) {
1.357 raeburn 3861: if ($key =~ m/\Q$cid\E\.metadata\.(.+)\.added$/) {
1.335 banghart 3862: my $field_name = $1;
3863: my ($display_field_name) = $env{$key};
3864: $fields{$field_name} = $display_field_name;
3865: }
3866: }
3867: return \%fields;
3868: }
1.416 jms 3869:
3870:
3871:
1.339 banghart 3872: sub get_deleted_meta_fieldnames {
1.357 raeburn 3873: my ($cid) = @_;
1.339 banghart 3874: my %fields;
3875: foreach my $key(%env) {
1.357 raeburn 3876: if ($key =~ m/\Q$cid\E\.metadata\.(.+)\.added$/) {
1.339 banghart 3877: my $field_name = $1;
3878: if ($env{'course.'.$env{'request.course.id'}.'.metadata.'.$field_name.'.options'} =~ m/deleted/) {
3879: my ($display_field_name) = $env{$key};
3880: $fields{$field_name} = $display_field_name;
3881: }
3882: }
3883: }
3884: return \%fields;
3885: }
1.220 www 3886: sub defaultsetter {
1.280 albertel 3887: my ($r) = @_;
3888:
1.414 droeschl 3889: &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setdefaults',
1.473 amueller 3890: text=>"Set Defaults"});
1.446 bisitz 3891: my $start_page =
1.473 amueller 3892: &Apache::loncommon::start_page('Parameter Setting Default Actions');
1.298 albertel 3893: my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Defaults');
1.220 www 3894: $r->print(<<ENDDEFHEAD);
1.280 albertel 3895: $start_page
1.220 www 3896: $breadcrumbs
3897: <form method="post" action="/adm/parmset?action=setdefaults" name="defaultform">
3898: ENDDEFHEAD
1.280 albertel 3899:
3900: my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
3901: my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.221 www 3902: my @ids=();
3903: my %typep=();
3904: my %keyp=();
3905: my %allparms=();
3906: my %allparts=();
3907: my %allmaps=();
3908: my %mapp=();
3909: my %symbp=();
3910: my %maptitles=();
3911: my %uris=();
3912: my %keyorder=&standardkeyorder();
3913: my %defkeytype=();
3914:
1.446 bisitz 3915: &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps,
1.473 amueller 3916: \%mapp, \%symbp,\%maptitles,\%uris,
3917: \%keyorder,\%defkeytype);
1.224 www 3918: if ($env{'form.storerules'}) {
1.473 amueller 3919: my %newrules=();
3920: my @delrules=();
3921: my %triggers=();
3922: foreach my $key (keys(%env)) {
1.225 albertel 3923: if ($key=~/^form\.(\w+)\_action$/) {
1.473 amueller 3924: my $tempkey=$1;
3925: my $action=$env{$key};
1.226 www 3926: if ($action) {
1.473 amueller 3927: $newrules{$tempkey.'_action'}=$action;
3928: if ($action ne 'default') {
3929: my ($whichaction,$whichparm)=($action=~/^(.*\_)([^\_]+)$/);
3930: $triggers{$whichparm}.=$tempkey.':';
3931: }
3932: $newrules{$tempkey.'_type'}=$defkeytype{$tempkey};
3933: if (&isdateparm($defkeytype{$tempkey})) {
3934: $newrules{$tempkey.'_days'}=$env{'form.'.$tempkey.'_days'};
3935: $newrules{$tempkey.'_hours'}=$env{'form.'.$tempkey.'_hours'};
3936: $newrules{$tempkey.'_min'}=$env{'form.'.$tempkey.'_min'};
3937: $newrules{$tempkey.'_sec'}=$env{'form.'.$tempkey.'_sec'};
3938: } else {
3939: $newrules{$tempkey.'_value'}=$env{'form.'.$tempkey.'_value'};
3940: $newrules{$tempkey.'_triggervalue'}=$env{'form.'.$tempkey.'_triggervalue'};
3941: }
3942: } else {
3943: push(@delrules,$tempkey.'_action');
3944: push(@delrules,$tempkey.'_type');
3945: push(@delrules,$tempkey.'_hours');
3946: push(@delrules,$tempkey.'_min');
3947: push(@delrules,$tempkey.'_sec');
3948: push(@delrules,$tempkey.'_value');
3949: }
3950: }
3951: }
3952: foreach my $key (keys %allparms) {
3953: $newrules{$key.'_triggers'}=$triggers{$key};
3954: }
3955: &Apache::lonnet::put('parmdefactions',\%newrules,$dom,$crs);
3956: &Apache::lonnet::del('parmdefactions',\@delrules,$dom,$crs);
3957: &resetrulescache();
1.224 www 3958: }
1.227 www 3959: my %lt=&Apache::lonlocal::texthash('days' => 'Days',
1.473 amueller 3960: 'hours' => 'Hours',
3961: 'min' => 'Minutes',
3962: 'sec' => 'Seconds',
3963: 'yes' => 'Yes',
3964: 'no' => 'No');
1.222 www 3965: my @standardoptions=('','default');
3966: my @standarddisplay=('',&mt('Default value when manually setting'));
3967: my @dateoptions=('','default');
3968: my @datedisplay=('',&mt('Default value when manually setting'));
3969: foreach my $tempkey (&keysindisplayorder(\%allparms,\%keyorder)) {
1.473 amueller 3970: unless ($tempkey) { next; }
3971: push @standardoptions,'when_setting_'.$tempkey;
3972: push @standarddisplay,&mt('Automatically set when setting ').$tempkey;
3973: if (&isdateparm($defkeytype{$tempkey})) {
3974: push @dateoptions,'later_than_'.$tempkey;
3975: push @datedisplay,&mt('Automatically set later than ').$tempkey;
3976: push @dateoptions,'earlier_than_'.$tempkey;
3977: push @datedisplay,&mt('Automatically set earlier than ').$tempkey;
3978: }
1.222 www 3979: }
1.231 www 3980: $r->print(&mt('Manual setting rules apply to all interfaces.').'<br />'.
1.473 amueller 3981: &mt('Automatic setting rules apply to table mode interfaces only.'));
1.318 albertel 3982: $r->print("\n".&Apache::loncommon::start_data_table().
1.473 amueller 3983: &Apache::loncommon::start_data_table_header_row().
3984: "<th>".&mt('Rule for parameter').'</th><th>'.
3985: &mt('Action').'</th><th>'.&mt('Value').'</th>'.
3986: &Apache::loncommon::end_data_table_header_row());
1.221 www 3987: foreach my $tempkey (&keysindisplayorder(\%allparms,\%keyorder)) {
1.473 amueller 3988: unless ($tempkey) { next; }
3989: $r->print("\n".&Apache::loncommon::start_data_table_row().
3990: "<td>".$allparms{$tempkey}."\n<br />(".$tempkey.')</td><td>');
3991: my $action=&rulescache($tempkey.'_action');
3992: $r->print('<select name="'.$tempkey.'_action">');
3993: if (&isdateparm($defkeytype{$tempkey})) {
3994: for (my $i=0;$i<=$#dateoptions;$i++) {
3995: if ($dateoptions[$i]=~/\_$tempkey$/) { next; }
3996: $r->print("\n<option value='$dateoptions[$i]'".
3997: ($dateoptions[$i] eq $action?' selected="selected"':'').
3998: ">$datedisplay[$i]</option>");
3999: }
4000: } else {
4001: for (my $i=0;$i<=$#standardoptions;$i++) {
4002: if ($standardoptions[$i]=~/\_$tempkey$/) { next; }
4003: $r->print("\n<option value='$standardoptions[$i]'".
4004: ($standardoptions[$i] eq $action?' selected="selected"':'').
4005: ">$standarddisplay[$i]</option>");
4006: }
4007: }
4008: $r->print('</select>');
4009: unless (&isdateparm($defkeytype{$tempkey})) {
4010: $r->print("\n<br />".&mt('Triggering value(s) of other parameter (optional, comma-separated):').
4011: '<input type="text" size="20" name="'.$tempkey.'_triggervalue" value="'.&rulescache($tempkey.'_triggervalue').'" />');
4012: }
4013: $r->print("\n</td><td>\n");
1.222 www 4014:
1.221 www 4015: if (&isdateparm($defkeytype{$tempkey})) {
1.473 amueller 4016: my $days=&rulescache($tempkey.'_days');
4017: my $hours=&rulescache($tempkey.'_hours');
4018: my $min=&rulescache($tempkey.'_min');
4019: my $sec=&rulescache($tempkey.'_sec');
4020: $r->print(<<ENDINPUTDATE);
1.227 www 4021: <input name="$tempkey\_days" type="text" size="4" value="$days" />$lt{'days'}<br />
1.222 www 4022: <input name="$tempkey\_hours" type="text" size="4" value="$hours" />$lt{'hours'}<br />
4023: <input name="$tempkey\_min" type="text" size="4" value="$min" />$lt{'min'}<br />
4024: <input name="$tempkey\_sec" type="text" size="4" value="$sec" />$lt{'sec'}
1.221 www 4025: ENDINPUTDATE
1.473 amueller 4026: } elsif ($defkeytype{$tempkey} eq 'string_yesno') {
1.222 www 4027: my $yeschecked='';
4028: my $nochecked='';
1.444 bisitz 4029: if (&rulescache($tempkey.'_value') eq 'yes') { $yeschecked=' checked="checked"'; }
4030: if (&rulescache($tempkey.'_value') eq 'no') { $nochecked=' checked="checked"'; }
1.222 www 4031:
1.473 amueller 4032: $r->print(<<ENDYESNO);
1.444 bisitz 4033: <label><input type="radio" name="$tempkey\_value" value="yes"$yeschecked /> $lt{'yes'}</label><br />
4034: <label><input type="radio" name="$tempkey\_value" value="no"$nochecked /> $lt{'no'}</label>
1.221 www 4035: ENDYESNO
4036: } else {
1.473 amueller 4037: $r->print('<input type="text" size="20" name="'.$tempkey.'_value" value="'.&rulescache($tempkey.'_value').'" />');
4038: }
1.318 albertel 4039: $r->print('</td>'.&Apache::loncommon::end_data_table_row());
1.221 www 4040: }
1.318 albertel 4041: $r->print(&Apache::loncommon::end_data_table().
1.473 amueller 4042: "\n".'<input type="submit" name="storerules" value="'.
4043: &mt('Save').'" /></form>'."\n".
4044: &Apache::loncommon::end_page());
1.220 www 4045: return;
4046: }
1.193 albertel 4047:
1.290 www 4048: sub components {
1.330 albertel 4049: my ($key,$uname,$udom,$exeuser,$exedomain,$typeflag)=@_;
4050:
4051: if ($typeflag) {
1.473 amueller 4052: $key=~s/\.type$//;
1.290 www 4053: }
1.330 albertel 4054:
4055: my ($middle,$part,$name)=
1.473 amueller 4056: ($key=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);
1.291 www 4057: my $issection;
1.330 albertel 4058:
1.290 www 4059: my $section=&mt('All Students');
4060: if ($middle=~/^\[(.*)\]/) {
1.473 amueller 4061: $issection=$1;
4062: $section=&mt('Group/Section').': '.$issection;
4063: $middle=~s/^\[(.*)\]//;
1.290 www 4064: }
4065: $middle=~s/\.+$//;
4066: $middle=~s/^\.+//;
1.291 www 4067: if ($uname) {
1.473 amueller 4068: $section=&mt('User').": ".&Apache::loncommon::plainname($uname,$udom);
4069: $issection='';
1.291 www 4070: }
1.316 albertel 4071: my $realm='<span class="LC_parm_scope_all">'.&mt('All Resources').'</span>';
1.446 bisitz 4072: my $realmdescription=&mt('all resources');
1.290 www 4073: if ($middle=~/^(.+)\_\_\_\(all\)$/) {
1.473 amueller 4074: $realm='<span class="LC_parm_scope_folder">'.&mt('Folder/Map').': '.&Apache::lonnet::gettitle($1).' <span class="LC_parm_folder"><br />('.$1.')</span></span>';
4075: $realmdescription=&mt('folder').' '.&Apache::lonnet::gettitle($1);
1.304 www 4076: } elsif ($middle) {
1.473 amueller 4077: my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle);
4078: $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>';
4079: $realmdescription=&mt('resource').' '.&Apache::lonnet::gettitle($middle);
1.290 www 4080: }
1.291 www 4081: my $what=$part.'.'.$name;
1.330 albertel 4082: return ($realm,$section,$name,$part,
1.473 amueller 4083: $what,$middle,$uname,$udom,$issection,$realmdescription);
1.290 www 4084: }
1.293 www 4085:
1.328 albertel 4086: my %standard_parms;
1.469 raeburn 4087: my %standard_parms_types;
1.416 jms 4088:
1.328 albertel 4089: sub load_parameter_names {
4090: open(my $config,"<$Apache::lonnet::perlvar{'lonTabDir'}/packages.tab");
4091: while (my $configline=<$config>) {
1.473 amueller 4092: if ($configline !~ /\S/ || $configline=~/^\#/) { next; }
4093: chomp($configline);
4094: my ($short,$plain)=split(/:/,$configline);
4095: my (undef,$name,$type)=split(/\&/,$short,3);
4096: if ($type eq 'display') {
4097: $standard_parms{$name} = $plain;
1.469 raeburn 4098: } elsif ($type eq 'type') {
4099: $standard_parms_types{$name} = $plain;
4100: }
1.328 albertel 4101: }
4102: close($config);
4103: $standard_parms{'int_pos'} = 'Positive Integer';
4104: $standard_parms{'int_zero_pos'} = 'Positive Integer or Zero';
4105: }
4106:
1.292 www 4107: sub standard_parameter_names {
4108: my ($name)=@_;
1.328 albertel 4109: if (!%standard_parms) {
1.473 amueller 4110: &load_parameter_names();
1.328 albertel 4111: }
1.292 www 4112: if ($standard_parms{$name}) {
1.473 amueller 4113: return $standard_parms{$name};
1.446 bisitz 4114: } else {
1.473 amueller 4115: return $name;
1.292 www 4116: }
4117: }
1.290 www 4118:
1.469 raeburn 4119: sub standard_parameter_types {
4120: my ($name)=@_;
4121: if (!%standard_parms_types) {
4122: &load_parameter_names();
4123: }
4124: if ($standard_parms_types{$name}) {
4125: return $standard_parms_types{$name};
4126: }
4127: return;
4128: }
1.309 www 4129:
1.285 albertel 4130: sub parm_change_log {
1.284 www 4131: my ($r)=@_;
1.414 droeschl 4132: &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=settable',
1.473 amueller 4133: text=>"Parameter Change Log"});
1.327 albertel 4134: $r->print(&Apache::loncommon::start_page('Parameter Change Log'));
4135: $r->print(&Apache::lonhtmlcommon::breadcrumbs('Parameter Change Log'));
4136:
1.286 www 4137: my %parmlog=&Apache::lonnet::dump('nohist_parameterlog',
1.473 amueller 4138: $env{'course.'.$env{'request.course.id'}.'.domain'},
4139: $env{'course.'.$env{'request.course.id'}.'.num'});
1.311 albertel 4140:
1.301 www 4141: if ((keys(%parmlog))[0]=~/^error\:/) { undef(%parmlog); }
1.311 albertel 4142:
1.327 albertel 4143: $r->print('<form action="/adm/parmset?action=parameterchangelog"
4144: method="post" name="parameterlog">');
1.446 bisitz 4145:
1.311 albertel 4146: my %saveable_parameters = ('show' => 'scalar',);
4147: &Apache::loncommon::store_course_settings('parameter_log',
4148: \%saveable_parameters);
4149: &Apache::loncommon::restore_course_settings('parameter_log',
4150: \%saveable_parameters);
1.348 www 4151: $r->print(&Apache::loncommon::display_filter().
1.326 www 4152: '<label>'.&Apache::lonhtmlcommon::checkbox('includetypes',$env{'form.includetypes'},'1').
1.473 amueller 4153: ' '.&mt('Include parameter types').'</label>'.
4154: '<input type="submit" value="'.&mt('Display').'" /></form>');
1.301 www 4155:
1.291 www 4156: my $courseopt=&Apache::lonnet::get_courseresdata($env{'course.'.$env{'request.course.id'}.'.num'},
1.473 amueller 4157: $env{'course.'.$env{'request.course.id'}.'.domain'});
1.301 www 4158: $r->print(&Apache::loncommon::start_data_table().&Apache::loncommon::start_data_table_header_row().
1.473 amueller 4159: '<th>'.&mt('Time').'</th><th>'.&mt('User').'</th><th>'.&mt('Extent').'</th><th>'.&mt('Users').'</th><th>'.
4160: &mt('Parameter').'</th><th>'.&mt('Part').'</th><th>'.&mt('New Value').'</th><th>'.&mt('Announce').'</th>'.
4161: &Apache::loncommon::end_data_table_header_row());
1.309 www 4162: my $shown=0;
1.349 www 4163: my $folder='';
4164: if ($env{'form.displayfilter'} eq 'currentfolder') {
1.473 amueller 4165: my $last='';
4166: if (tie(my %hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db',
4167: &GDBM_READER(),0640)) {
4168: $last=$hash{'last_known'};
4169: untie(%hash);
4170: }
4171: if ($last) { ($folder) = &Apache::lonnet::decode_symb($last); }
1.349 www 4172: }
1.446 bisitz 4173: foreach my $id (sort
1.473 amueller 4174: {
4175: if ($parmlog{$b}{'exe_time'} ne $parmlog{$a}{'exe_time'}) {
4176: return $parmlog{$b}{'exe_time'} <=>$parmlog{$a}{'exe_time'}
4177: }
4178: my $aid = (split('00000',$a))[-1];
4179: my $bid = (split('00000',$b))[-1];
4180: return $bid<=>$aid;
4181: } (keys(%parmlog))) {
1.294 www 4182: my @changes=keys(%{$parmlog{$id}{'logentry'}});
1.473 amueller 4183: my $count = 0;
4184: my $time =
4185: &Apache::lonlocal::locallocaltime($parmlog{$id}{'exe_time'});
4186: my $plainname =
4187: &Apache::loncommon::plainname($parmlog{$id}{'exe_uname'},
4188: $parmlog{$id}{'exe_udom'});
4189: my $about_me_link =
4190: &Apache::loncommon::aboutmewrapper($plainname,
4191: $parmlog{$id}{'exe_uname'},
4192: $parmlog{$id}{'exe_udom'});
4193: my $send_msg_link='';
4194: if ((($parmlog{$id}{'exe_uname'} ne $env{'user.name'})
4195: || ($parmlog{$id}{'exe_udom'} ne $env{'user.domain'}))) {
4196: $send_msg_link ='<br />'.
4197: &Apache::loncommon::messagewrapper(&mt('Send message'),
4198: $parmlog{$id}{'exe_uname'},
4199: $parmlog{$id}{'exe_udom'});
4200: }
4201: my $row_start=&Apache::loncommon::start_data_table_row();
4202: my $makenewrow=0;
4203: my %istype=();
4204: my $output;
4205: foreach my $changed (reverse(sort(@changes))) {
1.330 albertel 4206: my $value=$parmlog{$id}{'logentry'}{$changed};
1.473 amueller 4207: my $typeflag = ($changed =~/\.type$/ &&
4208: !exists($parmlog{$id}{'logentry'}{$changed.'.type'}));
1.330 albertel 4209: my ($realm,$section,$parmname,$part,$what,$middle,$uname,$udom,$issection,$realmdescription)=
1.473 amueller 4210: &components($changed,$parmlog{$id}{'uname'},$parmlog{$id}{'udom'},undef,undef,$typeflag);
4211: if ($env{'form.displayfilter'} eq 'currentfolder') {
4212: if ($folder) {
4213: if ($middle!~/^\Q$folder\E/) { next; }
4214: }
4215: }
4216: if ($typeflag) {
4217: $istype{$parmname}=$value;
4218: if (!$env{'form.includetypes'}) { next; }
4219: }
4220: $count++;
4221: if ($makenewrow) {
4222: $output .= $row_start;
4223: } else {
4224: $makenewrow=1;
4225: }
1.470 raeburn 4226: my $parmitem = &standard_parameter_names($parmname);
1.473 amueller 4227: $output .='<td>'.$realm.'</td><td>'.$section.'</td><td>'.
4228: &mt($parmitem).'</td><td>'.
4229: ($part?&mt('Part: [_1]',$part):&mt('All Parts')).'</td><td>';
4230: my $stillactive=0;
4231: if ($parmlog{$id}{'delflag'}) {
4232: $output .= &mt('Deleted');
4233: } else {
4234: if ($typeflag) {
1.470 raeburn 4235: my $parmitem = &standard_parameter_names($value);
4236: $parmitem = &mt($parmitem);
1.473 amueller 4237: $output .= &mt('Type: [_1]',$parmitem);
4238: } else {
4239: my ($level,@all)=&parmval_by_symb($what,$middle,&Apache::lonnet::metadata($middle,$what),
4240: $uname,$udom,$issection,$issection,$courseopt);
1.469 raeburn 4241: my $showvalue = $value;
4242: if ($istype{$parmname} eq '') {
4243: my $type = &standard_parameter_types($parmname);
4244: if ($type ne '') {
4245: if (&isdateparm($type)) {
4246: $showvalue =
4247: &Apache::lonlocal::locallocaltime($value);
4248: }
4249: }
4250: } else {
1.473 amueller 4251: if (&isdateparm($istype{$parmname})) {
4252: $showvalue =
1.469 raeburn 4253: &Apache::lonlocal::locallocaltime($value);
1.473 amueller 4254: }
1.469 raeburn 4255: }
4256: $output .= $showvalue;
1.473 amueller 4257: if ($value ne $all[$level]) {
4258: $output .= '<br /><span class="LC_warning">'.&mt('Not active anymore').'</span>';
4259: } else {
4260: $stillactive=1;
4261: }
4262: }
4263: }
4264: $output .= '</td><td>';
1.470 raeburn 4265:
1.473 amueller 4266: if ($stillactive) {
1.470 raeburn 4267: my $parmitem = &standard_parameter_names($parmname);
4268: $parmitem = &mt($parmitem);
1.473 amueller 4269: my $title=&mt('Changed [_1]',$parmitem);
1.471 raeburn 4270: my $description=&mt('Changed [_1] for [_2] to [_3]',
4271: $parmitem,$realmdescription,
1.473 amueller 4272: (&isdateparm($istype{$parmname})?&Apache::lonlocal::locallocaltime($value):$value));
4273: if (($uname) && ($udom)) {
4274: $output .=
4275: &Apache::loncommon::messagewrapper('Notify User',
4276: $uname,$udom,$title,
4277: $description);
4278: } else {
4279: $output .=
4280: &Apache::lonrss::course_blog_link($id,$title,
4281: $description);
4282: }
4283: }
4284: $output .= '</td>'.&Apache::loncommon::end_data_table_row();
4285: }
1.349 www 4286: if ($env{'form.displayfilter'} eq 'containing') {
1.473 amueller 4287: my $wholeentry=$about_me_link.':'.
4288: $parmlog{$id}{'exe_uname'}.':'.$parmlog{$id}{'exe_udom'}.':'.
4289: $output;
4290: if ($wholeentry!~/\Q$env{'form.containingphrase'}\E/i) { next; }
4291: }
1.349 www 4292: if ($count) {
1.473 amueller 4293: $r->print($row_start.'<td rowspan="'.$count.'">'.$time.'</td>
1.332 albertel 4294: <td rowspan="'.$count.'">'.$about_me_link.
1.473 amueller 4295: '<br /><tt>'.$parmlog{$id}{'exe_uname'}.
4296: ':'.$parmlog{$id}{'exe_udom'}.'</tt>'.
4297: $send_msg_link.'</td>'.$output);
4298: $shown++;
4299: }
4300: if (!($env{'form.show'} eq &mt('all')
4301: || $shown<=$env{'form.show'})) { last; }
1.286 www 4302: }
1.301 www 4303: $r->print(&Apache::loncommon::end_data_table());
1.284 www 4304: $r->print(&Apache::loncommon::end_page());
4305: }
4306:
1.437 raeburn 4307: sub update_slots {
4308: my ($slot_name,$cdom,$cnum,$symb,$uname,$udom) = @_;
4309: my %slot=&Apache::lonnet::get_slot($slot_name);
4310: if (!keys(%slot)) {
4311: return 'error: slot does not exist';
4312: }
4313: my $max=$slot{'maxspace'};
4314: if (!defined($max)) { $max=99999; }
4315:
4316: my %consumed=&Apache::lonnet::dump('slot_reservations',$cdom,$cnum,
4317: "^$slot_name\0");
4318: my ($tmp)=%consumed;
4319: if ($tmp=~/^error: 2 / ) {
4320: return 'error: unable to determine current slot status';
4321: }
4322: my $last=0;
4323: foreach my $key (keys(%consumed)) {
4324: my $num=(split('\0',$key))[1];
4325: if ($num > $last) { $last=$num; }
4326: if ($consumed{$key}->{'name'} eq $uname.':'.$udom) {
4327: return 'ok';
4328: }
4329: }
4330:
4331: if (scalar(keys(%consumed)) >= $max) {
4332: return 'error: no space left in slot';
4333: }
4334: my $wanted=$last+1;
4335:
4336: my %reservation=('name' => $uname.':'.$udom,
4337: 'timestamp' => time,
4338: 'symb' => $symb);
4339:
4340: my $success=&Apache::lonnet::newput('slot_reservations',
4341: {"$slot_name\0$wanted" =>
4342: \%reservation},
4343: $cdom, $cnum);
1.438 raeburn 4344: if ($success eq 'ok') {
4345: my %storehash = (
4346: symb => $symb,
4347: slot => $slot_name,
4348: action => 'reserve',
4349: context => 'parameter',
4350: );
4351: &Apache::lonnet::instructor_log('slotreservationslog',\%storehash,
4352: '',$uname,$udom,$cnum,$cdom);
4353:
4354: &Apache::lonnet::instructor_log($cdom.'_'.$cnum.'_slotlog',\%storehash,
4355: '',$uname,$udom,$uname,$udom);
4356: }
1.437 raeburn 4357: return $success;
4358: }
4359:
4360: sub delete_slots {
4361: my ($slot_name,$cdom,$cnum,$uname,$udom,$symb) = @_;
4362: my $delresult;
4363: my %consumed = &Apache::lonnet::dump('slot_reservations',$cdom,
4364: $cnum, "^$slot_name\0");
4365: if (&Apache::lonnet::error(%consumed)) {
4366: return 'error: unable to determine current slot status';
4367: }
4368: my ($tmp)=%consumed;
4369: if ($tmp=~/^error: 2 /) {
4370: return 'error: unable to determine current slot status';
4371: }
4372: foreach my $key (keys(%consumed)) {
4373: if ($consumed{$key}->{'name'} eq $uname.':'.$udom) {
4374: my $num=(split('\0',$key))[1];
4375: my $entry = $slot_name.'\0'.$num;
4376: $delresult = &Apache::lonnet::del('slot_reservations',[$entry],
4377: $cdom,$cnum);
4378: if ($delresult eq 'ok') {
4379: my %storehash = (
4380: symb => $symb,
4381: slot => $slot_name,
4382: action => 'release',
4383: context => 'parameter',
4384: );
4385: &Apache::lonnet::instructor_log('slotreservationslog',\%storehash,
4386: 1,$uname,$udom,$cnum,$cdom);
1.438 raeburn 4387: &Apache::lonnet::instructor_log($cdom.'_'.$cnum.'_slotlog',\%storehash,
4388: 1,$uname,$udom,$uname,$udom);
1.437 raeburn 4389: }
4390: }
4391: }
4392: return $delresult;
4393: }
4394:
1.355 albertel 4395: sub check_for_course_info {
4396: my $navmap = Apache::lonnavmaps::navmap->new();
4397: return 1 if ($navmap);
4398: return 0;
4399: }
4400:
1.259 banghart 4401:
1.30 www 4402: sub handler {
1.43 albertel 4403: my $r=shift;
1.30 www 4404:
1.376 albertel 4405: &reset_caches();
4406:
1.414 droeschl 4407: &Apache::loncommon::content_type($r,'text/html');
4408: $r->send_http_header;
4409: return OK if $r->header_only;
4410:
1.193 albertel 4411: &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
1.473 amueller 4412: ['action','state',
1.205 www 4413: 'pres_marker',
4414: 'pres_value',
1.206 www 4415: 'pres_type',
1.390 www 4416: 'udom','uname','symb','serial','timebase']);
1.131 www 4417:
1.83 bowersj2 4418:
1.193 albertel 4419: &Apache::lonhtmlcommon::clear_breadcrumbs();
1.194 albertel 4420: &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/parmset",
1.473 amueller 4421: text=>"Parameter Manager",
4422: faq=>10,
4423: bug=>'Instructor Interface',
1.442 droeschl 4424: help =>
4425: 'Parameter_Manager,Course_Environment,Parameter_Helper,Parameter_Overview,Table_Mode'});
1.203 www 4426:
1.30 www 4427: # ----------------------------------------------------- Needs to be in a course
1.194 albertel 4428: my $parm_permission =
1.473 amueller 4429: (&Apache::lonnet::allowed('opa',$env{'request.course.id'}) ||
4430: &Apache::lonnet::allowed('opa',$env{'request.course.id'}.'/'.
4431: $env{'request.course.sec'}));
1.355 albertel 4432: my $exists = &check_for_course_info();
4433:
4434: if ($env{'request.course.id'} && $parm_permission && $exists) {
1.193 albertel 4435: #
4436: # Main switch on form.action and form.state, as appropriate
4437: #
4438: # Check first if coming from someone else headed directly for
4439: # the table mode
4440: if ((($env{'form.command'} eq 'set') && ($env{'form.url'})
1.473 amueller 4441: && (!$env{'form.dis'})) || ($env{'form.symb'})) {
4442: &assessparms($r);
1.193 albertel 4443: } elsif (! exists($env{'form.action'})) {
4444: &print_main_menu($r,$parm_permission);
1.414 droeschl 4445: } elsif ($env{'form.action'} eq 'setoverview') {
1.473 amueller 4446: &overview($r);
4447: } elsif ($env{'form.action'} eq 'addmetadata') {
4448: &addmetafield($r);
4449: } elsif ($env{'form.action'} eq 'ordermetadata') {
4450: &order_meta_fields($r);
1.414 droeschl 4451: } elsif ($env{'form.action'} eq 'setrestrictmeta') {
1.473 amueller 4452: &setrestrictmeta($r);
1.414 droeschl 4453: } elsif ($env{'form.action'} eq 'newoverview') {
1.473 amueller 4454: &newoverview($r);
1.414 droeschl 4455: } elsif ($env{'form.action'} eq 'setdefaults') {
1.473 amueller 4456: &defaultsetter($r);
4457: } elsif ($env{'form.action'} eq 'settable') {
4458: &assessparms($r);
1.414 droeschl 4459: } elsif ($env{'form.action'} eq 'parameterchangelog') {
1.473 amueller 4460: &parm_change_log($r);
1.414 droeschl 4461: } elsif ($env{'form.action'} eq 'cleanparameters') {
1.473 amueller 4462: &clean_parameters($r);
1.414 droeschl 4463: } elsif ($env{'form.action'} eq 'dateshift1') {
1.390 www 4464: &date_shift_one($r);
1.414 droeschl 4465: } elsif ($env{'form.action'} eq 'dateshift2') {
1.390 www 4466: &date_shift_two($r);
1.446 bisitz 4467: }
1.43 albertel 4468: } else {
1.1 www 4469: # ----------------------------- Not in a course, or not allowed to modify parms
1.473 amueller 4470: if ($exists) {
4471: $env{'user.error.msg'}=
4472: "/adm/parmset:opa:0:0:Cannot modify assessment parameters";
4473: } else {
4474: $env{'user.error.msg'}=
4475: "/adm/parmset::0:1:Course environment gone, reinitialize the course";
4476: }
4477: return HTTP_NOT_ACCEPTABLE;
1.43 albertel 4478: }
1.376 albertel 4479: &reset_caches();
4480:
1.43 albertel 4481: return OK;
1.1 www 4482: }
4483:
4484: 1;
4485: __END__
4486:
4487:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>