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