Diff for /loncom/interface/lonparmset.pm between versions 1.57 and 1.125

version 1.57, 2002/08/08 17:03:20 version 1.125, 2003/09/09 18:46:28
Line 25 Line 25
 #  #
 # http://www.lon-capa.org/  # http://www.lon-capa.org/
 #  #
 # (Handler to resolve ambiguous file locations  ###################################################################
 #  ###################################################################
 # (TeX Content Handler  
 #  =pod
 # YEAR=2000  
 # 05/29/00,05/30,10/11 Gerd Kortemeyer)  =head1 NAME
 #  
 # 10/11,10/12,10/16 Gerd Kortemeyer)  lonparmset - Handler to set parameters for assessments and course
 #  
 # 11/20,11/21,11/22,11/23,11/24,11/25,11/27,11/28,  =head1 SYNOPSIS
 # 12/08,12/12,  
 # YEAR=2001  lonparmset provides an interface to setting course parameters. 
 # 16/01/01,02/08,03/20,03/23,03/24,03/26,05/09,  
 # 07/05,07/06,08/08,08/09,09/01,09/21 Gerd Kortemeyer  =head1 DESCRIPTION
 # 12/17 Scott Harrison  
 # 12/19 Guy Albertelli  This module sets coursewide and assessment parameters.
 # 12/26,12/27 Gerd Kortemeyer  
 #  =head1 INTERNAL SUBROUTINES
 # YEAR=2002  
 # 7/19 Jeremy Bowers  =over 4
 ###  
   =cut
   
   ###################################################################
   ###################################################################
   
 package Apache::lonparmset;  package Apache::lonparmset;
   
 use strict;  use strict;
 use Apache::lonnet;  use Apache::lonnet;
 use Apache::Constants qw(:common :http REDIRECT);  use Apache::Constants qw(:common :http REDIRECT);
   use Apache::lonhtmlcommon();
 use Apache::loncommon;  use Apache::loncommon;
 use GDBM_File;  use GDBM_File;
 use Apache::lonhomework;  use Apache::lonhomework;
