Annotation of loncom/interface/lonparmset.pm, revision 1.316

1.1       www         1: # The LearningOnline Network with CAPA
                      2: # Handler to set parameters for assessments
                      3: #
1.316   ! albertel    4: # $Id: lonparmset.pm,v 1.315 2006/06/23 05:05:33 albertel 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: 
                     47: =over 4
                     48: 
                     49: =cut
                     50: 
                     51: ###################################################################
                     52: ###################################################################
1.1       www        53: 
                     54: package Apache::lonparmset;
                     55: 
                     56: use strict;
                     57: use Apache::lonnet;
                     58: use Apache::Constants qw(:common :http REDIRECT);
1.88      matthew    59: use Apache::lonhtmlcommon();
1.36      albertel   60: use Apache::loncommon;
1.1       www        61: use GDBM_File;
1.57      albertel   62: use Apache::lonhomework;
                     63: use Apache::lonxml;
1.130     www        64: use Apache::lonlocal;
1.197     www        65: use Apache::lonnavmaps;
1.307     raeburn    66: use Apache::longroup;
1.303     www        67: use Apache::lonrss;
1.308     www        68: use LONCAPA;
1.1       www        69: 
1.198     www        70: # --- Caches local to lonparmset
1.2       www        71: 
1.199     www        72: my $parmhashid;
                     73: my %parmhash;
1.201     www        74: my $symbsid;
                     75: my %symbs;
1.221     www        76: my $rulesid;
                     77: my %rules;
1.198     www        78: 
                     79: # --- end local caches
                     80: 
1.59      matthew    81: ##################################################
                     82: ##################################################
                     83: 
                     84: =pod
                     85: 
                     86: =item parmval
                     87: 
                     88: Figure out a cascading parameter.
                     89: 
1.71      albertel   90: Inputs:  $what - a parameter spec (incluse part info and name I.E. 0.weight)
1.162     albertel   91:          $id   - a bighash Id number
1.71      albertel   92:          $def  - the resource's default value   'stupid emacs
                     93: 
1.269     raeburn    94: 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   95: 
1.306     albertel   96: 14- General Course
                     97: 13- Map or Folder level in course
1.269     raeburn    98: 12- resource default
                     99: 11- map default
1.306     albertel  100: 10- resource level in course
1.269     raeburn   101: 9 - General for section
                    102: 8 - Map or Folder level for section
                    103: 7 - resource level in section
                    104: 6 - General for group
                    105: 5 - Map or Folder level for group
                    106: 4 - resource level in group
1.71      albertel  107: 3 - General for specific student
1.82      www       108: 2 - Map or Folder level for specific student
1.71      albertel  109: 1 - resource level for specific student
1.2       www       110: 
1.59      matthew   111: =cut
                    112: 
                    113: ##################################################
1.2       www       114: sub parmval {
1.275     raeburn   115:     my ($what,$id,$def,$uname,$udom,$csec,$cgroup,$courseopt)=@_;
                    116:     return &parmval_by_symb($what,&symbcache($id),$def,$uname,$udom,$csec,
                    117:                                                            $cgroup,$courseopt);
1.201     www       118: }
                    119: 
                    120: sub parmval_by_symb {
1.275     raeburn   121:     my ($what,$symb,$def,$uname,$udom,$csec,$cgroup,$courseopt)=@_;
1.198     www       122: # load caches
                    123:     &cacheparmhash();
1.200     www       124: 
                    125:     my $useropt=&Apache::lonnet::get_userresdata($uname,$udom);
                    126: 
1.8       www       127:     my $result='';
1.44      albertel  128:     my @outpar=();
1.2       www       129: # ----------------------------------------------------- Cascading lookup scheme
1.201     www       130:     my $map=(&Apache::lonnet::decode_symb($symb))[0];    
1.305     albertel  131:     $map = &Apache::lonnet::deversion($map);
1.10      www       132: 
1.201     www       133:     my $symbparm=$symb.'.'.$what;
                    134:     my $mapparm=$map.'___(all).'.$what;
1.10      www       135: 
1.269     raeburn   136:     my $grplevel=$env{'request.course.id'}.'.['.$cgroup.'].'.$what;
                    137:     my $grplevelr=$env{'request.course.id'}.'.['.$cgroup.'].'.$symbparm;
                    138:     my $grplevelm=$env{'request.course.id'}.'.['.$cgroup.'].'.$mapparm;
                    139: 
1.190     albertel  140:     my $seclevel=$env{'request.course.id'}.'.['.$csec.'].'.$what;
                    141:     my $seclevelr=$env{'request.course.id'}.'.['.$csec.'].'.$symbparm;
                    142:     my $seclevelm=$env{'request.course.id'}.'.['.$csec.'].'.$mapparm;
                    143: 
                    144:     my $courselevel=$env{'request.course.id'}.'.'.$what;
                    145:     my $courselevelr=$env{'request.course.id'}.'.'.$symbparm;
                    146:     my $courselevelm=$env{'request.course.id'}.'.'.$mapparm;
1.2       www       147: 
1.11      www       148: 
1.182     albertel  149: # --------------------------------------------------------- first, check course
1.11      www       150: 
1.200     www       151:     if (defined($$courseopt{$courselevel})) {
1.269     raeburn   152: 	$outpar[14]=$$courseopt{$courselevel};
                    153: 	$result=14;
1.43      albertel  154:     }
1.11      www       155: 
1.200     www       156:     if (defined($$courseopt{$courselevelm})) {
1.269     raeburn   157: 	$outpar[13]=$$courseopt{$courselevelm};
                    158: 	$result=13;
1.43      albertel  159:     }
1.11      www       160: 
1.182     albertel  161: # ------------------------------------------------------- second, check default
                    162: 
1.269     raeburn   163:     if (defined($def)) { $outpar[12]=$def; $result=12; }
1.182     albertel  164: 
                    165: # ------------------------------------------------------ third, check map parms
                    166: 
                    167:     my $thisparm=$parmhash{$symbparm};
1.269     raeburn   168:     if (defined($thisparm)) { $outpar[11]=$thisparm; $result=11; }
1.182     albertel  169: 
1.200     www       170:     if (defined($$courseopt{$courselevelr})) {
1.269     raeburn   171: 	$outpar[10]=$$courseopt{$courselevelr};
                    172: 	$result=10;
1.43      albertel  173:     }
1.11      www       174: 
1.182     albertel  175: # ------------------------------------------------------ fourth, back to course
1.71      albertel  176:     if (defined($csec)) {
1.200     www       177:         if (defined($$courseopt{$seclevel})) {
1.269     raeburn   178: 	    $outpar[9]=$$courseopt{$seclevel};
                    179: 	    $result=9;
1.43      albertel  180: 	}
1.200     www       181:         if (defined($$courseopt{$seclevelm})) {
1.269     raeburn   182: 	    $outpar[8]=$$courseopt{$seclevelm};
                    183: 	    $result=8;
1.43      albertel  184: 	}
                    185: 
1.200     www       186:         if (defined($$courseopt{$seclevelr})) {
1.269     raeburn   187: 	    $outpar[7]=$$courseopt{$seclevelr};
                    188: 	    $result=7;
1.43      albertel  189: 	}
                    190:     }
1.275     raeburn   191: # ------------------------------------------------------ fifth, check course group
1.269     raeburn   192:     if (defined($cgroup)) {
                    193:         if (defined($$courseopt{$grplevel})) {
                    194:             $outpar[6]=$$courseopt{$grplevel};
                    195:             $result=6;
                    196:         }
                    197:         if (defined($$courseopt{$grplevelm})) {
                    198:             $outpar[5]=$$courseopt{$grplevelm};
                    199:             $result=5;
                    200:         }
                    201:         if (defined($$courseopt{$grplevelr})) {
                    202:             $outpar[4]=$$courseopt{$grplevelr};
                    203:             $result=4;
                    204:         }
                    205:     }
1.11      www       206: 
1.182     albertel  207: # ---------------------------------------------------------- fifth, check user
1.11      www       208: 
1.71      albertel  209:     if (defined($uname)) {
1.200     www       210: 	if (defined($$useropt{$courselevel})) {
                    211: 	    $outpar[3]=$$useropt{$courselevel};
1.43      albertel  212: 	    $result=3;
                    213: 	}
1.10      www       214: 
1.200     www       215: 	if (defined($$useropt{$courselevelm})) {
                    216: 	    $outpar[2]=$$useropt{$courselevelm};
1.43      albertel  217: 	    $result=2;
                    218: 	}
1.2       www       219: 
1.200     www       220: 	if (defined($$useropt{$courselevelr})) {
                    221: 	    $outpar[1]=$$useropt{$courselevelr};
1.43      albertel  222: 	    $result=1;
                    223: 	}
                    224:     }
1.44      albertel  225:     return ($result,@outpar);
1.2       www       226: }
                    227: 
1.198     www       228: sub resetparmhash {
                    229:     $parmhashid='';
                    230: }
                    231: 
                    232: sub cacheparmhash {
                    233:     if ($parmhashid eq  $env{'request.course.fn'}) { return; }
                    234:     my %parmhashfile;
                    235:     if (tie(%parmhashfile,'GDBM_File',
                    236: 	      $env{'request.course.fn'}.'_parms.db',&GDBM_READER(),0640)) {
                    237: 	%parmhash=%parmhashfile;
                    238: 	untie %parmhashfile;
                    239: 	$parmhashid=$env{'request.course.fn'};
                    240:     }
                    241: }
                    242: 
1.203     www       243: sub resetsymbcache {
                    244:     $symbsid='';
                    245: }
                    246: 
1.201     www       247: sub symbcache {
                    248:     my $id=shift;
                    249:     if ($symbsid ne $env{'request.course.id'}) {
                    250: 	%symbs=();
                    251:     }
                    252:     unless ($symbs{$id}) {
                    253: 	my $navmap = Apache::lonnavmaps::navmap->new();
                    254: 	if ($id=~/\./) {
                    255: 	    my $resource=$navmap->getById($id);
                    256: 	    $symbs{$id}=$resource->symb();
                    257: 	} else {
                    258: 	    my $resource=$navmap->getByMapPc($id);
                    259: 	    $symbs{$id}=&Apache::lonnet::declutter($resource->src());
                    260: 	}
                    261: 	$symbsid=$env{'request.course.id'};
                    262:     }
                    263:     return $symbs{$id};
                    264: }
                    265: 
1.221     www       266: sub resetrulescache {
                    267:     $rulesid='';
                    268: }
                    269: 
                    270: sub rulescache {
                    271:     my $id=shift;
                    272:     if ($rulesid ne $env{'request.course.id'}) {
                    273: 	%rules=();
                    274:     }
1.224     www       275:     unless (defined($rules{$id})) {
1.221     www       276: 	my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                    277: 	my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.224     www       278: 	%rules=&Apache::lonnet::dump('parmdefactions',$dom,$crs);
1.221     www       279: 	$rulesid=$env{'request.course.id'};
                    280:     }
                    281:     return $rules{$id};
                    282: }
                    283: 
1.229     www       284: sub preset_defaults {
                    285:     my $type=shift;
                    286:     if (&rulescache($type.'_action') eq 'default') {
                    287: # yes, there is something
                    288: 	return (&rulescache($type.'_hours'),
                    289: 		&rulescache($type.'_min'),
                    290: 		&rulescache($type.'_sec'),
                    291: 		&rulescache($type.'_value'));
                    292:     } else {
                    293: # nothing there or something else
                    294: 	return ('','','','','');
                    295:     }
                    296: }
                    297: 
1.186     www       298: ##################################################
1.277     www       299: 
                    300: sub date_sanity_info {
                    301:    my $checkdate=shift;
                    302:    unless ($checkdate) { return ''; }
                    303:    my $result='';
                    304:    my $crsprefix='course.'.$env{'request.course.id'}.'.';
                    305:    if ($env{$crsprefix.'default_enrollment_end_date'}) {
                    306:       if ($checkdate>$env{$crsprefix.'default_enrollment_end_date'}) {
                    307:          $result.='<br />'.&mt('After course enrollment end!');
                    308:       }
                    309:    }
                    310:    if ($env{$crsprefix.'default_enrollment_start_date'}) {
                    311:       if ($checkdate<$env{$crsprefix.'default_enrollment_start_date'}) {
                    312:          $result.='<br />'.&mt('Before course enrollment start!');
                    313:       }
                    314:    }
                    315:    return $result;
                    316: }
                    317: ##################################################
1.186     www       318: ##################################################
                    319: #
1.197     www       320: # Store a parameter by ID
1.186     www       321: #
                    322: # Takes
                    323: # - resource id
                    324: # - name of parameter
                    325: # - level
                    326: # - new value
                    327: # - new type
1.187     www       328: # - username
                    329: # - userdomain
                    330: 
1.186     www       331: sub storeparm {
1.269     raeburn   332:     my ($sresid,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,$cgroup)=@_;
1.275     raeburn   333:     &storeparm_by_symb(&symbcache($sresid),$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,'',$cgroup);
1.197     www       334: }
                    335: 
                    336: #
                    337: # Store a parameter by symb
                    338: #
                    339: # Takes
                    340: # - symb
                    341: # - name of parameter
                    342: # - level
                    343: # - new value
                    344: # - new type
                    345: # - username
                    346: # - userdomain
                    347: 
1.226     www       348: my %recstack;
1.197     www       349: sub storeparm_by_symb {
1.275     raeburn   350:     my ($symb,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,$recflag,$cgroup)=@_;
1.226     www       351:     unless ($recflag) {
                    352: # first time call
                    353: 	%recstack=();
                    354: 	$recflag=1;
                    355:     }
                    356: # store parameter
                    357:     &storeparm_by_symb_inner
1.269     raeburn   358: 	($symb,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,$cgroup);
1.266     www       359: # don't do anything if parameter was reset
                    360:     unless ($nval) { return; }
1.226     www       361:     my ($prefix,$parm)=($spnam=~/^(.*[\_\.])([^\_\.]+)$/);
                    362: # remember that this was set
                    363:     $recstack{$parm}=1;
                    364: # what does this trigger?
                    365:     foreach my $triggered (split(/\:/,&rulescache($parm.'_triggers'))) {
                    366: # don't backfire
                    367:        unless ((!$triggered) || ($recstack{$triggered})) {
                    368: 	   my $action=&rulescache($triggered.'_action');
                    369: 	   my ($whichaction,$whichparm)=($action=~/^(.*\_)([^\_]+)$/);
                    370: # set triggered parameter on same level
                    371: 	   my $newspnam=$prefix.$triggered;
1.227     www       372: 	   my $newvalue='';
1.228     www       373: 	   my $active=1;
                    374: 	   if ($action=~/^when\_setting/) {
                    375: # are there restrictions?
                    376: 	       if (&rulescache($triggered.'_triggervalue')=~/\w/) {
                    377: 		   $active=0;
                    378: 		   foreach my $possiblevalue (split(/\s*\,\s*/,&rulescache($triggered.'_triggervalue'))) {
                    379: 		       if (lc($possiblevalue) eq lc($nval)) { $active=1; }
                    380: 		   }
                    381: 	       }
                    382: 	       $newvalue=&rulescache($triggered.'_value');
1.227     www       383: 	   } else {
                    384: 	       my $totalsecs=((&rulescache($triggered.'_days')*24+&rulescache($triggered.'_hours'))*60+&rulescache($triggered.'_min'))*60+&rulescache($triggered.'_sec');
1.228     www       385: 	       if ($action=~/^later\_than/) {
                    386: 		   $newvalue=$nval+$totalsecs;
                    387: 	       } else {
                    388: 		   $newvalue=$nval-$totalsecs;
                    389: 	       }
                    390: 	   }
                    391: 	   if ($active) {
                    392: 	       &storeparm_by_symb($symb,$newspnam,$snum,$newvalue,&rulescache($triggered.'_type'),
1.275     raeburn   393: 				   $uname,$udom,$csec,$recflag,$cgroup);
1.227     www       394: 	   }
1.226     www       395:        }
                    396:     }
                    397:     return '';
                    398: }
                    399: 
1.293     www       400: sub log_parmset {
                    401:     return &Apache::lonnet::instructor_log('parameterlog',@_);
1.284     www       402: }
                    403: 
1.226     www       404: sub storeparm_by_symb_inner {
1.197     www       405: # ---------------------------------------------------------- Get symb, map, etc
1.269     raeburn   406:     my ($symb,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,$cgroup)=@_;
1.197     www       407: # ---------------------------------------------------------- Construct prefixes
1.186     www       408:     $spnam=~s/\_([^\_]+)$/\.$1/;
1.197     www       409:     my $map=(&Apache::lonnet::decode_symb($symb))[0];    
1.305     albertel  410:     $map = &Apache::lonnet::deversion($map);
                    411: 
1.197     www       412:     my $symbparm=$symb.'.'.$spnam;
                    413:     my $mapparm=$map.'___(all).'.$spnam;
                    414: 
1.269     raeburn   415:     my $grplevel=$env{'request.course.id'}.'.['.$cgroup.'].'.$spnam;
                    416:     my $grplevelr=$env{'request.course.id'}.'.['.$cgroup.'].'.$symbparm;
                    417:     my $grplevelm=$env{'request.course.id'}.'.['.$cgroup.'].'.$mapparm;
                    418: 
1.190     albertel  419:     my $seclevel=$env{'request.course.id'}.'.['.$csec.'].'.$spnam;
                    420:     my $seclevelr=$env{'request.course.id'}.'.['.$csec.'].'.$symbparm;
                    421:     my $seclevelm=$env{'request.course.id'}.'.['.$csec.'].'.$mapparm;
1.186     www       422:     
1.190     albertel  423:     my $courselevel=$env{'request.course.id'}.'.'.$spnam;
                    424:     my $courselevelr=$env{'request.course.id'}.'.'.$symbparm;
                    425:     my $courselevelm=$env{'request.course.id'}.'.'.$mapparm;
1.186     www       426:     
                    427:     my $storeunder='';
1.269     raeburn   428:     if (($snum==14) || ($snum==3)) { $storeunder=$courselevel; }
                    429:     if (($snum==13) || ($snum==2)) { $storeunder=$courselevelm; }
                    430:     if (($snum==10) || ($snum==1)) { $storeunder=$courselevelr; }
                    431:     if ($snum==9) { $storeunder=$seclevel; }
                    432:     if ($snum==8) { $storeunder=$seclevelm; }
                    433:     if ($snum==7) { $storeunder=$seclevelr; }
                    434:     if ($snum==6) { $storeunder=$grplevel; }
                    435:     if ($snum==5) { $storeunder=$grplevelm; }
                    436:     if ($snum==4) { $storeunder=$grplevelr; }
                    437: 
1.186     www       438:     
                    439:     my $delete;
                    440:     if ($nval eq '') { $delete=1;}
                    441:     my %storecontent = ($storeunder         => $nval,
                    442: 			$storeunder.'.type' => $ntype);
                    443:     my $reply='';
                    444:     if ($snum>3) {
                    445: # ---------------------------------------------------------------- Store Course
                    446: #
1.200     www       447: 	my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
                    448: 	my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
1.186     www       449: # Expire sheets
                    450: 	&Apache::lonnet::expirespread('','','studentcalc');
1.269     raeburn   451: 	if (($snum==10) || ($snum==7) || ($snum==4)) {
1.197     www       452: 	    &Apache::lonnet::expirespread('','','assesscalc',$symb);
1.269     raeburn   453: 	} elsif (($snum==11) || ($snum==8) || ($snum==5)) {
1.197     www       454: 	    &Apache::lonnet::expirespread('','','assesscalc',$map);
1.186     www       455: 	} else {
                    456: 	    &Apache::lonnet::expirespread('','','assesscalc');
                    457: 	}
                    458: # Store parameter
                    459: 	if ($delete) {
                    460: 	    $reply=&Apache::lonnet::del
1.200     www       461: 		('resourcedata',[keys(%storecontent)],$cdom,$cnum);
1.290     www       462:             &log_parmset(\%storecontent,1);
1.186     www       463: 	} else {
                    464: 	    $reply=&Apache::lonnet::cput
1.200     www       465: 		('resourcedata',\%storecontent,$cdom,$cnum);
1.290     www       466: 	    &log_parmset(\%storecontent);
1.186     www       467: 	}
1.200     www       468: 	&Apache::lonnet::devalidatecourseresdata($cnum,$cdom);
1.186     www       469:     } else {
                    470: # ------------------------------------------------------------------ Store User
                    471: #
                    472: # Expire sheets
                    473: 	&Apache::lonnet::expirespread($uname,$udom,'studentcalc');
                    474: 	if ($snum==1) {
                    475: 	    &Apache::lonnet::expirespread
1.197     www       476: 		($uname,$udom,'assesscalc',$symb);
1.186     www       477: 	} elsif ($snum==2) {
                    478: 	    &Apache::lonnet::expirespread
1.197     www       479: 		($uname,$udom,'assesscalc',$map);
1.186     www       480: 	} else {
                    481: 	    &Apache::lonnet::expirespread($uname,$udom,'assesscalc');
                    482: 	}
                    483: # Store parameter
                    484: 	if ($delete) {
                    485: 	    $reply=&Apache::lonnet::del
                    486: 		('resourcedata',[keys(%storecontent)],$udom,$uname);
1.290     www       487: 	    &log_parmset(\%storecontent,1,$uname,$udom);
1.186     www       488: 	} else {
                    489: 	    $reply=&Apache::lonnet::cput
                    490: 		('resourcedata',\%storecontent,$udom,$uname);
1.290     www       491: 	    &log_parmset(\%storecontent,0,$uname,$udom);
1.186     www       492: 	}
1.191     albertel  493: 	&Apache::lonnet::devalidateuserresdata($uname,$udom);
1.186     www       494:     }
                    495:     
                    496:     if ($reply=~/^error\:(.*)/) {
1.314     albertel  497: 	return "<span class=\"LC_error\">Write Error: $1</span>";
1.186     www       498:     }
                    499:     return '';
                    500: }
                    501: 
1.59      matthew   502: ##################################################
                    503: ##################################################
                    504: 
                    505: =pod
                    506: 
                    507: =item valout
                    508: 
                    509: Format a value for output.
                    510: 
                    511: Inputs:  $value, $type
                    512: 
                    513: Returns: $value, formatted for output.  If $type indicates it is a date,
                    514: localtime($value) is returned.
1.9       www       515: 
1.59      matthew   516: =cut
                    517: 
                    518: ##################################################
                    519: ##################################################
1.9       www       520: sub valout {
                    521:     my ($value,$type)=@_;
1.59      matthew   522:     my $result = '';
                    523:     # Values of zero are valid.
                    524:     if (! $value && $value ne '0') {
1.71      albertel  525: 	$result = '&nbsp;&nbsp;';
1.59      matthew   526:     } else {
1.66      www       527:         if ($type eq 'date_interval') {
                    528:             my ($sec,$min,$hour,$mday,$mon,$year)=gmtime($value);
                    529:             $year=$year-70;
                    530:             $mday--;
                    531:             if ($year) {
                    532: 		$result.=$year.' yrs ';
                    533:             }
                    534:             if ($mon) {
                    535: 		$result.=$mon.' mths ';
                    536:             }
                    537:             if ($mday) {
                    538: 		$result.=$mday.' days ';
                    539:             }
                    540:             if ($hour) {
                    541: 		$result.=$hour.' hrs ';
                    542:             }
                    543:             if ($min) {
                    544: 		$result.=$min.' mins ';
                    545:             }
                    546:             if ($sec) {
                    547: 		$result.=$sec.' secs ';
                    548:             }
                    549:             $result=~s/\s+$//;
1.213     www       550:         } elsif (&isdateparm($type)) {
1.277     www       551:             $result = localtime($value).&date_sanity_info($value);
1.59      matthew   552:         } else {
                    553:             $result = $value;
                    554:         }
                    555:     }
                    556:     return $result;
1.9       www       557: }
                    558: 
1.59      matthew   559: ##################################################
                    560: ##################################################
                    561: 
                    562: =pod
1.5       www       563: 
1.59      matthew   564: =item plink
                    565: 
                    566: Produces a link anchor.
                    567: 
                    568: Inputs: $type,$dis,$value,$marker,$return,$call
                    569: 
                    570: Returns: scalar with html code for a link which will envoke the 
                    571: javascript function 'pjump'.
                    572: 
                    573: =cut
                    574: 
                    575: ##################################################
                    576: ##################################################
