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