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