1.5       www       577: sub plink {
                    578:     my ($type,$dis,$value,$marker,$return,$call)=@_;
1.23      www       579:     my $winvalue=$value;
                    580:     unless ($winvalue) {
1.213     www       581: 	if (&isdateparm($type)) {
1.190     albertel  582:             $winvalue=$env{'form.recent_'.$type};
1.23      www       583:         } else {
1.190     albertel  584:             $winvalue=$env{'form.recent_'.(split(/\_/,$type))[0]};
1.23      www       585:         }
                    586:     }
1.229     www       587:     my ($parmname)=((split(/\&/,$marker))[1]=~/\_([^\_]+)$/);
                    588:     my ($hour,$min,$sec,$val)=&preset_defaults($parmname);
                    589:     unless (defined($winvalue)) { $winvalue=$val; }
1.270     www       590:     return '<table width="100%"><tr valign="top" align="right"><td><a name="'.$marker.'" /></td></tr><tr><td align="center">'.
1.43      albertel  591: 	'<a href="javascript:pjump('."'".$type."','".$dis."','".$winvalue."','"
1.229     www       592: 	    .$marker."','".$return."','".$call."','".$hour."','".$min."','".$sec."'".');">'.
1.270     www       593: 		&valout($value,$type).'</a></td></tr></table>';
1.5       www       594: }
                    595: 
1.280     albertel  596: sub page_js {
                    597: 
1.81      www       598:     my $selscript=&Apache::loncommon::studentbrowser_javascript();
1.88      matthew   599:     my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition();
1.280     albertel  600: 
                    601:     return(<<ENDJS);
                    602: <script type="text/javascript">
1.44      albertel  603: 
                    604:     function pclose() {
                    605:         parmwin=window.open("/adm/rat/empty.html","LONCAPAparms",
                    606:                  "height=350,width=350,scrollbars=no,menubar=no");
                    607:         parmwin.close();
                    608:     }
                    609: 
1.88      matthew   610:     $pjump_def
1.44      albertel  611: 
                    612:     function psub() {
                    613:         pclose();
                    614:         if (document.parmform.pres_marker.value!='') {
                    615:             document.parmform.action+='#'+document.parmform.pres_marker.value;
                    616:             var typedef=new Array();
                    617:             typedef=document.parmform.pres_type.value.split('_');
                    618:            if (document.parmform.pres_type.value!='') {
                    619:             if (typedef[0]=='date') {
                    620:                 eval('document.parmform.recent_'+
                    621:                      document.parmform.pres_type.value+
                    622: 		     '.value=document.parmform.pres_value.value;');
                    623:             } else {
                    624:                 eval('document.parmform.recent_'+typedef[0]+
                    625: 		     '.value=document.parmform.pres_value.value;');
                    626:             }
                    627: 	   }
                    628:             document.parmform.submit();
                    629:         } else {
                    630:             document.parmform.pres_value.value='';
                    631:             document.parmform.pres_marker.value='';
                    632:         }
                    633:     }
                    634: 
1.57      albertel  635:     function openWindow(url, wdwName, w, h, toolbar,scrollbar) {
                    636:         var options = "width=" + w + ",height=" + h + ",";
                    637:         options += "resizable=yes,scrollbars="+scrollbar+",status=no,";
                    638:         options += "menubar=no,toolbar="+toolbar+",location=no,directories=no";
                    639:         var newWin = window.open(url, wdwName, options);
                    640:         newWin.focus();
                    641:     }
1.44      albertel  642: </script>
1.81      www       643: $selscript
1.280     albertel  644: ENDJS
                    645: 
                    646: }
                    647: sub startpage {
                    648:     my ($r) = @_;
1.281     albertel  649: 
1.282     albertel  650:     my %loaditems = ('onunload' => "pclose()",
1.283     albertel  651: 		     'onload'   => "group_or_section('cgroup')",);
1.280     albertel  652: 
1.281     albertel  653:     my $start_page = 
                    654: 	&Apache::loncommon::start_page('Set/Modify Course Parameters',
                    655: 				       &page_js(),
1.282     albertel  656: 				       {'add_entries' => \%loaditems,});
1.280     albertel  657:     my $breadcrumbs = 
1.298     albertel  658: 	&Apache::lonhtmlcommon::breadcrumbs('Table Mode Parameter Setting');
1.280     albertel  659:     $r->print(<<ENDHEAD);
1.281     albertel  660: $start_page
1.193     albertel  661: $breadcrumbs
                    662: <form method="post" action="/adm/parmset?action=settable" name="parmform">
1.280     albertel  663: <input type="hidden" value='' name="pres_value" />
                    664: <input type="hidden" value='' name="pres_type" />
                    665: <input type="hidden" value='' name="pres_marker" />
                    666: <input type="hidden" value='1' name="prevvisit" />
1.44      albertel  667: ENDHEAD
                    668: }
                    669: 
