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