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