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