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