1.209     www       670: 
1.44      albertel  671: sub print_row {
1.201     www       672:     my ($r,$which,$part,$name,$symbp,$rid,$default,$defaulttype,$display,$defbgone,
1.275     raeburn   673: 	$defbgtwo,$defbgthree,$parmlev,$uname,$udom,$csec,$cgroup,$usersgroups)=@_;
                    674:     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
                    675:     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                    676:     my $courseopt=&Apache::lonnet::get_courseresdata($cnum,$cdom);
1.66      www       677: # get the values for the parameter in cascading order
                    678: # empty levels will remain empty
1.44      albertel  679:     my ($result,@outpar)=&parmval($$part{$which}.'.'.$$name{$which},
1.275     raeburn   680: 	  $rid,$$default{$which},$uname,$udom,$csec,$cgroup,$courseopt);
1.66      www       681: # get the type for the parameters
                    682: # problem: these may not be set for all levels
                    683:     my ($typeresult,@typeoutpar)=&parmval($$part{$which}.'.'.
1.275     raeburn   684:                                           $$name{$which}.'.type',$rid,
                    685: 		 $$defaulttype{$which},$uname,$udom,$csec,$cgroup,$courseopt);
1.66      www       686: # cascade down manually
1.182     albertel  687:     my $cascadetype=$$defaulttype{$which};
1.269     raeburn   688:     for (my $i=14;$i>0;$i--) {
1.66      www       689: 	 if ($typeoutpar[$i]) { 
                    690:             $cascadetype=$typeoutpar[$i];
                    691: 	} else {
                    692:             $typeoutpar[$i]=$cascadetype;
                    693:         }
                    694:     }
1.57      albertel  695:     my $parm=$$display{$which};
                    696: 
1.203     www       697:     if ($parmlev eq 'full') {
1.57      albertel  698:         $r->print('<td bgcolor='.$defbgtwo.' align="center">'
                    699:                   .$$part{$which}.'</td>');
                    700:     } else {    
                    701:         $parm=~s|\[.*\]\s||g;
                    702:     }
1.231     www       703:     my $automatic=&rulescache(($which=~/\_([^\_]+)$/)[0].'_triggers');
                    704:     if ($automatic) {
1.314     albertel  705: 	$parm.='<span class="LC_warning"><br />'.&mt('Automatically sets').' '.join(', ',split(/\:/,$automatic)).'</span>';
1.231     www       706:     }
1.159     albertel  707:     $r->print('<td bgcolor='.$defbgone.'>'.$parm.'</td>');
1.57      albertel  708:    
1.44      albertel  709:     my $thismarker=$which;
                    710:     $thismarker=~s/^parameter\_//;
                    711:     my $mprefix=$rid.'&'.$thismarker.'&';
1.275     raeburn   712:     my $effective_parm = &valout($outpar[$result],$typeoutpar[$result]);
                    713:     my ($othergrp,$grp_parm,$controlgrp);
1.44      albertel  714: 
1.57      albertel  715:     if ($parmlev eq 'general') {
                    716: 
                    717:         if ($uname) {
1.66      www       718:             &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.269     raeburn   719:         } elsif ($cgroup) {
                    720:             &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57      albertel  721:         } elsif ($csec) {
1.269     raeburn   722:             &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); 
1.57      albertel  723:         } else {
1.269     raeburn   724:             &print_td($r,14,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); 
1.57      albertel  725:         }
                    726:     } elsif ($parmlev eq 'map') {
                    727: 
                    728:         if ($uname) {
1.66      www       729:             &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.269     raeburn   730:         } elsif ($cgroup) {
                    731:             &print_td($r,5,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57      albertel  732:         } elsif ($csec) {
1.269     raeburn   733:             &print_td($r,8,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57      albertel  734:         } else {
1.269     raeburn   735:             &print_td($r,13,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57      albertel  736:         }
                    737:     } else {
1.275     raeburn   738:         if ($uname) {
                    739:             if (@{$usersgroups} > 1) {
                    740:                 my ($coursereply,$grp_parm,$controlgrp);
                    741:                 ($coursereply,$othergrp,$grp_parm,$controlgrp) =
                    742:                     &print_usergroups($r,$$part{$which}.'.'.$$name{$which},
                    743:                        $rid,$cgroup,$defbgone,$usersgroups,$result,$courseopt);
                    744:                 if ($coursereply && $result > 3) {
                    745:                     if (defined($controlgrp)) {
                    746:                         if ($cgroup ne $controlgrp) {
                    747:                             $effective_parm = $grp_parm;
                    748:                             $result = 0;
                    749:                         }
                    750:                     }
                    751:                 }
                    752:             }
                    753:         }
1.57      albertel  754: 
1.269     raeburn   755:         &print_td($r,14,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57      albertel  756: 
1.269     raeburn   757: 	&print_td($r,13,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    758: 	&print_td($r,12,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    759: 	&print_td($r,11,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.203     www       760: 	&print_td($r,10,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    761: 	
                    762: 	if ($csec) {
1.269     raeburn   763: 	    &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    764: 	    &print_td($r,8,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    765: 	    &print_td($r,7,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.203     www       766: 	}
1.269     raeburn   767: 
                    768:         if ($cgroup) {
                    769:             &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    770:             &print_td($r,5,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    771:             &print_td($r,4,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    772:         }
1.275     raeburn   773:      
1.203     www       774: 	if ($uname) {
1.275     raeburn   775:             if ($othergrp) {
                    776:                 $r->print($othergrp);
                    777:             }
1.203     www       778: 	    &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    779: 	    &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    780: 	    &print_td($r,1,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    781: 	}
1.57      albertel  782: 
                    783:     } # end of $parmlev if/else
1.275     raeburn   784:     $r->print('<td bgcolor="#CCCCFF" align="center">'.$effective_parm.'</td>');
1.136     albertel  785: 
1.203     www       786:     if ($parmlev eq 'full') {
1.136     albertel  787:         my $sessionval=&Apache::lonnet::EXT('resource.'.$$part{$which}.
1.201     www       788:                                         '.'.$$name{$which},$$symbp{$rid});
1.136     albertel  789:         my $sessionvaltype=$typeoutpar[$result];
                    790:         if (!defined($sessionvaltype)) { $sessionvaltype=$$defaulttype{$which}; }
1.275     raeburn   791:         $r->print('<td bgcolor="#999999" align="center"><font color="#FFFFFF">'.
1.66      www       792:                   &valout($sessionval,$sessionvaltype).'&nbsp;'.
1.57      albertel  793:                   '</font></td>');
1.136     albertel  794:     }
1.44      albertel  795:     $r->print('</tr>');
1.57      albertel  796:     $r->print("\n");
1.44      albertel  797: }
1.59      matthew   798: 
1.44      albertel  799: sub print_td {
1.66      www       800:     my ($r,$which,$defbg,$result,$outpar,$mprefix,$value,$typeoutpar,$display)=@_;
1.57      albertel  801:     $r->print('<td bgcolor='.(($result==$which)?'"#AAFFAA"':$defbg).
1.114     www       802:               ' align="center">');
1.269     raeburn   803:     if ($which<11 || $which > 12) {
1.114     www       804: 	$r->print(&plink($$typeoutpar[$which],
                    805: 			 $$display{$value},$$outpar[$which],
                    806: 			 $mprefix."$which",'parmform.pres','psub'));
                    807:     } else {
                    808: 	$r->print(&valout($$outpar[$which],$$typeoutpar[$which]));
                    809:     }
                    810:     $r->print('</td>'."\n");
1.57      albertel  811: }
                    812: 
1.275     raeburn   813: sub print_usergroups {
                    814:     my ($r,$what,$rid,$cgroup,$defbg,$usersgroups,$result,$courseopt) = @_;
                    815:     my $courseid = $env{'request.course.id'};
                    816:     my $output;
                    817:     my $symb = &symbcache($rid);
                    818:     my $symbparm=$symb.'.'.$what;
                    819:     my $map=(&Apache::lonnet::decode_symb($symb))[0];
                    820:     my $mapparm=$map.'___(all).'.$what;
                    821:     my ($coursereply,$resultitem,$resultgroup,$resultlevel,$resulttype) =
                    822:           &parm_control_group($courseid,$usersgroups,$symbparm,$mapparm,$what,
                    823:                                                                    $courseopt);
                    824:     my $bgcolor = $defbg;
                    825:     my $grp_parm;
                    826:     if (($coursereply) && ($cgroup ne $resultgroup)) { 
                    827:         if ($result > 3) {
                    828:             $bgcolor = '"#AAFFAA"';
                    829:             $grp_parm = &valout($coursereply,$resulttype);
                    830:         }
                    831:         $grp_parm = &valout($coursereply,$resulttype);
                    832:         $output = '<td bgcolor='.$bgcolor.' align="center">';
                    833:         if ($resultgroup && $resultlevel) {
                    834:             $output .= '<small><b>'.$resultgroup.'</b> ('.$resultlevel.'): </small>'.$grp_parm;
                    835:         } else {
                    836:             $output .= '&nbsp;';
                    837:         }
                    838:         $output .= '</td>';
                    839:     } else {
                    840:         $output .= '<td bgcolor='.$bgcolor.'>&nbsp;</td>';
                    841:     }
                    842:     return ($coursereply,$output,$grp_parm,$resultgroup);
                    843: }
                    844: 
                    845: sub parm_control_group {
                    846:     my ($courseid,$usersgroups,$symbparm,$mapparm,$what,$courseopt) = @_;
                    847:     my ($coursereply,$resultitem,$resultgroup,$resultlevel,$resulttype);
                    848:     my $grpfound = 0;
                    849:     my @levels = ($symbparm,$mapparm,$what);
                    850:     my @levelnames = ('resource','map/folder','general');
                    851:     foreach my $group (@{$usersgroups}) {
                    852:         if ($grpfound) { last; }
                    853:         for (my $i=0; $i<@levels; $i++) {
                    854:             my $item = $courseid.'.['.$group.'].'.$levels[$i];
                    855:             if (defined($$courseopt{$item})) {
                    856:                 $coursereply = $$courseopt{$item};
                    857:                 $resultitem = $item;
                    858:                 $resultgroup = $group;
                    859:                 $resultlevel = $levelnames[$i];
                    860:                 $resulttype = $$courseopt{$item.'.type'};
                    861:                 $grpfound = 1;
                    862:                 last;
                    863:             }
                    864:         }
                    865:     }
                    866:     return($coursereply,$resultitem,$resultgroup,$resultlevel,$resulttype);
                    867: }
1.201     www       868: 
1.63      bowersj2  869: =pod
                    870: 
                    871: =item B<extractResourceInformation>: Given the course data hash, extractResourceInformation extracts lots of information about the course's resources into a variety of hashes.
                    872: 
                    873: Input: See list below:
                    874: 
                    875: =over 4
                    876: 
                    877: =item B<ids>: An array that will contain all of the ids in the course.
                    878: 
                    879: =item B<typep>: hash, id->type, where "type" contains the extension of the file, thus, I<problem exam quiz assess survey form>.
                    880: 
1.171     www       881: =item B<keyp>: hash, id->key list, will contain a comma separated list of the meta-data keys available for the given id
1.63      bowersj2  882: 
                    883: =item B<allparms>: hash, name of parameter->display value (what is the display value?)
                    884: 
                    885: =item B<allparts>: hash, part identification->text representation of part, where the text representation is "[Part $part]"
                    886: 
                    887: =item B<allkeys>: hash, full key to part->display value (what's display value?)
                    888: 
                    889: =item B<allmaps>: hash, ???
                    890: 
                    891: =item B<fcat>: ???
                    892: 
                    893: =item B<defp>: hash, ???
                    894: 
                    895: =item B<mapp>: ??
                    896: 
                    897: =item B<symbp>: hash, id->full sym?
                    898: 
                    899: =back
                    900: 
                    901: =cut
                    902: 
                    903: sub extractResourceInformation {
                    904:     my $ids = shift;
                    905:     my $typep = shift;
                    906:     my $keyp = shift;
                    907:     my $allparms = shift;
                    908:     my $allparts = shift;
                    909:     my $allmaps = shift;
                    910:     my $mapp = shift;
                    911:     my $symbp = shift;
1.82      www       912:     my $maptitles=shift;
1.196     www       913:     my $uris=shift;
1.210     www       914:     my $keyorder=shift;
1.211     www       915:     my $defkeytype=shift;
1.196     www       916: 
1.210     www       917:     my $keyordercnt=100;
1.63      bowersj2  918: 
1.196     www       919:     my $navmap = Apache::lonnavmaps::navmap->new();
                    920:     my @allres=$navmap->retrieveResources(undef,undef,1,undef,1);
                    921:     foreach my $resource (@allres) {
                    922: 	my $id=$resource->id();
                    923:         my ($mapid,$resid)=split(/\./,$id);
                    924: 	if ($mapid eq '0') { next; }
                    925: 	$$ids[$#$ids+1]=$id;
                    926: 	my $srcf=$resource->src();
                    927: 	$srcf=~/\.(\w+)$/;
                    928: 	$$typep{$id}=$1;
                    929: 	$$keyp{$id}='';
                    930:         $$uris{$id}=$srcf;
                    931: 	foreach (split(/\,/,&Apache::lonnet::metadata($srcf,'allpossiblekeys'))) {
                    932: 	    if ($_=~/^parameter\_(.*)/) {
                    933: 		my $key=$_;
1.209     www       934: # Hidden parameters
                    935: 		if (&Apache::lonnet::metadata($srcf,$key.'.hidden') eq 'parm') {
                    936: 		    next;
1.63      bowersj2  937: 		}
1.196     www       938: 		my $display= &Apache::lonnet::metadata($srcf,$key.'.display');
                    939: 		my $name=&Apache::lonnet::metadata($srcf,$key.'.name');
                    940: 		my $part= &Apache::lonnet::metadata($srcf,$key.'.part');
1.209     www       941: #
                    942: # allparms is a hash of parameter names
                    943: #
1.196     www       944: 		my $parmdis = $display;
1.209     www       945: 		$parmdis =~ s/\[Part.*$//g;
                    946:                 $$allparms{$name}=$parmdis;
1.211     www       947: 		$$defkeytype{$name}=&Apache::lonnet::metadata($srcf,$key.'.type');
1.209     www       948: #
                    949: # allparts is a hash of all parts
                    950: #
                    951: 		$$allparts{$part} = "Part: $part";
                    952: #
                    953: # Remember all keys going with this resource
                    954: #
1.196     www       955: 		if ($$keyp{$id}) {
                    956: 		    $$keyp{$id}.=','.$key;
1.175     albertel  957: 		} else {
1.196     www       958: 		    $$keyp{$id}=$key;
1.175     albertel  959: 		}
1.210     www       960: #
                    961: # Put in order
                    962: # 
                    963:                 unless ($$keyorder{$key}) {
                    964:                     $$keyorder{$key}=$keyordercnt;
                    965:                     $keyordercnt++;
                    966: 		}
                    967: 
1.63      bowersj2  968: 	    }
                    969: 	}
1.196     www       970: 	$$mapp{$id}=
                    971: 	    &Apache::lonnet::declutter($resource->enclosing_map_src());
                    972: 	$$mapp{$mapid}=$$mapp{$id};
                    973: 	$$allmaps{$mapid}=$$mapp{$id};
                    974: 	if ($mapid eq '1') {
                    975: 	    $$maptitles{$mapid}='Main Course Documents';
                    976: 	} else {
                    977: 	    $$maptitles{$mapid}=&Apache::lonnet::gettitle(&Apache::lonnet::clutter($$mapp{$id}));
                    978: 	}
                    979: 	$$maptitles{$$mapp{$id}}=$$maptitles{$mapid};
                    980: 	$$symbp{$id}=&Apache::lonnet::encode_symb($$mapp{$id},$resid,$srcf);
                    981: 	$$symbp{$mapid}=$$mapp{$id}.'___(all)';
1.63      bowersj2  982:     }
                    983: }
                    984: 
1.208     www       985: 
                    986: ##################################################
                    987: ##################################################
                    988: 
1.213     www       989: sub isdateparm {
                    990:     my $type=shift;
                    991:     return (($type=~/^date/) && (!($type eq 'date_interval')));
                    992: }
                    993: 
1.208     www       994: sub parmmenu {
1.211     www       995:     my ($r,$allparms,$pscat,$keyorder)=@_;
1.208     www       996:     my $tempkey;
                    997:     $r->print(<<ENDSCRIPT);
                    998: <script type="text/javascript">
                    999:     function checkall(value, checkName) {
                   1000: 	for (i=0; i<document.forms.parmform.elements.length; i++) {
                   1001:             ele = document.forms.parmform.elements[i];
                   1002:             if (ele.name == checkName) {
                   1003:                 document.forms.parmform.elements[i].checked=value;
                   1004:             }
                   1005:         }
                   1006:     }
1.210     www      1007: 
                   1008:     function checkthis(thisvalue, checkName) {
                   1009: 	for (i=0; i<document.forms.parmform.elements.length; i++) {
                   1010:             ele = document.forms.parmform.elements[i];
                   1011:             if (ele.name == checkName) {
                   1012: 		if (ele.value == thisvalue) {
                   1013: 		    document.forms.parmform.elements[i].checked=true;
                   1014: 		}
                   1015:             }
                   1016:         }
                   1017:     }
                   1018: 
                   1019:     function checkdates() {
                   1020: 	checkthis('duedate','pscat');
                   1021:  	checkthis('opendate','pscat');
                   1022: 	checkthis('answerdate','pscat');
1.218     www      1023:     }
                   1024: 
                   1025:     function checkdisset() {
                   1026: 	checkthis('discussend','pscat');
                   1027:  	checkthis('discusshide','pscat');
                   1028:     }
                   1029: 
                   1030:     function checkcontdates() {
                   1031: 	checkthis('contentopen','pscat');
                   1032:  	checkthis('contentclose','pscat');
                   1033:     }
                   1034:  
1.210     www      1035: 
                   1036:     function checkvisi() {
                   1037: 	checkthis('hiddenresource','pscat');
                   1038:  	checkthis('encrypturl','pscat');
                   1039: 	checkthis('problemstatus','pscat');
                   1040: 	checkthis('contentopen','pscat');
                   1041: 	checkthis('opendate','pscat');
                   1042:     }
                   1043: 
                   1044:     function checkparts() {
                   1045: 	checkthis('hiddenparts','pscat');
                   1046: 	checkthis('display','pscat');
                   1047: 	checkthis('ordered','pscat');
                   1048:     }
                   1049: 
                   1050:     function checkstandard() {
                   1051:         checkall(false,'pscat');
                   1052: 	checkdates();
                   1053: 	checkthis('weight','pscat');
                   1054: 	checkthis('maxtries','pscat');
                   1055:     }
                   1056: 
1.208     www      1057: </script>
                   1058: ENDSCRIPT
1.209     www      1059:     $r->print();
1.208     www      1060:     $r->print("\n<table><tr>");
                   1061:     my $cnt=0;
1.211     www      1062:     foreach $tempkey (&keysindisplayorder($allparms,$keyorder)) {
1.235     albertel 1063: 	$r->print("\n<td><font size='-1'><label><input type='checkbox' name='pscat' ");
1.208     www      1064: 	$r->print('value="'.$tempkey.'"');
                   1065: 	if ($$pscat[0] eq "all" || grep $_ eq $tempkey, @{$pscat}) {
                   1066: 	    $r->print(' checked');
                   1067: 	}
1.235     albertel 1068: 	$r->print('>'.$$allparms{$tempkey}.'</label></font></td>');
1.209     www      1069:  	$cnt++;
                   1070:         if ($cnt==3) {
                   1071: 	    $r->print("</tr>\n<tr>");
                   1072: 	    $cnt=0;
                   1073: 	}
1.208     www      1074:     }
                   1075:     $r->print('
                   1076: </tr><tr><td>
1.233     albertel 1077: <a href="javascript:checkall(true, \'pscat\')">Select&nbsp;All</a><br />
                   1078: <a href="javascript:checkstandard()">Select&nbsp;Common&nbsp;Only</a>
1.210     www      1079: </td><td>
1.233     albertel 1080: <a href="javascript:checkdates()">Add&nbsp;Problem&nbsp;Dates</a>
                   1081: <a href="javascript:checkcontdates()">Add&nbsp;Content&nbsp;Dates</a><br />
                   1082: <a href="javascript:checkdisset()">Add&nbsp;Discussion&nbsp;Settings</a>
                   1083: <a href="javascript:checkvisi()">Add&nbsp;Visibilities</a><br />
                   1084: <a href="javascript:checkparts()">Add&nbsp;Part&nbsp;Parameters</a>
1.210     www      1085: </td><td>
1.233     albertel 1086: <a href="javascript:checkall(false, \'pscat\')">Unselect&nbsp;All</a>
1.208     www      1087: </td>
                   1088: ');
                   1089:     $r->print('</tr></table>');
                   1090: }
                   1091: 
1.209     www      1092: sub partmenu {
                   1093:     my ($r,$allparts,$psprt)=@_;
1.211     www      1094:     $r->print('<select multiple name="psprt" size="8">');
1.208     www      1095:     $r->print('<option value="all"');
                   1096:     $r->print(' selected') unless (@{$psprt});
                   1097:     $r->print('>'.&mt('All Parts').'</option>');
                   1098:     my %temphash=();
                   1099:     foreach (@{$psprt}) { $temphash{$_}=1; }
1.234     albertel 1100:     foreach my $tempkey (sort {
                   1101: 	if ($a==$b) { return ($a cmp $b) } else { return ($a <=> $b); }
                   1102:     } keys(%{$allparts})) {
1.208     www      1103: 	unless ($tempkey =~ /\./) {
                   1104: 	    $r->print('<option value="'.$tempkey.'"');
                   1105: 	    if ($$psprt[0] eq "all" ||  $temphash{$tempkey}) {
                   1106: 		$r->print(' selected');
                   1107: 	    }
                   1108: 	    $r->print('>'.$$allparts{$tempkey}.'</option>');
                   1109: 	}
                   1110:     }
1.209     www      1111:     $r->print('</select>');
                   1112: }
                   1113: 
                   1114: sub usermenu {
1.275     raeburn  1115:     my ($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,$usersgroups)=@_;
1.209     www      1116:     my $chooseopt=&Apache::loncommon::select_dom_form($udom,'udom').' '.
                   1117:         &Apache::loncommon::selectstudent_link('parmform','uname','udom');
                   1118:     my $selscript=&Apache::loncommon::studentbrowser_javascript();
                   1119:     my %lt=&Apache::lonlocal::texthash(
1.269     raeburn  1120: 		    'se'    => "Section",
                   1121:                     'gr'    => "Group",
1.209     www      1122: 		    'fu'    => "For User",
                   1123: 		    'oi'    => "or ID",
                   1124: 		    'ad'    => "at Domain"
                   1125: 				       );
                   1126:     my $sections='';
1.300     albertel 1127:     my %sectionhash = &Apache::loncommon::get_sections();
                   1128: 
1.269     raeburn  1129:     my $groups;
1.307     raeburn  1130:     my %grouphash = &Apache::longroup::coursegroups();
1.299     albertel 1131: 
1.300     albertel 1132:     if (%sectionhash) {
1.269     raeburn  1133:         $sections=$lt{'se'}.': <select name="csec"';
1.299     albertel 1134:         if (%grouphash && $parmlev ne 'full') {
1.269     raeburn  1135:             $sections .= qq| onchange="group_or_section('csec')" |;
                   1136:         }
                   1137:         $sections .= '>';
1.275     raeburn  1138: 	foreach my $section ('',sort keys %sectionhash) {
                   1139: 	    $sections.='<option value="'.$section.'" '.
                   1140: 		($section eq $csec?'selected="selected"':'').'>'.$section.
                   1141:                                                               '</option>';
1.209     www      1142:         }
                   1143:         $sections.='</select>';
1.269     raeburn  1144:     }
1.300     albertel 1145:     if (%sectionhash && %grouphash && $parmlev ne 'full') {
1.269     raeburn  1146:         $sections .= '&nbsp;or&nbsp;';
                   1147:         $sections .= qq|
                   1148: <script type="text/javascript">
                   1149: function group_or_section(caller) {
                   1150:    if (caller == "cgroup") {
                   1151:        if (document.parmform.cgroup.selectedIndex != 0) {
                   1152:            document.parmform.csec.selectedIndex = 0;
                   1153:        }
                   1154:    } else {
                   1155:        if (document.parmform.csec.selectedIndex != 0) {
                   1156:            document.parmform.cgroup.selectedIndex = 0;
                   1157:        }
                   1158:    }
                   1159: }
                   1160: </script>
                   1161: |;
                   1162:     } else {
                   1163:         $sections .= qq|
                   1164: <script type="text/javascript">
                   1165: function group_or_section(caller) {
                   1166:     return;
                   1167: }
                   1168: </script>
                   1169: |;
                   1170:     } 
1.299     albertel 1171: 
                   1172:     if (%grouphash) {
1.269     raeburn  1173:         $groups=$lt{'gr'}.': <select name="cgroup"';
1.300     albertel 1174:         if (%sectionhash && $env{'form.action'} eq 'settable') {
1.269     raeburn  1175:             $groups .= qq| onchange="group_or_section('cgroup')" |;
                   1176:         }
                   1177:         $groups .= '>';
1.275     raeburn  1178:         foreach my $grp ('',sort keys %grouphash) {
                   1179:             $groups.='<option value="'.$grp.'" ';
                   1180:             if ($grp eq $cgroup) {
                   1181:                 unless ((defined($uname)) && ($grp eq '')) {
                   1182:                     $groups .=  'selected="selected" ';
                   1183:                 }
                   1184:             } elsif (!defined($cgroup)) {
                   1185:                 if (@{$usersgroups} == 1) {
                   1186:                     if ($grp eq $$usersgroups[0]) {
                   1187:                         $groups .=  'selected="selected" ';
                   1188:                     }
                   1189:                 }
                   1190:             }
                   1191:             $groups .= '>'.$grp.'</option>';
1.269     raeburn  1192:         }
                   1193:         $groups.='</select>';
                   1194:     }
                   1195:     $r->print(<<ENDMENU);
1.209     www      1196: <b>
                   1197: $sections
1.269     raeburn  1198: $groups
1.209     www      1199: <br />
                   1200: $lt{'fu'} 
                   1201: <input type="text" value="$uname" size="12" name="uname" />
                   1202: $lt{'oi'}
                   1203: <input type="text" value="$id" size="12" name="id" /> 
                   1204: $lt{'ad'}
                   1205: $chooseopt
                   1206: </b>
                   1207: ENDMENU
                   1208: }
                   1209: 
                   1210: sub displaymenu {
1.211     www      1211:     my ($r,$allparms,$allparts,$pscat,$psprt,$keyorder)=@_;
1.209     www      1212:     $r->print('<table border="1"><tr><th>'.&mt('Select Parameters to View').'</th><th>'.
                   1213: 	     &mt('Select Parts to View').'</th></tr><tr><td>');  
1.211     www      1214:     &parmmenu($r,$allparms,$pscat,$keyorder);
1.209     www      1215:     $r->print('</td><td>');
                   1216:     &partmenu($r,$allparts,$psprt);
                   1217:     $r->print('</td></tr></table>');
                   1218: }
                   1219: 
                   1220: sub mapmenu {
                   1221:     my ($r,$allmaps,$pschp,$maptitles)=@_;
1.231     www      1222:     $r->print('<b>'.&mt('Select Enclosing Map or Folder').'</b> ');
1.209     www      1223:     $r->print('<select name="pschp">');
                   1224:     $r->print('<option value="all">'.&mt('All Maps or Folders').'</option>');
                   1225:     foreach (sort {$$allmaps{$a} cmp $$allmaps{$b}} keys %{$allmaps}) {
1.208     www      1226: 	$r->print('<option value="'.$_.'"');
1.209     www      1227: 	if (($pschp eq $_)) { $r->print(' selected'); }
                   1228: 	$r->print('>'.$$maptitles{$_}.($$allmaps{$_}!~/^uploaded/?' ['.$$allmaps{$_}.']':'').'</option>');
                   1229:     }
                   1230:     $r->print("</select>");
                   1231: }
                   1232: 
                   1233: sub levelmenu {
                   1234:     my ($r,$alllevs,$parmlev)=@_;
1.231     www      1235:     $r->print('<b>'.&mt('Select Parameter Level').
                   1236: 	      &Apache::loncommon::help_open_topic('Course_Parameter_Levels').'</b> ');
1.209     www      1237:     $r->print('<select name="parmlev">');
                   1238:     foreach (reverse sort keys %{$alllevs}) {
                   1239: 	$r->print('<option value="'.$$alllevs{$_}.'"');
                   1240: 	if ($parmlev eq $$alllevs{$_}) {
                   1241: 	    $r->print(' selected'); 
                   1242: 	}
                   1243: 	$r->print('>'.$_.'</option>');
1.208     www      1244:     }
1.209     www      1245:     $r->print("</select>");
1.208     www      1246: }
                   1247: 
1.211     www      1248: 
                   1249: sub sectionmenu {
                   1250:     my ($r,$selectedsections)=@_;
1.300     albertel 1251:     my %sectionhash = &Apache::loncommon::get_sections();
                   1252:     return if (!%sectionhash);
                   1253: 
                   1254:     $r->print('<select name="Section" multiple="true" size="8" >');
                   1255:     foreach my $s ('all',sort keys %sectionhash) {
                   1256: 	$r->print('    <option value="'.$s.'"');
                   1257: 	foreach (@{$selectedsections}) {
                   1258: 	    if ($s eq $_) {
                   1259: 		$r->print(' selected');
                   1260: 		last;
1.212     www      1261: 	    }
                   1262: 	}
1.300     albertel 1263: 	$r->print('>'.$s."</option>\n");
                   1264:     }
                   1265:     $r->print("</select>\n");
1.269     raeburn  1266: }
                   1267: 
                   1268: sub groupmenu {
                   1269:     my ($r,$selectedgroups)=@_;
1.307     raeburn  1270:     my %grouphash = &Apache::longroup::coursegroups();
1.299     albertel 1271:     return if (!%grouphash);
                   1272: 
                   1273:     $r->print('<select name="Group" multiple="true" size="8" >');
                   1274:     foreach my $group (sort(keys(%grouphash))) {
                   1275: 	$r->print('    <option value="'.$group.'"');
                   1276: 	foreach (@{$selectedgroups}) {
                   1277: 	    if ($group eq $_) {
                   1278: 		$r->print(' selected');
                   1279: 		last;
                   1280: 	    }
                   1281: 	}
                   1282: 	$r->print('>'.$group."</option>\n");
1.211     www      1283:     }
1.299     albertel 1284:     $r->print("</select>\n");
1.211     www      1285: }
                   1286: 
1.269     raeburn  1287: 
1.210     www      1288: sub keysplit {
                   1289:     my $keyp=shift;
                   1290:     return (split(/\,/,$keyp));
                   1291: }
                   1292: 
                   1293: sub keysinorder {
                   1294:     my ($name,$keyorder)=@_;
                   1295:     return sort {
                   1296: 	$$keyorder{$a} <=> $$keyorder{$b};
                   1297:     } (keys %{$name});
                   1298: }
                   1299: 
1.236     albertel 1300: sub keysinorder_bytype {
                   1301:     my ($name,$keyorder)=@_;
                   1302:     return sort {
                   1303: 	my $ta=(split('_',$a))[-1];
                   1304: 	my $tb=(split('_',$b))[-1];
                   1305: 	if ($$keyorder{'parameter_0_'.$ta} == $$keyorder{'parameter_0_'.$tb}) {
                   1306: 	    return ($a cmp $b);
                   1307: 	}
                   1308: 	$$keyorder{'parameter_0_'.$ta} <=> $$keyorder{'parameter_0_'.$tb};
                   1309:     } (keys %{$name});
                   1310: }
                   1311: 
1.211     www      1312: sub keysindisplayorder {
                   1313:     my ($name,$keyorder)=@_;
                   1314:     return sort {
                   1315: 	$$keyorder{'parameter_0_'.$a} <=> $$keyorder{'parameter_0_'.$b};
                   1316:     } (keys %{$name});
                   1317: }
                   1318: 
1.214     www      1319: sub sortmenu {
                   1320:     my ($r,$sortorder)=@_;
1.236     albertel 1321:     $r->print('<br /><label><input type="radio" name="sortorder" value="realmstudent"');
1.214     www      1322:     if ($sortorder eq 'realmstudent') {
                   1323:        $r->print(' checked="on"');
                   1324:     }
                   1325:     $r->print(' />'.&mt('Sort by realm first, then student (group/section)'));
1.236     albertel 1326:     $r->print('</label><br /><label><input type="radio" name="sortorder" value="studentrealm"');
1.214     www      1327:     if ($sortorder eq 'studentrealm') {
                   1328:        $r->print(' checked="on"');
                   1329:     }
1.236     albertel 1330:     $r->print(' />'.&mt('Sort by student (group/section) first, then realm').
                   1331: 	      '</label>');
1.214     www      1332: }
                   1333: 
1.211     www      1334: sub standardkeyorder {
                   1335:     return ('parameter_0_opendate' => 1,
                   1336: 	    'parameter_0_duedate' => 2,
                   1337: 	    'parameter_0_answerdate' => 3,
                   1338: 	    'parameter_0_interval' => 4,
                   1339: 	    'parameter_0_weight' => 5,
                   1340: 	    'parameter_0_maxtries' => 6,
                   1341: 	    'parameter_0_hinttries' => 7,
                   1342: 	    'parameter_0_contentopen' => 8,
                   1343: 	    'parameter_0_contentclose' => 9,
                   1344: 	    'parameter_0_type' => 10,
                   1345: 	    'parameter_0_problemstatus' => 11,
                   1346: 	    'parameter_0_hiddenresource' => 12,
                   1347: 	    'parameter_0_hiddenparts' => 13,
                   1348: 	    'parameter_0_display' => 14,
                   1349: 	    'parameter_0_ordered' => 15,
                   1350: 	    'parameter_0_tol' => 16,
                   1351: 	    'parameter_0_sig' => 17,
1.218     www      1352: 	    'parameter_0_turnoffunit' => 18,
                   1353:             'parameter_0_discussend' => 19,
                   1354:             'parameter_0_discusshide' => 20);
1.211     www      1355: }
                   1356: 
1.59      matthew  1357: ##################################################
                   1358: ##################################################
                   1359: 
                   1360: =pod
                   1361: 
                   1362: =item assessparms
                   1363: 
                   1364: Show assessment data and parameters.  This is a large routine that should
                   1365: be simplified and shortened... someday.
                   1366: 
                   1367: Inputs: $r
                   1368: 
                   1369: Returns: nothing
                   1370: 
1.63      bowersj2 1371: Variables used (guessed by Jeremy):
                   1372: 
                   1373: =over 4
                   1374: 
                   1375: =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.
                   1376: 
                   1377: =item B<psprt>: ParameterS PaRTs? a list of the parts of a problem that we are displaying? Used to display only selected parts?
                   1378: 
                   1379: =item B<allmaps>:
                   1380: 
                   1381: =back
                   1382: 
1.59      matthew  1383: =cut
                   1384: 
                   1385: ##################################################
                   1386: ##################################################
1.30      www      1387: sub assessparms {
1.1       www      1388: 
1.43      albertel 1389:     my $r=shift;
1.201     www      1390: 
                   1391:     my @ids=();
                   1392:     my %symbp=();
                   1393:     my %mapp=();
                   1394:     my %typep=();
                   1395:     my %keyp=();
                   1396:     my %uris=();
                   1397:     my %maptitles=();
                   1398: 
1.2       www      1399: # -------------------------------------------------------- Variable declaration
1.209     www      1400: 
1.129     www      1401:     my %allmaps=();
                   1402:     my %alllevs=();
1.57      albertel 1403: 
1.187     www      1404:     my $uname;
                   1405:     my $udom;
                   1406:     my $uhome;
                   1407:     my $csec;
1.269     raeburn  1408:     my $cgroup;
1.275     raeburn  1409:     my @usersgroups = ();
1.187     www      1410:  
1.190     albertel 1411:     my $coursename=$env{'course.'.$env{'request.course.id'}.'.description'};
1.187     www      1412: 
1.57      albertel 1413:     $alllevs{'Resource Level'}='full';
1.215     www      1414:     $alllevs{'Map/Folder Level'}='map';
1.57      albertel 1415:     $alllevs{'Course Level'}='general';
                   1416: 
                   1417:     my %allparms;
                   1418:     my %allparts;
1.210     www      1419: #
                   1420: # Order in which these parameters will be displayed
                   1421: #
1.211     www      1422:     my %keyorder=&standardkeyorder();
                   1423: 
1.43      albertel 1424:     @ids=();
                   1425:     %symbp=();
                   1426:     %typep=();
                   1427: 
                   1428:     my $message='';
                   1429: 
1.190     albertel 1430:     $csec=$env{'form.csec'};
1.269     raeburn  1431:     $cgroup=$env{'form.cgroup'};
1.188     www      1432: 
1.190     albertel 1433:     if      ($udom=$env{'form.udom'}) {
                   1434:     } elsif ($udom=$env{'request.role.domain'}) {
                   1435:     } elsif ($udom=$env{'user.domain'}) {
1.172     albertel 1436:     } else {
                   1437: 	$udom=$r->dir_config('lonDefDomain');
                   1438:     }
1.43      albertel 1439: 
1.134     albertel 1440:     my @pscat=&Apache::loncommon::get_env_multiple('form.pscat');
1.190     albertel 1441:     my $pschp=$env{'form.pschp'};
1.134     albertel 1442:     my @psprt=&Apache::loncommon::get_env_multiple('form.psprt');
1.76      www      1443:     if (!@psprt) { $psprt[0]='0'; }
1.57      albertel 1444: 
1.43      albertel 1445:     my $pssymb='';
1.57      albertel 1446:     my $parmlev='';
                   1447:  
1.190     albertel 1448:     unless ($env{'form.parmlev'}) {
1.57      albertel 1449:         $parmlev = 'map';
                   1450:     } else {
1.190     albertel 1451:         $parmlev = $env{'form.parmlev'};
1.57      albertel 1452:     }
1.26      www      1453: 
1.29      www      1454: # ----------------------------------------------- Was this started from grades?
                   1455: 
1.190     albertel 1456:     if (($env{'form.command'} eq 'set') && ($env{'form.url'})
                   1457: 	&& (!$env{'form.dis'})) {
                   1458: 	my $url=$env{'form.url'};
1.194     albertel 1459: 	$url=~s-^http://($ENV{'SERVER_NAME'}|$ENV{'HTTP_HOST'})--;
1.43      albertel 1460: 	$pssymb=&Apache::lonnet::symbread($url);
1.92      albertel 1461: 	if (!@pscat) { @pscat=('all'); }
1.43      albertel 1462: 	$pschp='';
1.57      albertel 1463:         $parmlev = 'full';
1.190     albertel 1464:     } elsif ($env{'form.symb'}) {
                   1465: 	$pssymb=$env{'form.symb'};
1.92      albertel 1466: 	if (!@pscat) { @pscat=('all'); }
1.43      albertel 1467: 	$pschp='';
1.57      albertel 1468:         $parmlev = 'full';
1.43      albertel 1469:     } else {
1.190     albertel 1470: 	$env{'form.url'}='';
1.43      albertel 1471:     }
                   1472: 
1.190     albertel 1473:     my $id=$env{'form.id'};
1.43      albertel 1474:     if (($id) && ($udom)) {
                   1475: 	$uname=(&Apache::lonnet::idget($udom,$id))[1];
                   1476: 	if ($uname) {
                   1477: 	    $id='';
                   1478: 	} else {
                   1479: 	    $message=
1.314     albertel 1480: 		'<span class="LC_error">'.&mt("Unknown ID")." '$id' ".
                   1481: 		&mt('at domain')." '$udom'</span>";
1.43      albertel 1482: 	}
                   1483:     } else {
1.190     albertel 1484: 	$uname=$env{'form.uname'};
1.43      albertel 1485:     }
                   1486:     unless ($udom) { $uname=''; }
                   1487:     $uhome='';
                   1488:     if ($uname) {
                   1489: 	$uhome=&Apache::lonnet::homeserver($uname,$udom);
                   1490:         if ($uhome eq 'no_host') {
                   1491: 	    $message=
1.314     albertel 1492: 		'<span class="LC_error">'.&mt("Unknown user")." '$uname' ".
                   1493: 		&mt("at domain")." '$udom'</span>";
1.43      albertel 1494: 	    $uname='';
1.12      www      1495:         } else {
1.103     albertel 1496: 	    $csec=&Apache::lonnet::getsection($udom,$uname,
1.190     albertel 1497: 					      $env{'request.course.id'});
1.269     raeburn  1498:             
1.43      albertel 1499: 	    if ($csec eq '-1') {
1.314     albertel 1500: 		$message='<span class="LC_error">'.
1.133     www      1501: 		    &mt("User")." '$uname' ".&mt("at domain")." '$udom' ".
1.314     albertel 1502: 		    &mt("not in this course")."</span>";
1.43      albertel 1503: 		$uname='';
1.190     albertel 1504: 		$csec=$env{'form.csec'};
1.269     raeburn  1505:                 $cgroup=$env{'form.cgroup'};
1.43      albertel 1506: 	    } else {
                   1507: 		my %name=&Apache::lonnet::userenvironment($udom,$uname,
                   1508: 		      ('firstname','middlename','lastname','generation','id'));
1.133     www      1509: 		$message="\n<p>\n".&mt("Full Name").": ".
1.43      albertel 1510: 		    $name{'firstname'}.' '.$name{'middlename'}.' '
                   1511: 			.$name{'lastname'}.' '.$name{'generation'}.
1.133     www      1512: 			    "<br>\n".&mt('ID').": ".$name{'id'}.'<p>';
1.43      albertel 1513: 	    }
1.297     raeburn  1514:             @usersgroups = &Apache::lonnet::get_users_groups(
1.275     raeburn  1515:                                        $udom,$uname,$env{'request.course.id'});
1.297     raeburn  1516:             if (@usersgroups > 0) {
1.306     albertel 1517:                 unless (grep(/^\Q$cgroup\E$/,@usersgroups)) {
1.275     raeburn  1518:                     $cgroup = $usersgroups[0];
1.297     raeburn  1519:                 }
1.269     raeburn  1520:             }
1.12      www      1521:         }
1.43      albertel 1522:     }
1.2       www      1523: 
1.43      albertel 1524:     unless ($csec) { $csec=''; }
1.269     raeburn  1525:     unless ($cgroup) { $cgroup=''; }
1.12      www      1526: 
1.14      www      1527: # --------------------------------------------------------- Get all assessments
1.210     www      1528:     &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps, 
                   1529: 				\%mapp, \%symbp,\%maptitles,\%uris,
                   1530: 				\%keyorder);
1.63      bowersj2 1531: 
1.57      albertel 1532:     $mapp{'0.0'} = '';
                   1533:     $symbp{'0.0'} = '';
1.99      albertel 1534: 
1.14      www      1535: # ---------------------------------------------------------- Anything to store?
1.190     albertel 1536:     if ($env{'form.pres_marker'}) {
1.205     www      1537:         my @markers=split(/\&\&\&/,$env{'form.pres_marker'});
                   1538:         my @values=split(/\&\&\&/,$env{'form.pres_value'});
                   1539:         my @types=split(/\&\&\&/,$env{'form.pres_type'});
                   1540: 	for (my $i=0;$i<=$#markers;$i++) {
                   1541: 	    $message.=&storeparm(split(/\&/,$markers[$i]),
                   1542: 				 $values[$i],
                   1543: 				 $types[$i],
1.269     raeburn  1544: 				 $uname,$udom,$csec,$cgroup);
1.205     www      1545: 	}
1.68      www      1546: # ---------------------------------------------------------------- Done storing
1.130     www      1547: 	$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      1548:     }
1.57      albertel 1549: #----------------------------------------------- if all selected, fill in array
1.209     www      1550:     if ($pscat[0] eq "all") {@pscat = (keys %allparms);}
                   1551:     if (!@pscat) { @pscat=('duedate','opendate','answerdate','weight','maxtries') }; 
1.57      albertel 1552:     if ($psprt[0] eq "all" || !@psprt) {@psprt = (keys %allparts);}
1.2       www      1553: # ------------------------------------------------------------------ Start page
1.63      bowersj2 1554: 
1.209     www      1555:     &startpage($r);
1.57      albertel 1556: 
1.44      albertel 1557:     foreach ('tolerance','date_default','date_start','date_end',
                   1558: 	     'date_interval','int','float','string') {
                   1559: 	$r->print('<input type="hidden" value="'.
1.190     albertel 1560: 		  $env{'form.recent_'.$_}.'" name="recent_'.$_.'">');
1.44      albertel 1561:     }
1.57      albertel 1562:                         
1.44      albertel 1563:     if (!$pssymb) {
1.209     www      1564:         $r->print('<table border="1"><tr><td>');
                   1565:         &levelmenu($r,\%alllevs,$parmlev);
1.128     albertel 1566: 	if ($parmlev ne 'general') {
1.209     www      1567:             $r->print('<td>');
                   1568: 	    &mapmenu($r,\%allmaps,$pschp,\%maptitles);
                   1569: 	    $r->print('</td>');
1.128     albertel 1570: 	}
1.209     www      1571:         $r->print('</td></tr></table>');
1.211     www      1572: 	&displaymenu($r,\%allparms,\%allparts,\@pscat,\@psprt,\%keyorder);
1.44      albertel 1573:     } else {
1.125     www      1574:         my ($map,$id,$resource)=&Apache::lonnet::decode_symb($pssymb);
1.312     albertel 1575: 	my $title = &Apache::lonnet::gettitle($pssymb);
                   1576:         $r->print(&mt('Specific Resource: [_1] ([_2])',$title,$resource).
                   1577:                   '<input type="hidden" value="'.$pssymb.'" name="symb" />'.
1.238     www      1578: 		  '<br /><label><b>'.&mt('Show all parts').': <input type="checkbox" name="psprt" value="all"'.
                   1579: 		  ($env{'form.psprt'}?' checked="checked"':'').' /></b></label><br />');
1.57      albertel 1580:     }
1.275     raeburn  1581:     &usermenu($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,\@usersgroups);    
1.57      albertel 1582: 
1.210     www      1583:     $r->print('<p>'.$message.'</p>');
                   1584: 
1.209     www      1585:     $r->print('<br /><input type="submit" name="dis" value="'.&mt("Update Parameter Display").'" />');
1.57      albertel 1586: 
                   1587:     my @temp_pscat;
                   1588:     map {
                   1589:         my $cat = $_;
                   1590:         push(@temp_pscat, map { $_.'.'.$cat } @psprt);
                   1591:     } @pscat;
                   1592: 
                   1593:     @pscat = @temp_pscat;
                   1594: 
1.209     www      1595:     if (($env{'form.prevvisit'}) || ($pschp) || ($pssymb)) {
1.10      www      1596: # ----------------------------------------------------------------- Start Table
1.57      albertel 1597:         my @catmarker=map { tr|.|_|; 'parameter_'.$_; } @pscat;
1.190     albertel 1598:         my $csuname=$env{'user.name'};
                   1599:         my $csudom=$env{'user.domain'};
1.57      albertel 1600: 
1.203     www      1601:         if ($parmlev eq 'full') {
1.57      albertel 1602:            my $coursespan=$csec?8:5;
1.275     raeburn  1603:            my $userspan=3;
1.269     raeburn  1604:            if ($cgroup ne '') {
                   1605:               $coursespan += 3;
                   1606:            } 
                   1607:       
1.57      albertel 1608:            $r->print('<p><table border=2>');
                   1609:            $r->print('<tr><td colspan=5></td>');
1.130     www      1610:            $r->print('<th colspan='.($coursespan).'>'.&mt('Any User').'</th>');
1.57      albertel 1611:            if ($uname) {
1.275     raeburn  1612:                if (@usersgroups > 1) {
                   1613:                    $userspan ++;
                   1614:                }
                   1615:                $r->print('<th colspan="'.$userspan.'" rowspan="2">');
1.130     www      1616:                $r->print(&mt("User")." $uname ".&mt('at Domain')." $udom</th>");
1.57      albertel 1617:            }
1.133     www      1618: 	   my %lt=&Apache::lonlocal::texthash(
                   1619: 				  'pie'    => "Parameter in Effect",
                   1620: 				  'csv'    => "Current Session Value",
                   1621:                                   'at'     => 'at',
                   1622:                                   'rl'     => "Resource Level",
                   1623: 				  'ic'     => 'in Course',
                   1624: 				  'aut'    => "Assessment URL and Title",
1.143     albertel 1625: 				  'type'   => 'Type',
1.133     www      1626: 				  'emof'   => "Enclosing Map or Folder",
1.143     albertel 1627: 				  'part'   => 'Part',
1.133     www      1628:                                   'pn'     => 'Parameter Name',
                   1629: 				  'def'    => 'default',
                   1630: 				  'femof'  => 'from Enclosing Map or Folder',
                   1631: 				  'gen'    => 'general',
                   1632: 				  'foremf' => 'for Enclosing Map or Folder',
                   1633: 				  'fr'     => 'for Resource'
                   1634: 					      );
1.57      albertel 1635:            $r->print(<<ENDTABLETWO);
1.133     www      1636: <th rowspan=3>$lt{'pie'}</th>
                   1637: <th rowspan=3>$lt{'csv'}<br>($csuname $lt{'at'} $csudom)</th>
1.182     albertel 1638: </tr><tr><td colspan=5></td><th colspan=2>$lt{'ic'}</th><th colspan=2>$lt{'rl'}</th>
                   1639: <th colspan=1>$lt{'ic'}</th>
                   1640: 
1.10      www      1641: ENDTABLETWO
1.57      albertel 1642:            if ($csec) {
1.133     www      1643:                 $r->print("<th colspan=3>".
1.269     raeburn  1644: 			  &mt("in Section")." $csec</th>");
                   1645:            }
                   1646:            if ($cgroup) {
                   1647:                 $r->print("<th colspan=3>".
                   1648:                           &mt("in Group")." $cgroup</th>");
1.57      albertel 1649:            }
                   1650:            $r->print(<<ENDTABLEHEADFOUR);
1.133     www      1651: </tr><tr><th>$lt{'aut'}</th><th>$lt{'type'}</th>
                   1652: <th>$lt{'emof'}</th><th>$lt{'part'}</th><th>$lt{'pn'}</th>
1.192     albertel 1653: <th>$lt{'gen'}</th><th>$lt{'foremf'}</th>
                   1654: <th>$lt{'def'}</th><th>$lt{'femof'}</th><th>$lt{'fr'}</th>
1.10      www      1655: ENDTABLEHEADFOUR
1.57      albertel 1656: 
                   1657:            if ($csec) {
1.130     www      1658:                $r->print('<th>'.&mt('general').'</th><th>'.&mt('for Enclosing Map or Folder').'</th><th>'.&mt('for Resource').'</th>');
1.57      albertel 1659:            }
                   1660: 
1.269     raeburn  1661:            if ($cgroup) {
                   1662:                $r->print('<th>'.&mt('general').'</th><th>'.&mt('for Enclosing Map or Folder').'</th><th>'.&mt('for Resource').'</th>');
                   1663:            }
                   1664: 
1.57      albertel 1665:            if ($uname) {
1.275     raeburn  1666:                if (@usersgroups > 1) {
                   1667:                    $r->print('<th>'.&mt('Control by other group?').'</th>');
                   1668:                }
1.130     www      1669:                $r->print('<th>'.&mt('general').'</th><th>'.&mt('for Enclosing Map or Folder').'</th><th>'.&mt('for Resource').'</th>');
1.57      albertel 1670:            }
                   1671: 
                   1672:            $r->print('</tr>');
                   1673: 
                   1674:            my $defbgone='';
                   1675:            my $defbgtwo='';
1.269     raeburn  1676:            my $defbgthree = '';
1.57      albertel 1677: 
                   1678:            foreach (@ids) {
                   1679: 
                   1680:                 my $rid=$_;
                   1681:                 my ($inmapid)=($rid=~/\.(\d+)$/);
                   1682: 
1.152     albertel 1683:                 if ((!$pssymb && 
                   1684: 		     (($pschp eq 'all') || ($allmaps{$pschp} eq $mapp{$rid})))
                   1685: 		    ||
                   1686: 		    ($pssymb && $pssymb eq $symbp{$rid})) {
1.4       www      1687: # ------------------------------------------------------ Entry for one resource
1.184     albertel 1688:                     if ($defbgone eq '"#E0E099"') {
                   1689:                         $defbgone='"#E0E0DD"';
1.57      albertel 1690:                     } else {
1.184     albertel 1691:                         $defbgone='"#E0E099"';
1.57      albertel 1692:                     }
1.184     albertel 1693:                     if ($defbgtwo eq '"#FFFF99"') {
                   1694:                         $defbgtwo='"#FFFFDD"';
1.57      albertel 1695:                     } else {
1.184     albertel 1696:                         $defbgtwo='"#FFFF99"';
1.57      albertel 1697:                     }
1.269     raeburn  1698:                     if ($defbgthree eq '"#FFBB99"') {
                   1699:                         $defbgthree='"#FFBBDD"';
                   1700:                     } else {
                   1701:                         $defbgthree='"#FFBB99"';
                   1702:                     }
                   1703: 
1.57      albertel 1704:                     my $thistitle='';
                   1705:                     my %name=   ();
                   1706:                     undef %name;
                   1707:                     my %part=   ();
                   1708:                     my %display=();
                   1709:                     my %type=   ();
                   1710:                     my %default=();
1.196     www      1711:                     my $uri=&Apache::lonnet::declutter($uris{$rid});
1.57      albertel 1712: 
1.210     www      1713:                     foreach (&keysplit($keyp{$rid})) {
1.57      albertel 1714:                         my $tempkeyp = $_;
                   1715:                         if (grep $_ eq $tempkeyp, @catmarker) {
                   1716:                           $part{$_}=&Apache::lonnet::metadata($uri,$_.'.part');
                   1717:                           $name{$_}=&Apache::lonnet::metadata($uri,$_.'.name');
                   1718:                           $display{$_}=&Apache::lonnet::metadata($uri,$_.'.display');
                   1719:                           unless ($display{$_}) { $display{$_}=''; }
                   1720:                           $display{$_}.=' ('.$name{$_}.')';
                   1721:                           $default{$_}=&Apache::lonnet::metadata($uri,$_);
                   1722:                           $type{$_}=&Apache::lonnet::metadata($uri,$_.'.type');
                   1723:                           $thistitle=&Apache::lonnet::metadata($uri,$_.'.title');
                   1724:                         }
                   1725:                     }
                   1726:                     my $totalparms=scalar keys %name;
                   1727:                     if ($totalparms>0) {
                   1728:                         my $firstrow=1;
1.274     albertel 1729: 			my $title=&Apache::lonnet::gettitle($symbp{$rid});
1.57      albertel 1730:                         $r->print('<tr><td bgcolor='.$defbgone.
                   1731:                              ' rowspan='.$totalparms.
                   1732:                              '><tt><font size=-1>'.
                   1733:                              join(' / ',split(/\//,$uri)).
                   1734:                              '</font></tt><p><b>'.
1.154     albertel 1735:                              "<a href=\"javascript:openWindow('".
1.274     albertel 1736: 				  &Apache::lonnet::clutter($uri).'?symb='.
1.308     www      1737: 				  &escape($symbp{$rid}).
1.57      albertel 1738:                              "', 'metadatafile', '450', '500', 'no', 'yes')\";".
1.127     albertel 1739:                              " TARGET=_self>$title");
1.57      albertel 1740: 
                   1741:                         if ($thistitle) {
                   1742:                             $r->print(' ('.$thistitle.')');
                   1743:                         }
                   1744:                         $r->print('</a></b></td>');
                   1745:                         $r->print('<td bgcolor='.$defbgtwo.
                   1746:                                       ' rowspan='.$totalparms.'>'.$typep{$rid}.
                   1747:                                       '</td>');
                   1748: 
                   1749:                         $r->print('<td bgcolor='.$defbgone.
                   1750:                                       ' rowspan='.$totalparms.
1.238     www      1751:                                       '>'.$maptitles{$mapp{$rid}}.'</td>');
1.57      albertel 1752: 
1.236     albertel 1753:                         foreach (&keysinorder_bytype(\%name,\%keyorder)) {
1.57      albertel 1754:                             unless ($firstrow) {
                   1755:                                 $r->print('<tr>');
                   1756:                             } else {
                   1757:                                 undef $firstrow;
                   1758:                             }
1.201     www      1759:                             &print_row($r,$_,\%part,\%name,\%symbp,$rid,\%default,
1.57      albertel 1760:                                        \%type,\%display,$defbgone,$defbgtwo,
1.269     raeburn  1761:                                        $defbgthree,$parmlev,$uname,$udom,$csec,
1.275     raeburn  1762:                                                             $cgroup,\@usersgroups);
1.57      albertel 1763:                         }
                   1764:                     }
                   1765:                 }
                   1766:             } # end foreach ids
1.43      albertel 1767: # -------------------------------------------------- End entry for one resource
1.57      albertel 1768:             $r->print('</table>');
1.203     www      1769:         } # end of  full
1.57      albertel 1770: #--------------------------------------------------- Entry for parm level map
                   1771:         if ($parmlev eq 'map') {
                   1772:             my $defbgone = '"E0E099"';
                   1773:             my $defbgtwo = '"FFFF99"';
1.269     raeburn  1774:             my $defbgthree = '"FFBB99"';
1.57      albertel 1775: 
                   1776:             my %maplist;
                   1777: 
                   1778:             if ($pschp eq 'all') {
                   1779:                 %maplist = %allmaps; 
                   1780:             } else {
                   1781:                 %maplist = ($pschp => $mapp{$pschp});
                   1782:             }
                   1783: 
                   1784: #-------------------------------------------- for each map, gather information
                   1785:             my $mapid;
1.60      albertel 1786: 	    foreach $mapid (sort {$maplist{$a} cmp $maplist{$b}} keys %maplist) {
                   1787:                 my $maptitle = $maplist{$mapid};
1.57      albertel 1788: 
                   1789: #-----------------------  loop through ids and get all parameter types for map
                   1790: #-----------------------------------------          and associated information
                   1791:                 my %name = ();
                   1792:                 my %part = ();
                   1793:                 my %display = ();
                   1794:                 my %type = ();
                   1795:                 my %default = ();
                   1796:                 my $map = 0;
                   1797: 
                   1798: #		$r->print("Catmarker: @catmarker<br />\n");
                   1799:                
                   1800:                 foreach (@ids) {
                   1801:                   ($map)=(/([\d]*?)\./);
                   1802:                   my $rid = $_;
                   1803:         
                   1804: #                  $r->print("$mapid:$map:   $rid <br /> \n");
                   1805: 
                   1806:                   if ($map eq $mapid) {
1.196     www      1807:                     my $uri=&Apache::lonnet::declutter($uris{$rid});
1.57      albertel 1808: #                    $r->print("Keys: $keyp{$rid} <br />\n");
                   1809: 
                   1810: #--------------------------------------------------------------------
                   1811: # @catmarker contains list of all possible parameters including part #s
                   1812: # $fullkeyp contains the full part/id # for the extraction of proper parameters
                   1813: # $tempkeyp contains part 0 only (no ids - ie, subparts)
                   1814: # When storing information, store as part 0
                   1815: # When requesting information, request from full part
                   1816: #-------------------------------------------------------------------
1.210     www      1817:                     foreach (&keysplit($keyp{$rid})) {
1.57      albertel 1818:                       my $tempkeyp = $_;
                   1819:                       my $fullkeyp = $tempkeyp;
1.73      albertel 1820:                       $tempkeyp =~ s/_\w+_/_0_/;
1.57      albertel 1821:                       
                   1822:                       if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {
                   1823:                         $part{$tempkeyp}="0";
                   1824:                         $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name');
                   1825:                         $display{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');
                   1826:                         unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; }
                   1827:                         $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')';
1.73      albertel 1828:                         $display{$tempkeyp} =~ s/_\w+_/_0_/;
1.57      albertel 1829:                         $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp);
                   1830:                         $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.type');
                   1831:                       }
                   1832:                     } # end loop through keys
                   1833:                   }
                   1834:                 } # end loop through ids
                   1835:                                  
                   1836: #---------------------------------------------------- print header information
1.133     www      1837:                 my $foldermap=&mt($maptitle=~/^uploaded/?'Folder':'Map');
1.82      www      1838:                 my $showtitle=$maptitles{$maptitle}.($maptitle!~/^uploaded/?' ['.$maptitle.']':'');
1.57      albertel 1839:                 $r->print(<<ENDMAPONE);
                   1840: <center><h4>
1.135     albertel 1841: Set Defaults for All Resources in $foldermap<br />
                   1842: <font color="red"><i>$showtitle</i></font><br />
1.57      albertel 1843: Specifically for
                   1844: ENDMAPONE
                   1845:                 if ($uname) {
1.267     albertel 1846: 		    my $person=&Apache::loncommon::plainname($uname,$udom);
1.135     albertel 1847:                     $r->print(&mt("User")." <font color=\"red\"><i>$uname \($person\) </i></font> ".
1.130     www      1848:                         &mt('in')." \n");
1.57      albertel 1849:                 } else {
1.135     albertel 1850:                     $r->print("<font color=\"red\"><i>".&mt('all').'</i></font> '.&mt('users in')." \n");
1.57      albertel 1851:                 }
1.269     raeburn  1852:                 if ($cgroup) {
                   1853:                     $r->print(&mt("Group")." <font color=\"red\"><i>$cgroup".
                   1854:                               "</i></font> ".&mt('of')." \n");
                   1855:                     $csec = '';
                   1856:                 } elsif ($csec) {
                   1857:                     $r->print(&mt("Section")." <font color=\"red\"><i>$csec".
                   1858:                               "</i></font> ".&mt('of')." \n");
                   1859:                 }
1.135     albertel 1860:                 $r->print("<font color=\"red\"><i>$coursename</i></font><br />");
                   1861:                 $r->print("</h4>\n");
1.57      albertel 1862: #---------------------------------------------------------------- print table
                   1863:                 $r->print('<p><table border="2">');
1.130     www      1864:                 $r->print('<tr><th>'.&mt('Parameter Name').'</th>');
                   1865:                 $r->print('<th>'.&mt('Default Value').'</th>');
                   1866:                 $r->print('<th>'.&mt('Parameter in Effect').'</th></tr>');
1.57      albertel 1867: 
1.210     www      1868: 	        foreach (&keysinorder(\%name,\%keyorder)) {
1.168     matthew  1869:                     $r->print('<tr>');
1.201     www      1870:                     &print_row($r,$_,\%part,\%name,\%symbp,$mapid,\%default,
1.269     raeburn  1871:                            \%type,\%display,$defbgone,$defbgtwo,$defbgthree,
                   1872:                            $parmlev,$uname,$udom,$csec,$cgroup);
1.57      albertel 1873:                 }
                   1874:                 $r->print("</table></center>");
                   1875:             } # end each map
                   1876:         } # end of $parmlev eq map
                   1877: #--------------------------------- Entry for parm level general (Course level)
                   1878:         if ($parmlev eq 'general') {
                   1879:             my $defbgone = '"E0E099"';
                   1880:             my $defbgtwo = '"FFFF99"';
1.269     raeburn  1881:             my $defbgthree = '"FFBB99"';
1.57      albertel 1882: 
                   1883: #-------------------------------------------- for each map, gather information
                   1884:             my $mapid="0.0";
                   1885: #-----------------------  loop through ids and get all parameter types for map
                   1886: #-----------------------------------------          and associated information
                   1887:             my %name = ();
                   1888:             my %part = ();
                   1889:             my %display = ();
                   1890:             my %type = ();
                   1891:             my %default = ();
                   1892:                
                   1893:             foreach (@ids) {
                   1894:                 my $rid = $_;
                   1895:         
1.196     www      1896:                 my $uri=&Apache::lonnet::declutter($uris{$rid});
1.57      albertel 1897: 
                   1898: #--------------------------------------------------------------------
                   1899: # @catmarker contains list of all possible parameters including part #s
                   1900: # $fullkeyp contains the full part/id # for the extraction of proper parameters
                   1901: # $tempkeyp contains part 0 only (no ids - ie, subparts)
                   1902: # When storing information, store as part 0
                   1903: # When requesting information, request from full part
                   1904: #-------------------------------------------------------------------
1.210     www      1905:                 foreach (&keysplit($keyp{$rid})) {
1.57      albertel 1906:                   my $tempkeyp = $_;
                   1907:                   my $fullkeyp = $tempkeyp;
1.73      albertel 1908:                   $tempkeyp =~ s/_\w+_/_0_/;
1.57      albertel 1909:                   if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {
                   1910:                     $part{$tempkeyp}="0";
                   1911:                     $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name');
                   1912:                     $display{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');
                   1913:                     unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; }
                   1914:                     $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')';
1.73      albertel 1915:                     $display{$tempkeyp} =~ s/_\w+_/_0_/;
1.57      albertel 1916:                     $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp);
                   1917:                     $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.type');
                   1918:                   }
                   1919:                 } # end loop through keys
                   1920:             } # end loop through ids
                   1921:                                  
                   1922: #---------------------------------------------------- print header information
1.133     www      1923: 	    my $setdef=&mt("Set Defaults for All Resources in Course");
1.57      albertel 1924:             $r->print(<<ENDMAPONE);
1.133     www      1925: <center><h4>$setdef
1.135     albertel 1926: <font color="red"><i>$coursename</i></font><br />
1.57      albertel 1927: ENDMAPONE
                   1928:             if ($uname) {
1.267     albertel 1929: 		my $person=&Apache::loncommon::plainname($uname,$udom);
1.135     albertel 1930:                 $r->print(" ".&mt("User")."<font color=\"red\"> <i>$uname \($person\) </i></font> \n");
1.57      albertel 1931:             } else {
1.135     albertel 1932:                 $r->print("<i><font color=\"red\"> ".&mt("ALL")."</i> ".&mt("USERS")."</font> \n");
1.57      albertel 1933:             }
                   1934:             
1.135     albertel 1935:             if ($csec) {$r->print(&mt("Section")."<font color=\"red\"> <i>$csec</i></font>\n")};
1.306     albertel 1936:             if ($cgroup) {$r->print(&mt("Group")."<font color=\"red\"> <i>$cgroup</i></font>\n")};
1.135     albertel 1937:             $r->print("</h4>\n");
1.57      albertel 1938: #---------------------------------------------------------------- print table
                   1939:             $r->print('<p><table border="2">');
1.130     www      1940:             $r->print('<tr><th>'.&mt('Parameter Name').'</th>');
                   1941:             $r->print('<th>'.&mt('Default Value').'</th>');
                   1942:             $r->print('<th>'.&mt('Parameter in Effect').'</th></tr>');
1.57      albertel 1943: 
1.210     www      1944: 	    foreach (&keysinorder(\%name,\%keyorder)) {
1.168     matthew  1945:                 $r->print('<tr>');
1.201     www      1946:                 &print_row($r,$_,\%part,\%name,\%symbp,$mapid,\%default,
1.269     raeburn  1947:                        \%type,\%display,$defbgone,$defbgtwo,$defbgthree,
                   1948:                                    $parmlev,$uname,$udom,$csec,$cgroup);
1.57      albertel 1949:             }
                   1950:             $r->print("</table></center>");
                   1951:         } # end of $parmlev eq general
1.43      albertel 1952:     }
1.280     albertel 1953:     $r->print('</form>'.&Apache::loncommon::end_page());
1.57      albertel 1954: } # end sub assessparms
1.30      www      1955: 
1.59      matthew  1956: 
                   1957: ##################################################
                   1958: ##################################################
                   1959: 
                   1960: =pod
                   1961: 
                   1962: =item crsenv
                   1963: 
1.105     matthew  1964: Show and set course data and parameters.  This is a large routine that should
1.59      matthew  1965: be simplified and shortened... someday.
                   1966: 
                   1967: Inputs: $r
                   1968: 
                   1969: Returns: nothing
                   1970: 
                   1971: =cut
                   1972: 
                   1973: ##################################################
                   1974: ##################################################
1.30      www      1975: sub crsenv {
                   1976:     my $r=shift;
                   1977:     my $setoutput='';
1.280     albertel 1978: 
1.298     albertel 1979:     my $breadcrumbs = 
                   1980: 	&Apache::lonhtmlcommon::breadcrumbs('Edit Course Environment');
1.190     albertel 1981:     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   1982:     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.105     matthew  1983: 
                   1984:     #
                   1985:     # Go through list of changes
1.190     albertel 1986:     foreach (keys %env) {
1.105     matthew  1987:         next if ($_!~/^form\.(.+)\_setparmval$/);
                   1988:         my $name  = $1;
1.190     albertel 1989:         my $value = $env{'form.'.$name.'_value'};
1.105     matthew  1990:         if ($name eq 'newp') {
1.190     albertel 1991:             $name = $env{'form.newp_name'};
1.105     matthew  1992:         }
                   1993:         if ($name eq 'url') {
                   1994:             $value=~s/^\/res\///;
                   1995:             my $bkuptime=time;
                   1996:             my @tmp = &Apache::lonnet::get
                   1997:                 ('environment',['url'],$dom,$crs);
1.130     www      1998:             $setoutput.=&mt('Backing up previous URL').': '.
1.105     matthew  1999:                 &Apache::lonnet::put
                   2000:                 ('environment',
                   2001:                  {'top level map backup '.$bkuptime => $tmp[1] },
                   2002:                  $dom,$crs).
                   2003:                      '<br>';
                   2004:         }
                   2005:         #
                   2006:         # Deal with modified default spreadsheets
                   2007:         if ($name =~ /^spreadsheet_default_(classcalc|
                   2008:                                             studentcalc|
                   2009:                                             assesscalc)$/x) {
                   2010:             my $sheettype = $1; 
                   2011:             if ($sheettype eq 'classcalc') {
                   2012:                 # no need to do anything since viewing the sheet will
                   2013:                 # cause it to be updated. 
                   2014:             } elsif ($sheettype eq 'studentcalc') {
                   2015:                 # expire all the student spreadsheets
                   2016:                 &Apache::lonnet::expirespread('','','studentcalc');
                   2017:             } else {
                   2018:                 # expire all the assessment spreadsheets 
                   2019:                 #    this includes non-default spreadsheets, but better to
                   2020:                 #    be safe than sorry.
                   2021:                 &Apache::lonnet::expirespread('','','assesscalc');
                   2022:                 # expire all the student spreadsheets
                   2023:                 &Apache::lonnet::expirespread('','','studentcalc');
1.30      www      2024:             }
1.105     matthew  2025:         }
                   2026:         #
1.107     matthew  2027:         # Deal with the enrollment dates
                   2028:         if ($name =~ /^default_enrollment_(start|end)_date$/) {
                   2029:             $value=&Apache::lonhtmlcommon::get_date_from_form($name.'_value');
                   2030:         }
1.178     raeburn  2031:         # Get existing cloners
                   2032:         my @oldcloner = ();
                   2033:         if ($name eq 'cloners') {
                   2034:             my %clonenames=&Apache::lonnet::dump('environment',$dom,$crs,'cloners');
                   2035:             if ($clonenames{'cloners'} =~ /,/) {
                   2036:                 @oldcloner = split/,/,$clonenames{'cloners'};
                   2037:             } else {
                   2038:                 $oldcloner[0] = $clonenames{'cloners'};
                   2039:             }
                   2040:         }
1.107     matthew  2041:         #
1.105     matthew  2042:         # Let the user know we made the changes
1.153     albertel 2043:         if ($name && defined($value)) {
1.239     raeburn  2044:             my $failed_cloners;
1.178     raeburn  2045:             if ($name eq 'cloners') {
1.239     raeburn  2046:                 $value =~ s/\s//g;
1.178     raeburn  2047:                 $value =~ s/^,//;
                   2048:                 $value =~ s/,$//;
1.239     raeburn  2049:                 # check requested clones are valid users.
                   2050:                 $failed_cloners = &check_cloners(\$value,\@oldcloner);
1.178     raeburn  2051:             }
1.105     matthew  2052:             my $put_result = &Apache::lonnet::put('environment',
                   2053:                                                   {$name=>$value},$dom,$crs);
                   2054:             if ($put_result eq 'ok') {
1.130     www      2055:                 $setoutput.=&mt('Set').' <b>'.$name.'</b> '.&mt('to').' <b>'.$value.'</b>.<br />';
1.178     raeburn  2056:                 if ($name eq 'cloners') {
                   2057:                     &change_clone($value,\@oldcloner);
                   2058:                 }
1.179     raeburn  2059:                 # Flush the course logs so course description is immediately updated
                   2060:                 if ($name eq 'description' && defined($value)) {
                   2061:                     &Apache::lonnet::flushcourselogs();
                   2062:                 }
1.105     matthew  2063:             } else {
1.130     www      2064:                 $setoutput.=&mt('Unable to set').' <b>'.$name.'</b> '.&mt('to').
                   2065: 		    ' <b>'.$value.'</b> '.&mt('due to').' '.$put_result.'.<br />';
1.30      www      2066:             }
1.239     raeburn  2067:             if (($name eq 'cloners') && ($failed_cloners)) {
                   2068:                 $setoutput.= &mt('Unable to include').' - <b>'.$failed_cloners.'</b>, '.
                   2069:                  &mt('reason').' - '.&mt('LON-CAPA user(s) do(es) not exist').
                   2070:                  '.<br />'.&mt('Please ').
                   2071:                  ' <a href="/adm/createuser">'.
                   2072:                  &mt('add the user(s)').'</a>, '.
                   2073:                  &mt('and then return to the ').
                   2074:                  '<a href="/admparmset?action=crsenv">'.
                   2075:                  &mt('Course Parameters page').'</a> '.
                   2076:                  &mt('to add the new user(s) to the list of possible cloners').
                   2077:                  '.<br />';
                   2078:             }
1.30      www      2079:         }
1.38      harris41 2080:     }
1.315     albertel 2081: 
                   2082:     my $start_table     =&Apache::loncommon::start_data_table();
                   2083:     my $start_header_row=&Apache::loncommon::start_data_table_header_row();
                   2084:     my $end_header_row  =&Apache::loncommon::end_data_table_header_row();
1.108     www      2085: # ------------------------- Re-init course environment entries for this session
                   2086: 
1.302     albertel 2087:     &Apache::lonnet::coursedescription($env{'request.course.id'},
1.296     albertel 2088: 				       {'freshen_cache' => 1});
1.105     matthew  2089: 
1.30      www      2090: # -------------------------------------------------------- Get parameters again
1.45      matthew  2091: 
                   2092:     my %values=&Apache::lonnet::dump('environment',$dom,$crs);
1.140     sakharuk 2093:     my $SelectStyleFile=&mt('Select Style File');
1.141     sakharuk 2094:     my $SelectSpreadsheetFile=&mt('Select Spreadsheet File');
1.30      www      2095:     my $output='';
1.45      matthew  2096:     if (! exists($values{'con_lost'})) {
1.30      www      2097:         my %descriptions=
1.140     sakharuk 2098: 	    ('url'            => '<b>'.&mt('Top Level Map').'</b> '.
1.46      matthew  2099:                                  '<a href="javascript:openbrowser'.
1.47      matthew  2100:                                  "('envform','url','sequence')\">".
1.314     albertel 2101:                                  &mt('Select Map').'</a><br /><span class="LC_warning"> '.
1.140     sakharuk 2102:                                  &mt('Modification may make assessment data inaccessible').
1.314     albertel 2103:                                  '</span>',
1.140     sakharuk 2104:              'description'    => '<b>'.&mt('Course Description').'</b>',
1.158     sakharuk 2105:              'courseid'       => '<b>'.&mt('Course ID or number').
1.140     sakharuk 2106:                                  '</b><br />'.
                   2107:                                  '('.&mt('internal').', '.&mt('optional').')',
1.177     raeburn  2108:              'cloners'        => '<b>'.&mt('Users allowed to clone course').'</b><br /><tt>(user:domain,user:domain)</tt><br />'.&mt('Users with active Course Coordinator role in the course automatically have the right to clone it, and can be omitted from list.'),
1.150     www      2109:              'grading'        => '<b>'.&mt('Grading').'</b><br />'.
                   2110:                                  '<tt>"standard", "external", or "spreadsheet"</tt> '.&Apache::loncommon::help_open_topic('GradingOptions'),
1.140     sakharuk 2111:              'default_xml_style' => '<b>'.&mt('Default XML Style File').'</b> '.
1.52      www      2112:                     '<a href="javascript:openbrowser'.
                   2113:                     "('envform','default_xml_style'".
1.140     sakharuk 2114:                     ",'sty')\">$SelectStyleFile</a><br>",
1.141     sakharuk 2115:              'question.email' => '<b>'.&mt('Feedback Addresses for Resource Content Question').
                   2116:                                  '</b><br />(<tt>user:domain,'.
1.74      www      2117:                                  'user:domain(section;section;...;*;...),...</tt>)',
1.141     sakharuk 2118:              'comment.email'  => '<b>'.&mt('Feedback Addresses for Course Content Comments').'</b><br />'.
1.74      www      2119:                                  '(<tt>user:domain,user:domain(section;section;...;*;...),...</tt>)',
1.141     sakharuk 2120:              'policy.email'   => '<b>'.&mt('Feedback Addresses for Course Policy').'</b>'.
1.75      albertel 2121:                                  '<br />(<tt>user:domain,user:domain(section;section;...;*;...),...</tt>)',
1.141     sakharuk 2122:              'hideemptyrows'  => '<b>'.&mt('Hide Empty Rows in Spreadsheets').'</b><br />'.
1.158     sakharuk 2123:                                  '('.&mt('"[_1]" for default hiding','<tt>yes</tt>').')',
1.141     sakharuk 2124:              'pageseparators'  => '<b>'.&mt('Visibly Separate Items on Pages').'</b><br />'.
1.158     sakharuk 2125:                                  '('.&mt('"[_1]" for visible separation','<tt>yes</tt>').', '.
1.141     sakharuk 2126:                                  &mt('changes will not show until next login').')',
1.169     matthew  2127:              'student_classlist_view' => '<b>'.&mt('Allow students to view classlist.').'</b>'.&mt('("all":students can view all sections,"section":students can only view their own section.blank or "disabled" prevents student view.'),
1.118     matthew  2128: 
1.141     sakharuk 2129:              'plc.roles.denied'=> '<b>'.&mt('Disallow live chatroom use for Roles').
                   2130:                                   '</b><br />"<tt>st</tt>": '.
1.158     sakharuk 2131:                                   &mt('student').', "<tt>ta</tt>": '.
1.118     matthew  2132:                                   'TA, "<tt>in</tt>": '.
1.158     sakharuk 2133:                                   &mt('instructor').';<br /><tt>'.&mt('role,role,...').'</tt>) '.
1.118     matthew  2134: 	       Apache::loncommon::help_open_topic("Course_Disable_Discussion"),
                   2135:              'plc.users.denied' => 
1.141     sakharuk 2136:                           '<b>'.&mt('Disallow live chatroom use for Users').'</b><br />'.
1.118     matthew  2137:                                  '(<tt>user:domain,user:domain,...</tt>)',
                   2138: 
1.141     sakharuk 2139:              'pch.roles.denied'=> '<b>'.&mt('Disallow Resource Discussion for Roles').
                   2140:                                   '</b><br />"<tt>st</tt>": '.
1.61      albertel 2141:                                   'student, "<tt>ta</tt>": '.
                   2142:                                   'TA, "<tt>in</tt>": '.
1.75      albertel 2143:                                   'instructor;<br /><tt>role,role,...</tt>) '.
1.61      albertel 2144: 	       Apache::loncommon::help_open_topic("Course_Disable_Discussion"),
1.53      www      2145:              'pch.users.denied' => 
1.141     sakharuk 2146:                           '<b>'.&mt('Disallow Resource Discussion for Users').'</b><br />'.
1.53      www      2147:                                  '(<tt>user:domain,user:domain,...</tt>)',
1.49      matthew  2148:              'spreadsheet_default_classcalc' 
1.141     sakharuk 2149:                  => '<b>'.&mt('Default Course Spreadsheet').'</b> '.
1.50      matthew  2150:                     '<a href="javascript:openbrowser'.
                   2151:                     "('envform','spreadsheet_default_classcalc'".
1.141     sakharuk 2152:                     ",'spreadsheet')\">$SelectSpreadsheetFile</a><br />",
1.49      matthew  2153:              'spreadsheet_default_studentcalc' 
1.141     sakharuk 2154:                  => '<b>'.&mt('Default Student Spreadsheet').'</b> '.
1.50      matthew  2155:                     '<a href="javascript:openbrowser'.
                   2156:                     "('envform','spreadsheet_default_calc'".
1.141     sakharuk 2157:                     ",'spreadsheet')\">$SelectSpreadsheetFile</a><br />",
1.49      matthew  2158:              'spreadsheet_default_assesscalc' 
1.141     sakharuk 2159:                  => '<b>'.&mt('Default Assessment Spreadsheet').'</b> '.
1.50      matthew  2160:                     '<a href="javascript:openbrowser'.
                   2161:                     "('envform','spreadsheet_default_assesscalc'".
1.141     sakharuk 2162:                     ",'spreadsheet')\">$SelectSpreadsheetFile</a><br />",
1.75      albertel 2163: 	     'allow_limited_html_in_feedback'
1.141     sakharuk 2164: 	         => '<b>'.&mt('Allow limited HTML in discussion posts').'</b><br />'.
1.158     sakharuk 2165: 	            '('.&mt('Set value to "[_1]" to allow',"<tt>yes</tt>").')',
1.170     raeburn  2166:              'allow_discussion_post_editing'
1.276     raeburn  2167:                  => '<b>'.&mt('Allow users with specified roles to edit/delete their own discussion posts').'</b><br />"<tt>st</tt>": '.
                   2168:                                   &mt('student').', "<tt>ta</tt>": '.
                   2169:                                   'TA, "<tt>in</tt>": '.
                   2170:                                   &mt('instructor').';&nbsp;(<tt>'.&mt('role:section,role:section,..., e.g., st:001,st:002,in,cc would permit students in sections 001 and 002 and instructors in any section, and course coordinators to edit their own posts.').'</tt>)<br />'.
                   2171:                     '('.&mt('or set value to "[_1]" to allow all roles',"<tt>yes</tt>").')',
1.89      albertel 2172: 	     'rndseed'
1.140     sakharuk 2173: 	         => '<b>'.&mt('Randomization algorithm used').'</b> <br />'.
1.314     albertel 2174:                     '<span class="LC_error">'.&mt('Modifying this will make problems').' '.
                   2175:                     &mt('have different numbers and answers').'</span>',
1.151     albertel 2176: 	     'receiptalg'
                   2177: 	         => '<b>'.&mt('Receipt algorithm used').'</b> <br />'.
                   2178:                     &mt('This controls how receipt numbers are generated.'),
1.164     sakharuk 2179:              'suppress_tries'
1.272     albertel 2180:                  => '<b>'.&mt('Suppress number of tries in printing').'</b><br />'.
1.273     www      2181:                     ' ('.&mt('"[_1]" to suppress, anything else to not suppress','<tt>yes</tt>').')',
1.113     sakharuk 2182:              'problem_stream_switch'
1.141     sakharuk 2183:                  => '<b>'.&mt('Allow problems to be split over pages').'</b><br />'.
1.158     sakharuk 2184:                     ' ('.&mt('"[_1]" if allowed, anything else if not','<tt>yes</tt>').')',
1.161     sakharuk 2185:              'default_paper_size' 
                   2186:                  => '<b>'.&mt('Default paper type').'</b><br />'.
                   2187:                     ' ('.&mt('supported types').': Letter [8 1/2x11 in], Legal [8 1/2x14 in],'. 
                   2188:                     ' Tabloid [11x17 in], Executive [7 1/2x10 in], A2 [420x594 mm],'. 
                   2189:                     ' A3 [297x420 mm], A4 [210x297 mm], A5 [148x210 mm], A6 [105x148 mm])',
1.111     sakharuk 2190:              'anonymous_quiz'
1.150     www      2191:                  => '<b>'.&mt('Anonymous quiz/exam').'</b><br />'.
1.141     sakharuk 2192:                     ' (<tt><b>'.&mt('yes').'</b> '.&mt('to avoid print students names').' </tt>)',
1.217     albertel 2193:              'default_enrollment_start_date' => '<b>'.&mt('Default beginning date for student access.').'</b>',
                   2194:              'default_enrollment_end_date'   => '<b>'.&mt('Default ending date for student access.').'</b>',
1.150     www      2195:              'nothideprivileged'   => '<b>'.&mt('Privileged users that should not be hidden on staff listings').'</b>'.
                   2196:                                  '<br />(<tt>user:domain,user:domain,...</tt>)',
1.140     sakharuk 2197:              'languages' => '<b>'.&mt('Languages used').'</b>',
1.115     www      2198:              'disable_receipt_display'
1.141     sakharuk 2199:                  => '<b>'.&mt('Disable display of problem receipts').'</b><br />'.
1.158     sakharuk 2200:                     ' ('.&mt('"[_1]" to disable, anything else if not','<tt>yes</tt>').')',
1.313     albertel 2201: 	     'task_messages'
                   2202: 	         => '<b>'.&mt('Send message to student when clicking Done on Tasks. [_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>').'</b>',
1.163     albertel 2203: 	     'disablesigfigs'
                   2204: 	         => '<b>'.&mt('Disable checking of Significant Figures').'</b><br />'.
                   2205:                     ' ('.&mt('"[_1]" to disable, anything else if not','<tt>yes</tt>').')',
1.251     albertel 2206: 	     'disableexampointprint'
                   2207: 	         => '<b>'.&mt('Disable automatically printing point values onto exams.').'</b><br />'.
                   2208:                     ' ('.&mt('"[_1]" to disable, anything else if not','<tt>yes</tt>').')',
1.278     www      2209:              'externalsyllabus'
1.279     www      2210:                  => '<b>'.&mt('URL of Syllabus (not using internal handler)').'</b>',
1.149     albertel 2211: 	     'tthoptions'
                   2212: 	         => '<b>'.&mt('Default set of options to pass to tth/m when converting tex').'</b>'
1.107     matthew  2213:              ); 
1.177     raeburn  2214:         my @Display_Order = ('url','description','courseid','cloners','grading',
1.278     www      2215:                              'externalsyllabus',
1.107     matthew  2216:                              'default_xml_style','pageseparators',
                   2217:                              'question.email','comment.email','policy.email',
1.169     matthew  2218:                              'student_classlist_view',
1.118     matthew  2219:                              'plc.roles.denied','plc.users.denied',
1.107     matthew  2220:                              'pch.roles.denied','pch.users.denied',
                   2221:                              'allow_limited_html_in_feedback',
1.170     raeburn  2222:                              'allow_discussion_post_editing',
1.108     www      2223:                              'languages',
1.150     www      2224: 			     'nothideprivileged',
1.107     matthew  2225:                              'rndseed',
1.151     albertel 2226:                              'receiptalg',
1.107     matthew  2227:                              'problem_stream_switch',
1.164     sakharuk 2228: 			     'suppress_tries',
1.161     sakharuk 2229:                              'default_paper_size',
1.115     www      2230:                              'disable_receipt_display',
1.107     matthew  2231:                              'spreadsheet_default_classcalc',
                   2232:                              'spreadsheet_default_studentcalc',
                   2233:                              'spreadsheet_default_assesscalc', 
                   2234:                              'hideemptyrows',
                   2235:                              'default_enrollment_start_date',
                   2236:                              'default_enrollment_end_date',
1.163     albertel 2237: 			     'tthoptions',
1.251     albertel 2238: 			     'disablesigfigs',
1.313     albertel 2239: 			     'disableexampointprint',
                   2240: 			     'task_messages'
1.107     matthew  2241:                              );
                   2242: 	foreach my $parameter (sort(keys(%values))) {
1.244     banghart 2243:             unless (($parameter =~ m/^internal\./)||($parameter =~ m/^metadata\./)) {
1.142     raeburn  2244:                 if (! $descriptions{$parameter}) {
                   2245:                     $descriptions{$parameter}=$parameter;
                   2246:                     push(@Display_Order,$parameter);
                   2247:                 }
                   2248:             }
1.43      albertel 2249: 	}
1.315     albertel 2250: 	
1.107     matthew  2251:         foreach my $parameter (@Display_Order) {
                   2252:             my $description = $descriptions{$parameter};
1.51      matthew  2253:             # onchange is javascript to automatically check the 'Set' button.
1.69      www      2254:             my $onchange = 'onFocus="javascript:window.document.forms'.
1.107     matthew  2255:                 "['envform'].elements['".$parameter."_setparmval']".
1.51      matthew  2256:                 '.checked=true;"';
1.315     albertel 2257:             $output .= &Apache::loncommon::start_data_table_row().
                   2258: 		'<td>'.$description.'</td>';
1.107     matthew  2259:             if ($parameter =~ /^default_enrollment_(start|end)_date$/) {
                   2260:                 $output .= '<td>'.
                   2261:                     &Apache::lonhtmlcommon::date_setter('envform',
                   2262:                                                         $parameter.'_value',
                   2263:                                                         $values{$parameter},
                   2264:                                                         $onchange).
                   2265:                                                         '</td>';
                   2266:             } else {
                   2267:                 $output .= '<td>'.
                   2268:                     &Apache::lonhtmlcommon::textbox($parameter.'_value',
                   2269:                                                     $values{$parameter},
                   2270:                                                     40,$onchange).'</td>';
                   2271:             }
                   2272:             $output .= '<td>'.
                   2273:                 &Apache::lonhtmlcommon::checkbox($parameter.'_setparmval').
                   2274:                 '</td>';
1.315     albertel 2275:             $output .= &Apache::loncommon::end_data_table_row()."\n";
1.51      matthew  2276: 	}
1.69      www      2277:         my $onchange = 'onFocus="javascript:window.document.forms'.
1.51      matthew  2278:             '[\'envform\'].elements[\'newp_setparmval\']'.
                   2279:             '.checked=true;"';
1.315     albertel 2280: 	$output.=&Apache::loncommon::start_data_table_row().
                   2281: 	    '<td><i>'.&mt('Create New Environment Variable').'</i><br />'.
1.51      matthew  2282: 	    '<input type="text" size=40 name="newp_name" '.
                   2283:                 $onchange.' /></td><td>'.
                   2284:             '<input type="text" size=40 name="newp_value" '.
                   2285:                 $onchange.' /></td><td>'.
1.315     albertel 2286: 	    '<input type="checkbox" name="newp_setparmval" /></td>'.
                   2287: 	    &Apache::loncommon::end_data_table_row()."\n";
1.43      albertel 2288:     }
1.157     sakharuk 2289:     my %lt=&Apache::lonlocal::texthash(
                   2290: 		    'par'   => 'Parameter',
                   2291: 		    'val'   => 'Value',
                   2292: 		    'set'   => 'Set',
                   2293: 		    'sce'   => 'Set Course Environment'
                   2294: 				       );
                   2295: 
1.140     sakharuk 2296:     my $Parameter=&mt('Parameter');
                   2297:     my $Value=&mt('Value');
1.141     sakharuk 2298:     my $Set=&mt('Set');
1.280     albertel 2299:     my $browse_js=
                   2300: 	'<script type="text/javascript" language="Javascript">'.
                   2301: 	&Apache::loncommon::browser_and_searcher_javascript('parmset').
                   2302: 	'</script>';
                   2303:     
                   2304:     my $start_page = 
                   2305: 	&Apache::loncommon::start_page('Set Course Environment Parameters',
                   2306: 				       $browse_js);
                   2307:     my $end_page = 
                   2308: 	&Apache::loncommon::end_page();
1.315     albertel 2309:     my $end_table=&Apache::loncommon::end_data_table();
1.280     albertel 2310:     $r->print(<<ENDENV);
                   2311: $start_page
1.193     albertel 2312: $breadcrumbs
                   2313: <form method="post" action="/adm/parmset?action=crsenv" name="envform">
1.30      www      2314: $setoutput
1.315     albertel 2315: $start_table
                   2316: $start_header_row
                   2317: <th>$lt{'par'}</th><th>$lt{'val'}</th><th>$lt{'set'}?</th>
                   2318: $end_header_row
1.30      www      2319: $output
1.315     albertel 2320: $end_table
1.157     sakharuk 2321: <input type="submit" name="crsenv" value="$lt{'sce'}">
1.30      www      2322: </form>
1.280     albertel 2323: $end_page
                   2324: ENDENV
1.30      www      2325: }
1.120     www      2326: ##################################################
1.207     www      2327: # Overview mode
                   2328: ##################################################
1.124     www      2329: my $tableopen;
                   2330: 
                   2331: sub tablestart {
                   2332:     if ($tableopen) {
                   2333: 	return '';
                   2334:     } else {
                   2335: 	$tableopen=1;
1.295     albertel 2336: 	return &Apache::loncommon::start_data_table().'<tr><th>'.&mt('Parameter').'</th><th>'.
1.130     www      2337: 	    &mt('Delete').'</th><th>'.&mt('Set to ...').'</th></tr>';
1.124     www      2338:     }
                   2339: }
                   2340: 
                   2341: sub tableend {
                   2342:     if ($tableopen) {
                   2343: 	$tableopen=0;
1.295     albertel 2344: 	return &Apache::loncommon::end_data_table();
1.124     www      2345:     } else {
                   2346: 	return'';
                   2347:     }
                   2348: }
                   2349: 
1.207     www      2350: sub readdata {
                   2351:     my ($crs,$dom)=@_;
                   2352: # Read coursedata
                   2353:     my $resourcedata=&Apache::lonnet::get_courseresdata($crs,$dom);
                   2354: # Read userdata
                   2355: 
                   2356:     my $classlist=&Apache::loncoursedata::get_classlist();
                   2357:     foreach (keys %$classlist) {
                   2358:         # the following undefs are for 'domain', and 'username' respectively.
                   2359:         if ($_=~/^(\w+)\:(\w+)$/) {
                   2360: 	    my ($tuname,$tudom)=($1,$2);
                   2361: 	    my $useropt=&Apache::lonnet::get_userresdata($tuname,$tudom);
                   2362:             foreach my $userkey (keys %{$useropt}) {
                   2363: 		if ($userkey=~/^$env{'request.course.id'}/) {
                   2364:                     my $newkey=$userkey;
                   2365: 		    $newkey=~s/^($env{'request.course.id'}\.)/$1\[useropt\:$tuname\:$tudom\]\./;
                   2366: 		    $$resourcedata{$newkey}=$$useropt{$userkey};
                   2367: 		}
                   2368: 	    }
                   2369: 	}
                   2370:     }
                   2371:     return $resourcedata;
                   2372: }
                   2373: 
                   2374: 
1.124     www      2375: # Setting
1.208     www      2376: 
                   2377: sub storedata {
                   2378:     my ($r,$crs,$dom)=@_;
1.207     www      2379: # Set userlevel immediately
                   2380: # Do an intermediate store of course level
                   2381:     my $olddata=&readdata($crs,$dom);
1.124     www      2382:     my %newdata=();
                   2383:     undef %newdata;
                   2384:     my @deldata=();
                   2385:     undef @deldata;
1.190     albertel 2386:     foreach (keys %env) {
1.124     www      2387: 	if ($_=~/^form\.([a-z]+)\_(.+)$/) {
                   2388: 	    my $cmd=$1;
                   2389: 	    my $thiskey=$2;
1.207     www      2390: 	    my ($tuname,$tudom)=&extractuser($thiskey);
                   2391: 	    my $tkey=$thiskey;
                   2392:             if ($tuname) {
                   2393: 		$tkey=~s/\.\[useropt\:$tuname\:$tudom\]\./\./;
                   2394: 	    }
1.124     www      2395: 	    if ($cmd eq 'set') {
1.190     albertel 2396: 		my $data=$env{$_};
1.212     www      2397:                 my $typeof=$env{'form.typeof_'.$thiskey};
                   2398:  		if ($$olddata{$thiskey} ne $data) { 
1.207     www      2399: 		    if ($tuname) {
1.212     www      2400: 			if (&Apache::lonnet::put('resourcedata',{$tkey=>$data,
                   2401: 								 $tkey.'.type' => $typeof},
                   2402: 						 $tudom,$tuname) eq 'ok') {
1.290     www      2403: 			    &log_parmset({$tkey=>$data,$tkey.'.type' => $typeof},0,$tuname,$tudom);
1.207     www      2404: 			    $r->print('<br />'.&mt('Stored modified parameter for').' '.
                   2405: 				      &Apache::loncommon::plainname($tuname,$tudom));
                   2406: 			} else {
1.314     albertel 2407: 			    $r->print('<div class="LC_error">'.
                   2408: 				      &mt('Error storing parameters').'</div>');
1.207     www      2409: 			}
                   2410: 			&Apache::lonnet::devalidateuserresdata($tuname,$tudom);
                   2411: 		    } else {
                   2412: 			$newdata{$thiskey}=$data;
1.212     www      2413:  			$newdata{$thiskey.'.type'}=$typeof; 
                   2414:                    } 
1.207     www      2415: 		}
1.124     www      2416: 	    } elsif ($cmd eq 'del') {
1.207     www      2417: 		if ($tuname) {
                   2418: 		    if (&Apache::lonnet::del('resourcedata',[$tkey],$tudom,$tuname) eq 'ok') {
1.290     www      2419: 			    &log_parmset({$tkey=>''},1,$tuname,$tudom);
1.207     www      2420: 			$r->print('<br />'.&mt('Deleted parameter for').' '.&Apache::loncommon::plainname($tuname,$tudom));
                   2421: 		    } else {
1.314     albertel 2422: 			$r->print('<div class="LC_error">'.
                   2423: 				  &mt('Error deleting parameters').'</div>');
1.207     www      2424: 		    }
                   2425: 		    &Apache::lonnet::devalidateuserresdata($tuname,$tudom);
                   2426: 		} else {
                   2427: 		    push (@deldata,$thiskey);
                   2428: 		}
1.124     www      2429: 	    } elsif ($cmd eq 'datepointer') {
1.190     albertel 2430: 		my $data=&Apache::lonhtmlcommon::get_date_from_form($env{$_});
1.212     www      2431:                 my $typeof=$env{'form.typeof_'.$thiskey};
1.207     www      2432: 		if (defined($data) and $$olddata{$thiskey} ne $data) { 
                   2433: 		    if ($tuname) {
1.212     www      2434: 			if (&Apache::lonnet::put('resourcedata',{$tkey=>$data,
                   2435: 								 $tkey.'.type' => $typeof},
                   2436: 						 $tudom,$tuname) eq 'ok') {
1.290     www      2437: 			    &log_parmset({$tkey=>$data,$tkey.'.type' => $typeof},0,$tuname,$tudom);
1.207     www      2438: 			    $r->print('<br />'.&mt('Stored modified date for').' '.&Apache::loncommon::plainname($tuname,$tudom));
                   2439: 			} else {
1.314     albertel 2440: 			    $r->print('<div class="LC_error">'.
                   2441: 				      &mt('Error storing parameters').'</div>');
1.207     www      2442: 			}
                   2443: 			&Apache::lonnet::devalidateuserresdata($tuname,$tudom);
                   2444: 		    } else {
1.212     www      2445: 			$newdata{$thiskey}=$data;
                   2446: 			$newdata{$thiskey.'.type'}=$typeof; 
1.207     www      2447: 		    }
                   2448: 		}
1.124     www      2449: 	    }
                   2450: 	}
                   2451:     }
1.207     www      2452: # Store all course level
1.144     www      2453:     my $delentries=$#deldata+1;
                   2454:     my @newdatakeys=keys %newdata;
                   2455:     my $putentries=$#newdatakeys+1;
                   2456:     if ($delentries) {
                   2457: 	if (&Apache::lonnet::del('resourcedata',\@deldata,$dom,$crs) eq 'ok') {
1.290     www      2458: 	    my %loghash=map { $_ => '' } @deldata;
                   2459: 	    &log_parmset(\%loghash,1);
1.144     www      2460: 	    $r->print('<h2>'.&mt('Deleted [_1] parameter(s)</h2>',$delentries));
                   2461: 	} else {
1.314     albertel 2462: 	    $r->print('<div class="LC_error">'.
                   2463: 		      &mt('Error deleting parameters').'</div>');
1.144     www      2464: 	}
1.205     www      2465: 	&Apache::lonnet::devalidatecourseresdata($crs,$dom);
1.144     www      2466:     }
                   2467:     if ($putentries) {
                   2468: 	if (&Apache::lonnet::put('resourcedata',\%newdata,$dom,$crs) eq 'ok') {
1.290     www      2469: 			    &log_parmset(\%newdata,0);
1.212     www      2470: 	    $r->print('<h3>'.&mt('Stored [_1] parameter(s)',$putentries/2).'</h3>');
1.144     www      2471: 	} else {
1.314     albertel 2472: 	    $r->print('<div class="LC_error">'.
                   2473: 		      &mt('Error storing parameters').'</div>');
1.144     www      2474: 	}
1.205     www      2475: 	&Apache::lonnet::devalidatecourseresdata($crs,$dom);
1.144     www      2476:     }
1.208     www      2477: }
1.207     www      2478: 
1.208     www      2479: sub extractuser {
                   2480:     my $key=shift;
                   2481:     return ($key=~/^$env{'request.course.id'}.\[useropt\:(\w+)\:(\w+)\]\./);
                   2482: }
1.206     www      2483: 
1.208     www      2484: sub listdata {
1.214     www      2485:     my ($r,$resourcedata,$listdata,$sortorder)=@_;
1.207     www      2486: # Start list output
1.206     www      2487: 
1.122     www      2488:     my $oldsection='';
                   2489:     my $oldrealm='';
                   2490:     my $oldpart='';
1.123     www      2491:     my $pointer=0;
1.124     www      2492:     $tableopen=0;
1.145     www      2493:     my $foundkeys=0;
1.248     albertel 2494:     my %keyorder=&standardkeyorder();
1.214     www      2495:     foreach my $thiskey (sort {
                   2496: 	if ($sortorder eq 'realmstudent') {
1.247     albertel 2497: 	    my ($astudent,$arealm)=($a=~/^\Q$env{'request.course.id'}\E\.\[([^\.]+)\]\.(.+)\.[^\.]+$/);
                   2498: 	    my ($bstudent,$brealm)=($b=~/^\Q$env{'request.course.id'}\E\.\[([^\.]+)\]\.(.+)\.[^\.]+$/);
                   2499: 	    if (!defined($astudent)) {
                   2500: 		($arealm)=($a=~/^\Q$env{'request.course.id'}\E\.(.+)$/);
1.237     albertel 2501: 	    }
1.247     albertel 2502: 	    if (!defined($bstudent)) {
                   2503: 		($brealm)=($b=~/^\Q$env{'request.course.id'}\E\.(.+)$/);
                   2504: 	    }
1.248     albertel 2505: 	    $arealm=~s/\.type//;
                   2506: 	    my ($ares, $aparm) = ($arealm=~/^(.*)\.(.*)$/);
                   2507: 	    $aparm=$keyorder{'parameter_0_'.$aparm};
                   2508: 	    $brealm=~s/\.type//;
                   2509: 	    my ($bres, $bparm) = ($brealm=~/^(.*)\.(.*)$/);
                   2510: 	    $bparm=$keyorder{'parameter_0_'.$bparm};	   
                   2511: 	    if ($ares eq $bres) {
                   2512: 		if (defined($aparm) && defined($bparm)) {
                   2513: 		    ($aparm <=> $bparm);
                   2514: 		} elsif (defined($aparm)) {
                   2515: 		    -1;
                   2516: 		} elsif (defined($bparm)) {
                   2517: 		    1;
                   2518: 		} else {
                   2519: 		    ($arealm cmp $brealm) || ($astudent cmp $bstudent);
                   2520: 		}
                   2521: 	    } else {
                   2522: 		($arealm cmp $brealm) || ($astudent cmp $bstudent);
                   2523: 	    }
1.214     www      2524: 	} else {
                   2525: 	    $a cmp $b;
                   2526: 	}
                   2527:     } keys %{$listdata}) {
1.247     albertel 2528: 	 
1.211     www      2529: 	if ($$listdata{$thiskey.'.type'}) {
                   2530:             my $thistype=$$listdata{$thiskey.'.type'};
                   2531:             if ($$resourcedata{$thiskey.'.type'}) {
                   2532: 		$thistype=$$resourcedata{$thiskey.'.type'};
                   2533: 	    }
1.207     www      2534: 	    my ($middle,$part,$name)=
                   2535: 		($thiskey=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);
1.130     www      2536: 	    my $section=&mt('All Students');
1.207     www      2537: 	    if ($middle=~/^\[(.*)\]/) {
1.206     www      2538: 		my $issection=$1;
                   2539: 		if ($issection=~/^useropt\:(\w+)\:(\w+)/) {
                   2540: 		    $section=&mt('User').": ".&Apache::loncommon::plainname($1,$2);
                   2541: 		} else {
                   2542: 		    $section=&mt('Group/Section').': '.$issection;
                   2543: 		}
1.207     www      2544: 		$middle=~s/^\[(.*)\]//;
1.122     www      2545: 	    }
1.207     www      2546: 	    $middle=~s/\.+$//;
                   2547: 	    $middle=~s/^\.+//;
1.316   ! albertel 2548: 	    my $realm='<span class="LC_parm_scope_all">'.&mt('All Resources').'</span>';
1.122     www      2549: 	    if ($middle=~/^(.+)\_\_\_\(all\)$/) {
1.316   ! albertel 2550: 		$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      2551: 	    } elsif ($middle) {
1.174     albertel 2552: 		my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle);
1.316   ! albertel 2553: 		$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      2554: 	    }
1.214     www      2555: 	    if ($sortorder eq 'realmstudent') {
                   2556: 		if ($realm ne $oldrealm) {
                   2557: 		    $r->print(&tableend()."\n<hr /><h1>$realm</h1>");
                   2558: 		    $oldrealm=$realm;
                   2559: 		    $oldsection='';
                   2560: 		}
                   2561: 		if ($section ne $oldsection) {
                   2562: 		    $r->print(&tableend()."\n<h2>$section</h2>");
                   2563: 		    $oldsection=$section;
                   2564: 		    $oldpart='';
                   2565: 		}
                   2566: 	    } else {
                   2567: 		if ($section ne $oldsection) {
                   2568: 		    $r->print(&tableend()."\n<hr /><h1>$section</h1>");
                   2569: 		    $oldsection=$section;
                   2570: 		    $oldrealm='';
                   2571: 		}
                   2572: 		if ($realm ne $oldrealm) {
                   2573: 		    $r->print(&tableend()."\n<h2>$realm</h2>");
                   2574: 		    $oldrealm=$realm;
                   2575: 		    $oldpart='';
                   2576: 		}
1.122     www      2577: 	    }
                   2578: 	    if ($part ne $oldpart) {
1.124     www      2579: 		$r->print(&tableend().
1.316   ! albertel 2580: 			  "\n<span class=\"LC_parm_part\">".&mt('Part').": $part</span>");
1.122     www      2581: 		$oldpart=$part;
                   2582: 	    }
1.123     www      2583: #
1.230     www      2584: # Preset defaults?
                   2585: #
                   2586:             my ($hour,$min,$sec,$val)=('','','','');
                   2587: 	    unless ($$resourcedata{$thiskey}) {
                   2588: 		my ($parmname)=($thiskey=~/\.(\w+)$/);
                   2589: 		($hour,$min,$sec,$val)=&preset_defaults($parmname);
                   2590: 	    }
                   2591: 
                   2592: #
1.123     www      2593: # Ready to print
                   2594: #
1.295     albertel 2595: 	    $r->print(&tablestart().
                   2596: 		      &Apache::loncommon::start_data_table_row().
                   2597: 		      '<td><b>'.&standard_parameter_names($name).
1.293     www      2598: 		      '</b></td><td><input type="checkbox" name="del_'.
1.124     www      2599: 		      $thiskey.'" /></td><td>');
1.145     www      2600: 	    $foundkeys++;
1.213     www      2601: 	    if (&isdateparm($thistype)) {
1.123     www      2602: 		my $jskey='key_'.$pointer;
                   2603: 		$pointer++;
                   2604: 		$r->print(
1.232     albertel 2605: 			  &Apache::lonhtmlcommon::date_setter('parmform',
1.123     www      2606: 							      $jskey,
1.219     www      2607: 						      $$resourcedata{$thiskey},
1.230     www      2608: 							      '',1,'','',$hour,$min,$sec).
1.277     www      2609: '<input type="hidden" name="datepointer_'.$thiskey.'" value="'.$jskey.'" />'.
                   2610: &date_sanity_info($$resourcedata{$thiskey})
1.123     www      2611: 			  );
1.219     www      2612: 	    } elsif ($thistype eq 'string_yesno') {
1.230     www      2613: 		my $showval;
                   2614: 		if (defined($$resourcedata{$thiskey})) {
                   2615: 		    $showval=$$resourcedata{$thiskey};
                   2616: 		} else {
                   2617: 		    $showval=$val;
                   2618: 		}
1.219     www      2619: 		$r->print('<label><input type="radio" name="set_'.$thiskey.
                   2620: 			  '" value="yes"');
1.230     www      2621: 		if ($showval eq 'yes') {
1.219     www      2622: 		    $r->print(' checked="checked"');
                   2623: 		}
                   2624:                 $r->print(' />'.&mt('Yes').'</label> ');
                   2625: 		$r->print('<label><input type="radio" name="set_'.$thiskey.
                   2626: 			  '" value="no"');
1.230     www      2627: 		if ($showval eq 'no') {
1.219     www      2628: 		    $r->print(' checked="checked"');
                   2629: 		}
                   2630:                 $r->print(' />'.&mt('No').'</label>');
1.123     www      2631: 	    } else {
1.230     www      2632: 		my $showval;
                   2633: 		if (defined($$resourcedata{$thiskey})) {
                   2634: 		    $showval=$$resourcedata{$thiskey};
                   2635: 		} else {
                   2636: 		    $showval=$val;
                   2637: 		}
1.211     www      2638: 		$r->print('<input type="text" name="set_'.$thiskey.'" value="'.
1.230     www      2639: 			  $showval.'">');
1.123     www      2640: 	    }
1.211     www      2641: 	    $r->print('<input type="hidden" name="typeof_'.$thiskey.'" value="'.
                   2642: 		      $thistype.'">');
1.295     albertel 2643: 	    $r->print('</td>'.&Apache::loncommon::end_data_table_row());
1.122     www      2644: 	}
1.121     www      2645:     }
1.208     www      2646:     return $foundkeys;
                   2647: }
                   2648: 
                   2649: sub newoverview {
1.280     albertel 2650:     my ($r) = @_;
                   2651: 
1.208     www      2652:     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   2653:     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.280     albertel 2654:     my $start_page = &Apache::loncommon::start_page('Set Parameters');
1.298     albertel 2655:     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Overview');
1.208     www      2656:     $r->print(<<ENDOVER);
1.280     albertel 2657: $start_page
1.208     www      2658: $breadcrumbs
1.232     albertel 2659: <form method="post" action="/adm/parmset?action=newoverview" name="parmform">
1.208     www      2660: ENDOVER
1.211     www      2661:     my @ids=();
                   2662:     my %typep=();
                   2663:     my %keyp=();
                   2664:     my %allparms=();
                   2665:     my %allparts=();
                   2666:     my %allmaps=();
                   2667:     my %mapp=();
                   2668:     my %symbp=();
                   2669:     my %maptitles=();
                   2670:     my %uris=();
                   2671:     my %keyorder=&standardkeyorder();
                   2672:     my %defkeytype=();
                   2673: 
                   2674:     my %alllevs=();
                   2675:     $alllevs{'Resource Level'}='full';
1.215     www      2676:     $alllevs{'Map/Folder Level'}='map';
1.211     www      2677:     $alllevs{'Course Level'}='general';
                   2678: 
                   2679:     my $csec=$env{'form.csec'};
1.269     raeburn  2680:     my $cgroup=$env{'form.cgroup'};
1.211     www      2681: 
                   2682:     my @pscat=&Apache::loncommon::get_env_multiple('form.pscat');
                   2683:     my $pschp=$env{'form.pschp'};
                   2684:     my @psprt=&Apache::loncommon::get_env_multiple('form.psprt');
                   2685:     if (!@psprt) { $psprt[0]='0'; }
                   2686: 
                   2687:     my @selected_sections = 
                   2688: 	&Apache::loncommon::get_env_multiple('form.Section');
                   2689:     @selected_sections = ('all') if (! @selected_sections);
                   2690:     foreach (@selected_sections) {
                   2691:         if ($_ eq 'all') {
                   2692:             @selected_sections = ('all');
                   2693:         }
                   2694:     }
1.269     raeburn  2695:     my @selected_groups =
                   2696:         &Apache::loncommon::get_env_multiple('form.Group');
1.211     www      2697: 
                   2698:     my $pssymb='';
                   2699:     my $parmlev='';
                   2700:  
                   2701:     unless ($env{'form.parmlev'}) {
                   2702:         $parmlev = 'map';
                   2703:     } else {
                   2704:         $parmlev = $env{'form.parmlev'};
                   2705:     }
                   2706: 
                   2707:     &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps, 
                   2708: 				\%mapp, \%symbp,\%maptitles,\%uris,
                   2709: 				\%keyorder,\%defkeytype);
                   2710: 
                   2711: # Menu to select levels, etc
                   2712: 
                   2713:     $r->print('<table border="1"><tr><td>');
                   2714:     &levelmenu($r,\%alllevs,$parmlev);
                   2715:     if ($parmlev ne 'general') {
                   2716: 	$r->print('<td>');
                   2717: 	&mapmenu($r,\%allmaps,$pschp,\%maptitles);
                   2718: 	$r->print('</td>');
                   2719:     }
                   2720:     $r->print('</td></tr></table>');
                   2721: 
                   2722:     $r->print('<table border="1"><tr><td>');  
                   2723:     &parmmenu($r,\%allparms,\@pscat,\%keyorder);
1.269     raeburn  2724:     $r->print('</td><td><table border="0" cellspacing="0" cellpadding="0">'.
                   2725:               '<tr><td>'.&mt('Parts').'</td><td></td><td>'.&mt('Section(s)').
                   2726:               '</td><td></td><td>'.&mt('Group(s)').'</td></tr><tr><td>');
1.211     www      2727:     &partmenu($r,\%allparts,\@psprt);
1.269     raeburn  2728:     $r->print('</td><td>&nbsp;</td><td>');
1.211     www      2729:     &sectionmenu($r,\@selected_sections);
1.269     raeburn  2730:     $r->print('</td><td>&nbsp;</td><td>');
                   2731:     &groupmenu($r,\@selected_groups);
                   2732:     $r->print('</td></tr></table>');
1.214     www      2733:     $r->print('</td></tr></table>');
                   2734:  
                   2735:     my $sortorder=$env{'form.sortorder'};
                   2736:     unless ($sortorder) { $sortorder='realmstudent'; }
                   2737:     &sortmenu($r,$sortorder);
                   2738: 
                   2739:     $r->print('<p><input type="submit" name="dis" value="'.&mt('Display').'" /></p>');
1.211     www      2740: 
                   2741: # Build the list data hash from the specified parms
                   2742: 
                   2743:     my $listdata;
                   2744:     %{$listdata}=();
                   2745: 
                   2746:     foreach my $cat (@pscat) {
1.269     raeburn  2747:         &secgroup_lister($cat,$pschp,$parmlev,$listdata,\@psprt,\@selected_sections,\%defkeytype,\%allmaps,\@ids,\%symbp);
                   2748:         &secgroup_lister($cat,$pschp,$parmlev,$listdata,\@psprt,\@selected_groups,\%defkeytype,\%allmaps,\@ids,\%symbp);
1.211     www      2749:     }
                   2750: 
1.212     www      2751:     if (($env{'form.store'}) || ($env{'form.dis'})) {
1.211     www      2752: 
1.212     www      2753: 	if ($env{'form.store'}) { &storedata($r,$crs,$dom); }
1.211     www      2754: 
                   2755: # Read modified data
                   2756: 
                   2757: 	my $resourcedata=&readdata($crs,$dom);
                   2758: 
                   2759: # List data
                   2760: 
1.214     www      2761: 	&listdata($r,$resourcedata,$listdata,$sortorder);
1.211     www      2762:     }
                   2763:     $r->print(&tableend().
1.212     www      2764: 	     ((($env{'form.store'}) || ($env{'form.dis'}))?'<p><input type="submit" name="store" value="'.&mt('Store').'" /></p>':'').
1.280     albertel 2765: 	      '</form>'.&Apache::loncommon::end_page());
1.208     www      2766: }
                   2767: 
1.269     raeburn  2768: sub secgroup_lister {
                   2769:     my ($cat,$pschp,$parmlev,$listdata,$psprt,$selections,$defkeytype,$allmaps,$ids,$symbp) = @_;
                   2770:     foreach my $item (@{$selections}) {
                   2771:         foreach my $part (@{$psprt}) {
                   2772:             my $rootparmkey=$env{'request.course.id'};
                   2773:             if (($item ne 'all') && ($item ne 'none') && ($item)) {
                   2774:                 $rootparmkey.='.['.$item.']';
                   2775:             }
                   2776:             if ($parmlev eq 'general') {
                   2777: # course-level parameter
                   2778:                 my $newparmkey=$rootparmkey.'.'.$part.'.'.$cat;
                   2779:                 $$listdata{$newparmkey}=1;
                   2780:                 $$listdata{$newparmkey.'.type'}=$$defkeytype{$cat};
                   2781:             } elsif ($parmlev eq 'map') {
                   2782: # map-level parameter
                   2783:                 foreach my $mapid (keys %{$allmaps}) {
                   2784:                     if (($pschp ne 'all') && ($pschp ne $mapid)) { next; }
                   2785:                     my $newparmkey=$rootparmkey.'.'.$$allmaps{$mapid}.'___(all).'.$part.'.'.$cat;
                   2786:                     $$listdata{$newparmkey}=1;
                   2787:                     $$listdata{$newparmkey.'.type'}=$$defkeytype{$cat};
                   2788:                 }
                   2789:             } else {
                   2790: # resource-level parameter
                   2791:                 foreach my $rid (@{$ids}) {
                   2792:                     my ($map,$resid,$url)=&Apache::lonnet::decode_symb($$symbp{$rid});
                   2793:                     if (($pschp ne 'all') && ($$allmaps{$pschp} ne $map)) { next; }
                   2794:                     my $newparmkey=$rootparmkey.'.'.$$symbp{$rid}.'.'.$part.'.'.$cat;
                   2795:                     $$listdata{$newparmkey}=1;
                   2796:                     $$listdata{$newparmkey.'.type'}=$$defkeytype{$cat};
                   2797:                 }
                   2798:             }
                   2799:         }
                   2800:     }
                   2801: }
                   2802: 
1.208     www      2803: sub overview {
1.280     albertel 2804:     my ($r) = @_;
1.208     www      2805:     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   2806:     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.280     albertel 2807: 
                   2808:     my $start_page=&Apache::loncommon::start_page('Modify Parameters');
1.298     albertel 2809:     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Overview');
1.208     www      2810:     $r->print(<<ENDOVER);
1.280     albertel 2811: $start_page
1.208     www      2812: $breadcrumbs
1.232     albertel 2813: <form method="post" action="/adm/parmset?action=setoverview" name="parmform">
1.208     www      2814: ENDOVER
                   2815: # Store modified
                   2816: 
                   2817:     &storedata($r,$crs,$dom);
                   2818: 
                   2819: # Read modified data
                   2820: 
                   2821:     my $resourcedata=&readdata($crs,$dom);
                   2822: 
1.214     www      2823: 
                   2824:     my $sortorder=$env{'form.sortorder'};
                   2825:     unless ($sortorder) { $sortorder='realmstudent'; }
                   2826:     &sortmenu($r,$sortorder);
                   2827: 
1.208     www      2828: # List data
                   2829: 
1.214     www      2830:     my $foundkeys=&listdata($r,$resourcedata,$resourcedata,$sortorder);
1.208     www      2831: 
1.145     www      2832:     $r->print(&tableend().'<p>'.
1.280     albertel 2833: 	($foundkeys?'<input type="submit" value="'.&mt('Modify Parameters').'" />':&mt('There are no parameters.')).'</p></form>'.
                   2834: 	      &Apache::loncommon::end_page());
1.120     www      2835: }
1.121     www      2836: 
1.59      matthew  2837: ##################################################
                   2838: ##################################################
1.178     raeburn  2839:                                                                                             
                   2840: =pod
1.239     raeburn  2841: 
                   2842: =item check_cloners
                   2843: 
                   2844: Checks if new users included in list of allowed cloners
                   2845: are valid users.  Replaces supplied list with 
                   2846: cleaned list containing only users with valid usernames
                   2847: and domains.
                   2848: 
                   2849: Inputs: $clonelist, $oldcloner 
                   2850: where $clonelist is ref to array of requested cloners,
                   2851: and $oldcloner is ref to array of currently allowed
                   2852: cloners.
                   2853: 
                   2854: Returns: string - comma separated list of requested
                   2855: cloners (username:domain) who do not exist in system.
                   2856: 
                   2857: =item change_clone
                   2858: 
1.178     raeburn  2859: Modifies the list of courses a user can clone (stored
1.239     raeburn  2860: in the user's environment.db file), called when a
1.178     raeburn  2861: change is made to the list of users allowed to clone
                   2862: a course.
1.239     raeburn  2863: 
1.178     raeburn  2864: Inputs: $action,$cloner
                   2865: where $action is add or drop, and $cloner is identity of 
                   2866: user for whom cloning ability is to be changed in course. 
                   2867: 
                   2868: =cut
                   2869:                                                                                             
                   2870: ##################################################
                   2871: ##################################################
                   2872: 
1.239     raeburn  2873: sub extract_cloners {
                   2874:     my ($clonelist,$allowclone) = @_;
                   2875:     if ($clonelist =~ /,/) {
                   2876:         @{$allowclone} = split/,/,$clonelist;
                   2877:     } else {
                   2878:         $$allowclone[0] = $clonelist;
                   2879:     }
                   2880: }
                   2881: 
                   2882: 
                   2883: sub check_cloners {
                   2884:     my ($clonelist,$oldcloner) = @_;
                   2885:     my ($clean_clonelist,$disallowed);
                   2886:     my @allowclone = ();
                   2887:     &extract_cloners($$clonelist,\@allowclone);
                   2888:     foreach my $currclone (@allowclone) {
                   2889:         if (!grep/^$currclone$/,@$oldcloner) {
                   2890:             my ($uname,$udom) = split/:/,$currclone;
                   2891:             if ($uname && $udom) {
                   2892:                 if (&Apache::lonnet::homeserver($uname,$udom) eq 'no_host') {
                   2893:                     $disallowed .= $currclone.',';   
                   2894:                 } else {
                   2895:                     $clean_clonelist .= $currclone.',';
                   2896:                 }
                   2897:             }
                   2898:         } else {
                   2899:             $clean_clonelist .= $currclone.',';
                   2900:         }
                   2901:     }
                   2902:     if ($disallowed) {
                   2903:         $disallowed =~ s/,$//;
                   2904:     }
                   2905:     if ($clean_clonelist) {
                   2906:         $clean_clonelist =~ s/,$//;
                   2907:     }
                   2908:     $$clonelist = $clean_clonelist;
                   2909:     return $disallowed;
                   2910: }  
1.178     raeburn  2911: 
                   2912: sub change_clone {
                   2913:     my ($clonelist,$oldcloner) = @_;
                   2914:     my ($uname,$udom);
1.190     albertel 2915:     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
                   2916:     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
1.178     raeburn  2917:     my $clone_crs = $cnum.':'.$cdom;
                   2918:     
                   2919:     if ($cnum && $cdom) {
1.239     raeburn  2920:         my @allowclone;
                   2921:         &extract_cloners($clonelist,\@allowclone);
1.178     raeburn  2922:         foreach my $currclone (@allowclone) {
                   2923:             if (!grep/^$currclone$/,@$oldcloner) {
                   2924:                 ($uname,$udom) = split/:/,$currclone;
                   2925:                 if ($uname && $udom) {
                   2926:                     unless (&Apache::lonnet::homeserver($uname,$udom) eq 'no_host') {
                   2927:                         my %currclonecrs = &Apache::lonnet::dump('environment',$udom,$uname,'cloneable');
                   2928:                         if ($currclonecrs{'cloneable'} !~ /\Q$clone_crs\E/) {
                   2929:                             if ($currclonecrs{'cloneable'} eq '') {
                   2930:                                 $currclonecrs{'cloneable'} = $clone_crs;
                   2931:                             } else {
                   2932:                                 $currclonecrs{'cloneable'} .= ','.$clone_crs;
                   2933:                             }
                   2934:                             &Apache::lonnet::put('environment',\%currclonecrs,$udom,$uname);
                   2935:                         }
                   2936:                     }
                   2937:                 }
                   2938:             }
                   2939:         }
                   2940:         foreach my $oldclone (@$oldcloner) {
                   2941:             if (!grep/^$oldclone$/,@allowclone) {
                   2942:                 ($uname,$udom) = split/:/,$oldclone;
                   2943:                 if ($uname && $udom) {
                   2944:                     unless (&Apache::lonnet::homeserver($uname,$udom) eq 'no_host') {
                   2945:                         my %currclonecrs = &Apache::lonnet::dump('environment',$udom,$uname,'cloneable');
                   2946:                         my %newclonecrs = ();
                   2947:                         if ($currclonecrs{'cloneable'} =~ /\Q$clone_crs\E/) {
                   2948:                             if ($currclonecrs{'cloneable'} =~ /,/) {
                   2949:                                 my @currclonecrs = split/,/,$currclonecrs{'cloneable'};
                   2950:                                 foreach (@currclonecrs) {
                   2951:                                     unless ($_ eq $clone_crs) {
                   2952:                                         $newclonecrs{'cloneable'} .= $_.',';
                   2953:                                     }
                   2954:                                 }
                   2955:                                 $newclonecrs{'cloneable'} =~ s/,$//;
                   2956:                             } else {
                   2957:                                 $newclonecrs{'cloneable'} = '';
                   2958:                             }
                   2959:                             &Apache::lonnet::put('environment',\%newclonecrs,$udom,$uname);
                   2960:                         }
                   2961:                     }
                   2962:                 }
                   2963:             }
                   2964:         }
                   2965:     }
                   2966: }
                   2967: 
1.193     albertel 2968: 
                   2969: ##################################################
                   2970: ##################################################
                   2971: 
                   2972: =pod
                   2973: 
                   2974: =item * header
                   2975: 
                   2976: Output html header for page
                   2977: 
                   2978: =cut
                   2979: 
                   2980: ##################################################
                   2981: ##################################################
                   2982: sub header {
1.280     albertel 2983:     return &Apache::loncommon::start_page('Parameter Manager');
1.193     albertel 2984: }
                   2985: ##################################################
                   2986: ##################################################
                   2987: sub print_main_menu {
                   2988:     my ($r,$parm_permission)=@_;
                   2989:     #
                   2990:     $r->print(<<ENDMAINFORMHEAD);
                   2991: <form method="post" enctype="multipart/form-data"
                   2992:       action="/adm/parmset" name="studentform">
                   2993: ENDMAINFORMHEAD
                   2994: #
1.195     albertel 2995:     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
                   2996:     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
1.268     albertel 2997:     my $vgr  = &Apache::lonnet::allowed('vgr',$env{'request.course.id'});
                   2998: 
1.193     albertel 2999:     my @menu =
                   3000:         (
                   3001:           { text => 'Set Course Environment Parameters',
1.204     www      3002: 	    action => 'crsenv',
1.193     albertel 3003:             permission => $parm_permission,
                   3004:             },
1.255     banghart 3005:           { text => 'Set Portfolio Metadata',
1.259     banghart 3006: 	    action => 'setrestrictmeta',
1.240     banghart 3007:             permission => $parm_permission,
                   3008:             },
1.271     www      3009: 	  { text => 'Manage Course Slots',
1.268     albertel 3010: 	    url => '/adm/slotrequest?command=showslots',
                   3011: 	    permission => $vgr,
                   3012:             },
                   3013: 	  { divider => 1,
                   3014: 	    },
1.216     www      3015:           { text => 'Set/Modify Resource Parameters - Helper Mode',
1.193     albertel 3016:             url => '/adm/helper/parameter.helper',
                   3017:             permission => $parm_permission,
                   3018:             },
1.216     www      3019:           { text => 'Modify Resource Parameters - Overview Mode',
1.193     albertel 3020:             action => 'setoverview',
                   3021:             permission => $parm_permission,
1.208     www      3022:             },          
1.216     www      3023: 	  { text => 'Set Resource Parameters - Overview Mode',
1.208     www      3024:             action => 'newoverview',
                   3025:             permission => $parm_permission,
1.193     albertel 3026:             },
1.216     www      3027:           { text => 'Set/Modify Resource Parameters - Table Mode',
1.193     albertel 3028:             action => 'settable',
                   3029:             permission => $parm_permission,
1.204     www      3030:             help => 'Cascading_Parameters',
1.193     albertel 3031:             },
1.220     www      3032:           { text => 'Set Parameter Setting Default Actions',
                   3033:             action => 'setdefaults',
                   3034:             permission => $parm_permission,
1.284     www      3035:             },          
1.292     www      3036: 	  { text => 'Parameter Change Log and Course Blog Posting/User Notification',
1.284     www      3037:             action => 'parameterchangelog',
                   3038:             permission => $parm_permission,
1.220     www      3039:             },
1.193     albertel 3040:           );
                   3041:     my $menu_html = '';
                   3042:     foreach my $menu_item (@menu) {
1.268     albertel 3043: 	if ($menu_item->{'divider'}) {
                   3044: 	    $menu_html .= '<hr />';
                   3045: 	    next;
                   3046: 	}
1.193     albertel 3047:         next if (! $menu_item->{'permission'});
                   3048:         $menu_html.='<p>';
1.316   ! albertel 3049:         $menu_html.='<span class="LC_parm_menu_item">';
1.193     albertel 3050:         if (exists($menu_item->{'url'})) {
                   3051:             $menu_html.=qq{<a href="$menu_item->{'url'}">};
                   3052:         } else {
                   3053:             $menu_html.=
                   3054:                 qq{<a href="/adm/parmset?action=$menu_item->{'action'}">};
                   3055:         }
1.316   ! albertel 3056:         $menu_html.= &mt($menu_item->{'text'}).'</a></span>';
1.193     albertel 3057:         if (exists($menu_item->{'help'})) {
                   3058:             $menu_html.=
                   3059:                 &Apache::loncommon::help_open_topic($menu_item->{'help'});
                   3060:         }
                   3061:         $menu_html.='</p>'.$/;
                   3062:     }
                   3063:     $r->print($menu_html);
                   3064:     return;
                   3065: }
1.255     banghart 3066: ### Set portfolio metadata
1.252     banghart 3067: sub output_row {
1.255     banghart 3068:     my ($r, $field_name, $field_text) = @_;
1.252     banghart 3069:     my $output;
1.263     banghart 3070:     my $options=$env{'course.'.$env{'request.course.id'}.'.metadata.'.$field_name.'.options'};
                   3071:     my $values=$env{'course.'.$env{'request.course.id'}.'.metadata.'.$field_name.'.values'};
1.254     banghart 3072:     unless (defined($options)) {
                   3073:         $options = 'active,stuadd';
1.261     banghart 3074:         $values = '';
1.252     banghart 3075:     }
1.260     banghart 3076:     $output.='<strong>'.$field_text.':</strong>';
1.264     albertel 3077:     $output.='<input name="'.$field_name.'_values" type="text" value="'.$values.'" size="80" /><br />';
                   3078: 
                   3079:     my @options= ( ['active', 'Show to student'],
                   3080: 		   ['onlyone','Student may select only one choice'],
                   3081: 		   ['stuadd', 'Student may type choices']);
                   3082:     foreach my $opt (@options) {
                   3083: 	my $checked = ($options =~ m/$opt->[0]/) ? ' checked="checked" ' : '' ;
                   3084: 	$output.=('&nbsp;'x5).'<label><input type="checkbox" name="'.
                   3085: 	    $field_name.'_'.$opt->[0].'" value="yes"'.$checked.' />'.
                   3086: 	    &mt($opt->[1]).'</label> <br />';
1.252     banghart 3087:     }
                   3088:     return ($output);
                   3089: }
1.259     banghart 3090: 
                   3091: sub setrestrictmeta {
1.240     banghart 3092:     my ($r)=@_;
1.242     banghart 3093:     my $next_meta;
1.244     banghart 3094:     my $output;
1.245     banghart 3095:     my $item_num;
1.246     banghart 3096:     my $put_result;
1.280     albertel 3097:     
                   3098:     $r->print(&Apache::loncommon::start_page('Restrict Metadata'));
1.298     albertel 3099:     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Restrict Metadata'));
1.240     banghart 3100:     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   3101:     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.259     banghart 3102:     my $key_base = $env{'course.'.$env{'request.course.id'}.'.'};
1.252     banghart 3103:     my $save_field = '';
1.259     banghart 3104:     if ($env{'form.restrictmeta'}) {
1.254     banghart 3105:         foreach my $field (sort(keys(%env))) {
1.252     banghart 3106:             if ($field=~m/^form.(.+)_(.+)$/) {
1.254     banghart 3107:                 my $options;
1.252     banghart 3108:                 my $meta_field = $1;
                   3109:                 my $meta_key = $2;
1.253     banghart 3110:                 if ($save_field ne $meta_field) {
1.252     banghart 3111:                     $save_field = $meta_field;
1.253     banghart 3112:             	    if ($env{'form.'.$meta_field.'_stuadd'}) {
1.254     banghart 3113:             	        $options.='stuadd,';
                   3114:             	    } 
1.253     banghart 3115:             	    if ($env{'form.'.$meta_field.'_onlyone'}) {
1.254     banghart 3116:             	        $options.='onlyone,';
                   3117:             	    } 
                   3118:             	    if ($env{'form.'.$meta_field.'_active'}) {
                   3119:             	        $options.='active,';
1.253     banghart 3120:             	    }
1.259     banghart 3121:                     my $name = $save_field;
1.253     banghart 3122:                      $put_result = &Apache::lonnet::put('environment',
1.262     banghart 3123:                                                   {'metadata.'.$meta_field.'.options'=>$options,
                   3124:                                                    'metadata.'.$meta_field.'.values'=>$env{'form.'.$meta_field.'_values'},
1.253     banghart 3125:                                                    },$dom,$crs);
1.252     banghart 3126:                 }
                   3127:             }
                   3128:         }
                   3129:     }
1.296     albertel 3130:     &Apache::lonnet::coursedescription($env{'request.course.id'},
                   3131: 				       {'freshen_cache' => 1});
1.258     albertel 3132:     my %metadata_fields = &Apache::lonmeta::fieldnames('portfolio');
                   3133:     foreach my $field (sort(keys(%metadata_fields))) {
1.265     banghart 3134:         &Apache::lonnet::logthis ($field);
                   3135:         if ($field ne 'courserestricted') {
                   3136: 	    $output.= &output_row($r, $field, $metadata_fields{$field});
                   3137: 	}
1.255     banghart 3138:     }
1.244     banghart 3139:     $r->print(<<ENDenv);       
1.259     banghart 3140:         <form method="post" action="/adm/parmset?action=setrestrictmeta" name="form">
1.244     banghart 3141:         <p>
                   3142:         $output
1.259     banghart 3143:         <input type="submit" name="restrictmeta" value="Update Metadata Restrictions">
1.244     banghart 3144:         </form>
                   3145: ENDenv
1.280     albertel 3146:     $r->print(&Apache::loncommon::end_page());
1.240     banghart 3147:     return 'ok';
                   3148: }
1.220     www      3149: ##################################################
1.193     albertel 3150: 
1.220     www      3151: sub defaultsetter {
1.280     albertel 3152:     my ($r) = @_;
                   3153: 
                   3154:     my $start_page = 
                   3155: 	&Apache::loncommon::start_page('Parameter Setting Default Actions');
1.298     albertel 3156:     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Defaults');
1.220     www      3157:     $r->print(<<ENDDEFHEAD);
1.280     albertel 3158: $start_page
1.220     www      3159: $breadcrumbs
                   3160: <form method="post" action="/adm/parmset?action=setdefaults" name="defaultform">
                   3161: ENDDEFHEAD
1.280     albertel 3162: 
                   3163:     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   3164:     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.221     www      3165:     my @ids=();
                   3166:     my %typep=();
                   3167:     my %keyp=();
                   3168:     my %allparms=();
                   3169:     my %allparts=();
                   3170:     my %allmaps=();
                   3171:     my %mapp=();
                   3172:     my %symbp=();
                   3173:     my %maptitles=();
                   3174:     my %uris=();
                   3175:     my %keyorder=&standardkeyorder();
                   3176:     my %defkeytype=();
                   3177: 
                   3178:     &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps, 
                   3179: 				\%mapp, \%symbp,\%maptitles,\%uris,
                   3180: 				\%keyorder,\%defkeytype);
1.224     www      3181:     if ($env{'form.storerules'}) {
                   3182: 	my %newrules=();
                   3183: 	my @delrules=();
1.226     www      3184: 	my %triggers=();
1.225     albertel 3185: 	foreach my $key (keys(%env)) {
                   3186:             if ($key=~/^form\.(\w+)\_action$/) {
1.224     www      3187: 		my $tempkey=$1;
1.226     www      3188: 		my $action=$env{$key};
                   3189:                 if ($action) {
                   3190: 		    $newrules{$tempkey.'_action'}=$action;
                   3191: 		    if ($action ne 'default') {
                   3192: 			my ($whichaction,$whichparm)=($action=~/^(.*\_)([^\_]+)$/);
                   3193: 			$triggers{$whichparm}.=$tempkey.':';
                   3194: 		    }
                   3195: 		    $newrules{$tempkey.'_type'}=$defkeytype{$tempkey};
1.224     www      3196: 		    if (&isdateparm($defkeytype{$tempkey})) {
1.227     www      3197: 			$newrules{$tempkey.'_days'}=$env{'form.'.$tempkey.'_days'};
1.224     www      3198: 			$newrules{$tempkey.'_hours'}=$env{'form.'.$tempkey.'_hours'};
                   3199: 			$newrules{$tempkey.'_min'}=$env{'form.'.$tempkey.'_min'};
                   3200: 			$newrules{$tempkey.'_sec'}=$env{'form.'.$tempkey.'_sec'};
                   3201: 		    } else {
                   3202: 			$newrules{$tempkey.'_value'}=$env{'form.'.$tempkey.'_value'};
1.227     www      3203: 			$newrules{$tempkey.'_triggervalue'}=$env{'form.'.$tempkey.'_triggervalue'};
1.224     www      3204: 		    }
                   3205: 		} else {
1.225     albertel 3206: 		    push(@delrules,$tempkey.'_action');
1.226     www      3207: 		    push(@delrules,$tempkey.'_type');
1.225     albertel 3208: 		    push(@delrules,$tempkey.'_hours');
                   3209: 		    push(@delrules,$tempkey.'_min');
                   3210: 		    push(@delrules,$tempkey.'_sec');
                   3211: 		    push(@delrules,$tempkey.'_value');
1.224     www      3212: 		}
                   3213: 	    }
                   3214: 	}
1.226     www      3215: 	foreach my $key (keys %allparms) {
                   3216: 	    $newrules{$key.'_triggers'}=$triggers{$key};
                   3217: 	}
1.224     www      3218: 	&Apache::lonnet::put('parmdefactions',\%newrules,$dom,$crs);
                   3219: 	&Apache::lonnet::del('parmdefactions',\@delrules,$dom,$crs);
                   3220: 	&resetrulescache();
                   3221:     }
1.227     www      3222:     my %lt=&Apache::lonlocal::texthash('days' => 'Days',
                   3223: 				       'hours' => 'Hours',
1.221     www      3224: 				       'min' => 'Minutes',
                   3225: 				       'sec' => 'Seconds',
                   3226: 				       'yes' => 'Yes',
                   3227: 				       'no' => 'No');
1.222     www      3228:     my @standardoptions=('','default');
                   3229:     my @standarddisplay=('',&mt('Default value when manually setting'));
                   3230:     my @dateoptions=('','default');
                   3231:     my @datedisplay=('',&mt('Default value when manually setting'));
                   3232:     foreach my $tempkey (&keysindisplayorder(\%allparms,\%keyorder)) {
                   3233: 	unless ($tempkey) { next; }
                   3234: 	push @standardoptions,'when_setting_'.$tempkey;
                   3235: 	push @standarddisplay,&mt('Automatically set when setting ').$tempkey;
                   3236: 	if (&isdateparm($defkeytype{$tempkey})) {
                   3237: 	    push @dateoptions,'later_than_'.$tempkey;
                   3238: 	    push @datedisplay,&mt('Automatically set later than ').$tempkey;
                   3239: 	    push @dateoptions,'earlier_than_'.$tempkey;
                   3240: 	    push @datedisplay,&mt('Automatically set earlier than ').$tempkey;
                   3241: 	} 
                   3242:     }
1.231     www      3243: $r->print(&mt('Manual setting rules apply to all interfaces.').'<br />'.
                   3244: 	  &mt('Automatic setting rules apply to table mode interfaces only.'));
1.221     www      3245:     $r->print("\n<table border='1'><tr><th>".&mt('Rule for parameter').'</th><th>'.
1.222     www      3246: 	      &mt('Action').'</th><th>'.&mt('Value').'</th></tr>');
1.221     www      3247:     foreach my $tempkey (&keysindisplayorder(\%allparms,\%keyorder)) {
1.222     www      3248: 	unless ($tempkey) { next; }
1.221     www      3249: 	$r->print("\n<tr><td>".$allparms{$tempkey}."\n<br />(".$tempkey.')</td><td>');
1.222     www      3250: 	my $action=&rulescache($tempkey.'_action');
                   3251: 	$r->print('<select name="'.$tempkey.'_action">');
                   3252: 	if (&isdateparm($defkeytype{$tempkey})) {
                   3253: 	    for (my $i=0;$i<=$#dateoptions;$i++) {
                   3254: 		if ($dateoptions[$i]=~/\_$tempkey$/) { next; }
                   3255: 		$r->print("\n<option value='$dateoptions[$i]'".
                   3256: 			  ($dateoptions[$i] eq $action?' selected="selected"':'').
                   3257: 			  ">$datedisplay[$i]</option>");
                   3258: 	    }
                   3259: 	} else {
                   3260: 	    for (my $i=0;$i<=$#standardoptions;$i++) {
                   3261: 		if ($standardoptions[$i]=~/\_$tempkey$/) { next; }
                   3262: 		$r->print("\n<option value='$standardoptions[$i]'".
                   3263: 			  ($standardoptions[$i] eq $action?' selected="selected"':'').
                   3264: 			  ">$standarddisplay[$i]</option>");
                   3265: 	    }
                   3266: 	}
                   3267: 	$r->print('</select>');
1.227     www      3268: 	unless (&isdateparm($defkeytype{$tempkey})) {
                   3269: 	    $r->print("\n<br />".&mt('Triggering value(s) of other parameter (optional, comma-separated):').
                   3270: 		      '<input type="text" size="20" name="'.$tempkey.'_triggervalue" value="'.&rulescache($tempkey.'_triggervalue').'" />');
                   3271: 	}
1.222     www      3272: 	$r->print("\n</td><td>\n");
                   3273: 
1.221     www      3274:         if (&isdateparm($defkeytype{$tempkey})) {
1.227     www      3275: 	    my $days=&rulescache($tempkey.'_days');
1.222     www      3276: 	    my $hours=&rulescache($tempkey.'_hours');
                   3277: 	    my $min=&rulescache($tempkey.'_min');
                   3278: 	    my $sec=&rulescache($tempkey.'_sec');
1.221     www      3279: 	    $r->print(<<ENDINPUTDATE);
1.227     www      3280: <input name="$tempkey\_days" type="text" size="4" value="$days" />$lt{'days'}<br />
1.222     www      3281: <input name="$tempkey\_hours" type="text" size="4" value="$hours" />$lt{'hours'}<br />
                   3282: <input name="$tempkey\_min" type="text" size="4" value="$min" />$lt{'min'}<br />
                   3283: <input name="$tempkey\_sec" type="text" size="4" value="$sec" />$lt{'sec'}
1.221     www      3284: ENDINPUTDATE
                   3285: 	} elsif ($defkeytype{$tempkey} eq 'string_yesno') {
1.222     www      3286:             my $yeschecked='';
                   3287:             my $nochecked='';
                   3288:             if (&rulescache($tempkey.'_value') eq 'yes') { $yeschecked='checked="checked"'; }
                   3289:             if (&rulescache($tempkey.'_value') eq 'no') { $nochecked='checked="checked"'; }
                   3290: 
1.221     www      3291: 	    $r->print(<<ENDYESNO);
1.224     www      3292: <label><input type="radio" name="$tempkey\_value" value="yes" $yeschecked /> $lt{'yes'}</label><br />
                   3293: <label><input type="radio" name="$tempkey\_value" value="no" $nochecked /> $lt{'no'}</label>
1.221     www      3294: ENDYESNO
                   3295:         } else {
1.224     www      3296: 	    $r->print('<input type="text" size="20" name="'.$tempkey.'_value" value="'.&rulescache($tempkey.'_value').'" />');
1.221     www      3297: 	}
                   3298:         $r->print('</td></tr>');
                   3299:     }
1.224     www      3300:     $r->print("</table>\n<input type='submit' name='storerules' value='".
1.280     albertel 3301: 	      &mt('Store Rules')."' /></form>\n".
                   3302: 	      &Apache::loncommon::end_page());
1.220     www      3303:     return;
                   3304: }
1.193     albertel 3305: 
1.290     www      3306: sub components {
1.291     www      3307:     my ($key,$uname,$udom,$exeuser,$exedomain)=@_;
1.290     www      3308:     my $typeflag=0;
                   3309:     if ($key=~/\.type$/) {
                   3310: 	$key=~s/\.type$//;
                   3311:         $typeflag=1;
                   3312:     }
1.291     www      3313:     my $issection;
1.290     www      3314:     my ($middle,$part,$name)=($key=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);
                   3315:     my $section=&mt('All Students');
                   3316:     if ($middle=~/^\[(.*)\]/) {
1.291     www      3317: 	$issection=$1;
                   3318: 	$section=&mt('Group/Section').': '.$issection;
1.290     www      3319: 	$middle=~s/^\[(.*)\]//;
                   3320:     }
                   3321:     $middle=~s/\.+$//;
                   3322:     $middle=~s/^\.+//;
1.291     www      3323:     if ($uname) {
                   3324: 	$section=&mt('User').": ".&Apache::loncommon::plainname($uname,$udom);
                   3325: 	$issection='';
                   3326:     }
1.316   ! albertel 3327:     my $realm='<span class="LC_parm_scope_all">'.&mt('All Resources').'</span>';
1.304     www      3328:     my $realmdescription=&mt('all resources'); 
1.290     www      3329:     if ($middle=~/^(.+)\_\_\_\(all\)$/) {
1.316   ! albertel 3330: 	$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      3331:  	$realmdescription=&mt('folder').' '.&Apache::lonnet::gettitle($1);
                   3332:    } elsif ($middle) {
1.290     www      3333: 	my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle);
1.316   ! albertel 3334: 	$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      3335: 	$realmdescription=&mt('resource').' '.&Apache::lonnet::gettitle($middle);
1.290     www      3336:     }
1.291     www      3337:     my $what=$part.'.'.$name;
                   3338:     return ($realm,$section,$name,$part,$typeflag,
1.304     www      3339: 	    $what,$middle,$uname,$udom,$issection,$realmdescription);
1.290     www      3340: }
1.293     www      3341: 
1.292     www      3342: sub standard_parameter_names {
                   3343:     my ($name)=@_;
                   3344:     my %standard_parms=&Apache::lonlocal::texthash('duedate' => 'Due Date',
                   3345: 						   'answerdate' => 'Answer Date',
                   3346: 						   'opendate' => 'Open Date',
                   3347: 						   'maxtries' => 'Max. Number of Tries',
                   3348: 						   'weight' => 'Weight',
                   3349: 						   'date_start' => 'Starting Date',
1.293     www      3350: 						   'date_end' => 'Ending Date',
1.309     www      3351:                                                    'interval' => 'Time Interval Length',
                   3352:                                                    'tol' => 'Numerical Tolerance',
                   3353:                                                    'sig' => 'Significant Digits',
                   3354:                                                    'contentopen' => 'Content Opening Date',
                   3355:                                                    'contentclose' => 'Content Closing Date',
                   3356:                                                    'discussend' => 'End of Discussion Time',
                   3357:                                                    'discusshide' => 'Discussion Hidden',
                   3358:                                                    'problemstatus' => 'Problem Status Visible',
1.293     www      3359: 						   'int_pos' => 'Positive Integer',
                   3360: 						   'int_zero_pos' => 'Positive Integer or Zero',
1.310     www      3361: 						   'hinttries' => 'Number of Tries till Hints appear',
                   3362:                                                    'numbubbles' => 'Number of Bubbles in Exam Mode');
1.292     www      3363:     if ($standard_parms{$name}) {
                   3364: 	return $standard_parms{$name}; 
                   3365:     } else { 
                   3366: 	return $name; 
                   3367:     }
                   3368: }
1.290     www      3369: 
1.309     www      3370: #
                   3371: # Parameter Change Log
                   3372: #
                   3373: 
                   3374: 
1.285     albertel 3375: sub parm_change_log {
1.284     www      3376:     my ($r)=@_;
                   3377:     &startpage($r);
1.286     www      3378:     my %parmlog=&Apache::lonnet::dump('nohist_parameterlog',
                   3379: 				      $env{'course.'.$env{'request.course.id'}.'.domain'},
                   3380: 				      $env{'course.'.$env{'request.course.id'}.'.num'});
1.311     albertel 3381: 
1.301     www      3382:     if ((keys(%parmlog))[0]=~/^error\:/) { undef(%parmlog); }
1.311     albertel 3383: 
                   3384:     $r->print('<form action="/adm/parmset?action=settable"
                   3385:                      method="post" name"parameterlog">
                   3386:                <input type="hidden" name="action"
                   3387:                       value="parameterchangelog" />');
                   3388:     
                   3389:     my %saveable_parameters = ('show' => 'scalar',);
                   3390:     &Apache::loncommon::store_course_settings('parameter_log',
                   3391:                                               \%saveable_parameters);
                   3392:     &Apache::loncommon::restore_course_settings('parameter_log',
                   3393:                                                 \%saveable_parameters);
                   3394:     if (!$env{'form.show'}) { $env{'form.show'}=10; }
                   3395: 
                   3396:     my $countselect =
                   3397: 	&Apache::lonmeta::selectbox('show',$env{'form.show'},undef,
                   3398: 				    (&mt('all'),10,20,50,100,1000,10000));
                   3399: 
1.309     www      3400:     $r->print('<nobr>'.&mt('[_1] Records',$countselect).'</nobr>'.
                   3401: 	      '<input type="submit" value="'.&mt('Display').'" />');
1.301     www      3402: 
1.291     www      3403:     my $courseopt=&Apache::lonnet::get_courseresdata($env{'course.'.$env{'request.course.id'}.'.num'},
                   3404: 						     $env{'course.'.$env{'request.course.id'}.'.domain'});
1.301     www      3405:     $r->print(&Apache::loncommon::start_data_table().&Apache::loncommon::start_data_table_header_row().
                   3406: 	      '<th>'.&mt('Time').'</th><th>'.&mt('User').'</th><th>'.&mt('Extent').'</th><th>'.&mt('Users').'</th><th>'.
                   3407: 	      &mt('Parameter').'</th><th>'.&mt('Part').'</th><th>'.&mt('New Value').'</th><th>'.&mt('Announce').'</th>'.
                   3408: 	      &Apache::loncommon::end_data_table_header_row());
1.309     www      3409:     my $shown=0;
1.294     www      3410:     foreach my $id (sort { $parmlog{$b}{'exe_time'}<=>$parmlog{$a}{'exe_time'} } (keys(%parmlog))) {
                   3411:         my @changes=keys(%{$parmlog{$id}{'logentry'}});
1.290     www      3412: 	my $count=$#changes+1;
1.288     albertel 3413: 	my $time =
1.294     www      3414: 	    &Apache::lonlocal::locallocaltime($parmlog{$id}{'exe_time'});
1.289     www      3415: 	my $plainname = 
1.294     www      3416: 	    &Apache::loncommon::plainname($parmlog{$id}{'exe_uname'},
                   3417: 					  $parmlog{$id}{'exe_udom'});
1.288     albertel 3418: 	my $about_me_link = 
1.289     www      3419: 	    &Apache::loncommon::aboutmewrapper($plainname,
1.294     www      3420: 					       $parmlog{$id}{'exe_uname'},
                   3421: 					       $parmlog{$id}{'exe_udom'});
1.293     www      3422: 	my $send_msg_link='';
1.294     www      3423: 	if ((($parmlog{$id}{'exe_uname'} ne $env{'user.name'}) 
                   3424: 	     || ($parmlog{$id}{'exe_udom'} ne $env{'user.domain'}))) {
1.293     www      3425: 	    $send_msg_link ='<br />'.
1.288     albertel 3426: 		&Apache::loncommon::messagewrapper(&mt('Send message'),
1.294     www      3427: 						   $parmlog{$id}{'exe_uname'},
                   3428: 						   $parmlog{$id}{'exe_udom'});
1.288     albertel 3429: 	}
1.301     www      3430: 	my $row_start=&Apache::loncommon::start_data_table_row();
                   3431: 	$r->print($row_start.'<td rowspan="'.$count.'">'.$time.'</td>
1.290     www      3432:                        <td rowspan="'.$count.'">'.$about_me_link.
1.294     www      3433: 		  '<br /><tt>'.$parmlog{$id}{'exe_uname'}.
                   3434: 			          ':'.$parmlog{$id}{'exe_udom'}.'</tt>'.
1.290     www      3435: 		  $send_msg_link.'</td>');
                   3436: 	my $makenewrow=0;
                   3437: 	my %istype=();
1.293     www      3438: 	foreach my $changed (reverse(sort(@changes))) {
1.294     www      3439:             my $value=$parmlog{$id}{'logentry'}->{$changed};
1.304     www      3440:             my ($realm,$section,$parmname,$part,$typeflag,$what,$middle,$uname,$udom,$issection,$realmdescription)=
1.294     www      3441: 		&components($changed,$parmlog{$id}{'uname'},$parmlog{$id}{'udom'});
1.290     www      3442: 	    if ($typeflag) { $istype{$parmname}=$value; }
1.301     www      3443: 	    if ($makenewrow) { $r->print($row_start); } else { $makenewrow=1; }
1.290     www      3444: 	    $r->print('<td>'.$realm.'</td><td>'.$section.'</td><td>'.
1.292     www      3445: 		      &standard_parameter_names($parmname).'</td><td>'.
                   3446: 		      ($part?&mt('Part: [_1]',$part):&mt('All Parts')).'</td><td>');
1.291     www      3447: 	    my $stillactive=0;
1.294     www      3448: 	    if ($parmlog{$id}{'deleteflag'}) {
1.290     www      3449: 		$r->print(&mt('Deleted'));
1.288     albertel 3450: 	    } else {
1.290     www      3451: 		if ($typeflag) {
1.292     www      3452: 		    $r->print(&mt('Type: [_1]',&standard_parameter_names($value)));
1.290     www      3453: 		} else {
1.291     www      3454: 		    my ($level,@all)=&parmval_by_symb($what,$middle,&Apache::lonnet::metadata($middle,$what),
                   3455: 						      $uname,$udom,$issection,$issection,$courseopt);
                   3456: 		    if (&isdateparm($istype{$parmname})) {
                   3457: 			$r->print(&Apache::lonlocal::locallocaltime($value));
                   3458: 		    } else {
                   3459: 			$r->print($value);
                   3460: 		    }
                   3461: 		    if ($value ne $all[$level]) {
1.316   ! albertel 3462: 			$r->print('<br /><span class="LC_warning">'.&mt('Not active anymore').'</span>');
1.291     www      3463: 		    } else {
                   3464: 			$stillactive=1;
                   3465: 		    }
1.290     www      3466: 		}
1.288     albertel 3467: 	    }
1.291     www      3468: 	    $r->print('</td>');
                   3469: 	    if ($stillactive) {
1.304     www      3470: 		my $title=&mt('Changed [_1]',&standard_parameter_names($parmname));
                   3471:                 my $description=&mt('Changed [_1] for [_2] to [_3]',&standard_parameter_names($parmname),$realmdescription,
                   3472: 				    (&isdateparm($istype{$parmname})?&Apache::lonlocal::locallocaltime($value):$value));
1.292     www      3473: 		if (($uname) && ($udom)) {
1.304     www      3474: 		    $r->print('<td>'.
                   3475: 			      &Apache::loncommon::messagewrapper('Notify User',$uname,$udom,$title,$description).
                   3476: 			      '</td>');
1.292     www      3477: 		} else {
1.303     www      3478: 		    $r->print('<td>'.
1.304     www      3479: 			      &Apache::lonrss::course_blog_link($id,$title,$description).
                   3480: 			      '</td>');
1.292     www      3481: 		}
1.291     www      3482: 	    } else {
                   3483: 		$r->print('<td>&nbsp;</td>');
                   3484: 	    }
1.301     www      3485: 	    $r->print(&Apache::loncommon::end_data_table_row());
1.288     albertel 3486: 	}
1.309     www      3487: 	$shown++;
1.311     albertel 3488: 	if (!($env{'form.show'} eq &mt('all') 
                   3489: 	      || $shown<=$env{'form.show'})) { last; }
1.286     www      3490:     }
1.301     www      3491:     $r->print(&Apache::loncommon::end_data_table());
1.309     www      3492:     $r->print('</form>');
1.284     www      3493:     $r->print(&Apache::loncommon::end_page());
                   3494: }
                   3495: 
1.178     raeburn  3496: ##################################################
                   3497: ##################################################
1.30      www      3498: 
1.59      matthew  3499: =pod
                   3500: 
1.83      bowersj2 3501: =item * handler
1.59      matthew  3502: 
                   3503: Main handler.  Calls &assessparms and &crsenv subroutines.
                   3504: 
                   3505: =cut
                   3506: ##################################################
                   3507: ##################################################
1.220     www      3508: #    use Data::Dumper;
                   3509: 
1.259     banghart 3510: 
1.30      www      3511: sub handler {
1.43      albertel 3512:     my $r=shift;
1.30      www      3513: 
1.43      albertel 3514:     if ($r->header_only) {
1.126     www      3515: 	&Apache::loncommon::content_type($r,'text/html');
1.43      albertel 3516: 	$r->send_http_header;
                   3517: 	return OK;
                   3518:     }
1.193     albertel 3519:     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
1.205     www      3520: 					    ['action','state',
                   3521:                                              'pres_marker',
                   3522:                                              'pres_value',
1.206     www      3523:                                              'pres_type',
1.243     banghart 3524:                                              'udom','uname','symb','serial']);
1.131     www      3525: 
1.83      bowersj2 3526: 
1.193     albertel 3527:     &Apache::lonhtmlcommon::clear_breadcrumbs();
1.194     albertel 3528:     &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/parmset",
                   3529: 					    text=>"Parameter Manager",
1.204     www      3530: 					    faq=>10,
1.194     albertel 3531: 					    bug=>'Instructor Interface'});
1.203     www      3532: 
1.30      www      3533: # ----------------------------------------------------- Needs to be in a course
1.194     albertel 3534:     my $parm_permission =
                   3535: 	(&Apache::lonnet::allowed('opa',$env{'request.course.id'}) ||
1.190     albertel 3536: 	 &Apache::lonnet::allowed('opa',$env{'request.course.id'}.'/'.
1.193     albertel 3537: 				  $env{'request.course.sec'}));
1.194     albertel 3538:     if ($env{'request.course.id'} &&  $parm_permission) {
1.193     albertel 3539: 
                   3540:         # Start Page
1.126     www      3541:         &Apache::loncommon::content_type($r,'text/html');
1.106     www      3542:         $r->send_http_header;
1.30      www      3543: 
1.203     www      3544: 
                   3545:         # id numbers can change on re-ordering of folders
                   3546: 
                   3547:         &resetsymbcache();
                   3548: 
1.193     albertel 3549:         #
                   3550:         # Main switch on form.action and form.state, as appropriate
                   3551:         #
                   3552:         # Check first if coming from someone else headed directly for
                   3553:         #  the table mode
                   3554:         if ((($env{'form.command'} eq 'set') && ($env{'form.url'})
                   3555: 	     && (!$env{'form.dis'})) || ($env{'form.symb'})) {
                   3556: 	    &assessparms($r);
                   3557: 
                   3558:         } elsif (! exists($env{'form.action'})) {
                   3559:             $r->print(&header());
1.298     albertel 3560:             $r->print(&Apache::lonhtmlcommon::breadcrumbs('Parameter Manager'));
1.193     albertel 3561:             &print_main_menu($r,$parm_permission);
                   3562:         } elsif ($env{'form.action'} eq 'crsenv' && $parm_permission) {
1.194     albertel 3563:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=crsenv',
                   3564: 						    text=>"Course Environment"});
1.193     albertel 3565:             &crsenv($r); 
                   3566:         } elsif ($env{'form.action'} eq 'setoverview' && $parm_permission) {
1.194     albertel 3567:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview',
                   3568: 						    text=>"Overview Mode"});
1.121     www      3569: 	    &overview($r);
1.259     banghart 3570:         } elsif ($env{'form.action'} eq 'setrestrictmeta' && $parm_permission) {
                   3571:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setrestrictmeta',
                   3572: 						    text=>"Restrict Metadata"});
                   3573: 	    &setrestrictmeta($r);
1.208     www      3574:         } elsif ($env{'form.action'} eq 'newoverview' && $parm_permission) {
                   3575:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview',
                   3576: 						    text=>"Overview Mode"});
                   3577: 	    &newoverview($r);
1.220     www      3578:         }  elsif ($env{'form.action'} eq 'setdefaults' && $parm_permission) {
                   3579:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setdefaults',
                   3580: 						    text=>"Set Defaults"});
                   3581: 	    &defaultsetter($r);
                   3582: 	} elsif ($env{'form.action'} eq 'settable' && $parm_permission) {
1.194     albertel 3583:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=settable',
1.204     www      3584: 						    text=>"Table Mode",
                   3585: 						    help => 'Course_Setting_Parameters'});
1.121     www      3586: 	    &assessparms($r);
1.284     www      3587:         } elsif ($env{'form.action'} eq 'parameterchangelog' && $parm_permission) {
                   3588:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=settable',
1.292     www      3589: 						    text=>"Parameter Change Log"});
1.285     albertel 3590: 	    &parm_change_log($r);
1.284     www      3591: 	}       
1.43      albertel 3592:     } else {
1.1       www      3593: # ----------------------------- Not in a course, or not allowed to modify parms
1.190     albertel 3594: 	$env{'user.error.msg'}=
1.43      albertel 3595: 	    "/adm/parmset:opa:0:0:Cannot modify assessment parameters";
                   3596: 	return HTTP_NOT_ACCEPTABLE;
                   3597:     }
                   3598:     return OK;
1.1       www      3599: }
                   3600: 
                   3601: 1;
                   3602: __END__
                   3603: 
1.59      matthew  3604: =pod
1.38      harris41 3605: 
                   3606: =back
                   3607: 
                   3608: =cut
1.1       www      3609: 
                   3610: 
                   3611: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>