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

1.1       www         1: # The LearningOnline Network with CAPA
                      2: # Handler to set parameters for assessments
                      3: #
1.196   ! www         4: # $Id: lonparmset.pm,v 1.195 2005/05/30 17:58:51 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.1       www        65: 
1.2       www        66: my %courseopt;
                     67: my %useropt;
                     68: my %parmhash;
                     69: 
1.3       www        70: my @ids;
                     71: my %symbp;
1.10      www        72: my %mapp;
1.3       www        73: my %typep;
1.16      www        74: my %keyp;
1.196   ! www        75: my %uris;
1.82      www        76: my %maptitles;
                     77: 
1.59      matthew    78: ##################################################
                     79: ##################################################
                     80: 
                     81: =pod
                     82: 
                     83: =item parmval
                     84: 
                     85: Figure out a cascading parameter.
                     86: 
1.71      albertel   87: Inputs:  $what - a parameter spec (incluse part info and name I.E. 0.weight)
1.162     albertel   88:          $id   - a bighash Id number
1.71      albertel   89:          $def  - the resource's default value   'stupid emacs
                     90: 
                     91: 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 11 possible levels
                     92: 
1.182     albertel   93: 11 - General Course
                     94: 10 - Map or Folder level in course
                     95: 9- resource default
                     96: 8- map default
1.71      albertel   97: 7 - resource level in course
                     98: 6 - General for section
1.82      www        99: 5 - Map or Folder level for section
1.71      albertel  100: 4 - resource level in section
                    101: 3 - General for specific student
1.82      www       102: 2 - Map or Folder level for specific student
1.71      albertel  103: 1 - resource level for specific student
1.2       www       104: 
1.59      matthew   105: =cut
                    106: 
                    107: ##################################################
                    108: ##################################################
1.2       www       109: sub parmval {
1.187     www       110:     my ($what,$id,$def,$uname,$udom,$csec)=@_;
1.8       www       111:     my $result='';
1.44      albertel  112:     my @outpar=();
1.2       www       113: # ----------------------------------------------------- Cascading lookup scheme
1.10      www       114: 
1.43      albertel  115:     my $symbparm=$symbp{$id}.'.'.$what;
                    116:     my $mapparm=$mapp{$id}.'___(all).'.$what;
1.10      www       117: 
1.190     albertel  118:     my $seclevel=$env{'request.course.id'}.'.['.$csec.'].'.$what;
                    119:     my $seclevelr=$env{'request.course.id'}.'.['.$csec.'].'.$symbparm;
                    120:     my $seclevelm=$env{'request.course.id'}.'.['.$csec.'].'.$mapparm;
                    121: 
                    122:     my $courselevel=$env{'request.course.id'}.'.'.$what;
                    123:     my $courselevelr=$env{'request.course.id'}.'.'.$symbparm;
                    124:     my $courselevelm=$env{'request.course.id'}.'.'.$mapparm;
1.2       www       125: 
1.11      www       126: 
                    127: 
1.182     albertel  128: # --------------------------------------------------------- first, check course
1.11      www       129: 
1.71      albertel  130:     if (defined($courseopt{$courselevel})) {
1.182     albertel  131: 	$outpar[11]=$courseopt{$courselevel};
                    132: 	$result=11;
1.43      albertel  133:     }
1.11      www       134: 
1.71      albertel  135:     if (defined($courseopt{$courselevelm})) {
1.182     albertel  136: 	$outpar[10]=$courseopt{$courselevelm};
                    137: 	$result=10;
1.43      albertel  138:     }
1.11      www       139: 
1.182     albertel  140: # ------------------------------------------------------- second, check default
                    141: 
                    142:     if (defined($def)) { $outpar[9]=$def; $result=9; }
                    143: 
                    144: # ------------------------------------------------------ third, check map parms
                    145: 
                    146:     my $thisparm=$parmhash{$symbparm};
                    147:     if (defined($thisparm)) { $outpar[8]=$thisparm; $result=8; }
                    148: 
1.71      albertel  149:     if (defined($courseopt{$courselevelr})) {
1.43      albertel  150: 	$outpar[7]=$courseopt{$courselevelr};
                    151: 	$result=7;
                    152:     }
1.11      www       153: 
1.182     albertel  154: # ------------------------------------------------------ fourth, back to course
1.71      albertel  155:     if (defined($csec)) {
                    156:         if (defined($courseopt{$seclevel})) {
1.43      albertel  157: 	    $outpar[6]=$courseopt{$seclevel};
                    158: 	    $result=6;
                    159: 	}
1.71      albertel  160:         if (defined($courseopt{$seclevelm})) {
1.43      albertel  161: 	    $outpar[5]=$courseopt{$seclevelm};
                    162: 	    $result=5;
                    163: 	}
                    164: 
1.71      albertel  165:         if (defined($courseopt{$seclevelr})) {
1.43      albertel  166: 	    $outpar[4]=$courseopt{$seclevelr};
                    167: 	    $result=4;
                    168: 	}
                    169:     }
1.11      www       170: 
1.182     albertel  171: # ---------------------------------------------------------- fifth, check user
1.11      www       172: 
1.71      albertel  173:     if (defined($uname)) {
                    174: 	if (defined($useropt{$courselevel})) {
1.43      albertel  175: 	    $outpar[3]=$useropt{$courselevel};
                    176: 	    $result=3;
                    177: 	}
1.10      www       178: 
1.71      albertel  179: 	if (defined($useropt{$courselevelm})) {
1.43      albertel  180: 	    $outpar[2]=$useropt{$courselevelm};
                    181: 	    $result=2;
                    182: 	}
1.2       www       183: 
1.71      albertel  184: 	if (defined($useropt{$courselevelr})) {
1.43      albertel  185: 	    $outpar[1]=$useropt{$courselevelr};
                    186: 	    $result=1;
                    187: 	}
                    188:     }
1.44      albertel  189:     return ($result,@outpar);
1.2       www       190: }
                    191: 
1.186     www       192: 
                    193: ##################################################
                    194: ##################################################
                    195: #
                    196: # Store a parameter
                    197: #
                    198: # Takes
                    199: # - resource id
                    200: # - name of parameter
                    201: # - level
                    202: # - new value
                    203: # - new type
1.187     www       204: # - username
                    205: # - userdomain
                    206: 
1.186     www       207: sub storeparm {
1.187     www       208:     my ($sresid,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec)=@_;
1.186     www       209:     $spnam=~s/\_([^\_]+)$/\.$1/;
                    210: # ---------------------------------------------------------- Construct prefixes
                    211:     
                    212:     my $symbparm=$symbp{$sresid}.'.'.$spnam;
                    213:     my $mapparm=$mapp{$sresid}.'___(all).'.$spnam;
                    214:     
1.190     albertel  215:     my $seclevel=$env{'request.course.id'}.'.['.$csec.'].'.$spnam;
                    216:     my $seclevelr=$env{'request.course.id'}.'.['.$csec.'].'.$symbparm;
                    217:     my $seclevelm=$env{'request.course.id'}.'.['.$csec.'].'.$mapparm;
1.186     www       218:     
1.190     albertel  219:     my $courselevel=$env{'request.course.id'}.'.'.$spnam;
                    220:     my $courselevelr=$env{'request.course.id'}.'.'.$symbparm;
                    221:     my $courselevelm=$env{'request.course.id'}.'.'.$mapparm;
1.186     www       222:     
                    223:     my $storeunder='';
                    224:     if (($snum==11) || ($snum==3)) { $storeunder=$courselevel; }
                    225:     if (($snum==10) || ($snum==2)) { $storeunder=$courselevelm; }
                    226:     if (($snum==7) || ($snum==1)) { $storeunder=$courselevelr; }
                    227:     if ($snum==6) { $storeunder=$seclevel; }
                    228:     if ($snum==5) { $storeunder=$seclevelm; }
                    229:     if ($snum==4) { $storeunder=$seclevelr; }
                    230:     
                    231:     my $delete;
                    232:     if ($nval eq '') { $delete=1;}
                    233:     my %storecontent = ($storeunder         => $nval,
                    234: 			$storeunder.'.type' => $ntype);
                    235:     my $reply='';
                    236:     if ($snum>3) {
                    237: # ---------------------------------------------------------------- Store Course
                    238: #
                    239: # Expire sheets
                    240: 	&Apache::lonnet::expirespread('','','studentcalc');
                    241: 	if (($snum==7) || ($snum==4)) {
                    242: 	    &Apache::lonnet::expirespread('','','assesscalc',$symbp{$sresid});
                    243: 	} elsif (($snum==8) || ($snum==5)) {
                    244: 	    &Apache::lonnet::expirespread('','','assesscalc',$mapp{$sresid});
                    245: 	} else {
                    246: 	    &Apache::lonnet::expirespread('','','assesscalc');
                    247: 	}
                    248: # Store parameter
                    249: 	if ($delete) {
                    250: 	    $reply=&Apache::lonnet::del
                    251: 		('resourcedata',[keys(%storecontent)],
1.190     albertel  252: 		 $env{'course.'.$env{'request.course.id'}.'.domain'},
                    253: 		 $env{'course.'.$env{'request.course.id'}.'.num'});
1.186     www       254: 	} else {
                    255: 	    $reply=&Apache::lonnet::cput
                    256: 		('resourcedata',\%storecontent,
1.190     albertel  257: 		 $env{'course.'.$env{'request.course.id'}.'.domain'},
                    258: 		 $env{'course.'.$env{'request.course.id'}.'.num'});
1.186     www       259: 	}
                    260:     } else {
                    261: # ------------------------------------------------------------------ Store User
                    262: #
                    263: # Expire sheets
                    264: 	&Apache::lonnet::expirespread($uname,$udom,'studentcalc');
                    265: 	if ($snum==1) {
                    266: 	    &Apache::lonnet::expirespread
                    267: 		($uname,$udom,'assesscalc',$symbp{$sresid});
                    268: 	} elsif ($snum==2) {
                    269: 	    &Apache::lonnet::expirespread
                    270: 		($uname,$udom,'assesscalc',$mapp{$sresid});
                    271: 	} else {
                    272: 	    &Apache::lonnet::expirespread($uname,$udom,'assesscalc');
                    273: 	}
                    274: # Store parameter
                    275: 	if ($delete) {
                    276: 	    $reply=&Apache::lonnet::del
                    277: 		('resourcedata',[keys(%storecontent)],$udom,$uname);
                    278: 	} else {
                    279: 	    $reply=&Apache::lonnet::cput
                    280: 		('resourcedata',\%storecontent,$udom,$uname);
                    281: 	}
1.191     albertel  282: 	&Apache::lonnet::devalidateuserresdata($uname,$udom);
1.186     www       283:     }
                    284:     
                    285:     if ($reply=~/^error\:(.*)/) {
                    286: 	return "<font color=red>Write Error: $1</font>";
                    287:     }
                    288:     return '';
                    289: }
                    290: 
1.59      matthew   291: ##################################################
                    292: ##################################################
                    293: 
                    294: =pod
                    295: 
                    296: =item valout
                    297: 
                    298: Format a value for output.
                    299: 
                    300: Inputs:  $value, $type
                    301: 
                    302: Returns: $value, formatted for output.  If $type indicates it is a date,
                    303: localtime($value) is returned.
1.9       www       304: 
1.59      matthew   305: =cut
                    306: 
                    307: ##################################################
                    308: ##################################################
1.9       www       309: sub valout {
                    310:     my ($value,$type)=@_;
1.59      matthew   311:     my $result = '';
                    312:     # Values of zero are valid.
                    313:     if (! $value && $value ne '0') {
1.71      albertel  314: 	$result = '&nbsp;&nbsp;';
1.59      matthew   315:     } else {
1.66      www       316:         if ($type eq 'date_interval') {
                    317:             my ($sec,$min,$hour,$mday,$mon,$year)=gmtime($value);
                    318:             $year=$year-70;
                    319:             $mday--;
                    320:             if ($year) {
                    321: 		$result.=$year.' yrs ';
                    322:             }
                    323:             if ($mon) {
                    324: 		$result.=$mon.' mths ';
                    325:             }
                    326:             if ($mday) {
                    327: 		$result.=$mday.' days ';
                    328:             }
                    329:             if ($hour) {
                    330: 		$result.=$hour.' hrs ';
                    331:             }
                    332:             if ($min) {
                    333: 		$result.=$min.' mins ';
                    334:             }
                    335:             if ($sec) {
                    336: 		$result.=$sec.' secs ';
                    337:             }
                    338:             $result=~s/\s+$//;
                    339:         } elsif ($type=~/^date/) {
1.59      matthew   340:             $result = localtime($value);
                    341:         } else {
                    342:             $result = $value;
                    343:         }
                    344:     }
                    345:     return $result;
1.9       www       346: }
                    347: 
1.59      matthew   348: ##################################################
                    349: ##################################################
                    350: 
                    351: =pod
1.5       www       352: 
1.59      matthew   353: =item plink
                    354: 
                    355: Produces a link anchor.
                    356: 
                    357: Inputs: $type,$dis,$value,$marker,$return,$call
                    358: 
                    359: Returns: scalar with html code for a link which will envoke the 
                    360: javascript function 'pjump'.
                    361: 
                    362: =cut
                    363: 
                    364: ##################################################
                    365: ##################################################
1.5       www       366: sub plink {
                    367:     my ($type,$dis,$value,$marker,$return,$call)=@_;
1.23      www       368:     my $winvalue=$value;
                    369:     unless ($winvalue) {
                    370: 	if ($type=~/^date/) {
1.190     albertel  371:             $winvalue=$env{'form.recent_'.$type};
1.23      www       372:         } else {
1.190     albertel  373:             $winvalue=$env{'form.recent_'.(split(/\_/,$type))[0]};
1.23      www       374:         }
                    375:     }
                    376:     return 
1.43      albertel  377: 	'<a href="javascript:pjump('."'".$type."','".$dis."','".$winvalue."','"
                    378: 	    .$marker."','".$return."','".$call."'".');">'.
                    379: 		&valout($value,$type).'</a><a name="'.$marker.'"></a>';
1.5       www       380: }
                    381: 
