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