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