1.44      albertel  382: 
                    383: sub startpage {
1.137     albertel  384:     my ($r,$id,$udom,$csec,$uname,$have_assesments,$trimheader)=@_;
1.99      albertel  385: 
1.120     www       386:     my $bodytag=&Apache::loncommon::bodytag('Set/Modify Course Parameters','',
1.98      www       387:                                             'onUnload="pclose()"');
1.194     albertel  388:     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs(undef,'Table');
1.81      www       389:     my $chooseopt=&Apache::loncommon::select_dom_form($udom,'udom').' '.
                    390:         &Apache::loncommon::selectstudent_link('parmform','uname','udom');
                    391:     my $selscript=&Apache::loncommon::studentbrowser_javascript();
1.88      matthew   392:     my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition();
1.133     www       393:     my %lt=&Apache::lonlocal::texthash(
                    394: 		    'cep'   => "Course Environment Parameters",
                    395: 		    'scep'  => "Set Course Environment Parameters",
                    396: 		    'smcap' => "Set/Modify Course Assessment Parameter",
                    397: 		    'mcap'  => "Modify Course Assessment Parameters",
                    398: 		    'caphm' => "Course Assessment Parameter - Helper Mode",
                    399: 		    'capom' => "Course Assessment Parameters - Overview Mode",
                    400:                     'captm' => "Course Assessments Parameters - Table Mode",
                    401: 		    'sg'    => "Section/Group",
                    402: 		    'fu'    => "For User",
                    403: 		    'oi'    => "or ID",
                    404: 		    'ad'    => "at Domain"
                    405: 				       );
1.148     www       406:     my $overallhelp=
1.166     albertel  407: 	&Apache::loncommon::help_open_menu('','Setting Parameters','Course_Setting_Parameters','',10,'Instructor Interface');
1.146     www       408:     my $assessparmhelp=&Apache::loncommon::help_open_topic("Cascading_Parameters","Assessment Parameters");
1.183     albertel  409:     my $html=&Apache::lonxml::xmlbegin();
1.44      albertel  410:     $r->print(<<ENDHEAD);
1.183     albertel  411: $html
1.44      albertel  412: <head>
                    413: <title>LON-CAPA Course Parameters</title>
                    414: <script>
                    415: 
                    416:     function pclose() {
                    417:         parmwin=window.open("/adm/rat/empty.html","LONCAPAparms",
                    418:                  "height=350,width=350,scrollbars=no,menubar=no");
                    419:         parmwin.close();
                    420:     }
                    421: 
1.88      matthew   422:     $pjump_def
1.44      albertel  423: 
                    424:     function psub() {
                    425:         pclose();
                    426:         if (document.parmform.pres_marker.value!='') {
                    427:             document.parmform.action+='#'+document.parmform.pres_marker.value;
                    428:             var typedef=new Array();
                    429:             typedef=document.parmform.pres_type.value.split('_');
                    430:            if (document.parmform.pres_type.value!='') {
                    431:             if (typedef[0]=='date') {
                    432:                 eval('document.parmform.recent_'+
                    433:                      document.parmform.pres_type.value+
                    434: 		     '.value=document.parmform.pres_value.value;');
                    435:             } else {
                    436:                 eval('document.parmform.recent_'+typedef[0]+
                    437: 		     '.value=document.parmform.pres_value.value;');
                    438:             }
                    439: 	   }
                    440:             document.parmform.submit();
                    441:         } else {
                    442:             document.parmform.pres_value.value='';
                    443:             document.parmform.pres_marker.value='';
                    444:         }
                    445:     }
                    446: 
1.57      albertel  447:     function openWindow(url, wdwName, w, h, toolbar,scrollbar) {
                    448:         var options = "width=" + w + ",height=" + h + ",";
                    449:         options += "resizable=yes,scrollbars="+scrollbar+",status=no,";
                    450:         options += "menubar=no,toolbar="+toolbar+",location=no,directories=no";
                    451:         var newWin = window.open(url, wdwName, options);
                    452:         newWin.focus();
                    453:     }
1.44      albertel  454: </script>
1.81      www       455: $selscript
1.44      albertel  456: </head>
1.64      www       457: $bodytag
1.193     albertel  458: $breadcrumbs
1.166     albertel  459: $overallhelp
1.137     albertel  460: ENDHEAD
1.91      bowersj2  461: 
1.137     albertel  462:     unless ($trimheader) {$r->print(<<ENDHEAD2);
1.44      albertel  463: <form method="post" action="/adm/parmset" name="envform">
1.133     www       464: <h4>$lt{'cep'}</h4>
                    465: <input type="submit" name="crsenv" value="$lt{'scep'}" />
1.120     www       466: </form>
                    467: <hr />
1.146     www       468: $assessparmhelp
1.120     www       469: <form method="post" action="/adm/helper/parameter.helper" name="helpform">
1.133     www       470: <h4>$lt{'caphm'}</h4>
                    471: <input type="submit" value="$lt{'smcap'}" />
1.120     www       472: </form>
                    473: <hr />
                    474: <form method="post" action="/adm/parmset" name="overview">
1.133     www       475: <h4>$lt{'capom'}</h4>
                    476: <input type="submit" name="overview" value="$lt{'mcap'}" />
1.44      albertel  477: </form>
1.101     www       478: <hr />
1.137     albertel  479: ENDHEAD2
1.189     www       480:     }
                    481:     my %sectionhash=();
                    482:     my $sections='';
                    483:     if (&Apache::loncommon::get_sections(
1.190     albertel  484:                  $env{'course.'.$env{'request.course.id'}.'.domain'},
                    485:                  $env{'course.'.$env{'request.course.id'}.'.num'},
1.189     www       486: 					 \%sectionhash)) {
                    487:         $sections=$lt{'sg'}.': <select name="csec">';
                    488: 	foreach ('',sort keys %sectionhash) {
                    489: 	    $sections.='<option value="'.$_.'"'.
                    490: 		($_ eq $csec?'selected="selected"':'').'>'.$_.'</option>';
                    491:         }
                    492:         $sections.='</select>';
                    493:      }
                    494:      $r->print(<<ENDHEAD3);
1.193     albertel  495: <form method="post" action="/adm/parmset?action=settable" name="parmform">
1.133     www       496: <h4>$lt{'captm'}</h4>
1.137     albertel  497: ENDHEAD3
1.99      albertel  498: 
                    499:     if (!$have_assesments) {
1.133     www       500: 	$r->print('<font color="red">'.&mt('There are no assesment parameters in this course to set.').'</font><br />');	
1.99      albertel  501:     } else {
                    502: 	$r->print(<<ENDHEAD);
1.44      albertel  503: <b>
1.189     www       504: $sections
1.188     www       505: <br />
1.133     www       506: $lt{'fu'} 
1.188     www       507: <input type="text" value="$uname" size="12" name="uname" />
1.133     www       508: $lt{'oi'}
1.188     www       509: <input type="text" value="$id" size="12" name="id" /> 
1.133     www       510: $lt{'ad'}
1.81      www       511: $chooseopt
1.44      albertel  512: </b>
                    513: <input type="hidden" value='' name="pres_value">
                    514: <input type="hidden" value='' name="pres_type">
                    515: <input type="hidden" value='' name="pres_marker">
                    516: ENDHEAD
1.99      albertel  517:     }
1.44      albertel  518: }
                    519: 
                    520: sub print_row {
1.66      www       521:     my ($r,$which,$part,$name,$rid,$default,$defaulttype,$display,$defbgone,
1.187     www       522: 	$defbgtwo,$parmlev,$uname,$udom,$csec)=@_;
1.66      www       523: # get the values for the parameter in cascading order
                    524: # empty levels will remain empty
1.44      albertel  525:     my ($result,@outpar)=&parmval($$part{$which}.'.'.$$name{$which},
1.187     www       526: 				  $rid,$$default{$which},$uname,$udom,$csec);
1.66      www       527: # get the type for the parameters
                    528: # problem: these may not be set for all levels
                    529:     my ($typeresult,@typeoutpar)=&parmval($$part{$which}.'.'.
                    530:                                           $$name{$which}.'.type',
1.187     www       531: 				  $rid,$$defaulttype{$which},$uname,$udom,$csec);
1.66      www       532: # cascade down manually
1.182     albertel  533:     my $cascadetype=$$defaulttype{$which};
                    534:     for (my $i=11;$i>0;$i--) {
1.66      www       535: 	 if ($typeoutpar[$i]) { 
                    536:             $cascadetype=$typeoutpar[$i];
                    537: 	} else {
                    538:             $typeoutpar[$i]=$cascadetype;
                    539:         }
                    540:     }
1.57      albertel  541:     my $parm=$$display{$which};
                    542: 
                    543:     if ($parmlev eq 'full' || $parmlev eq 'brief') {
                    544:         $r->print('<td bgcolor='.$defbgtwo.' align="center">'
                    545:                   .$$part{$which}.'</td>');
                    546:     } else {    
                    547:         $parm=~s|\[.*\]\s||g;
                    548:     }
                    549: 
1.159     albertel  550:     $r->print('<td bgcolor='.$defbgone.'>'.$parm.'</td>');
1.57      albertel  551:    
1.44      albertel  552:     my $thismarker=$which;
                    553:     $thismarker=~s/^parameter\_//;
                    554:     my $mprefix=$rid.'&'.$thismarker.'&';
                    555: 
1.57      albertel  556:     if ($parmlev eq 'general') {
                    557: 
                    558:         if ($uname) {
1.66      www       559:             &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57      albertel  560:         } elsif ($csec) {
1.66      www       561:             &print_td($r,6,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); 
1.57      albertel  562:         } else {
1.182     albertel  563:             &print_td($r,11,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); 
1.57      albertel  564:         }
                    565:     } elsif ($parmlev eq 'map') {
                    566: 
                    567:         if ($uname) {
1.66      www       568:             &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57      albertel  569:         } elsif ($csec) {
1.66      www       570:             &print_td($r,5,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57      albertel  571:         } else {
1.182     albertel  572:             &print_td($r,10,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57      albertel  573:         }
                    574:     } else {
                    575: 
1.182     albertel  576:         &print_td($r,11,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57      albertel  577: 
                    578:         if ($parmlev eq 'brief') {
                    579: 
1.66      www       580:            &print_td($r,7,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57      albertel  581: 
                    582:            if ($csec) {
1.66      www       583:                &print_td($r,4,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57      albertel  584:            }
                    585:            if ($uname) {
1.66      www       586:                &print_td($r,1,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57      albertel  587:            }
                    588:         } else {
                    589: 
1.182     albertel  590:            &print_td($r,10,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    591:            &print_td($r,9,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    592:            &print_td($r,8,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.66      www       593:            &print_td($r,7,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57      albertel  594: 
                    595:            if ($csec) {
1.66      www       596:                &print_td($r,6,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    597:                &print_td($r,5,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    598:                &print_td($r,4,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57      albertel  599:            }
                    600:            if ($uname) {
1.66      www       601:                &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    602:                &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                    603:                &print_td($r,1,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57      albertel  604:            }
                    605:         } # end of $brief if/else
                    606:     } # end of $parmlev if/else
                    607: 
1.136     albertel  608:     $r->print('<td bgcolor=#CCCCFF align="center">'.
                    609:                   &valout($outpar[$result],$typeoutpar[$result]).'</td>');
                    610: 
1.57      albertel  611:     if ($parmlev eq 'full' || $parmlev eq 'brief') {
1.136     albertel  612:         my $sessionval=&Apache::lonnet::EXT('resource.'.$$part{$which}.
1.57      albertel  613:                                         '.'.$$name{$which},$symbp{$rid});
1.136     albertel  614: 
1.70      albertel  615: # this doesn't seem to work, and I don't think is correct
                    616: #    my $sessionvaltype=&Apache::lonnet::EXT('resource.'.$$part{$which}.
                    617: #                                      '.'.$$name{$which}.'.type',$symbp{$rid});
                    618: # this seems to work
1.136     albertel  619:         my $sessionvaltype=$typeoutpar[$result];
                    620:         if (!defined($sessionvaltype)) { $sessionvaltype=$$defaulttype{$which}; }
                    621:         $r->print('<td bgcolor=#999999 align="center"><font color=#FFFFFF>'.
1.66      www       622:                   &valout($sessionval,$sessionvaltype).'&nbsp;'.
1.57      albertel  623:                   '</font></td>');
1.136     albertel  624:     }
1.44      albertel  625:     $r->print('</tr>');
1.57      albertel  626:     $r->print("\n");
1.44      albertel  627: }
1.59      matthew   628: 
1.44      albertel  629: sub print_td {
1.66      www       630:     my ($r,$which,$defbg,$result,$outpar,$mprefix,$value,$typeoutpar,$display)=@_;
1.57      albertel  631:     $r->print('<td bgcolor='.(($result==$which)?'"#AAFFAA"':$defbg).
1.114     www       632:               ' align="center">');
1.182     albertel  633:     if ($which<8 || $which > 9) {
1.114     www       634: 	$r->print(&plink($$typeoutpar[$which],
                    635: 			 $$display{$value},$$outpar[$which],
                    636: 			 $mprefix."$which",'parmform.pres','psub'));
                    637:     } else {
                    638: 	$r->print(&valout($$outpar[$which],$$typeoutpar[$which]));
                    639:     }
                    640:     $r->print('</td>'."\n");
1.57      albertel  641: }
                    642: 
1.63      bowersj2  643: =pod
                    644: 
                    645: =item B<extractResourceInformation>: Given the course data hash, extractResourceInformation extracts lots of information about the course's resources into a variety of hashes.
                    646: 
                    647: Input: See list below:
                    648: 
                    649: =over 4
                    650: 
                    651: =item B<ids>: An array that will contain all of the ids in the course.
                    652: 
                    653: =item B<typep>: hash, id->type, where "type" contains the extension of the file, thus, I<problem exam quiz assess survey form>.
                    654: 
1.171     www       655: =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  656: 
                    657: =item B<allparms>: hash, name of parameter->display value (what is the display value?)
                    658: 
                    659: =item B<allparts>: hash, part identification->text representation of part, where the text representation is "[Part $part]"
                    660: 
                    661: =item B<allkeys>: hash, full key to part->display value (what's display value?)
                    662: 
                    663: =item B<allmaps>: hash, ???
                    664: 
                    665: =item B<fcat>: ???
                    666: 
                    667: =item B<defp>: hash, ???
                    668: 
                    669: =item B<mapp>: ??
                    670: 
                    671: =item B<symbp>: hash, id->full sym?
                    672: 
                    673: =back
                    674: 
                    675: =cut
                    676: 
                    677: sub extractResourceInformation {
                    678:     my $ids = shift;
                    679:     my $typep = shift;
                    680:     my $keyp = shift;
                    681:     my $allparms = shift;
                    682:     my $allparts = shift;
                    683:     my $allkeys = shift;
                    684:     my $allmaps = shift;
                    685:     my $fcat = shift;
                    686:     my $defp = shift;
                    687:     my $mapp = shift;
                    688:     my $symbp = shift;
1.82      www       689:     my $maptitles=shift;
1.196   ! www       690:     my $uris=shift;
        !           691: 
1.63      bowersj2  692: 
1.196   ! www       693:     my $navmap = Apache::lonnavmaps::navmap->new();
        !           694:     my @allres=$navmap->retrieveResources(undef,undef,1,undef,1);
        !           695:     foreach my $resource (@allres) {
        !           696: 	my $id=$resource->id();
        !           697:         my ($mapid,$resid)=split(/\./,$id);
        !           698: 	if ($mapid eq '0') { next; }
        !           699: 	$$ids[$#$ids+1]=$id;
        !           700: 	my $srcf=$resource->src();
        !           701: 	$srcf=~/\.(\w+)$/;
        !           702: 	$$typep{$id}=$1;
        !           703: 	$$keyp{$id}='';
        !           704:         $$uris{$id}=$srcf;
        !           705: 	foreach (split(/\,/,&Apache::lonnet::metadata($srcf,'allpossiblekeys'))) {
        !           706: 	    if ($_=~/^parameter\_(.*)/) {
        !           707: 		my $key=$_;
        !           708: 		my $allkey=$1;
        !           709: 		$allkey=~s/\_/\./g;
        !           710: 		if (&Apache::lonnet::metadata($srcf,$key.'.hidden') eq 
        !           711: 		    'parm') {
        !           712: 		    next; #hide hidden things
1.63      bowersj2  713: 		}
1.196   ! www       714: 		my $display= &Apache::lonnet::metadata($srcf,$key.'.display');
        !           715: 		my $name=&Apache::lonnet::metadata($srcf,$key.'.name');
        !           716: 		my $part= &Apache::lonnet::metadata($srcf,$key.'.part');
        !           717: 		my $parmdis = $display;
        !           718: 		$parmdis =~ s|(\[Part.*)$||g;
        !           719: 		my $partkey = $part;
        !           720: 		$partkey =~ tr|_|.|;
        !           721: 		$$allparms{$name} = $parmdis;
        !           722: 		$$allparts{$part} = "[Part $part]";
        !           723: 		$$allkeys{$allkey}=$display;
        !           724: 		if ($allkey eq $fcat) {
        !           725: 		    $$defp{$id}= &Apache::lonnet::metadata($srcf,$key);
        !           726: 		}
        !           727: 		if ($$keyp{$id}) {
        !           728: 		    $$keyp{$id}.=','.$key;
1.175     albertel  729: 		} else {
1.196   ! www       730: 		    $$keyp{$id}=$key;
1.175     albertel  731: 		}
1.63      bowersj2  732: 	    }
                    733: 	}
1.196   ! www       734: 	$$mapp{$id}=
        !           735: 	    &Apache::lonnet::declutter($resource->enclosing_map_src());
        !           736: 	$$mapp{$mapid}=$$mapp{$id};
        !           737: 	$$allmaps{$mapid}=$$mapp{$id};
        !           738: 	if ($mapid eq '1') {
        !           739: 	    $$maptitles{$mapid}='Main Course Documents';
        !           740: 	} else {
        !           741: 	    $$maptitles{$mapid}=&Apache::lonnet::gettitle(&Apache::lonnet::clutter($$mapp{$id}));
        !           742: 	}
        !           743: 	$$maptitles{$$mapp{$id}}=$$maptitles{$mapid};
        !           744: 	$$symbp{$id}=&Apache::lonnet::encode_symb($$mapp{$id},$resid,$srcf);
        !           745: 	$$symbp{$mapid}=$$mapp{$id}.'___(all)';
1.63      bowersj2  746:     }
                    747: }
                    748: 
1.59      matthew   749: ##################################################
                    750: ##################################################
                    751: 
                    752: =pod
                    753: 
                    754: =item assessparms
                    755: 
                    756: Show assessment data and parameters.  This is a large routine that should
                    757: be simplified and shortened... someday.
                    758: 
                    759: Inputs: $r
                    760: 
                    761: Returns: nothing
                    762: 
1.63      bowersj2  763: Variables used (guessed by Jeremy):
                    764: 
                    765: =over 4
                    766: 
                    767: =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.
                    768: 
                    769: =item B<psprt>: ParameterS PaRTs? a list of the parts of a problem that we are displaying? Used to display only selected parts?
                    770: 
                    771: =item B<allmaps>:
                    772: 
                    773: =back
                    774: 
1.59      matthew   775: =cut
                    776: 
                    777: ##################################################
                    778: ##################################################
1.30      www       779: sub assessparms {
1.1       www       780: 
1.43      albertel  781:     my $r=shift;
1.2       www       782: # -------------------------------------------------------- Variable declaration
1.129     www       783:     my %allkeys=();
                    784:     my %allmaps=();
                    785:     my %alllevs=();
1.57      albertel  786: 
1.187     www       787:     my $uname;
                    788:     my $udom;
                    789:     my $uhome;
                    790:     my $csec;
                    791:  
1.190     albertel  792:     my $coursename=$env{'course.'.$env{'request.course.id'}.'.description'};
1.187     www       793: 
1.57      albertel  794:     $alllevs{'Resource Level'}='full';
                    795:     $alllevs{'Map Level'}='map';
                    796:     $alllevs{'Course Level'}='general';
                    797: 
                    798:     my %allparms;
                    799:     my %allparts;
                    800: 
1.43      albertel  801:     my %defp;
                    802:     %courseopt=();
                    803:     %useropt=();
                    804: 
                    805:     @ids=();
                    806:     %symbp=();
                    807:     %typep=();
                    808: 
                    809:     my $message='';
                    810: 
1.190     albertel  811:     $csec=$env{'form.csec'};
1.188     www       812: 
1.190     albertel  813:     if      ($udom=$env{'form.udom'}) {
                    814:     } elsif ($udom=$env{'request.role.domain'}) {
                    815:     } elsif ($udom=$env{'user.domain'}) {
1.172     albertel  816:     } else {
                    817: 	$udom=$r->dir_config('lonDefDomain');
                    818:     }
1.43      albertel  819: 
1.134     albertel  820:     my @pscat=&Apache::loncommon::get_env_multiple('form.pscat');
1.190     albertel  821:     my $pschp=$env{'form.pschp'};
1.134     albertel  822:     my @psprt=&Apache::loncommon::get_env_multiple('form.psprt');
1.76      www       823:     if (!@psprt) { $psprt[0]='0'; }
1.190     albertel  824:     my $showoptions=$env{'form.showoptions'};
1.57      albertel  825: 
1.43      albertel  826:     my $pssymb='';
1.57      albertel  827:     my $parmlev='';
1.137     albertel  828:     my $trimheader='';
1.190     albertel  829:     my $prevvisit=$env{'form.prevvisit'};
1.57      albertel  830:  
1.190     albertel  831:     unless ($env{'form.parmlev'}) {
1.57      albertel  832:         $parmlev = 'map';
                    833:     } else {
1.190     albertel  834:         $parmlev = $env{'form.parmlev'};
1.57      albertel  835:     }
1.26      www       836: 
1.29      www       837: # ----------------------------------------------- Was this started from grades?
                    838: 
1.190     albertel  839:     if (($env{'form.command'} eq 'set') && ($env{'form.url'})
                    840: 	&& (!$env{'form.dis'})) {
                    841: 	my $url=$env{'form.url'};
1.194     albertel  842: 	$url=~s-^http://($ENV{'SERVER_NAME'}|$ENV{'HTTP_HOST'})--;
1.43      albertel  843: 	$pssymb=&Apache::lonnet::symbread($url);
1.92      albertel  844: 	if (!@pscat) { @pscat=('all'); }
1.43      albertel  845: 	$pschp='';
1.57      albertel  846:         $parmlev = 'full';
1.137     albertel  847:         $trimheader='yes';
1.190     albertel  848:     } elsif ($env{'form.symb'}) {
                    849: 	$pssymb=$env{'form.symb'};
1.92      albertel  850: 	if (!@pscat) { @pscat=('all'); }
1.43      albertel  851: 	$pschp='';
1.57      albertel  852:         $parmlev = 'full';
1.137     albertel  853:         $trimheader='yes';
1.43      albertel  854:     } else {
1.190     albertel  855: 	$env{'form.url'}='';
1.43      albertel  856:     }
                    857: 
1.190     albertel  858:     my $id=$env{'form.id'};
1.43      albertel  859:     if (($id) && ($udom)) {
                    860: 	$uname=(&Apache::lonnet::idget($udom,$id))[1];
                    861: 	if ($uname) {
                    862: 	    $id='';
                    863: 	} else {
                    864: 	    $message=
1.133     www       865: 		"<font color=red>".&mt("Unknown ID")." '$id' ".
                    866: 		&mt('at domain')." '$udom'</font>";
1.43      albertel  867: 	}
                    868:     } else {
1.190     albertel  869: 	$uname=$env{'form.uname'};
1.43      albertel  870:     }
                    871:     unless ($udom) { $uname=''; }
                    872:     $uhome='';
                    873:     if ($uname) {
                    874: 	$uhome=&Apache::lonnet::homeserver($uname,$udom);
                    875:         if ($uhome eq 'no_host') {
                    876: 	    $message=
1.133     www       877: 		"<font color=red>".&mt("Unknown user")." '$uname' ".
                    878: 		&mt("at domain")." '$udom'</font>";
1.43      albertel  879: 	    $uname='';
1.12      www       880:         } else {
1.103     albertel  881: 	    $csec=&Apache::lonnet::getsection($udom,$uname,
1.190     albertel  882: 					      $env{'request.course.id'});
1.43      albertel  883: 	    if ($csec eq '-1') {
                    884: 		$message="<font color=red>".
1.133     www       885: 		    &mt("User")." '$uname' ".&mt("at domain")." '$udom' ".
                    886: 		    &mt("not in this course")."</font>";
1.43      albertel  887: 		$uname='';
1.190     albertel  888: 		$csec=$env{'form.csec'};
1.43      albertel  889: 	    } else {
                    890: 		my %name=&Apache::lonnet::userenvironment($udom,$uname,
                    891: 		      ('firstname','middlename','lastname','generation','id'));
1.133     www       892: 		$message="\n<p>\n".&mt("Full Name").": ".
1.43      albertel  893: 		    $name{'firstname'}.' '.$name{'middlename'}.' '
                    894: 			.$name{'lastname'}.' '.$name{'generation'}.
1.133     www       895: 			    "<br>\n".&mt('ID').": ".$name{'id'}.'<p>';
1.43      albertel  896: 	    }
1.12      www       897:         }
1.43      albertel  898:     }
1.2       www       899: 
1.43      albertel  900:     unless ($csec) { $csec=''; }
1.12      www       901: 
1.190     albertel  902:     my $fcat=$env{'form.fcat'};
1.43      albertel  903:     unless ($fcat) { $fcat=''; }
1.2       www       904: 
                    905: # ------------------------------------------------------------------- Tie hashs
1.196   ! www       906: 
1.44      albertel  907:     if (!(tie(%parmhash,'GDBM_File',
1.190     albertel  908: 	      $env{'request.course.fn'}.'_parms.db',&GDBM_READER(),0640))) {
                    909: 	$r->print("Unable to access parameter data. (File $env{'request.course.fn'}_parms.db not tieable)");
1.44      albertel  910: 	return ;
                    911:     }
1.63      bowersj2  912: 
1.14      www       913: # --------------------------------------------------------- Get all assessments
1.196   ! www       914:     &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allkeys, \%allmaps, $fcat, \%defp, \%mapp, \%symbp,\%maptitles,\%uris);
1.63      bowersj2  915: 
1.57      albertel  916:     $mapp{'0.0'} = '';
                    917:     $symbp{'0.0'} = '';
1.99      albertel  918: 
1.14      www       919: # ---------------------------------------------------------- Anything to store?
1.190     albertel  920:     if ($env{'form.pres_marker'}) {
                    921: 	$message.=&storeparm(split(/\&/,$env{'form.pres_marker'}),
                    922: 			     $env{'form.pres_value'},
                    923: 			     $env{'form.pres_type'},
1.187     www       924:                              $uname,$udom,$csec);
1.68      www       925: # ---------------------------------------------------------------- Done storing
1.130     www       926: 	$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       927:     }
1.67      www       928: # --------------------------------------------- Devalidate cache for this child
1.109     albertel  929:     &Apache::lonnet::devalidatecourseresdata(
1.190     albertel  930:                  $env{'course.'.$env{'request.course.id'}.'.num'},
                    931:                  $env{'course.'.$env{'request.course.id'}.'.domain'});
1.191     albertel  932:     #&Apache::lonnet::clear_EXT_cache_status();
1.2       www       933: # -------------------------------------------------------------- Get coursedata
1.45      matthew   934:     %courseopt = &Apache::lonnet::dump
                    935:         ('resourcedata',
1.190     albertel  936:          $env{'course.'.$env{'request.course.id'}.'.domain'},
                    937:          $env{'course.'.$env{'request.course.id'}.'.num'});
1.44      albertel  938: # --------------------------------------------------- Get userdata (if present)
                    939:     if ($uname) {
1.45      matthew   940:         %useropt=&Apache::lonnet::dump('resourcedata',$udom,$uname);
1.44      albertel  941:     }
1.14      www       942: 
1.2       www       943: # ------------------------------------------------------------------- Sort this
1.17      www       944: 
1.44      albertel  945:     @ids=sort  {
                    946: 	if ($fcat eq '') {
                    947: 	    $a<=>$b;
                    948: 	} else {
1.187     www       949: 	    my ($result,@outpar)=&parmval($fcat,$a,$defp{$a},$uname,$udom,$csec);
1.44      albertel  950: 	    my $aparm=$outpar[$result];
1.187     www       951: 	    ($result,@outpar)=&parmval($fcat,$b,$defp{$b},$uname,$udom,$csec);
1.44      albertel  952: 	    my $bparm=$outpar[$result];
                    953: 	    1*$aparm<=>1*$bparm;
                    954: 	}
                    955:     } @ids;
1.57      albertel  956: #----------------------------------------------- if all selected, fill in array
                    957:     if ($pscat[0] eq "all" || !@pscat) {@pscat = (keys %allparms);}
                    958:     if ($psprt[0] eq "all" || !@psprt) {@psprt = (keys %allparts);}
1.2       www       959: # ------------------------------------------------------------------ Start page
1.63      bowersj2  960: 
1.99      albertel  961:     my $have_assesments=1;
                    962:     if (scalar(keys(%allkeys)) eq 0) { $have_assesments=0; }
                    963: 
1.193     albertel  964:     $trimheader = 'yes';
1.137     albertel  965:     &startpage($r,$id,$udom,$csec,$uname,$have_assesments,$trimheader);
1.99      albertel  966: 
1.112     albertel  967:     if (!$have_assesments) {
                    968: 	untie(%parmhash);
                    969: 	return '';
                    970:     }
1.190     albertel  971: #    if ($env{'form.url'}) {
                    972: #	$r->print('<input type="hidden" value="'.$env{'form.url'}.
1.44      albertel  973: #		  '" name="url"><input type="hidden" name="command" value="set">');
                    974: #    }
1.57      albertel  975:     $r->print('<input type="hidden" value="true" name="prevvisit">');
                    976: 
1.44      albertel  977:     foreach ('tolerance','date_default','date_start','date_end',
                    978: 	     'date_interval','int','float','string') {
                    979: 	$r->print('<input type="hidden" value="'.
1.190     albertel  980: 		  $env{'form.recent_'.$_}.'" name="recent_'.$_.'">');
1.44      albertel  981:     }
                    982: 
1.57      albertel  983:     $r->print('<h2>'.$message.'</h2><table>');
                    984:                         
1.130     www       985:     my $submitmessage = &mt('Update Section or Specific User');
1.44      albertel  986:     if (!$pssymb) {
1.160     www       987:         $r->print('<tr><td>'.&mt('Select Parameter Level').
                    988:        &Apache::loncommon::help_open_topic('Course_Parameter_Levels').
                    989: 		  '</td><td colspan="2">');
1.57      albertel  990:         $r->print('<select name="parmlev">');
                    991:         foreach (reverse sort keys %alllevs) {
                    992:             $r->print('<option value="'.$alllevs{$_}.'"');
                    993:             if ($parmlev eq $alllevs{$_}) {
                    994:                $r->print(' selected'); 
                    995:             }
                    996:             $r->print('>'.$_.'</option>');
                    997:         }
                    998:         $r->print("</select></td>\n");
                    999: 
1.101     www      1000:         $r->print('</tr>');
1.128     albertel 1001: 	if ($parmlev ne 'general') {
1.130     www      1002: 	    $r->print('<tr><td>'.&mt('Select Enclosing Map or Folder').'</td>');
1.128     albertel 1003: 	    $r->print('<td colspan="2"><select name="pschp">');
1.130     www      1004: 	    $r->print('<option value="all">'.&mt('All Maps or Folders').'</option>');
1.128     albertel 1005: 	    foreach (sort {$allmaps{$a} cmp $allmaps{$b}} keys %allmaps) {
                   1006: 		$r->print('<option value="'.$_.'"');
                   1007: 		if (($pschp eq $_)) { $r->print(' selected'); }
                   1008: 		$r->print('>'.$maptitles{$_}.($allmaps{$_}!~/^uploaded/?'  ['.$allmaps{$_}.']':'').'</option>');
                   1009: 	    }
                   1010: 	    $r->print("</select></td></tr>\n");
                   1011: 	}
1.44      albertel 1012:     } else {
1.125     www      1013:         my ($map,$id,$resource)=&Apache::lonnet::decode_symb($pssymb);
1.130     www      1014:         $r->print("<tr><td>".&mt('Specific Resource')."</td><td>$resource</td>");
1.57      albertel 1015:         $r->print('<td><input type="submit" name="dis" value="'.$submitmessage.'"></td>');
                   1016:         $r->print('</tr>');
                   1017:         $r->print('<input type="hidden" value="'.$pssymb.'" name="symb">');
                   1018:     }
                   1019: 
1.185     albertel 1020:     $r->print('<tr><td colspan="3"><hr /><label><input type="checkbox"');
1.57      albertel 1021:     if ($showoptions eq 'show') {$r->print(" checked ");}
1.185     albertel 1022:     $r->print(' name="showoptions" value="show" />'.&mt('Show More Options').'</label><hr /></td></tr>');
1.57      albertel 1023: #    $r->print("<tr><td>Show: $showoptions</td></tr>");
                   1024: #    $r->print("<tr><td>pscat: @pscat</td></tr>");
                   1025: #    $r->print("<tr><td>psprt: @psprt</td></tr>");
                   1026: #    $r->print("<tr><td>fcat:  $fcat</td></tr>");
                   1027: 
                   1028:     if ($showoptions eq 'show') {
                   1029:         my $tempkey;
                   1030: 
1.130     www      1031:         $r->print('<tr><td colspan="3" align="center">'.&mt('Select Parameters to View').'</td></tr>');
1.57      albertel 1032: 
1.176     albertel 1033:         $r->print('<tr><td colspan="2"><table><tr>');
1.57      albertel 1034:         my $cnt=0;
                   1035:         foreach $tempkey (sort { $allparms{$a} cmp $allparms{$b} }
                   1036:                       keys %allparms ) {
                   1037:             ++$cnt;
1.176     albertel 1038:             $r->print('</tr><tr>') if ($cnt%2);
1.57      albertel 1039:             $r->print('<td><input type="checkbox" name="pscat" ');
                   1040:             $r->print('value="'.$tempkey.'"');
                   1041:             if ($pscat[0] eq "all" || grep $_ eq $tempkey, @pscat) {
                   1042:                 $r->print(' checked');
                   1043:             }
1.176     albertel 1044: 	    $r->print('>'.$allparms{$tempkey}.'</td>');
                   1045: 	}
                   1046: 	$r->print('
                   1047: </tr><tr><td>
                   1048: <script type="text/javascript">
                   1049:     function checkall(value, checkName) {
                   1050: 	for (i=0; i<document.forms.parmform.elements.length; i++) {
                   1051:             ele = document.forms.parmform.elements[i];
                   1052:             if (ele.name == checkName) {
                   1053:                 document.forms.parmform.elements[i].checked=value;
                   1054:             }
1.57      albertel 1055:         }
1.176     albertel 1056:     }
                   1057: </script>
                   1058: <input type="button" onclick="checkall(true, \'pscat\')" value="Select All" />
                   1059: </td><td>
                   1060: <input type="button" onclick="checkall(false, \'pscat\')" value="Unselect All" />
                   1061: </td>
                   1062: ');
1.57      albertel 1063:         $r->print('</tr></table>');
                   1064: 
                   1065: #        $r->print('<tr><td>Select Parts</td><td>');
                   1066:         $r->print('<td><select multiple name="psprt" size="5">');
                   1067:         $r->print('<option value="all"');
                   1068:         $r->print(' selected') unless (@psprt);
1.130     www      1069:         $r->print('>'.&mt('All Parts').'</option>');
1.76      www      1070:         my %temphash=();
                   1071:         foreach (@psprt) { $temphash{$_}=1; }
1.57      albertel 1072:         foreach $tempkey (sort keys %allparts) {
                   1073:             unless ($tempkey =~ /\./) {
                   1074:                 $r->print('<option value="'.$tempkey.'"');
1.76      www      1075:                 if ($psprt[0] eq "all" ||  $temphash{$tempkey}) {
1.57      albertel 1076:                     $r->print(' selected');
                   1077:                 }
                   1078:                 $r->print('>'.$allparts{$tempkey}.'</option>');
                   1079:             }
                   1080:         }
                   1081:         $r->print('</select></td></tr><tr><td colspan="3"><hr /></td></tr>');
                   1082: 
1.130     www      1083:         $r->print('<tr><td>'.&mt('Sort list by').'</td><td>');
1.57      albertel 1084:         $r->print('<select name="fcat">');
1.130     www      1085:         $r->print('<option value="">'.&mt('Enclosing Map or Folder').'</option>');
1.57      albertel 1086:         foreach (sort keys %allkeys) {
                   1087:             $r->print('<option value="'.$_.'"');
                   1088:             if ($fcat eq $_) { $r->print(' selected'); }
                   1089:             $r->print('>'.$allkeys{$_}.'</option>');
                   1090:         }
                   1091:         $r->print('</select></td>');
                   1092: 
                   1093:         $r->print('</tr><tr><td colspan="3"><hr /></td></tr>');
                   1094: 
                   1095:     } else { # hide options - include any necessary extras here
                   1096: 
                   1097:         $r->print('<input type="hidden" name="fcat" value="'.$fcat.'">'."\n");
                   1098: 
                   1099:         unless (@pscat) {
                   1100:           foreach (keys %allparms ) {
                   1101:             $r->print('<input type="hidden" name="pscat" value="'.$_.'">'."\n");
                   1102:           }
                   1103:         } else {
                   1104:           foreach (@pscat) {
                   1105:             $r->print('<input type="hidden" name="pscat" value="'.$_.'">'."\n");
                   1106:           }
                   1107:         }
                   1108: 
                   1109:         unless (@psprt) {
                   1110:           foreach (keys %allparts ) {
                   1111:             $r->print('<input type="hidden" name="psprt" value="'.$_.'">'."\n");
                   1112:           }
                   1113:         } else {
                   1114:           foreach (@psprt) {
                   1115:             $r->print('<input type="hidden" name="psprt" value="'.$_.'">'."\n");
                   1116:           }
                   1117:         }
                   1118: 
1.44      albertel 1119:     }
1.101     www      1120:     $r->print('</table><br />');
                   1121:     if (($prevvisit) || ($pschp) || ($pssymb)) {
1.130     www      1122:         $submitmessage = &mt("Update Course Assessment Parameter Display");
1.101     www      1123:     } else {
1.130     www      1124:         $submitmessage = &mt("Set/Modify Course Assessment Parameters");
1.101     www      1125:     }
                   1126:     $r->print('<input type="submit" name="dis" value="'.$submitmessage.'">');
1.57      albertel 1127: 
1.76      www      1128: #    my @temp_psprt;
                   1129: #    foreach my $t (@psprt) {
                   1130: #	push(@temp_psprt, grep {eval (/^$t\./ || ($_ == $t))} (keys %allparts));
                   1131: #    }
1.57      albertel 1132: 
1.76      www      1133: #    @psprt = @temp_psprt;
1.57      albertel 1134: 
                   1135:     my @temp_pscat;
                   1136:     map {
                   1137:         my $cat = $_;
                   1138:         push(@temp_pscat, map { $_.'.'.$cat } @psprt);
                   1139:     } @pscat;
                   1140: 
                   1141:     @pscat = @temp_pscat;
                   1142: 
                   1143:     if (($prevvisit) || ($pschp) || ($pssymb)) {
1.10      www      1144: # ----------------------------------------------------------------- Start Table
1.57      albertel 1145:         my @catmarker=map { tr|.|_|; 'parameter_'.$_; } @pscat;
1.190     albertel 1146:         my $csuname=$env{'user.name'};
                   1147:         my $csudom=$env{'user.domain'};
1.57      albertel 1148: 
                   1149:         if ($parmlev eq 'full' || $parmlev eq 'brief') {
                   1150:            my $coursespan=$csec?8:5;
                   1151:            $r->print('<p><table border=2>');
                   1152:            $r->print('<tr><td colspan=5></td>');
1.130     www      1153:            $r->print('<th colspan='.($coursespan).'>'.&mt('Any User').'</th>');
1.57      albertel 1154:            if ($uname) {
                   1155:                $r->print("<th colspan=3 rowspan=2>");
1.130     www      1156:                $r->print(&mt("User")." $uname ".&mt('at Domain')." $udom</th>");
1.57      albertel 1157:            }
1.133     www      1158: 	   my %lt=&Apache::lonlocal::texthash(
                   1159: 				  'pie'    => "Parameter in Effect",
                   1160: 				  'csv'    => "Current Session Value",
                   1161:                                   'at'     => 'at',
                   1162:                                   'rl'     => "Resource Level",
                   1163: 				  'ic'     => 'in Course',
                   1164: 				  'aut'    => "Assessment URL and Title",
1.143     albertel 1165: 				  'type'   => 'Type',
1.133     www      1166: 				  'emof'   => "Enclosing Map or Folder",
1.143     albertel 1167: 				  'part'   => 'Part',
1.133     www      1168:                                   'pn'     => 'Parameter Name',
                   1169: 				  'def'    => 'default',
                   1170: 				  'femof'  => 'from Enclosing Map or Folder',
                   1171: 				  'gen'    => 'general',
                   1172: 				  'foremf' => 'for Enclosing Map or Folder',
                   1173: 				  'fr'     => 'for Resource'
                   1174: 					      );
1.57      albertel 1175:            $r->print(<<ENDTABLETWO);
1.133     www      1176: <th rowspan=3>$lt{'pie'}</th>
                   1177: <th rowspan=3>$lt{'csv'}<br>($csuname $lt{'at'} $csudom)</th>
1.182     albertel 1178: </tr><tr><td colspan=5></td><th colspan=2>$lt{'ic'}</th><th colspan=2>$lt{'rl'}</th>
                   1179: <th colspan=1>$lt{'ic'}</th>
                   1180: 
1.10      www      1181: ENDTABLETWO
1.57      albertel 1182:            if ($csec) {
1.133     www      1183:                 $r->print("<th colspan=3>".
                   1184: 			  &mt("in Section/Group")." $csec</th>");
1.57      albertel 1185:            }
                   1186:            $r->print(<<ENDTABLEHEADFOUR);
1.133     www      1187: </tr><tr><th>$lt{'aut'}</th><th>$lt{'type'}</th>
                   1188: <th>$lt{'emof'}</th><th>$lt{'part'}</th><th>$lt{'pn'}</th>
1.192     albertel 1189: <th>$lt{'gen'}</th><th>$lt{'foremf'}</th>
                   1190: <th>$lt{'def'}</th><th>$lt{'femof'}</th><th>$lt{'fr'}</th>
1.10      www      1191: ENDTABLEHEADFOUR
1.57      albertel 1192: 
                   1193:            if ($csec) {
1.130     www      1194:                $r->print('<th>'.&mt('general').'</th><th>'.&mt('for Enclosing Map or Folder').'</th><th>'.&mt('for Resource').'</th>');
1.57      albertel 1195:            }
                   1196: 
                   1197:            if ($uname) {
1.130     www      1198:                $r->print('<th>'.&mt('general').'</th><th>'.&mt('for Enclosing Map or Folder').'</th><th>'.&mt('for Resource').'</th>');
1.57      albertel 1199:            }
                   1200: 
                   1201:            $r->print('</tr>');
                   1202: 
                   1203:            my $defbgone='';
                   1204:            my $defbgtwo='';
                   1205: 
                   1206:            foreach (@ids) {
                   1207: 
                   1208:                 my $rid=$_;
                   1209:                 my ($inmapid)=($rid=~/\.(\d+)$/);
                   1210: 
1.152     albertel 1211:                 if ((!$pssymb && 
                   1212: 		     (($pschp eq 'all') || ($allmaps{$pschp} eq $mapp{$rid})))
                   1213: 		    ||
                   1214: 		    ($pssymb && $pssymb eq $symbp{$rid})) {
1.4       www      1215: # ------------------------------------------------------ Entry for one resource
1.184     albertel 1216:                     if ($defbgone eq '"#E0E099"') {
                   1217:                         $defbgone='"#E0E0DD"';
1.57      albertel 1218:                     } else {
1.184     albertel 1219:                         $defbgone='"#E0E099"';
1.57      albertel 1220:                     }
1.184     albertel 1221:                     if ($defbgtwo eq '"#FFFF99"') {
                   1222:                         $defbgtwo='"#FFFFDD"';
1.57      albertel 1223:                     } else {
1.184     albertel 1224:                         $defbgtwo='"#FFFF99"';
1.57      albertel 1225:                     }
                   1226:                     my $thistitle='';
                   1227:                     my %name=   ();
                   1228:                     undef %name;
                   1229:                     my %part=   ();
                   1230:                     my %display=();
                   1231:                     my %type=   ();
                   1232:                     my %default=();
1.196   ! www      1233:                     my $uri=&Apache::lonnet::declutter($uris{$rid});
1.57      albertel 1234: 
                   1235:                     foreach (split(/\,/,$keyp{$rid})) {
                   1236:                         my $tempkeyp = $_;
                   1237:                         if (grep $_ eq $tempkeyp, @catmarker) {
                   1238:                           $part{$_}=&Apache::lonnet::metadata($uri,$_.'.part');
                   1239:                           $name{$_}=&Apache::lonnet::metadata($uri,$_.'.name');
                   1240:                           $display{$_}=&Apache::lonnet::metadata($uri,$_.'.display');
                   1241:                           unless ($display{$_}) { $display{$_}=''; }
                   1242:                           $display{$_}.=' ('.$name{$_}.')';
                   1243:                           $default{$_}=&Apache::lonnet::metadata($uri,$_);
                   1244:                           $type{$_}=&Apache::lonnet::metadata($uri,$_.'.type');
                   1245:                           $thistitle=&Apache::lonnet::metadata($uri,$_.'.title');
                   1246:                         }
                   1247:                     }
                   1248:                     my $totalparms=scalar keys %name;
                   1249:                     if ($totalparms>0) {
                   1250:                         my $firstrow=1;
1.180     albertel 1251: 			my $title=&Apache::lonnet::gettitle($uri);
1.57      albertel 1252:                         $r->print('<tr><td bgcolor='.$defbgone.
                   1253:                              ' rowspan='.$totalparms.
                   1254:                              '><tt><font size=-1>'.
                   1255:                              join(' / ',split(/\//,$uri)).
                   1256:                              '</font></tt><p><b>'.
1.154     albertel 1257:                              "<a href=\"javascript:openWindow('".
                   1258: 				  &Apache::lonnet::clutter($uri).
1.57      albertel 1259:                              "', 'metadatafile', '450', '500', 'no', 'yes')\";".
1.127     albertel 1260:                              " TARGET=_self>$title");
1.57      albertel 1261: 
                   1262:                         if ($thistitle) {
                   1263:                             $r->print(' ('.$thistitle.')');
                   1264:                         }
                   1265:                         $r->print('</a></b></td>');
                   1266:                         $r->print('<td bgcolor='.$defbgtwo.
                   1267:                                       ' rowspan='.$totalparms.'>'.$typep{$rid}.
                   1268:                                       '</td>');
                   1269: 
                   1270:                         $r->print('<td bgcolor='.$defbgone.
                   1271:                                       ' rowspan='.$totalparms.
                   1272:                                       '><tt><font size=-1>');
                   1273: 
                   1274:                         $r->print(' / res / ');
                   1275:                         $r->print(join(' / ', split(/\//,$mapp{$rid})));
                   1276: 
                   1277:                         $r->print('</font></tt></td>');
                   1278: 
                   1279:                         foreach (sort keys %name) {
                   1280:                             unless ($firstrow) {
                   1281:                                 $r->print('<tr>');
                   1282:                             } else {
                   1283:                                 undef $firstrow;
                   1284:                             }
                   1285: 
                   1286:                             &print_row($r,$_,\%part,\%name,$rid,\%default,
                   1287:                                        \%type,\%display,$defbgone,$defbgtwo,
1.187     www      1288:                                        $parmlev,$uname,$udom,$csec);
1.57      albertel 1289:                         }
                   1290:                     }
                   1291:                 }
                   1292:             } # end foreach ids
1.43      albertel 1293: # -------------------------------------------------- End entry for one resource
1.57      albertel 1294:             $r->print('</table>');
                   1295:         } # end of  brief/full
                   1296: #--------------------------------------------------- Entry for parm level map
                   1297:         if ($parmlev eq 'map') {
                   1298:             my $defbgone = '"E0E099"';
                   1299:             my $defbgtwo = '"FFFF99"';
                   1300: 
                   1301:             my %maplist;
                   1302: 
                   1303:             if ($pschp eq 'all') {
                   1304:                 %maplist = %allmaps; 
                   1305:             } else {
                   1306:                 %maplist = ($pschp => $mapp{$pschp});
                   1307:             }
                   1308: 
                   1309: #-------------------------------------------- for each map, gather information
                   1310:             my $mapid;
1.60      albertel 1311: 	    foreach $mapid (sort {$maplist{$a} cmp $maplist{$b}} keys %maplist) {
                   1312:                 my $maptitle = $maplist{$mapid};
1.57      albertel 1313: 
                   1314: #-----------------------  loop through ids and get all parameter types for map
                   1315: #-----------------------------------------          and associated information
                   1316:                 my %name = ();
                   1317:                 my %part = ();
                   1318:                 my %display = ();
                   1319:                 my %type = ();
                   1320:                 my %default = ();
                   1321:                 my $map = 0;
                   1322: 
                   1323: #		$r->print("Catmarker: @catmarker<br />\n");
                   1324:                
                   1325:                 foreach (@ids) {
                   1326:                   ($map)=(/([\d]*?)\./);
                   1327:                   my $rid = $_;
                   1328:         
                   1329: #                  $r->print("$mapid:$map:   $rid <br /> \n");
                   1330: 
                   1331:                   if ($map eq $mapid) {
1.196   ! www      1332:                     my $uri=&Apache::lonnet::declutter($uris{$rid});
1.57      albertel 1333: #                    $r->print("Keys: $keyp{$rid} <br />\n");
                   1334: 
                   1335: #--------------------------------------------------------------------
                   1336: # @catmarker contains list of all possible parameters including part #s
                   1337: # $fullkeyp contains the full part/id # for the extraction of proper parameters
                   1338: # $tempkeyp contains part 0 only (no ids - ie, subparts)
                   1339: # When storing information, store as part 0
                   1340: # When requesting information, request from full part
                   1341: #-------------------------------------------------------------------
                   1342:                     foreach (split(/\,/,$keyp{$rid})) {
                   1343:                       my $tempkeyp = $_;
                   1344:                       my $fullkeyp = $tempkeyp;
1.73      albertel 1345:                       $tempkeyp =~ s/_\w+_/_0_/;
1.57      albertel 1346:                       
                   1347:                       if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {
                   1348:                         $part{$tempkeyp}="0";
                   1349:                         $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name');
                   1350:                         $display{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');
                   1351:                         unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; }
                   1352:                         $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')';
1.73      albertel 1353:                         $display{$tempkeyp} =~ s/_\w+_/_0_/;
1.57      albertel 1354:                         $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp);
                   1355:                         $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.type');
                   1356:                       }
                   1357:                     } # end loop through keys
                   1358:                   }
                   1359:                 } # end loop through ids
                   1360:                                  
                   1361: #---------------------------------------------------- print header information
1.133     www      1362:                 my $foldermap=&mt($maptitle=~/^uploaded/?'Folder':'Map');
1.82      www      1363:                 my $showtitle=$maptitles{$maptitle}.($maptitle!~/^uploaded/?' ['.$maptitle.']':'');
1.57      albertel 1364:                 $r->print(<<ENDMAPONE);
                   1365: <center><h4>
1.135     albertel 1366: Set Defaults for All Resources in $foldermap<br />
                   1367: <font color="red"><i>$showtitle</i></font><br />
1.57      albertel 1368: Specifically for
                   1369: ENDMAPONE
                   1370:                 if ($uname) {
                   1371:                     my %name=&Apache::lonnet::userenvironment($udom,$uname,
                   1372:                       ('firstname','middlename','lastname','generation', 'id'));
                   1373:                     my $person=$name{'firstname'}.' '.$name{'middlename'}.' '
                   1374:                            .$name{'lastname'}.' '.$name{'generation'};
1.135     albertel 1375:                     $r->print(&mt("User")." <font color=\"red\"><i>$uname \($person\) </i></font> ".
1.130     www      1376:                         &mt('in')." \n");
1.57      albertel 1377:                 } else {
1.135     albertel 1378:                     $r->print("<font color=\"red\"><i>".&mt('all').'</i></font> '.&mt('users in')." \n");
1.57      albertel 1379:                 }
                   1380:             
1.135     albertel 1381:                 if ($csec) {$r->print(&mt("Section")." <font color=\"red\"><i>$csec</i></font> ".
1.130     www      1382: 				      &mt('of')." \n")};
1.57      albertel 1383: 
1.135     albertel 1384:                 $r->print("<font color=\"red\"><i>$coursename</i></font><br />");
                   1385:                 $r->print("</h4>\n");
1.57      albertel 1386: #---------------------------------------------------------------- print table
                   1387:                 $r->print('<p><table border="2">');
1.130     www      1388:                 $r->print('<tr><th>'.&mt('Parameter Name').'</th>');
                   1389:                 $r->print('<th>'.&mt('Default Value').'</th>');
                   1390:                 $r->print('<th>'.&mt('Parameter in Effect').'</th></tr>');
1.57      albertel 1391: 
                   1392: 	        foreach (sort keys %name) {
1.168     matthew  1393:                     $r->print('<tr>');
1.57      albertel 1394:                     &print_row($r,$_,\%part,\%name,$mapid,\%default,
                   1395:                            \%type,\%display,$defbgone,$defbgtwo,
1.187     www      1396:                            $parmlev,$uname,$udom,$csec);
1.57      albertel 1397: #                    $r->print("<tr><td>resource.$part{$_}.$name{$_},$symbp{$mapid}</td></tr>\n");
                   1398:                 }
                   1399:                 $r->print("</table></center>");
                   1400:             } # end each map
                   1401:         } # end of $parmlev eq map
                   1402: #--------------------------------- Entry for parm level general (Course level)
                   1403:         if ($parmlev eq 'general') {
                   1404:             my $defbgone = '"E0E099"';
                   1405:             my $defbgtwo = '"FFFF99"';
                   1406: 
                   1407: #-------------------------------------------- for each map, gather information
                   1408:             my $mapid="0.0";
                   1409: #-----------------------  loop through ids and get all parameter types for map
                   1410: #-----------------------------------------          and associated information
                   1411:             my %name = ();
                   1412:             my %part = ();
                   1413:             my %display = ();
                   1414:             my %type = ();
                   1415:             my %default = ();
                   1416:                
                   1417:             foreach (@ids) {
                   1418:                 my $rid = $_;
                   1419:         
1.196   ! www      1420:                 my $uri=&Apache::lonnet::declutter($uris{$rid});
1.57      albertel 1421: 
                   1422: #--------------------------------------------------------------------
                   1423: # @catmarker contains list of all possible parameters including part #s
                   1424: # $fullkeyp contains the full part/id # for the extraction of proper parameters
                   1425: # $tempkeyp contains part 0 only (no ids - ie, subparts)
                   1426: # When storing information, store as part 0
                   1427: # When requesting information, request from full part
                   1428: #-------------------------------------------------------------------
                   1429:                 foreach (split(/\,/,$keyp{$rid})) {
                   1430:                   my $tempkeyp = $_;
                   1431:                   my $fullkeyp = $tempkeyp;
1.73      albertel 1432:                   $tempkeyp =~ s/_\w+_/_0_/;
1.57      albertel 1433:                   if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {
                   1434:                     $part{$tempkeyp}="0";
                   1435:                     $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name');
                   1436:                     $display{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');
                   1437:                     unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; }
                   1438:                     $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')';
1.73      albertel 1439:                     $display{$tempkeyp} =~ s/_\w+_/_0_/;
1.57      albertel 1440:                     $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp);
                   1441:                     $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.type');
                   1442:                   }
                   1443:                 } # end loop through keys
                   1444:             } # end loop through ids
                   1445:                                  
                   1446: #---------------------------------------------------- print header information
1.133     www      1447: 	    my $setdef=&mt("Set Defaults for All Resources in Course");
1.57      albertel 1448:             $r->print(<<ENDMAPONE);
1.133     www      1449: <center><h4>$setdef
1.135     albertel 1450: <font color="red"><i>$coursename</i></font><br />
1.57      albertel 1451: ENDMAPONE
                   1452:             if ($uname) {
                   1453:                 my %name=&Apache::lonnet::userenvironment($udom,$uname,
                   1454:                   ('firstname','middlename','lastname','generation', 'id'));
                   1455:                 my $person=$name{'firstname'}.' '.$name{'middlename'}.' '
                   1456:                        .$name{'lastname'}.' '.$name{'generation'};
1.135     albertel 1457:                 $r->print(" ".&mt("User")."<font color=\"red\"> <i>$uname \($person\) </i></font> \n");
1.57      albertel 1458:             } else {
1.135     albertel 1459:                 $r->print("<i><font color=\"red\"> ".&mt("ALL")."</i> ".&mt("USERS")."</font> \n");
1.57      albertel 1460:             }
                   1461:             
1.135     albertel 1462:             if ($csec) {$r->print(&mt("Section")."<font color=\"red\"> <i>$csec</i></font>\n")};
                   1463:             $r->print("</h4>\n");
1.57      albertel 1464: #---------------------------------------------------------------- print table
                   1465:             $r->print('<p><table border="2">');
1.130     www      1466:             $r->print('<tr><th>'.&mt('Parameter Name').'</th>');
                   1467:             $r->print('<th>'.&mt('Default Value').'</th>');
                   1468:             $r->print('<th>'.&mt('Parameter in Effect').'</th></tr>');
1.57      albertel 1469: 
                   1470: 	    foreach (sort keys %name) {
1.168     matthew  1471:                 $r->print('<tr>');
1.57      albertel 1472:                 &print_row($r,$_,\%part,\%name,$mapid,\%default,
1.187     www      1473:                        \%type,\%display,$defbgone,$defbgtwo,$parmlev,$uname,$udom,$csec);
1.57      albertel 1474: #                    $r->print("<tr><td>resource.$part{$_}.$name{$_},$symbp{$mapid}</td></tr>\n");
                   1475:             }
                   1476:             $r->print("</table></center>");
                   1477:         } # end of $parmlev eq general
1.43      albertel 1478:     }
1.44      albertel 1479:     $r->print('</form></body></html>');
                   1480:     untie(%parmhash);
1.57      albertel 1481: } # end sub assessparms
1.30      www      1482: 
1.59      matthew  1483: 
                   1484: ##################################################
                   1485: ##################################################
                   1486: 
                   1487: =pod
                   1488: 
                   1489: =item crsenv
                   1490: 
1.105     matthew  1491: Show and set course data and parameters.  This is a large routine that should
1.59      matthew  1492: be simplified and shortened... someday.
                   1493: 
                   1494: Inputs: $r
                   1495: 
                   1496: Returns: nothing
                   1497: 
                   1498: =cut
                   1499: 
                   1500: ##################################################
                   1501: ##################################################
1.30      www      1502: sub crsenv {
                   1503:     my $r=shift;
                   1504:     my $setoutput='';
1.64      www      1505:     my $bodytag=&Apache::loncommon::bodytag(
                   1506:                              'Set Course Environment Parameters');
1.194     albertel 1507:     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs(undef,
                   1508: 						    'Edit Course Environment');
1.190     albertel 1509:     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   1510:     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.105     matthew  1511: 
                   1512:     #
                   1513:     # Go through list of changes
1.190     albertel 1514:     foreach (keys %env) {
1.105     matthew  1515:         next if ($_!~/^form\.(.+)\_setparmval$/);
                   1516:         my $name  = $1;
1.190     albertel 1517:         my $value = $env{'form.'.$name.'_value'};
1.105     matthew  1518:         if ($name eq 'newp') {
1.190     albertel 1519:             $name = $env{'form.newp_name'};
1.105     matthew  1520:         }
                   1521:         if ($name eq 'url') {
                   1522:             $value=~s/^\/res\///;
                   1523:             my $bkuptime=time;
                   1524:             my @tmp = &Apache::lonnet::get
                   1525:                 ('environment',['url'],$dom,$crs);
1.130     www      1526:             $setoutput.=&mt('Backing up previous URL').': '.
1.105     matthew  1527:                 &Apache::lonnet::put
                   1528:                 ('environment',
                   1529:                  {'top level map backup '.$bkuptime => $tmp[1] },
                   1530:                  $dom,$crs).
                   1531:                      '<br>';
                   1532:         }
                   1533:         #
                   1534:         # Deal with modified default spreadsheets
                   1535:         if ($name =~ /^spreadsheet_default_(classcalc|
                   1536:                                             studentcalc|
                   1537:                                             assesscalc)$/x) {
                   1538:             my $sheettype = $1; 
                   1539:             if ($sheettype eq 'classcalc') {
                   1540:                 # no need to do anything since viewing the sheet will
                   1541:                 # cause it to be updated. 
                   1542:             } elsif ($sheettype eq 'studentcalc') {
                   1543:                 # expire all the student spreadsheets
                   1544:                 &Apache::lonnet::expirespread('','','studentcalc');
                   1545:             } else {
                   1546:                 # expire all the assessment spreadsheets 
                   1547:                 #    this includes non-default spreadsheets, but better to
                   1548:                 #    be safe than sorry.
                   1549:                 &Apache::lonnet::expirespread('','','assesscalc');
                   1550:                 # expire all the student spreadsheets
                   1551:                 &Apache::lonnet::expirespread('','','studentcalc');
1.30      www      1552:             }
1.105     matthew  1553:         }
                   1554:         #
1.107     matthew  1555:         # Deal with the enrollment dates
                   1556:         if ($name =~ /^default_enrollment_(start|end)_date$/) {
                   1557:             $value=&Apache::lonhtmlcommon::get_date_from_form($name.'_value');
                   1558:         }
1.178     raeburn  1559:         # Get existing cloners
                   1560:         my @oldcloner = ();
                   1561:         if ($name eq 'cloners') {
                   1562:             my %clonenames=&Apache::lonnet::dump('environment',$dom,$crs,'cloners');
                   1563:             if ($clonenames{'cloners'} =~ /,/) {
                   1564:                 @oldcloner = split/,/,$clonenames{'cloners'};
                   1565:             } else {
                   1566:                 $oldcloner[0] = $clonenames{'cloners'};
                   1567:             }
                   1568:         }
1.107     matthew  1569:         #
1.105     matthew  1570:         # Let the user know we made the changes
1.153     albertel 1571:         if ($name && defined($value)) {
1.178     raeburn  1572:             if ($name eq 'cloners') {
                   1573:                 $value =~ s/^,//;
                   1574:                 $value =~ s/,$//;
                   1575:             }
1.105     matthew  1576:             my $put_result = &Apache::lonnet::put('environment',
                   1577:                                                   {$name=>$value},$dom,$crs);
                   1578:             if ($put_result eq 'ok') {
1.130     www      1579:                 $setoutput.=&mt('Set').' <b>'.$name.'</b> '.&mt('to').' <b>'.$value.'</b>.<br />';
1.178     raeburn  1580:                 if ($name eq 'cloners') {
                   1581:                     &change_clone($value,\@oldcloner);
                   1582:                 }
1.179     raeburn  1583:                 # Flush the course logs so course description is immediately updated
                   1584:                 if ($name eq 'description' && defined($value)) {
                   1585:                     &Apache::lonnet::flushcourselogs();
                   1586:                 }
1.105     matthew  1587:             } else {
1.130     www      1588:                 $setoutput.=&mt('Unable to set').' <b>'.$name.'</b> '.&mt('to').
                   1589: 		    ' <b>'.$value.'</b> '.&mt('due to').' '.$put_result.'.<br />';
1.30      www      1590:             }
                   1591:         }
1.38      harris41 1592:     }
1.108     www      1593: # ------------------------- Re-init course environment entries for this session
                   1594: 
1.190     albertel 1595:     &Apache::lonnet::coursedescription($env{'request.course.id'});
1.105     matthew  1596: 
1.30      www      1597: # -------------------------------------------------------- Get parameters again
1.45      matthew  1598: 
                   1599:     my %values=&Apache::lonnet::dump('environment',$dom,$crs);
1.140     sakharuk 1600:     my $SelectStyleFile=&mt('Select Style File');
1.141     sakharuk 1601:     my $SelectSpreadsheetFile=&mt('Select Spreadsheet File');
1.30      www      1602:     my $output='';
1.45      matthew  1603:     if (! exists($values{'con_lost'})) {
1.30      www      1604:         my %descriptions=
1.140     sakharuk 1605: 	    ('url'            => '<b>'.&mt('Top Level Map').'</b> '.
1.46      matthew  1606:                                  '<a href="javascript:openbrowser'.
1.47      matthew  1607:                                  "('envform','url','sequence')\">".
1.140     sakharuk 1608:                                  &mt('Select Map').'</a><br /><font color=red> '.
                   1609:                                  &mt('Modification may make assessment data inaccessible').
                   1610:                                  '</font>',
                   1611:              'description'    => '<b>'.&mt('Course Description').'</b>',
1.158     sakharuk 1612:              'courseid'       => '<b>'.&mt('Course ID or number').
1.140     sakharuk 1613:                                  '</b><br />'.
                   1614:                                  '('.&mt('internal').', '.&mt('optional').')',
1.177     raeburn  1615:              '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      1616:              'grading'        => '<b>'.&mt('Grading').'</b><br />'.
                   1617:                                  '<tt>"standard", "external", or "spreadsheet"</tt> '.&Apache::loncommon::help_open_topic('GradingOptions'),
1.140     sakharuk 1618:              'default_xml_style' => '<b>'.&mt('Default XML Style File').'</b> '.
1.52      www      1619:                     '<a href="javascript:openbrowser'.
                   1620:                     "('envform','default_xml_style'".
1.140     sakharuk 1621:                     ",'sty')\">$SelectStyleFile</a><br>",
1.141     sakharuk 1622:              'question.email' => '<b>'.&mt('Feedback Addresses for Resource Content Question').
                   1623:                                  '</b><br />(<tt>user:domain,'.
1.74      www      1624:                                  'user:domain(section;section;...;*;...),...</tt>)',
1.141     sakharuk 1625:              'comment.email'  => '<b>'.&mt('Feedback Addresses for Course Content Comments').'</b><br />'.
1.74      www      1626:                                  '(<tt>user:domain,user:domain(section;section;...;*;...),...</tt>)',
1.141     sakharuk 1627:              'policy.email'   => '<b>'.&mt('Feedback Addresses for Course Policy').'</b>'.
1.75      albertel 1628:                                  '<br />(<tt>user:domain,user:domain(section;section;...;*;...),...</tt>)',
1.141     sakharuk 1629:              'hideemptyrows'  => '<b>'.&mt('Hide Empty Rows in Spreadsheets').'</b><br />'.
1.158     sakharuk 1630:                                  '('.&mt('"[_1]" for default hiding','<tt>yes</tt>').')',
1.141     sakharuk 1631:              'pageseparators'  => '<b>'.&mt('Visibly Separate Items on Pages').'</b><br />'.
1.158     sakharuk 1632:                                  '('.&mt('"[_1]" for visible separation','<tt>yes</tt>').', '.
1.141     sakharuk 1633:                                  &mt('changes will not show until next login').')',
1.169     matthew  1634:              '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  1635: 
1.141     sakharuk 1636:              'plc.roles.denied'=> '<b>'.&mt('Disallow live chatroom use for Roles').
                   1637:                                   '</b><br />"<tt>st</tt>": '.
1.158     sakharuk 1638:                                   &mt('student').', "<tt>ta</tt>": '.
1.118     matthew  1639:                                   'TA, "<tt>in</tt>": '.
1.158     sakharuk 1640:                                   &mt('instructor').';<br /><tt>'.&mt('role,role,...').'</tt>) '.
1.118     matthew  1641: 	       Apache::loncommon::help_open_topic("Course_Disable_Discussion"),
                   1642:              'plc.users.denied' => 
1.141     sakharuk 1643:                           '<b>'.&mt('Disallow live chatroom use for Users').'</b><br />'.
1.118     matthew  1644:                                  '(<tt>user:domain,user:domain,...</tt>)',
                   1645: 
1.141     sakharuk 1646:              'pch.roles.denied'=> '<b>'.&mt('Disallow Resource Discussion for Roles').
                   1647:                                   '</b><br />"<tt>st</tt>": '.
1.61      albertel 1648:                                   'student, "<tt>ta</tt>": '.
                   1649:                                   'TA, "<tt>in</tt>": '.
1.75      albertel 1650:                                   'instructor;<br /><tt>role,role,...</tt>) '.
1.61      albertel 1651: 	       Apache::loncommon::help_open_topic("Course_Disable_Discussion"),
1.53      www      1652:              'pch.users.denied' => 
1.141     sakharuk 1653:                           '<b>'.&mt('Disallow Resource Discussion for Users').'</b><br />'.
1.53      www      1654:                                  '(<tt>user:domain,user:domain,...</tt>)',
1.49      matthew  1655:              'spreadsheet_default_classcalc' 
1.141     sakharuk 1656:                  => '<b>'.&mt('Default Course Spreadsheet').'</b> '.
1.50      matthew  1657:                     '<a href="javascript:openbrowser'.
                   1658:                     "('envform','spreadsheet_default_classcalc'".
1.141     sakharuk 1659:                     ",'spreadsheet')\">$SelectSpreadsheetFile</a><br />",
1.49      matthew  1660:              'spreadsheet_default_studentcalc' 
1.141     sakharuk 1661:                  => '<b>'.&mt('Default Student Spreadsheet').'</b> '.
1.50      matthew  1662:                     '<a href="javascript:openbrowser'.
                   1663:                     "('envform','spreadsheet_default_calc'".
1.141     sakharuk 1664:                     ",'spreadsheet')\">$SelectSpreadsheetFile</a><br />",
1.49      matthew  1665:              'spreadsheet_default_assesscalc' 
1.141     sakharuk 1666:                  => '<b>'.&mt('Default Assessment Spreadsheet').'</b> '.
1.50      matthew  1667:                     '<a href="javascript:openbrowser'.
                   1668:                     "('envform','spreadsheet_default_assesscalc'".
1.141     sakharuk 1669:                     ",'spreadsheet')\">$SelectSpreadsheetFile</a><br />",
1.75      albertel 1670: 	     'allow_limited_html_in_feedback'
1.141     sakharuk 1671: 	         => '<b>'.&mt('Allow limited HTML in discussion posts').'</b><br />'.
1.158     sakharuk 1672: 	            '('.&mt('Set value to "[_1]" to allow',"<tt>yes</tt>").')',
1.170     raeburn  1673:              'allow_discussion_post_editing'
                   1674:                  => '<b>'.&mt('Allow users to edit/delete their own discussion posts').'</b><br />'.
                   1675:                     '('.&mt('Set value to "[_1]" to allow',"<tt>yes</tt>").')',
1.89      albertel 1676: 	     'rndseed'
1.140     sakharuk 1677: 	         => '<b>'.&mt('Randomization algorithm used').'</b> <br />'.
                   1678:                     '<font color="red">'.&mt('Modifying this will make problems').' '.
                   1679:                     &mt('have different numbers and answers').'</font>',
1.151     albertel 1680: 	     'receiptalg'
                   1681: 	         => '<b>'.&mt('Receipt algorithm used').'</b> <br />'.
                   1682:                     &mt('This controls how receipt numbers are generated.'),
1.164     sakharuk 1683:              'suppress_tries'
                   1684:                  => '<b>'.&mt('Suppress number of tries in printing').'</b>('.
                   1685:                     &mt('yes if supress').')',
1.113     sakharuk 1686:              'problem_stream_switch'
1.141     sakharuk 1687:                  => '<b>'.&mt('Allow problems to be split over pages').'</b><br />'.
1.158     sakharuk 1688:                     ' ('.&mt('"[_1]" if allowed, anything else if not','<tt>yes</tt>').')',
1.161     sakharuk 1689:              'default_paper_size' 
                   1690:                  => '<b>'.&mt('Default paper type').'</b><br />'.
                   1691:                     ' ('.&mt('supported types').': Letter [8 1/2x11 in], Legal [8 1/2x14 in],'. 
                   1692:                     ' Tabloid [11x17 in], Executive [7 1/2x10 in], A2 [420x594 mm],'. 
                   1693:                     ' A3 [297x420 mm], A4 [210x297 mm], A5 [148x210 mm], A6 [105x148 mm])',
1.111     sakharuk 1694:              'anonymous_quiz'
1.150     www      1695:                  => '<b>'.&mt('Anonymous quiz/exam').'</b><br />'.
1.141     sakharuk 1696:                     ' (<tt><b>'.&mt('yes').'</b> '.&mt('to avoid print students names').' </tt>)',
                   1697:              'default_enrollment_start_date' => '<b>'.&mt('Default beginning date when enrolling students').'</b>',
                   1698:              'default_enrollment_end_date'   => '<b>'.&mt('Default ending date when enrolling students').'</b>',
1.150     www      1699:              'nothideprivileged'   => '<b>'.&mt('Privileged users that should not be hidden on staff listings').'</b>'.
                   1700:                                  '<br />(<tt>user:domain,user:domain,...</tt>)',
1.140     sakharuk 1701:              'languages' => '<b>'.&mt('Languages used').'</b>',
1.115     www      1702:              'disable_receipt_display'
1.141     sakharuk 1703:                  => '<b>'.&mt('Disable display of problem receipts').'</b><br />'.
1.158     sakharuk 1704:                     ' ('.&mt('"[_1]" to disable, anything else if not','<tt>yes</tt>').')',
1.163     albertel 1705: 	     'disablesigfigs'
                   1706: 	         => '<b>'.&mt('Disable checking of Significant Figures').'</b><br />'.
                   1707:                     ' ('.&mt('"[_1]" to disable, anything else if not','<tt>yes</tt>').')',
1.149     albertel 1708: 	     'tthoptions'
                   1709: 	         => '<b>'.&mt('Default set of options to pass to tth/m when converting tex').'</b>'
1.107     matthew  1710:              ); 
1.177     raeburn  1711:         my @Display_Order = ('url','description','courseid','cloners','grading',
1.107     matthew  1712:                              'default_xml_style','pageseparators',
                   1713:                              'question.email','comment.email','policy.email',
1.169     matthew  1714:                              'student_classlist_view',
1.118     matthew  1715:                              'plc.roles.denied','plc.users.denied',
1.107     matthew  1716:                              'pch.roles.denied','pch.users.denied',
                   1717:                              'allow_limited_html_in_feedback',
1.170     raeburn  1718:                              'allow_discussion_post_editing',
1.108     www      1719:                              'languages',
1.150     www      1720: 			     'nothideprivileged',
1.107     matthew  1721:                              'rndseed',
1.151     albertel 1722:                              'receiptalg',
1.107     matthew  1723:                              'problem_stream_switch',
1.164     sakharuk 1724: 			     'suppress_tries',
1.161     sakharuk 1725:                              'default_paper_size',
1.115     www      1726:                              'disable_receipt_display',
1.107     matthew  1727:                              'spreadsheet_default_classcalc',
                   1728:                              'spreadsheet_default_studentcalc',
                   1729:                              'spreadsheet_default_assesscalc', 
                   1730:                              'hideemptyrows',
                   1731:                              'default_enrollment_start_date',
                   1732:                              'default_enrollment_end_date',
1.163     albertel 1733: 			     'tthoptions',
                   1734: 			     'disablesigfigs'
1.107     matthew  1735:                              );
                   1736: 	foreach my $parameter (sort(keys(%values))) {
1.142     raeburn  1737:             unless ($parameter =~ m/^internal\./) {
                   1738:                 if (! $descriptions{$parameter}) {
                   1739:                     $descriptions{$parameter}=$parameter;
                   1740:                     push(@Display_Order,$parameter);
                   1741:                 }
                   1742:             }
1.43      albertel 1743: 	}
1.107     matthew  1744:         foreach my $parameter (@Display_Order) {
                   1745:             my $description = $descriptions{$parameter};
1.51      matthew  1746:             # onchange is javascript to automatically check the 'Set' button.
1.69      www      1747:             my $onchange = 'onFocus="javascript:window.document.forms'.
1.107     matthew  1748:                 "['envform'].elements['".$parameter."_setparmval']".
1.51      matthew  1749:                 '.checked=true;"';
1.107     matthew  1750:             $output .= '<tr><td>'.$description.'</td>';
                   1751:             if ($parameter =~ /^default_enrollment_(start|end)_date$/) {
                   1752:                 $output .= '<td>'.
                   1753:                     &Apache::lonhtmlcommon::date_setter('envform',
                   1754:                                                         $parameter.'_value',
                   1755:                                                         $values{$parameter},
                   1756:                                                         $onchange).
                   1757:                                                         '</td>';
                   1758:             } else {
                   1759:                 $output .= '<td>'.
                   1760:                     &Apache::lonhtmlcommon::textbox($parameter.'_value',
                   1761:                                                     $values{$parameter},
                   1762:                                                     40,$onchange).'</td>';
                   1763:             }
                   1764:             $output .= '<td>'.
                   1765:                 &Apache::lonhtmlcommon::checkbox($parameter.'_setparmval').
                   1766:                 '</td>';
                   1767:             $output .= "</tr>\n";
1.51      matthew  1768: 	}
1.69      www      1769:         my $onchange = 'onFocus="javascript:window.document.forms'.
1.51      matthew  1770:             '[\'envform\'].elements[\'newp_setparmval\']'.
                   1771:             '.checked=true;"';
1.130     www      1772: 	$output.='<tr><td><i>'.&mt('Create New Environment Variable').'</i><br />'.
1.51      matthew  1773: 	    '<input type="text" size=40 name="newp_name" '.
                   1774:                 $onchange.' /></td><td>'.
                   1775:             '<input type="text" size=40 name="newp_value" '.
                   1776:                 $onchange.' /></td><td>'.
                   1777: 	    '<input type="checkbox" name="newp_setparmval" /></td></tr>';
1.43      albertel 1778:     }
1.157     sakharuk 1779:     my %lt=&Apache::lonlocal::texthash(
                   1780: 		    'par'   => 'Parameter',
                   1781: 		    'val'   => 'Value',
                   1782: 		    'set'   => 'Set',
                   1783: 		    'sce'   => 'Set Course Environment'
                   1784: 				       );
                   1785: 
1.140     sakharuk 1786:     my $Parameter=&mt('Parameter');
                   1787:     my $Value=&mt('Value');
1.141     sakharuk 1788:     my $Set=&mt('Set');
1.167     albertel 1789:     my $browse_js=&Apache::loncommon::browser_and_searcher_javascript('parmset');
1.183     albertel 1790:     my $html=&Apache::lonxml::xmlbegin();
1.190     albertel 1791:     $r->print(<<ENDenv);
1.183     albertel 1792: $html
                   1793: <head>
1.46      matthew  1794: <script type="text/javascript" language="Javascript" >
1.155     albertel 1795: $browse_js
1.46      matthew  1796: </script>
1.30      www      1797: <title>LON-CAPA Course Environment</title>
                   1798: </head>
1.64      www      1799: $bodytag
1.193     albertel 1800: $breadcrumbs
                   1801: <form method="post" action="/adm/parmset?action=crsenv" name="envform">
1.30      www      1802: $setoutput
                   1803: <p>
                   1804: <table border=2>
1.157     sakharuk 1805: <tr><th>$lt{'par'}</th><th>$lt{'val'}</th><th>$lt{'set'}?</th></tr>
1.30      www      1806: $output
                   1807: </table>
1.157     sakharuk 1808: <input type="submit" name="crsenv" value="$lt{'sce'}">
1.30      www      1809: </form>
                   1810: </body>
                   1811: </html>    
1.190     albertel 1812: ENDenv
1.30      www      1813: }
1.120     www      1814: ##################################################
1.30      www      1815: 
1.124     www      1816: my $tableopen;
                   1817: 
                   1818: sub tablestart {
                   1819:     if ($tableopen) {
                   1820: 	return '';
                   1821:     } else {
                   1822: 	$tableopen=1;
1.130     www      1823: 	return '<table border="2"><tr><th>'.&mt('Parameter').'</th><th>'.
                   1824: 	    &mt('Delete').'</th><th>'.&mt('Set to ...').'</th></tr>';
1.124     www      1825:     }
                   1826: }
                   1827: 
                   1828: sub tableend {
                   1829:     if ($tableopen) {
                   1830: 	$tableopen=0;
                   1831: 	return '</table>';
                   1832:     } else {
                   1833: 	return'';
                   1834:     }
                   1835: }
                   1836: 
1.120     www      1837: sub overview {
                   1838:     my $r=shift;
                   1839:     my $bodytag=&Apache::loncommon::bodytag(
                   1840:                              'Set/Modify Course Assessment Parameters');
1.190     albertel 1841:     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   1842:     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.194     albertel 1843:     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs(undef,'Overview');
1.183     albertel 1844:     my $html=&Apache::lonxml::xmlbegin();
1.120     www      1845:     $r->print(<<ENDOVER);
1.183     albertel 1846: $html
1.120     www      1847: <head>
                   1848: <title>LON-CAPA Course Environment</title>
                   1849: </head>
                   1850: $bodytag
1.193     albertel 1851: $breadcrumbs
                   1852: <form method="post" action="/adm/parmset?action=setoverview" name="overviewform">
1.120     www      1853: <input type="hidden" name="overview" value="1" />
                   1854: ENDOVER
1.124     www      1855: # Setting
                   1856:     my %olddata=&Apache::lonnet::dump('resourcedata',$dom,$crs);
                   1857:     my %newdata=();
                   1858:     undef %newdata;
                   1859:     my @deldata=();
                   1860:     undef @deldata;
1.190     albertel 1861:     foreach (keys %env) {
1.124     www      1862: 	if ($_=~/^form\.([a-z]+)\_(.+)$/) {
                   1863: 	    my $cmd=$1;
                   1864: 	    my $thiskey=$2;
                   1865: 	    if ($cmd eq 'set') {
1.190     albertel 1866: 		my $data=$env{$_};
1.124     www      1867: 		if ($olddata{$thiskey} ne $data) { $newdata{$thiskey}=$data; }
                   1868: 	    } elsif ($cmd eq 'del') {
                   1869: 		push (@deldata,$thiskey);
                   1870: 	    } elsif ($cmd eq 'datepointer') {
1.190     albertel 1871: 		my $data=&Apache::lonhtmlcommon::get_date_from_form($env{$_});
1.153     albertel 1872: 		if (defined($data) and $olddata{$thiskey} ne $data) { $newdata{$thiskey}=$data; }
1.124     www      1873: 	    }
                   1874: 	}
                   1875:     }
                   1876: # Store
1.144     www      1877:     my $delentries=$#deldata+1;
                   1878:     my @newdatakeys=keys %newdata;
                   1879:     my $putentries=$#newdatakeys+1;
                   1880:     if ($delentries) {
                   1881: 	if (&Apache::lonnet::del('resourcedata',\@deldata,$dom,$crs) eq 'ok') {
                   1882: 	    $r->print('<h2>'.&mt('Deleted [_1] parameter(s)</h2>',$delentries));
                   1883: 	} else {
                   1884: 	    $r->print('<h2><font color="red">'.
                   1885: 		      &mt('Error deleting parameters').'</font></h2>');
                   1886: 	}
                   1887:     }
                   1888:     if ($putentries) {
                   1889: 	if (&Apache::lonnet::put('resourcedata',\%newdata,$dom,$crs) eq 'ok') {
                   1890: 	    $r->print('<h2>'.&mt('Stored [_1] parameter(s)</h2>',$putentries));
                   1891: 	} else {
                   1892: 	    $r->print('<h2><font color="red">'.
                   1893: 		      &mt('Error storing parameters').'</font></h2>');
                   1894: 	}
                   1895:     }
1.122     www      1896: # Read and display
                   1897:     my %resourcedata=&Apache::lonnet::dump('resourcedata',$dom,$crs);
                   1898:     my $oldsection='';
                   1899:     my $oldrealm='';
                   1900:     my $oldpart='';
1.123     www      1901:     my $pointer=0;
1.124     www      1902:     $tableopen=0;
1.145     www      1903:     my $foundkeys=0;
1.122     www      1904:     foreach my $thiskey (sort keys %resourcedata) {
1.123     www      1905: 	if ($resourcedata{$thiskey.'.type'}) {
                   1906: 	    my ($course,$middle,$part,$name)=
                   1907: 		($thiskey=~/^(\w+)\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);
1.130     www      1908: 	    my $section=&mt('All Students');
1.122     www      1909: 	    if ($middle=~/^\[(.*)\]\./) {
1.130     www      1910: 		$section=&mt('Group/Section').': '.$1;
1.122     www      1911: 		$middle=~s/^\[(.*)\]\.//;
                   1912: 	    }
1.123     www      1913: 	    $middle=~s/\.$//;
1.130     www      1914: 	    my $realm='<font color="red">'.&mt('All Resources').'</font>';
1.122     www      1915: 	    if ($middle=~/^(.+)\_\_\_\(all\)$/) {
1.174     albertel 1916: 		$realm='<font color="green">'.&mt('Folder/Map').': '.&Apache::lonnet::gettitle($1).' <br /><font color="#aaaaaa" size="-2">('.$1.')</font></font>';
1.122     www      1917: 	    } elsif ($middle) {
1.174     albertel 1918: 		my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle);
                   1919: 		$realm='<font color="orange">'.&mt('Resource').': '.&Apache::lonnet::gettitle($middle).' <br /><font color="#aaaaaa" size="-2">('.$url.' in '.$map.' id: '.$id.')</font></font>';
1.122     www      1920: 	    }
                   1921: 	    if ($section ne $oldsection) {
1.124     www      1922: 		$r->print(&tableend()."\n<hr /><h1>$section</h1>");
1.122     www      1923: 		$oldsection=$section;
                   1924: 		$oldrealm='';
                   1925: 	    }
                   1926: 	    if ($realm ne $oldrealm) {
1.124     www      1927: 		$r->print(&tableend()."\n<h2>$realm</h2>");
1.122     www      1928: 		$oldrealm=$realm;
                   1929: 		$oldpart='';
                   1930: 	    }
                   1931: 	    if ($part ne $oldpart) {
1.124     www      1932: 		$r->print(&tableend().
1.130     www      1933: 			  "\n<h3><font color='blue'>".&mt('Part').": $part</font></h3>");
1.122     www      1934: 		$oldpart=$part;
                   1935: 	    }
1.123     www      1936: #
                   1937: # Ready to print
                   1938: #
1.124     www      1939: 	    $r->print(&tablestart().'<tr><td><b>'.$name.
                   1940: 		      ':</b></td><td><input type="checkbox" name="del_'.
                   1941: 		      $thiskey.'" /></td><td>');
1.145     www      1942: 	    $foundkeys++;
1.123     www      1943: 	    if ($resourcedata{$thiskey.'.type'}=~/^date/) {
                   1944: 		my $jskey='key_'.$pointer;
                   1945: 		$pointer++;
                   1946: 		$r->print(
                   1947: 			  &Apache::lonhtmlcommon::date_setter('overviewform',
                   1948: 							      $jskey,
                   1949: 						      $resourcedata{$thiskey}).
                   1950: '<input type="hidden" name="datepointer_'.$thiskey.'" value="'.$jskey.'" />'
                   1951: 			  );
                   1952: 	    } else {
                   1953: 		$r->print(
                   1954: 			  '<input type="text" name="set_'.$thiskey.'" value="'.
                   1955: 			  $resourcedata{$thiskey}.'">');
                   1956: 	    }
1.124     www      1957: 	    $r->print('</td></tr>');
1.122     www      1958: 	}
1.121     www      1959:     }
1.124     www      1960:     
1.145     www      1961:     $r->print(&tableend().'<p>'.
                   1962: 	($foundkeys?'<input type="submit" value="'.&mt('Modify Parameters').'" />':&mt('There are no course or section parameters.')).'</p></form></body></html>');
1.120     www      1963: }
1.121     www      1964: 
1.59      matthew  1965: ##################################################
                   1966: ##################################################
1.178     raeburn  1967:                                                                                             
                   1968: =pod
                   1969:                                                                                             
                   1970: =item change clone
                   1971:                                                                                             
                   1972: Modifies the list of courses a user can clone (stored
                   1973: in the user's environemnt.db file), called when a
                   1974: change is made to the list of users allowed to clone
                   1975: a course.
                   1976:                                                                                             
                   1977: Inputs: $action,$cloner
                   1978: where $action is add or drop, and $cloner is identity of 
                   1979: user for whom cloning ability is to be changed in course. 
                   1980:                                                                                             
                   1981: Returns: 
                   1982: 
                   1983: =cut
                   1984:                                                                                             
                   1985: ##################################################
                   1986: ##################################################
                   1987: 
                   1988: 
                   1989: sub change_clone {
                   1990:     my ($clonelist,$oldcloner) = @_;
                   1991:     my ($uname,$udom);
1.190     albertel 1992:     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
                   1993:     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
1.178     raeburn  1994:     my $clone_crs = $cnum.':'.$cdom;
                   1995:     
                   1996:     if ($cnum && $cdom) {
                   1997:         my @allowclone = ();
                   1998:         if ($clonelist =~ /,/) {
                   1999:             @allowclone = split/,/,$clonelist;
                   2000:         } else {
                   2001:             $allowclone[0] = $clonelist;
                   2002:         }
                   2003:         foreach my $currclone (@allowclone) {
                   2004:             if (!grep/^$currclone$/,@$oldcloner) {
                   2005:                 ($uname,$udom) = split/:/,$currclone;
                   2006:                 if ($uname && $udom) {
                   2007:                     unless (&Apache::lonnet::homeserver($uname,$udom) eq 'no_host') {
                   2008:                         my %currclonecrs = &Apache::lonnet::dump('environment',$udom,$uname,'cloneable');
                   2009:                         if ($currclonecrs{'cloneable'} !~ /\Q$clone_crs\E/) {
                   2010:                             if ($currclonecrs{'cloneable'} eq '') {
                   2011:                                 $currclonecrs{'cloneable'} = $clone_crs;
                   2012:                             } else {
                   2013:                                 $currclonecrs{'cloneable'} .= ','.$clone_crs;
                   2014:                             }
                   2015:                             &Apache::lonnet::put('environment',\%currclonecrs,$udom,$uname);
                   2016:                         }
                   2017:                     }
                   2018:                 }
                   2019:             }
                   2020:         }
                   2021:         foreach my $oldclone (@$oldcloner) {
                   2022:             if (!grep/^$oldclone$/,@allowclone) {
                   2023:                 ($uname,$udom) = split/:/,$oldclone;
                   2024:                 if ($uname && $udom) {
                   2025:                     unless (&Apache::lonnet::homeserver($uname,$udom) eq 'no_host') {
                   2026:                         my %currclonecrs = &Apache::lonnet::dump('environment',$udom,$uname,'cloneable');
                   2027:                         my %newclonecrs = ();
                   2028:                         if ($currclonecrs{'cloneable'} =~ /\Q$clone_crs\E/) {
                   2029:                             if ($currclonecrs{'cloneable'} =~ /,/) {
                   2030:                                 my @currclonecrs = split/,/,$currclonecrs{'cloneable'};
                   2031:                                 foreach (@currclonecrs) {
                   2032:                                     unless ($_ eq $clone_crs) {
                   2033:                                         $newclonecrs{'cloneable'} .= $_.',';
                   2034:                                     }
                   2035:                                 }
                   2036:                                 $newclonecrs{'cloneable'} =~ s/,$//;
                   2037:                             } else {
                   2038:                                 $newclonecrs{'cloneable'} = '';
                   2039:                             }
                   2040:                             &Apache::lonnet::put('environment',\%newclonecrs,$udom,$uname);
                   2041:                         }
                   2042:                     }
                   2043:                 }
                   2044:             }
                   2045:         }
                   2046:     }
                   2047: }
                   2048: 
1.193     albertel 2049: 
                   2050: ##################################################
                   2051: ##################################################
                   2052: 
                   2053: =pod
                   2054: 
                   2055: =item * header
                   2056: 
                   2057: Output html header for page
                   2058: 
                   2059: =cut
                   2060: 
                   2061: ##################################################
                   2062: ##################################################
                   2063: sub header {
                   2064:     my $html=&Apache::lonxml::xmlbegin();
                   2065:     my $bodytag=&Apache::loncommon::bodytag('Parameter Manager');
                   2066:     my $title = &mt('LON-CAPA Parameter Manager');
                   2067:     return(<<ENDHEAD);
                   2068: $html
                   2069: <head>
                   2070: <title>$title</title>
                   2071: </head>
                   2072: $bodytag
                   2073: ENDHEAD
                   2074: }
                   2075: ##################################################
                   2076: ##################################################
                   2077: sub print_main_menu {
                   2078:     my ($r,$parm_permission)=@_;
                   2079:     #
                   2080:     $r->print(<<ENDMAINFORMHEAD);
                   2081: <form method="post" enctype="multipart/form-data"
                   2082:       action="/adm/parmset" name="studentform">
                   2083: ENDMAINFORMHEAD
                   2084: #
1.195     albertel 2085:     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
                   2086:     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
1.193     albertel 2087:     my @menu =
                   2088:         (
                   2089:           { text => 'Set Course Environment Parameters',
                   2090:             help => 'Course_Setting_Parameters',
                   2091:             action => 'crsenv',
                   2092:             permission => $parm_permission,
                   2093:             },
                   2094:           { text => 'Set/Modify Course Assessment Parameters - Helper Mode',
                   2095:             url => '/adm/helper/parameter.helper',
                   2096:             permission => $parm_permission,
                   2097:             },
                   2098:           { text => 'Modify Course Assessment Parameters - Overview Mode',
                   2099:             action => 'setoverview',
                   2100:             permission => $parm_permission,
                   2101:             },
                   2102:           { text => 'Set/Modify Course Assessment Parameters - Table Mode',
                   2103:             action => 'settable',
                   2104:             permission => $parm_permission,
                   2105:             },
                   2106: #          { text => 'Set Parameter Default Preferences',
                   2107: #            help => 'Course_View_Class_List',
                   2108: #            action => 'setdefaults',
                   2109: #            permission => $parm_permission,
                   2110: #            },
                   2111:           );
                   2112:     my $menu_html = '';
                   2113:     foreach my $menu_item (@menu) {
                   2114:         next if (! $menu_item->{'permission'});
                   2115:         $menu_html.='<p>';
                   2116:         $menu_html.='<font size="+1">';
                   2117:         if (exists($menu_item->{'url'})) {
                   2118:             $menu_html.=qq{<a href="$menu_item->{'url'}">};
                   2119:         } else {
                   2120:             $menu_html.=
                   2121:                 qq{<a href="/adm/parmset?action=$menu_item->{'action'}">};
                   2122:         }
                   2123:         $menu_html.= &mt($menu_item->{'text'}).'</a></font>';
                   2124:         if (exists($menu_item->{'help'})) {
                   2125:             $menu_html.=
                   2126:                 &Apache::loncommon::help_open_topic($menu_item->{'help'});
                   2127:         }
                   2128:         $menu_html.='</p>'.$/;
                   2129:     }
                   2130:     $r->print($menu_html);
                   2131:     return;
                   2132: }
                   2133: 
                   2134: 
                   2135: 
                   2136: 
1.178     raeburn  2137: ##################################################
                   2138: ##################################################
1.30      www      2139: 
1.59      matthew  2140: =pod
                   2141: 
1.83      bowersj2 2142: =item * handler
1.59      matthew  2143: 
                   2144: Main handler.  Calls &assessparms and &crsenv subroutines.
                   2145: 
                   2146: =cut
                   2147: ##################################################
                   2148: ##################################################
1.85      bowersj2 2149:     use Data::Dumper;
1.30      www      2150: sub handler {
1.43      albertel 2151:     my $r=shift;
1.30      www      2152: 
1.43      albertel 2153:     if ($r->header_only) {
1.126     www      2154: 	&Apache::loncommon::content_type($r,'text/html');
1.43      albertel 2155: 	$r->send_http_header;
                   2156: 	return OK;
                   2157:     }
1.193     albertel 2158:     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
1.194     albertel 2159: 					    ['action','state']);
1.131     www      2160: 
                   2161: # ----------------------------------------------------------- Clear out garbage
                   2162: 
1.132     albertel 2163:     %courseopt=();
                   2164:     %useropt=();
                   2165:     %parmhash=();
1.131     www      2166: 
1.132     albertel 2167:     @ids=();
                   2168:     %symbp=();
                   2169:     %mapp=();
                   2170:     %typep=();
                   2171:     %keyp=();
1.131     www      2172: 
1.132     albertel 2173:     %maptitles=();
1.83      bowersj2 2174: 
1.193     albertel 2175:     &Apache::lonhtmlcommon::clear_breadcrumbs();
1.194     albertel 2176:     &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/parmset",
                   2177: 					    text=>"Parameter Manager",
                   2178: 					    faq=>9,
                   2179: 					    bug=>'Instructor Interface'});
1.30      www      2180: # ----------------------------------------------------- Needs to be in a course
1.194     albertel 2181:     my $parm_permission =
                   2182: 	(&Apache::lonnet::allowed('opa',$env{'request.course.id'}) ||
1.190     albertel 2183: 	 &Apache::lonnet::allowed('opa',$env{'request.course.id'}.'/'.
1.193     albertel 2184: 				  $env{'request.course.sec'}));
1.194     albertel 2185:     if ($env{'request.course.id'} &&  $parm_permission) {
1.193     albertel 2186: 
                   2187:         # Start Page
1.126     www      2188:         &Apache::loncommon::content_type($r,'text/html');
1.106     www      2189:         $r->send_http_header;
1.30      www      2190: 
1.193     albertel 2191:         #
                   2192:         # Main switch on form.action and form.state, as appropriate
                   2193:         #
                   2194:         # Check first if coming from someone else headed directly for
                   2195:         #  the table mode
                   2196:         if ((($env{'form.command'} eq 'set') && ($env{'form.url'})
                   2197: 	     && (!$env{'form.dis'})) || ($env{'form.symb'})) {
                   2198: 	    &assessparms($r);
                   2199: 
                   2200:         } elsif (! exists($env{'form.action'})) {
                   2201:             $r->print(&header());
1.194     albertel 2202:             $r->print(&Apache::lonhtmlcommon::breadcrumbs(undef,
                   2203: 							 'Parameter Manager'));
1.193     albertel 2204:             &print_main_menu($r,$parm_permission);
                   2205:         } elsif ($env{'form.action'} eq 'crsenv' && $parm_permission) {
1.194     albertel 2206:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=crsenv',
                   2207: 						    text=>"Course Environment"});
                   2208:             $r->print(&Apache::lonhtmlcommon::breadcrumbs(undef,
                   2209: 						   'Edit Course Environment'));
1.193     albertel 2210:             &crsenv($r); 
                   2211:         } elsif ($env{'form.action'} eq 'setoverview' && $parm_permission) {
1.194     albertel 2212:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview',
                   2213: 						    text=>"Overview Mode"});
1.121     www      2214: 	    &overview($r);
1.193     albertel 2215:         } elsif ($env{'form.action'} eq 'settable' && $parm_permission) {
1.194     albertel 2216:             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=settable',
                   2217: 						    text=>"Table Mode"});
1.121     www      2218: 	    &assessparms($r);
1.193     albertel 2219:         }
                   2220:         
1.43      albertel 2221:     } else {
1.1       www      2222: # ----------------------------- Not in a course, or not allowed to modify parms
1.190     albertel 2223: 	$env{'user.error.msg'}=
1.43      albertel 2224: 	    "/adm/parmset:opa:0:0:Cannot modify assessment parameters";
                   2225: 	return HTTP_NOT_ACCEPTABLE;
                   2226:     }
                   2227:     return OK;
1.1       www      2228: }
                   2229: 
                   2230: 1;
                   2231: __END__
                   2232: 
1.59      matthew  2233: =pod
1.38      harris41 2234: 
                   2235: =back
                   2236: 
                   2237: =cut
1.1       www      2238: 
                   2239: 
                   2240: 

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