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