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