Annotation of loncom/interface/lonparmset.pm, revision 1.540
1.1 www 1: # The LearningOnline Network with CAPA
2: # Handler to set parameters for assessments
3: #
1.540 ! bisitz 4: # $Id: lonparmset.pm,v 1.539 2013/07/17 12:00:28 raeburn 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.512 foxr 3648: &Apache::lonhtmlcommon::dshowerfuck.net
3649: ate_setter('shiftform',
1.390 www 3650: 'timeshifted',
3651: $env{'form.timebase'},,
3652: '').
3653: '</td></tr></table>'.
3654: '<input type="hidden" name="action" value="dateshift2" />'.
3655: '<input type="hidden" name="timebase" value="'.$env{'form.timebase'}.'" />'.
3656: '<input type="submit" value="'.&mt('Shift all dates accordingly').'" /></form>');
1.507 www 3657: &endSettingsScreen($r);
1.390 www 3658: $r->print(&Apache::loncommon::end_page());
3659: }
3660:
3661: sub date_shift_two {
3662: my ($r) = @_;
3663: my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
3664: my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.531 raeburn 3665: my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'};
1.414 droeschl 3666: &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=dateshift1&timebase='.$env{'form.timebase'},
1.473 amueller 3667: text=>"Shifting Dates"});
1.390 www 3668: my $start_page=&Apache::loncommon::start_page('Shift Dates');
3669: my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Shift');
1.507 www 3670: $r->print($start_page.$breadcrumbs);
1.531 raeburn 3671: &startSettingsScreen($r,'parmset',$crstype);
1.390 www 3672: my $timeshifted=&Apache::lonhtmlcommon::get_date_from_form('timeshifted');
3673: $r->print(&mt('Shifting all dates such that [_1] becomes [_2]',
3674: &Apache::lonlocal::locallocaltime($env{'form.timebase'}),
3675: &Apache::lonlocal::locallocaltime($timeshifted)));
3676: my $delta=$timeshifted-$env{'form.timebase'};
3677: &dateshift($delta);
1.507 www 3678: &endSettingsScreen($r);
1.390 www 3679: $r->print(&Apache::loncommon::end_page());
3680: }
3681:
1.333 albertel 3682: sub parse_key {
3683: my ($key) = @_;
3684: my %data;
3685: my ($middle,$part,$name)=
1.473 amueller 3686: ($key=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);
1.333 albertel 3687: $data{'scope_type'} = 'all';
3688: if ($middle=~/^\[(.*)\]/) {
1.473 amueller 3689: $data{'scope'} = $1;
3690: if ($data{'scope'}=~/^useropt\:($match_username)\:($match_domain)/) {
3691: $data{'scope_type'} = 'user';
3692: $data{'scope'} = [$1,$2];
3693: } else {
3694: #FIXME check for group scope
3695: $data{'scope_type'} = 'section';
3696: }
3697: $middle=~s/^\[(.*)\]//;
1.333 albertel 3698: }
3699: $middle=~s/\.+$//;
3700: $middle=~s/^\.+//;
3701: $data{'realm_type'}='all';
3702: if ($middle=~/^(.+)\_\_\_\(all\)$/) {
1.473 amueller 3703: $data{'realm'} = $1;
3704: $data{'realm_type'} = 'folder';
3705: $data{'realm_title'} = &Apache::lonnet::gettitle($data{'realm'});
3706: ($data{'realm_exists'}) = &Apache::lonnet::is_on_map($data{'realm'});
1.333 albertel 3707: } elsif ($middle) {
1.473 amueller 3708: $data{'realm'} = $middle;
3709: $data{'realm_type'} = 'symb';
3710: $data{'realm_title'} = &Apache::lonnet::gettitle($data{'realm'});
3711: my ($map,$resid,$url) = &Apache::lonnet::decode_symb($data{'realm'});
3712: $data{'realm_exists'} = &Apache::lonnet::symbverify($data{'realm'},$url);
1.333 albertel 3713: }
1.446 bisitz 3714:
1.333 albertel 3715: $data{'parameter_part'} = $part;
3716: $data{'parameter_name'} = $name;
3717:
3718: return %data;
3719: }
3720:
1.239 raeburn 3721:
1.416 jms 3722: sub header {
1.507 www 3723: return &Apache::loncommon::start_page('Settings');
1.416 jms 3724: }
1.193 albertel 3725:
3726:
3727:
3728: sub print_main_menu {
3729: my ($r,$parm_permission)=@_;
3730: #
1.414 droeschl 3731: $r->print(&header());
1.507 www 3732: $r->print(&Apache::lonhtmlcommon::breadcrumbs('Content and Problem Settings'));
1.531 raeburn 3733: my $crstype = &Apache::loncommon::course_type();
3734: my $lc_crstype = lc($crstype);
3735:
3736: &startSettingsScreen($r,'parmset',$crstype);
1.193 albertel 3737: $r->print(<<ENDMAINFORMHEAD);
3738: <form method="post" enctype="multipart/form-data"
3739: action="/adm/parmset" name="studentform">
3740: ENDMAINFORMHEAD
3741: #
1.195 albertel 3742: my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
3743: my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
1.268 albertel 3744: my $vgr = &Apache::lonnet::allowed('vgr',$env{'request.course.id'});
1.366 albertel 3745: my $mgr = &Apache::lonnet::allowed('mgr',$env{'request.course.id'});
1.520 raeburn 3746: my $dcm = &Apache::lonnet::allowed('dcm',$env{'request.course.id'});
3747: if ((!$dcm) && ($env{'request.course.sec'} ne '')) {
3748: $dcm = &Apache::lonnet::allowed('dcm',$env{'request.course.id'}.
3749: '/'.$env{'request.course.sec'});
3750: }
1.268 albertel 3751:
1.193 albertel 3752: my @menu =
1.507 www 3753: ( { categorytitle=>"Content Settings for this $crstype",
1.473 amueller 3754: items => [
3755: { linktext => 'Portfolio Metadata',
3756: url => '/adm/parmset?action=setrestrictmeta',
3757: permission => $parm_permission,
1.477 raeburn 3758: linktitle => "Restrict metadata for this $lc_crstype." ,
1.473 amueller 3759: icon =>'contact-new.png' ,
3760: },
3761: { linktext => 'Reset Student Access Times',
3762: url => '/adm/helper/resettimes.helper',
3763: permission => $mgr,
1.477 raeburn 3764: linktitle => "Reset access times for folders/maps, resources or the $lc_crstype." ,
1.473 amueller 3765: icon => 'start-here.png' ,
3766: },
1.520 raeburn 3767: { linktext => 'Blocking Communication/Resource Access',
3768: url => '/adm/setblock',
3769: permission => $dcm,
3770: linktitle => 'Configure blocking of communication/collaboration and access to resources during an exam',
3771: icon => 'comblock.png',
3772: },
1.473 amueller 3773: { linktext => 'Set Parameter Setting Default Actions',
3774: url => '/adm/parmset?action=setdefaults',
3775: permission => $parm_permission,
3776: linktitle =>'Set default actions for parameters.' ,
3777: icon => 'folder-new.png' ,
3778: }]},
3779: { categorytitle => 'New and Existing Parameter Settings for Resources',
3780: items => [
3781: { linktext => 'Edit Resource Parameters - Helper Mode',
3782: url => '/adm/helper/parameter.helper',
3783: permission => $parm_permission,
3784: linktitle =>'Set/Modify resource parameters in helper mode.' ,
3785: icon => 'dialog-information.png' ,
3786: #help => 'Parameter_Helper',
3787: },
3788: { linktext => 'Edit Resource Parameters - Overview Mode',
3789: url => '/adm/parmset?action=newoverview',
3790: permission => $parm_permission,
3791: linktitle =>'Set/Modify resource parameters in overview mode.' ,
3792: icon => 'edit-find.png' ,
3793: #help => 'Parameter_Overview',
3794: },
3795: { linktext => 'Edit Resource Parameters - Table Mode',
3796: url => '/adm/parmset?action=settable',
3797: permission => $parm_permission,
3798: linktitle =>'Set/Modify resource parameters in table mode.' ,
3799: icon => 'edit-copy.png' ,
3800: #help => 'Table_Mode',
3801: }]},
1.417 droeschl 3802: { categorytitle => 'Existing Parameter Settings for Resources',
1.473 amueller 3803: items => [
3804: { linktext => 'Modify Resource Parameters - Overview Mode',
3805: url => '/adm/parmset?action=setoverview',
3806: permission => $parm_permission,
3807: linktitle =>'Set/Modify existing resource parameters in overview mode.' ,
3808: icon => 'preferences-desktop-wallpaper.png' ,
3809: #help => 'Parameter_Overview',
3810: },
3811: { linktext => 'Change Log',
3812: url => '/adm/parmset?action=parameterchangelog',
3813: permission => $parm_permission,
1.477 raeburn 3814: linktitle =>"View parameter and $lc_crstype blog posting/user notification change log." ,
1.487 wenzelju 3815: icon => 'document-properties.png',
1.473 amueller 3816: }]}
1.193 albertel 3817: );
1.414 droeschl 3818: $r->print(&Apache::lonhtmlcommon::generate_menu(@menu));
1.539 raeburn 3819: $r->print('</form>');
1.507 www 3820: &endSettingsScreen($r);
1.539 raeburn 3821: $r->print(&Apache::loncommon::end_page());
1.193 albertel 3822: return;
3823: }
1.414 droeschl 3824:
1.416 jms 3825:
3826:
1.252 banghart 3827: sub output_row {
1.347 banghart 3828: my ($r, $field_name, $field_text, $added_flag) = @_;
1.252 banghart 3829: my $output;
1.263 banghart 3830: my $options=$env{'course.'.$env{'request.course.id'}.'.metadata.'.$field_name.'.options'};
3831: my $values=$env{'course.'.$env{'request.course.id'}.'.metadata.'.$field_name.'.values'};
1.337 banghart 3832: if (!defined($options)) {
1.254 banghart 3833: $options = 'active,stuadd';
1.261 banghart 3834: $values = '';
1.252 banghart 3835: }
1.337 banghart 3836: if (!($options =~ /deleted/)) {
3837: my @options= ( ['active', 'Show to student'],
1.418 schafran 3838: ['stuadd', 'Provide text area for students to type metadata'],
1.351 banghart 3839: ['choices','Provide choices for students to select from']);
1.473 amueller 3840: # ['onlyone','Student may select only one choice']);
1.337 banghart 3841: if ($added_flag) {
3842: push @options,['deleted', 'Delete Metadata Field'];
3843: }
1.351 banghart 3844: $output = &Apache::loncommon::start_data_table_row();
1.451 bisitz 3845: $output .= '<td><strong>'.$field_text.':</strong></td>';
1.351 banghart 3846: $output .= &Apache::loncommon::end_data_table_row();
1.337 banghart 3847: foreach my $opt (@options) {
1.473 amueller 3848: my $checked = ($options =~ m/$opt->[0]/) ? ' checked="checked" ' : '' ;
3849: $output .= &Apache::loncommon::continue_data_table_row();
3850: $output .= '<td>'.(' ' x 5).'<label>
3851: <input type="checkbox" name="'.
3852: $field_name.'_'.$opt->[0].'" value="yes"'.$checked.' />'.
3853: &mt($opt->[1]).'</label></td>';
3854: $output .= &Apache::loncommon::end_data_table_row();
3855: }
1.351 banghart 3856: $output .= &Apache::loncommon::continue_data_table_row();
1.451 bisitz 3857: $output .= '<td>'.(' ' x 10).'<input name="'.$field_name.'_values" type="text" value="'.$values.'" size="80" /></td>';
1.351 banghart 3858: $output .= &Apache::loncommon::end_data_table_row();
3859: my $multiple_checked;
3860: my $single_checked;
3861: if ($options =~ m/onlyone/) {
1.422 bisitz 3862: $multiple_checked = '';
1.423 bisitz 3863: $single_checked = ' checked="checked"';
1.351 banghart 3864: } else {
1.423 bisitz 3865: $multiple_checked = ' checked="checked"';
1.422 bisitz 3866: $single_checked = '';
1.351 banghart 3867: }
1.473 amueller 3868: $output .= &Apache::loncommon::continue_data_table_row();
3869: $output .= '<td>'.(' ' x 10).'
3870: <input type="radio" name="'.$field_name.'_onlyone" value="multiple"'.$multiple_checked .' />
3871: '.&mt('Student may select multiple choices from list').'</td>';
3872: $output .= &Apache::loncommon::end_data_table_row();
3873: $output .= &Apache::loncommon::continue_data_table_row();
3874: $output .= '<td>'.(' ' x 10).'
3875: <input type="radio" name="'.$field_name.'_onlyone" value="single"'.$single_checked.' />
3876: '.&mt('Student may select only one choice from list').'</td>';
3877: $output .= &Apache::loncommon::end_data_table_row();
1.252 banghart 3878: }
3879: return ($output);
3880: }
1.416 jms 3881:
3882:
3883:
1.340 banghart 3884: sub order_meta_fields {
3885: my ($r)=@_;
3886: my $idx = 1;
3887: my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
3888: my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.531 raeburn 3889: my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'};;
1.341 banghart 3890: $r->print(&Apache::loncommon::start_page('Order Metadata Fields'));
1.414 droeschl 3891: &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=addmetadata',
1.473 amueller 3892: text=>"Add Metadata Field"});
1.345 banghart 3893: &Apache::lonhtmlcommon::add_breadcrumb
3894: ({href=>"/adm/parmset?action=setrestrictmeta",
3895: text=>"Restrict Metadata"},
3896: {text=>"Order Metadata"});
3897: $r->print(&Apache::lonhtmlcommon::breadcrumbs('Order Metadata'));
1.531 raeburn 3898: &startSettingsScreen($r,'parmset',$crstype);
1.340 banghart 3899: if ($env{'form.storeorder'}) {
3900: my $newpos = $env{'form.newpos'} - 1;
3901: my $currentpos = $env{'form.currentpos'} - 1;
3902: my @neworder = ();
3903: my @oldorder = split /,/,$env{'course.'.$env{'request.course.id'}.'.metadata.addedorder'};
3904: my $i;
1.341 banghart 3905: if ($newpos > $currentpos) {
1.340 banghart 3906: # moving stuff up
3907: for ($i=0;$i<$currentpos;$i++) {
1.473 amueller 3908: $neworder[$i]=$oldorder[$i];
1.340 banghart 3909: }
3910: for ($i=$currentpos;$i<$newpos;$i++) {
1.473 amueller 3911: $neworder[$i]=$oldorder[$i+1];
1.340 banghart 3912: }
3913: $neworder[$newpos]=$oldorder[$currentpos];
3914: for ($i=$newpos+1;$i<=$#oldorder;$i++) {
1.473 amueller 3915: $neworder[$i]=$oldorder[$i];
1.340 banghart 3916: }
3917: } else {
3918: # moving stuff down
1.473 amueller 3919: for ($i=0;$i<$newpos;$i++) {
3920: $neworder[$i]=$oldorder[$i];
3921: }
3922: $neworder[$newpos]=$oldorder[$currentpos];
3923: for ($i=$newpos+1;$i<$currentpos+1;$i++) {
3924: $neworder[$i]=$oldorder[$i-1];
3925: }
3926: for ($i=$currentpos+1;$i<=$#oldorder;$i++) {
3927: $neworder[$i]=$oldorder[$i];
3928: }
1.340 banghart 3929: }
1.473 amueller 3930: my $ordered_fields = join ",", @neworder;
1.343 banghart 3931: my $put_result = &Apache::lonnet::put('environment',
1.446 bisitz 3932: {'metadata.addedorder'=>$ordered_fields},$dom,$crs);
1.473 amueller 3933: &Apache::lonnet::appenv({'course.'.$env{'request.course.id'}.'.metadata.addedorder' => $ordered_fields});
1.340 banghart 3934: }
1.357 raeburn 3935: my $fields = &get_added_meta_fieldnames($env{'request.course.id'});
1.341 banghart 3936: my $ordered_fields;
1.340 banghart 3937: my @fields_in_order = split /,/,$env{'course.'.$env{'request.course.id'}.'.metadata.addedorder'};
3938: if (!@fields_in_order) {
3939: # no order found, pick sorted order then create metadata.addedorder key.
3940: foreach my $key (sort keys %$fields) {
3941: push @fields_in_order, $key;
1.341 banghart 3942: $ordered_fields = join ",", @fields_in_order;
1.340 banghart 3943: }
1.341 banghart 3944: my $put_result = &Apache::lonnet::put('environment',
1.446 bisitz 3945: {'metadata.addedorder'=>$ordered_fields},$dom,$crs);
3946: }
1.340 banghart 3947: $r->print('<table>');
3948: my $num_fields = scalar(@fields_in_order);
3949: foreach my $key (@fields_in_order) {
3950: $r->print('<tr><td>');
3951: $r->print('<form method="post" action="">');
1.537 bisitz 3952: $r->print('<select name="newpos" onchange="this.form.submit()">');
1.340 banghart 3953: for (my $i = 1;$i le $num_fields;$i ++) {
3954: if ($i eq $idx) {
3955: $r->print('<option value="'.$i.'" SELECTED>('.$i.')</option>');
3956: } else {
3957: $r->print('<option value="'.$i.'">'.$i.'</option>');
3958: }
3959: }
3960: $r->print('</select></td><td>');
3961: $r->print('<input type="hidden" name="currentpos" value="'.$idx.'" />');
3962: $r->print('<input type="hidden" name="storeorder" value="true" />');
3963: $r->print('</form>');
3964: $r->print($$fields{$key}.'</td></tr>');
3965: $idx ++;
3966: }
3967: $r->print('</table>');
1.507 www 3968: &endSettingsScreen($r);
1.340 banghart 3969: return 'ok';
3970: }
1.416 jms 3971:
3972:
1.359 banghart 3973: sub continue {
3974: my $output;
3975: $output .= '<form action="" method="post">';
3976: $output .= '<input type="hidden" name="action" value="setrestrictmeta" />';
3977: $output .= '<input type="submit" value="Continue" />';
3978: return ($output);
3979: }
1.416 jms 3980:
3981:
1.334 banghart 3982: sub addmetafield {
3983: my ($r)=@_;
1.414 droeschl 3984: &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=addmetadata',
1.473 amueller 3985: text=>"Add Metadata Field"});
1.334 banghart 3986: $r->print(&Apache::loncommon::start_page('Add Metadata Field'));
3987: $r->print(&Apache::lonhtmlcommon::breadcrumbs('Add Metadata Field'));
1.335 banghart 3988: my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
3989: my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.531 raeburn 3990: my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'};
3991: &startSettingsScreen($r,'parmset',$crstype);
1.339 banghart 3992: if (exists($env{'form.undelete'})) {
1.358 banghart 3993: my @meta_fields = &Apache::loncommon::get_env_multiple('form.undeletefield');
1.339 banghart 3994: foreach my $meta_field(@meta_fields) {
3995: my $options = $env{'course.'.$env{'request.course.id'}.'.metadata.'.$meta_field.'.options'};
3996: $options =~ s/deleted//;
3997: $options =~ s/,,/,/;
3998: my $put_result = &Apache::lonnet::put('environment',
3999: {'metadata.'.$meta_field.'.options'=>$options},$dom,$crs);
1.446 bisitz 4000:
1.339 banghart 4001: $r->print('Undeleted Metadata Field <strong>'.$env{'course.'.$env{'request.course.id'}.'.metadata.'.$meta_field.'.added'}."</strong> with result ".$put_result.'<br />');
4002: }
1.359 banghart 4003: $r->print(&continue());
1.339 banghart 4004: } elsif (exists($env{'form.fieldname'})) {
1.335 banghart 4005: my $meta_field = $env{'form.fieldname'};
4006: my $display_field = $env{'form.fieldname'};
4007: $meta_field =~ s/\W/_/g;
1.338 banghart 4008: $meta_field =~ tr/A-Z/a-z/;
1.335 banghart 4009: my $put_result = &Apache::lonnet::put('environment',
4010: {'metadata.'.$meta_field.'.values'=>"",
4011: 'metadata.'.$meta_field.'.added'=>"$display_field",
4012: 'metadata.'.$meta_field.'.options'=>""},$dom,$crs);
1.359 banghart 4013: $r->print('Added new Metadata Field <strong>'.$env{'form.fieldname'}."</strong> with result ".$put_result.'<br />');
4014: $r->print(&continue());
1.335 banghart 4015: } else {
1.357 raeburn 4016: my $fields = &get_deleted_meta_fieldnames($env{'request.course.id'});
1.339 banghart 4017: if ($fields) {
4018: $r->print('You may undelete previously deleted fields.<br />Check those you wish to undelete and click Undelete.<br />');
4019: $r->print('<form method="post" action="">');
4020: foreach my $key(keys(%$fields)) {
1.358 banghart 4021: $r->print('<input type="checkbox" name="undeletefield" value="'.$key.'" />'.$$fields{$key}.'<br /');
1.339 banghart 4022: }
4023: $r->print('<input type="submit" name="undelete" value="Undelete" />');
4024: $r->print('</form>');
4025: }
4026: $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 4027: $r->print('<input type="text" name="fieldname" /><br />');
4028: $r->print('<input type="submit" value="Add Metadata Field" />');
1.334 banghart 4029: }
1.361 albertel 4030: $r->print('</form>');
1.507 www 4031: &endSettingsScreen($r);
1.334 banghart 4032: }
1.416 jms 4033:
4034:
4035:
1.259 banghart 4036: sub setrestrictmeta {
1.240 banghart 4037: my ($r)=@_;
1.242 banghart 4038: my $next_meta;
1.244 banghart 4039: my $output;
1.245 banghart 4040: my $item_num;
1.246 banghart 4041: my $put_result;
1.414 droeschl 4042: &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setrestrictmeta',
1.473 amueller 4043: text=>"Restrict Metadata"});
1.280 albertel 4044: $r->print(&Apache::loncommon::start_page('Restrict Metadata'));
1.298 albertel 4045: $r->print(&Apache::lonhtmlcommon::breadcrumbs('Restrict Metadata'));
1.240 banghart 4046: my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
4047: my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.531 raeburn 4048: my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'};
4049: &startSettingsScreen($r,'parmset',$crstype);
1.259 banghart 4050: my $key_base = $env{'course.'.$env{'request.course.id'}.'.'};
1.252 banghart 4051: my $save_field = '';
1.259 banghart 4052: if ($env{'form.restrictmeta'}) {
1.254 banghart 4053: foreach my $field (sort(keys(%env))) {
1.252 banghart 4054: if ($field=~m/^form.(.+)_(.+)$/) {
1.254 banghart 4055: my $options;
1.252 banghart 4056: my $meta_field = $1;
4057: my $meta_key = $2;
1.253 banghart 4058: if ($save_field ne $meta_field) {
1.252 banghart 4059: $save_field = $meta_field;
1.473 amueller 4060: if ($env{'form.'.$meta_field.'_stuadd'}) {
4061: $options.='stuadd,';
4062: }
4063: if ($env{'form.'.$meta_field.'_choices'}) {
4064: $options.='choices,';
4065: }
4066: if ($env{'form.'.$meta_field.'_onlyone'} eq 'single') {
4067: $options.='onlyone,';
4068: }
4069: if ($env{'form.'.$meta_field.'_active'}) {
4070: $options.='active,';
4071: }
4072: if ($env{'form.'.$meta_field.'_deleted'}) {
4073: $options.='deleted,';
4074: }
1.259 banghart 4075: my $name = $save_field;
1.253 banghart 4076: $put_result = &Apache::lonnet::put('environment',
1.262 banghart 4077: {'metadata.'.$meta_field.'.options'=>$options,
4078: 'metadata.'.$meta_field.'.values'=>$env{'form.'.$meta_field.'_values'},
1.253 banghart 4079: },$dom,$crs);
1.252 banghart 4080: }
4081: }
4082: }
4083: }
1.296 albertel 4084: &Apache::lonnet::coursedescription($env{'request.course.id'},
1.473 amueller 4085: {'freshen_cache' => 1});
1.335 banghart 4086: # Get the default metadata fields
1.258 albertel 4087: my %metadata_fields = &Apache::lonmeta::fieldnames('portfolio');
1.335 banghart 4088: # Now get possible added metadata fields
1.357 raeburn 4089: my $added_metadata_fields = &get_added_meta_fieldnames($env{'request.course.id'});
1.346 banghart 4090: my $row_alt = 1;
1.347 banghart 4091: $output .= &Apache::loncommon::start_data_table();
1.258 albertel 4092: foreach my $field (sort(keys(%metadata_fields))) {
1.265 banghart 4093: if ($field ne 'courserestricted') {
1.346 banghart 4094: $row_alt = $row_alt ? 0 : 1;
1.473 amueller 4095: $output.= &output_row($r, $field, $metadata_fields{$field});
4096: }
1.255 banghart 4097: }
1.351 banghart 4098: my $buttons = (<<ENDButtons);
4099: <input type="submit" name="restrictmeta" value="Save" />
4100: </form><br />
4101: <form method="post" action="/adm/parmset?action=addmetadata" name="form1">
4102: <input type="submit" name="restrictmeta" value="Add a Metadata Field" />
4103: </form>
4104: <br />
4105: <form method="post" action="/adm/parmset?action=ordermetadata" name="form2">
4106: <input type="submit" name="restrictmeta" value="Order Metadata Fields" />
4107: ENDButtons
1.337 banghart 4108: my $added_flag = 1;
1.335 banghart 4109: foreach my $field (sort(keys(%$added_metadata_fields))) {
1.346 banghart 4110: $row_alt = $row_alt ? 0 : 1;
4111: $output.= &output_row($r, $field, $$added_metadata_fields{$field},$added_flag, $row_alt);
1.335 banghart 4112: }
1.347 banghart 4113: $output .= &Apache::loncommon::end_data_table();
1.446 bisitz 4114: $r->print(<<ENDenv);
1.259 banghart 4115: <form method="post" action="/adm/parmset?action=setrestrictmeta" name="form">
1.244 banghart 4116: $output
1.351 banghart 4117: $buttons
1.340 banghart 4118: </form>
1.244 banghart 4119: ENDenv
1.507 www 4120: &endSettingsScreen($r);
1.280 albertel 4121: $r->print(&Apache::loncommon::end_page());
1.240 banghart 4122: return 'ok';
4123: }
1.416 jms 4124:
4125:
4126:
1.335 banghart 4127: sub get_added_meta_fieldnames {
1.357 raeburn 4128: my ($cid) = @_;
1.335 banghart 4129: my %fields;
4130: foreach my $key(%env) {
1.357 raeburn 4131: if ($key =~ m/\Q$cid\E\.metadata\.(.+)\.added$/) {
1.335 banghart 4132: my $field_name = $1;
4133: my ($display_field_name) = $env{$key};
4134: $fields{$field_name} = $display_field_name;
4135: }
4136: }
4137: return \%fields;
4138: }
1.416 jms 4139:
4140:
4141:
1.339 banghart 4142: sub get_deleted_meta_fieldnames {
1.357 raeburn 4143: my ($cid) = @_;
1.339 banghart 4144: my %fields;
4145: foreach my $key(%env) {
1.357 raeburn 4146: if ($key =~ m/\Q$cid\E\.metadata\.(.+)\.added$/) {
1.339 banghart 4147: my $field_name = $1;
4148: if ($env{'course.'.$env{'request.course.id'}.'.metadata.'.$field_name.'.options'} =~ m/deleted/) {
4149: my ($display_field_name) = $env{$key};
4150: $fields{$field_name} = $display_field_name;
4151: }
4152: }
4153: }
4154: return \%fields;
4155: }
1.220 www 4156: sub defaultsetter {
1.280 albertel 4157: my ($r) = @_;
4158:
1.414 droeschl 4159: &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setdefaults',
1.473 amueller 4160: text=>"Set Defaults"});
1.531 raeburn 4161: my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
4162: my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
4163: my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'};
1.446 bisitz 4164: my $start_page =
1.531 raeburn 4165: &Apache::loncommon::start_page('Parameter Setting Default Actions');
1.298 albertel 4166: my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Defaults');
1.507 www 4167: $r->print($start_page.$breadcrumbs);
1.531 raeburn 4168: &startSettingsScreen($r,'parmset',$crstype);
1.507 www 4169: $r->print('<form method="post" action="/adm/parmset?action=setdefaults" name="defaultform">');
1.280 albertel 4170:
1.221 www 4171: my @ids=();
4172: my %typep=();
4173: my %keyp=();
4174: my %allparms=();
4175: my %allparts=();
4176: my %allmaps=();
4177: my %mapp=();
4178: my %symbp=();
4179: my %maptitles=();
4180: my %uris=();
4181: my %keyorder=&standardkeyorder();
4182: my %defkeytype=();
4183:
1.446 bisitz 4184: &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps,
1.473 amueller 4185: \%mapp, \%symbp,\%maptitles,\%uris,
4186: \%keyorder,\%defkeytype);
1.224 www 4187: if ($env{'form.storerules'}) {
1.473 amueller 4188: my %newrules=();
4189: my @delrules=();
4190: my %triggers=();
4191: foreach my $key (keys(%env)) {
1.225 albertel 4192: if ($key=~/^form\.(\w+)\_action$/) {
1.473 amueller 4193: my $tempkey=$1;
4194: my $action=$env{$key};
1.226 www 4195: if ($action) {
1.473 amueller 4196: $newrules{$tempkey.'_action'}=$action;
4197: if ($action ne 'default') {
4198: my ($whichaction,$whichparm)=($action=~/^(.*\_)([^\_]+)$/);
4199: $triggers{$whichparm}.=$tempkey.':';
4200: }
4201: $newrules{$tempkey.'_type'}=$defkeytype{$tempkey};
4202: if (&isdateparm($defkeytype{$tempkey})) {
4203: $newrules{$tempkey.'_days'}=$env{'form.'.$tempkey.'_days'};
4204: $newrules{$tempkey.'_hours'}=$env{'form.'.$tempkey.'_hours'};
4205: $newrules{$tempkey.'_min'}=$env{'form.'.$tempkey.'_min'};
4206: $newrules{$tempkey.'_sec'}=$env{'form.'.$tempkey.'_sec'};
4207: } else {
4208: $newrules{$tempkey.'_value'}=$env{'form.'.$tempkey.'_value'};
4209: $newrules{$tempkey.'_triggervalue'}=$env{'form.'.$tempkey.'_triggervalue'};
4210: }
4211: } else {
4212: push(@delrules,$tempkey.'_action');
4213: push(@delrules,$tempkey.'_type');
4214: push(@delrules,$tempkey.'_hours');
4215: push(@delrules,$tempkey.'_min');
4216: push(@delrules,$tempkey.'_sec');
4217: push(@delrules,$tempkey.'_value');
4218: }
4219: }
4220: }
4221: foreach my $key (keys %allparms) {
4222: $newrules{$key.'_triggers'}=$triggers{$key};
4223: }
1.531 raeburn 4224: &Apache::lonnet::put('parmdefactions',\%newrules,$cdom,$cnum);
4225: &Apache::lonnet::del('parmdefactions',\@delrules,$cdom,$cnum);
1.473 amueller 4226: &resetrulescache();
1.224 www 4227: }
1.227 www 4228: my %lt=&Apache::lonlocal::texthash('days' => 'Days',
1.473 amueller 4229: 'hours' => 'Hours',
4230: 'min' => 'Minutes',
4231: 'sec' => 'Seconds',
4232: 'yes' => 'Yes',
4233: 'no' => 'No');
1.222 www 4234: my @standardoptions=('','default');
4235: my @standarddisplay=('',&mt('Default value when manually setting'));
4236: my @dateoptions=('','default');
4237: my @datedisplay=('',&mt('Default value when manually setting'));
4238: foreach my $tempkey (&keysindisplayorder(\%allparms,\%keyorder)) {
1.473 amueller 4239: unless ($tempkey) { next; }
4240: push @standardoptions,'when_setting_'.$tempkey;
4241: push @standarddisplay,&mt('Automatically set when setting ').$tempkey;
4242: if (&isdateparm($defkeytype{$tempkey})) {
4243: push @dateoptions,'later_than_'.$tempkey;
4244: push @datedisplay,&mt('Automatically set later than ').$tempkey;
4245: push @dateoptions,'earlier_than_'.$tempkey;
4246: push @datedisplay,&mt('Automatically set earlier than ').$tempkey;
4247: }
1.222 www 4248: }
1.231 www 4249: $r->print(&mt('Manual setting rules apply to all interfaces.').'<br />'.
1.473 amueller 4250: &mt('Automatic setting rules apply to table mode interfaces only.'));
1.318 albertel 4251: $r->print("\n".&Apache::loncommon::start_data_table().
1.473 amueller 4252: &Apache::loncommon::start_data_table_header_row().
4253: "<th>".&mt('Rule for parameter').'</th><th>'.
4254: &mt('Action').'</th><th>'.&mt('Value').'</th>'.
4255: &Apache::loncommon::end_data_table_header_row());
1.221 www 4256: foreach my $tempkey (&keysindisplayorder(\%allparms,\%keyorder)) {
1.473 amueller 4257: unless ($tempkey) { next; }
4258: $r->print("\n".&Apache::loncommon::start_data_table_row().
4259: "<td>".$allparms{$tempkey}."\n<br />(".$tempkey.')</td><td>');
4260: my $action=&rulescache($tempkey.'_action');
4261: $r->print('<select name="'.$tempkey.'_action">');
4262: if (&isdateparm($defkeytype{$tempkey})) {
4263: for (my $i=0;$i<=$#dateoptions;$i++) {
4264: if ($dateoptions[$i]=~/\_$tempkey$/) { next; }
4265: $r->print("\n<option value='$dateoptions[$i]'".
4266: ($dateoptions[$i] eq $action?' selected="selected"':'').
4267: ">$datedisplay[$i]</option>");
4268: }
4269: } else {
4270: for (my $i=0;$i<=$#standardoptions;$i++) {
4271: if ($standardoptions[$i]=~/\_$tempkey$/) { next; }
4272: $r->print("\n<option value='$standardoptions[$i]'".
4273: ($standardoptions[$i] eq $action?' selected="selected"':'').
4274: ">$standarddisplay[$i]</option>");
4275: }
4276: }
4277: $r->print('</select>');
4278: unless (&isdateparm($defkeytype{$tempkey})) {
4279: $r->print("\n<br />".&mt('Triggering value(s) of other parameter (optional, comma-separated):').
4280: '<input type="text" size="20" name="'.$tempkey.'_triggervalue" value="'.&rulescache($tempkey.'_triggervalue').'" />');
4281: }
4282: $r->print("\n</td><td>\n");
1.222 www 4283:
1.221 www 4284: if (&isdateparm($defkeytype{$tempkey})) {
1.473 amueller 4285: my $days=&rulescache($tempkey.'_days');
4286: my $hours=&rulescache($tempkey.'_hours');
4287: my $min=&rulescache($tempkey.'_min');
4288: my $sec=&rulescache($tempkey.'_sec');
4289: $r->print(<<ENDINPUTDATE);
1.227 www 4290: <input name="$tempkey\_days" type="text" size="4" value="$days" />$lt{'days'}<br />
1.222 www 4291: <input name="$tempkey\_hours" type="text" size="4" value="$hours" />$lt{'hours'}<br />
4292: <input name="$tempkey\_min" type="text" size="4" value="$min" />$lt{'min'}<br />
4293: <input name="$tempkey\_sec" type="text" size="4" value="$sec" />$lt{'sec'}
1.221 www 4294: ENDINPUTDATE
1.473 amueller 4295: } elsif ($defkeytype{$tempkey} eq 'string_yesno') {
1.222 www 4296: my $yeschecked='';
4297: my $nochecked='';
1.444 bisitz 4298: if (&rulescache($tempkey.'_value') eq 'yes') { $yeschecked=' checked="checked"'; }
4299: if (&rulescache($tempkey.'_value') eq 'no') { $nochecked=' checked="checked"'; }
1.222 www 4300:
1.473 amueller 4301: $r->print(<<ENDYESNO);
1.444 bisitz 4302: <label><input type="radio" name="$tempkey\_value" value="yes"$yeschecked /> $lt{'yes'}</label><br />
4303: <label><input type="radio" name="$tempkey\_value" value="no"$nochecked /> $lt{'no'}</label>
1.221 www 4304: ENDYESNO
4305: } else {
1.473 amueller 4306: $r->print('<input type="text" size="20" name="'.$tempkey.'_value" value="'.&rulescache($tempkey.'_value').'" />');
4307: }
1.318 albertel 4308: $r->print('</td>'.&Apache::loncommon::end_data_table_row());
1.221 www 4309: }
1.318 albertel 4310: $r->print(&Apache::loncommon::end_data_table().
1.473 amueller 4311: "\n".'<input type="submit" name="storerules" value="'.
1.507 www 4312: &mt('Save').'" /></form>'."\n");
4313: &endSettingsScreen($r);
4314: $r->print(&Apache::loncommon::end_page());
1.220 www 4315: return;
4316: }
1.193 albertel 4317:
1.290 www 4318: sub components {
1.330 albertel 4319: my ($key,$uname,$udom,$exeuser,$exedomain,$typeflag)=@_;
4320:
4321: if ($typeflag) {
1.473 amueller 4322: $key=~s/\.type$//;
1.290 www 4323: }
1.330 albertel 4324:
4325: my ($middle,$part,$name)=
1.473 amueller 4326: ($key=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);
1.291 www 4327: my $issection;
1.330 albertel 4328:
1.290 www 4329: my $section=&mt('All Students');
4330: if ($middle=~/^\[(.*)\]/) {
1.473 amueller 4331: $issection=$1;
4332: $section=&mt('Group/Section').': '.$issection;
4333: $middle=~s/^\[(.*)\]//;
1.290 www 4334: }
4335: $middle=~s/\.+$//;
4336: $middle=~s/^\.+//;
1.291 www 4337: if ($uname) {
1.473 amueller 4338: $section=&mt('User').": ".&Apache::loncommon::plainname($uname,$udom);
4339: $issection='';
1.291 www 4340: }
1.316 albertel 4341: my $realm='<span class="LC_parm_scope_all">'.&mt('All Resources').'</span>';
1.446 bisitz 4342: my $realmdescription=&mt('all resources');
1.290 www 4343: if ($middle=~/^(.+)\_\_\_\(all\)$/) {
1.473 amueller 4344: $realm='<span class="LC_parm_scope_folder">'.&mt('Folder/Map').': '.&Apache::lonnet::gettitle($1).' <span class="LC_parm_folder"><br />('.$1.')</span></span>';
4345: $realmdescription=&mt('folder').' '.&Apache::lonnet::gettitle($1);
1.304 www 4346: } elsif ($middle) {
1.473 amueller 4347: my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle);
4348: $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>';
4349: $realmdescription=&mt('resource').' '.&Apache::lonnet::gettitle($middle);
1.290 www 4350: }
1.291 www 4351: my $what=$part.'.'.$name;
1.330 albertel 4352: return ($realm,$section,$name,$part,
1.473 amueller 4353: $what,$middle,$uname,$udom,$issection,$realmdescription);
1.290 www 4354: }
1.293 www 4355:
1.328 albertel 4356: my %standard_parms;
1.469 raeburn 4357: my %standard_parms_types;
1.416 jms 4358:
1.328 albertel 4359: sub load_parameter_names {
4360: open(my $config,"<$Apache::lonnet::perlvar{'lonTabDir'}/packages.tab");
4361: while (my $configline=<$config>) {
1.473 amueller 4362: if ($configline !~ /\S/ || $configline=~/^\#/) { next; }
4363: chomp($configline);
4364: my ($short,$plain)=split(/:/,$configline);
4365: my (undef,$name,$type)=split(/\&/,$short,3);
4366: if ($type eq 'display') {
4367: $standard_parms{$name} = $plain;
1.469 raeburn 4368: } elsif ($type eq 'type') {
4369: $standard_parms_types{$name} = $plain;
4370: }
1.328 albertel 4371: }
4372: close($config);
4373: $standard_parms{'int_pos'} = 'Positive Integer';
4374: $standard_parms{'int_zero_pos'} = 'Positive Integer or Zero';
4375: }
4376:
1.292 www 4377: sub standard_parameter_names {
4378: my ($name)=@_;
1.328 albertel 4379: if (!%standard_parms) {
1.473 amueller 4380: &load_parameter_names();
1.328 albertel 4381: }
1.292 www 4382: if ($standard_parms{$name}) {
1.473 amueller 4383: return $standard_parms{$name};
1.446 bisitz 4384: } else {
1.473 amueller 4385: return $name;
1.292 www 4386: }
4387: }
1.290 www 4388:
1.469 raeburn 4389: sub standard_parameter_types {
4390: my ($name)=@_;
4391: if (!%standard_parms_types) {
4392: &load_parameter_names();
4393: }
4394: if ($standard_parms_types{$name}) {
4395: return $standard_parms_types{$name};
4396: }
4397: return;
4398: }
1.309 www 4399:
1.285 albertel 4400: sub parm_change_log {
1.284 www 4401: my ($r)=@_;
1.531 raeburn 4402: my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
4403: my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
4404: my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'}
1.414 droeschl 4405: &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=settable',
1.473 amueller 4406: text=>"Parameter Change Log"});
1.522 raeburn 4407: my $js = '<script type="text/javascript">'."\n".
4408: '// <![CDATA['."\n".
4409: &Apache::loncommon::display_filter_js('parmslog')."\n".
4410: '// ]]>'."\n".
4411: '</script>'."\n";
4412: $r->print(&Apache::loncommon::start_page('Parameter Change Log',$js));
1.327 albertel 4413: $r->print(&Apache::lonhtmlcommon::breadcrumbs('Parameter Change Log'));
1.531 raeburn 4414: &startSettingsScreen($r,'parmset',$crstype);
4415: my %parmlog=&Apache::lonnet::dump('nohist_parameterlog',$cdom,$cnum);
1.311 albertel 4416:
1.301 www 4417: if ((keys(%parmlog))[0]=~/^error\:/) { undef(%parmlog); }
1.311 albertel 4418:
1.522 raeburn 4419: $r->print('<div class="LC_left_float">'.
4420: '<fieldset><legend>'.&mt('Display of Changes').'</legend>'.
4421: '<form action="/adm/parmset?action=parameterchangelog"
1.327 albertel 4422: method="post" name="parameterlog">');
1.446 bisitz 4423:
1.311 albertel 4424: my %saveable_parameters = ('show' => 'scalar',);
4425: &Apache::loncommon::store_course_settings('parameter_log',
4426: \%saveable_parameters);
4427: &Apache::loncommon::restore_course_settings('parameter_log',
4428: \%saveable_parameters);
1.522 raeburn 4429: $r->print(&Apache::loncommon::display_filter('parmslog').' '."\n".
4430: '<input type="submit" value="'.&mt('Display').'" />'.
4431: '</form></fieldset></div><br clear="all" />');
1.301 www 4432:
1.531 raeburn 4433: my $courseopt=&Apache::lonnet::get_courseresdata($cnum,$cdom);
1.301 www 4434: $r->print(&Apache::loncommon::start_data_table().&Apache::loncommon::start_data_table_header_row().
1.473 amueller 4435: '<th>'.&mt('Time').'</th><th>'.&mt('User').'</th><th>'.&mt('Extent').'</th><th>'.&mt('Users').'</th><th>'.
4436: &mt('Parameter').'</th><th>'.&mt('Part').'</th><th>'.&mt('New Value').'</th><th>'.&mt('Announce').'</th>'.
4437: &Apache::loncommon::end_data_table_header_row());
1.309 www 4438: my $shown=0;
1.349 www 4439: my $folder='';
4440: if ($env{'form.displayfilter'} eq 'currentfolder') {
1.473 amueller 4441: my $last='';
4442: if (tie(my %hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db',
4443: &GDBM_READER(),0640)) {
4444: $last=$hash{'last_known'};
4445: untie(%hash);
4446: }
4447: if ($last) { ($folder) = &Apache::lonnet::decode_symb($last); }
1.349 www 4448: }
1.446 bisitz 4449: foreach my $id (sort
1.473 amueller 4450: {
4451: if ($parmlog{$b}{'exe_time'} ne $parmlog{$a}{'exe_time'}) {
4452: return $parmlog{$b}{'exe_time'} <=>$parmlog{$a}{'exe_time'}
4453: }
4454: my $aid = (split('00000',$a))[-1];
4455: my $bid = (split('00000',$b))[-1];
4456: return $bid<=>$aid;
4457: } (keys(%parmlog))) {
1.294 www 4458: my @changes=keys(%{$parmlog{$id}{'logentry'}});
1.473 amueller 4459: my $count = 0;
4460: my $time =
4461: &Apache::lonlocal::locallocaltime($parmlog{$id}{'exe_time'});
4462: my $plainname =
4463: &Apache::loncommon::plainname($parmlog{$id}{'exe_uname'},
4464: $parmlog{$id}{'exe_udom'});
4465: my $about_me_link =
4466: &Apache::loncommon::aboutmewrapper($plainname,
4467: $parmlog{$id}{'exe_uname'},
4468: $parmlog{$id}{'exe_udom'});
4469: my $send_msg_link='';
4470: if ((($parmlog{$id}{'exe_uname'} ne $env{'user.name'})
4471: || ($parmlog{$id}{'exe_udom'} ne $env{'user.domain'}))) {
4472: $send_msg_link ='<br />'.
4473: &Apache::loncommon::messagewrapper(&mt('Send message'),
4474: $parmlog{$id}{'exe_uname'},
4475: $parmlog{$id}{'exe_udom'});
4476: }
4477: my $row_start=&Apache::loncommon::start_data_table_row();
4478: my $makenewrow=0;
4479: my %istype=();
4480: my $output;
4481: foreach my $changed (reverse(sort(@changes))) {
1.330 albertel 4482: my $value=$parmlog{$id}{'logentry'}{$changed};
1.473 amueller 4483: my $typeflag = ($changed =~/\.type$/ &&
4484: !exists($parmlog{$id}{'logentry'}{$changed.'.type'}));
1.330 albertel 4485: my ($realm,$section,$parmname,$part,$what,$middle,$uname,$udom,$issection,$realmdescription)=
1.473 amueller 4486: &components($changed,$parmlog{$id}{'uname'},$parmlog{$id}{'udom'},undef,undef,$typeflag);
4487: if ($env{'form.displayfilter'} eq 'currentfolder') {
4488: if ($folder) {
4489: if ($middle!~/^\Q$folder\E/) { next; }
4490: }
4491: }
4492: if ($typeflag) {
4493: $istype{$parmname}=$value;
4494: if (!$env{'form.includetypes'}) { next; }
4495: }
4496: $count++;
4497: if ($makenewrow) {
4498: $output .= $row_start;
4499: } else {
4500: $makenewrow=1;
4501: }
1.470 raeburn 4502: my $parmitem = &standard_parameter_names($parmname);
1.473 amueller 4503: $output .='<td>'.$realm.'</td><td>'.$section.'</td><td>'.
4504: &mt($parmitem).'</td><td>'.
4505: ($part?&mt('Part: [_1]',$part):&mt('All Parts')).'</td><td>';
4506: my $stillactive=0;
4507: if ($parmlog{$id}{'delflag'}) {
4508: $output .= &mt('Deleted');
4509: } else {
4510: if ($typeflag) {
1.470 raeburn 4511: my $parmitem = &standard_parameter_names($value);
4512: $parmitem = &mt($parmitem);
1.473 amueller 4513: $output .= &mt('Type: [_1]',$parmitem);
4514: } else {
4515: my ($level,@all)=&parmval_by_symb($what,$middle,&Apache::lonnet::metadata($middle,$what),
4516: $uname,$udom,$issection,$issection,$courseopt);
1.469 raeburn 4517: my $showvalue = $value;
4518: if ($istype{$parmname} eq '') {
4519: my $type = &standard_parameter_types($parmname);
4520: if ($type ne '') {
4521: if (&isdateparm($type)) {
4522: $showvalue =
4523: &Apache::lonlocal::locallocaltime($value);
4524: }
4525: }
4526: } else {
1.473 amueller 4527: if (&isdateparm($istype{$parmname})) {
4528: $showvalue =
1.469 raeburn 4529: &Apache::lonlocal::locallocaltime($value);
1.473 amueller 4530: }
1.469 raeburn 4531: }
4532: $output .= $showvalue;
1.473 amueller 4533: if ($value ne $all[$level]) {
4534: $output .= '<br /><span class="LC_warning">'.&mt('Not active anymore').'</span>';
4535: } else {
4536: $stillactive=1;
4537: }
4538: }
4539: }
4540: $output .= '</td><td>';
1.470 raeburn 4541:
1.473 amueller 4542: if ($stillactive) {
1.470 raeburn 4543: my $parmitem = &standard_parameter_names($parmname);
4544: $parmitem = &mt($parmitem);
1.473 amueller 4545: my $title=&mt('Changed [_1]',$parmitem);
1.471 raeburn 4546: my $description=&mt('Changed [_1] for [_2] to [_3]',
4547: $parmitem,$realmdescription,
1.473 amueller 4548: (&isdateparm($istype{$parmname})?&Apache::lonlocal::locallocaltime($value):$value));
4549: if (($uname) && ($udom)) {
4550: $output .=
4551: &Apache::loncommon::messagewrapper('Notify User',
4552: $uname,$udom,$title,
4553: $description);
4554: } else {
4555: $output .=
4556: &Apache::lonrss::course_blog_link($id,$title,
4557: $description);
4558: }
4559: }
4560: $output .= '</td>'.&Apache::loncommon::end_data_table_row();
4561: }
1.349 www 4562: if ($env{'form.displayfilter'} eq 'containing') {
1.473 amueller 4563: my $wholeentry=$about_me_link.':'.
4564: $parmlog{$id}{'exe_uname'}.':'.$parmlog{$id}{'exe_udom'}.':'.
4565: $output;
4566: if ($wholeentry!~/\Q$env{'form.containingphrase'}\E/i) { next; }
4567: }
1.349 www 4568: if ($count) {
1.473 amueller 4569: $r->print($row_start.'<td rowspan="'.$count.'">'.$time.'</td>
1.332 albertel 4570: <td rowspan="'.$count.'">'.$about_me_link.
1.473 amueller 4571: '<br /><tt>'.$parmlog{$id}{'exe_uname'}.
4572: ':'.$parmlog{$id}{'exe_udom'}.'</tt>'.
4573: $send_msg_link.'</td>'.$output);
4574: $shown++;
4575: }
4576: if (!($env{'form.show'} eq &mt('all')
4577: || $shown<=$env{'form.show'})) { last; }
1.286 www 4578: }
1.301 www 4579: $r->print(&Apache::loncommon::end_data_table());
1.507 www 4580: &endSettingsScreen($r);
1.284 www 4581: $r->print(&Apache::loncommon::end_page());
4582: }
4583:
1.437 raeburn 4584: sub update_slots {
4585: my ($slot_name,$cdom,$cnum,$symb,$uname,$udom) = @_;
4586: my %slot=&Apache::lonnet::get_slot($slot_name);
4587: if (!keys(%slot)) {
4588: return 'error: slot does not exist';
4589: }
4590: my $max=$slot{'maxspace'};
4591: if (!defined($max)) { $max=99999; }
4592:
4593: my %consumed=&Apache::lonnet::dump('slot_reservations',$cdom,$cnum,
4594: "^$slot_name\0");
4595: my ($tmp)=%consumed;
4596: if ($tmp=~/^error: 2 / ) {
4597: return 'error: unable to determine current slot status';
4598: }
4599: my $last=0;
4600: foreach my $key (keys(%consumed)) {
4601: my $num=(split('\0',$key))[1];
4602: if ($num > $last) { $last=$num; }
4603: if ($consumed{$key}->{'name'} eq $uname.':'.$udom) {
4604: return 'ok';
4605: }
4606: }
4607:
4608: if (scalar(keys(%consumed)) >= $max) {
4609: return 'error: no space left in slot';
4610: }
4611: my $wanted=$last+1;
4612:
4613: my %reservation=('name' => $uname.':'.$udom,
4614: 'timestamp' => time,
4615: 'symb' => $symb);
4616:
4617: my $success=&Apache::lonnet::newput('slot_reservations',
4618: {"$slot_name\0$wanted" =>
4619: \%reservation},
4620: $cdom, $cnum);
1.438 raeburn 4621: if ($success eq 'ok') {
4622: my %storehash = (
4623: symb => $symb,
4624: slot => $slot_name,
4625: action => 'reserve',
4626: context => 'parameter',
4627: );
1.526 raeburn 4628: &Apache::lonnet::write_log('course','slotreservationslog',\%storehash,
1.524 raeburn 4629: '',$uname,$udom,$cnum,$cdom);
1.438 raeburn 4630:
1.526 raeburn 4631: &Apache::lonnet::write_log('course',$cdom.'_'.$cnum.'_slotlog',\%storehash,
1.524 raeburn 4632: '',$uname,$udom,$uname,$udom);
1.438 raeburn 4633: }
1.437 raeburn 4634: return $success;
4635: }
4636:
4637: sub delete_slots {
4638: my ($slot_name,$cdom,$cnum,$uname,$udom,$symb) = @_;
4639: my $delresult;
4640: my %consumed = &Apache::lonnet::dump('slot_reservations',$cdom,
4641: $cnum, "^$slot_name\0");
4642: if (&Apache::lonnet::error(%consumed)) {
4643: return 'error: unable to determine current slot status';
4644: }
4645: my ($tmp)=%consumed;
4646: if ($tmp=~/^error: 2 /) {
4647: return 'error: unable to determine current slot status';
4648: }
4649: foreach my $key (keys(%consumed)) {
4650: if ($consumed{$key}->{'name'} eq $uname.':'.$udom) {
4651: my $num=(split('\0',$key))[1];
4652: my $entry = $slot_name.'\0'.$num;
4653: $delresult = &Apache::lonnet::del('slot_reservations',[$entry],
4654: $cdom,$cnum);
4655: if ($delresult eq 'ok') {
4656: my %storehash = (
4657: symb => $symb,
4658: slot => $slot_name,
4659: action => 'release',
4660: context => 'parameter',
4661: );
1.526 raeburn 4662: &Apache::lonnet::write_log('course','slotreservationslog',\%storehash,
1.524 raeburn 4663: 1,$uname,$udom,$cnum,$cdom);
1.526 raeburn 4664: &Apache::lonnet::write_log('course',$cdom.'_'.$cnum.'_slotlog',\%storehash,
1.524 raeburn 4665: 1,$uname,$udom,$uname,$udom);
1.437 raeburn 4666: }
4667: }
4668: }
4669: return $delresult;
4670: }
4671:
1.355 albertel 4672: sub check_for_course_info {
4673: my $navmap = Apache::lonnavmaps::navmap->new();
4674: return 1 if ($navmap);
4675: return 0;
4676: }
4677:
1.514 raeburn 4678: sub parameter_release_vars {
1.504 raeburn 4679: my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
4680: my $chome = $env{'course.'.$env{'request.course.id'}.'.home'};
4681: my $chostname = &Apache::lonnet::hostname($chome);
4682: my ($cmajor,$cminor) =
4683: split(/\./,&Apache::lonnet::get_server_loncaparev($cdom,$chome));
4684: return ($chostname,$cmajor,$cminor);
4685: }
4686:
1.514 raeburn 4687: sub parameter_releasecheck {
4688: my ($name,$value,$needsrelease,$chostname,$cmajor,$cminor) = @_;
1.504 raeburn 4689: my $needsnewer;
4690: my ($needsmajor,$needsminor) = split(/\./,$needsrelease);
4691: if (($cmajor < $needsmajor) ||
4692: ($cmajor == $needsmajor && $cminor < $needsminor)) {
4693: $needsnewer = 1;
4694: } else {
1.514 raeburn 4695: &Apache::lonnet::update_released_required($Apache::lonnet::needsrelease{'parameter:'.$name.':'.$value});
1.504 raeburn 4696: }
4697: return $needsnewer;
4698: }
4699:
4700: sub oldversion_warning {
1.514 raeburn 4701: my ($name,$value,$chostname,$cmajor,$cminor,$needsrelease) = @_;
1.504 raeburn 4702: my $desc;
1.514 raeburn 4703: my %stringtypes = (
1.519 raeburn 4704: type => 'string_questiontype',
4705: lenient => 'string_lenient',
4706: retrypartial => 'string_yesno',
1.521 raeburn 4707: discussvote => 'string_discussvote',
1.533 raeburn 4708: examcode => 'string_examcode',
1.514 raeburn 4709: );
4710: if (exists($stringtypes{$name})) {
1.533 raeburn 4711: if ($name eq 'examcode') {
1.535 raeburn 4712: $desc = $value;
1.533 raeburn 4713: } elsif (ref($strings{$stringtypes{$name}}) eq 'ARRAY') {
1.514 raeburn 4714: foreach my $possibilities (@{ $strings{$stringtypes{$name}} }) {
4715: next unless (ref($possibilities) eq 'ARRAY');
4716: my ($parmval, $description) = @{ $possibilities };
4717: if ($parmval eq $value) {
4718: $desc = $description;
4719: last;
4720: }
1.504 raeburn 4721: }
4722: }
4723: }
1.514 raeburn 4724: my $standard_name = &standard_parameter_names($name);
1.504 raeburn 4725: return '<p class="LC_warning">'.
1.514 raeburn 4726: &mt('[_1] was [_2]not[_3] set to [_4].',
4727: $standard_name,'<b>','</b>','"'.$desc.'"').'<br />'.
1.504 raeburn 4728: &mt('LON-CAPA version ([_1]) installed on home server ([_2]) does not meet version requirements ([_3] or newer).',
4729: $cmajor.'.'.$cminor,$chostname,
4730: $needsrelease).
4731: '</p>';
4732: }
1.259 banghart 4733:
1.30 www 4734: sub handler {
1.43 albertel 4735: my $r=shift;
1.30 www 4736:
1.376 albertel 4737: &reset_caches();
4738:
1.414 droeschl 4739: &Apache::loncommon::content_type($r,'text/html');
4740: $r->send_http_header;
4741: return OK if $r->header_only;
4742:
1.193 albertel 4743: &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
1.473 amueller 4744: ['action','state',
1.205 www 4745: 'pres_marker',
4746: 'pres_value',
1.206 www 4747: 'pres_type',
1.506 www 4748: 'filter','part',
1.390 www 4749: 'udom','uname','symb','serial','timebase']);
1.131 www 4750:
1.83 bowersj2 4751:
1.193 albertel 4752: &Apache::lonhtmlcommon::clear_breadcrumbs();
1.194 albertel 4753: &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/parmset",
1.507 www 4754: text=>"Content and Problem Settings",
1.473 amueller 4755: faq=>10,
4756: bug=>'Instructor Interface',
1.442 droeschl 4757: help =>
4758: 'Parameter_Manager,Course_Environment,Parameter_Helper,Parameter_Overview,Table_Mode'});
1.203 www 4759:
1.30 www 4760: # ----------------------------------------------------- Needs to be in a course
1.194 albertel 4761: my $parm_permission =
1.473 amueller 4762: (&Apache::lonnet::allowed('opa',$env{'request.course.id'}) ||
4763: &Apache::lonnet::allowed('opa',$env{'request.course.id'}.'/'.
4764: $env{'request.course.sec'}));
1.355 albertel 4765: my $exists = &check_for_course_info();
4766:
4767: if ($env{'request.course.id'} && $parm_permission && $exists) {
1.193 albertel 4768: #
4769: # Main switch on form.action and form.state, as appropriate
4770: #
4771: # Check first if coming from someone else headed directly for
4772: # the table mode
4773: if ((($env{'form.command'} eq 'set') && ($env{'form.url'})
1.473 amueller 4774: && (!$env{'form.dis'})) || ($env{'form.symb'})) {
4775: &assessparms($r);
1.193 albertel 4776: } elsif (! exists($env{'form.action'})) {
4777: &print_main_menu($r,$parm_permission);
1.414 droeschl 4778: } elsif ($env{'form.action'} eq 'setoverview') {
1.473 amueller 4779: &overview($r);
4780: } elsif ($env{'form.action'} eq 'addmetadata') {
4781: &addmetafield($r);
4782: } elsif ($env{'form.action'} eq 'ordermetadata') {
4783: &order_meta_fields($r);
1.414 droeschl 4784: } elsif ($env{'form.action'} eq 'setrestrictmeta') {
1.473 amueller 4785: &setrestrictmeta($r);
1.414 droeschl 4786: } elsif ($env{'form.action'} eq 'newoverview') {
1.473 amueller 4787: &newoverview($r);
1.414 droeschl 4788: } elsif ($env{'form.action'} eq 'setdefaults') {
1.473 amueller 4789: &defaultsetter($r);
4790: } elsif ($env{'form.action'} eq 'settable') {
4791: &assessparms($r);
1.414 droeschl 4792: } elsif ($env{'form.action'} eq 'parameterchangelog') {
1.473 amueller 4793: &parm_change_log($r);
1.414 droeschl 4794: } elsif ($env{'form.action'} eq 'cleanparameters') {
1.473 amueller 4795: &clean_parameters($r);
1.414 droeschl 4796: } elsif ($env{'form.action'} eq 'dateshift1') {
1.390 www 4797: &date_shift_one($r);
1.414 droeschl 4798: } elsif ($env{'form.action'} eq 'dateshift2') {
1.390 www 4799: &date_shift_two($r);
1.446 bisitz 4800: }
1.43 albertel 4801: } else {
1.1 www 4802: # ----------------------------- Not in a course, or not allowed to modify parms
1.473 amueller 4803: if ($exists) {
4804: $env{'user.error.msg'}=
4805: "/adm/parmset:opa:0:0:Cannot modify assessment parameters";
4806: } else {
4807: $env{'user.error.msg'}=
4808: "/adm/parmset::0:1:Course environment gone, reinitialize the course";
4809: }
4810: return HTTP_NOT_ACCEPTABLE;
1.43 albertel 4811: }
1.376 albertel 4812: &reset_caches();
4813:
1.43 albertel 4814: return OK;
1.1 www 4815: }
4816:
4817: 1;
4818: __END__
4819:
4820:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>