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