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