File:  [LON-CAPA] / loncom / interface / lonparmset.pm
Revision 1.36: download - view: text, annotated - select for diffs
Fri Oct 5 21:50:25 2001 UTC (22 years, 7 months ago) by albertel
Branches: MAIN
CVS tags: stable_2001_fall, HEAD
- added in processing of URL submitted symbs

    1: # The LearningOnline Network with CAPA
    2: # Handler to set parameters for assessments
    3: #
    4: # (Handler to resolve ambiguous file locations
    5: #
    6: # (TeX Content Handler
    7: #
    8: # 05/29/00,05/30,10/11 Gerd Kortemeyer)
    9: #
   10: # 10/11,10/12,10/16 Gerd Kortemeyer)
   11: #
   12: # 11/20,11/21,11/22,11/23,11/24,11/25,11/27,11/28,
   13: # 12/08,12/12,
   14: # 16/01/01,02/08,03/20,03/23,03/24,03/26,05/09,
   15: # 07/05,07/06,08/08,08/09,09/01,09/21 Gerd Kortemeyer
   16: 
   17: package Apache::lonparmset;
   18: 
   19: use strict;
   20: use Apache::lonnet;
   21: use Apache::Constants qw(:common :http REDIRECT);
   22: use Apache::loncommon;
   23: use GDBM_File;
   24: 
   25: 
   26: my %courseopt;
   27: my %useropt;
   28: my %bighash;
   29: my %parmhash;
   30: 
   31: my @outpar;
   32: 
   33: my @ids;
   34: my %symbp;
   35: my %mapp;
   36: my %typep;
   37: my %keyp;
   38: my %defp;
   39: 
   40: my %allkeys;
   41: my %allmaps;
   42: 
   43: my $uname;
   44: my $udom;
   45: my $uhome;
   46: 
   47: my $csec;
   48: 
   49: my $fcat;
   50: 
   51: # -------------------------------------------- Figure out a cascading parameter
   52: 
   53: sub parmval {
   54:     my ($what,$id,$def)=@_;
   55:     my $result='';
   56:     @outpar=();
   57: # ----------------------------------------------------- Cascading lookup scheme
   58: 
   59:        my $symbparm=$symbp{$id}.'.'.$what;
   60:        my $mapparm=$mapp{$id}.'___(all).'.$what;
   61: 
   62:        my $seclevel=
   63:             $ENV{'request.course.id'}.'.['.
   64: 		$csec.'].'.$what;
   65:        my $seclevelr=
   66:             $ENV{'request.course.id'}.'.['.
   67: 		$csec.'].'.$symbparm;
   68:        my $seclevelm=
   69:             $ENV{'request.course.id'}.'.['.
   70: 		$csec.'].'.$mapparm;
   71: 
   72:        my $courselevel=
   73:             $ENV{'request.course.id'}.'.'.$what;
   74:        my $courselevelr=
   75:             $ENV{'request.course.id'}.'.'.$symbparm;
   76:        my $courselevelm=
   77:             $ENV{'request.course.id'}.'.'.$mapparm;
   78: 
   79: # -------------------------------------------------------- first, check default
   80: 
   81:        if ($def) { $outpar[11]=$def;
   82:                    $result=11; }
   83: 
   84: # ----------------------------------------------------- second, check map parms
   85: 
   86:        my $thisparm=$parmhash{$symbparm};
   87:        if ($thisparm) { $outpar[10]=$thisparm;  
   88:                         $result=10; }
   89: 
   90: # --------------------------------------------------------- third, check course
   91: 
   92:        if ($courseopt{$courselevel}) { $outpar[9]=$courseopt{$courselevel};  
   93:                                        $result=9; }
   94: 
   95:        if ($courseopt{$courselevelm}) { $outpar[8]=$courseopt{$courselevelm}; 
   96:                                         $result=8; }
   97: 
   98:        if ($courseopt{$courselevelr}) { $outpar[7]=$courseopt{$courselevelr}; 
   99:                                         $result=7; }
  100: 
  101:        if ($csec) {
  102: 
  103:         if ($courseopt{$seclevel}) { $outpar[6]=$courseopt{$seclevel};  
  104:                                     $result=6; }
  105: 
  106:         if ($courseopt{$seclevelm}) { $outpar[5]=$courseopt{$seclevelm};  
  107:                                      $result=5; }  
  108:  
  109:         if ($courseopt{$seclevelr}) { $outpar[4]=$courseopt{$seclevelr};  
  110:                                      $result=4; }
  111:   
  112:       }
  113: 
  114: # ---------------------------------------------------------- fourth, check user
  115:       
  116:       if ($uname) { 
  117: 
  118:        if ($useropt{$courselevel}) { $outpar[3]=$useropt{$courselevel};  
  119:                                      $result=3; }
  120: 
  121:        if ($useropt{$courselevelm}) { $outpar[2]=$useropt{$courselevelm}; 
  122:                                       $result=2; }
  123: 
  124:        if ($useropt{$courselevelr}) { $outpar[1]=$useropt{$courselevelr}; 
  125:                                       $result=1; }
  126: 
  127:       }
  128:      
  129:     return $result;
  130: }
  131: 
  132: # ------------------------------------------------------------ Output for value
  133: 
  134: sub valout {
  135:     my ($value,$type)=@_;
  136:     return
  137: 	($value?(($type=~/^date/)?localtime($value):$value):'  ');
  138: }
  139: 
  140: # -------------------------------------------------------- Produces link anchor
  141: 
  142: sub plink {
  143:     my ($type,$dis,$value,$marker,$return,$call)=@_;
  144:     my $winvalue=$value;
  145:     unless ($winvalue) {
  146: 	if ($type=~/^date/) {
  147:             $winvalue=$ENV{'form.recent_'.$type};
  148:         } else {
  149:             $winvalue=$ENV{'form.recent_'.(split(/\_/,$type))[0]};
  150:         }
  151:     }
  152:     return 
  153:       '<a href="javascript:pjump('."'".$type."','".$dis."','".$winvalue."','"
  154:       .$marker."','".$return."','".$call."'".');">'.
  155:       &valout($value,$type).'</a><a name="'.$marker.'"></a>';
  156: }
  157: 
  158: sub assessparms {
  159: 
  160:       my $r=shift;
  161: # -------------------------------------------------------- Variable declaration
  162: 
  163:       %courseopt=();
  164:       %useropt=();
  165:       %bighash=();
  166: 
  167:       @ids=();
  168:       %symbp=();
  169:       %typep=();
  170: 
  171:       my $message='';
  172: 
  173:       $csec=$ENV{'form.csec'};
  174:       $udom=$ENV{'form.udom'};
  175:       unless ($udom) { $udom=$r->dir_config('lonDefDomain'); }
  176: 
  177:       my $pscat=$ENV{'form.pscat'};
  178:       my $pschp=$ENV{'form.pschp'};
  179:       my $pssymb='';
  180: 
  181: # ----------------------------------------------- Was this started from grades?
  182: 
  183:       if (($ENV{'form.command'} eq 'set') && ($ENV{'form.url'})
  184:           && (!$ENV{'form.dis'})) {
  185: 	  my $url=$ENV{'form.url'};
  186:           $url=~s-^http://($ENV{'SERVER_NAME'}|$ENV{'HTTP_HOST'})--;
  187:           $pssymb=&Apache::lonnet::symbread($url);
  188:           $pscat='all';
  189:           $pschp='';
  190:       } elsif ($ENV{'form.symb'}) {
  191: 	  $pssymb=$ENV{'form.symb'};
  192: 	  $pscat='all';
  193: 	  $pschp='';
  194:       } else {
  195:           $ENV{'form.url'}='';
  196:       }
  197:  
  198:       my $id=$ENV{'form.id'};
  199:       if (($id) && ($udom)) {
  200:           $uname=(&Apache::lonnet::idget($udom,$id))[1];
  201:           if ($uname) {
  202: 	      $id='';
  203:           } else {
  204:               $message=
  205:      "<font color=red>Unknown ID '$id' at domain '$udom'</font>";
  206:           }
  207:       } else {
  208:           $uname=$ENV{'form.uname'};
  209:       }
  210:       unless ($udom) { $uname=''; }
  211:       $uhome='';
  212:       if ($uname) {
  213: 	  $uhome=&Apache::lonnet::homeserver($uname,$udom);
  214:       
  215:         if ($uhome eq 'no_host') { 
  216:           $message=
  217:      "<font color=red>Unknown user '$uname' at domain '$udom'</font>";
  218:           $uname=''; 
  219:         } else {
  220:           $csec=&Apache::lonnet::usection(
  221: 				       $udom,$uname,$ENV{'request.course.id'});
  222:           if ($csec eq '-1') {
  223:              $message="<font color=red>".
  224:               "User '$uname' at domain '$udom' not in this course</font>";
  225:               $uname='';
  226:               $csec=$ENV{'form.csec'};
  227: 	 } else {
  228:               my %name=&Apache::lonnet::userenvironment($udom,$uname,
  229: 		('firstname','middlename','lastname','generation','id'));
  230:               $message="\n<p>\nFull Name: ".
  231:                           $name{'firstname'}.' '.$name{'middlename'}.' '
  232: 	                 .$name{'lastname'}.' '.$name{'generation'}.
  233:                        "<br>\nID: ".$name{'id'}.'<p>';
  234:          }
  235:         }
  236:       }
  237: 
  238:       unless ($csec) { $csec=''; }
  239: 
  240:       $fcat=$ENV{'form.fcat'};
  241:       unless ($fcat) { $fcat=''; }
  242: 
  243: # ------------------------------------------------------------------- Tie hashs
  244:       if ((tie(%bighash,'GDBM_File',$ENV{'request.course.fn'}.'.db',
  245:                        &GDBM_READER,0640)) &&
  246:           (tie(%parmhash,'GDBM_File',
  247:            $ENV{'request.course.fn'}.'_parms.db',&GDBM_READER,0640))) {
  248: 
  249: # --------------------------------------------------------- Get all assessments
  250: 	undef %allkeys;
  251:         undef %allmaps;
  252:         undef %defp;
  253:         map {
  254: 	    if ($_=~/^src\_(\d+)\.(\d+)$/) {
  255: 	       my $mapid=$1;
  256:                my $resid=$2;
  257:                my $id=$mapid.'.'.$resid;
  258:                my $srcf=$bighash{$_};
  259:                if ($srcf=~/\.(problem|exam|quiz|assess|survey|form)$/) {
  260: 		   $ids[$#ids+1]=$id;
  261:                    $typep{$id}=$1;
  262:                    $keyp{$id}='';
  263:                    map {
  264:                        if ($_=~/^parameter\_(.*)/) {
  265: 			  my $key=$_;
  266:                           my $allkey=$1;
  267:                           $allkey=~s/\_/\./;
  268:                           my $display=
  269: 			      &Apache::lonnet::metadata($srcf,$key.'.display');
  270:                           unless ($display) {
  271:                               $display=
  272: 			         &Apache::lonnet::metadata($srcf,$key.'.name');
  273:                           }
  274:                           $allkeys{$allkey}=$display;
  275:                           if ($allkey eq $fcat) {
  276:                              $defp{$id}=
  277:                               &Apache::lonnet::metadata($srcf,$key);
  278: 			  }
  279:                           if ($keyp{$id}) {
  280: 			      $keyp{$id}.=','.$key;
  281:                           } else {
  282:                               $keyp{$id}=$key;
  283: 		          }
  284: 		       }
  285:                    } split(/\,/,
  286:                       &Apache::lonnet::metadata($srcf,'keys'));
  287:                    $mapp{$id}=
  288: 		       &Apache::lonnet::declutter($bighash{'map_id_'.$mapid});
  289:                    $allmaps{$mapid}=$mapp{$id};
  290:                    $symbp{$id}=$mapp{$id}.
  291: 			'___'.$resid.'___'.
  292: 			    &Apache::lonnet::declutter($srcf);
  293: 	       }
  294:             }
  295:         } keys %bighash;
  296: # ---------------------------------------------------------- Anything to store?
  297:         if ($ENV{'form.pres_marker'}) {
  298:        my ($sresid,$spnam,$snum)=split(/\&/,$ENV{'form.pres_marker'});
  299:        $spnam=~s/\_([^\_]+)$/\.$1/;
  300: # ---------------------------------------------------------- Construct prefixes
  301: 
  302:        my $symbparm=$symbp{$sresid}.'.'.$spnam;
  303:        my $mapparm=$mapp{$sresid}.'___(all).'.$spnam;
  304: 
  305:        my $seclevel=
  306:             $ENV{'request.course.id'}.'.['.
  307: 		$csec.'].'.$spnam;
  308:        my $seclevelr=
  309:             $ENV{'request.course.id'}.'.['.
  310: 		$csec.'].'.$symbparm;
  311:        my $seclevelm=
  312:             $ENV{'request.course.id'}.'.['.
  313: 		$csec.'].'.$mapparm;
  314: 
  315:        my $courselevel=
  316:             $ENV{'request.course.id'}.'.'.$spnam;
  317:        my $courselevelr=
  318:             $ENV{'request.course.id'}.'.'.$symbparm;
  319:        my $courselevelm=
  320:             $ENV{'request.course.id'}.'.'.$mapparm;
  321: 
  322:        my $storeunder='';
  323:        if (($snum==9) || ($snum==3)) { $storeunder=$courselevel; }
  324:        if (($snum==8) || ($snum==2)) { $storeunder=$courselevelm; }
  325:        if (($snum==7) || ($snum==1)) { $storeunder=$courselevelr; }
  326:        if ($snum==6) { $storeunder=$seclevel; }
  327:        if ($snum==5) { $storeunder=$seclevelm; }
  328:        if ($snum==4) { $storeunder=$seclevelr; }
  329:        $storeunder=&Apache::lonnet::escape($storeunder);
  330:  
  331:        my $storecontent=
  332:     $storeunder.'='.&Apache::lonnet::escape($ENV{'form.pres_value'}).'&'.
  333:     $storeunder.'.type='.&Apache::lonnet::escape($ENV{'form.pres_type'});
  334: 
  335:        my $reply='';
  336:            if ($snum>3) {
  337: # ---------------------------------------------------------------- Store Course
  338: #
  339: # Expire sheets
  340: 	    &Apache::lonnet::expirespread('','','studentcalc');
  341:             if (($snum==7) || ($snum==4)) {
  342: 	     &Apache::lonnet::expirespread('','','assesscalc',$symbp{$sresid});
  343:             } elsif (($snum==8) || ($snum==5)) {
  344: 	     &Apache::lonnet::expirespread('','','assesscalc',$mapp{$sresid});
  345:             } else {
  346: 	     &Apache::lonnet::expirespread('','','assesscalc');
  347:             }
  348: 
  349: # Store parameter
  350:             $reply=&Apache::lonnet::critical('put:'.
  351:              $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.':'.
  352:              $ENV{'course.'.$ENV{'request.course.id'}.'.num'}.':resourcedata:'.
  353:              $storecontent,
  354:              $ENV{'course.'.$ENV{'request.course.id'}.'.home'});
  355:            } else {
  356: # ------------------------------------------------------------------ Store User
  357: #
  358: # Expire sheets
  359: 	    &Apache::lonnet::expirespread($uname,$udom,'studentcalc');
  360:             if ($snum==1) {
  361: 		&Apache::lonnet::expirespread
  362:                     ($uname,$udom,'assesscalc',$symbp{$sresid});
  363:             } elsif ($snum==2) {
  364: 		&Apache::lonnet::expirespread
  365:                     ($uname,$udom,'assesscalc',$mapp{$sresid});
  366:             } else {
  367: 		&Apache::lonnet::expirespread($uname,$udom,'assesscalc');
  368:             }
  369:                 
  370: # Store parameter
  371:             $reply=
  372:             &Apache::lonnet::critical('put:'.$udom.':'.$uname.':resourcedata:'.
  373:              $storecontent,$uhome);
  374:            }
  375: 
  376:          if ($reply=~/^error\:(.*)/) {
  377: 	     $message.="<font color=red>Write Error: $1</font>";
  378: 	 }
  379: # ---------------------------------------------------------------- Done storing
  380:    }
  381: # -------------------------------------------------------------- Get coursedata
  382:         my $reply=&Apache::lonnet::reply('dump:'.
  383:               $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.':'.
  384:               $ENV{'course.'.$ENV{'request.course.id'}.'.num'}.':resourcedata',
  385:               $ENV{'course.'.$ENV{'request.course.id'}.'.home'});
  386:         if ($reply!~/^error\:/) {
  387:            map {
  388:              my ($name,$value)=split(/\=/,$_);
  389:              $courseopt{&Apache::lonnet::unescape($name)}=
  390:                         &Apache::lonnet::unescape($value);  
  391:            } split(/\&/,$reply);
  392:         }
  393: # --------------------------------------------------- Get userdata (if present)
  394:         if ($uname) {
  395:            my $reply=
  396:        &Apache::lonnet::reply('dump:'.$udom.':'.$uname.':resourcedata',$uhome);
  397:            if ($reply!~/^error\:/) {
  398:               map {
  399:                 my ($name,$value)=split(/\=/,$_);
  400:                 $useropt{&Apache::lonnet::unescape($name)}=
  401:                          &Apache::lonnet::unescape($value);
  402:               } split(/\&/,$reply);
  403:            }
  404:         }
  405: 
  406: # ------------------------------------------------------------------- Sort this
  407: 
  408:         @ids=sort  {  
  409:            if ($fcat eq '') {
  410:               $a<=>$b;
  411:            } else {
  412:               1*$outpar[&parmval($fcat,$a,$defp{$a})]<=>
  413:               1*$outpar[&parmval($fcat,$b,$defp{$b})];
  414:            } 
  415:        } @ids;
  416: 
  417: # ------------------------------------------------------------------ Start page
  418:          $r->content_type('text/html');
  419:          $r->send_http_header;
  420: 	$r->print(<<ENDHEAD);
  421: <html>
  422: <head>
  423: <title>LON-CAPA Course Parameters</title>
  424: <script>
  425: 
  426:     function pclose() {
  427:         parmwin=window.open("/adm/rat/empty.html","LONCAPAparms",
  428:                  "height=350,width=350,scrollbars=no,menubar=no");
  429:         parmwin.close();
  430:     }
  431: 
  432:     function pjump(type,dis,value,marker,ret,call) {
  433:         document.parmform.pres_marker.value='';
  434:         parmwin=window.open("/adm/rat/parameter.html?type="+escape(type)
  435:                  +"&value="+escape(value)+"&marker="+escape(marker)
  436:                  +"&return="+escape(ret)
  437:                  +"&call="+escape(call)+"&name="+escape(dis),"LONCAPAparms",
  438:                  "height=350,width=350,scrollbars=no,menubar=no");
  439: 
  440:     }
  441: 
  442:     function psub() {
  443:         pclose();
  444:         if (document.parmform.pres_marker.value!='') {
  445:             document.parmform.action+='#'+document.parmform.pres_marker.value;
  446:             var typedef=new Array();
  447:             typedef=document.parmform.pres_type.value.split('_');
  448:            if (document.parmform.pres_type.value!='') {
  449:             if (typedef[0]=='date') {
  450:                 eval('document.parmform.recent_'+
  451:                      document.parmform.pres_type.value+
  452: 		     '.value=document.parmform.pres_value.value;');
  453:             } else {
  454:                 eval('document.parmform.recent_'+typedef[0]+
  455: 		     '.value=document.parmform.pres_value.value;');
  456:             }
  457: 	   }
  458:             document.parmform.submit();
  459:         } else {
  460:             document.parmform.pres_value.value='';
  461:             document.parmform.pres_marker.value='';
  462:         }
  463:     }
  464: 
  465: </script>
  466: </head>
  467: <body bgcolor="#FFFFFF" onUnload="pclose()">
  468: <h1>Set Course Parameters</h1>
  469: <form method="post" action="/adm/parmset" name="envform">
  470: <h2>Course: $ENV{'course.'.$ENV{'request.course.id'}.'.description'}</h2>
  471: <h3>Course Environment</h3>
  472: <input type="submit" name="crsenv" value="Set Course Environment">
  473: </form>
  474: <form method="post" action="/adm/parmset" name="parmform">
  475: <h3>Course Assessments</h3>
  476: <b>
  477: Section/Group: 
  478: <input type="text" value="$csec" size="6" name="csec">
  479: <br>
  480: For User 
  481: <input type="text" value="$uname" size="12" name="uname">
  482: or ID
  483: <input type="text" value="$id" size="12" name="id"> 
  484: at Domain 
  485: <input type="text" value="$udom" size="6" name="udom">
  486: </b>
  487: <input type="hidden" value='' name="pres_value">
  488: <input type="hidden" value='' name="pres_type">
  489: <input type="hidden" value='' name="pres_marker"> 
  490: ENDHEAD
  491:     if ($ENV{'form.url'}) {
  492: 	$r->print('<input type="hidden" value="'.$ENV{'form.url'}.
  493: 	      '" name="url"><input type="hidden" name="command" value="set">');
  494:     }
  495:     map {
  496:       $r->print('<input type="hidden" value="'.
  497:           $ENV{'form.recent_'.$_}.'" name="recent_'.$_.'">');
  498:     } ('tolerance','date_default','date_start','date_end','date_interval',
  499:        'int','float','string');
  500: 
  501:         $r->print('<h2>'.$message.'</h2><table><tr><td>Sort list by</td><td>');
  502: 	$r->print('<select name="fcat">');
  503:         $r->print('<option value="">Enclosing Map</option>');
  504:         map {
  505: 	    $r->print('<option value="'.$_.'"');
  506:             if ($fcat eq $_) { $r->print(' selected'); }
  507:             $r->print('>'.$allkeys{$_}.'</option>');
  508:         } reverse sort keys %allkeys;
  509:        $r->print(
  510:     '</select></tr><tr><td>Select Enclosing Map</td><td><select name=pschp>');
  511:         $r->print('<option value=all>All Maps</option>');
  512:         map {
  513: 	    $r->print('<option value="'.$_.'"');
  514:             if (($pssymb=~/^$allmaps{$_}/) || 
  515:                 ($pschp eq $_)) { $r->print(' selected'); }
  516:             $r->print('>'.$allmaps{$_}.'</option>');
  517:         } keys %allmaps;
  518:         $r->print(
  519:  '</select></td></tr><tr><td>Select Parameter</td><td><select name=pscat>');
  520:         $r->print('<option value=all>All Parameters</option>');
  521:         map {
  522: 	    $r->print('<option value="'.$_.'"');
  523:             if ($pscat eq $_) { $r->print(' selected'); }
  524:             $r->print('>'.$allkeys{$_}.'</option>');
  525:         } reverse sort keys %allkeys;
  526:         $r->print(
  527: '</select></td></tr></table><br><input name=dis type="submit" value="Display">'
  528:                  );
  529:       if (($pscat) || ($pschp) || ($pssymb)) {
  530: # ----------------------------------------------------------------- Start Table
  531: 	my $catmarker='parameter_'.$pscat;
  532:         $catmarker=~s/\./\_/g;
  533:         my $coursespan=$csec?8:5;
  534:         my $csuname=$ENV{'user.name'};
  535:         my $csudom=$ENV{'user.domain'};
  536: 	 $r->print(<<ENDTABLEHEAD);
  537: <p><table border=2>
  538: <tr><td colspan=5></td>
  539: <th colspan=$coursespan>Any User</th>
  540: ENDTABLEHEAD
  541:     if ($uname) {
  542: 	$r->print("<th colspan=3 rowspan=2>User $uname at Domain $udom</th>");
  543:     }
  544:     $r->print(<<ENDTABLETWO);
  545: <th rowspan=3>Parameter in Effect</th>
  546: <th rowspan=3>Current Session Value<br>($csuname at $csudom)</th>
  547: </tr><tr><td colspan=5></td>
  548: <th colspan=2>Resource Level</th>
  549: <th colspan=3>in Course</th>
  550: ENDTABLETWO
  551:     if ($csec) {
  552: 	$r->print("<th colspan=3>in Section/Group $csec</th>");
  553:     }
  554:     $r->print(<<ENDTABLEHEADFOUR);
  555: </tr><tr><th>Assessment URL and Title</th><th>Type</th>
  556: <th>Enclosing Map</th><th>Part No.</th><th>Parameter Name</th>
  557: <th>default</th><th>from Enclosing Map</th>
  558: <th>general</th><th>for Enclosing Map</th><th>for Resource</th>
  559: ENDTABLEHEADFOUR
  560:     if ($csec) {
  561:   $r->print('<th>general</th><th>for Enclosing Map</th><th>for Resource</th>');
  562:     }
  563:     if ($uname) {
  564:   $r->print('<th>general</th><th>for Enclosing Map</th><th>for Resource</th>');
  565:     }
  566: 	$r->print('</tr>');
  567:          my $defbgone='';
  568:          my $defbgtwo='';
  569:  	 map {
  570:            my $rid=$_;
  571:            my ($inmapid)=($rid=~/\.(\d+)$/);
  572:            if (($pschp eq 'all') || ($allmaps{$pschp} eq $mapp{$rid}) ||
  573:                ($pssymb eq $mapp{$rid}.'___'.$inmapid.'___'.
  574:                 &Apache::lonnet::declutter($bighash{'src_'.$rid}))) {
  575: # ------------------------------------------------------ Entry for one resource
  576: 	     if ($defbgone eq '"E0E099"') {
  577: 		 $defbgone='"E0E0DD"';
  578:              } else {
  579:                  $defbgone='"E0E099"';
  580: 	     }
  581: 	     if ($defbgtwo eq '"FFFF99"') {
  582: 		 $defbgtwo='"FFFFDD"';
  583:              } else {
  584:                  $defbgtwo='"FFFF99"';
  585: 	     }
  586: 	    @outpar=();
  587:             my $thistitle='';
  588:             my %name=   ();
  589: 	     undef %name;
  590:             my %part=   ();
  591: 	    my %display=();
  592: 	    my %type=   ();
  593:             my %default=();
  594:             my $uri=&Apache::lonnet::declutter($bighash{'src_'.$rid});
  595: 
  596:             map {
  597: 	     if (($_ eq $catmarker) || ($pscat eq 'all')) {
  598: 		$part{$_}=&Apache::lonnet::metadata($uri,$_.'.part');
  599:                 $name{$_}=&Apache::lonnet::metadata($uri,$_.'.name');
  600:                 $display{$_}=&Apache::lonnet::metadata($uri,$_.'.display');
  601:                 unless ($display{$_}) { $display{$_}=''; }
  602:                 $display{$_}.=' ('.$name{$_}.')';
  603:                 $default{$_}=&Apache::lonnet::metadata($uri,$_);
  604:                 $type{$_}=&Apache::lonnet::metadata($uri,$_.'.type');
  605:                 $thistitle=&Apache::lonnet::metadata($uri,$_.'.title');
  606: 	     }
  607:             } split(/\,/,$keyp{$rid});
  608: 
  609: 	    my $totalparms=scalar keys %name;
  610: 	  if ($totalparms>0) {
  611:             my $firstrow=1;
  612:             $r->print('<tr><td bgcolor='.$defbgone.
  613:                 ' rowspan='.$totalparms.'><tt><font size=-1>'.
  614:                 join(' / ',split(/\//,$uri)).
  615:                 '</font></tt><p><b>'.
  616:                       $bighash{'title_'.$rid});
  617:             if ($thistitle) {
  618: 		$r->print(' ('.$thistitle.')');
  619:             }
  620:             $r->print('</b></td>');
  621:             $r->print('<td bgcolor='.$defbgtwo.
  622:                     ' rowspan='.$totalparms.'>'.$typep{$rid}.'</td>');
  623:             $r->print('<td bgcolor='.$defbgone.
  624:                     ' rowspan='.$totalparms.'><tt><font size=-1>'.
  625: 		      join(' / ',split(/\//,$mapp{$rid})).'</font></tt></td>');
  626:             map {
  627: 	       my $result=&parmval($part{$_}.'.'.$name{$_},$rid,$default{$_});
  628:                unless ($firstrow) { 
  629:                   $r->print('<tr>'); 
  630:                } else {
  631: 		   $firstrow=0;
  632:                }
  633:                $r->print("<td bgcolor=".$defbgtwo.
  634:                   ">$part{$_}</td><td bgcolor=".$defbgone.
  635:                   ">$display{$_}</td>");
  636:                my $thismarker=$_;
  637:                $thismarker=~s/^parameter\_//; 
  638:                my $mprefix=$rid.'&'.$thismarker.'&';
  639: 
  640:                $r->print('<td bgcolor='.
  641:                 (($result==11)?'"#AAFFAA"':'#FFDDDD').'>'.
  642:              &valout($outpar[11],$type{$_}).'</td>');
  643:                $r->print('<td bgcolor='.
  644:                 (($result==10)?'"#AAFFAA"':'#FFDDDD').'>'.
  645:              &valout($outpar[10],$type{$_}).'</td>');
  646: 
  647:                $r->print('<td bgcolor='.
  648:                 (($result==9)?'"#AAFFAA"':$defbgone).'>'.
  649:              &plink($type{$_},$display{$_},$outpar[9],$mprefix.'9',
  650:                     'parmform.pres','psub').'</td>');
  651:                $r->print('<td bgcolor='.
  652:                 (($result==8)?'"#AAFFAA"':$defbgone).'>'.
  653:              &plink($type{$_},$display{$_},$outpar[8],$mprefix.'8',
  654:                     'parmform.pres','psub').'</td>');
  655:                $r->print('<td bgcolor='.
  656:                 (($result==7)?'"#AAFFAA"':$defbgone).'>'.
  657:              &plink($type{$_},$display{$_},$outpar[7],$mprefix.'7',
  658:                     'parmform.pres','psub').'</td>');
  659: 
  660:                if ($csec) {
  661:                  $r->print('<td bgcolor='.
  662:                    (($result==6)?'"#AAFFAA"':$defbgtwo).'>'.
  663:              &plink($type{$_},$display{$_},$outpar[6],$mprefix.'6',
  664:                     'parmform.pres','psub').'</td>');
  665:                  $r->print('<td bgcolor='.
  666:                    (($result==5)?'"#AAFFAA"':$defbgtwo).'>'.
  667:              &plink($type{$_},$display{$_},$outpar[5],$mprefix.'5',
  668:                     'parmform.pres','psub').'</td>');
  669:                  $r->print('<td bgcolor='.
  670:                     (($result==4)?'"#AAFFAA"':$defbgtwo).'>'.
  671:              &plink($type{$_},$display{$_},$outpar[4],$mprefix.'4',
  672:                     'parmform.pres','psub').'</td>');
  673:                }
  674: 
  675:                if ($uname) {
  676:                  $r->print('<td bgcolor='.
  677:                     (($result==3)?'"#AAFFAA"':$defbgone).'>'.
  678:              &plink($type{$_},$display{$_},$outpar[3],$mprefix.'3',
  679:                     'parmform.pres','psub').'</td>');
  680:                  $r->print('<td bgcolor='.
  681:                     (($result==2)?'"#AAFFAA"':$defbgone).'>'.
  682:              &plink($type{$_},$display{$_},$outpar[2],$mprefix.'2',
  683:                     'parmform.pres','psub').'</td>');
  684:                  $r->print('<td bgcolor='.
  685:                    (($result==1)?'"#AAFFAA"':$defbgone).'>'.
  686:              &plink($type{$_},$display{$_},$outpar[1],$mprefix.'1',
  687:                     'parmform.pres','psub').'</td>');
  688:                }
  689:                $r->print(
  690: 	'<td bgcolor=#CCCCFF>'.&valout($outpar[$result],$type{$_}).'</td>');
  691:                my $sessionval=&Apache::lonnet::EXT('resource.'.$part{$_}.
  692: 		      '.'.$name{$_},$mapp{$rid}.'___'.$inmapid.'___'.$uri);
  693:                if (($type{$_}=~/^date/) && ($sessionval))
  694:                     { $sessionval=localtime($sessionval); }
  695:                $r->print(
  696: 	'<td bgcolor=#999999><font color=#FFFFFF>'.$sessionval.'&nbsp;'.
  697:         '</font></td>');
  698:                $r->print("</tr>");
  699: 	   } sort keys %name;
  700: 	}
  701: # -------------------------------------------------- End entry for one resource
  702: 	 }
  703: 	 } @ids;
  704:          $r->print('</table>');
  705:       }
  706: 	$r->print('</form></body></html>');
  707:          untie(%bighash);
  708: 	 untie(%parmhash);
  709:       }
  710: }
  711: 
  712: sub crsenv {
  713:     my $r=shift;
  714:     my $setoutput='';
  715: # -------------------------------------------------- Go through list of changes
  716:     map {
  717: 	if ($_=~/^form\.(.+)\_setparmval$/) {
  718:             my $name=$1;
  719:             my $value=$ENV{'form.'.$name.'_value'};
  720:             if ($name eq 'newp') {
  721:                 $name=$ENV{'form.newp_name'};
  722:             }
  723:             if ($name eq 'url') {
  724: 		$value=~s/^\/res\///;
  725:                 $setoutput.='Backing up previous URL: '.
  726:                          &Apache::lonnet::reply('put:'.
  727:                          $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.
  728:                          ':'.$ENV{'course.'.$ENV{'request.course.id'}.'.num'}.
  729:                          ':environment:'.
  730:                          &Apache::lonnet::escape('top level map backup '.
  731:                                                                     time).'='.
  732: 	                 &Apache::lonnet::reply('get:'.
  733:                          $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.
  734:                          ':'.$ENV{'course.'.$ENV{'request.course.id'}.'.num'}.
  735:                          ':environment:url',
  736: 		         $ENV{'course.'.$ENV{'request.course.id'}.'.home'}),
  737:                          $ENV{'course.'.$ENV{'request.course.id'}.'.home'}).
  738:                         '<br>';
  739: 
  740:             }
  741:             if ($name) {
  742:         	$setoutput.='Setting <tt>'.$name.'</tt> to <tt>'.
  743:                         $value.'</tt>: '.
  744:                 &Apache::lonnet::reply('put:'.
  745:                          $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.
  746:                          ':'.$ENV{'course.'.$ENV{'request.course.id'}.'.num'}.
  747:                          ':environment:'.
  748:                             &Apache::lonnet::escape($name).'='.
  749: 			    &Apache::lonnet::escape($value),
  750:                          $ENV{'course.'.$ENV{'request.course.id'}.'.home'}).
  751:                         '<br>';
  752: 	    }
  753:         }
  754:     } keys %ENV;
  755: # -------------------------------------------------------- Get parameters again
  756:     my $rep=&Apache::lonnet::reply
  757:                  ('dump:'.$ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.
  758:                          ':'.$ENV{'course.'.$ENV{'request.course.id'}.'.num'}.
  759:                          ':environment',
  760:                          $ENV{'course.'.$ENV{'request.course.id'}.'.home'});
  761:     my $output='';
  762:     if ($rep ne 'con_lost') {
  763: 	my %values;
  764:         my %descriptions=
  765:  ('url'            => '<b>Top Level Map</b><br><font color=red>'.
  766:                    'Modification may make assessment data inaccessible</font>',
  767:   'description'    => '<b>Course Description</b>',
  768:   'courseid'       => '<b>Course ID or number</b><br>(internal, optional)',
  769:   'question.email' => '<b>Feedback Addresses for Content Questions</b><br>'.
  770:                       '(<tt>user:domain,user:domain,...</tt>)',
  771:   'comment.email'  => '<b>Feedback Addresses for Comments</b><br>'.
  772:                       '(<tt>user:domain,user:domain,...</tt>)',
  773:   'policy.email'   => '<b>Feedback Addresses for Course Policy</b><br>'.
  774:                       '(<tt>user:domain,user:domain,...</tt>)'
  775:  ); 
  776: 
  777:        map {
  778:            my ($name,$value)=split(/\=/,$_);
  779:            $name=&Apache::lonnet::unescape($name);
  780:            $values{$name}=&Apache::lonnet::unescape($value);
  781:            unless ($descriptions{$name}) {
  782: 	       $descriptions{$name}=$name;
  783:            }
  784:        } split(/\&/,$rep);
  785:        map {
  786:            $output.='<tr><td>'.$descriptions{$_}.'</td><td><input name="'.
  787:                        $_.'_value" size=40 value="'.
  788:                       $values{$_}.
  789:                      '"></td><td><input type=checkbox name="'.$_.
  790:                      '_setparmval"></td></tr>';
  791:        } keys %descriptions;
  792:        $output.='<tr><td><i>Create New Environment Variable</i><br>'.
  793:                 '<input type="text" size=40 name="newp_name"></td><td>'.
  794:                 '<input type="text" size=40 name="newp_value"></td><td>'.
  795:                 '<input type="checkbox" name="newp_setparmval"></td></tr>'; 
  796:     }    
  797:     $r->print(<<ENDENV);
  798: <html>
  799: <head>
  800: <title>LON-CAPA Course Environment</title>
  801: </head>
  802: <body bgcolor="#FFFFFF">
  803: <h1>Set Course Parameters</h1>
  804: <form method="post" action="/adm/parmset" name="envform">
  805: <h2>Course: $ENV{'course.'.$ENV{'request.course.id'}.'.description'}</h2>
  806: <h3>Course Environment</h3>
  807: $setoutput
  808: <p>
  809: <table border=2>
  810: <tr><th>Parameter</th><th>Value</th><th>Set?</th></tr>
  811: $output
  812: </table>
  813: <input type="submit" name="crsenv" value="Set Course Environment">
  814: </form>
  815: </body>
  816: </html>    
  817: ENDENV
  818: }
  819: 
  820: # ================================================================ Main Handler
  821: 
  822: sub handler {
  823:    my $r=shift;
  824: 
  825:    if ($r->header_only) {
  826:       $r->content_type('text/html');
  827:       $r->send_http_header;
  828:       return OK;
  829:    }
  830:    &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'});
  831: # ----------------------------------------------------- Needs to be in a course
  832: 
  833:    if (($ENV{'request.course.id'}) && 
  834:        (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'}))) {
  835: 
  836:        unless (($ENV{'form.crsenv'}) || (!$ENV{'request.course.fn'})) {
  837: # --------------------------------------------------------- Bring up assessment
  838: 	  &assessparms($r);
  839: # ---------------------------------------------- This is for course environment
  840:        } else {
  841: 	  &crsenv($r);
  842:        }
  843:    } else {
  844: # ----------------------------- Not in a course, or not allowed to modify parms
  845:       $ENV{'user.error.msg'}=
  846:         "/adm/parmset:opa:0:0:Cannot modify assessment parameters";
  847:       return HTTP_NOT_ACCEPTABLE; 
  848:    }
  849:    return OK;
  850: }
  851: 
  852: 1;
  853: __END__
  854: 
  855: 
  856: 
  857: 

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