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