Line 68  my %mapp; Line 73  my %mapp;
 my %typep;  my %typep;
 my %keyp;  my %keyp;
   
   my %maptitles;
   
 my $uname;  my $uname;
 my $udom;  my $udom;
 my $uhome;  my $uhome;
 my $csec;  my $csec;
 my $coursename;  my $coursename;
   
 # -------------------------------------------- Figure out a cascading parameter  ##################################################
   ##################################################
   
   =pod
   
   =item parmval
   
   Figure out a cascading parameter.
   
   Inputs:  $what - a parameter spec (incluse part info and name I.E. 0.weight)
            $id   - a bighash Id number
            $def  - the resource's default value   'stupid emacs
   
   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
   
   11- resource default
   10- map default
   9 - General Course
   8 - Map or Folder level in course
   7 - resource level in course
   6 - General for section
   5 - Map or Folder level for section
   4 - resource level in section
   3 - General for specific student
   2 - Map or Folder level for specific student
   1 - resource level for specific student
   
   =cut
   
   ##################################################
   ##################################################
 sub parmval {  sub parmval {
     my ($what,$id,$def)=@_;      my ($what,$id,$def)=@_;
     my $result='';      my $result='';
Line 104  sub parmval { Line 140  sub parmval {
   
 # --------------------------------------------------------- third, check course  # --------------------------------------------------------- third, check course
   
     if ($courseopt{$courselevel}) {      if (defined($courseopt{$courselevel})) {
  $outpar[9]=$courseopt{$courselevel};   $outpar[9]=$courseopt{$courselevel};
  $result=9;   $result=9;
     }      }
   
     if ($courseopt{$courselevelm}) {      if (defined($courseopt{$courselevelm})) {
  $outpar[8]=$courseopt{$courselevelm};   $outpar[8]=$courseopt{$courselevelm};
  $result=8;   $result=8;
     }      }
   
     if ($courseopt{$courselevelr}) {      if (defined($courseopt{$courselevelr})) {
  $outpar[7]=$courseopt{$courselevelr};   $outpar[7]=$courseopt{$courselevelr};
  $result=7;   $result=7;
     }      }
   
     if ($csec) {      if (defined($csec)) {
         if ($courseopt{$seclevel}) {          if (defined($courseopt{$seclevel})) {
     $outpar[6]=$courseopt{$seclevel};      $outpar[6]=$courseopt{$seclevel};
     $result=6;      $result=6;
  }   }
         if ($courseopt{$seclevelm}) {          if (defined($courseopt{$seclevelm})) {
     $outpar[5]=$courseopt{$seclevelm};      $outpar[5]=$courseopt{$seclevelm};
     $result=5;      $result=5;
  }   }
   
         if ($courseopt{$seclevelr}) {          if (defined($courseopt{$seclevelr})) {
     $outpar[4]=$courseopt{$seclevelr};      $outpar[4]=$courseopt{$seclevelr};
     $result=4;      $result=4;
  }   }
Line 137  sub parmval { Line 173  sub parmval {
   
 # ---------------------------------------------------------- fourth, check user  # ---------------------------------------------------------- fourth, check user
   
     if ($uname) {      if (defined($uname)) {
  if ($useropt{$courselevel}) {   if (defined($useropt{$courselevel})) {
     $outpar[3]=$useropt{$courselevel};      $outpar[3]=$useropt{$courselevel};
     $result=3;      $result=3;
  }   }
   
  if ($useropt{$courselevelm}) {   if (defined($useropt{$courselevelm})) {
     $outpar[2]=$useropt{$courselevelm};      $outpar[2]=$useropt{$courselevelm};
     $result=2;      $result=2;
  }   }
   
  if ($useropt{$courselevelr}) {   if (defined($useropt{$courselevelr})) {
     $outpar[1]=$useropt{$courselevelr};      $outpar[1]=$useropt{$courselevelr};
     $result=1;      $result=1;
  }   }
     }      }
   
     return ($result,@outpar);      return ($result,@outpar);
 }  }
   
 # ------------------------------------------------------------ Output for value  ##################################################
   ##################################################
   
   =pod
   
   =item valout
   
   Format a value for output.
   
   Inputs:  $value, $type
   
   Returns: $value, formatted for output.  If $type indicates it is a date,
   localtime($value) is returned.
   
   =cut
   
   ##################################################
   ##################################################
 sub valout {  sub valout {
     my ($value,$type)=@_;      my ($value,$type)=@_;
     return ($value?(($type=~/^date/)?localtime($value):$value):'  ');      my $result = '';
       # Values of zero are valid.
       if (! $value && $value ne '0') {
    $result = '  ';
       } else {
           if ($type eq 'date_interval') {
               my ($sec,$min,$hour,$mday,$mon,$year)=gmtime($value);
               $year=$year-70;
               $mday--;
               if ($year) {
    $result.=$year.' yrs ';
               }
               if ($mon) {
    $result.=$mon.' mths ';
               }
               if ($mday) {
    $result.=$mday.' days ';
               }
               if ($hour) {
    $result.=$hour.' hrs ';
               }
               if ($min) {
    $result.=$min.' mins ';
               }
               if ($sec) {
    $result.=$sec.' secs ';
               }
               $result=~s/\s+$//;
           } elsif ($type=~/^date/) {
               $result = localtime($value);
           } else {
               $result = $value;
           }
       }
       return $result;
 }  }
   
 # -------------------------------------------------------- Produces link anchor  ##################################################
   ##################################################
   
   =pod
   
   =item plink
   
   Produces a link anchor.
   
   Inputs: $type,$dis,$value,$marker,$return,$call
   
   Returns: scalar with html code for a link which will envoke the 
   javascript function 'pjump'.
   
   =cut
   
   ##################################################
   ##################################################
 sub plink {  sub plink {
     my ($type,$dis,$value,$marker,$return,$call)=@_;      my ($type,$dis,$value,$marker,$return,$call)=@_;
     my $winvalue=$value;      my $winvalue=$value;
Line 184  sub plink { Line 285  sub plink {
   
   
 sub startpage {  sub startpage {
     my ($r,$id,$udom,$csec,$uname)=@_;      my ($r,$id,$udom,$csec,$uname,$have_assesments)=@_;
     $r->content_type('text/html');  
     $r->send_http_header;      my $bodytag=&Apache::loncommon::bodytag('Set/Modify Course Parameters','',
                                               'onUnload="pclose()"');
       my $chooseopt=&Apache::loncommon::select_dom_form($udom,'udom').' '.
           &Apache::loncommon::selectstudent_link('parmform','uname','udom');
       my $selscript=&Apache::loncommon::studentbrowser_javascript();
       my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition();
     $r->print(<<ENDHEAD);      $r->print(<<ENDHEAD);
 <html>  <html>
 <head>  <head>
Line 199  sub startpage { Line 305  sub startpage {
         parmwin.close();          parmwin.close();
     }      }
   
     function pjump(type,dis,value,marker,ret,call) {      $pjump_def
         document.parmform.pres_marker.value='';  
         parmwin=window.open("/adm/rat/parameter.html?type="+escape(type)  
                  +"&value="+escape(value)+"&marker="+escape(marker)  
                  +"&return="+escape(ret)  
                  +"&call="+escape(call)+"&name="+escape(dis),"LONCAPAparms",  
                  "height=350,width=350,scrollbars=no,menubar=no");  
   
     }  
   
     function psub() {      function psub() {
         pclose();          pclose();
Line 240  sub startpage { Line 338  sub startpage {
         newWin.focus();          newWin.focus();
     }      }
 </script>  </script>
   $selscript
 </head>  </head>
 <body bgcolor="#FFFFFF" onUnload="pclose()">  $bodytag
 <h1>Set Course Parameters for Course:  
 $ENV{'course.'.$ENV{'request.course.id'}.'.description'}</h1>  
 <form method="post" action="/adm/parmset" name="envform">  <form method="post" action="/adm/parmset" name="envform">
 <h3>Course Environment</h3>  <h4>Course Environment Parameters</h4>
 <input type="submit" name="crsenv" value="Set Course Environment">  <input type="submit" name="crsenv" value="Set Course Environment Parameters" />
   </form>
   <hr />
   <form method="post" action="/adm/helper/parameter.helper" name="helpform">
   <h4>Course Assessment Parameter - Helper Mode</h4>
   <input type="submit" value="Set/Modify Course Assessment Parameter" />
   </form>
   <hr />
   <form method="post" action="/adm/parmset" name="overview">
   <h4>Course Assessment Parameters - Overview Mode</h4>
   <input type="submit" name="overview" value="Modify Course Assessment Parameters" />
 </form>  </form>
   <hr />
 <form method="post" action="/adm/parmset" name="parmform">  <form method="post" action="/adm/parmset" name="parmform">
 <h3>Course Assessments</h3>  <h4>Course Assessments Parameters - Table Mode</h4>
   ENDHEAD
   
       if (!$have_assesments) {
    $r->print('<font color="red">There are no assesment parameters in this course to set.</font><br />');
       } else {
    $r->print(<<ENDHEAD);
 <b>  <b>
 Section/Group:  Section/Group:
 <input type="text" value="$csec" size="6" name="csec">  <input type="text" value="$csec" size="6" name="csec">
Line 259  For User Line 374  For User
 or ID  or ID
 <input type="text" value="$id" size="12" name="id">   <input type="text" value="$id" size="12" name="id"> 
 at Domain   at Domain 
 <input type="text" value="$udom" size="6" name="udom">  $chooseopt
 </b>  </b>
 <input type="hidden" value='' name="pres_value">  <input type="hidden" value='' name="pres_value">
 <input type="hidden" value='' name="pres_type">  <input type="hidden" value='' name="pres_type">
 <input type="hidden" value='' name="pres_marker">  <input type="hidden" value='' name="pres_marker">
 ENDHEAD  ENDHEAD
       }
 }  }
   
 sub print_row {  sub print_row {
     my ($r,$which,$part,$name,$rid,$default,$type,$display,$defbgone,      my ($r,$which,$part,$name,$rid,$default,$defaulttype,$display,$defbgone,
  $defbgtwo,$parmlev)=@_;   $defbgtwo,$parmlev)=@_;
   # get the values for the parameter in cascading order
   # empty levels will remain empty
     my ($result,@outpar)=&parmval($$part{$which}.'.'.$$name{$which},      my ($result,@outpar)=&parmval($$part{$which}.'.'.$$name{$which},
   $rid,$$default{$which});    $rid,$$default{$which});
   # get the type for the parameters
   # problem: these may not be set for all levels
       my ($typeresult,@typeoutpar)=&parmval($$part{$which}.'.'.
                                             $$name{$which}.'.type',
     $rid,$$defaulttype{$which});
   # cascade down manually
       my $cascadetype=$defaulttype;
       for (my $i=$#typeoutpar;$i>0;$i--) {
    if ($typeoutpar[$i]) { 
               $cascadetype=$typeoutpar[$i];
    } else {
               $typeoutpar[$i]=$cascadetype;
           }
       }
    
     my $parm=$$display{$which};      my $parm=$$display{$which};
   
     if ($parmlev eq 'full' || $parmlev eq 'brief') {      if ($parmlev eq 'full' || $parmlev eq 'brief') {
Line 291  sub print_row { Line 423  sub print_row {
     if ($parmlev eq 'general') {      if ($parmlev eq 'general') {
   
         if ($uname) {          if ($uname) {
             &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$_,$type,$display);              &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
         } elsif ($csec) {          } elsif ($csec) {
             &print_td($r,6,$defbgtwo,$result,\@outpar,$mprefix,$_,$type,$display);               &print_td($r,6,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); 
         } else {          } else {
             &print_td($r,9,$defbgone,$result,\@outpar,$mprefix,$_,$type,$display);               &print_td($r,9,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display); 
         }          }
     } elsif ($parmlev eq 'map') {      } elsif ($parmlev eq 'map') {
   
         if ($uname) {          if ($uname) {
             &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$_,$type,$display);              &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
         } elsif ($csec) {          } elsif ($csec) {
             &print_td($r,5,$defbgtwo,$result,\@outpar,$mprefix,$_,$type,$display);              &print_td($r,5,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
         } else {          } else {
             &print_td($r,8,$defbgone,$result,\@outpar,$mprefix,$_,$type,$display);              &print_td($r,8,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
         }          }
     } else {      } else {
   
         &print_td($r,11,'#FFDDDD',$result,\@outpar,$mprefix,$_,$type,$display);          &print_td($r,11,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
   
         if ($parmlev eq 'brief') {          if ($parmlev eq 'brief') {
   
            &print_td($r,7,$defbgone,$result,\@outpar,$mprefix,$_,$type,$display);             &print_td($r,7,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
   
            if ($csec) {             if ($csec) {
                &print_td($r,4,$defbgtwo,$result,\@outpar,$mprefix,$_,$type,$display);                 &print_td($r,4,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
            }             }
            if ($uname) {             if ($uname) {
                &print_td($r,1,$defbgone,$result,\@outpar,$mprefix,$_,$type,$display);                 &print_td($r,1,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
            }             }
         } else {          } else {
   
            &print_td($r,10,'#FFDDDD',$result,\@outpar,$mprefix,$_,$type,$display);             &print_td($r,10,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
            &print_td($r,9,$defbgone,$result,\@outpar,$mprefix,$_,$type,$display);             &print_td($r,9,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
            &print_td($r,8,$defbgone,$result,\@outpar,$mprefix,$_,$type,$display);             &print_td($r,8,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
            &print_td($r,7,$defbgone,$result,\@outpar,$mprefix,$_,$type,$display);             &print_td($r,7,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
   
            if ($csec) {             if ($csec) {
                &print_td($r,6,$defbgtwo,$result,\@outpar,$mprefix,$_,$type,$display);                 &print_td($r,6,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                &print_td($r,5,$defbgtwo,$result,\@outpar,$mprefix,$_,$type,$display);                 &print_td($r,5,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                &print_td($r,4,$defbgtwo,$result,\@outpar,$mprefix,$_,$type,$display);                 &print_td($r,4,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
            }             }
            if ($uname) {             if ($uname) {
                &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$_,$type,$display);                 &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$_,$type,$display);                 &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
                &print_td($r,1,$defbgone,$result,\@outpar,$mprefix,$_,$type,$display);                 &print_td($r,1,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
            }             }
         } # end of $brief if/else          } # end of $brief if/else
     } # end of $parmlev if/else      } # end of $parmlev if/else
   
     if ($parmlev eq 'full' || $parmlev eq 'brief') {      if ($parmlev eq 'full' || $parmlev eq 'brief') {
     $r->print('<td bgcolor=#CCCCFF align="center">'.          $r->print('<td bgcolor=#CCCCFF align="center">'.
         &valout($outpar[$result],$$type{$which}).'</td>');                    &valout($outpar[$result],$typeoutpar[$result]).'</td>');
       }
 }  
     my $sessionval=&Apache::lonnet::EXT('resource.'.$$part{$which}.      my $sessionval=&Apache::lonnet::EXT('resource.'.$$part{$which}.
                                         '.'.$$name{$which},$symbp{$rid});                                          '.'.$$name{$which},$symbp{$rid});
   # this doesn't seem to work, and I don't think is correct
   #    my $sessionvaltype=&Apache::lonnet::EXT('resource.'.$$part{$which}.
   #                                      '.'.$$name{$which}.'.type',$symbp{$rid});
   # this seems to work
       my $sessionvaltype=$typeoutpar[$result];
       if (!defined($sessionvaltype)) { $sessionvaltype=$$defaulttype{$which}; }
     $r->print('<td bgcolor=#999999 align="center"><font color=#FFFFFF>'.      $r->print('<td bgcolor=#999999 align="center"><font color=#FFFFFF>'.
                   &valout($sessionval,$$type{$which}).'&nbsp;'.                    &valout($sessionval,$sessionvaltype).'&nbsp;'.
                   '</font></td>');                    '</font></td>');
     $r->print('</tr>');      $r->print('</tr>');
     $r->print("\n");      $r->print("\n");
 }  }
   
 sub print_td {  sub print_td {
     my ($r,$which,$defbg,$result,$outpar,$mprefix,$value,$type,$display)=@_;      my ($r,$which,$defbg,$result,$outpar,$mprefix,$value,$typeoutpar,$display)=@_;
     $r->print('<td bgcolor='.(($result==$which)?'"#AAFFAA"':$defbg).      $r->print('<td bgcolor='.(($result==$which)?'"#AAFFAA"':$defbg).
               ' align="center">'.                ' align="center">');
               &plink($$type{$value},$$display{$value},$$outpar[$which],      if ($which<10) {
                      $mprefix."$which",'parmform.pres','psub').'</td>'."\n");   $r->print(&plink($$typeoutpar[$which],
    $$display{$value},$$outpar[$which],
    $mprefix."$which",'parmform.pres','psub'));
       } else {
    $r->print(&valout($$outpar[$which],$$typeoutpar[$which]));
       }
       $r->print('</td>'."\n");
 }  }
   
 sub get_env_multiple {  sub get_env_multiple {
Line 375  sub get_env_multiple { Line 519  sub get_env_multiple {
     return(@values);      return(@values);
 }  }
   
   =pod
   
   =item B<extractResourceInformation>: Given the course data hash, extractResourceInformation extracts lots of information about the course's resources into a variety of hashes.
   
   Input: See list below:
   
   =over 4
   
   =item B<ids>: An array that will contain all of the ids in the course.
   
   =item B<typep>: hash, id->type, where "type" contains the extension of the file, thus, I<problem exam quiz assess survey form>.
   
   =item B<keyp>: hash, id->key list, will contain a comma seperated list of the meta-data keys available for the given id
   
   =item B<allparms>: hash, name of parameter->display value (what is the display value?)
   
   =item B<allparts>: hash, part identification->text representation of part, where the text representation is "[Part $part]"
   
   =item B<allkeys>: hash, full key to part->display value (what's display value?)
   
   =item B<allmaps>: hash, ???
   
   =item B<fcat>: ???
   
   =item B<defp>: hash, ???
   
   =item B<mapp>: ??
   
   =item B<symbp>: hash, id->full sym?
   
   =back
   
   =cut
   
   sub extractResourceInformation {
       my $bighash = shift;
       my $ids = shift;
       my $typep = shift;
       my $keyp = shift;
       my $allparms = shift;
       my $allparts = shift;
       my $allkeys = shift;
       my $allmaps = shift;
       my $fcat = shift;
       my $defp = shift;
       my $mapp = shift;
       my $symbp = shift;
       my $maptitles=shift;
   
       foreach (keys %$bighash) {
    if ($_=~/^src\_(\d+)\.(\d+)$/) {
       my $mapid=$1;
       my $resid=$2;
       my $id=$mapid.'.'.$resid;
       my $srcf=$$bighash{$_};
       if ($srcf=~/\.(problem|exam|quiz|assess|survey|form)$/) {
    $$ids[$#$ids+1]=$id;
    $$typep{$id}=$1;
    $$keyp{$id}='';
    foreach (split(/\,/,&Apache::lonnet::metadata($srcf,'allpossiblekeys'))) {
     if ($_=~/^parameter\_(.*)/) {
                       my $key=$_;
                       my $allkey=$1;
                       $allkey=~s/\_/\./g;
                       my $display= &Apache::lonnet::metadata($srcf,$key.'.display');
                       my $name=&Apache::lonnet::metadata($srcf,$key.'.name');
                       my $part= &Apache::lonnet::metadata($srcf,$key.'.part');
                       my $parmdis = $display;
                       $parmdis =~ s|(\[Part.*$)||g;
                       my $partkey = $part;
                       $partkey =~ tr|_|.|;
                       $$allparms{$name} = $parmdis;
                       $$allparts{$part} = "[Part $part]";
                       $$allkeys{$allkey}=$display;
                       if ($allkey eq $fcat) {
           $$defp{$id}= &Apache::lonnet::metadata($srcf,$key);
       }
       if ($$keyp{$id}) {
           $$keyp{$id}.=','.$key;
       } else {
           $$keyp{$id}=$key;
       }
     }
    }
    $$mapp{$id}=
       &Apache::lonnet::declutter($$bighash{'map_id_'.$mapid});
                   $$mapp{$mapid}=$$mapp{$id};
    $$allmaps{$mapid}=$$mapp{$id};
    $$maptitles{$mapid}=
    $$bighash{'title_'.$$bighash{'ids_'.&Apache::lonnet::clutter($$mapp{$id})}};
    $$maptitles{$$mapp{$id}}=$$maptitles{$mapid};
    $$symbp{$id}=$$mapp{$id}.
    '___'.$resid.'___'.
       &Apache::lonnet::declutter($srcf);
                   $$symbp{$mapid}=$$mapp{$id}.'___(all)';
       }
    }
       }
   }
   
   ##################################################
   ##################################################
   
   =pod
   
   =item assessparms
   
   Show assessment data and parameters.  This is a large routine that should
   be simplified and shortened... someday.
   
   Inputs: $r
   
   Returns: nothing
   
   Variables used (guessed by Jeremy):
   
   =over 4
   
   =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.
   
   =item B<psprt>: ParameterS PaRTs? a list of the parts of a problem that we are displaying? Used to display only selected parts?
   
   =item B<allmaps>:
   
   =back
   
   =cut
   
   ##################################################
   ##################################################
 sub assessparms {  sub assessparms {
   
     my $r=shift;      my $r=shift;
Line 409  sub assessparms { Line 683  sub assessparms {
     my @pscat=&get_env_multiple('form.pscat');      my @pscat=&get_env_multiple('form.pscat');
     my $pschp=$ENV{'form.pschp'};      my $pschp=$ENV{'form.pschp'};
     my @psprt=&get_env_multiple('form.psprt');      my @psprt=&get_env_multiple('form.psprt');
       if (!@psprt) { $psprt[0]='0'; }
     my $showoptions=$ENV{'form.showoptions'};      my $showoptions=$ENV{'form.showoptions'};
   
     my $pssymb='';      my $pssymb='';
Line 432  sub assessparms { Line 707  sub assessparms {
  my $url=$ENV{'form.url'};   my $url=$ENV{'form.url'};
  $url=~s-^http://($ENV{'SERVER_NAME'}|$ENV{'HTTP_HOST'})--;   $url=~s-^http://($ENV{'SERVER_NAME'}|$ENV{'HTTP_HOST'})--;
  $pssymb=&Apache::lonnet::symbread($url);   $pssymb=&Apache::lonnet::symbread($url);
  @pscat='all';   if (!@pscat) { @pscat=('all'); }
  $pschp='';   $pschp='';
         $parmlev = 'full';          $parmlev = 'full';
     } elsif ($ENV{'form.symb'}) {      } elsif ($ENV{'form.symb'}) {
  $pssymb=$ENV{'form.symb'};   $pssymb=$ENV{'form.symb'};
  @pscat='all';   if (!@pscat) { @pscat=('all'); }
  $pschp='';   $pschp='';
         $parmlev = 'full';          $parmlev = 'full';
     } else {      } else {
Line 465  sub assessparms { Line 740  sub assessparms {
  "<font color=red>Unknown user '$uname' at domain '$udom'</font>";   "<font color=red>Unknown user '$uname' at domain '$udom'</font>";
     $uname='';      $uname='';
         } else {          } else {
     $csec=&Apache::lonnet::usection($udom,$uname,      $csec=&Apache::lonnet::getsection($udom,$uname,
     $ENV{'request.course.id'});        $ENV{'request.course.id'});
     if ($csec eq '-1') {      if ($csec eq '-1') {
  $message="<font color=red>".   $message="<font color=red>".
     "User '$uname' at domain '$udom' not ".      "User '$uname' at domain '$udom' not ".
Line 491  sub assessparms { Line 766  sub assessparms {
   
 # ------------------------------------------------------------------- Tie hashs  # ------------------------------------------------------------------- Tie hashs
     if (!(tie(%bighash,'GDBM_File',$ENV{'request.course.fn'}.'.db',      if (!(tie(%bighash,'GDBM_File',$ENV{'request.course.fn'}.'.db',
       &GDBM_READER,0640))) {        &GDBM_READER(),0640))) {
  $r->print("Unable to access course data. (File $ENV{'request.course.fn'}.db not tieable)");   $r->print("Unable to access course data. (File $ENV{'request.course.fn'}.db not tieable)");
  return ;   return ;
     }      }
     if (!(tie(%parmhash,'GDBM_File',      if (!(tie(%parmhash,'GDBM_File',
       $ENV{'request.course.fn'}.'_parms.db',&GDBM_READER,0640))) {        $ENV{'request.course.fn'}.'_parms.db',&GDBM_READER(),0640))) {
  $r->print("Unable to access parameter data. (File $ENV{'request.course.fn'}_parms.db not tieable)");   $r->print("Unable to access parameter data. (File $ENV{'request.course.fn'}_parms.db not tieable)");
  return ;   return ;
     }      }
   
 # --------------------------------------------------------- Get all assessments  # --------------------------------------------------------- Get all assessments
     foreach (keys %bighash) {      extractResourceInformation(\%bighash, \@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allkeys, \%allmaps, $fcat, \%defp, \%mapp, \%symbp,\%maptitles);
  if ($_=~/^src\_(\d+)\.(\d+)$/) {  
     my $mapid=$1;  
     my $resid=$2;  
     my $id=$mapid.'.'.$resid;  
     my $srcf=$bighash{$_};  
     if ($srcf=~/\.(problem|exam|quiz|assess|survey|form)$/) {  
  $ids[$#ids+1]=$id;  
  $typep{$id}=$1;  
  $keyp{$id}='';  
  foreach (split(/\,/,&Apache::lonnet::metadata($srcf,'keys'))) {  
   if ($_=~/^parameter\_(.*)/) {  
                     my $key=$_;  
                     my $allkey=$1;  
                     $allkey=~s/\_/\./g;  
                     my $display= &Apache::lonnet::metadata($srcf,$key.'.display');  
                     my $name=&Apache::lonnet::metadata($srcf,$key.'.name');  
                     my $part= &Apache::lonnet::metadata($srcf,$key.'.part');  
                     my $parmdis = $display;  
                     $parmdis =~ s|(\[Part.*$)||g;  
                     my $partkey = $part;  
                     $partkey =~ tr|_|.|;  
                     $allparms{$name} = $parmdis;  
                     $allparts{$part} = "[Part $part]";  
                     $allkeys{$allkey}=$display;  
                     if ($allkey eq $fcat) {  
         $defp{$id}= &Apache::lonnet::metadata($srcf,$key);  
     }  
     if ($keyp{$id}) {  
         $keyp{$id}.=','.$key;  
     } else {  
         $keyp{$id}=$key;  
     }  
   }  
  }  
  $mapp{$id}=  
     &Apache::lonnet::declutter($bighash{'map_id_'.$mapid});  
                 $mapp{$mapid}=$mapp{$id};  
  $allmaps{$mapid}=$mapp{$id};  
  $symbp{$id}=$mapp{$id}.  
  '___'.$resid.'___'.  
     &Apache::lonnet::declutter($srcf);  
                 $symbp{$mapid}=$mapp{$id}.'___(all)';  
     }  
  }  
     }  
     $mapp{'0.0'} = '';      $mapp{'0.0'} = '';
     $symbp{'0.0'} = '';      $symbp{'0.0'} = '';
   
 # ---------------------------------------------------------- Anything to store?  # ---------------------------------------------------------- Anything to store?
     if ($ENV{'form.pres_marker'}) {      if ($ENV{'form.pres_marker'}) {
  my ($sresid,$spnam,$snum)=split(/\&/,$ENV{'form.pres_marker'});   my ($sresid,$spnam,$snum)=split(/\&/,$ENV{'form.pres_marker'});
Line 574  sub assessparms { Line 807  sub assessparms {
  if ($snum==5) { $storeunder=$seclevelm; }   if ($snum==5) { $storeunder=$seclevelm; }
  if ($snum==4) { $storeunder=$seclevelr; }   if ($snum==4) { $storeunder=$seclevelr; }
   
         my %storecontent = ($storeunder        => $ENV{'form.pres_value'},   my $delete;
                             $storeunder.'type' => $ENV{'form.pres_type'});   if ($ENV{'form.pres_value'} eq '') { $delete=1;}
           my %storecontent = ($storeunder         => $ENV{'form.pres_value'},
                               $storeunder.'.type' => $ENV{'form.pres_type'});
  my $reply='';   my $reply='';
  if ($snum>3) {   if ($snum>3) {
 # ---------------------------------------------------------------- Store Course  # ---------------------------------------------------------------- Store Course
Line 590  sub assessparms { Line 825  sub assessparms {
  &Apache::lonnet::expirespread('','','assesscalc');   &Apache::lonnet::expirespread('','','assesscalc');
     }      }
 # Store parameter  # Store parameter
             $reply=&Apache::lonnet::cput      if ($delete) {
                 ('resourcedata',\%storecontent,   $reply=&Apache::lonnet::del
                  $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},      ('resourcedata',[keys(%storecontent)],
                  $ENV{'course.'.$ENV{'request.course.id'}.'.num'});       $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},
        $ENV{'course.'.$ENV{'request.course.id'}.'.num'});
       } else {
    $reply=&Apache::lonnet::cput
       ('resourcedata',\%storecontent,
        $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},
        $ENV{'course.'.$ENV{'request.course.id'}.'.num'});
       }
  } else {   } else {
 # ------------------------------------------------------------------ Store User  # ------------------------------------------------------------------ Store User
 #  #
Line 609  sub assessparms { Line 851  sub assessparms {
  &Apache::lonnet::expirespread($uname,$udom,'assesscalc');   &Apache::lonnet::expirespread($uname,$udom,'assesscalc');
     }      }
 # Store parameter  # Store parameter
     $reply=&Apache::lonnet::cput      if ($delete) {
                 ('resourcedata',\%storecontent,$udom,$uname);   $reply=&Apache::lonnet::del
       ('resourcedata',[keys(%storecontent)],$udom,$uname);
       } else {
    $reply=&Apache::lonnet::cput
       ('resourcedata',\%storecontent,$udom,$uname);
       }
  }   }
   
  if ($reply=~/^error\:(.*)/) {   if ($reply=~/^error\:(.*)/) {
     $message.="<font color=red>Write Error: $1</font>";      $message.="<font color=red>Write Error: $1</font>";
  }   }
 # ---------------------------------------------------------------- Done storing  # ---------------------------------------------------------------- Done storing
    $message.='<h3>Changes can take up to 10 minutes before being active for all students.'.&Apache::loncommon::help_open_topic('Caching').'</h3>';
     }      }
   # --------------------------------------------- Devalidate cache for this child
       &Apache::lonnet::devalidatecourseresdata(
                    $ENV{'course.'.$ENV{'request.course.id'}.'.num'},
                    $ENV{'course.'.$ENV{'request.course.id'}.'.domain'});
       &Apache::lonnet::clear_EXT_cache_status();
 # -------------------------------------------------------------- Get coursedata  # -------------------------------------------------------------- Get coursedata
     %courseopt = &Apache::lonnet::dump      %courseopt = &Apache::lonnet::dump
         ('resourcedata',          ('resourcedata',
Line 645  sub assessparms { Line 898  sub assessparms {
     if ($pscat[0] eq "all" || !@pscat) {@pscat = (keys %allparms);}      if ($pscat[0] eq "all" || !@pscat) {@pscat = (keys %allparms);}
     if ($psprt[0] eq "all" || !@psprt) {@psprt = (keys %allparts);}      if ($psprt[0] eq "all" || !@psprt) {@psprt = (keys %allparts);}
 # ------------------------------------------------------------------ Start page  # ------------------------------------------------------------------ Start page
     &startpage($r,$id,$udom,$csec,$uname);  
       my $have_assesments=1;
       if (scalar(keys(%allkeys)) eq 0) { $have_assesments=0; }
   
       &startpage($r,$id,$udom,$csec,$uname,$have_assesments);
   
       if (!$have_assesments) {
    untie(%bighash);
    untie(%parmhash);
    return '';
       }
 #    if ($ENV{'form.url'}) {  #    if ($ENV{'form.url'}) {
 # $r->print('<input type="hidden" value="'.$ENV{'form.url'}.  # $r->print('<input type="hidden" value="'.$ENV{'form.url'}.
 #  '" name="url"><input type="hidden" name="command" value="set">');  #  '" name="url"><input type="hidden" name="command" value="set">');
Line 660  sub assessparms { Line 923  sub assessparms {
   
     $r->print('<h2>'.$message.'</h2><table>');      $r->print('<h2>'.$message.'</h2><table>');
                                                   
     $r->print('<tr><td><hr /></td></tr>');      my $submitmessage = 'Update Section or Specific User';
   
     my $submitmessage;  
     if (($prevvisit) || ($pschp) || ($pssymb)) {  
         $submitmessage = "Update Display";  
     } else {  
         $submitmessage = "Display";  
     }  
     if (!$pssymb) {      if (!$pssymb) {
         $r->print('<tr><td>Select Parameter Level</td><td>');          $r->print('<tr><td>Select Parameter Level</td><td colspan="2">');
         $r->print('<select name="parmlev">');          $r->print('<select name="parmlev">');
         foreach (reverse sort keys %alllevs) {          foreach (reverse sort keys %alllevs) {
             $r->print('<option value="'.$alllevs{$_}.'"');              $r->print('<option value="'.$alllevs{$_}.'"');
Line 679  sub assessparms { Line 935  sub assessparms {
             $r->print('>'.$_.'</option>');              $r->print('>'.$_.'</option>');
         }          }
         $r->print("</select></td>\n");          $r->print("</select></td>\n");
       
         $r->print('<td><input type="submit" name="dis" value="'.$submitmessage.'"></td>');  
   
         $r->print('</tr><tr><td><hr /></td>');          $r->print('</tr>');
   
         $r->print('<tr><td>Select Enclosing Map</td>');          $r->print('<tr><td>Select Enclosing Map or Folder</td>');
         $r->print('<td colspan="2"><select name="pschp">');          $r->print('<td colspan="2"><select name="pschp">');
         $r->print('<option value="all">All Maps</option>');          $r->print('<option value="all">All Maps or Folders</option>');
         foreach (sort {$allmaps{$a} cmp $allmaps{$b}} keys %allmaps) {          foreach (sort {$allmaps{$a} cmp $allmaps{$b}} keys %allmaps) {
             $r->print('<option value="'.$_.'"');              $r->print('<option value="'.$_.'"');
             if (($pschp eq $_)) { $r->print(' selected'); }              if (($pschp eq $_)) { $r->print(' selected'); }
             $r->print('>/res/'.$allmaps{$_}.'</option>');              $r->print('>'.$maptitles{$_}.($allmaps{$_}!~/^uploaded/?'  ['.$allmaps{$_}.']':'').'</option>');
         }          }
         $r->print("</select></td></tr>\n");          $r->print("</select></td></tr>\n");
     } else {      } else {
         my ($map,$id,$resource)=split(/___/,$pssymb);          my ($map,$id,$resource)=&Apache::lonnet::decode_symb($pssymb);
         $r->print("<tr><td>Specific Resource</td><td>$resource</td>");          $r->print("<tr><td>Specific Resource</td><td>$resource</td>");
         $r->print('<td><input type="submit" name="dis" value="'.$submitmessage.'"></td>');          $r->print('<td><input type="submit" name="dis" value="'.$submitmessage.'"></td>');
         $r->print('</tr>');          $r->print('</tr>');
Line 703  sub assessparms { Line 957  sub assessparms {
   
     $r->print('<tr><td colspan="3"><hr /><input type="checkbox"');      $r->print('<tr><td colspan="3"><hr /><input type="checkbox"');
     if ($showoptions eq 'show') {$r->print(" checked ");}      if ($showoptions eq 'show') {$r->print(" checked ");}
     $r->print(' name="showoptions" value="show" onclick="form.submit();">Show More Options<hr /></td></tr>');      $r->print(' name="showoptions" value="show">Show More Options<hr /></td></tr>');
 #    $r->print("<tr><td>Show: $showoptions</td></tr>");  #    $r->print("<tr><td>Show: $showoptions</td></tr>");
 #    $r->print("<tr><td>pscat: @pscat</td></tr>");  #    $r->print("<tr><td>pscat: @pscat</td></tr>");
 #    $r->print("<tr><td>psprt: @psprt</td></tr>");  #    $r->print("<tr><td>psprt: @psprt</td></tr>");
Line 720  sub assessparms { Line 974  sub assessparms {
         $r->print('>All Parameters</td>');          $r->print('>All Parameters</td>');
   
         my $cnt=0;          my $cnt=0;
   
         foreach $tempkey (sort { $allparms{$a} cmp $allparms{$b} }          foreach $tempkey (sort { $allparms{$a} cmp $allparms{$b} }
                       keys %allparms ) {                        keys %allparms ) {
             ++$cnt;              ++$cnt;
Line 739  sub assessparms { Line 992  sub assessparms {
         $r->print('<option value="all"');          $r->print('<option value="all"');
         $r->print(' selected') unless (@psprt);          $r->print(' selected') unless (@psprt);
         $r->print('>All Parts</option>');          $r->print('>All Parts</option>');
           my %temphash=();
           foreach (@psprt) { $temphash{$_}=1; }
         foreach $tempkey (sort keys %allparts) {          foreach $tempkey (sort keys %allparts) {
             unless ($tempkey =~ /\./) {              unless ($tempkey =~ /\./) {
                 $r->print('<option value="'.$tempkey.'"');                  $r->print('<option value="'.$tempkey.'"');
                 if ($psprt[0] eq "all" ||  grep $_ == $tempkey, @psprt) {                  if ($psprt[0] eq "all" ||  $temphash{$tempkey}) {
                     $r->print(' selected');                      $r->print(' selected');
                 }                  }
                 $r->print('>'.$allparts{$tempkey}.'</option>');                  $r->print('>'.$allparts{$tempkey}.'</option>');
Line 752  sub assessparms { Line 1007  sub assessparms {
   
         $r->print('<tr><td>Sort list by</td><td>');          $r->print('<tr><td>Sort list by</td><td>');
         $r->print('<select name="fcat">');          $r->print('<select name="fcat">');
         $r->print('<option value="">Enclosing Map</option>');          $r->print('<option value="">Enclosing Map or Folder</option>');
         foreach (sort keys %allkeys) {          foreach (sort keys %allkeys) {
             $r->print('<option value="'.$_.'"');              $r->print('<option value="'.$_.'"');
             if ($fcat eq $_) { $r->print(' selected'); }              if ($fcat eq $_) { $r->print(' selected'); }
Line 787  sub assessparms { Line 1042  sub assessparms {
         }          }
   
     }      }
     $r->print('</table>');      $r->print('</table><br />');
       if (($prevvisit) || ($pschp) || ($pssymb)) {
           $submitmessage = "Update Course Assessment Parameter Display";
       } else {
           $submitmessage = "Set/Modify Course Assessment Parameters";
       }
       $r->print('<input type="submit" name="dis" value="'.$submitmessage.'">');
   
     my @temp_psprt;  #    my @temp_psprt;
     map {  #    foreach my $t (@psprt) {
          my $t = $_;  # push(@temp_psprt, grep {eval (/^$t\./ || ($_ == $t))} (keys %allparts));
          push(@temp_psprt,  #    }
          grep {eval (/^$t\./ || ($_ == $t))} (keys %allparts));  
     } @psprt;  
   
     @psprt = @temp_psprt;  #    @psprt = @temp_psprt;
   
     my @temp_pscat;      my @temp_pscat;
     map {      map {
Line 812  sub assessparms { Line 1071  sub assessparms {
         my $csuname=$ENV{'user.name'};          my $csuname=$ENV{'user.name'};
         my $csudom=$ENV{'user.domain'};          my $csudom=$ENV{'user.domain'};
   
   
         if ($parmlev eq 'full' || $parmlev eq 'brief') {          if ($parmlev eq 'full' || $parmlev eq 'brief') {
   
            my $coursespan=$csec?8:5;             my $coursespan=$csec?8:5;
            $r->print('<p><table border=2>');             $r->print('<p><table border=2>');
            $r->print('<tr><td colspan=5></td>');             $r->print('<tr><td colspan=5></td>');
Line 834  ENDTABLETWO Line 1091  ENDTABLETWO
            }             }
            $r->print(<<ENDTABLEHEADFOUR);             $r->print(<<ENDTABLEHEADFOUR);
 </tr><tr><th>Assessment URL and Title</th><th>Type</th>  </tr><tr><th>Assessment URL and Title</th><th>Type</th>
 <th>Enclosing Map</th><th>Part No.</th><th>Parameter Name</th>  <th>Enclosing Map or Folder</th><th>Part</th><th>Parameter Name</th>
 <th>default</th><th>from Enclosing Map</th>  <th>default</th><th>from Enclosing Map or Folder</th>
 <th>general</th><th>for Enclosing Map</th><th>for Resource</th>  <th>general</th><th>for Enclosing Map or Folder</th><th>for Resource</th>
 ENDTABLEHEADFOUR  ENDTABLEHEADFOUR
   
            if ($csec) {             if ($csec) {
                $r->print('<th>general</th><th>for Enclosing Map</th><th>for Resource</th>');                 $r->print('<th>general</th><th>for Enclosing Map or Folder</th><th>for Resource</th>');
            }             }
   
            if ($uname) {             if ($uname) {
                $r->print('<th>general</th><th>for Enclosing Map</th><th>for Resource</th>');                 $r->print('<th>general</th><th>for Enclosing Map or Folder</th><th>for Resource</th>');
            }             }
   
            $r->print('</tr>');             $r->print('</tr>');
Line 954  ENDTABLEHEADFOUR Line 1211  ENDTABLEHEADFOUR
   
 #-------------------------------------------- for each map, gather information  #-------------------------------------------- for each map, gather information
             my $mapid;              my $mapid;
             foreach $mapid (keys %maplist) {      foreach $mapid (sort {$maplist{$a} cmp $maplist{$b}} keys %maplist) {
                 my $maptitle = $allmaps{$mapid};                  my $maptitle = $maplist{$mapid};
   
 #-----------------------  loop through ids and get all parameter types for map  #-----------------------  loop through ids and get all parameter types for map
 #-----------------------------------------          and associated information  #-----------------------------------------          and associated information
Line 988  ENDTABLEHEADFOUR Line 1245  ENDTABLEHEADFOUR
                     foreach (split(/\,/,$keyp{$rid})) {                      foreach (split(/\,/,$keyp{$rid})) {
                       my $tempkeyp = $_;                        my $tempkeyp = $_;
                       my $fullkeyp = $tempkeyp;                        my $fullkeyp = $tempkeyp;
                       $tempkeyp =~ s/_[\d_]+_/_0_/;                        $tempkeyp =~ s/_\w+_/_0_/;
                                               
                       if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {                        if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {
                         $part{$tempkeyp}="0";                          $part{$tempkeyp}="0";
Line 996  ENDTABLEHEADFOUR Line 1253  ENDTABLEHEADFOUR
                         $display{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');                          $display{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');
                         unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; }                          unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; }
                         $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')';                          $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')';
                         $display{$tempkeyp} =~ s/_[\d_]+_/_0_/;                          $display{$tempkeyp} =~ s/_\w+_/_0_/;
                         $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp);                          $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp);
                         $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.type');                          $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.type');
                       }                        }
Line 1005  ENDTABLEHEADFOUR Line 1262  ENDTABLEHEADFOUR
                 } # end loop through ids                  } # end loop through ids
                                                                     
 #---------------------------------------------------- print header information  #---------------------------------------------------- print header information
                   my $foldermap=($maptitle=~/^uploaded/?'Folder':'Map');
                   my $showtitle=$maptitles{$maptitle}.($maptitle!~/^uploaded/?' ['.$maptitle.']':'');
                 $r->print(<<ENDMAPONE);                  $r->print(<<ENDMAPONE);
 <center><h4>  <center><h4>
 <font color="red">Set Defaults for All Resources in map  <font color="red">Set Defaults for All Resources in $foldermap<br />
 <i>$maptitle</i><br />  <i>$showtitle</i><br />
 Specifically for  Specifically for
 ENDMAPONE  ENDMAPONE
                 if ($uname) {                  if ($uname) {
Line 1070  ENDMAPONE Line 1329  ENDMAPONE
                 foreach (split(/\,/,$keyp{$rid})) {                  foreach (split(/\,/,$keyp{$rid})) {
                   my $tempkeyp = $_;                    my $tempkeyp = $_;
                   my $fullkeyp = $tempkeyp;                    my $fullkeyp = $tempkeyp;
                   $tempkeyp =~ s/_[\d_]+_/_0_/;                    $tempkeyp =~ s/_\w+_/_0_/;
                   if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {                    if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {
                     $part{$tempkeyp}="0";                      $part{$tempkeyp}="0";
                     $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name');                      $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name');
                     $display{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');                      $display{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');
                     unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; }                      unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; }
                     $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')';                      $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')';
                     $display{$tempkeyp} =~ s/_[\d_]+_/_0_/;                      $display{$tempkeyp} =~ s/_\w+_/_0_/;
                     $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp);                      $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp);
                     $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.type');                      $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.type');
                   }                    }
Line 1121  ENDMAPONE Line 1380  ENDMAPONE
     untie(%parmhash);      untie(%parmhash);
 } # end sub assessparms  } # end sub assessparms
   
 # ------------------------------------------- Set course environment parameters  
   ##################################################
   ##################################################
   
   =pod
   
   =item crsenv
   
   Show and set course data and parameters.  This is a large routine that should
   be simplified and shortened... someday.
   
   Inputs: $r
   
   Returns: nothing
   
   =cut
   
   ##################################################
   ##################################################
 sub crsenv {  sub crsenv {
     my $r=shift;      my $r=shift;
     my $setoutput='';      my $setoutput='';
       my $bodytag=&Apache::loncommon::bodytag(
                                'Set Course Environment Parameters');
     my $dom = $ENV{'course.'.$ENV{'request.course.id'}.'.domain'};      my $dom = $ENV{'course.'.$ENV{'request.course.id'}.'.domain'};
     my $crs = $ENV{'course.'.$ENV{'request.course.id'}.'.num'};      my $crs = $ENV{'course.'.$ENV{'request.course.id'}.'.num'};
 # -------------------------------------------------- Go through list of changes  
       #
       # Go through list of changes
     foreach (keys %ENV) {      foreach (keys %ENV) {
  if ($_=~/^form\.(.+)\_setparmval$/) {          next if ($_!~/^form\.(.+)\_setparmval$/);
             my $name=$1;          my $name  = $1;
             my $value=$ENV{'form.'.$name.'_value'};          my $value = $ENV{'form.'.$name.'_value'};
             if ($name eq 'newp') {          if ($name eq 'newp') {
                 $name=$ENV{'form.newp_name'};              $name = $ENV{'form.newp_name'};
           }
           if ($name eq 'url') {
               $value=~s/^\/res\///;
               my $bkuptime=time;
               my @tmp = &Apache::lonnet::get
                   ('environment',['url'],$dom,$crs);
               $setoutput.='Backing up previous URL: '.
                   &Apache::lonnet::put
                   ('environment',
                    {'top level map backup '.$bkuptime => $tmp[1] },
                    $dom,$crs).
                        '<br>';
           }
           #
           # Deal with modified default spreadsheets
           if ($name =~ /^spreadsheet_default_(classcalc|
                                               studentcalc|
                                               assesscalc)$/x) {
               my $sheettype = $1; 
               if ($sheettype eq 'classcalc') {
                   # no need to do anything since viewing the sheet will
                   # cause it to be updated. 
               } elsif ($sheettype eq 'studentcalc') {
                   # expire all the student spreadsheets
                   &Apache::lonnet::expirespread('','','studentcalc');
               } else {
                   # expire all the assessment spreadsheets 
                   #    this includes non-default spreadsheets, but better to
                   #    be safe than sorry.
                   &Apache::lonnet::expirespread('','','assesscalc');
                   # expire all the student spreadsheets
                   &Apache::lonnet::expirespread('','','studentcalc');
             }              }
             if ($name eq 'url') {          }
  $value=~s/^\/res\///;          #
                 my @tmp = &Apache::lonnet::get          # Deal with the enrollment dates
                     ('environment',['url'],$dom,$crs);          if ($name =~ /^default_enrollment_(start|end)_date$/) {
                 $setoutput.='Backing up previous URL: '.              $value=&Apache::lonhtmlcommon::get_date_from_form($name.'_value');
                     &Apache::lonnet::put          }
                         ('environment',          #
                          {'top level map backup ' => $tmp[1] },          # Let the user know we made the changes
                          $dom,$crs).          if ($name) {
                     '<br>';              my $put_result = &Apache::lonnet::put('environment',
                                                     {$name=>$value},$dom,$crs);
               if ($put_result eq 'ok') {
                   $setoutput.='Set <b>'.$name.'</b> to <b>'.$value.'</b>.<br />';
               } else {
                   $setoutput.='Unable to set <b>'.$name.'</b> to '.
                       '<b>'.$value.'</b> due to '.$put_result.'.<br />';
             }              }
             if ($name) {  
                 $setoutput.='Setting <tt>'.$name.'</tt> to <tt>'.  
                     $value.'</tt>: '.  
                     &Apache::lonnet::put  
                             ('environment',{$name=>$value},$dom,$crs).  
                     '<br>';  
     }  
         }          }
     }      }
   # ------------------------- Re-init course environment entries for this session
   
       &Apache::lonnet::coursedescription($ENV{'request.course.id'});
   
 # -------------------------------------------------------- Get parameters again  # -------------------------------------------------------- Get parameters again
   
     my %values=&Apache::lonnet::dump('environment',$dom,$crs);      my %values=&Apache::lonnet::dump('environment',$dom,$crs);
Line 1164  sub crsenv { Line 1480  sub crsenv {
     ('url'            => '<b>Top Level Map</b> '.      ('url'            => '<b>Top Level Map</b> '.
                                  '<a href="javascript:openbrowser'.                                   '<a href="javascript:openbrowser'.
                                  "('envform','url','sequence')\">".                                   "('envform','url','sequence')\">".
                                  'Browse</a><br><font color=red> '.                                   'Select Map</a><br /><font color=red> '.
                                  'Modification may make assessment data '.                                   'Modification may make assessment data '.
                                  'inaccessible</font>',                                   'inaccessible</font>',
              'description'    => '<b>Course Description</b>',               'description'    => '<b>Course Description</b>',
              'courseid'       => '<b>Course ID or number</b><br>'.               'courseid'       => '<b>Course ID or number</b><br />'.
                                  '(internal, optional)',                                   '(internal, optional)',
                'grading'        => '<b>Grading</b>'.
                                    '"standard" or any other value.  '.
                                    'Default for new courses is "standard".',
   
              'default_xml_style' => '<b>Default XML Style File</b> '.               'default_xml_style' => '<b>Default XML Style File</b> '.
                     '<a href="javascript:openbrowser'.                      '<a href="javascript:openbrowser'.
                     "('envform','default_xml_style'".                      "('envform','default_xml_style'".
                     ",'sty')\">Browse</a><br>",                      ",'sty')\">Select Style File</a><br>",
              'question.email' => '<b>Feedback Addresses for Content '.               'question.email' => '<b>Feedback Addresses for Resource Content '.
                                  'Questions</b><br>(<tt>user:domain,'.                                   'Questions</b><br />(<tt>user:domain,'.
                                  'user:domain,...</tt>)',                                   'user:domain(section;section;...;*;...),...</tt>)',
              'comment.email'  => '<b>Feedback Addresses for Comments</b><br>'.               'comment.email'  => '<b>Feedback Addresses for Course Content Comments</b><br />'.
                                  '(<tt>user:domain,user:domain,...</tt>)',                                   '(<tt>user:domain,user:domain(section;section;...;*;...),...</tt>)',
              'policy.email'   => '<b>Feedback Addresses for Course Policy</b>'.               'policy.email'   => '<b>Feedback Addresses for Course Policy</b>'.
                                  '<br>(<tt>user:domain,user:domain,...</tt>)',                                   '<br />(<tt>user:domain,user:domain(section;section;...;*;...),...</tt>)',
              'hideemptyrows'  => '<b>Hide Empty Rows in Spreadsheets</b><br>'.               'hideemptyrows'  => '<b>Hide Empty Rows in Spreadsheets</b><br />'.
                                  '("<tt>yes</tt>" for default hiding)',                                   '("<tt>yes</tt>" for default hiding)',
              'pageseparators'  => '<b>Visibly Separate Items on Pages</b><br>'.               'pageseparators'  => '<b>Visibly Separate Items on Pages</b><br />'.
                                  '("<tt>yes</tt>" for visible separation)',                                   '("<tt>yes</tt>" for visible separation, '.
                                    'changes will not show until next login)',
   
                'plc.roles.denied'=> '<b>Disallow live chatroom use for '.
                                     'Roles</b><br />"<tt>st</tt>": '.
                                     'student, "<tt>ta</tt>": '.
                                     'TA, "<tt>in</tt>": '.
                                     'instructor;<br /><tt>role,role,...</tt>) '.
          Apache::loncommon::help_open_topic("Course_Disable_Discussion"),
                'plc.users.denied' => 
                             '<b>Disallow live chatroom use for Users</b><br />'.
                                    '(<tt>user:domain,user:domain,...</tt>)',
   
              'pch.roles.denied'=> '<b>Disallow Resource Discussion for '.               'pch.roles.denied'=> '<b>Disallow Resource Discussion for '.
                                   'Roles</b> ' .                                     'Roles</b><br />"<tt>st</tt>": '.
    Apache::loncommon::help_open_topic("Course_Disable_Discussion")                                    'student, "<tt>ta</tt>": '.
                           ,                                    'TA, "<tt>in</tt>": '.
                                     'instructor;<br /><tt>role,role,...</tt>) '.
          Apache::loncommon::help_open_topic("Course_Disable_Discussion"),
              'pch.users.denied' =>                'pch.users.denied' => 
                           '<b>Disallow Resource Discussion for Users</b><br>'.                            '<b>Disallow Resource Discussion for Users</b><br />'.
                                  '(<tt>user:domain,user:domain,...</tt>)',                                   '(<tt>user:domain,user:domain,...</tt>)',
              'spreadsheet_default_classcalc'                'spreadsheet_default_classcalc' 
                  => '<b>Default Course Spreadsheet</b> '.                   => '<b>Default Course Spreadsheet</b> '.
                     '<a href="javascript:openbrowser'.                      '<a href="javascript:openbrowser'.
                     "('envform','spreadsheet_default_classcalc'".                      "('envform','spreadsheet_default_classcalc'".
                     ",'spreadsheet')\">Browse</a><br>",                      ",'spreadsheet')\">Select Spreadsheet File</a><br />",
              'spreadsheet_default_studentcalc'                'spreadsheet_default_studentcalc' 
                  => '<b>Default Student Spreadsheet</b> '.                   => '<b>Default Student Spreadsheet</b> '.
                     '<a href="javascript:openbrowser'.                      '<a href="javascript:openbrowser'.
                     "('envform','spreadsheet_default_calc'".                      "('envform','spreadsheet_default_calc'".
                     ",'spreadsheet')\">Browse</a><br>",                      ",'spreadsheet')\">Select Spreadsheet File</a><br />",
              'spreadsheet_default_assesscalc'                'spreadsheet_default_assesscalc' 
                  => '<b>Default Assessment Spreadsheet</b> '.                   => '<b>Default Assessment Spreadsheet</b> '.
                     '<a href="javascript:openbrowser'.                      '<a href="javascript:openbrowser'.
                     "('envform','spreadsheet_default_assesscalc'".                      "('envform','spreadsheet_default_assesscalc'".
                     ",'spreadsheet')\">Browse</a><br>",                      ",'spreadsheet')\">Select Spreadsheet File</a><br />",
              );       'allow_limited_html_in_feedback'
  foreach (keys(%values)) {           => '<b>Allow limited HTML in discussion posts</b><br />'.
     unless ($descriptions{$_}) {              '(Set value to "<tt>yes</tt>" to allow)',
  $descriptions{$_}=$_;       'rndseed'
            => '<b>Randomization algorithm used</b> <br />'.
                       '<font color="red">Modifying this will make problems '.
                       'have different numbers and answers</font>',
                'problem_stream_switch'
                    => '<b>Allow problems to be split over pages</b><br />'.
                       ' ("<tt>yes</tt>" if allowed, anything else if not)',
                'anonymous_quiz'
                    => '<b>Anonimous quiz/exam</b><br />'.
                       ' (<tt><b>yes</b> to avoid print students names </tt>)',
                'default_enrollment_start_date' => '<b>Default beginning date '.
                                                   'when enrolling students</b>',
                'default_enrollment_end_date'   => '<b>Default ending date '.
                                                   'when enrolling students</b>',
                'languages' => '<b>Languages used</b>',
                'disable_receipt_display'
                    => '<b>Disable display of problem receipts</b><br />'.
                       ' ("<tt>yes</tt>" to disable, anything else if not)'
                ); 
           my @Display_Order = ('url','description','courseid','grading',
                                'default_xml_style','pageseparators',
                                'question.email','comment.email','policy.email',
                                'plc.roles.denied','plc.users.denied',
                                'pch.roles.denied','pch.users.denied',
                                'allow_limited_html_in_feedback',
                                'languages',
                                'rndseed',
                                'problem_stream_switch',
                                'disable_receipt_display',
                                'spreadsheet_default_classcalc',
                                'spreadsheet_default_studentcalc',
                                'spreadsheet_default_assesscalc', 
                                'hideemptyrows',
                                'default_enrollment_start_date',
                                'default_enrollment_end_date',
                                );
    foreach my $parameter (sort(keys(%values))) {
       if (! $descriptions{$parameter}) {
                   $descriptions{$parameter}=$parameter;
                   push(@Display_Order,$parameter);
     }      }
  }   }
  foreach (sort keys %descriptions) {          foreach my $parameter (@Display_Order) {
               my $description = $descriptions{$parameter};
             # onchange is javascript to automatically check the 'Set' button.              # onchange is javascript to automatically check the 'Set' button.
             my $onchange = 'onchange="javascript:window.document.forms'.              my $onchange = 'onFocus="javascript:window.document.forms'.
                 '[\'envform\'].elements[\''.$_.'_setparmval\']'.                  "['envform'].elements['".$parameter."_setparmval']".
                 '.checked=true;"';                  '.checked=true;"';
     $output.='<tr><td>'.$descriptions{$_}.'</td>'.              $output .= '<tr><td>'.$description.'</td>';
                 '<td><input name="'.$_.'_value" size=40 '.              if ($parameter =~ /^default_enrollment_(start|end)_date$/) {
                 'value="'.$values{$_}.'" '.$onchange.' /></td>'.                  $output .= '<td>'.
                 '<td><input type=checkbox name="'.$_.'_setparmval"></td>'.                      &Apache::lonhtmlcommon::date_setter('envform',
                 '</tr>'."\n";                                                          $parameter.'_value',
                                                           $values{$parameter},
                                                           $onchange).
                                                           '</td>';
               } else {
                   $output .= '<td>'.
                       &Apache::lonhtmlcommon::textbox($parameter.'_value',
                                                       $values{$parameter},
                                                       40,$onchange).'</td>';
               }
               $output .= '<td>'.
                   &Apache::lonhtmlcommon::checkbox($parameter.'_setparmval').
                   '</td>';
               $output .= "</tr>\n";
  }   }
         my $onchange = 'onchange="javascript:window.document.forms'.          my $onchange = 'onFocus="javascript:window.document.forms'.
             '[\'envform\'].elements[\'newp_setparmval\']'.              '[\'envform\'].elements[\'newp_setparmval\']'.
             '.checked=true;"';              '.checked=true;"';
  $output.='<tr><td><i>Create New Environment Variable</i><br />'.   $output.='<tr><td><i>Create New Environment Variable</i><br />'.
Line 1263  sub crsenv { Line 1650  sub crsenv {
 <head>  <head>
 <title>LON-CAPA Course Environment</title>  <title>LON-CAPA Course Environment</title>
 </head>  </head>
 <body bgcolor="#FFFFFF">  $bodytag
 <h1>Set Course Parameters</h1>  
 <form method="post" action="/adm/parmset" name="envform">  <form method="post" action="/adm/parmset" name="envform">
 <h2>Course: $ENV{'course.'.$ENV{'request.course.id'}.'.description'}</h2>  
 <h3>Course Environment</h3>  
 $setoutput  $setoutput
 <p>  <p>
 <table border=2>  <table border=2>
Line 1280  $output Line 1664  $output
 </html>      </html>    
 ENDENV  ENDENV
 }  }
   ##################################################
   
 # ================================================================ Main Handler  my $tableopen;
   
   sub tablestart {
       if ($tableopen) {
    return '';
       } else {
    $tableopen=1;
    return '<table border="2"><tr><th>Parameter</th><th>Delete</th><th>Set to ...</th></tr>';
       }
   }
   
   sub tableend {
       if ($tableopen) {
    $tableopen=0;
    return '</table>';
       } else {
    return'';
       }
   }
   
   sub overview {
       my $r=shift;
       my $bodytag=&Apache::loncommon::bodytag(
                                'Set/Modify Course Assessment Parameters');
       my $dom = $ENV{'course.'.$ENV{'request.course.id'}.'.domain'};
       my $crs = $ENV{'course.'.$ENV{'request.course.id'}.'.num'};
       $r->print(<<ENDOVER);
   <html>
   <head>
   <title>LON-CAPA Course Environment</title>
   </head>
   $bodytag
   <form method="post" action="/adm/parmset" name="overviewform">
   <input type="hidden" name="overview" value="1" />
   ENDOVER
   # Setting
       my %olddata=&Apache::lonnet::dump('resourcedata',$dom,$crs);
       my %newdata=();
       undef %newdata;
       my @deldata=();
       undef @deldata;
       foreach (keys %ENV) {
    if ($_=~/^form\.([a-z]+)\_(.+)$/) {
       my $cmd=$1;
       my $thiskey=$2;
       if ($cmd eq 'set') {
    my $data=$ENV{$_};
    if ($olddata{$thiskey} ne $data) { $newdata{$thiskey}=$data; }
       } elsif ($cmd eq 'del') {
    push (@deldata,$thiskey);
       } elsif ($cmd eq 'datepointer') {
    my $data=&Apache::lonhtmlcommon::get_date_from_form($ENV{$_});
    if ($olddata{$thiskey} ne $data) { $newdata{$thiskey}=$data; }
       }
    }
       }
   # Store
       &Apache::lonnet::del('resourcedata',\@deldata,$dom,$crs);
       &Apache::lonnet::put('resourcedata',\%newdata,$dom,$crs);
   # Read and display
       my %resourcedata=&Apache::lonnet::dump('resourcedata',$dom,$crs);
       my $oldsection='';
       my $oldrealm='';
       my $oldpart='';
       my $pointer=0;
       $tableopen=0;
       foreach my $thiskey (sort keys %resourcedata) {
    if ($resourcedata{$thiskey.'.type'}) {
       my ($course,$middle,$part,$name)=
    ($thiskey=~/^(\w+)\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);
       my $section='All Students';
       if ($middle=~/^\[(.*)\]\./) {
    $section='Group/Section: '.$1;
    $middle=~s/^\[(.*)\]\.//;
       }
       $middle=~s/\.$//;
       my $realm='<font color="red">All Resources</font>';
       if ($middle=~/^(.+)\_\_\_\(all\)$/) {
    $realm='<font color="green">Folder/Map: '.&Apache::lonnet::gettitle($1).'</font>';
       } elsif ($middle) {
    $realm='<font color="orange">Resource: '.&Apache::lonnet::gettitle($middle).'</font>';
       }
       if ($section ne $oldsection) {
    $r->print(&tableend()."\n<hr /><h1>$section</h1>");
    $oldsection=$section;
    $oldrealm='';
       }
       if ($realm ne $oldrealm) {
    $r->print(&tableend()."\n<h2>$realm</h2>");
    $oldrealm=$realm;
    $oldpart='';
       }
       if ($part ne $oldpart) {
    $r->print(&tableend().
     "\n<h3><font color='blue'>Part: $part</font></h3>");
    $oldpart=$part;
       }
   #
   # Ready to print
   #
       $r->print(&tablestart().'<tr><td><b>'.$name.
         ':</b></td><td><input type="checkbox" name="del_'.
         $thiskey.'" /></td><td>');
       if ($resourcedata{$thiskey.'.type'}=~/^date/) {
    my $jskey='key_'.$pointer;
    $pointer++;
    $r->print(
     &Apache::lonhtmlcommon::date_setter('overviewform',
         $jskey,
         $resourcedata{$thiskey}).
   '<input type="hidden" name="datepointer_'.$thiskey.'" value="'.$jskey.'" />'
     );
       } else {
    $r->print(
     '<input type="text" name="set_'.$thiskey.'" value="'.
     $resourcedata{$thiskey}.'">');
       }
       $r->print('</td></tr>');
    }
       }
       
       $r->print(&tableend().
         '<p><input type="submit" value="Modify Parameters" /></p></form></body></html>');
   }
   
   ##################################################
   ##################################################
   
   =pod
   
   =item * handler
   
   Main handler.  Calls &assessparms and &crsenv subroutines.
   
   =cut
   
   ##################################################
   ##################################################
       use Data::Dumper;
 sub handler {  sub handler {
     my $r=shift;      my $r=shift;
   
Line 1292  sub handler { Line 1814  sub handler {
  return OK;   return OK;
     }      }
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'});      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'});
   
 # ----------------------------------------------------- Needs to be in a course  # ----------------------------------------------------- Needs to be in a course
   
     if (($ENV{'request.course.id'}) &&       if (($ENV{'request.course.id'}) && 
  (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'}))) {   (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'}))) {
   
           $r->content_type('text/html');
           $r->send_http_header;
     
         $coursename=$ENV{'course.'.$ENV{'request.course.id'}.'.description'};          $coursename=$ENV{'course.'.$ENV{'request.course.id'}.'.description'};
   
  unless (($ENV{'form.crsenv'}) || (!$ENV{'request.course.fn'})) {   if (($ENV{'form.crsenv'}) || (!$ENV{'request.course.fn'})) {
 # --------------------------------------------------------- Bring up assessment  
     &assessparms($r);  
 # ---------------------------------------------- This is for course environment  # ---------------------------------------------- This is for course environment
  } else {  # -------------------------- also call if toplevel map coudl not be initialized
     &crsenv($r);      &crsenv($r);
    } elsif ($ENV{'form.overview'}) {
   # --------------------------------------------------------------- Overview mode
       &overview($r);
    } else {
   # --------------------------------------------------------- Bring up assessment
       &assessparms($r);
  }   }
     } else {      } else {
 # ----------------------------- Not in a course, or not allowed to modify parms  # ----------------------------- Not in a course, or not allowed to modify parms
Line 1318  sub handler { Line 1848  sub handler {
 1;  1;
 __END__  __END__
   
   =pod
 =head1 NAME  
   
 Apache::lonparmset - Handler to set parameters for assessments  
   
 =head1 SYNOPSIS  
   
 Invoked by /etc/httpd/conf/srm.conf:  
   
  <Location /adm/parmset>  
  PerlAccessHandler       Apache::lonacc  
  SetHandler perl-script  
  PerlHandler Apache::lonparmset  
  ErrorDocument     403 /adm/login  
  ErrorDocument     406 /adm/roles  
  ErrorDocument  500 /adm/errorhandler  
  </Location>  
   
 =head1 INTRODUCTION  
   
 This module sets assessment parameters.  
   
 This is part of the LearningOnline Network with CAPA project  
 described at http://www.lon-capa.org.  
   
 =head1 HANDLER SUBROUTINE  
   
 This routine is called by Apache and mod_perl.  
   
 =over 4  
   
 =item *  
   
 need to be in course  
   
 =item *  
   
 bring up assessment screen or course environment  
   
 =back  
   
 =head1 OTHER SUBROUTINES  
   
 =over 4  
   
 =item *  
   
 parmval() : figure out a cascading parameter  
   
 =item *  
   
 valout() : format a value for output  
   
 =item *  
   
 plink() : produces link anchor  
   
 =item *  
   
 assessparms() : show assess data and parameters  
   
 =item *  
   
 crsenv() : for the course environment  
   
 =back  =back
   

Removed from v.1.57  
changed lines
  Added in v.1.125


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