Annotation of loncom/interface/lonparmset.pm, revision 1.536
1.1 www 1: # The LearningOnline Network with CAPA
2: # Handler to set parameters for assessments
3: #
1.536 ! raeburn 4: # $Id: lonparmset.pm,v 1.535 2013/06/27 18:22:07 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').'"'
779: .' title="'.&mt('Change').'" />';
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=
2091: '<span class="LC_error">'.&mt("Unknown ID")." '$id' ".
2092: &mt('at domain')." '$udom'</span>";
2093: }
1.43 albertel 2094: } else {
1.473 amueller 2095: $uname=$env{'form.uname'};
1.43 albertel 2096: }
2097: unless ($udom) { $uname=''; }
2098: $uhome='';
2099: if ($uname) {
1.473 amueller 2100: $uhome=&Apache::lonnet::homeserver($uname,$udom);
1.43 albertel 2101: if ($uhome eq 'no_host') {
1.473 amueller 2102: $message=
2103: '<span class="LC_error">'.&mt("Unknown user")." '$uname' ".
2104: &mt("at domain")." '$udom'</span>";
2105: $uname='';
1.12 www 2106: } else {
1.473 amueller 2107: $csec=&Apache::lonnet::getsection($udom,$uname,
2108: $env{'request.course.id'});
2109: if ($csec eq '-1') {
2110: $message='<span class="LC_error">'.
2111: &mt("User")." '$uname' ".&mt("at domain")." '$udom' ".
2112: &mt("not in this course")."</span>";
2113: $uname='';
2114: $csec=$env{'form.csec'};
1.269 raeburn 2115: $cgroup=$env{'form.cgroup'};
1.473 amueller 2116: } else {
2117: my %name=&Apache::lonnet::userenvironment($udom,$uname,
2118: ('firstname','middlename','lastname','generation','id'));
2119: $message="\n<p>\n".&mt("Full Name").": ".
2120: $name{'firstname'}.' '.$name{'middlename'}.' '
2121: .$name{'lastname'}.' '.$name{'generation'}.
1.501 bisitz 2122: "<br />\n".&mt('Student/Employee ID').": ".$name{'id'}.'<p>';
1.473 amueller 2123: }
1.297 raeburn 2124: @usersgroups = &Apache::lonnet::get_users_groups(
1.275 raeburn 2125: $udom,$uname,$env{'request.course.id'});
1.297 raeburn 2126: if (@usersgroups > 0) {
1.306 albertel 2127: unless (grep(/^\Q$cgroup\E$/,@usersgroups)) {
1.275 raeburn 2128: $cgroup = $usersgroups[0];
1.297 raeburn 2129: }
1.269 raeburn 2130: }
1.12 www 2131: }
1.43 albertel 2132: }
1.2 www 2133:
1.43 albertel 2134: unless ($csec) { $csec=''; }
1.269 raeburn 2135: unless ($cgroup) { $cgroup=''; }
1.12 www 2136:
1.14 www 2137: # --------------------------------------------------------- Get all assessments
1.446 bisitz 2138: &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps,
1.473 amueller 2139: \%mapp, \%symbp,\%maptitles,\%uris,
2140: \%keyorder);
1.63 bowersj2 2141:
1.57 albertel 2142: $mapp{'0.0'} = '';
2143: $symbp{'0.0'} = '';
1.99 albertel 2144:
1.14 www 2145: # ---------------------------------------------------------- Anything to store?
1.190 albertel 2146: if ($env{'form.pres_marker'}) {
1.205 www 2147: my @markers=split(/\&\&\&/,$env{'form.pres_marker'});
2148: my @values=split(/\&\&\&/,$env{'form.pres_value'});
2149: my @types=split(/\&\&\&/,$env{'form.pres_type'});
1.500 raeburn 2150: my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
2151: my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
1.504 raeburn 2152: my $chome = $env{'course.'.$env{'request.course.id'}.'.home'};
2153: my ($got_chostname,$chostname,$cmajor,$cminor);
2154: my $totalstored = 0;
1.512 foxr 2155:
2156:
1.473 amueller 2157: for (my $i=0;$i<=$#markers;$i++) {
1.514 raeburn 2158: my ($needsrelease,$needsnewer,$name);
1.437 raeburn 2159: if ($markers[$i] =~ /^[\d.]+\&0_availablestudent\&(1|2|3)$/) {
2160: my (@ok_slots,@fail_slots,@del_slots);
2161: my $courseopt=&Apache::lonnet::get_courseresdata($cnum,$cdom);
2162: my ($level,@all) =
2163: &parmval_by_symb('0.availablestudent',$pssymb,'',$uname,$udom,
2164: $csec,$cgroup,$courseopt);
2165: foreach my $slot_name (split(/:/,$values[$i])) {
2166: next if ($slot_name eq '');
2167: if (&update_slots($slot_name,$cdom,$cnum,$pssymb,$uname,$udom) eq 'ok') {
2168: push(@ok_slots,$slot_name);
2169:
2170: } else {
2171: push(@fail_slots,$slot_name);
2172: }
2173: }
2174: if (@ok_slots) {
2175: $values[$i] = join(':',@ok_slots);
2176: } else {
2177: $values[$i] = '';
2178: }
2179: if ($all[$level] ne '') {
2180: my @existing = split(/:/,$all[$level]);
2181: foreach my $slot_name (@existing) {
2182: if (!grep(/^\Q$slot_name\E$/,split(/:/,$values[$i]))) {
2183: if (&delete_slots($slot_name,$cdom,$cnum,$uname,$udom,$pssymb) eq 'ok') {
2184: push(@del_slots,$slot_name);
2185: }
2186: }
2187: }
2188: }
1.533 raeburn 2189: } elsif ($markers[$i] =~ /_(type|lenient|retrypartial|discussvote|examcode)\&\d+$/) {
1.514 raeburn 2190: $name = $1;
1.533 raeburn 2191: my $val = $values[$i];
2192: if ($name eq 'examcode') {
2193: if (&Apache::lonnet::validCODE($values[$i])) {
2194: $val = 'valid';
2195: }
2196: }
1.504 raeburn 2197: $needsrelease =
1.533 raeburn 2198: $Apache::lonnet::needsrelease{"parameter:$name:$val"};
1.504 raeburn 2199: if ($needsrelease) {
1.505 raeburn 2200: unless ($got_chostname) {
1.514 raeburn 2201: ($chostname,$cmajor,$cminor) = ¶meter_release_vars();
1.504 raeburn 2202: $got_chostname = 1;
2203: }
1.534 raeburn 2204: $needsnewer = ¶meter_releasecheck($name,$val,
1.514 raeburn 2205: $needsrelease,
2206: $chostname,
2207: $cmajor,$cminor);
1.500 raeburn 2208: }
1.437 raeburn 2209: }
1.504 raeburn 2210: if ($needsnewer) {
1.514 raeburn 2211: $message .= &oldversion_warning($name,$values[$i],$chostname,$cmajor,
1.504 raeburn 2212: $cminor,$needsrelease);
2213: } else {
2214: $message.=&storeparm(split(/\&/,$markers[$i]),
2215: $values[$i],
2216: $types[$i],
2217: $uname,$udom,$csec,$cgroup);
2218: $totalstored ++;
2219: }
1.473 amueller 2220: }
1.68 www 2221: # ---------------------------------------------------------------- Done storing
1.504 raeburn 2222: if ($totalstored) {
2223: $message.='<p class="LC_warning">'
2224: .&mt('Changes can take up to 10 minutes before being active for all students.')
2225: .&Apache::loncommon::help_open_topic('Caching')
2226: .'</p>';
2227: }
1.68 www 2228: }
1.57 albertel 2229: #----------------------------------------------- if all selected, fill in array
1.209 www 2230: if ($pscat[0] eq "all") {@pscat = (keys %allparms);}
1.501 bisitz 2231: if (!@pscat) { @pscat=('duedate','opendate','answerdate','weight','maxtries','type','problemstatus') };
1.57 albertel 2232: if ($psprt[0] eq "all" || !@psprt) {@psprt = (keys %allparts);}
1.2 www 2233: # ------------------------------------------------------------------ Start page
1.63 bowersj2 2234:
1.531 raeburn 2235: my $crstype = &Apache::loncommon::course_type();
2236: &startpage($r,$pssymb,$crstype);
1.57 albertel 2237:
1.44 albertel 2238: foreach ('tolerance','date_default','date_start','date_end',
1.473 amueller 2239: 'date_interval','int','float','string') {
2240: $r->print('<input type="hidden" value="'.
2241: &HTML::Entities::encode($env{'form.recent_'.$_},'"&<>').
2242: '" name="recent_'.$_.'" />');
1.44 albertel 2243: }
1.446 bisitz 2244:
1.459 bisitz 2245: # ----- Start Parameter Selection
2246:
2247: # Hide parm selection?
2248: $r->print(<<ENDPARMSELSCRIPT);
2249: <script type="text/javascript">
2250: // <![CDATA[
2251: function parmsel_show() {
2252: document.getElementById('parmsel').style.display = "";
2253: document.getElementById('parmsellink').style.display = "none";
2254: }
2255: // ]]>
2256: </script>
2257: ENDPARMSELSCRIPT
1.474 amueller 2258:
1.445 neumanie 2259: if (!$pssymb) {
1.486 www 2260: my $parmselhiddenstyle=' style="display:none"';
2261: if($env{'form.hideparmsel'} eq 'hidden') {
2262: $r->print('<div id="parmsel"'.$parmselhiddenstyle.'>');
2263: } else {
2264: $r->print('<div id="parmsel">');
2265: }
2266:
1.491 bisitz 2267: # Step 1
1.523 raeburn 2268: $r->print(&Apache::lonhtmlcommon::topic_bar(1,&mt('Resource Specification'),'parmstep1'));
2269: $r->print('
1.474 amueller 2270: <script type="text/javascript">
1.523 raeburn 2271: // <![CDATA['.
2272: &showhide_js().'
1.474 amueller 2273: // ]]>
2274: </script>
1.523 raeburn 2275: ');
2276: $r->print(&Apache::lonhtmlcommon::start_pick_box(undef,'parmlevel'));
1.209 www 2277: &levelmenu($r,\%alllevs,$parmlev);
1.491 bisitz 2278: $r->print(&Apache::lonhtmlcommon::row_closure());
1.474 amueller 2279: &mapmenu($r,\%allmaps,$pschp,\%maptitles, \%symbp);
1.491 bisitz 2280: $r->print(&Apache::lonhtmlcommon::row_closure());
2281: $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parts to View')));
2282: &partmenu($r,\%allparts,\@psprt);
1.474 amueller 2283: $r->print(&Apache::lonhtmlcommon::row_closure(1));
2284: $r->print(&Apache::lonhtmlcommon::end_pick_box());
1.491 bisitz 2285:
2286: # Step 2
1.523 raeburn 2287: $r->print(&Apache::lonhtmlcommon::topic_bar(2,&mt('Parameter Specification'),'parmstep2'));
1.536 ! raeburn 2288: &displaymenu($r,\%allparms,\@pscat,\@psprt,\%keyorder,'parmmenuscroll');
1.491 bisitz 2289:
2290: # Step 3
1.523 raeburn 2291: $r->print(&Apache::lonhtmlcommon::topic_bar(3,&mt('User Specification (optional)'),'parmstep3'));
1.486 www 2292: $r->print(&Apache::lonhtmlcommon::start_pick_box());
2293: &usermenu($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,\@usersgroups);
2294: $r->print(&Apache::lonhtmlcommon::row_closure(1));
2295: $r->print(&Apache::lonhtmlcommon::end_pick_box());
1.491 bisitz 2296:
2297: # Update Display Button
1.486 www 2298: $r->print('<p>'
2299: .'<input type="submit" name="dis"'
1.511 www 2300: .' value="'.&mt('Update Display').'" />'
1.486 www 2301: .'<input type="hidden" name="hideparmsel" value="hidden" />'
2302: .'</p>');
2303: $r->print('</div>');
1.491 bisitz 2304:
1.486 www 2305: # Offer link to display parameter selection again
2306: $r->print('<p id="parmsellink"');
2307: if ($env{'form.hideparmsel'} ne 'hidden') {
2308: $r->print($parmselhiddenstyle);
2309: }
2310: $r->print('>'
2311: .'<a href="javascript:parmsel_show()">'
2312: .&mt('Change Parameter Selection')
2313: .'</a>'
2314: .'</p>');
1.44 albertel 2315: } else {
1.478 amueller 2316: # parameter screen for a single resource.
1.486 www 2317: my ($map,$iid,$resource)=&Apache::lonnet::decode_symb($pssymb);
1.473 amueller 2318: my $title = &Apache::lonnet::gettitle($pssymb);
1.501 bisitz 2319: $r->print(&mt('Specific Resource: [_1] ([_2])',
2320: $title,'<span class="LC_filename">'.$resource.'</span>').
1.472 amueller 2321: '<input type="hidden" value="'.$pssymb.'" name="symb" />'.
1.486 www 2322: '<br />');
2323: $r->print(&Apache::lonhtmlcommon::topic_bar('',&mt('Additional Display Specification (optional)')));
2324: $r->print(&Apache::lonhtmlcommon::start_pick_box());
2325: &usermenu($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,\@usersgroups);
2326: $r->print(&Apache::lonhtmlcommon::row_closure(1));
2327: $r->print(&Apache::lonhtmlcommon::end_pick_box());
2328: $r->print('<p>'
1.459 bisitz 2329: .'<input type="submit" name="dis"'
1.511 www 2330: .' value="'.&mt('Update Display').'" />'
1.459 bisitz 2331: .'<input type="hidden" name="hideparmsel" value="hidden" />'
1.486 www 2332: .'</p>');
1.459 bisitz 2333: }
1.478 amueller 2334:
1.486 www 2335: # ----- End Parameter Selection
1.57 albertel 2336:
1.459 bisitz 2337: # Display Messages
2338: $r->print('<div>'.$message.'</div>');
1.210 www 2339:
1.57 albertel 2340:
2341: my @temp_pscat;
2342: map {
2343: my $cat = $_;
2344: push(@temp_pscat, map { $_.'.'.$cat } @psprt);
2345: } @pscat;
2346:
2347: @pscat = @temp_pscat;
2348:
1.209 www 2349: if (($env{'form.prevvisit'}) || ($pschp) || ($pssymb)) {
1.10 www 2350: # ----------------------------------------------------------------- Start Table
1.57 albertel 2351: my @catmarker=map { tr|.|_|; 'parameter_'.$_; } @pscat;
1.190 albertel 2352: my $csuname=$env{'user.name'};
2353: my $csudom=$env{'user.domain'};
1.57 albertel 2354:
1.203 www 2355: if ($parmlev eq 'full') {
1.506 www 2356: #
2357: # This produces the cascading table output of parameters
2358: #
1.473 amueller 2359: my $coursespan=$csec?8:5;
2360: my $userspan=3;
2361: if ($cgroup ne '') {
2362: $coursespan += 3;
2363: }
2364:
1.517 www 2365: $r->print(&Apache::loncommon::start_data_table());
1.506 www 2366: #
2367: # This produces the headers
2368: #
1.473 amueller 2369: $r->print('<tr><td colspan="5"></td>');
2370: $r->print('<th colspan="'.($coursespan).'">'.&mt('Any User').'</th>');
2371: if ($uname) {
2372: if (@usersgroups > 1) {
2373: $userspan ++;
2374: }
2375: $r->print('<th colspan="'.$userspan.'" rowspan="2">');
2376: $r->print(&mt("User")." $uname ".&mt('at Domain')." $udom</th>");
2377: }
2378: my %lt=&Apache::lonlocal::texthash(
2379: 'pie' => "Parameter in Effect",
2380: 'csv' => "Current Session Value",
1.472 amueller 2381: 'rl' => "Resource Level",
1.473 amueller 2382: 'ic' => 'in Course',
2383: 'aut' => "Assessment URL and Title",
2384: 'type' => 'Type',
2385: 'emof' => "Enclosing Map or Folder",
2386: 'part' => 'Part',
1.472 amueller 2387: 'pn' => 'Parameter Name',
1.473 amueller 2388: 'def' => 'default',
2389: 'femof' => 'from Enclosing Map or Folder',
2390: 'gen' => 'general',
2391: 'foremf' => 'for Enclosing Map or Folder',
2392: 'fr' => 'for Resource'
2393: );
2394: $r->print(<<ENDTABLETWO);
1.419 bisitz 2395: <th rowspan="3">$lt{'pie'}</th>
1.501 bisitz 2396: <th rowspan="3">$lt{'csv'}<br />($csuname:$csudom)</th>
1.419 bisitz 2397: </tr><tr><td colspan="5"></td><th colspan="2">$lt{'ic'}</th><th colspan="2">$lt{'rl'}</th>
2398: <th colspan="1">$lt{'ic'}</th>
1.182 albertel 2399:
1.10 www 2400: ENDTABLETWO
1.473 amueller 2401: if ($csec) {
2402: $r->print('<th colspan="3">'.
2403: &mt("in Section")." $csec</th>");
2404: }
2405: if ($cgroup) {
1.419 bisitz 2406: $r->print('<th colspan="3">'.
1.472 amueller 2407: &mt("in Group")." $cgroup</th>");
1.473 amueller 2408: }
2409: $r->print(<<ENDTABLEHEADFOUR);
1.133 www 2410: </tr><tr><th>$lt{'aut'}</th><th>$lt{'type'}</th>
2411: <th>$lt{'emof'}</th><th>$lt{'part'}</th><th>$lt{'pn'}</th>
1.192 albertel 2412: <th>$lt{'gen'}</th><th>$lt{'foremf'}</th>
2413: <th>$lt{'def'}</th><th>$lt{'femof'}</th><th>$lt{'fr'}</th>
1.10 www 2414: ENDTABLEHEADFOUR
1.57 albertel 2415:
1.473 amueller 2416: if ($csec) {
2417: $r->print('<th>'.&mt('general').'</th><th>'.&mt('for Enclosing Map or Folder').'</th><th>'.&mt('for Resource').'</th>');
2418: }
2419:
2420: if ($cgroup) {
2421: $r->print('<th>'.&mt('general').'</th><th>'.&mt('for Enclosing Map or Folder').'</th><th>'.&mt('for Resource').'</th>');
2422: }
2423:
2424: if ($uname) {
2425: if (@usersgroups > 1) {
2426: $r->print('<th>'.&mt('Control by other group?').'</th>');
2427: }
2428: $r->print('<th>'.&mt('general').'</th><th>'.&mt('for Enclosing Map or Folder').'</th><th>'.&mt('for Resource').'</th>');
2429: }
2430:
2431: $r->print('</tr>');
1.506 www 2432: #
2433: # Done with the headers
2434: #
1.473 amueller 2435: my $defbgone='';
2436: my $defbgtwo='';
2437: my $defbgthree = '';
1.57 albertel 2438:
1.531 raeburn 2439: foreach my $rid (@ids) {
1.57 albertel 2440:
2441: my ($inmapid)=($rid=~/\.(\d+)$/);
2442:
1.446 bisitz 2443: if ((!$pssymb &&
1.473 amueller 2444: (($pschp eq 'all') || ($allmaps{$pschp} eq $mapp{$rid})))
2445: ||
2446: ($pssymb && $pssymb eq $symbp{$rid})) {
1.4 www 2447: # ------------------------------------------------------ Entry for one resource
1.473 amueller 2448: if ($defbgone eq '#E0E099') {
2449: $defbgone='#E0E0DD';
1.57 albertel 2450: } else {
1.419 bisitz 2451: $defbgone='#E0E099';
1.57 albertel 2452: }
1.419 bisitz 2453: if ($defbgtwo eq '#FFFF99') {
1.473 amueller 2454: $defbgtwo='#FFFFDD';
1.57 albertel 2455: } else {
1.473 amueller 2456: $defbgtwo='#FFFF99';
1.57 albertel 2457: }
1.419 bisitz 2458: if ($defbgthree eq '#FFBB99') {
2459: $defbgthree='#FFBBDD';
1.269 raeburn 2460: } else {
1.419 bisitz 2461: $defbgthree='#FFBB99';
1.269 raeburn 2462: }
2463:
1.57 albertel 2464: my $thistitle='';
2465: my %name= ();
2466: undef %name;
2467: my %part= ();
2468: my %display=();
2469: my %type= ();
2470: my %default=();
1.196 www 2471: my $uri=&Apache::lonnet::declutter($uris{$rid});
1.57 albertel 2472:
1.506 www 2473: my $filter=$env{'form.filter'};
1.210 www 2474: foreach (&keysplit($keyp{$rid})) {
1.57 albertel 2475: my $tempkeyp = $_;
2476: if (grep $_ eq $tempkeyp, @catmarker) {
1.506 www 2477: my $parmname=&Apache::lonnet::metadata($uri,$_.'.name');
2478: # We may only want certain parameters listed
2479: if ($filter) {
2480: unless ($filter=~/\Q$parmname\E/) { next; }
2481: }
2482: $name{$_}=$parmname;
1.57 albertel 2483: $part{$_}=&Apache::lonnet::metadata($uri,$_.'.part');
1.506 www 2484:
1.433 raeburn 2485: my $parmdis=&Apache::lonnet::metadata($uri,$_.'.display');
2486: if ($allparms{$name{$_}} ne '') {
2487: my $identifier;
2488: if ($parmdis =~ /(\s*\[Part.*)$/) {
2489: $identifier = $1;
2490: }
2491: $display{$_} = $allparms{$name{$_}}.$identifier;
2492: } else {
2493: $display{$_} = $parmdis;
2494: }
1.57 albertel 2495: unless ($display{$_}) { $display{$_}=''; }
2496: $display{$_}.=' ('.$name{$_}.')';
2497: $default{$_}=&Apache::lonnet::metadata($uri,$_);
2498: $type{$_}=&Apache::lonnet::metadata($uri,$_.'.type');
2499: $thistitle=&Apache::lonnet::metadata($uri,$_.'.title');
2500: }
2501: }
2502: my $totalparms=scalar keys %name;
2503: if ($totalparms>0) {
1.473 amueller 2504: my $firstrow=1;
2505: my $title=&Apache::lonnet::gettitle($symbp{$rid});
1.419 bisitz 2506: $r->print('<tr><td style="background-color:'.$defbgone.';"'.
1.57 albertel 2507: ' rowspan='.$totalparms.
1.419 bisitz 2508: '><tt><font size="-1">'.
1.57 albertel 2509: join(' / ',split(/\//,$uri)).
2510: '</font></tt><p><b>'.
1.154 albertel 2511: "<a href=\"javascript:openWindow('".
1.473 amueller 2512: &Apache::lonnet::clutter($uri).'?symb='.
2513: &escape($symbp{$rid}).
1.336 albertel 2514: "', 'metadatafile', '450', '500', 'no', 'yes');\"".
2515: " target=\"_self\">$title");
1.57 albertel 2516:
2517: if ($thistitle) {
1.473 amueller 2518: $r->print(' ('.$thistitle.')');
1.57 albertel 2519: }
2520: $r->print('</a></b></td>');
1.419 bisitz 2521: $r->print('<td style="background-color:'.$defbgtwo.';"'.
1.57 albertel 2522: ' rowspan='.$totalparms.'>'.$typep{$rid}.
2523: '</td>');
2524:
1.419 bisitz 2525: $r->print('<td style="background-color:'.$defbgone.';"'.
1.57 albertel 2526: ' rowspan='.$totalparms.
1.238 www 2527: '>'.$maptitles{$mapp{$rid}}.'</td>');
1.512 foxr 2528: foreach (&keysinorder_bytype(\%name,\%keyorder)) {
1.57 albertel 2529:
2530: unless ($firstrow) {
2531: $r->print('<tr>');
2532: } else {
2533: undef $firstrow;
2534: }
1.201 www 2535: &print_row($r,$_,\%part,\%name,\%symbp,$rid,\%default,
1.57 albertel 2536: \%type,\%display,$defbgone,$defbgtwo,
1.269 raeburn 2537: $defbgthree,$parmlev,$uname,$udom,$csec,
1.275 raeburn 2538: $cgroup,\@usersgroups);
1.57 albertel 2539: }
2540: }
2541: }
2542: } # end foreach ids
1.43 albertel 2543: # -------------------------------------------------- End entry for one resource
1.517 www 2544: $r->print(&Apache::loncommon::end_data_table);
1.203 www 2545: } # end of full
1.57 albertel 2546: #--------------------------------------------------- Entry for parm level map
2547: if ($parmlev eq 'map') {
1.419 bisitz 2548: my $defbgone = '#E0E099';
2549: my $defbgtwo = '#FFFF99';
2550: my $defbgthree = '#FFBB99';
1.57 albertel 2551:
2552: my %maplist;
2553:
2554: if ($pschp eq 'all') {
1.446 bisitz 2555: %maplist = %allmaps;
1.57 albertel 2556: } else {
2557: %maplist = ($pschp => $mapp{$pschp});
2558: }
2559:
2560: #-------------------------------------------- for each map, gather information
2561: my $mapid;
1.473 amueller 2562: foreach $mapid (sort {$maplist{$a} cmp $maplist{$b}} keys %maplist) {
1.60 albertel 2563: my $maptitle = $maplist{$mapid};
1.57 albertel 2564:
2565: #----------------------- loop through ids and get all parameter types for map
2566: #----------------------------------------- and associated information
2567: my %name = ();
2568: my %part = ();
2569: my %display = ();
2570: my %type = ();
2571: my %default = ();
2572: my $map = 0;
2573:
1.473 amueller 2574: # $r->print("Catmarker: @catmarker<br />\n");
1.446 bisitz 2575:
1.57 albertel 2576: foreach (@ids) {
1.473 amueller 2577: ($map)=(/([\d]*?)\./);
2578: my $rid = $_;
1.446 bisitz 2579:
1.57 albertel 2580: # $r->print("$mapid:$map: $rid <br /> \n");
2581:
1.473 amueller 2582: if ($map eq $mapid) {
2583: my $uri=&Apache::lonnet::declutter($uris{$rid});
1.57 albertel 2584: # $r->print("Keys: $keyp{$rid} <br />\n");
2585:
2586: #--------------------------------------------------------------------
2587: # @catmarker contains list of all possible parameters including part #s
2588: # $fullkeyp contains the full part/id # for the extraction of proper parameters
2589: # $tempkeyp contains part 0 only (no ids - ie, subparts)
2590: # When storing information, store as part 0
2591: # When requesting information, request from full part
2592: #-------------------------------------------------------------------
1.473 amueller 2593: foreach (&keysplit($keyp{$rid})) {
2594: my $tempkeyp = $_;
2595: my $fullkeyp = $tempkeyp;
2596: $tempkeyp =~ s/_\w+_/_0_/;
2597:
2598: if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {
2599: $part{$tempkeyp}="0";
2600: $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name');
2601: my $parmdis=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');
2602: if ($allparms{$name{$tempkeyp}} ne '') {
2603: my $identifier;
2604: if ($parmdis =~ /(\s*\[Part.*)$/) {
2605: $identifier = $1;
2606: }
2607: $display{$tempkeyp} = $allparms{$name{$tempkeyp}}.$identifier;
2608: } else {
2609: $display{$tempkeyp} = $parmdis;
2610: }
2611: unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; }
2612: $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')';
2613: $display{$tempkeyp} =~ s/_\w+_/_0_/;
2614: $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp);
2615: $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.type');
2616: }
2617: } # end loop through keys
2618: }
1.57 albertel 2619: } # end loop through ids
1.446 bisitz 2620:
1.57 albertel 2621: #---------------------------------------------------- print header information
1.133 www 2622: my $foldermap=&mt($maptitle=~/^uploaded/?'Folder':'Map');
1.82 www 2623: my $showtitle=$maptitles{$maptitle}.($maptitle!~/^uploaded/?' ['.$maptitle.']':'');
1.401 bisitz 2624: my $tmp="";
1.57 albertel 2625: if ($uname) {
1.473 amueller 2626: my $person=&Apache::loncommon::plainname($uname,$udom);
1.401 bisitz 2627: $tmp.=&mt("User")." <font color=\"red\"><i>$uname \($person\) </i></font> ".
2628: &mt('in')." \n";
1.57 albertel 2629: } else {
1.401 bisitz 2630: $tmp.="<font color=\"red\"><i>".&mt('all').'</i></font> '.&mt('users in')." \n";
1.57 albertel 2631: }
1.269 raeburn 2632: if ($cgroup) {
1.401 bisitz 2633: $tmp.=&mt("Group")." <font color=\"red\"><i>$cgroup".
2634: "</i></font> ".&mt('of')." \n";
1.269 raeburn 2635: $csec = '';
2636: } elsif ($csec) {
1.401 bisitz 2637: $tmp.=&mt("Section")." <font color=\"red\"><i>$csec".
2638: "</i></font> ".&mt('of')." \n";
1.269 raeburn 2639: }
1.401 bisitz 2640: $r->print('<div align="center"><h4>'
2641: .&mt('Set Defaults for All Resources in [_1]Specifically for [_2][_3]'
1.404 bisitz 2642: ,$foldermap.'<br /><font color="red"><i>'.$showtitle.'</i></font><br />'
1.401 bisitz 2643: ,$tmp
2644: ,'<font color="red"><i>'.$coursename.'</i></font>'
2645: )
2646: ."<br /></h4>\n"
1.422 bisitz 2647: );
1.57 albertel 2648: #---------------------------------------------------------------- print table
1.419 bisitz 2649: $r->print('<p>'.&Apache::loncommon::start_data_table()
2650: .&Apache::loncommon::start_data_table_header_row()
2651: .'<th>'.&mt('Parameter Name').'</th>'
2652: .'<th>'.&mt('Default Value').'</th>'
2653: .'<th>'.&mt('Parameter in Effect').'</th>'
2654: .&Apache::loncommon::end_data_table_header_row()
2655: );
1.57 albertel 2656:
1.473 amueller 2657: foreach (&keysinorder(\%name,\%keyorder)) {
2658: $r->print(&Apache::loncommon::start_data_table_row());
1.201 www 2659: &print_row($r,$_,\%part,\%name,\%symbp,$mapid,\%default,
1.269 raeburn 2660: \%type,\%display,$defbgone,$defbgtwo,$defbgthree,
2661: $parmlev,$uname,$udom,$csec,$cgroup);
1.57 albertel 2662: }
1.422 bisitz 2663: $r->print(&Apache::loncommon::end_data_table().'</p>'
2664: .'</div>'
2665: );
1.57 albertel 2666: } # end each map
2667: } # end of $parmlev eq map
2668: #--------------------------------- Entry for parm level general (Course level)
2669: if ($parmlev eq 'general') {
1.473 amueller 2670: my $defbgone = '#E0E099';
1.419 bisitz 2671: my $defbgtwo = '#FFFF99';
2672: my $defbgthree = '#FFBB99';
1.57 albertel 2673:
2674: #-------------------------------------------- for each map, gather information
2675: my $mapid="0.0";
2676: #----------------------- loop through ids and get all parameter types for map
2677: #----------------------------------------- and associated information
2678: my %name = ();
2679: my %part = ();
2680: my %display = ();
2681: my %type = ();
2682: my %default = ();
1.446 bisitz 2683:
1.57 albertel 2684: foreach (@ids) {
2685: my $rid = $_;
1.446 bisitz 2686:
1.196 www 2687: my $uri=&Apache::lonnet::declutter($uris{$rid});
1.57 albertel 2688:
2689: #--------------------------------------------------------------------
2690: # @catmarker contains list of all possible parameters including part #s
2691: # $fullkeyp contains the full part/id # for the extraction of proper parameters
2692: # $tempkeyp contains part 0 only (no ids - ie, subparts)
2693: # When storing information, store as part 0
2694: # When requesting information, request from full part
2695: #-------------------------------------------------------------------
1.473 amueller 2696: foreach (&keysplit($keyp{$rid})) {
2697: my $tempkeyp = $_;
2698: my $fullkeyp = $tempkeyp;
2699: $tempkeyp =~ s/_\w+_/_0_/;
2700: if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {
2701: $part{$tempkeyp}="0";
2702: $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name');
2703: my $parmdis=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');
2704: if ($allparms{$name{$tempkeyp}} ne '') {
2705: my $identifier;
2706: if ($parmdis =~ /(\s*\[Part.*)$/) {
2707: $identifier = $1;
2708: }
2709: $display{$tempkeyp} = $allparms{$name{$tempkeyp}}.$identifier;
2710: } else {
2711: $display{$tempkeyp} = $parmdis;
2712: }
2713: unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; }
2714: $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')';
2715: $display{$tempkeyp} =~ s/_\w+_/_0_/;
2716: $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp);
2717: $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.type');
2718: }
1.57 albertel 2719: } # end loop through keys
2720: } # end loop through ids
1.446 bisitz 2721:
1.57 albertel 2722: #---------------------------------------------------- print header information
1.473 amueller 2723: my $setdef=&mt("Set Defaults for All Resources in Course");
1.57 albertel 2724: $r->print(<<ENDMAPONE);
1.419 bisitz 2725: <center>
2726: <h4>$setdef
1.135 albertel 2727: <font color="red"><i>$coursename</i></font><br />
1.57 albertel 2728: ENDMAPONE
2729: if ($uname) {
1.473 amueller 2730: my $person=&Apache::loncommon::plainname($uname,$udom);
1.135 albertel 2731: $r->print(" ".&mt("User")."<font color=\"red\"> <i>$uname \($person\) </i></font> \n");
1.57 albertel 2732: } else {
1.135 albertel 2733: $r->print("<i><font color=\"red\"> ".&mt("ALL")."</i> ".&mt("USERS")."</font> \n");
1.57 albertel 2734: }
1.446 bisitz 2735:
1.135 albertel 2736: if ($csec) {$r->print(&mt("Section")."<font color=\"red\"> <i>$csec</i></font>\n")};
1.306 albertel 2737: if ($cgroup) {$r->print(&mt("Group")."<font color=\"red\"> <i>$cgroup</i></font>\n")};
1.135 albertel 2738: $r->print("</h4>\n");
1.57 albertel 2739: #---------------------------------------------------------------- print table
1.419 bisitz 2740: $r->print('<p>'.&Apache::loncommon::start_data_table()
2741: .&Apache::loncommon::start_data_table_header_row()
2742: .'<th>'.&mt('Parameter Name').'</th>'
2743: .'<th>'.&mt('Default Value').'</th>'
2744: .'<th>'.&mt('Parameter in Effect').'</th>'
2745: .&Apache::loncommon::end_data_table_header_row()
2746: );
1.57 albertel 2747:
1.473 amueller 2748: foreach (&keysinorder(\%name,\%keyorder)) {
1.419 bisitz 2749: $r->print(&Apache::loncommon::start_data_table_row());
1.201 www 2750: &print_row($r,$_,\%part,\%name,\%symbp,$mapid,\%default,
1.269 raeburn 2751: \%type,\%display,$defbgone,$defbgtwo,$defbgthree,
2752: $parmlev,$uname,$udom,$csec,$cgroup);
1.57 albertel 2753: }
1.419 bisitz 2754: $r->print(&Apache::loncommon::end_data_table()
2755: .'</p>'
2756: .'</center>'
2757: );
1.57 albertel 2758: } # end of $parmlev eq general
1.43 albertel 2759: }
1.507 www 2760: $r->print('</form>');
2761: &endSettingsScreen($r);
2762: $r->print(&Apache::loncommon::end_page());
1.57 albertel 2763: } # end sub assessparms
1.30 www 2764:
1.120 www 2765: ##################################################
1.207 www 2766: # Overview mode
2767: ##################################################
1.124 www 2768: my $tableopen;
2769:
2770: sub tablestart {
2771: if ($tableopen) {
1.473 amueller 2772: return '';
1.124 www 2773: } else {
1.473 amueller 2774: $tableopen=1;
2775: return &Apache::loncommon::start_data_table().'<tr><th>'.&mt('Parameter').'</th><th>'.
2776: &mt('Delete').'</th><th>'.&mt('Set to ...').'</th></tr>';
1.124 www 2777: }
2778: }
2779:
2780: sub tableend {
2781: if ($tableopen) {
1.473 amueller 2782: $tableopen=0;
2783: return &Apache::loncommon::end_data_table();
1.124 www 2784: } else {
1.473 amueller 2785: return'';
1.124 www 2786: }
2787: }
2788:
1.207 www 2789: sub readdata {
2790: my ($crs,$dom)=@_;
2791: # Read coursedata
2792: my $resourcedata=&Apache::lonnet::get_courseresdata($crs,$dom);
2793: # Read userdata
2794:
2795: my $classlist=&Apache::loncoursedata::get_classlist();
2796: foreach (keys %$classlist) {
1.350 albertel 2797: if ($_=~/^($match_username)\:($match_domain)$/) {
1.473 amueller 2798: my ($tuname,$tudom)=($1,$2);
2799: my $useropt=&Apache::lonnet::get_userresdata($tuname,$tudom);
1.207 www 2800: foreach my $userkey (keys %{$useropt}) {
1.473 amueller 2801: if ($userkey=~/^$env{'request.course.id'}/) {
1.207 www 2802: my $newkey=$userkey;
1.473 amueller 2803: $newkey=~s/^($env{'request.course.id'}\.)/$1\[useropt\:$tuname\:$tudom\]\./;
2804: $$resourcedata{$newkey}=$$useropt{$userkey};
2805: }
2806: }
2807: }
1.207 www 2808: }
2809: return $resourcedata;
2810: }
2811:
2812:
1.124 www 2813: # Setting
1.208 www 2814:
2815: sub storedata {
2816: my ($r,$crs,$dom)=@_;
1.207 www 2817: # Set userlevel immediately
2818: # Do an intermediate store of course level
2819: my $olddata=&readdata($crs,$dom);
1.124 www 2820: my %newdata=();
2821: undef %newdata;
2822: my @deldata=();
2823: undef @deldata;
1.504 raeburn 2824: my ($got_chostname,$chostname,$cmajor,$cminor);
2825: foreach my $key (keys(%env)) {
2826: if ($key =~ /^form\.([a-z]+)\_(.+)$/) {
1.473 amueller 2827: my $cmd=$1;
2828: my $thiskey=$2;
2829: my ($tuname,$tudom)=&extractuser($thiskey);
2830: my $tkey=$thiskey;
2831: if ($tuname) {
2832: $tkey=~s/\.\[useropt\:$tuname\:$tudom\]\./\./;
2833: }
2834: if ($cmd eq 'set' || $cmd eq 'datepointer' || $cmd eq 'dateinterval') {
1.514 raeburn 2835: my ($data, $typeof, $text, $name);
1.473 amueller 2836: if ($cmd eq 'set') {
1.504 raeburn 2837: $data=$env{$key};
1.473 amueller 2838: $typeof=$env{'form.typeof_'.$thiskey};
2839: $text = &mt('Saved modified parameter for');
1.504 raeburn 2840: if ($typeof eq 'string_questiontype') {
1.514 raeburn 2841: $name = 'type';
2842: } elsif ($typeof eq 'string_lenient') {
2843: $name = 'lenient';
1.521 raeburn 2844: } elsif ($typeof eq 'string_discussvote') {
2845: $name = 'discussvote';
1.533 raeburn 2846: } elsif ($typeof eq 'string_examcode') {
2847: $name = 'examcode';
1.519 raeburn 2848: } elsif ($typeof eq 'string_yesno') {
2849: if ($thiskey =~ /\.retrypartial$/) {
2850: $name = 'retrypartial';
2851: }
1.514 raeburn 2852: }
2853: if ($name ne '') {
1.504 raeburn 2854: my ($needsrelease,$needsnewer);
1.514 raeburn 2855: $needsrelease = $Apache::lonnet::needsrelease{"parameter:$name:$data"};
1.504 raeburn 2856: if ($needsrelease) {
2857: unless ($got_chostname) {
1.514 raeburn 2858: ($chostname,$cmajor,$cminor)=¶meter_release_vars();
1.504 raeburn 2859: $got_chostname = 1;
2860: }
1.514 raeburn 2861: $needsnewer = ¶meter_releasecheck($name,$data,
2862: $needsrelease,
2863: $chostname,$cmajor,
2864: $cminor);
1.504 raeburn 2865: }
2866: if ($needsnewer) {
1.514 raeburn 2867: $r->print('<br />'.&oldversion_warning($name,$data,
2868: $chostname,$cmajor,
1.504 raeburn 2869: $cminor,$needsrelease));
2870: next;
2871: }
2872: }
1.473 amueller 2873: } elsif ($cmd eq 'datepointer') {
1.504 raeburn 2874: $data=&Apache::lonhtmlcommon::get_date_from_form($env{$key});
1.473 amueller 2875: $typeof=$env{'form.typeof_'.$thiskey};
2876: $text = &mt('Saved modified date for');
2877: } elsif ($cmd eq 'dateinterval') {
2878: $data=&get_date_interval_from_form($thiskey);
2879: $typeof=$env{'form.typeof_'.$thiskey};
2880: $text = &mt('Saved modified date for');
2881: }
2882: if (defined($data) and $$olddata{$thiskey} ne $data) {
1.207 www 2883: if ($tuname) {
1.473 amueller 2884: if (&Apache::lonnet::put('resourcedata',{$tkey=>$data,
2885: $tkey.'.type' => $typeof},
2886: $tudom,$tuname) eq 'ok') {
2887: &log_parmset({$tkey=>$data,$tkey.'.type' => $typeof},0,$tuname,$tudom);
2888: $r->print('<br />'.$text.' '.
2889: &Apache::loncommon::plainname($tuname,$tudom));
2890: } else {
2891: $r->print('<div class="LC_error">'.
2892: &mt('Error saving parameters').'</div>');
2893: }
2894: &Apache::lonnet::devalidateuserresdata($tuname,$tudom);
2895: } else {
2896: $newdata{$thiskey}=$data;
2897: $newdata{$thiskey.'.type'}=$typeof;
1.446 bisitz 2898: }
1.473 amueller 2899: }
2900: } elsif ($cmd eq 'del') {
2901: if ($tuname) {
2902: if (&Apache::lonnet::del('resourcedata',[$tkey],$tudom,$tuname) eq 'ok') {
2903: &log_parmset({$tkey=>''},1,$tuname,$tudom);
2904: $r->print('<br />'.&mt('Deleted parameter for').' '.&Apache::loncommon::plainname($tuname,$tudom));
2905: } else {
2906: $r->print('<div class="LC_error">'.
2907: &mt('Error deleting parameters').'</div>');
2908: }
2909: &Apache::lonnet::devalidateuserresdata($tuname,$tudom);
2910: } else {
2911: push (@deldata,$thiskey,$thiskey.'.type');
2912: }
2913: }
2914: }
1.124 www 2915: }
1.207 www 2916: # Store all course level
1.144 www 2917: my $delentries=$#deldata+1;
2918: my @newdatakeys=keys %newdata;
2919: my $putentries=$#newdatakeys+1;
2920: if ($delentries) {
1.473 amueller 2921: if (&Apache::lonnet::del('resourcedata',\@deldata,$dom,$crs) eq 'ok') {
2922: my %loghash=map { $_ => '' } @deldata;
2923: &log_parmset(\%loghash,1);
1.529 raeburn 2924: $r->print('<h2>'.&mt('Deleted [_1] parameter(s)',$delentries).'</h2>');
1.473 amueller 2925: } else {
2926: $r->print('<div class="LC_error">'.
2927: &mt('Error deleting parameters').'</div>');
2928: }
2929: &Apache::lonnet::devalidatecourseresdata($crs,$dom);
1.144 www 2930: }
2931: if ($putentries) {
1.473 amueller 2932: if (&Apache::lonnet::put('resourcedata',\%newdata,$dom,$crs) eq 'ok') {
2933: &log_parmset(\%newdata,0);
2934: $r->print('<h3>'.&mt('Saved [_1] parameter(s)',$putentries/2).'</h3>');
2935: } else {
2936: $r->print('<div class="LC_error">'.
2937: &mt('Error saving parameters').'</div>');
2938: }
2939: &Apache::lonnet::devalidatecourseresdata($crs,$dom);
1.144 www 2940: }
1.208 www 2941: }
1.207 www 2942:
1.208 www 2943: sub extractuser {
2944: my $key=shift;
1.350 albertel 2945: return ($key=~/^$env{'request.course.id'}.\[useropt\:($match_username)\:($match_domain)\]\./);
1.208 www 2946: }
1.206 www 2947:
1.381 albertel 2948: sub parse_listdata_key {
2949: my ($key,$listdata) = @_;
2950: # split into student/section affected, and
2951: # the realm (folder/resource part and parameter
1.446 bisitz 2952: my ($student,$realm) =
1.473 amueller 2953: ($key=~/^\Q$env{'request.course.id'}\E\.\[([^\.]+)\]\.(.+)$/);
1.381 albertel 2954: # if course wide student would be undefined
2955: if (!defined($student)) {
1.473 amueller 2956: ($realm)=($key=~/^\Q$env{'request.course.id'}\E\.(.+)$/);
1.381 albertel 2957: }
2958: # strip off the .type if it's not the Question type parameter
2959: if ($realm=~/\.type$/ && !exists($listdata->{$key.'.type'})) {
1.473 amueller 2960: $realm=~s/\.type//;
1.381 albertel 2961: }
2962: # split into resource+part and parameter name
1.388 albertel 2963: my ($res, $parm) = ($realm=~/^(.*)\.(.*)$/);
2964: ($res, my $part) = ($res =~/^(.*)\.(.*)$/);
1.381 albertel 2965: return ($student,$res,$part,$parm);
2966: }
2967:
1.208 www 2968: sub listdata {
1.214 www 2969: my ($r,$resourcedata,$listdata,$sortorder)=@_;
1.207 www 2970: # Start list output
1.206 www 2971:
1.122 www 2972: my $oldsection='';
2973: my $oldrealm='';
2974: my $oldpart='';
1.123 www 2975: my $pointer=0;
1.124 www 2976: $tableopen=0;
1.145 www 2977: my $foundkeys=0;
1.248 albertel 2978: my %keyorder=&standardkeyorder();
1.381 albertel 2979:
1.214 www 2980: foreach my $thiskey (sort {
1.473 amueller 2981: my ($astudent,$ares,$apart,$aparm) = &parse_listdata_key($a,$listdata);
2982: my ($bstudent,$bres,$bpart,$bparm) = &parse_listdata_key($b,$listdata);
1.381 albertel 2983:
1.473 amueller 2984: # get the numerical order for the param
2985: $aparm=$keyorder{'parameter_0_'.$aparm};
2986: $bparm=$keyorder{'parameter_0_'.$bparm};
1.381 albertel 2987:
1.473 amueller 2988: my $result=0;
1.381 albertel 2989:
1.473 amueller 2990: if ($sortorder eq 'realmstudent') {
1.381 albertel 2991: if ($ares ne $bres ) {
1.473 amueller 2992: $result = ($ares cmp $bres);
1.446 bisitz 2993: } elsif ($astudent ne $bstudent) {
1.473 amueller 2994: $result = ($astudent cmp $bstudent);
2995: } elsif ($apart ne $bpart ) {
2996: $result = ($apart cmp $bpart);
2997: }
2998: } else {
2999: if ($astudent ne $bstudent) {
3000: $result = ($astudent cmp $bstudent);
3001: } elsif ($ares ne $bres ) {
3002: $result = ($ares cmp $bres);
3003: } elsif ($apart ne $bpart ) {
3004: $result = ($apart cmp $bpart);
3005: }
3006: }
1.446 bisitz 3007:
1.473 amueller 3008: if (!$result) {
1.381 albertel 3009: if (defined($aparm) && defined($bparm)) {
1.473 amueller 3010: $result = ($aparm <=> $bparm);
1.381 albertel 3011: } elsif (defined($aparm)) {
1.473 amueller 3012: $result = -1;
1.381 albertel 3013: } elsif (defined($bparm)) {
1.473 amueller 3014: $result = 1;
3015: }
3016: }
1.381 albertel 3017:
1.473 amueller 3018: $result;
1.214 www 3019: } keys %{$listdata}) {
1.381 albertel 3020:
1.473 amueller 3021: if ($$listdata{$thiskey.'.type'}) {
1.211 www 3022: my $thistype=$$listdata{$thiskey.'.type'};
3023: if ($$resourcedata{$thiskey.'.type'}) {
1.473 amueller 3024: $thistype=$$resourcedata{$thiskey.'.type'};
3025: }
3026: my ($middle,$part,$name)=
3027: ($thiskey=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);
3028: my $section=&mt('All Students');
3029: if ($middle=~/^\[(.*)\]/) {
3030: my $issection=$1;
3031: if ($issection=~/^useropt\:($match_username)\:($match_domain)/) {
3032: $section=&mt('User').": ".&Apache::loncommon::plainname($1,$2);
3033: } else {
3034: $section=&mt('Group/Section').': '.$issection;
3035: }
3036: $middle=~s/^\[(.*)\]//;
3037: }
3038: $middle=~s/\.+$//;
3039: $middle=~s/^\.+//;
3040: my $realm='<span class="LC_parm_scope_all">'.&mt('All Resources').'</span>';
3041: if ($middle=~/^(.+)\_\_\_\(all\)$/) {
3042: $realm='<span class="LC_parm_scope_folder">'.&mt('Folder/Map').': '.&Apache::lonnet::gettitle($1).' <br /><span class="LC_parm_folder">('.$1.')</span></span>';
3043: } elsif ($middle) {
3044: my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle);
3045: $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>';
3046: }
3047: if ($sortorder eq 'realmstudent') {
3048: if ($realm ne $oldrealm) {
3049: $r->print(&tableend()."\n<hr /><h1>$realm</h1>");
3050: $oldrealm=$realm;
3051: $oldsection='';
3052: }
3053: if ($section ne $oldsection) {
3054: $r->print(&tableend()."\n<h2>$section</h2>");
3055: $oldsection=$section;
3056: $oldpart='';
3057: }
3058: } else {
3059: if ($section ne $oldsection) {
3060: $r->print(&tableend()."\n<hr /><h1>$section</h1>");
3061: $oldsection=$section;
3062: $oldrealm='';
3063: }
3064: if ($realm ne $oldrealm) {
3065: $r->print(&tableend()."\n<h2>$realm</h2>");
3066: $oldrealm=$realm;
3067: $oldpart='';
3068: }
3069: }
3070: if ($part ne $oldpart) {
3071: $r->print(&tableend().
3072: "\n".'<span class="LC_parm_part">'.&mt('Part').": $part</span>");
3073: $oldpart=$part;
3074: }
1.123 www 3075: #
3076: # Ready to print
3077: #
1.470 raeburn 3078: my $parmitem = &standard_parameter_names($name);
1.473 amueller 3079: $r->print(&tablestart().
3080: &Apache::loncommon::start_data_table_row().
3081: '<td><b>'.&mt($parmitem).
3082: '</b></td><td><input type="checkbox" name="del_'.
3083: $thiskey.'" /></td><td>');
3084: $foundkeys++;
3085: if (&isdateparm($thistype)) {
3086: my $jskey='key_'.$pointer;
3087: $pointer++;
3088: $r->print(
3089: &Apache::lonhtmlcommon::date_setter('parmform',
3090: $jskey,
3091: $$resourcedata{$thiskey},
3092: '',1,'','').
1.277 www 3093: '<input type="hidden" name="datepointer_'.$thiskey.'" value="'.$jskey.'" />'.
1.413 bisitz 3094: (($$resourcedata{$thiskey}!=0)?'<span class="LC_nobreak"><a href="/adm/parmset?&action=dateshift1&timebase='.$$resourcedata{$thiskey}.'">'.
3095: &mt('Shift all dates based on this date').'</a></span>':'').
1.277 www 3096: &date_sanity_info($$resourcedata{$thiskey})
1.473 amueller 3097: );
3098: } elsif ($thistype eq 'date_interval') {
3099: $r->print(&date_interval_selector($thiskey,
3100: $$resourcedata{$thiskey}));
3101: } elsif ($thistype =~ m/^string/) {
3102: $r->print(&string_selector($thistype,$thiskey,
1.514 raeburn 3103: $$resourcedata{$thiskey},$name));
1.473 amueller 3104: } else {
3105: $r->print(&default_selector($thiskey,$$resourcedata{$thiskey}));
3106: }
3107: $r->print('<input type="hidden" name="typeof_'.$thiskey.'" value="'.
3108: $thistype.'" />');
3109: $r->print('</td>'.&Apache::loncommon::end_data_table_row());
3110: }
1.121 www 3111: }
1.208 www 3112: return $foundkeys;
3113: }
3114:
1.385 albertel 3115:
3116: sub date_interval_selector {
3117: my ($thiskey, $showval) = @_;
3118: my $result;
3119: foreach my $which (['days', 86400, 31],
1.473 amueller 3120: ['hours', 3600, 23],
3121: ['minutes', 60, 59],
3122: ['seconds', 1, 59]) {
3123: my ($name, $factor, $max) = @{ $which };
3124: my $amount = int($showval/$factor);
3125: $showval %= $factor;
3126: my %select = ((map {$_ => $_} (0..$max)),
3127: 'select_form_order' => [0..$max]);
3128: $result .= &Apache::loncommon::select_form($amount,$name.'_'.$thiskey,
1.496 raeburn 3129: \%select);
1.473 amueller 3130: $result .= ' '.&mt($name);
1.385 albertel 3131: }
3132: $result .= '<input type="hidden" name="dateinterval_'.$thiskey.'" />';
3133: return $result;
3134:
3135: }
3136:
3137: sub get_date_interval_from_form {
3138: my ($key) = @_;
3139: my $seconds = 0;
3140: foreach my $which (['days', 86400],
1.473 amueller 3141: ['hours', 3600],
3142: ['minutes', 60],
3143: ['seconds', 1]) {
3144: my ($name, $factor) = @{ $which };
3145: if (defined($env{'form.'.$name.'_'.$key})) {
3146: $seconds += $env{'form.'.$name.'_'.$key} * $factor;
3147: }
1.385 albertel 3148: }
3149: return $seconds;
3150: }
3151:
3152:
1.383 albertel 3153: sub default_selector {
3154: my ($thiskey, $showval) = @_;
1.385 albertel 3155: return '<input type="text" name="set_'.$thiskey.'" value="'.$showval.'" />';
1.383 albertel 3156: }
3157:
1.446 bisitz 3158: my %strings =
1.383 albertel 3159: (
3160: 'string_yesno'
3161: => [[ 'yes', 'Yes' ],
1.473 amueller 3162: [ 'no', 'No' ]],
1.383 albertel 3163: 'string_problemstatus'
3164: => [[ 'yes', 'Yes' ],
1.473 amueller 3165: [ 'answer', 'Yes, and show correct answer if they exceed the maximum number of tries.' ],
3166: [ 'no', 'No, don\'t show correct/incorrect feedback.' ],
3167: [ 'no_feedback_ever', 'No, show no feedback at all.' ]],
1.504 raeburn 3168: 'string_questiontype'
3169: => [[ 'problem', 'Standard Problem'],
3170: [ 'survey', 'Survey'],
3171: [ 'anonsurveycred', 'Anonymous Survey (credit for submission)'],
1.530 bisitz 3172: [ 'exam', 'Bubblesheet Exam'],
1.504 raeburn 3173: [ 'anonsurvey', 'Anonymous Survey'],
3174: [ 'randomizetry', 'New Randomization Each N Tries (default N=1)'],
3175: [ 'practice', 'Practice'],
3176: [ 'surveycred', 'Survey (credit for submission)']],
1.514 raeburn 3177: 'string_lenient'
3178: => [['yes', 'Yes' ],
3179: [ 'no', 'No' ],
1.521 raeburn 3180: [ 'default', 'Default - only bubblesheet grading is lenient' ]],
3181: 'string_discussvote'
3182: => [['yes','Yes'],
3183: ['notended','Yes, unless discussion ended'],
3184: ['no','No']],
1.383 albertel 3185: );
3186:
1.505 raeburn 3187: sub standard_string_options {
3188: my ($string_type) = @_;
3189: if (ref($strings{$string_type}) eq 'ARRAY') {
3190: return $strings{$string_type};
3191: }
3192: return;
3193: }
1.383 albertel 3194:
3195: sub string_selector {
1.514 raeburn 3196: my ($thistype, $thiskey, $showval, $name) = @_;
1.446 bisitz 3197:
1.383 albertel 3198: if (!exists($strings{$thistype})) {
1.473 amueller 3199: return &default_selector($thiskey,$showval);
1.383 albertel 3200: }
3201:
1.504 raeburn 3202: my %skiptype;
1.514 raeburn 3203: if (($thistype eq 'string_questiontype') ||
1.519 raeburn 3204: ($thistype eq 'string_lenient') ||
1.521 raeburn 3205: ($thistype eq 'string_discussvote') ||
1.519 raeburn 3206: ($name eq 'retrypartial')) {
1.504 raeburn 3207: my ($got_chostname,$chostname,$cmajor,$cminor);
3208: foreach my $possibilities (@{ $strings{$thistype} }) {
3209: next unless (ref($possibilities) eq 'ARRAY');
1.514 raeburn 3210: my ($parmval, $description) = @{ $possibilities };
3211: my $needsrelease=$Apache::lonnet::needsrelease{"parameter:$name:$parmval"};
1.504 raeburn 3212: if ($needsrelease) {
3213: unless ($got_chostname) {
1.514 raeburn 3214: ($chostname,$cmajor,$cminor)=¶meter_release_vars();
1.504 raeburn 3215: $got_chostname = 1;
3216: }
1.514 raeburn 3217: my $needsnewer=¶meter_releasecheck($name,$parmval,$needsrelease,
3218: $chostname,$cmajor,
3219: $cminor);
1.504 raeburn 3220: if ($needsnewer) {
1.514 raeburn 3221: $skiptype{$parmval} = 1;
1.504 raeburn 3222: }
3223: }
3224: }
3225: }
1.514 raeburn 3226:
1.504 raeburn 3227:
1.383 albertel 3228: my $result;
1.504 raeburn 3229: my $numinrow = 3;
3230: if ($thistype eq 'string_problemstatus') {
3231: $numinrow = 2;
3232: } elsif ($thistype eq 'string_questiontype') {
3233: if (keys(%skiptype) > 0) {
3234: $numinrow = 4;
3235: }
3236: }
3237: my $rem;
3238: if (ref($strings{$thistype}) eq 'ARRAY') {
3239: my $i=0;
3240: foreach my $possibilities (@{ $strings{$thistype} }) {
3241: next unless (ref($possibilities) eq 'ARRAY');
3242: my ($name, $description) = @{ $possibilities };
3243: next if ($skiptype{$name});
3244: $rem = $i%($numinrow);
3245: if ($rem == 0) {
3246: if ($i > 0) {
3247: $result .= '</tr>';
3248: }
3249: $result .= '<tr>';
3250: }
3251: $result .= '<td class="LC_left_item">'.
3252: '<span class="LC_nobreak"><label>'.
3253: '<input type="radio" name="set_'.$thiskey.
3254: '" value="'.$name.'"';
3255: if ($showval eq $name) {
3256: $result .= ' checked="checked"';
3257: }
3258: $result .= ' />'.&mt($description).'</label></span></td>';
3259: $i++;
3260: }
3261: $rem = @{ $strings{$thistype} }%($numinrow);
3262: my $colsleft = $numinrow - $rem;
3263: if ($colsleft > 1 ) {
3264: $result .= '<td colspan="'.$colsleft.'" class="LC_left_item">'.
3265: ' </td>';
3266: } elsif ($colsleft == 1) {
3267: $result .= '<td class="LC_left_item"> </td>';
3268: }
3269: $result .= '</tr>';
1.473 amueller 3270: }
1.504 raeburn 3271: if ($result) {
3272: $result = '<table border="0">'.$result.'</table>';
1.383 albertel 3273: }
3274: return $result;
3275: }
3276:
1.389 www 3277: #
3278: # Shift all start and end dates by $shift
3279: #
3280:
3281: sub dateshift {
3282: my ($shift)=@_;
3283: my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
3284: my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
3285: my %data=&Apache::lonnet::dump('resourcedata',$dom,$crs);
3286: # ugly retro fix for broken version of types
3287: foreach my $key (keys %data) {
3288: if ($key=~/\wtype$/) {
3289: my $newkey=$key;
3290: $newkey=~s/type$/\.type/;
3291: $data{$newkey}=$data{$key};
3292: delete $data{$key};
3293: }
3294: }
1.391 www 3295: my %storecontent=();
1.389 www 3296: # go through all parameters and look for dates
3297: foreach my $key (keys %data) {
3298: if ($data{$key.'.type'}=~/^date_(start|end)$/) {
3299: my $newdate=$data{$key}+$shift;
1.391 www 3300: $storecontent{$key}=$newdate;
1.389 www 3301: }
3302: }
1.391 www 3303: my $reply=&Apache::lonnet::cput
3304: ('resourcedata',\%storecontent,$dom,$crs);
3305: if ($reply eq 'ok') {
3306: &log_parmset(\%storecontent);
3307: }
3308: &Apache::lonnet::devalidatecourseresdata($crs,$dom);
3309: return $reply;
1.389 www 3310: }
3311:
1.208 www 3312: sub newoverview {
1.280 albertel 3313: my ($r) = @_;
3314:
1.208 www 3315: my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
3316: my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.531 raeburn 3317: my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'};
1.414 droeschl 3318: &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview',
1.473 amueller 3319: text=>"Overview Mode"});
1.523 raeburn 3320:
3321: my %loaditems = (
3322: 'onload' => "showHide_courseContent(); resize_scrollbox('mapmenuscroll','1','1');",
3323: );
3324: my $js = '
3325: <script type="text/javascript">
3326: // <![CDATA[
3327: '.
3328: &Apache::lonhtmlcommon::resize_scrollbox_js('params')."\n".
3329: &showhide_js()."\n".
3330: '// ]]>
3331: </script>
3332: ';
3333: my $start_page = &Apache::loncommon::start_page('Set Parameters',$js,
3334: {'add_entries' => \%loaditems,});
1.298 albertel 3335: my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Overview');
1.507 www 3336: $r->print($start_page.$breadcrumbs);
1.531 raeburn 3337: &startSettingsScreen($r,'parmset',$crstype);
1.208 www 3338: $r->print(<<ENDOVER);
1.232 albertel 3339: <form method="post" action="/adm/parmset?action=newoverview" name="parmform">
1.208 www 3340: ENDOVER
1.211 www 3341: my @ids=();
3342: my %typep=();
3343: my %keyp=();
3344: my %allparms=();
3345: my %allparts=();
3346: my %allmaps=();
3347: my %mapp=();
3348: my %symbp=();
3349: my %maptitles=();
3350: my %uris=();
3351: my %keyorder=&standardkeyorder();
3352: my %defkeytype=();
3353:
3354: my %alllevs=();
3355: $alllevs{'Resource Level'}='full';
1.215 www 3356: $alllevs{'Map/Folder Level'}='map';
1.211 www 3357: $alllevs{'Course Level'}='general';
3358:
3359: my $csec=$env{'form.csec'};
1.269 raeburn 3360: my $cgroup=$env{'form.cgroup'};
1.211 www 3361:
3362: my @pscat=&Apache::loncommon::get_env_multiple('form.pscat');
3363: my $pschp=$env{'form.pschp'};
1.506 www 3364:
1.211 www 3365: my @psprt=&Apache::loncommon::get_env_multiple('form.psprt');
1.516 www 3366: if (!@psprt) { $psprt[0]='all'; }
1.211 www 3367:
1.446 bisitz 3368: my @selected_sections =
1.473 amueller 3369: &Apache::loncommon::get_env_multiple('form.Section');
1.211 www 3370: @selected_sections = ('all') if (! @selected_sections);
1.374 albertel 3371: foreach my $sec (@selected_sections) {
3372: if ($sec eq 'all') {
1.211 www 3373: @selected_sections = ('all');
3374: }
3375: }
1.269 raeburn 3376: my @selected_groups =
3377: &Apache::loncommon::get_env_multiple('form.Group');
1.211 www 3378:
3379: my $pssymb='';
3380: my $parmlev='';
1.446 bisitz 3381:
1.211 www 3382: unless ($env{'form.parmlev'}) {
3383: $parmlev = 'map';
3384: } else {
3385: $parmlev = $env{'form.parmlev'};
3386: }
3387:
1.446 bisitz 3388: &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps,
1.473 amueller 3389: \%mapp, \%symbp,\%maptitles,\%uris,
3390: \%keyorder,\%defkeytype);
1.211 www 3391:
1.374 albertel 3392: if (grep {$_ eq 'all'} (@psprt)) {
1.481 amueller 3393: @psprt = keys(%allparts);
1.374 albertel 3394: }
1.211 www 3395: # Menu to select levels, etc
3396:
1.456 bisitz 3397: $r->print('<div class="LC_Box">');
1.445 neumanie 3398: #$r->print('<h2 class="LC_hcell">Step 1</h2>');
1.452 bisitz 3399: $r->print('<div>');
1.523 raeburn 3400: $r->print(&Apache::lonhtmlcommon::start_pick_box(undef,'parmlevel'));
1.211 www 3401: &levelmenu($r,\%alllevs,$parmlev);
3402: if ($parmlev ne 'general') {
1.447 bisitz 3403: $r->print(&Apache::lonhtmlcommon::row_closure());
1.483 amueller 3404: &mapmenu($r,\%allmaps,$pschp,\%maptitles,\%symbp);
1.211 www 3405: }
1.447 bisitz 3406: $r->print(&Apache::lonhtmlcommon::row_closure(1));
1.445 neumanie 3407: $r->print(&Apache::lonhtmlcommon::end_pick_box());
3408: $r->print('</div></div>');
1.446 bisitz 3409:
1.456 bisitz 3410: $r->print('<div class="LC_Box">');
1.452 bisitz 3411: $r->print('<div>');
1.510 www 3412: &displaymenu($r,\%allparms,\@pscat,\%keyorder);
1.453 schualex 3413: $r->print(&Apache::lonhtmlcommon::start_pick_box());
1.446 bisitz 3414: $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parts to View')));
1.481 amueller 3415: $r->print('<table>'.
1.317 albertel 3416: '<tr><th>'.&mt('Parts').'</th><th>'.&mt('Section(s)').
3417: '</th><th>'.&mt('Group(s)').'</th></tr><tr><td>');
1.211 www 3418: &partmenu($r,\%allparts,\@psprt);
1.317 albertel 3419: $r->print('</td><td>');
1.211 www 3420: §ionmenu($r,\@selected_sections);
1.317 albertel 3421: $r->print('</td><td>');
1.269 raeburn 3422: &groupmenu($r,\@selected_groups);
3423: $r->print('</td></tr></table>');
1.445 neumanie 3424: #$r->print('</td></tr></table>');
1.447 bisitz 3425: $r->print(&Apache::lonhtmlcommon::row_closure(1));
1.445 neumanie 3426: $r->print(&Apache::lonhtmlcommon::end_pick_box());
3427: $r->print('</div></div>');
3428:
1.456 bisitz 3429: $r->print('<div class="LC_Box">');
1.452 bisitz 3430: $r->print('<div>');
1.214 www 3431: my $sortorder=$env{'form.sortorder'};
3432: unless ($sortorder) { $sortorder='realmstudent'; }
3433: &sortmenu($r,$sortorder);
1.445 neumanie 3434: $r->print('</div></div>');
1.446 bisitz 3435:
1.214 www 3436: $r->print('<p><input type="submit" name="dis" value="'.&mt('Display').'" /></p>');
1.446 bisitz 3437:
1.211 www 3438: # Build the list data hash from the specified parms
3439:
3440: my $listdata;
3441: %{$listdata}=();
3442:
3443: foreach my $cat (@pscat) {
1.269 raeburn 3444: &secgroup_lister($cat,$pschp,$parmlev,$listdata,\@psprt,\@selected_sections,\%defkeytype,\%allmaps,\@ids,\%symbp);
3445: &secgroup_lister($cat,$pschp,$parmlev,$listdata,\@psprt,\@selected_groups,\%defkeytype,\%allmaps,\@ids,\%symbp);
1.211 www 3446: }
3447:
1.212 www 3448: if (($env{'form.store'}) || ($env{'form.dis'})) {
1.211 www 3449:
1.481 amueller 3450: if ($env{'form.store'}) { &storedata($r,$crs,$dom); }
1.211 www 3451:
3452: # Read modified data
3453:
1.481 amueller 3454: my $resourcedata=&readdata($crs,$dom);
1.211 www 3455:
3456: # List data
3457:
1.481 amueller 3458: &listdata($r,$resourcedata,$listdata,$sortorder);
1.211 www 3459: }
3460: $r->print(&tableend().
1.473 amueller 3461: ((($env{'form.store'}) || ($env{'form.dis'}))?'<p><input type="submit" name="store" value="'.&mt('Save').'" /></p>':'').
1.507 www 3462: '</form>');
3463: &endSettingsScreen($r);
3464: $r->print(&Apache::loncommon::end_page());
1.208 www 3465: }
3466:
1.269 raeburn 3467: sub secgroup_lister {
3468: my ($cat,$pschp,$parmlev,$listdata,$psprt,$selections,$defkeytype,$allmaps,$ids,$symbp) = @_;
3469: foreach my $item (@{$selections}) {
3470: foreach my $part (@{$psprt}) {
3471: my $rootparmkey=$env{'request.course.id'};
3472: if (($item ne 'all') && ($item ne 'none') && ($item)) {
3473: $rootparmkey.='.['.$item.']';
3474: }
3475: if ($parmlev eq 'general') {
3476: # course-level parameter
3477: my $newparmkey=$rootparmkey.'.'.$part.'.'.$cat;
3478: $$listdata{$newparmkey}=1;
3479: $$listdata{$newparmkey.'.type'}=$$defkeytype{$cat};
3480: } elsif ($parmlev eq 'map') {
3481: # map-level parameter
3482: foreach my $mapid (keys %{$allmaps}) {
3483: if (($pschp ne 'all') && ($pschp ne $mapid)) { next; }
3484: my $newparmkey=$rootparmkey.'.'.$$allmaps{$mapid}.'___(all).'.$part.'.'.$cat;
3485: $$listdata{$newparmkey}=1;
3486: $$listdata{$newparmkey.'.type'}=$$defkeytype{$cat};
3487: }
3488: } else {
3489: # resource-level parameter
3490: foreach my $rid (@{$ids}) {
3491: my ($map,$resid,$url)=&Apache::lonnet::decode_symb($$symbp{$rid});
3492: if (($pschp ne 'all') && ($$allmaps{$pschp} ne $map)) { next; }
3493: my $newparmkey=$rootparmkey.'.'.$$symbp{$rid}.'.'.$part.'.'.$cat;
3494: $$listdata{$newparmkey}=1;
3495: $$listdata{$newparmkey.'.type'}=$$defkeytype{$cat};
3496: }
3497: }
3498: }
3499: }
3500: }
3501:
1.208 www 3502: sub overview {
1.280 albertel 3503: my ($r) = @_;
1.208 www 3504: my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
3505: my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.531 raeburn 3506: my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'};
1.280 albertel 3507:
1.414 droeschl 3508: &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview',
1.473 amueller 3509: text=>"Overview Mode"});
1.280 albertel 3510: my $start_page=&Apache::loncommon::start_page('Modify Parameters');
1.298 albertel 3511: my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Overview');
1.507 www 3512: $r->print($start_page.$breadcrumbs);
1.531 raeburn 3513: &startSettingsScreen($r,'parmset',$crstype);
1.507 www 3514: $r->print('<form method="post" action="/adm/parmset?action=setoverview" name="parmform">');
3515:
1.208 www 3516: # Store modified
3517:
3518: &storedata($r,$crs,$dom);
3519:
3520: # Read modified data
3521:
3522: my $resourcedata=&readdata($crs,$dom);
3523:
1.214 www 3524:
3525: my $sortorder=$env{'form.sortorder'};
3526: unless ($sortorder) { $sortorder='realmstudent'; }
3527: &sortmenu($r,$sortorder);
3528:
1.208 www 3529: # List data
3530:
1.214 www 3531: my $foundkeys=&listdata($r,$resourcedata,$resourcedata,$sortorder);
1.208 www 3532:
1.145 www 3533: $r->print(&tableend().'<p>'.
1.527 bisitz 3534: ($foundkeys?'<input type="submit" value="'.&mt('Save').'" />':'<span class="LC_info">'.&mt('There are no parameters.').'</span>').'</p></form>'.
1.473 amueller 3535: &Apache::loncommon::end_page());
1.120 www 3536: }
1.121 www 3537:
1.333 albertel 3538: sub clean_parameters {
3539: my ($r) = @_;
3540: my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
3541: my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
3542:
1.414 droeschl 3543: &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=cleanparameters',
1.473 amueller 3544: text=>"Clean Parameters"});
1.333 albertel 3545: my $start_page=&Apache::loncommon::start_page('Clean Parameters');
3546: my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Clean');
3547: $r->print(<<ENDOVER);
3548: $start_page
3549: $breadcrumbs
3550: <form method="post" action="/adm/parmset?action=cleanparameters" name="parmform">
3551: ENDOVER
3552: # Store modified
3553:
3554: &storedata($r,$crs,$dom);
3555:
3556: # Read modified data
3557:
3558: my $resourcedata=&readdata($crs,$dom);
3559:
3560: # List data
3561:
3562: $r->print('<h3>'.
1.473 amueller 3563: &mt('These parameters refer to resources that do not exist.').
3564: '</h3>'.
3565: '<input type="submit" value="'.&mt('Delete Selected').'" />'.'<br />'.
3566: '<br />');
1.333 albertel 3567: $r->print(&Apache::loncommon::start_data_table().
1.473 amueller 3568: '<tr>'.
3569: '<th>'.&mt('Delete').'</th>'.
3570: '<th>'.&mt('Parameter').'</th>'.
3571: '</tr>');
1.333 albertel 3572: foreach my $thiskey (sort(keys(%{$resourcedata}))) {
1.473 amueller 3573: next if (!exists($resourcedata->{$thiskey.'.type'})
3574: && $thiskey=~/\.type$/);
3575: my %data = &parse_key($thiskey);
3576: if (1) { #exists($data{'realm_exists'})
3577: #&& !$data{'realm_exists'}) {
3578: $r->print(&Apache::loncommon::start_data_table_row().
3579: '<tr>'.
3580: '<td><input type="checkbox" name="del_'.$thiskey.'" /></td>' );
3581:
3582: $r->print('<td>');
3583: my $display_value = $resourcedata->{$thiskey};
3584: if (&isdateparm($resourcedata->{$thiskey.'.type'})) {
3585: $display_value =
3586: &Apache::lonlocal::locallocaltime($display_value);
3587: }
1.470 raeburn 3588: my $parmitem = &standard_parameter_names($data{'parameter_name'});
3589: $parmitem = &mt($parmitem);
1.473 amueller 3590: $r->print(&mt('Parameter: "[_1]" with value: "[_2]"',
3591: $parmitem,$resourcedata->{$thiskey}));
3592: $r->print('<br />');
3593: if ($data{'scope_type'} eq 'all') {
3594: $r->print(&mt('All users'));
3595: } elsif ($data{'scope_type'} eq 'user') {
3596: $r->print(&mt('User: [_1]',join(':',@{$data{'scope'}})));
3597: } elsif ($data{'scope_type'} eq 'section') {
3598: $r->print(&mt('Section: [_1]',$data{'scope'}));
3599: } elsif ($data{'scope_type'} eq 'group') {
3600: $r->print(&mt('Group: [_1]',$data{'scope'}));
3601: }
3602: $r->print('<br />');
3603: if ($data{'realm_type'} eq 'all') {
3604: $r->print(&mt('All Resources'));
3605: } elsif ($data{'realm_type'} eq 'folder') {
3606: $r->print(&mt('Folder: [_1]'),$data{'realm'});
3607: } elsif ($data{'realm_type'} eq 'symb') {
3608: my ($map,$resid,$url) =
3609: &Apache::lonnet::decode_symb($data{'realm'});
1.529 raeburn 3610: $r->print(&mt('Resource: [_1]with ID: [_2]in folder [_3]',
3611: $url.' <br /> ',
3612: $resid.' <br /> ',$map));
1.473 amueller 3613: }
3614: $r->print(' <br /> '.&mt('Part: [_1]',$data{'parameter_part'}));
3615: $r->print('</td></tr>');
1.446 bisitz 3616:
1.473 amueller 3617: }
1.333 albertel 3618: }
3619: $r->print(&Apache::loncommon::end_data_table().'<p>'.
1.473 amueller 3620: '<input type="submit" value="'.&mt('Delete Selected').'" />'.
1.507 www 3621: '</p></form>');
3622: &endSettingsScreen($r);
3623: $r->print(&Apache::loncommon::end_page());
1.333 albertel 3624: }
3625:
1.390 www 3626: sub date_shift_one {
3627: my ($r) = @_;
3628: my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
3629: my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.531 raeburn 3630: my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'};
1.390 www 3631:
1.414 droeschl 3632: &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=dateshift1&timebase='.$env{'form.timebase'},
1.473 amueller 3633: text=>"Shifting Dates"});
1.390 www 3634: my $start_page=&Apache::loncommon::start_page('Shift Dates');
3635: my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Shift');
1.507 www 3636: $r->print($start_page.$breadcrumbs);
1.531 raeburn 3637: &startSettingsScreen($r,'parmset',$crstype);
1.390 www 3638: $r->print('<form name="shiftform" method="post">'.
3639: '<table><tr><td>'.&mt('Currently set date:').'</td><td>'.
3640: &Apache::lonlocal::locallocaltime($env{'form.timebase'}).'</td></tr>'.
3641: '<tr><td>'.&mt('Shifted date:').'</td><td>'.
1.512 foxr 3642: &Apache::lonhtmlcommon::dshowerfuck.net
3643: ate_setter('shiftform',
1.390 www 3644: 'timeshifted',
3645: $env{'form.timebase'},,
3646: '').
3647: '</td></tr></table>'.
3648: '<input type="hidden" name="action" value="dateshift2" />'.
3649: '<input type="hidden" name="timebase" value="'.$env{'form.timebase'}.'" />'.
3650: '<input type="submit" value="'.&mt('Shift all dates accordingly').'" /></form>');
1.507 www 3651: &endSettingsScreen($r);
1.390 www 3652: $r->print(&Apache::loncommon::end_page());
3653: }
3654:
3655: sub date_shift_two {
3656: my ($r) = @_;
3657: my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
3658: my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.531 raeburn 3659: my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'};
1.414 droeschl 3660: &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=dateshift1&timebase='.$env{'form.timebase'},
1.473 amueller 3661: text=>"Shifting Dates"});
1.390 www 3662: my $start_page=&Apache::loncommon::start_page('Shift Dates');
3663: my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Shift');
1.507 www 3664: $r->print($start_page.$breadcrumbs);
1.531 raeburn 3665: &startSettingsScreen($r,'parmset',$crstype);
1.390 www 3666: my $timeshifted=&Apache::lonhtmlcommon::get_date_from_form('timeshifted');
3667: $r->print(&mt('Shifting all dates such that [_1] becomes [_2]',
3668: &Apache::lonlocal::locallocaltime($env{'form.timebase'}),
3669: &Apache::lonlocal::locallocaltime($timeshifted)));
3670: my $delta=$timeshifted-$env{'form.timebase'};
3671: &dateshift($delta);
1.507 www 3672: &endSettingsScreen($r);
1.390 www 3673: $r->print(&Apache::loncommon::end_page());
3674: }
3675:
1.333 albertel 3676: sub parse_key {
3677: my ($key) = @_;
3678: my %data;
3679: my ($middle,$part,$name)=
1.473 amueller 3680: ($key=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);
1.333 albertel 3681: $data{'scope_type'} = 'all';
3682: if ($middle=~/^\[(.*)\]/) {
1.473 amueller 3683: $data{'scope'} = $1;
3684: if ($data{'scope'}=~/^useropt\:($match_username)\:($match_domain)/) {
3685: $data{'scope_type'} = 'user';
3686: $data{'scope'} = [$1,$2];
3687: } else {
3688: #FIXME check for group scope
3689: $data{'scope_type'} = 'section';
3690: }
3691: $middle=~s/^\[(.*)\]//;
1.333 albertel 3692: }
3693: $middle=~s/\.+$//;
3694: $middle=~s/^\.+//;
3695: $data{'realm_type'}='all';
3696: if ($middle=~/^(.+)\_\_\_\(all\)$/) {
1.473 amueller 3697: $data{'realm'} = $1;
3698: $data{'realm_type'} = 'folder';
3699: $data{'realm_title'} = &Apache::lonnet::gettitle($data{'realm'});
3700: ($data{'realm_exists'}) = &Apache::lonnet::is_on_map($data{'realm'});
1.333 albertel 3701: } elsif ($middle) {
1.473 amueller 3702: $data{'realm'} = $middle;
3703: $data{'realm_type'} = 'symb';
3704: $data{'realm_title'} = &Apache::lonnet::gettitle($data{'realm'});
3705: my ($map,$resid,$url) = &Apache::lonnet::decode_symb($data{'realm'});
3706: $data{'realm_exists'} = &Apache::lonnet::symbverify($data{'realm'},$url);
1.333 albertel 3707: }
1.446 bisitz 3708:
1.333 albertel 3709: $data{'parameter_part'} = $part;
3710: $data{'parameter_name'} = $name;
3711:
3712: return %data;
3713: }
3714:
1.239 raeburn 3715:
1.416 jms 3716: sub header {
1.507 www 3717: return &Apache::loncommon::start_page('Settings');
1.416 jms 3718: }
1.193 albertel 3719:
3720:
3721:
3722: sub print_main_menu {
3723: my ($r,$parm_permission)=@_;
3724: #
1.414 droeschl 3725: $r->print(&header());
1.507 www 3726: $r->print(&Apache::lonhtmlcommon::breadcrumbs('Content and Problem Settings'));
1.531 raeburn 3727: my $crstype = &Apache::loncommon::course_type();
3728: my $lc_crstype = lc($crstype);
3729:
3730: &startSettingsScreen($r,'parmset',$crstype);
1.193 albertel 3731: $r->print(<<ENDMAINFORMHEAD);
3732: <form method="post" enctype="multipart/form-data"
3733: action="/adm/parmset" name="studentform">
3734: ENDMAINFORMHEAD
3735: #
1.195 albertel 3736: my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
3737: my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
1.268 albertel 3738: my $vgr = &Apache::lonnet::allowed('vgr',$env{'request.course.id'});
1.366 albertel 3739: my $mgr = &Apache::lonnet::allowed('mgr',$env{'request.course.id'});
1.520 raeburn 3740: my $dcm = &Apache::lonnet::allowed('dcm',$env{'request.course.id'});
3741: if ((!$dcm) && ($env{'request.course.sec'} ne '')) {
3742: $dcm = &Apache::lonnet::allowed('dcm',$env{'request.course.id'}.
3743: '/'.$env{'request.course.sec'});
3744: }
1.268 albertel 3745:
1.193 albertel 3746: my @menu =
1.507 www 3747: ( { categorytitle=>"Content Settings for this $crstype",
1.473 amueller 3748: items => [
3749: { linktext => 'Portfolio Metadata',
3750: url => '/adm/parmset?action=setrestrictmeta',
3751: permission => $parm_permission,
1.477 raeburn 3752: linktitle => "Restrict metadata for this $lc_crstype." ,
1.473 amueller 3753: icon =>'contact-new.png' ,
3754: },
3755: { linktext => 'Reset Student Access Times',
3756: url => '/adm/helper/resettimes.helper',
3757: permission => $mgr,
1.477 raeburn 3758: linktitle => "Reset access times for folders/maps, resources or the $lc_crstype." ,
1.473 amueller 3759: icon => 'start-here.png' ,
3760: },
1.520 raeburn 3761: { linktext => 'Blocking Communication/Resource Access',
3762: url => '/adm/setblock',
3763: permission => $dcm,
3764: linktitle => 'Configure blocking of communication/collaboration and access to resources during an exam',
3765: icon => 'comblock.png',
3766: },
1.473 amueller 3767: { linktext => 'Set Parameter Setting Default Actions',
3768: url => '/adm/parmset?action=setdefaults',
3769: permission => $parm_permission,
3770: linktitle =>'Set default actions for parameters.' ,
3771: icon => 'folder-new.png' ,
3772: }]},
3773: { categorytitle => 'New and Existing Parameter Settings for Resources',
3774: items => [
3775: { linktext => 'Edit Resource Parameters - Helper Mode',
3776: url => '/adm/helper/parameter.helper',
3777: permission => $parm_permission,
3778: linktitle =>'Set/Modify resource parameters in helper mode.' ,
3779: icon => 'dialog-information.png' ,
3780: #help => 'Parameter_Helper',
3781: },
3782: { linktext => 'Edit Resource Parameters - Overview Mode',
3783: url => '/adm/parmset?action=newoverview',
3784: permission => $parm_permission,
3785: linktitle =>'Set/Modify resource parameters in overview mode.' ,
3786: icon => 'edit-find.png' ,
3787: #help => 'Parameter_Overview',
3788: },
3789: { linktext => 'Edit Resource Parameters - Table Mode',
3790: url => '/adm/parmset?action=settable',
3791: permission => $parm_permission,
3792: linktitle =>'Set/Modify resource parameters in table mode.' ,
3793: icon => 'edit-copy.png' ,
3794: #help => 'Table_Mode',
3795: }]},
1.417 droeschl 3796: { categorytitle => 'Existing Parameter Settings for Resources',
1.473 amueller 3797: items => [
3798: { linktext => 'Modify Resource Parameters - Overview Mode',
3799: url => '/adm/parmset?action=setoverview',
3800: permission => $parm_permission,
3801: linktitle =>'Set/Modify existing resource parameters in overview mode.' ,
3802: icon => 'preferences-desktop-wallpaper.png' ,
3803: #help => 'Parameter_Overview',
3804: },
3805: { linktext => 'Change Log',
3806: url => '/adm/parmset?action=parameterchangelog',
3807: permission => $parm_permission,
1.477 raeburn 3808: linktitle =>"View parameter and $lc_crstype blog posting/user notification change log." ,
1.487 wenzelju 3809: icon => 'document-properties.png',
1.473 amueller 3810: }]}
1.193 albertel 3811: );
1.414 droeschl 3812: $r->print(&Apache::lonhtmlcommon::generate_menu(@menu));
1.507 www 3813: &endSettingsScreen($r);
1.193 albertel 3814: return;
3815: }
1.414 droeschl 3816:
1.416 jms 3817:
3818:
1.252 banghart 3819: sub output_row {
1.347 banghart 3820: my ($r, $field_name, $field_text, $added_flag) = @_;
1.252 banghart 3821: my $output;
1.263 banghart 3822: my $options=$env{'course.'.$env{'request.course.id'}.'.metadata.'.$field_name.'.options'};
3823: my $values=$env{'course.'.$env{'request.course.id'}.'.metadata.'.$field_name.'.values'};
1.337 banghart 3824: if (!defined($options)) {
1.254 banghart 3825: $options = 'active,stuadd';
1.261 banghart 3826: $values = '';
1.252 banghart 3827: }
1.337 banghart 3828: if (!($options =~ /deleted/)) {
3829: my @options= ( ['active', 'Show to student'],
1.418 schafran 3830: ['stuadd', 'Provide text area for students to type metadata'],
1.351 banghart 3831: ['choices','Provide choices for students to select from']);
1.473 amueller 3832: # ['onlyone','Student may select only one choice']);
1.337 banghart 3833: if ($added_flag) {
3834: push @options,['deleted', 'Delete Metadata Field'];
3835: }
1.351 banghart 3836: $output = &Apache::loncommon::start_data_table_row();
1.451 bisitz 3837: $output .= '<td><strong>'.$field_text.':</strong></td>';
1.351 banghart 3838: $output .= &Apache::loncommon::end_data_table_row();
1.337 banghart 3839: foreach my $opt (@options) {
1.473 amueller 3840: my $checked = ($options =~ m/$opt->[0]/) ? ' checked="checked" ' : '' ;
3841: $output .= &Apache::loncommon::continue_data_table_row();
3842: $output .= '<td>'.(' ' x 5).'<label>
3843: <input type="checkbox" name="'.
3844: $field_name.'_'.$opt->[0].'" value="yes"'.$checked.' />'.
3845: &mt($opt->[1]).'</label></td>';
3846: $output .= &Apache::loncommon::end_data_table_row();
3847: }
1.351 banghart 3848: $output .= &Apache::loncommon::continue_data_table_row();
1.451 bisitz 3849: $output .= '<td>'.(' ' x 10).'<input name="'.$field_name.'_values" type="text" value="'.$values.'" size="80" /></td>';
1.351 banghart 3850: $output .= &Apache::loncommon::end_data_table_row();
3851: my $multiple_checked;
3852: my $single_checked;
3853: if ($options =~ m/onlyone/) {
1.422 bisitz 3854: $multiple_checked = '';
1.423 bisitz 3855: $single_checked = ' checked="checked"';
1.351 banghart 3856: } else {
1.423 bisitz 3857: $multiple_checked = ' checked="checked"';
1.422 bisitz 3858: $single_checked = '';
1.351 banghart 3859: }
1.473 amueller 3860: $output .= &Apache::loncommon::continue_data_table_row();
3861: $output .= '<td>'.(' ' x 10).'
3862: <input type="radio" name="'.$field_name.'_onlyone" value="multiple"'.$multiple_checked .' />
3863: '.&mt('Student may select multiple choices from list').'</td>';
3864: $output .= &Apache::loncommon::end_data_table_row();
3865: $output .= &Apache::loncommon::continue_data_table_row();
3866: $output .= '<td>'.(' ' x 10).'
3867: <input type="radio" name="'.$field_name.'_onlyone" value="single"'.$single_checked.' />
3868: '.&mt('Student may select only one choice from list').'</td>';
3869: $output .= &Apache::loncommon::end_data_table_row();
1.252 banghart 3870: }
3871: return ($output);
3872: }
1.416 jms 3873:
3874:
3875:
1.340 banghart 3876: sub order_meta_fields {
3877: my ($r)=@_;
3878: my $idx = 1;
3879: my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
3880: my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.531 raeburn 3881: my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'};;
1.341 banghart 3882: $r->print(&Apache::loncommon::start_page('Order Metadata Fields'));
1.414 droeschl 3883: &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=addmetadata',
1.473 amueller 3884: text=>"Add Metadata Field"});
1.345 banghart 3885: &Apache::lonhtmlcommon::add_breadcrumb
3886: ({href=>"/adm/parmset?action=setrestrictmeta",
3887: text=>"Restrict Metadata"},
3888: {text=>"Order Metadata"});
3889: $r->print(&Apache::lonhtmlcommon::breadcrumbs('Order Metadata'));
1.531 raeburn 3890: &startSettingsScreen($r,'parmset',$crstype);
1.340 banghart 3891: if ($env{'form.storeorder'}) {
3892: my $newpos = $env{'form.newpos'} - 1;
3893: my $currentpos = $env{'form.currentpos'} - 1;
3894: my @neworder = ();
3895: my @oldorder = split /,/,$env{'course.'.$env{'request.course.id'}.'.metadata.addedorder'};
3896: my $i;
1.341 banghart 3897: if ($newpos > $currentpos) {
1.340 banghart 3898: # moving stuff up
3899: for ($i=0;$i<$currentpos;$i++) {
1.473 amueller 3900: $neworder[$i]=$oldorder[$i];
1.340 banghart 3901: }
3902: for ($i=$currentpos;$i<$newpos;$i++) {
1.473 amueller 3903: $neworder[$i]=$oldorder[$i+1];
1.340 banghart 3904: }
3905: $neworder[$newpos]=$oldorder[$currentpos];
3906: for ($i=$newpos+1;$i<=$#oldorder;$i++) {
1.473 amueller 3907: $neworder[$i]=$oldorder[$i];
1.340 banghart 3908: }
3909: } else {
3910: # moving stuff down
1.473 amueller 3911: for ($i=0;$i<$newpos;$i++) {
3912: $neworder[$i]=$oldorder[$i];
3913: }
3914: $neworder[$newpos]=$oldorder[$currentpos];
3915: for ($i=$newpos+1;$i<$currentpos+1;$i++) {
3916: $neworder[$i]=$oldorder[$i-1];
3917: }
3918: for ($i=$currentpos+1;$i<=$#oldorder;$i++) {
3919: $neworder[$i]=$oldorder[$i];
3920: }
1.340 banghart 3921: }
1.473 amueller 3922: my $ordered_fields = join ",", @neworder;
1.343 banghart 3923: my $put_result = &Apache::lonnet::put('environment',
1.446 bisitz 3924: {'metadata.addedorder'=>$ordered_fields},$dom,$crs);
1.473 amueller 3925: &Apache::lonnet::appenv({'course.'.$env{'request.course.id'}.'.metadata.addedorder' => $ordered_fields});
1.340 banghart 3926: }
1.357 raeburn 3927: my $fields = &get_added_meta_fieldnames($env{'request.course.id'});
1.341 banghart 3928: my $ordered_fields;
1.340 banghart 3929: my @fields_in_order = split /,/,$env{'course.'.$env{'request.course.id'}.'.metadata.addedorder'};
3930: if (!@fields_in_order) {
3931: # no order found, pick sorted order then create metadata.addedorder key.
3932: foreach my $key (sort keys %$fields) {
3933: push @fields_in_order, $key;
1.341 banghart 3934: $ordered_fields = join ",", @fields_in_order;
1.340 banghart 3935: }
1.341 banghart 3936: my $put_result = &Apache::lonnet::put('environment',
1.446 bisitz 3937: {'metadata.addedorder'=>$ordered_fields},$dom,$crs);
3938: }
1.340 banghart 3939: $r->print('<table>');
3940: my $num_fields = scalar(@fields_in_order);
3941: foreach my $key (@fields_in_order) {
3942: $r->print('<tr><td>');
3943: $r->print('<form method="post" action="">');
3944: $r->print('<select name="newpos" onChange="this.form.submit()">');
3945: for (my $i = 1;$i le $num_fields;$i ++) {
3946: if ($i eq $idx) {
3947: $r->print('<option value="'.$i.'" SELECTED>('.$i.')</option>');
3948: } else {
3949: $r->print('<option value="'.$i.'">'.$i.'</option>');
3950: }
3951: }
3952: $r->print('</select></td><td>');
3953: $r->print('<input type="hidden" name="currentpos" value="'.$idx.'" />');
3954: $r->print('<input type="hidden" name="storeorder" value="true" />');
3955: $r->print('</form>');
3956: $r->print($$fields{$key}.'</td></tr>');
3957: $idx ++;
3958: }
3959: $r->print('</table>');
1.507 www 3960: &endSettingsScreen($r);
1.340 banghart 3961: return 'ok';
3962: }
1.416 jms 3963:
3964:
1.359 banghart 3965: sub continue {
3966: my $output;
3967: $output .= '<form action="" method="post">';
3968: $output .= '<input type="hidden" name="action" value="setrestrictmeta" />';
3969: $output .= '<input type="submit" value="Continue" />';
3970: return ($output);
3971: }
1.416 jms 3972:
3973:
1.334 banghart 3974: sub addmetafield {
3975: my ($r)=@_;
1.414 droeschl 3976: &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=addmetadata',
1.473 amueller 3977: text=>"Add Metadata Field"});
1.334 banghart 3978: $r->print(&Apache::loncommon::start_page('Add Metadata Field'));
3979: $r->print(&Apache::lonhtmlcommon::breadcrumbs('Add Metadata Field'));
1.335 banghart 3980: my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
3981: my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.531 raeburn 3982: my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'};
3983: &startSettingsScreen($r,'parmset',$crstype);
1.339 banghart 3984: if (exists($env{'form.undelete'})) {
1.358 banghart 3985: my @meta_fields = &Apache::loncommon::get_env_multiple('form.undeletefield');
1.339 banghart 3986: foreach my $meta_field(@meta_fields) {
3987: my $options = $env{'course.'.$env{'request.course.id'}.'.metadata.'.$meta_field.'.options'};
3988: $options =~ s/deleted//;
3989: $options =~ s/,,/,/;
3990: my $put_result = &Apache::lonnet::put('environment',
3991: {'metadata.'.$meta_field.'.options'=>$options},$dom,$crs);
1.446 bisitz 3992:
1.339 banghart 3993: $r->print('Undeleted Metadata Field <strong>'.$env{'course.'.$env{'request.course.id'}.'.metadata.'.$meta_field.'.added'}."</strong> with result ".$put_result.'<br />');
3994: }
1.359 banghart 3995: $r->print(&continue());
1.339 banghart 3996: } elsif (exists($env{'form.fieldname'})) {
1.335 banghart 3997: my $meta_field = $env{'form.fieldname'};
3998: my $display_field = $env{'form.fieldname'};
3999: $meta_field =~ s/\W/_/g;
1.338 banghart 4000: $meta_field =~ tr/A-Z/a-z/;
1.335 banghart 4001: my $put_result = &Apache::lonnet::put('environment',
4002: {'metadata.'.$meta_field.'.values'=>"",
4003: 'metadata.'.$meta_field.'.added'=>"$display_field",
4004: 'metadata.'.$meta_field.'.options'=>""},$dom,$crs);
1.359 banghart 4005: $r->print('Added new Metadata Field <strong>'.$env{'form.fieldname'}."</strong> with result ".$put_result.'<br />');
4006: $r->print(&continue());
1.335 banghart 4007: } else {
1.357 raeburn 4008: my $fields = &get_deleted_meta_fieldnames($env{'request.course.id'});
1.339 banghart 4009: if ($fields) {
4010: $r->print('You may undelete previously deleted fields.<br />Check those you wish to undelete and click Undelete.<br />');
4011: $r->print('<form method="post" action="">');
4012: foreach my $key(keys(%$fields)) {
1.358 banghart 4013: $r->print('<input type="checkbox" name="undeletefield" value="'.$key.'" />'.$$fields{$key}.'<br /');
1.339 banghart 4014: }
4015: $r->print('<input type="submit" name="undelete" value="Undelete" />');
4016: $r->print('</form>');
4017: }
4018: $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 4019: $r->print('<input type="text" name="fieldname" /><br />');
4020: $r->print('<input type="submit" value="Add Metadata Field" />');
1.334 banghart 4021: }
1.361 albertel 4022: $r->print('</form>');
1.507 www 4023: &endSettingsScreen($r);
1.334 banghart 4024: }
1.416 jms 4025:
4026:
4027:
1.259 banghart 4028: sub setrestrictmeta {
1.240 banghart 4029: my ($r)=@_;
1.242 banghart 4030: my $next_meta;
1.244 banghart 4031: my $output;
1.245 banghart 4032: my $item_num;
1.246 banghart 4033: my $put_result;
1.414 droeschl 4034: &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setrestrictmeta',
1.473 amueller 4035: text=>"Restrict Metadata"});
1.280 albertel 4036: $r->print(&Apache::loncommon::start_page('Restrict Metadata'));
1.298 albertel 4037: $r->print(&Apache::lonhtmlcommon::breadcrumbs('Restrict Metadata'));
1.240 banghart 4038: my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
4039: my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.531 raeburn 4040: my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'};
4041: &startSettingsScreen($r,'parmset',$crstype);
1.259 banghart 4042: my $key_base = $env{'course.'.$env{'request.course.id'}.'.'};
1.252 banghart 4043: my $save_field = '';
1.259 banghart 4044: if ($env{'form.restrictmeta'}) {
1.254 banghart 4045: foreach my $field (sort(keys(%env))) {
1.252 banghart 4046: if ($field=~m/^form.(.+)_(.+)$/) {
1.254 banghart 4047: my $options;
1.252 banghart 4048: my $meta_field = $1;
4049: my $meta_key = $2;
1.253 banghart 4050: if ($save_field ne $meta_field) {
1.252 banghart 4051: $save_field = $meta_field;
1.473 amueller 4052: if ($env{'form.'.$meta_field.'_stuadd'}) {
4053: $options.='stuadd,';
4054: }
4055: if ($env{'form.'.$meta_field.'_choices'}) {
4056: $options.='choices,';
4057: }
4058: if ($env{'form.'.$meta_field.'_onlyone'} eq 'single') {
4059: $options.='onlyone,';
4060: }
4061: if ($env{'form.'.$meta_field.'_active'}) {
4062: $options.='active,';
4063: }
4064: if ($env{'form.'.$meta_field.'_deleted'}) {
4065: $options.='deleted,';
4066: }
1.259 banghart 4067: my $name = $save_field;
1.253 banghart 4068: $put_result = &Apache::lonnet::put('environment',
1.262 banghart 4069: {'metadata.'.$meta_field.'.options'=>$options,
4070: 'metadata.'.$meta_field.'.values'=>$env{'form.'.$meta_field.'_values'},
1.253 banghart 4071: },$dom,$crs);
1.252 banghart 4072: }
4073: }
4074: }
4075: }
1.296 albertel 4076: &Apache::lonnet::coursedescription($env{'request.course.id'},
1.473 amueller 4077: {'freshen_cache' => 1});
1.335 banghart 4078: # Get the default metadata fields
1.258 albertel 4079: my %metadata_fields = &Apache::lonmeta::fieldnames('portfolio');
1.335 banghart 4080: # Now get possible added metadata fields
1.357 raeburn 4081: my $added_metadata_fields = &get_added_meta_fieldnames($env{'request.course.id'});
1.346 banghart 4082: my $row_alt = 1;
1.347 banghart 4083: $output .= &Apache::loncommon::start_data_table();
1.258 albertel 4084: foreach my $field (sort(keys(%metadata_fields))) {
1.265 banghart 4085: if ($field ne 'courserestricted') {
1.346 banghart 4086: $row_alt = $row_alt ? 0 : 1;
1.473 amueller 4087: $output.= &output_row($r, $field, $metadata_fields{$field});
4088: }
1.255 banghart 4089: }
1.351 banghart 4090: my $buttons = (<<ENDButtons);
4091: <input type="submit" name="restrictmeta" value="Save" />
4092: </form><br />
4093: <form method="post" action="/adm/parmset?action=addmetadata" name="form1">
4094: <input type="submit" name="restrictmeta" value="Add a Metadata Field" />
4095: </form>
4096: <br />
4097: <form method="post" action="/adm/parmset?action=ordermetadata" name="form2">
4098: <input type="submit" name="restrictmeta" value="Order Metadata Fields" />
4099: ENDButtons
1.337 banghart 4100: my $added_flag = 1;
1.335 banghart 4101: foreach my $field (sort(keys(%$added_metadata_fields))) {
1.346 banghart 4102: $row_alt = $row_alt ? 0 : 1;
4103: $output.= &output_row($r, $field, $$added_metadata_fields{$field},$added_flag, $row_alt);
1.335 banghart 4104: }
1.347 banghart 4105: $output .= &Apache::loncommon::end_data_table();
1.446 bisitz 4106: $r->print(<<ENDenv);
1.259 banghart 4107: <form method="post" action="/adm/parmset?action=setrestrictmeta" name="form">
1.244 banghart 4108: $output
1.351 banghart 4109: $buttons
1.340 banghart 4110: </form>
1.244 banghart 4111: ENDenv
1.507 www 4112: &endSettingsScreen($r);
1.280 albertel 4113: $r->print(&Apache::loncommon::end_page());
1.240 banghart 4114: return 'ok';
4115: }
1.416 jms 4116:
4117:
4118:
1.335 banghart 4119: sub get_added_meta_fieldnames {
1.357 raeburn 4120: my ($cid) = @_;
1.335 banghart 4121: my %fields;
4122: foreach my $key(%env) {
1.357 raeburn 4123: if ($key =~ m/\Q$cid\E\.metadata\.(.+)\.added$/) {
1.335 banghart 4124: my $field_name = $1;
4125: my ($display_field_name) = $env{$key};
4126: $fields{$field_name} = $display_field_name;
4127: }
4128: }
4129: return \%fields;
4130: }
1.416 jms 4131:
4132:
4133:
1.339 banghart 4134: sub get_deleted_meta_fieldnames {
1.357 raeburn 4135: my ($cid) = @_;
1.339 banghart 4136: my %fields;
4137: foreach my $key(%env) {
1.357 raeburn 4138: if ($key =~ m/\Q$cid\E\.metadata\.(.+)\.added$/) {
1.339 banghart 4139: my $field_name = $1;
4140: if ($env{'course.'.$env{'request.course.id'}.'.metadata.'.$field_name.'.options'} =~ m/deleted/) {
4141: my ($display_field_name) = $env{$key};
4142: $fields{$field_name} = $display_field_name;
4143: }
4144: }
4145: }
4146: return \%fields;
4147: }
1.220 www 4148: sub defaultsetter {
1.280 albertel 4149: my ($r) = @_;
4150:
1.414 droeschl 4151: &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setdefaults',
1.473 amueller 4152: text=>"Set Defaults"});
1.531 raeburn 4153: my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
4154: my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
4155: my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'};
1.446 bisitz 4156: my $start_page =
1.531 raeburn 4157: &Apache::loncommon::start_page('Parameter Setting Default Actions');
1.298 albertel 4158: my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Defaults');
1.507 www 4159: $r->print($start_page.$breadcrumbs);
1.531 raeburn 4160: &startSettingsScreen($r,'parmset',$crstype);
1.507 www 4161: $r->print('<form method="post" action="/adm/parmset?action=setdefaults" name="defaultform">');
1.280 albertel 4162:
1.221 www 4163: my @ids=();
4164: my %typep=();
4165: my %keyp=();
4166: my %allparms=();
4167: my %allparts=();
4168: my %allmaps=();
4169: my %mapp=();
4170: my %symbp=();
4171: my %maptitles=();
4172: my %uris=();
4173: my %keyorder=&standardkeyorder();
4174: my %defkeytype=();
4175:
1.446 bisitz 4176: &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps,
1.473 amueller 4177: \%mapp, \%symbp,\%maptitles,\%uris,
4178: \%keyorder,\%defkeytype);
1.224 www 4179: if ($env{'form.storerules'}) {
1.473 amueller 4180: my %newrules=();
4181: my @delrules=();
4182: my %triggers=();
4183: foreach my $key (keys(%env)) {
1.225 albertel 4184: if ($key=~/^form\.(\w+)\_action$/) {
1.473 amueller 4185: my $tempkey=$1;
4186: my $action=$env{$key};
1.226 www 4187: if ($action) {
1.473 amueller 4188: $newrules{$tempkey.'_action'}=$action;
4189: if ($action ne 'default') {
4190: my ($whichaction,$whichparm)=($action=~/^(.*\_)([^\_]+)$/);
4191: $triggers{$whichparm}.=$tempkey.':';
4192: }
4193: $newrules{$tempkey.'_type'}=$defkeytype{$tempkey};
4194: if (&isdateparm($defkeytype{$tempkey})) {
4195: $newrules{$tempkey.'_days'}=$env{'form.'.$tempkey.'_days'};
4196: $newrules{$tempkey.'_hours'}=$env{'form.'.$tempkey.'_hours'};
4197: $newrules{$tempkey.'_min'}=$env{'form.'.$tempkey.'_min'};
4198: $newrules{$tempkey.'_sec'}=$env{'form.'.$tempkey.'_sec'};
4199: } else {
4200: $newrules{$tempkey.'_value'}=$env{'form.'.$tempkey.'_value'};
4201: $newrules{$tempkey.'_triggervalue'}=$env{'form.'.$tempkey.'_triggervalue'};
4202: }
4203: } else {
4204: push(@delrules,$tempkey.'_action');
4205: push(@delrules,$tempkey.'_type');
4206: push(@delrules,$tempkey.'_hours');
4207: push(@delrules,$tempkey.'_min');
4208: push(@delrules,$tempkey.'_sec');
4209: push(@delrules,$tempkey.'_value');
4210: }
4211: }
4212: }
4213: foreach my $key (keys %allparms) {
4214: $newrules{$key.'_triggers'}=$triggers{$key};
4215: }
1.531 raeburn 4216: &Apache::lonnet::put('parmdefactions',\%newrules,$cdom,$cnum);
4217: &Apache::lonnet::del('parmdefactions',\@delrules,$cdom,$cnum);
1.473 amueller 4218: &resetrulescache();
1.224 www 4219: }
1.227 www 4220: my %lt=&Apache::lonlocal::texthash('days' => 'Days',
1.473 amueller 4221: 'hours' => 'Hours',
4222: 'min' => 'Minutes',
4223: 'sec' => 'Seconds',
4224: 'yes' => 'Yes',
4225: 'no' => 'No');
1.222 www 4226: my @standardoptions=('','default');
4227: my @standarddisplay=('',&mt('Default value when manually setting'));
4228: my @dateoptions=('','default');
4229: my @datedisplay=('',&mt('Default value when manually setting'));
4230: foreach my $tempkey (&keysindisplayorder(\%allparms,\%keyorder)) {
1.473 amueller 4231: unless ($tempkey) { next; }
4232: push @standardoptions,'when_setting_'.$tempkey;
4233: push @standarddisplay,&mt('Automatically set when setting ').$tempkey;
4234: if (&isdateparm($defkeytype{$tempkey})) {
4235: push @dateoptions,'later_than_'.$tempkey;
4236: push @datedisplay,&mt('Automatically set later than ').$tempkey;
4237: push @dateoptions,'earlier_than_'.$tempkey;
4238: push @datedisplay,&mt('Automatically set earlier than ').$tempkey;
4239: }
1.222 www 4240: }
1.231 www 4241: $r->print(&mt('Manual setting rules apply to all interfaces.').'<br />'.
1.473 amueller 4242: &mt('Automatic setting rules apply to table mode interfaces only.'));
1.318 albertel 4243: $r->print("\n".&Apache::loncommon::start_data_table().
1.473 amueller 4244: &Apache::loncommon::start_data_table_header_row().
4245: "<th>".&mt('Rule for parameter').'</th><th>'.
4246: &mt('Action').'</th><th>'.&mt('Value').'</th>'.
4247: &Apache::loncommon::end_data_table_header_row());
1.221 www 4248: foreach my $tempkey (&keysindisplayorder(\%allparms,\%keyorder)) {
1.473 amueller 4249: unless ($tempkey) { next; }
4250: $r->print("\n".&Apache::loncommon::start_data_table_row().
4251: "<td>".$allparms{$tempkey}."\n<br />(".$tempkey.')</td><td>');
4252: my $action=&rulescache($tempkey.'_action');
4253: $r->print('<select name="'.$tempkey.'_action">');
4254: if (&isdateparm($defkeytype{$tempkey})) {
4255: for (my $i=0;$i<=$#dateoptions;$i++) {
4256: if ($dateoptions[$i]=~/\_$tempkey$/) { next; }
4257: $r->print("\n<option value='$dateoptions[$i]'".
4258: ($dateoptions[$i] eq $action?' selected="selected"':'').
4259: ">$datedisplay[$i]</option>");
4260: }
4261: } else {
4262: for (my $i=0;$i<=$#standardoptions;$i++) {
4263: if ($standardoptions[$i]=~/\_$tempkey$/) { next; }
4264: $r->print("\n<option value='$standardoptions[$i]'".
4265: ($standardoptions[$i] eq $action?' selected="selected"':'').
4266: ">$standarddisplay[$i]</option>");
4267: }
4268: }
4269: $r->print('</select>');
4270: unless (&isdateparm($defkeytype{$tempkey})) {
4271: $r->print("\n<br />".&mt('Triggering value(s) of other parameter (optional, comma-separated):').
4272: '<input type="text" size="20" name="'.$tempkey.'_triggervalue" value="'.&rulescache($tempkey.'_triggervalue').'" />');
4273: }
4274: $r->print("\n</td><td>\n");
1.222 www 4275:
1.221 www 4276: if (&isdateparm($defkeytype{$tempkey})) {
1.473 amueller 4277: my $days=&rulescache($tempkey.'_days');
4278: my $hours=&rulescache($tempkey.'_hours');
4279: my $min=&rulescache($tempkey.'_min');
4280: my $sec=&rulescache($tempkey.'_sec');
4281: $r->print(<<ENDINPUTDATE);
1.227 www 4282: <input name="$tempkey\_days" type="text" size="4" value="$days" />$lt{'days'}<br />
1.222 www 4283: <input name="$tempkey\_hours" type="text" size="4" value="$hours" />$lt{'hours'}<br />
4284: <input name="$tempkey\_min" type="text" size="4" value="$min" />$lt{'min'}<br />
4285: <input name="$tempkey\_sec" type="text" size="4" value="$sec" />$lt{'sec'}
1.221 www 4286: ENDINPUTDATE
1.473 amueller 4287: } elsif ($defkeytype{$tempkey} eq 'string_yesno') {
1.222 www 4288: my $yeschecked='';
4289: my $nochecked='';
1.444 bisitz 4290: if (&rulescache($tempkey.'_value') eq 'yes') { $yeschecked=' checked="checked"'; }
4291: if (&rulescache($tempkey.'_value') eq 'no') { $nochecked=' checked="checked"'; }
1.222 www 4292:
1.473 amueller 4293: $r->print(<<ENDYESNO);
1.444 bisitz 4294: <label><input type="radio" name="$tempkey\_value" value="yes"$yeschecked /> $lt{'yes'}</label><br />
4295: <label><input type="radio" name="$tempkey\_value" value="no"$nochecked /> $lt{'no'}</label>
1.221 www 4296: ENDYESNO
4297: } else {
1.473 amueller 4298: $r->print('<input type="text" size="20" name="'.$tempkey.'_value" value="'.&rulescache($tempkey.'_value').'" />');
4299: }
1.318 albertel 4300: $r->print('</td>'.&Apache::loncommon::end_data_table_row());
1.221 www 4301: }
1.318 albertel 4302: $r->print(&Apache::loncommon::end_data_table().
1.473 amueller 4303: "\n".'<input type="submit" name="storerules" value="'.
1.507 www 4304: &mt('Save').'" /></form>'."\n");
4305: &endSettingsScreen($r);
4306: $r->print(&Apache::loncommon::end_page());
1.220 www 4307: return;
4308: }
1.193 albertel 4309:
1.290 www 4310: sub components {
1.330 albertel 4311: my ($key,$uname,$udom,$exeuser,$exedomain,$typeflag)=@_;
4312:
4313: if ($typeflag) {
1.473 amueller 4314: $key=~s/\.type$//;
1.290 www 4315: }
1.330 albertel 4316:
4317: my ($middle,$part,$name)=
1.473 amueller 4318: ($key=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);
1.291 www 4319: my $issection;
1.330 albertel 4320:
1.290 www 4321: my $section=&mt('All Students');
4322: if ($middle=~/^\[(.*)\]/) {
1.473 amueller 4323: $issection=$1;
4324: $section=&mt('Group/Section').': '.$issection;
4325: $middle=~s/^\[(.*)\]//;
1.290 www 4326: }
4327: $middle=~s/\.+$//;
4328: $middle=~s/^\.+//;
1.291 www 4329: if ($uname) {
1.473 amueller 4330: $section=&mt('User').": ".&Apache::loncommon::plainname($uname,$udom);
4331: $issection='';
1.291 www 4332: }
1.316 albertel 4333: my $realm='<span class="LC_parm_scope_all">'.&mt('All Resources').'</span>';
1.446 bisitz 4334: my $realmdescription=&mt('all resources');
1.290 www 4335: if ($middle=~/^(.+)\_\_\_\(all\)$/) {
1.473 amueller 4336: $realm='<span class="LC_parm_scope_folder">'.&mt('Folder/Map').': '.&Apache::lonnet::gettitle($1).' <span class="LC_parm_folder"><br />('.$1.')</span></span>';
4337: $realmdescription=&mt('folder').' '.&Apache::lonnet::gettitle($1);
1.304 www 4338: } elsif ($middle) {
1.473 amueller 4339: my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle);
4340: $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>';
4341: $realmdescription=&mt('resource').' '.&Apache::lonnet::gettitle($middle);
1.290 www 4342: }
1.291 www 4343: my $what=$part.'.'.$name;
1.330 albertel 4344: return ($realm,$section,$name,$part,
1.473 amueller 4345: $what,$middle,$uname,$udom,$issection,$realmdescription);
1.290 www 4346: }
1.293 www 4347:
1.328 albertel 4348: my %standard_parms;
1.469 raeburn 4349: my %standard_parms_types;
1.416 jms 4350:
1.328 albertel 4351: sub load_parameter_names {
4352: open(my $config,"<$Apache::lonnet::perlvar{'lonTabDir'}/packages.tab");
4353: while (my $configline=<$config>) {
1.473 amueller 4354: if ($configline !~ /\S/ || $configline=~/^\#/) { next; }
4355: chomp($configline);
4356: my ($short,$plain)=split(/:/,$configline);
4357: my (undef,$name,$type)=split(/\&/,$short,3);
4358: if ($type eq 'display') {
4359: $standard_parms{$name} = $plain;
1.469 raeburn 4360: } elsif ($type eq 'type') {
4361: $standard_parms_types{$name} = $plain;
4362: }
1.328 albertel 4363: }
4364: close($config);
4365: $standard_parms{'int_pos'} = 'Positive Integer';
4366: $standard_parms{'int_zero_pos'} = 'Positive Integer or Zero';
4367: }
4368:
1.292 www 4369: sub standard_parameter_names {
4370: my ($name)=@_;
1.328 albertel 4371: if (!%standard_parms) {
1.473 amueller 4372: &load_parameter_names();
1.328 albertel 4373: }
1.292 www 4374: if ($standard_parms{$name}) {
1.473 amueller 4375: return $standard_parms{$name};
1.446 bisitz 4376: } else {
1.473 amueller 4377: return $name;
1.292 www 4378: }
4379: }
1.290 www 4380:
1.469 raeburn 4381: sub standard_parameter_types {
4382: my ($name)=@_;
4383: if (!%standard_parms_types) {
4384: &load_parameter_names();
4385: }
4386: if ($standard_parms_types{$name}) {
4387: return $standard_parms_types{$name};
4388: }
4389: return;
4390: }
1.309 www 4391:
1.285 albertel 4392: sub parm_change_log {
1.284 www 4393: my ($r)=@_;
1.531 raeburn 4394: my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
4395: my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
4396: my $crstype = $env{'course.'.$env{'request.course.id'}.'.type'}
1.414 droeschl 4397: &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=settable',
1.473 amueller 4398: text=>"Parameter Change Log"});
1.522 raeburn 4399: my $js = '<script type="text/javascript">'."\n".
4400: '// <![CDATA['."\n".
4401: &Apache::loncommon::display_filter_js('parmslog')."\n".
4402: '// ]]>'."\n".
4403: '</script>'."\n";
4404: $r->print(&Apache::loncommon::start_page('Parameter Change Log',$js));
1.327 albertel 4405: $r->print(&Apache::lonhtmlcommon::breadcrumbs('Parameter Change Log'));
1.531 raeburn 4406: &startSettingsScreen($r,'parmset',$crstype);
4407: my %parmlog=&Apache::lonnet::dump('nohist_parameterlog',$cdom,$cnum);
1.311 albertel 4408:
1.301 www 4409: if ((keys(%parmlog))[0]=~/^error\:/) { undef(%parmlog); }
1.311 albertel 4410:
1.522 raeburn 4411: $r->print('<div class="LC_left_float">'.
4412: '<fieldset><legend>'.&mt('Display of Changes').'</legend>'.
4413: '<form action="/adm/parmset?action=parameterchangelog"
1.327 albertel 4414: method="post" name="parameterlog">');
1.446 bisitz 4415:
1.311 albertel 4416: my %saveable_parameters = ('show' => 'scalar',);
4417: &Apache::loncommon::store_course_settings('parameter_log',
4418: \%saveable_parameters);
4419: &Apache::loncommon::restore_course_settings('parameter_log',
4420: \%saveable_parameters);
1.522 raeburn 4421: $r->print(&Apache::loncommon::display_filter('parmslog').' '."\n".
4422: '<input type="submit" value="'.&mt('Display').'" />'.
4423: '</form></fieldset></div><br clear="all" />');
1.301 www 4424:
1.531 raeburn 4425: my $courseopt=&Apache::lonnet::get_courseresdata($cnum,$cdom);
1.301 www 4426: $r->print(&Apache::loncommon::start_data_table().&Apache::loncommon::start_data_table_header_row().
1.473 amueller 4427: '<th>'.&mt('Time').'</th><th>'.&mt('User').'</th><th>'.&mt('Extent').'</th><th>'.&mt('Users').'</th><th>'.
4428: &mt('Parameter').'</th><th>'.&mt('Part').'</th><th>'.&mt('New Value').'</th><th>'.&mt('Announce').'</th>'.
4429: &Apache::loncommon::end_data_table_header_row());
1.309 www 4430: my $shown=0;
1.349 www 4431: my $folder='';
4432: if ($env{'form.displayfilter'} eq 'currentfolder') {
1.473 amueller 4433: my $last='';
4434: if (tie(my %hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db',
4435: &GDBM_READER(),0640)) {
4436: $last=$hash{'last_known'};
4437: untie(%hash);
4438: }
4439: if ($last) { ($folder) = &Apache::lonnet::decode_symb($last); }
1.349 www 4440: }
1.446 bisitz 4441: foreach my $id (sort
1.473 amueller 4442: {
4443: if ($parmlog{$b}{'exe_time'} ne $parmlog{$a}{'exe_time'}) {
4444: return $parmlog{$b}{'exe_time'} <=>$parmlog{$a}{'exe_time'}
4445: }
4446: my $aid = (split('00000',$a))[-1];
4447: my $bid = (split('00000',$b))[-1];
4448: return $bid<=>$aid;
4449: } (keys(%parmlog))) {
1.294 www 4450: my @changes=keys(%{$parmlog{$id}{'logentry'}});
1.473 amueller 4451: my $count = 0;
4452: my $time =
4453: &Apache::lonlocal::locallocaltime($parmlog{$id}{'exe_time'});
4454: my $plainname =
4455: &Apache::loncommon::plainname($parmlog{$id}{'exe_uname'},
4456: $parmlog{$id}{'exe_udom'});
4457: my $about_me_link =
4458: &Apache::loncommon::aboutmewrapper($plainname,
4459: $parmlog{$id}{'exe_uname'},
4460: $parmlog{$id}{'exe_udom'});
4461: my $send_msg_link='';
4462: if ((($parmlog{$id}{'exe_uname'} ne $env{'user.name'})
4463: || ($parmlog{$id}{'exe_udom'} ne $env{'user.domain'}))) {
4464: $send_msg_link ='<br />'.
4465: &Apache::loncommon::messagewrapper(&mt('Send message'),
4466: $parmlog{$id}{'exe_uname'},
4467: $parmlog{$id}{'exe_udom'});
4468: }
4469: my $row_start=&Apache::loncommon::start_data_table_row();
4470: my $makenewrow=0;
4471: my %istype=();
4472: my $output;
4473: foreach my $changed (reverse(sort(@changes))) {
1.330 albertel 4474: my $value=$parmlog{$id}{'logentry'}{$changed};
1.473 amueller 4475: my $typeflag = ($changed =~/\.type$/ &&
4476: !exists($parmlog{$id}{'logentry'}{$changed.'.type'}));
1.330 albertel 4477: my ($realm,$section,$parmname,$part,$what,$middle,$uname,$udom,$issection,$realmdescription)=
1.473 amueller 4478: &components($changed,$parmlog{$id}{'uname'},$parmlog{$id}{'udom'},undef,undef,$typeflag);
4479: if ($env{'form.displayfilter'} eq 'currentfolder') {
4480: if ($folder) {
4481: if ($middle!~/^\Q$folder\E/) { next; }
4482: }
4483: }
4484: if ($typeflag) {
4485: $istype{$parmname}=$value;
4486: if (!$env{'form.includetypes'}) { next; }
4487: }
4488: $count++;
4489: if ($makenewrow) {
4490: $output .= $row_start;
4491: } else {
4492: $makenewrow=1;
4493: }
1.470 raeburn 4494: my $parmitem = &standard_parameter_names($parmname);
1.473 amueller 4495: $output .='<td>'.$realm.'</td><td>'.$section.'</td><td>'.
4496: &mt($parmitem).'</td><td>'.
4497: ($part?&mt('Part: [_1]',$part):&mt('All Parts')).'</td><td>';
4498: my $stillactive=0;
4499: if ($parmlog{$id}{'delflag'}) {
4500: $output .= &mt('Deleted');
4501: } else {
4502: if ($typeflag) {
1.470 raeburn 4503: my $parmitem = &standard_parameter_names($value);
4504: $parmitem = &mt($parmitem);
1.473 amueller 4505: $output .= &mt('Type: [_1]',$parmitem);
4506: } else {
4507: my ($level,@all)=&parmval_by_symb($what,$middle,&Apache::lonnet::metadata($middle,$what),
4508: $uname,$udom,$issection,$issection,$courseopt);
1.469 raeburn 4509: my $showvalue = $value;
4510: if ($istype{$parmname} eq '') {
4511: my $type = &standard_parameter_types($parmname);
4512: if ($type ne '') {
4513: if (&isdateparm($type)) {
4514: $showvalue =
4515: &Apache::lonlocal::locallocaltime($value);
4516: }
4517: }
4518: } else {
1.473 amueller 4519: if (&isdateparm($istype{$parmname})) {
4520: $showvalue =
1.469 raeburn 4521: &Apache::lonlocal::locallocaltime($value);
1.473 amueller 4522: }
1.469 raeburn 4523: }
4524: $output .= $showvalue;
1.473 amueller 4525: if ($value ne $all[$level]) {
4526: $output .= '<br /><span class="LC_warning">'.&mt('Not active anymore').'</span>';
4527: } else {
4528: $stillactive=1;
4529: }
4530: }
4531: }
4532: $output .= '</td><td>';
1.470 raeburn 4533:
1.473 amueller 4534: if ($stillactive) {
1.470 raeburn 4535: my $parmitem = &standard_parameter_names($parmname);
4536: $parmitem = &mt($parmitem);
1.473 amueller 4537: my $title=&mt('Changed [_1]',$parmitem);
1.471 raeburn 4538: my $description=&mt('Changed [_1] for [_2] to [_3]',
4539: $parmitem,$realmdescription,
1.473 amueller 4540: (&isdateparm($istype{$parmname})?&Apache::lonlocal::locallocaltime($value):$value));
4541: if (($uname) && ($udom)) {
4542: $output .=
4543: &Apache::loncommon::messagewrapper('Notify User',
4544: $uname,$udom,$title,
4545: $description);
4546: } else {
4547: $output .=
4548: &Apache::lonrss::course_blog_link($id,$title,
4549: $description);
4550: }
4551: }
4552: $output .= '</td>'.&Apache::loncommon::end_data_table_row();
4553: }
1.349 www 4554: if ($env{'form.displayfilter'} eq 'containing') {
1.473 amueller 4555: my $wholeentry=$about_me_link.':'.
4556: $parmlog{$id}{'exe_uname'}.':'.$parmlog{$id}{'exe_udom'}.':'.
4557: $output;
4558: if ($wholeentry!~/\Q$env{'form.containingphrase'}\E/i) { next; }
4559: }
1.349 www 4560: if ($count) {
1.473 amueller 4561: $r->print($row_start.'<td rowspan="'.$count.'">'.$time.'</td>
1.332 albertel 4562: <td rowspan="'.$count.'">'.$about_me_link.
1.473 amueller 4563: '<br /><tt>'.$parmlog{$id}{'exe_uname'}.
4564: ':'.$parmlog{$id}{'exe_udom'}.'</tt>'.
4565: $send_msg_link.'</td>'.$output);
4566: $shown++;
4567: }
4568: if (!($env{'form.show'} eq &mt('all')
4569: || $shown<=$env{'form.show'})) { last; }
1.286 www 4570: }
1.301 www 4571: $r->print(&Apache::loncommon::end_data_table());
1.507 www 4572: &endSettingsScreen($r);
1.284 www 4573: $r->print(&Apache::loncommon::end_page());
4574: }
4575:
1.437 raeburn 4576: sub update_slots {
4577: my ($slot_name,$cdom,$cnum,$symb,$uname,$udom) = @_;
4578: my %slot=&Apache::lonnet::get_slot($slot_name);
4579: if (!keys(%slot)) {
4580: return 'error: slot does not exist';
4581: }
4582: my $max=$slot{'maxspace'};
4583: if (!defined($max)) { $max=99999; }
4584:
4585: my %consumed=&Apache::lonnet::dump('slot_reservations',$cdom,$cnum,
4586: "^$slot_name\0");
4587: my ($tmp)=%consumed;
4588: if ($tmp=~/^error: 2 / ) {
4589: return 'error: unable to determine current slot status';
4590: }
4591: my $last=0;
4592: foreach my $key (keys(%consumed)) {
4593: my $num=(split('\0',$key))[1];
4594: if ($num > $last) { $last=$num; }
4595: if ($consumed{$key}->{'name'} eq $uname.':'.$udom) {
4596: return 'ok';
4597: }
4598: }
4599:
4600: if (scalar(keys(%consumed)) >= $max) {
4601: return 'error: no space left in slot';
4602: }
4603: my $wanted=$last+1;
4604:
4605: my %reservation=('name' => $uname.':'.$udom,
4606: 'timestamp' => time,
4607: 'symb' => $symb);
4608:
4609: my $success=&Apache::lonnet::newput('slot_reservations',
4610: {"$slot_name\0$wanted" =>
4611: \%reservation},
4612: $cdom, $cnum);
1.438 raeburn 4613: if ($success eq 'ok') {
4614: my %storehash = (
4615: symb => $symb,
4616: slot => $slot_name,
4617: action => 'reserve',
4618: context => 'parameter',
4619: );
1.526 raeburn 4620: &Apache::lonnet::write_log('course','slotreservationslog',\%storehash,
1.524 raeburn 4621: '',$uname,$udom,$cnum,$cdom);
1.438 raeburn 4622:
1.526 raeburn 4623: &Apache::lonnet::write_log('course',$cdom.'_'.$cnum.'_slotlog',\%storehash,
1.524 raeburn 4624: '',$uname,$udom,$uname,$udom);
1.438 raeburn 4625: }
1.437 raeburn 4626: return $success;
4627: }
4628:
4629: sub delete_slots {
4630: my ($slot_name,$cdom,$cnum,$uname,$udom,$symb) = @_;
4631: my $delresult;
4632: my %consumed = &Apache::lonnet::dump('slot_reservations',$cdom,
4633: $cnum, "^$slot_name\0");
4634: if (&Apache::lonnet::error(%consumed)) {
4635: return 'error: unable to determine current slot status';
4636: }
4637: my ($tmp)=%consumed;
4638: if ($tmp=~/^error: 2 /) {
4639: return 'error: unable to determine current slot status';
4640: }
4641: foreach my $key (keys(%consumed)) {
4642: if ($consumed{$key}->{'name'} eq $uname.':'.$udom) {
4643: my $num=(split('\0',$key))[1];
4644: my $entry = $slot_name.'\0'.$num;
4645: $delresult = &Apache::lonnet::del('slot_reservations',[$entry],
4646: $cdom,$cnum);
4647: if ($delresult eq 'ok') {
4648: my %storehash = (
4649: symb => $symb,
4650: slot => $slot_name,
4651: action => 'release',
4652: context => 'parameter',
4653: );
1.526 raeburn 4654: &Apache::lonnet::write_log('course','slotreservationslog',\%storehash,
1.524 raeburn 4655: 1,$uname,$udom,$cnum,$cdom);
1.526 raeburn 4656: &Apache::lonnet::write_log('course',$cdom.'_'.$cnum.'_slotlog',\%storehash,
1.524 raeburn 4657: 1,$uname,$udom,$uname,$udom);
1.437 raeburn 4658: }
4659: }
4660: }
4661: return $delresult;
4662: }
4663:
1.355 albertel 4664: sub check_for_course_info {
4665: my $navmap = Apache::lonnavmaps::navmap->new();
4666: return 1 if ($navmap);
4667: return 0;
4668: }
4669:
1.514 raeburn 4670: sub parameter_release_vars {
1.504 raeburn 4671: my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
4672: my $chome = $env{'course.'.$env{'request.course.id'}.'.home'};
4673: my $chostname = &Apache::lonnet::hostname($chome);
4674: my ($cmajor,$cminor) =
4675: split(/\./,&Apache::lonnet::get_server_loncaparev($cdom,$chome));
4676: return ($chostname,$cmajor,$cminor);
4677: }
4678:
1.514 raeburn 4679: sub parameter_releasecheck {
4680: my ($name,$value,$needsrelease,$chostname,$cmajor,$cminor) = @_;
1.504 raeburn 4681: my $needsnewer;
4682: my ($needsmajor,$needsminor) = split(/\./,$needsrelease);
4683: if (($cmajor < $needsmajor) ||
4684: ($cmajor == $needsmajor && $cminor < $needsminor)) {
4685: $needsnewer = 1;
4686: } else {
1.514 raeburn 4687: &Apache::lonnet::update_released_required($Apache::lonnet::needsrelease{'parameter:'.$name.':'.$value});
1.504 raeburn 4688: }
4689: return $needsnewer;
4690: }
4691:
4692: sub oldversion_warning {
1.514 raeburn 4693: my ($name,$value,$chostname,$cmajor,$cminor,$needsrelease) = @_;
1.504 raeburn 4694: my $desc;
1.514 raeburn 4695: my %stringtypes = (
1.519 raeburn 4696: type => 'string_questiontype',
4697: lenient => 'string_lenient',
4698: retrypartial => 'string_yesno',
1.521 raeburn 4699: discussvote => 'string_discussvote',
1.533 raeburn 4700: examcode => 'string_examcode',
1.514 raeburn 4701: );
4702: if (exists($stringtypes{$name})) {
1.533 raeburn 4703: if ($name eq 'examcode') {
1.535 raeburn 4704: $desc = $value;
1.533 raeburn 4705: } elsif (ref($strings{$stringtypes{$name}}) eq 'ARRAY') {
1.514 raeburn 4706: foreach my $possibilities (@{ $strings{$stringtypes{$name}} }) {
4707: next unless (ref($possibilities) eq 'ARRAY');
4708: my ($parmval, $description) = @{ $possibilities };
4709: if ($parmval eq $value) {
4710: $desc = $description;
4711: last;
4712: }
1.504 raeburn 4713: }
4714: }
4715: }
1.514 raeburn 4716: my $standard_name = &standard_parameter_names($name);
1.504 raeburn 4717: return '<p class="LC_warning">'.
1.514 raeburn 4718: &mt('[_1] was [_2]not[_3] set to [_4].',
4719: $standard_name,'<b>','</b>','"'.$desc.'"').'<br />'.
1.504 raeburn 4720: &mt('LON-CAPA version ([_1]) installed on home server ([_2]) does not meet version requirements ([_3] or newer).',
4721: $cmajor.'.'.$cminor,$chostname,
4722: $needsrelease).
4723: '</p>';
4724: }
1.259 banghart 4725:
1.30 www 4726: sub handler {
1.43 albertel 4727: my $r=shift;
1.30 www 4728:
1.376 albertel 4729: &reset_caches();
4730:
1.414 droeschl 4731: &Apache::loncommon::content_type($r,'text/html');
4732: $r->send_http_header;
4733: return OK if $r->header_only;
4734:
1.193 albertel 4735: &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
1.473 amueller 4736: ['action','state',
1.205 www 4737: 'pres_marker',
4738: 'pres_value',
1.206 www 4739: 'pres_type',
1.506 www 4740: 'filter','part',
1.390 www 4741: 'udom','uname','symb','serial','timebase']);
1.131 www 4742:
1.83 bowersj2 4743:
1.193 albertel 4744: &Apache::lonhtmlcommon::clear_breadcrumbs();
1.194 albertel 4745: &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/parmset",
1.507 www 4746: text=>"Content and Problem Settings",
1.473 amueller 4747: faq=>10,
4748: bug=>'Instructor Interface',
1.442 droeschl 4749: help =>
4750: 'Parameter_Manager,Course_Environment,Parameter_Helper,Parameter_Overview,Table_Mode'});
1.203 www 4751:
1.30 www 4752: # ----------------------------------------------------- Needs to be in a course
1.194 albertel 4753: my $parm_permission =
1.473 amueller 4754: (&Apache::lonnet::allowed('opa',$env{'request.course.id'}) ||
4755: &Apache::lonnet::allowed('opa',$env{'request.course.id'}.'/'.
4756: $env{'request.course.sec'}));
1.355 albertel 4757: my $exists = &check_for_course_info();
4758:
4759: if ($env{'request.course.id'} && $parm_permission && $exists) {
1.193 albertel 4760: #
4761: # Main switch on form.action and form.state, as appropriate
4762: #
4763: # Check first if coming from someone else headed directly for
4764: # the table mode
4765: if ((($env{'form.command'} eq 'set') && ($env{'form.url'})
1.473 amueller 4766: && (!$env{'form.dis'})) || ($env{'form.symb'})) {
4767: &assessparms($r);
1.193 albertel 4768: } elsif (! exists($env{'form.action'})) {
4769: &print_main_menu($r,$parm_permission);
1.414 droeschl 4770: } elsif ($env{'form.action'} eq 'setoverview') {
1.473 amueller 4771: &overview($r);
4772: } elsif ($env{'form.action'} eq 'addmetadata') {
4773: &addmetafield($r);
4774: } elsif ($env{'form.action'} eq 'ordermetadata') {
4775: &order_meta_fields($r);
1.414 droeschl 4776: } elsif ($env{'form.action'} eq 'setrestrictmeta') {
1.473 amueller 4777: &setrestrictmeta($r);
1.414 droeschl 4778: } elsif ($env{'form.action'} eq 'newoverview') {
1.473 amueller 4779: &newoverview($r);
1.414 droeschl 4780: } elsif ($env{'form.action'} eq 'setdefaults') {
1.473 amueller 4781: &defaultsetter($r);
4782: } elsif ($env{'form.action'} eq 'settable') {
4783: &assessparms($r);
1.414 droeschl 4784: } elsif ($env{'form.action'} eq 'parameterchangelog') {
1.473 amueller 4785: &parm_change_log($r);
1.414 droeschl 4786: } elsif ($env{'form.action'} eq 'cleanparameters') {
1.473 amueller 4787: &clean_parameters($r);
1.414 droeschl 4788: } elsif ($env{'form.action'} eq 'dateshift1') {
1.390 www 4789: &date_shift_one($r);
1.414 droeschl 4790: } elsif ($env{'form.action'} eq 'dateshift2') {
1.390 www 4791: &date_shift_two($r);
1.446 bisitz 4792: }
1.43 albertel 4793: } else {
1.1 www 4794: # ----------------------------- Not in a course, or not allowed to modify parms
1.473 amueller 4795: if ($exists) {
4796: $env{'user.error.msg'}=
4797: "/adm/parmset:opa:0:0:Cannot modify assessment parameters";
4798: } else {
4799: $env{'user.error.msg'}=
4800: "/adm/parmset::0:1:Course environment gone, reinitialize the course";
4801: }
4802: return HTTP_NOT_ACCEPTABLE;
1.43 albertel 4803: }
1.376 albertel 4804: &reset_caches();
4805:
1.43 albertel 4806: return OK;
1.1 www 4807: }
4808:
4809: 1;
4810: __END__
4811:
4812:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>