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