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