Diff for /loncom/interface/Attic/londropadd.pm between versions 1.11 and 1.52

version 1.11, 2001/02/14 12:29:25 version 1.52, 2002/09/24 18:24:43
Line 1 Line 1
 # The LearningOnline Network with CAPA  # The LearningOnline Network with CAPA
 # Handler to drop and add students in courses   # Handler to drop and add students in courses 
 #  #
 # (Handler to set parameters for assessments  # $Id$
 #  #
 # (Handler to resolve ambiguous file locations  # Copyright Michigan State University Board of Trustees
 #  #
 # (TeX Content Handler  # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
   #
   # LON-CAPA is free software; you can redistribute it and/or modify
   # it under the terms of the GNU General Public License as published by
   # the Free Software Foundation; either version 2 of the License, or
   # (at your option) any later version.
   #
   # LON-CAPA is distributed in the hope that it will be useful,
   # but WITHOUT ANY WARRANTY; without even the implied warranty of
   # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   # GNU General Public License for more details.
   #
   # You should have received a copy of the GNU General Public License
   # along with LON-CAPA; if not, write to the Free Software
   # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 #  #
 # 05/29/00,05/30,10/11 Gerd Kortemeyer)  # /home/httpd/html/adm/gpl.txt
 #  #
 # 10/11,10/12,10/16 Gerd Kortemeyer)  # http://www.lon-capa.org/
 #  #
 # 11/20,11/21,11/22,11/23,11/24,11/25,11/27,11/28,  # (Handler to set parameters for assessments
 # 12/08,12/12 Gerd Kortemeyer)  #
   # (Handler to resolve ambiguous file locations
 #  #
 # 12/26,12/27,12/28,  # (TeX Content Handler
 # 01/01/01,01/15,02/10,02/13,02/14 Gerd Kortemeyer  #
   ###############################################################
   ###############################################################
   
 package Apache::londropadd;  package Apache::londropadd;
   
 use strict;  use strict;
 use Apache::lonnet;  use Apache::lonnet();
   use Apache::loncommon();
   use Apache::lonhtmlcommon();
 use Apache::Constants qw(:common :http REDIRECT);  use Apache::Constants qw(:common :http REDIRECT);
   
 # ================================================================ Print header  ###############################################################
   ###############################################################
 sub header {  sub header {
     my $r=shift;      my $bodytag=&Apache::loncommon::bodytag('Enrollment Manager');
     $r->print(<<ENDHEAD);      return(<<ENDHEAD);
 <html>  <html>
 <head>  <head>
 <title>LON-CAPA Student Drop/Add</title>  <title>LON-CAPA Enrollment Manager</title>
 </head>  </head>
 <body bgcolor="#FFFFFF">  $bodytag
 <img align=right src=/adm/lonIcons/lonlogos.gif>  <form method="post" enctype="multipart/form-data"  
 <h1>Drop/Add Students</h1>        action="/adm/dropadd" name="studentform">
 <form method="post" enctype="multipart/form-data"  
 action="/adm/dropadd" name="studentform">  
 <h2>Course: $ENV{'course.'.$ENV{'request.course.id'}.'.description'}</h2>  
 ENDHEAD  ENDHEAD
 }  }
   
 # ========================================================= Store uploaded file  ###############################################################
 # needs $ENV{'form.upfile'}  ###############################################################
 # return $datatoken to be put into hidden field  # Drop student from all sections of a course, except optional $csec
   sub modifystudent {
 sub upfile_store {      my ($udom,$unam,$courseid,$csec,$desiredhost)=@_;
     my $r=shift;      # if $csec is undefined, drop the student from all the courses matching
     $ENV{'form.upfile'}=~s/\r/\n/gs;      # this one.  If $csec is defined, drop them from all other sections of 
     $ENV{'form.upfile'}=~s/\f/\n/gs;      # this course and add them to section $csec
     $ENV{'form.upfile'}=~s/\n+/\n/gs;      $courseid=~s/\_/\//g;
     $ENV{'form.upfile'}=~s/\n+$//gs;      $courseid=~s/^(\w)/\/$1/;
             my %roles = &Apache::lonnet::dump('roles',$udom,$unam);
     my $datatoken=$ENV{'user.name'}.'_'.$ENV{'user.domain'}.      my ($tmp) = keys(%roles);
   '_enroll_'.$ENV{'request.course.id'}.'_'.time.'_'.$$;      # Bail out if we were unable to get the students roles
     {      return "$1" if ($tmp =~ /^(con_lost|error|no_such_host)/i);
        my $fh=Apache::File->new('>'.$r->dir_config('lonDaemons').      # Go through the roles looking for enrollment in this course
                                    '/tmp/'.$datatoken.'.tmp');      my $result = '';
        print $fh $ENV{'form.upfile'};      foreach my $course (keys(%roles)) {
     }          if ($course=~/^$courseid(?:\/)*(?:\s+)*(\w+)*\_st$/) {
     return $datatoken;              # We are in this course
 }              my $section=$1;
               $section='' if ($course eq $courseid.'_st');
 # ================================================= Load uploaded file from tmp              if ( ((!$section) && (!$csec)) || ($section ne $csec) ) {
 # needs $ENV{'form.datatoken'}                  my (undef,$end,$start)=split(/\_/,$roles{$course});
 # sets $ENV{'form.upfile'}                  my $now=time;
                   # if this is an active role 
 sub load_tmp_file {                  if (!($start && ($now<$start)) || !($end && ($now>$end))) {
     my $r=shift;                      my $reply=&Apache::lonnet::modifystudent
     my @studentdata=();                          ($udom,$unam,'','','','','','','',
     {                           $section,time,undef,undef,$desiredhost);
       my $fh;                      $result .= $reply.':';
       if ($fh=Apache::File->new($r->dir_config('lonDaemons').                  }
   '/tmp/'.$ENV{'form.datatoken'}.'.tmp')) {              }
      @studentdata=<$fh>;          }
       }  
     }      }
     $ENV{'form.upfile'}=join('',@studentdata);      if ($result eq '') {
 }          $result eq 'Unable to find section for this student';
   
 # ========================================= Separate uploaded file into records  
 # returns array of records  
   
 sub upfile_record_sep {  
     if ($ENV{'form.upfiletype'} eq 'xml') {  
     } else {      } else {
        return split(/\n/,$ENV{'form.upfile'});          $result =~ s/(ok:)+/ok/g;
     }      }
       return $result;
 }  }
   
 # =============================================== Separate a record into fields  ###############################################################
   ###############################################################
 sub record_sep {  # build a domain and server selection form
     my $record=shift;  sub domain_form {
     my %components=();      my ($defdom) = @_;
     if ($ENV{'form.upfiletype'} eq 'xml') {      # Set up domain and server selection forms
     } elsif ($ENV{'form.upfiletype'} eq 'space') {      #
         my $i=0;      # Get the domains
         map {      my @domains = &Apache::loncommon::get_domains();
             my $field=$_;      # build up the menu information to be passed to 
             $field=~s/^(\"|\')//;      # &Apache::loncommon::linked_select_forms
             $field=~s/(\"|\')$//;      my %select_menus;
             $components{$i}=$field;      foreach my $dom (@domains) {
             $i++;          # set up the text for this domain
         } split(/\s+/,$record);          $select_menus{$dom}->{'text'}= $dom;
     } elsif ($ENV{'form.upfiletype'} eq 'tab') {          # we want a choice of 'default' as the default in the second menu
         my $i=0;          $select_menus{$dom}->{'default'}= 'default';
         map {          $select_menus{$dom}->{'select2'}->{'default'} = 'default';
             my $field=$_;          # Now build up the other items in the second menu
             $field=~s/^(\"|\')//;          my %servers = &Apache::loncommon::get_library_servers($dom);
             $field=~s/(\"|\')$//;          foreach my $server (keys(%servers)) {
             $components{$i}=$field;              $select_menus{$dom}->{'select2'}->{$server} 
             $i++;                                              = "$server $servers{$server}";
         } split(/\t+/,$record);          
     } else {  
         my @allfields=split(/\,/,$record);  
         my $i=0;  
         my $j;  
         for ($j=0;$j<=$#allfields;$j++) {  
             my $field=$allfields[$j];  
             if ($field=~/^\s*(\"|\')/) {  
  my $delimiter=$1;  
                 while (($field!~/$delimiter$/) && ($j<$#allfields)) {  
     $j++;  
     $field.=','.$allfields[$j];  
  }  
                 $field=~s/^\s*$delimiter//;  
                 $field=~s/$delimiter\s*$//;  
             }  
             $components{$i}=$field;  
     $i++;  
         }          }
     }      }
     return %components;      my $result  = &Apache::loncommon::linked_select_forms
 }          ('studentform',' with home server ',$defdom,
            'lcdomain','lcserver',\%select_menus);
 # =========== Drop student from all sections of a course, except optional $csec      return $result;
   
 sub dropstudent {  
      my ($udom,$unam,$courseid,$csec)=@_;  
      $courseid=~s/\_/\//g;  
      $courseid=~s/^(\w)/\/$1/;  
      map {  
         my ($key,$value)=split(/\=/,$_);  
         $key=&Apache::lonnet::unescape($key);  
         if ($key=~/^$courseid(?:\/)*(\w+)*\_st$/) {  
           my $section=$1;  
           if ($key eq $courseid.'_st') { $section=''; }  
           if ($section ne $csec) {  
     my ($dummy,$end,$start)=split(/\_/,  
                                     &Apache::lonnet::unescape($value));  
             my $now=time;  
             my $notactive=0;  
             if ($start) {  
  if ($now<$start) { $notactive=1; }  
             }  
             if ($end) {  
                 if ($now>$end) { $notactive=1; }  
             }   
             unless ($notactive) {  
                 my $reply=&Apache::lonnet::modifystudent(  
                                    $udom,$unam,'','','',  
            '','','','',$section,time);  
             }  
   }  
         }  
     } split(/\&/,&Apache::lonnet::reply('dump:'.$udom.':'.$unam.':roles',  
                                  &Apache::lonnet::homeserver($unam,$udom)));  
 }  
   
 # ============================================================== Menu Phase One  
   
 sub menu_phase_one {  
     my $r=shift;  
     $r->print(<<ENDUPFORM);  
 <input type=hidden name=phase value=two>  
 <hr>  
 <h3>Upload a courselist</h3>  
 <input type=file name=upfile size=50>  
 <br>Type: <select name=upfiletype>  
 <option value=csv>CSV (comma separated values, spreadsheet)</option>  
 <option value=space>Space separated</option>  
 <option value=tab>Tabulator separated</option>  
 <option value=xml>HTML/XML</option>  
 </select>  
 <p><input type=submit name=fileupload value="Upload Courselist">  
 <hr>  
 <h3>Enroll a single student</h3>  
 <p><input type=submit name=enroll value="Enroll Student">  
 <hr>  
 <h3>Drop students</h3>  
 <p><input type=submit name=drop value="Selection List">  
 ENDUPFORM  
 }  }
   
 # ======================================================= Menu Phase Two Upload  ###############################################################
   ###############################################################
 sub menu_phase_two_upload {  #  Menu Phase One
   sub print_main_menu {
     my $r=shift;      my $r=shift;
       $r->print(<<END);
     my $datatoken=&upfile_store($r);  <p>
   <font size="+1">
     my @records=&upfile_record_sep();      <a href="/adm/dropadd?action=upload">Upload a course list</a>
     my $total=$#records;  </font>
     my $distotal=$total+1;  </p><p>
       <font size="+1">
     $ENV{'SERVER_NAME'}=~/(\w+\.\w+)$/;      <a href="/adm/dropadd?action=enrollstudent">Enroll a single student</a>
     my $krbdefdom=$1;  </font>
     $krbdefdom=~tr/a-z/A-Z/;  </p><p>
   <font size="+1">
     my $today=time;      <a href="/adm/dropadd?action=modifystudent">Modify student data</a>
     my $halfyear=$today+15552000;  </font>
   </p><p>
     my $defdom=$r->dir_config('lonDefDomain');  <font size="+1">
       <a href="/adm/dropadd?action=classlist">View Classlist</a>
   </font>
   </p><p>
   <font size="+1">
       <a href="/adm/dropadd?action=drop">Drop Students</a>
   </font>
   </p>
   END
   }
   
   ###############################################################
   ###############################################################
   sub print_upload_manager_header {
       my ($r,$datatoken,$distotal,$krbdefdom)=@_;
       my $javascript;
       if (! exists($ENV{'form.upfile_associate'})) {
           $ENV{'form.upfile_associate'} = 'forward';
       }
       if ($ENV{'form.associate'} eq 'Reverse Association') {
           if ( $ENV{'form.upfile_associate'} ne 'reverse' ) {
               $ENV{'form.upfile_associate'} = 'reverse';
           } else {
               $ENV{'form.upfile_associate'} = 'forward';
           }
       }
       if ($ENV{'form.upfile_associate'} eq 'reverse') {
    $javascript=&upload_manager_javascript_reverse_associate();
       } else {
    $javascript=&upload_manager_javascript_forward_associate();
       }
       my $javascript_validations=&javascript_validations($krbdefdom);
     $r->print(<<ENDPICK);      $r->print(<<ENDPICK);
 <input type=hidden name=phase value=three>  <h3>Uploading Class List</h3>
 <input type=hidden name=datatoken value="$datatoken">  
 <input type=hidden name=upfiletype value=$ENV{'form.upfiletype'}>  
 <hr>  <hr>
 <h3>Identify fields</h3>  <h3>Identify fields</h3>
 Total number of records found in file: $distotal  Total number of records found in file: $distotal <hr />
 <script>  Enter as many fields as you can. The system will inform you and bring you back
 function verify(vf) {  to this page if the data selected is insufficient to run your class.<hr />
     var founduname=0;  <input type="button" value="Reverse Association" onClick="javascript:this.form.associate.value='Reverse Association';submit(this.form);" />
     var foundpwd=0;  <input type="hidden" name="action"     value="upload" />
     var foundname=0;  <input type="hidden" name="state"      value="got_file" />
     var foundid=0;  <input type="hidden" name="associate"  value="" />
     var foundsec=0;  <input type="hidden" name="datatoken"  value="$datatoken" />
   <input type="hidden" name="fileupload" value="$ENV{'form.fileupload'}" />
   <input type="hidden" name="upfiletype" value="$ENV{'form.upfiletype'}" />
   <input type="hidden" name="upfile_associate" 
                                          value="$ENV{'form.upfile_associate'}" />
   <hr />
   <script type="text/javascript" language="Javascript">
   $javascript
   $javascript_validations
   </script>
   ENDPICK
   }
   
   ###############################################################
   ###############################################################
   sub javascript_validations {
       my ($krbdefdom)=@_;
       my %param = ( formname => 'studentform',
                     kerb_def_dom => $krbdefdom );
       my $authheader = &Apache::loncommon::authform_header(%param);
       return (<<ENDPICK);
   function verify_message (vf,founduname,foundpwd,foundname,foundid,foundsec) {
     var foundatype=0;      var foundatype=0;
     var tw;  
     var message='';      var message='';
     for (i=0;i<=vf.nfields.value;i++) {  
         tw=eval('vf.f'+i+'.selectedIndex');  
         if (tw==1) { founduname=1; }  
         if ((tw>=2) && (tw<=6)) { foundname=1; }  
         if (tw==7) { foundid=1; }  
         if (tw==8) { foundsec=1; }   
         if (tw==9) { foundpwd=1; }  
     }  
     if (founduname==0) {      if (founduname==0) {
  alert('You need to specify at least the username field');   alert('You need to specify the username field');
         return;          return;
     }      }
     if (vf.login[0].checked) {      if (current.radiovalue == null || current.radiovalue == 'nochange') {
  foundatype=1;          // They did not check any of the login radiobuttons.
         if (vf.krbdom.value=='') {          alert('You must choose an authentication type');
     alert('You need to specify the Kerberos domain');          return;
             return;  
         }  
     }      }
     if (vf.login[1].checked) {      foundatype=1;
  foundatype=1;      if (current.argfield == null || current.argfield == '') {
         if ((vf.intpwd.value=='') && (foundpwd==0)) {          var alertmsg = '';
     alert('You need to specify the initial password');          switch (current.value) {
               case 'krb': 
                   alertmsg = 'You need to specify the Kerberos domain';
                   break;
               case 'loc':
               case 'fsys':
                   alertmsg = 'You need to specify the initial password';
                   break;
               case 'fsys':
                   alertmsg = '';
                   break;
               default: 
                   alertmsg = '';
           }
           if (alertmsg != '') {
               alert(alertmsg);
             return;              return;
         }          }
     }      }
     if (foundatype==0) {  
  alert('You need to set the login type');  
         return;  
     }  
     if (foundname==0) { message='No name fields specified. '; }      if (foundname==0) { message='No name fields specified. '; }
     if (foundid==0) { message+='No ID or student number field specified. '; }      if (foundid==0) { message+='No ID or student number field specified. '; }
     if (foundsec==0) { message+='No section or group field specified. '; }      if (foundsec==0) { message+='No section or group field specified. '; }
Line 280  function verify(vf) { Line 267  function verify(vf) {
        message+='Continue enrollment?';         message+='Continue enrollment?';
        if (confirm(message)) {         if (confirm(message)) {
   pclose();    pclose();
             vf.state.value='enrolling';
   vf.submit();    vf.submit();
        }         }
     } else {      } else {
       pclose();        pclose();
         vf.state.value='enrolling';
       vf.submit();        vf.submit();
     }         }
   }
   
   
       function pclose() {
           parmwin=window.open("/adm/rat/empty.html","LONCAPAparms",
                    "height=350,width=350,scrollbars=no,menubar=no");
           parmwin.close();
       }
   
       function pjump(type,dis,value,marker,ret,call) {
           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 dateset() {
           if (document.studentform.pres_marker.value=='end') {
              document.studentform.enddate.value=
          document.studentform.pres_value.value;
           }
           if (document.studentform.pres_marker.value=='start') {
              document.studentform.startdate.value=
          document.studentform.pres_value.value;
           }
           pclose();
       }
   
   $authheader
   ENDPICK
   
   }
   
   ###############################################################
   ###############################################################
   sub upload_manager_javascript_forward_associate {
       return(<<ENDPICK);
   function verify(vf) {
       var founduname=0;
       var foundpwd=0;
       var foundname=0;
       var foundid=0;
       var foundsec=0;
       var tw;
       for (i=0;i<=vf.nfields.value;i++) {
           tw=eval('vf.f'+i+'.selectedIndex');
           if (tw==1) { founduname=1; }
           if ((tw>=2) && (tw<=6)) { foundname=1; }
           if (tw==7) { foundid=1; }
           if (tw==8) { foundsec=1; }
           if (tw==9) { foundpwd=1; }
       }
       verify_message(vf,founduname,foundpwd,foundname,foundid,foundsec);
 }  }
   
   //
   // vf = this.form
   // tf = column number
   //
   // values of nw
   //
   // 0 = none
   // 1 = username
   // 2 = names (lastname, firstnames)
   // 3 = fname (firstname)
   // 4 = mname (middlename)
   // 5 = lname (lastname)
   // 6 = gen   (generation)
   // 7 = id
   // 8 = section
   // 9 = ipwd  (password)
   //
 function flip(vf,tf) {  function flip(vf,tf) {
    var nw=eval('vf.f'+tf+'.selectedIndex');     var nw=eval('vf.f'+tf+'.selectedIndex');
    var i;     var i;
      // make sure no other columns are labeled the same as this one
    for (i=0;i<=vf.nfields.value;i++) {     for (i=0;i<=vf.nfields.value;i++) {
       if ((i!=tf) && (eval('vf.f'+i+'.selectedIndex')==nw)) {        if ((i!=tf) && (eval('vf.f'+i+'.selectedIndex')==nw)) {
           eval('vf.f'+i+'.selectedIndex=0;')                  eval('vf.f'+i+'.selectedIndex=0;')
       }         }
    }     }
      // If we set this to 'lastname, firstnames', clear out all the ones
      // set to 'fname','mname','lname','gen' (3,4,5,6) currently.
    if (nw==2) {     if (nw==2) {
       for (i=0;i<=vf.nfields.value;i++) {        for (i=0;i<=vf.nfields.value;i++) {
          if ((eval('vf.f'+i+'.selectedIndex')>=3) &&           if ((eval('vf.f'+i+'.selectedIndex')>=3) &&
              (eval('vf.f'+i+'.selectedIndex')<=6)) {               (eval('vf.f'+i+'.selectedIndex')<=6)) {
              eval('vf.f'+i+'.selectedIndex=0;')               eval('vf.f'+i+'.selectedIndex=0;')
          }           }
       }              }
    }     }
      // If we set this to one of 'fname','mname','lname','gen' (3,4,5,6),
      // clear out any that are set to 'lastname, firstnames' (2)
    if ((nw>=3) && (nw<=6)) {     if ((nw>=3) && (nw<=6)) {
       for (i=0;i<=vf.nfields.value;i++) {        for (i=0;i<=vf.nfields.value;i++) {
          if (eval('vf.f'+i+'.selectedIndex')==2) {           if (eval('vf.f'+i+'.selectedIndex')==2) {
              eval('vf.f'+i+'.selectedIndex=0;')               eval('vf.f'+i+'.selectedIndex=0;')
          }           }
       }              }
    }     }
      // If we set the password, make the password form below correspond to 
      // the new value.
    if (nw==9) {     if (nw==9) {
        vf.login[1].checked=true;         changed_radio('int',document.studentform);
        vf.intpwd.value='';         set_auth_radio_buttons('int',document.studentform);
        vf.krbdom.value='';         vf.intarg.value='';
          vf.krbarg.value='';
          vf.locarg.value='';
    }     }
   
 }  }
   
 function clearpwd(vf) {  function clearpwd(vf) {
Line 325  function clearpwd(vf) { Line 394  function clearpwd(vf) {
         if (eval('vf.f'+i+'.selectedIndex')==9) {          if (eval('vf.f'+i+'.selectedIndex')==9) {
             eval('vf.f'+i+'.selectedIndex=0;')              eval('vf.f'+i+'.selectedIndex=0;')
         }          }
     }            }
 }  
   
 function setkrb(vf) {  
     if (vf.krbdom.value!='') {  
        clearpwd(vf);  
        vf.login[0].checked=true;  
        vf.krbdom.value=vf.krbdom.value.toUpperCase();  
        vf.intpwd.value='';  
    }  
 }  }
   
 function setint(vf) {  ENDPICK
     if (vf.intpwd.value!='') {  
        clearpwd(vf);  
        vf.login[1].checked=true;  
        vf.krbdom.value='';  
    }  
 }  }
   
 function clickkrb(vf) {  ###############################################################
     vf.krbdom.value='$krbdefdom';  ###############################################################
     clearpwd(vf);  sub upload_manager_javascript_reverse_associate {
     vf.intpwd.value='';      return(<<ENDPICK);
   function verify(vf) {
       var founduname=0;
       var foundpwd=0;
       var foundname=0;
       var foundid=0;
       var foundsec=0;
       var tw;
       for (i=0;i<=vf.nfields.value;i++) {
           tw=eval('vf.f'+i+'.selectedIndex');
           if (i==0 && tw!=0) { founduname=1; }
           if (((i>=1) && (i<=5)) && tw!=0 ) { foundname=1; }
           if (i==6 && tw!=0) { foundid=1; }
           if (i==7 && tw!=0) { foundsec=1; }
           if (i==8 && tw!=0) { foundpwd=1; }
       }
       verify_message(vf,founduname,foundpwd,foundname,foundid,foundsec);
 }  }
   
 function clickint(vf) {  function flip(vf,tf) {
     vf.krbdom.value='';     var nw=eval('vf.f'+tf+'.selectedIndex');
      var i;
      // picked the all one one name field, reset the other name ones to blank
      if (tf==1 && nw!=0) {
         for (i=2;i<=5;i++) {
            eval('vf.f'+i+'.selectedIndex=0;')
         }
      }
      //picked one of the piecewise name fields, reset the all in
      //one field to blank
      if ((tf>=2) && (tf<=5) && (nw!=0)) {
         eval('vf.f1.selectedIndex=0;')
      }
      // intial password specified, pick internal authentication
      if (tf==8 && nw!=0) {
          changed_radio('int',document.studentform);
          set_auth_radio_buttons('int',document.studentform);
          vf.krbarg.value='';
          vf.intarg.value='';
          vf.locarg.value='';
      }
 }  }
   
     function pclose() {  function clearpwd(vf) {
         parmwin=window.open("/adm/rat/empty.html","LONCAPAparms",      var i;
                  "height=350,width=350,scrollbars=no,menubar=no");      if (eval('vf.f8.selectedIndex')!=0) {
         parmwin.close();          eval('vf.f8.selectedIndex=0;')
     }  
   
     function pjump(type,dis,value,marker,ret,call) {  
         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 dateset() {  
         if (document.studentform.pres_marker.value=='end') {  
            document.studentform.enddate.value=  
        document.studentform.pres_value.value;  
         }  
         if (document.studentform.pres_marker.value=='start') {  
            document.studentform.startdate.value=  
        document.studentform.pres_value.value;  
         }  
         pclose();  
     }      }
   }
 </script>  
 <table border=2><tr><th>Field</th><th>Samples</th></tr>  
 ENDPICK  ENDPICK
              my %sone; my %stwo; my %sthree;  }
              my $i=0;  
   
              if ($total>=0) {  ###############################################################
                 %sone=&record_sep($records[0]);  ###############################################################
                 if ($total>=1) {  sub print_upload_manager_footer {
                    %stwo=&record_sep($records[1]);      my ($r,$i,$keyfields,$defdom,$today,$halfyear)=@_;
                          my %param = ( formname => 'document.studentform');
         }      my $krbform = &Apache::loncommon::authform_kerberos(%param);
                 if ($total>=2) {      my $intform = &Apache::loncommon::authform_internal(%param);
                    %sthree=&record_sep($records[2]);      my $locform = &Apache::loncommon::authform_local(%param);
         }      my $domform = &domain_form($defdom);
                 map {      $r->print(<<ENDPICK);
                    $r->print('<tr><td><select name=f'.$i.  
                        ' onChange="flip(this.form,'.$i.');">');  
                    map {  
                       my ($value,$display)=split(/\:/,$_);  
                       $r->print('<option value='.$value.'>'.$display.  
                               '</option>');  
                    } ('none: ','username:Username',  
                       'names:Last Name, First Names',  
                       'fname:First Name','mname:Middle Names/Initials',  
                       'lname:Last Name','gen:Generation',  
                       'id:ID/Student Number','sec:Group/Section',  
                       'ipwd:Initial Password');  
                    $r->print('</select></td><td>');  
                    if (defined($sone{$i})) {   
                       $r->print($sone{$i}."</br>\n");   
                    }  
            if (defined($stwo{$i})) {   
                       $r->print($stwo{$i}."</br>\n");   
                    }  
            if (defined($sthree{$i})) {   
                       $r->print($sthree{$i}."</br>\n");   
                    }  
                    $r->print('</td></tr>');  
                    $i++;  
        } sort keys %sone;  
        $i--;  
      }  
              my $keyfields=join(',',sort keys %sone);  
              $r->print(<<ENDPICK);  
 </table>  </table>
 <input type=hidden name=nfields value=$i>  <input type=hidden name=nfields value=$i>
 <input type=hidden name=keyfields value="$keyfields">  <input type=hidden name=keyfields value="$keyfields">
 <h3>Login Type</h3>  <h3>Login Type</h3>
 <input type=radio name=login value=krb onClick="clickkrb(this.form);">  <p>Note: this will not take effect if the user already exists</p>
 Kerberos authenticated with domain  <p>
 <input type=text size=10 name=krbdom onChange="setkrb(this.form);"><p>  $krbform
 <input type=radio name=login value=int onClick="clickint(this.form);">   </p>
 Internally authenticated (with initial password   <p>
 <input type=text size=10 name=intpwd onChange="setint(this.form);">)  $intform
   </p>
   <p>
   $locform
   </p>
 <h3>LON-CAPA Domain for Students</h3>  <h3>LON-CAPA Domain for Students</h3>
 LON-CAPA domain: <input type=text size=10 value=$defdom name=lcdomain><p>  LON-CAPA domain: $domform <p>
 <h3>Starting and Ending Dates</h3>  <h3>Starting and Ending Dates</h3>
 <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" >
 <input type="hidden" value='$today' name=startdate>  <input type="hidden" value='$today'    name="startdate"   >
 <input type="hidden" value='$halfyear' name=enddate>  <input type="hidden" value='$halfyear' name="enddate"     >
 <a   <a 
  href="javascript:pjump('date_start','Enrollment Starting Date',document.studentform.startdate.value,'start','studentform.pres','dateset');"   href="javascript:pjump('date_start','Enrollment Starting Date',document.studentform.startdate.value,'start','studentform.pres','dateset');"
 >Set Starting Date</a><p>  >Set Starting Date</a><p>
Line 455  LON-CAPA domain: <input type=text size=1 Line 497  LON-CAPA domain: <input type=text size=1
 <h3>Full Update</h3>  <h3>Full Update</h3>
 <input type=checkbox name=fullup value=yes> Full update   <input type=checkbox name=fullup value=yes> Full update 
 (also print list of users not enrolled anymore)<p>  (also print list of users not enrolled anymore)<p>
 <input type=button onClick="verify(this.form)" value="Update Courselist"><br>  <h3>ID/Student Number</h3>
 Note: for large courses, this operation might be time consuming.  <input type=checkbox name=forceid value=yes> 
   Disable ID/Student Number Safeguard and Force Change of Conflicting IDs
   (only do if you know what you are doing)<p>
   <input type="button" onClick="javascript:verify(this.form)" value="Update Courselist" /><br />
   Note: for large courses, this operation may be time consuming.
 ENDPICK  ENDPICK
 }  }
   
 # ======================================================= Menu Phase Two Enroll  # ======================================================= Menu Phase Two Upload
   sub print_upload_manager_form {
 sub menu_phase_two_enroll {  
     my $r=shift;      my $r=shift;
       
       my $datatoken;
       if (!$ENV{'form.datatoken'}) {
         $datatoken=&Apache::loncommon::upfile_store($r);
       } else {
         $datatoken=$ENV{'form.datatoken'};
         &Apache::loncommon::load_tmp_file($r);
       }
       my @records=&Apache::loncommon::upfile_record_sep();
       my $total=$#records;
       my $distotal=$total+1;
     $ENV{'SERVER_NAME'}=~/(\w+\.\w+)$/;      $ENV{'SERVER_NAME'}=~/(\w+\.\w+)$/;
     my $krbdefdom=$1;      my $krbdefdom=$1;
     $krbdefdom=~tr/a-z/A-Z/;      $krbdefdom=~tr/a-z/A-Z/;
   
     my $today=time;      my $today=time;
     my $halfyear=$today+15552000;      my $halfyear=$today+15552000;
   
     my $defdom=$r->dir_config('lonDefDomain');      my $defdom=$r->dir_config('lonDefDomain');
       &print_upload_manager_header($r,$datatoken,$distotal,$krbdefdom);
       my $i;
       my $keyfields;
       if ($total>=0) {
    my @d=(['username','Username'],
                  ['names','Last Name, First Names'],
          ['fname','First Name'],
                  ['mname','Middle Names/Initials'],
          ['lname','Last Name'],
                  ['gen','Generation'],
          ['id','ID/Student Number'],
                  ['sec','Group/Section'],
          ['ipwd','Initial Password']);
    if ($ENV{'form.upfile_associate'} eq 'reverse') {
       &Apache::loncommon::csv_print_samples($r,\@records);
       $i=&Apache::loncommon::csv_print_select_table($r,\@records,\@d);
       foreach (@d) { $keyfields.=$_->[0].','; }
       chop($keyfields);
    } else {
       unshift(@d,['none','']);
       $i=&Apache::loncommon::csv_samples_select_table($r,\@records,\@d);
       my %sone=&Apache::loncommon::record_sep($records[0]);
       $keyfields=join(',',sort(keys(%sone)));
    }
       }
       &print_upload_manager_footer($r,$i,$keyfields,$defdom,$today,$halfyear);
   }
   
     $r->print(<<ENDSENROLL);  # ======================================================= Enroll single student
 <h3>Personal Data</h3>  sub enroll_single_student {
       my $r=shift;
       $r->print('<h3>Enrolling Student</h3>');
       $r->print('<p>Enrolling '.$ENV{'form.cuname'}." in domain ".
                 $ENV{'form.lcdomain'}.'</p>');
       if (($ENV{'form.cuname'})&&($ENV{'form.cuname'}!~/\W/)&&
           ($ENV{'form.lcdomain'})&&($ENV{'form.lcdomain'}!~/\W/)) {
           # Deal with home server selection
           my $domain=$ENV{'form.lcdomain'};
           my $desiredhost = $ENV{'form.lcserver'};
           if (lc($desiredhost) eq 'default') {
               $desiredhost = undef;
           } else {
               my %home_servers =&Apache::loncommon::get_library_servers($domain);
               if (! exists($home_servers{$desiredhost})) {
                   $r->print('<font color="#ff0000">Error:</font>'.
                             'Invalid home server specified');
                   return;
               }
           }
           $r->print(" with server $desiredhost :") if (defined($desiredhost));
           # End of home server selection logic
    my $amode='';
           my $genpwd='';
           if ($ENV{'form.login'} eq 'krb') {
              $amode='krb';
      $amode.=$ENV{'form.krbver'};
              $genpwd=$ENV{'form.krbarg'};
           } elsif ($ENV{'form.login'} eq 'int') {
              $amode='internal';
              $genpwd=$ENV{'form.intarg'};
           }  elsif ($ENV{'form.login'} eq 'loc') {
       $amode='localauth';
       $genpwd=$ENV{'form.locarg'};
       if (!$genpwd) { $genpwd=" "; }
    }
           my $home = &Apache::lonnet::homeserver($ENV{'form.cuname'},
                                                      $ENV{'form.lcdomain'});
           if ((($amode) && ($genpwd)) || ($home ne 'no_host')) {
               &modifystudent($ENV{'form.lcdomain'},$ENV{'form.cuname'},
                              $ENV{'request.course.id'},$ENV{'form.csec'},
                               $desiredhost);
             $r->print(&Apache::lonnet::modifystudent(
                         $ENV{'form.lcdomain'},$ENV{'form.cuname'},
                         $ENV{'form.cstid'},$amode,$genpwd,
                  $ENV{'form.cfirst'},$ENV{'form.cmiddle'},
                         $ENV{'form.clast'},$ENV{'form.cgen'},
                         $ENV{'form.csec'},$ENV{'form.enddate'},
                         $ENV{'form.startdate'},$ENV{'form.forceid'},
                       $desiredhost));
    } else {
               $r->print('<p><font color="#ff0000">ERROR</font>&nbsp;'.
                         'Invalid login mode or password.  '.
                         'Unable to enroll '.$ENV{'form.cuname'}.'.</p>');
           }          
       } else {
           $r->print('Invalid username or domain');
       }    
   }
   
 First Name: <input type=text name=cfirst size=15><br>  # ======================================================= Menu Phase Two Enroll
 Middle Name: <input type=text name=cmiddle size=15><br>  sub print_enroll_single_student_form {
 Last Name: <input type=text name=clast size=15><br>      my $r=shift;
 Generation: <input type=text name=cgen size=5><p>      $r->print("<h3>Enroll One Student</h3>");
       my ($krbdefdom) = $ENV{'SERVER_NAME'}=~/(\w+\.\w+)$/;
       $krbdefdom=~tr/a-z/A-Z/;
       my $today    = time;
       my $halfyear = $today+15552000;
       my $defdom=$r->dir_config('lonDefDomain');
       my $javascript_validations=&javascript_validations($krbdefdom);
       # Set up authentication forms
       my %param = ( formname => 'document.studentform');
       my $krbform = &Apache::loncommon::authform_kerberos(%param);
       my $intform = &Apache::loncommon::authform_internal(%param);
       my $locform = &Apache::loncommon::authform_local(%param);
       # Set up domain selection form
       my $domform = &domain_form($defdom);
       # Print it all out
       $r->print(<<END);
   <input type="hidden" name="action" value="enrollstudent">
   <input type="hidden" name="state"  value="done">
   
 ID/Student Number: <input type=text name=cstid size=10><p>  <script type="text/javascript" language="Javascript">
   function verify(vf) {
       var founduname=0;
       var foundpwd=0;
       var foundname=0;
       var foundid=0;
       var foundsec=0;
       var tw;
       if ((typeof(vf.cuname.value) !="undefined") && (vf.cuname.value!='') && 
    (typeof(vf.lcdomain.value)!="undefined") && (vf.lcdomain.value!='')) {
           founduname=1;
       }
       if ((typeof(vf.cfirst.value)!="undefined") && (vf.cfirst.value!='') &&
    (typeof(vf.clast.value) !="undefined") && (vf.clast.value!='')) {
           foundname=1;
       }
       if ((typeof(vf.csec.value)!="undefined") && (vf.csec.value!='')) {
           foundsec=1;
       }
       if ((typeof(vf.cstid.value)!="undefined") && (vf.cstid.value!='')) {
    foundid=1;
       }
       if (founduname==0) {
    alert('You need to specify at least the username and domain fields');
           return;
       }
       verify_message(vf,founduname,foundpwd,foundname,foundid,foundsec);
   }
   
 Group/Section: <input type=text name=csec size=5><p>  $javascript_validations
   
 Initial password (if applicable): <input type=text name=cinpwd size=10><p>  function clearpwd(vf) {
       //nothing else needs clearing
   }
   
 <h3>Login Type</h3>  </script>
 <input type=radio name=login value=krb onClick="clickkrb(this.form);">  <h3>Personal Data</h3>
 Kerberos authenticated with domain  <table>
 <input type=text size=10 name=krbdom onChange="setkrb(this.form);"><p>  <tr><td>First Name:</td><td> <input type="text" name="cfirst"  size="15"></td></tr>
 <input type=radio name=login value=int onClick="clickint(this.form);">   <tr><td>Middle Name:</td><td> <input type="text" name="cmiddle" size="15"></td></tr>
 Internally authenticated (with initial password   <tr><td>Last Name: </td><td><input type="text" name="clast"   size="15"></td></tr>
 <input type=text size=10 name=intpwd onChange="setint(this.form);">)  <tr><td>Generation: </td><td><input type="text" name="cgen"    size="5"> </td></tr>
 <h3>LON-CAPA Domain for Students</h3>  </table>
 LON-CAPA domain: <input type=text size=10 value=$defdom name=lcdomain><p>  
 <h3>Starting and Ending Dates</h3>  <h3>Login Data</h3>
 <input type="hidden" value='' name="pres_value">  <p>Username: <input type="text" name="cuname"  size="15"></p>
 <input type="hidden" value='' name="pres_type">  <p>Domain:   $domform</p>
 <input type="hidden" value='' name="pres_marker">  <p>Note: login settings below  will not take effect if the user already exists
 <input type="hidden" value='$today' name=startdate>  </p><p>
 <input type="hidden" value='$halfyear' name=enddate>  $krbform
   </p><p>
   $intform
   </p><p>
   $locform
   </p><p>
   
   <h3>Course Data</h3>
   
   <p>Group/Section: <input type="text" name="csec" size="5" />
   <p>
   <!-- Date setting form elements -->
   <input type="hidden" name="pres_value"  value='' />
   <input type="hidden" name="pres_type"   value='' />
   <input type="hidden" name="pres_marker" value='' />
   <input type="hidden" name="startdate"   value='$today'    />
   <input type="hidden" name="enddate"     value='$halfyear' />
   </p><p>
 <a   <a 
  href="javascript:pjump('date_start','Enrollment Starting Date',document.studentform.startdate.value,'start','studentform.pres','dateset');"   href="javascript:pjump('date_start','Enrollment Starting Date',document.studentform.startdate.value,'start','studentform.pres','dateset');"
 >Set Starting Date</a><p>  >Set Starting Date</a>
   </p><p>
 <a   <a 
  href="javascript:pjump('date_end','Enrollment Ending Date',document.studentform.enddate.value,'end','studentform.pres','dateset');"   href="javascript:pjump('date_end','Enrollment Ending Date',document.studentform.enddate.value,'end','studentform.pres','dateset');"
 >Set Ending Date</a><p>  >Set Ending Date</a>
 ENDSENROLL  </p>
   <h3>ID/Student Number</h3>
   <p>
   ID/Student Number: <input type="text" name="cstid" size="10">
   </p><p>
   <input type="checkbox" name="forceid" value="yes"> 
   Disable ID/Student Number Safeguard and Force Change of Conflicting IDs
   (only do if you know what you are doing)
   </p><p>
   <input type="button" onClick="verify(this.form)" value="Enroll as student">
   </p>
   END
       return;
   }
   
   # =================================================== get the current classlist
   sub get_current_classlist {
       my $r = shift;
       # Call DownloadClasslist
       my $cid = $ENV{'request.course.id'};
       my $c = $r->connection;
       my $classlisthash = &Apache::loncoursedata::DownloadClasslist
           ($cid,'Not downloaded',$c);
       # Call ProcessClasslist
       my %cache;
       my @students = &Apache::loncoursedata::ProcessClasslist(\%cache,
                                                               $classlisthash,
                                                               $cid,$c);
       return (\@students,\%cache);
 }  }
   
 # ========================================================= Menu Phase Two Drop  # ========================================================= Menu Phase Two Drop
   sub print_drop_menu {
       my $r=shift;
       $r->print("<h3>Drop Students</h3>");
       my $cid=$ENV{'request.course.id'};
       my ($student_array,$student_data)=&get_current_classlist($r);
       if (! scalar(@$student_array)) {
           $r->print("There are no students currently enrolled.\n");
           return;
       }
       # Print out the available choices
       &show_drop_list($student_array,$student_data,$r);
       return;
   }
   
 sub menu_phase_two_drop {  # ============================================== view classlist
   sub print_html_classlist {
     my $r=shift;      my $r=shift;
       $r->print(<<END);
   <p>
   <font size="+1">Current Classlist</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
   <font size="+1"><a href="/adm/dropadd?action=classlist&state=csv">CSV format</a></font>
   </p>
   END
     my $cid=$ENV{'request.course.id'};      my $cid=$ENV{'request.course.id'};
                  my $classlst=&Apache::lonnet::reply      my ($student_array,$student_data)=&get_current_classlist($r);
                  ('dump:'.$ENV{'course.'.$cid.'.domain'}.':'.      if (! scalar(@$student_array)) {
                   $ENV{'course.'.$cid.'.num'}.':classlist',          $r->print("There are no students currently enrolled.\n");
                   $ENV{'course.'.$cid.'.home'});      } else {
                  my %currentlist=();          # Print out the available choices
                  my $now=time;          if ($ENV{'form.action'} eq 'modifystudent') {
                  unless ($classlst=~/^error\:/) {              &show_class_list($r,'view','modify','any',$student_array,$student_data);
                      map {          } else {
                         my ($name,$value)=split(/\=/,$_);              &show_class_list($r,'view','aboutme','any',$student_array,$student_data);
                         my ($end,$start)=split(/\:/,          }
                                             &Apache::lonnet::unescape($value));      }
                         my $active=1;  }
                         if (($end) && ($now>$end)) { $active=0; }  
                         if ($active) {  # ============================================== view classlist
            $currentlist{&Apache::lonnet::unescape($name)}=1;  sub print_csv_classlist {
                         }      my $r=shift;
                      } split(/\&/,$classlst);      my $cid=$ENV{'request.course.id'};
 # ----------------------------------------------------------- Print out choices      my ($student_array,$student_data)=&get_current_classlist($r);
                      &show_drop_list($r,%currentlist);      if (! scalar(@$student_array)) {
          } else {          $r->print("There are no students currently enrolled.\n");
                      $r->print(      } else {
                   '<font color=red><h3>Could not access classlist: '.$classlst.          &show_class_list($r,'csv','nolink','any',$student_array,$student_data);
                   '</h3></font>');      }
                  }  
 }  }
   
 # =================================================== Show student list to drop  # =================================================== Show student list to drop
   sub show_class_list {
       my ($r,$mode,$linkto,$statusmode,$students,$student_data)=@_;
       my $cid=$ENV{'request.course.id'};
       # Print out header 
       if ($mode eq 'view') {
           if ($linkto eq 'aboutme') {
               $r->print('Select a user name to view the users page.');
           } elsif ($linkto eq 'modify') {
               $r->print('Select a user name to modify the students information');
           }
           $r->print(<<END);
   <p>
   <table border=2>
   <tr><th>username</th><th>domain</th><th>ID</th>
       <th>student name</th><th>section</th></tr>
   END
       } elsif ($mode eq 'csv') {
           $r->print('"'.join('","',("username","domain","ID","student name",
                                     "section")).'"'."\n");
       }
       foreach my $student (@$students) {
           my $error;
           if (exists($student_data->{$student.':error'})) {
               $error = $student_data->{$student.':error'};
           }
           if ($error) {
               $r->print('<tr><td colspan="6">'.
                         '<font color="#FF8888">Error</font>'.
                         'Error retrieving data for '.
                         join('@',split(/:/,$student)).
                         ', '.$error.'</td></tr>'."\n");
               next;
           }
           my $username = $student_data->{$student.':username'};
           my $domain   = $student_data->{$student.':domain'};
           my $section  = $student_data->{$student.':section'};
           my $name     = $student_data->{$student.':fullname'};
           my $status   = $student_data->{$student.':Status'};
           my $id       = $student_data->{$student.':id'};
           next if (($statusmode ne 'any') && ($status ne $statusmode));
           if ($mode eq 'view') {
               $r->print("<tr>\n    <td>\n        ");
               if ($linkto eq 'nothing') {
                   $r->print($username);
               } elsif ($linkto eq 'aboutme') {
                   $r->print(&Apache::loncommon::aboutmewrapper($username,
                                                                $username,
                                                                $domain));
               } elsif ($linkto eq 'modify') {
                   $r->print('<a href="/adm/dropadd?action=modifystudent'.
                             '&state=selected'.'&sname='.$username.
                             '&sdom='.$domain.'">'.$username."</a>\n");
               }
               $r->print(<<"END");
       </td>
       <td>$domain</td>
       <td>$id</td>
       <td>$name</td>
       <td>$section</td>
   </tr>
   END
           } elsif ($mode eq 'csv') {
               # no need to bother with $linkto
               my @line = ();
               foreach ($username,$domain,$id,$name,$section) {
                   push @line,&Apache::loncommon::csv_translate($_);
               }
               my $tmp = $";
               $" = '","';
               $r->print("\"@line\"\n");
               $" = $tmp;
           }
       }
       $r->print('</table><br>') if ($mode eq 'view');
   }
   
   
   #
   # print out form for modification of a single students data
   #
   sub print_modify_student_form {
       my $r = shift();
       &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                                               ['sdom','sname']);
       
       my $sname = $ENV{'form.sname'};
       my $sdom  = $ENV{'form.sdom'};
       # determine the students name information
       my %info=&Apache::lonnet::get('environment',
                                     ['firstname','middlename',
                                      'lastname','generation','id'],
                                     $sdom, $sname);
       my ($tmp) = keys(%info);
       if ($tmp =~ /^(con_lost|error|no_such_host)/i) {
           $r->print('<font color="#ff0000" size="+2">Error</font>'.
                     '<p>'.
                     'Unable to retrieve environment data for '.$sname.
                     'in domain '.$sdom.'</p><p>'.
                     'Please contact your LON-CAPA administrator '.
                     'regarding this situation.</p></body></html>');
           return;
       }
       # determine the students starting and ending times and section
       my ($starttime,$endtime,$section) = &get_enrollment_data($sname,$sdom);
       # Deal with date forms
       my $startdateform = &Apache::lonhtmlcommon::date_setter('studentform',
                                                               'startdate',
                                                               $starttime);
       my $enddateform = &Apache::lonhtmlcommon::date_setter('studentform',
                                                             'enddate',
                                                             $endtime);
       # Make sure student is enrolled in course    
       $r->print(<<END);
   <p>
   <font size="+1">
   Only domain coordinators can change a users password.
   </font>
   </p>
   <input type="hidden" name="slogin"  value="$sname"  />
   <input type="hidden" name="sdomain" value="$sdom" />
   <input type="hidden" name="action"  value="modifystudent" />
   <input type="hidden" name="state"  value="done" />
   <h2>Modify Enrollment for $info{'firstname'} $info{'middlename'} 
   $info{'lastname'} $info{'generation'}, $sname\@$sdom</h2>
   <p>
   <b>Student Name</b>
   <table>
   <tr><th>First</th><th>Middle</th><th>Last</th><th>Generation</th></tr>
   <tr><td>
   <input type="text" name="firstname"  value="$info{'firstname'}"  /></td><td>
   <input type="text" name="middlename" value="$info{'middlename'}" /></td><td>
   <input type="text" name="lastname"   value="$info{'lastname'}"   /></td><td>
   <input type="text" name="generation" value="$info{'generation'}" /></td></tr>
   </table>
   </p><p>
   <b>Student ID</b>: <input type="text" name="id" value="$info{'id'}" size="12"/>
   </p><p>
   <b>Section</b>: <input type="text" name="section" value="$section" size="4"/>
   </p><p>
   <table>
   <tr><td align="right"><b>Starting Date:</b></td><td>$startdateform</td></tr>
   <tr><td align="right"><b>Ending Date:</b></td><td>$enddateform</td></tr>
   </table>
   </p>
   <input type="submit" value="Submit Modifications" />
   </body></html>
   END
       return;
   }
   
   #
   # modify a single students section 
   #
   sub modify_single_student {
       my $r = shift;
       # make sure user can modify student data?
       my $firstname  = $ENV{'form.firstname'};
       my $middlename = $ENV{'form.middlename'};
       my $lastname   = $ENV{'form.lastname'};
       my $generation = $ENV{'form.generation'};
       my $section    = $ENV{'form.section'};
       my $courseid   = $ENV{'request.course.id'};
       my $sname      = $ENV{'form.slogin'};
       my $sdom       = $ENV{'form.sdomain'};
       my $sid        = $ENV{'form.id'};
       my $starttime = &Apache::lonhtmlcommon::get_date_from_form('startdate',
                                                                  time);
       my $endtime   = &Apache::lonhtmlcommon::get_date_from_form('enddate',
                                                                  time);
       my $displayable_starttime = localtime($starttime);
       my $displayable_endtime   = localtime($endtime);
       # talk to the user about what we are going to do
       $r->print(<<END);
   <h2>Modifying data for user $sname \@ $sdom </h2>
   <h3>Student Information</h3>
   <table>
   <tr><td>First name  </td><td> $firstname  </td></tr>
   <tr><td>Middle name </td><td> $middlename </td></tr>
   <tr><td>Last name   </td><td> $lastname   </td></tr>
   <tr><td>Generation  </td><td> $generation </td></tr>
   </table>
   <h3>Role Information</h3>
   <table>
   <tr><td>Section     </td><td> $section    </td></tr>
   <tr><td>Start Time  </td><td> $displayable_starttime </td></tr>
   <tr><td>End Time    </td><td> $displayable_endtime   </td></tr>
   </table>
   <p>
   END
       # Send request(s) to modify data
       #   The '1' in the call to modifystudent is to force the students 
       #   id to be changed.
       my $roleresults = &Apache::lonnet::modifystudent
           ($sdom,$sname,$sid,undef,undef,$firstname,$middlename,$lastname,
            $generation,$section,$endtime,$starttime,1);
       if ($roleresults =~/refused/) {
           $r->print("Your request to change the role information for this ".
                     "student was refused.");
       } elsif ($roleresults !~ /ok/) {
           $r->print("An error occurred during the attempt to change the role".
                     " information for this student.  <br />".
                     "The error reported was ".
                     $roleresults);
       } else { # everything is okay!
           $r->print("Student information updated successfully. <br />".
                     "The student must log out and log in again to see ".
                     "these changes.");
       }
       $r->print(<<END);
   </p><p>
   <a href="/adm/dropadd?action=modifystudent">Modify another students data</a>
   </body></html>
   END
       return;
   }
   
   sub get_enrollment_data {
       my ($sname,$sdomain) = @_;
       my $courseid = $ENV{'request.course.id'};
       $courseid =~ s:_:/:g;
       my %roles = &Apache::lonnet::dump('roles',$sdomain,$sname);
       my ($tmp) = keys(%roles);
       # Bail out if we were unable to get the students roles
       return "666" if ($tmp =~ /^(con_lost|error|no_such_host)/i);
       # Go through the roles looking for enrollment in this course
       my ($end,$start) = (undef,undef);
       my $section = '';
       my $count = scalar(keys(%roles));
       while (my ($course,$role) = each(%roles)) {
           &Apache::lonnet::logthis('course = '.$course.' role = '.$role);
           if ($course=~ /^\/$courseid\/*\s*(\w+)*_st$/ ) {
               #
               # Get active role
               $section=$1;
               (undef,$end,$start)=split(/\_/,$role);
               my $now=time;
               my $notactive=0;
               if ($start) {
                   if ($now<$start) { $notactive=1; }
               }
               if ($end) {
                   if ($now>$end) { $notactive=1; }
               } 
               unless ($notactive) { return ($start,$end,$section); }
           }
       }
       return ($start,$end,$section);
   }
   
   # =================================================== Show student list to drop
 sub show_drop_list {  sub show_drop_list {
     my ($r,%currentlist)=@_;      my ($students,$student_data,$r)=@_;
     my $cid=$ENV{'request.course.id'};      my $cid=$ENV{'request.course.id'};
       $r->print(<<'END');
   <input type="hidden" name="action" value="drop" />
   <input type="hidden" name="state"  value="done" />
   <script>
   function checkAll(field) {
       for (i = 0; i < field.length; i++)
           field[i].checked = true ;
   }
   
     $r->print('<input type=hidden name=phase value=four>');  function uncheckAll(field) {
                      $r->print('<table border=2>');      for (i = 0; i < field.length; i++)
                      map {          field[i].checked = false ;
                          my ($sname,$sdom)=split(/\:/,$_);  }
                          my %reply=&Apache::lonnet::idrget($sdom,$sname);  </script>
                          my $ssec=&Apache::lonnet::usection($sdom,$sname,$cid);  <p>
                          my @reply=split(/[\&\=]/,&Apache::lonnet::reply(  <input type="hidden" name="phase" value="four">
                            'get:'.$sdom.':'.$sname.  <table border=2>
       ':environment:firstname&middlename&lastname&generation',  <tr><th>&nbsp;</th><th>username</th><th>domain</th>
                            &Apache::lonnet::homeserver($sname,$sdom)));      <th>ID</th><th>student name</th><th>section</th></tr>
   $r->print(  END
                   '<tr><td><input type=checkbox name="drop:'.$_.'"></td><td>'.      foreach my $student (@$students) {
                                    $sname.'</td><td>'.$sdom.'</td><td>'.          my $error;
                                    $reply{$sname}.'</td><td>'.          if (exists($student_data->{$student.':error'})) {
                                    &Apache::lonnet::unescape($reply[2]).' '.              $error = $student_data->{$student.':error'};
                                    &Apache::lonnet::unescape($reply[3]).', '.          }
                                    &Apache::lonnet::unescape($reply[0]).' '.          if ($error) {
                                    &Apache::lonnet::unescape($reply[1]).              $r->print('<tr><td colspan="6">'.
                                    '</td><td>'.                        '<font color="#FF8888">Error</font>'.
                                    $ssec."</td></tr>\n");                        'Error retrieving data for '.
                      } sort keys %currentlist;                        join('@',split(/:/,$student)).
                      $r->print('</table><br>');                        ', '.$error.'</td></tr>'."\n");
                      $r->print('<input type=submit value="Drop Students">');              next;
           }
           my $username = $student_data->{$student.':username'};
           my $domain   = $student_data->{$student.':domain'};
           my $section  = $student_data->{$student.':section'};
           my $name     = $student_data->{$student.':fullname'};
           my $status   = $student_data->{$student.':Status'};
           my $id       = $student_data->{$student.':id'};
           next if ($status ne 'Active');
           #
           $r->print(<<"END");
   <tr>
       <td><input type="checkbox" name="droplist" value="$student"></td>
       <td>$username</td>
       <td>$domain</td>
       <td>$id</td>
       <td>$name</td>
       <td>$section</td>
   </tr>
   END
       }
       $r->print('</table><br>');
       $r->print(<<"END");
   </p><p>
   <input type="button" value="check all" onclick="javascript:checkAll(document.studentform.droplist)"> &nbsp;
   <input type="button" value="uncheck all" onclick="javascript:uncheckAll(document.studentform.droplist)"> 
   <p><input type=submit value="Drop Students"></p>
   END
       return;
 }  }
   
 # ================================================= Drop/Add from uploaded file  #
   # Print out the initial form to get the courselist file
   #
   sub print_first_courselist_upload_form {
       my $r=shift;
       my $upfile_select=&Apache::loncommon::upfile_select_html();
       my $create_classlist_help = 
    &Apache::loncommon::help_open_topic("Course_Create_Class_List",
              "How do I create a class list from a spreadsheet");
       my $create_csv_help =
    &Apache::loncommon::help_open_topic("Course_Convert_To_CSV",
              "How do I create a CSV file from a spreadsheet");
       $r->print(<<ENDUPFORM);
   <input type=hidden name=phase value=two>
   <h3>Upload a courselist</h3>
   $upfile_select
   <p>
   <input type=submit name="fileupload" value="Upload Courselist">
   <input type="hidden" name="action" value="upload" />
   <input type="hidden" name="state"  value="got_file" />
   </p>
   $create_classlist_help <br />
   $create_csv_help
   </body></html>
   ENDUPFORM
       return;
   }
   
   # ================================================= Drop/Add from uploaded file
 sub upfile_drop_add {  sub upfile_drop_add {
     my $r=shift;      my $r=shift;
       &Apache::loncommon::load_tmp_file($r);
     &load_tmp_file($r);      my @studentdata=&Apache::loncommon::upfile_record_sep();
     my @studentdata=&upfile_record_sep();      my @keyfields = split(/\,/,$ENV{'form.keyfields'});
       my $cid = $ENV{'request.course.id'};
     my @keyfields=split(/\,/,$ENV{'form.keyfields'});      my %fields=();
     my $cid=$ENV{'request.course.id'};      for (my $i=0; $i<=$ENV{'form.nfields'}; $i++) {
           if ($ENV{'form.upfile_associate'} eq 'reverse') {
              my %fields=();              if ($ENV{'form.f'.$i} ne 'none') {
              for (my $i=0;$i<=$ENV{'form.nfields'};$i++) {                  $fields{$keyfields[$i]}=$ENV{'form.f'.$i};
                  $fields{$ENV{'form.f'.$i}}=$keyfields[$i];              }
              }          } else {
              my $startdate=$ENV{'form.startdate'};              $fields{$ENV{'form.f'.$i}}=$keyfields[$i];
              my $enddate=$ENV{'form.enddate'};          }
              if ($startdate=~/\D/) { $startdate=''; }      }
              if ($enddate=~/\D/) { $enddate=''; }      #
              my $domain=$ENV{'form.lcdomain'};      my $startdate = $ENV{'form.startdate'};
              my $amode='';      my $enddate   = $ENV{'form.enddate'};
              my $genpwd='';      if ($startdate=~/\D/) { $startdate=''; }
              if ($ENV{'form.login'} eq 'krb') {      if ($enddate=~/\D/)   { $enddate=''; }
                  $amode='krb4';      # Determine domain and desired host (home server)
                  $genpwd=$ENV{'form.krbdom'};      my $domain=$ENV{'form.lcdomain'};
              } elsif ($ENV{'form.login'} eq 'int') {      my $desiredhost = $ENV{'form.lcserver'};
                  $amode='internal';      if (lc($desiredhost) eq 'default') {
                  if ((defined($ENV{'form.intpwd'})) && ($ENV{'form.intpwd'})) {          $desiredhost = undef;
      $genpwd=$ENV{'form.intpwd'};      } else {
                  }          my %home_servers = &Apache::loncommon::get_library_servers($domain);
              }          if (! exists($home_servers{$desiredhost})) {
              unless (($domain=~/\W/) || ($amode eq '')) {              $r->print('<font color="#ff0000">Error:</font>'.
               $r->print('<h3>Enrolling Students</h3>');                        'Invalid home server specified');
               my $count=0;              return;
               my $flushc=0;          }
               my %student=();      }
 # ----------------------------------------------------------- Get new classlist      # Determine authentication mechanism
 # --------------------------------------------------------- Enroll new students      my $amode  = '';
       map {      my $genpwd = '';
   my %entries=&record_sep($_);      if ($ENV{'form.login'} eq 'krb') {
           $amode='krb';
                 unless (($entries{$fields{'username'}} eq '') ||   $amode.=$ENV{'form.krbver'};
                         (!defined($entries{$fields{'username'}}))) {          $genpwd=$ENV{'form.krbarg'};
                   my $fname=''; my $mname=''; my $lname=''; my $gen='';      } elsif ($ENV{'form.login'} eq 'int') {
                   if (defined($fields{'names'})) {          $amode='internal';
       ($lname,$fname,$mname)=          if ((defined($ENV{'form.intarg'})) && ($ENV{'form.intarg'})) {
             ($entries{$fields{'names'}}=~/([^\,]+)\,\s*(\w+)\s*(.*)$/);              $genpwd=$ENV{'form.intarg'};
                   } else {          }
                       if (defined($fields{'fname'})) {      } elsif ($ENV{'form.login'} eq 'loc') {
          $fname=$entries{$fields{'fname'}};          $amode='localauth';
       }          if ((defined($ENV{'form.locarg'})) && ($ENV{'form.locarg'})) {
                       if (defined($fields{'mname'})) {              $genpwd=$ENV{'form.locarg'};
          $mname=$entries{$fields{'mname'}};          }
       }      }
                       if (defined($fields{'lname'})) {      unless (($domain=~/\W/) || ($amode eq '')) {
          $lname=$entries{$fields{'lname'}};          #######################################
       }          ##         Enroll Students           ##
                       if (defined($fields{'gen'})) {          #######################################
          $gen=$entries{$fields{'gen'}};          $r->print('<h3>Enrolling Students</h3>');
       }          my $count=0;
                   }          my $flushc=0;
                   if ($entries{$fields{'username'}}=~/\W/) {          my %student=();
                      $r->print('<p><b>Unacceptable username: '.          # Get new classlist
           foreach (@studentdata) {
               my %entries=&Apache::loncommon::record_sep($_);
               # Determine student name
               unless (($entries{$fields{'username'}} eq '') ||
                       (!defined($entries{$fields{'username'}}))) {
                   my ($fname, $mname, $lname,$gen) = ('','','','');
                   if (defined($fields{'names'})) {
                       ($lname,$fname,$mname)=($entries{$fields{'names'}}=~
                                               /([^\,]+)\,\s*(\w+)\s*(.*)$/);
                   } else {
                       if (defined($fields{'fname'})) {
                           $fname=$entries{$fields{'fname'}};
                       }
                       if (defined($fields{'mname'})) {
                           $mname=$entries{$fields{'mname'}};
                       }
                       if (defined($fields{'lname'})) {
                           $lname=$entries{$fields{'lname'}};
                       }
                       if (defined($fields{'gen'})) {
                           $gen=$entries{$fields{'gen'}};
                       }
                   }
                   if ($entries{$fields{'username'}}=~/\W/) {
                       $r->print('<p><b>Unacceptable username: '.
                               $entries{$fields{'username'}}.' for user '.                                $entries{$fields{'username'}}.' for user '.
                               $fname.' '.$mname.' '.$lname.' '.$gen.'</b><p>');                                $fname.' '.$mname.' '.$lname.' '.$gen.'</b><p>');
   } else {                  } else {
                       my $sec='';                      # determine section number
                       my $username=$entries{$fields{'username'}};                      my $sec='';
                       if (defined($fields{'sec'})) {                      my $username=$entries{$fields{'username'}};
                          if (defined($entries{$fields{'sec'}})) {                      if (defined($fields{'sec'})) {
      $sec=$entries{$fields{'sec'}};                          if (defined($entries{$fields{'sec'}})) {
                          }                              $sec=$entries{$fields{'sec'}};
                       }                          }
                       my $id='';                      }
                       if (defined($fields{'id'})) {                      # determine student id number
                          if (defined($entries{$fields{'id'}})) {                      my $id='';
      $id=$entries{$fields{'id'}};                      if (defined($fields{'id'})) {
                          }                          if (defined($entries{$fields{'id'}})) {
                          $id=~tr/A-Z/a-z/;                              $id=$entries{$fields{'id'}};
                       }                          }
                       my $password='';                          $id=~tr/A-Z/a-z/;
                       if ($genpwd) {                       }
                          $password=$genpwd;                       # determine student password
       } else {                      my $password='';
                          if (defined($fields{'ipwd'})) {                      if ($genpwd) { 
      if ($entries{$fields{'ipwd'}}) {                          $password=$genpwd; 
  $password=$entries{$fields{'ipwd'}};                      } else {
                              }                          if (defined($fields{'ipwd'})) {
                          }                              if ($entries{$fields{'ipwd'}}) {
                       }                                  $password=$entries{$fields{'ipwd'}};
                       if ($password) {                              }
  &dropstudent($domain,$username,$cid,$sec);                          }
                          my $reply=&Apache::lonnet::modifystudent(                      }
                           $domain,$username,$id,$amode,$password,                      if ($password) {
    $fname,$mname,$lname,$gen,$sec,$enddate,$startdate);                          &modifystudent($domain,$username,$cid,$sec,
                          unless ($reply eq 'ok') {                                         $desiredhost);
                             $r->print(                          my $reply=&Apache::lonnet::modifystudent
                              "<p><b>Error enrolling $username: $reply</b><p>");                              ($domain,$username,$id,$amode,$password,
                                $fname,$mname,$lname,$gen,$sec,$enddate,
                                $startdate,$ENV{'form.forceid'},$desiredhost);
                           if ($reply ne 'ok') {
                               $r->print('<p><b>'.
                                         'Error enrolling '.$username.': '.
                                         $reply.'</b></p>');
           } else {            } else {
                             $count++; $flushc++;                              $count++; $flushc++;
                             $student{$username}=1;                              $student{$username}=1;
Line 682  sub upfile_drop_add { Line 1273  sub upfile_drop_add {
                                 $flushc=0;                                  $flushc=0;
                             }                              }
                         }                          }
                      } else {                      } else {
                             $r->print(                          $r->print("<p><b>No password for $username</b><p>");
                              "<p><b>No password for $username</b><p>");                      }
                      }                  }
                   }              }
                  }                           } # end of foreach (@studentdata)
               } @studentdata;          $r->print('<p>Processed Students: '.$count);
               $r->print('<p>Processed Students: '.$count);          #####################################
 # --------------------------------------------------------------- Drop students          #           Drop students           #
               if ($ENV{'form.fullup'} eq 'yes') {          #####################################
  $r->print('<h3>Dropping Students</h3>');          if ($ENV{'form.fullup'} eq 'yes') {
 # ------------------------------------------------------- Get current classlist              $r->print('<h3>Dropping Students</h3>');
                  my $classlst=&Apache::lonnet::reply              #  Get current classlist
                  ('dump:'.$ENV{'course.'.$cid.'.domain'}.':'.              my ($error,%currentlist)=&get_current_classlist($r);
                   $ENV{'course.'.$cid.'.num'}.':classlist',              if (defined($error)) {
                   $ENV{'course.'.$cid.'.home'});                  $r->print('<pre>ERROR:$error</pre>');
                  my %currentlist=();              }
                  my $now=time;              if (defined(%currentlist)) {
                  unless ($classlst=~/^error\:/) {                  # Drop the students
                      map {                  foreach (@studentdata) {
                         my ($name,$value)=split(/\=/,$_);                      my %entries=&Apache::loncommon::record_sep($_);
                         my ($end,$start)=split(/\:/,                      unless (($entries{$fields{'username'}} eq '') ||
                                             &Apache::lonnet::unescape($value));                              (!defined($entries{$fields{'username'}}))) {
                         my $active=1;                          delete($currentlist{$entries{$fields{'username'}}.
                         if (($end) && ($now>$end)) { $active=0; }                                                  ':'.$domain});
                         if ($active) {                      }
            $currentlist{&Apache::lonnet::unescape($name)}=1;                  }
                         }                  # Print out list of dropped students
                      } split(/\&/,$classlst);                  &show_drop_list($r,%currentlist);
 # ------------------------------------------------ Now got up-to-date classlist              } else {
                      map {                  $r->print("There are no students currently enrolled.\n");
                  my %entries=&record_sep($_);              }
                         unless (($entries{$fields{'username'}} eq '') ||          }
                           (!defined($entries{$fields{'username'}}))) {      } # end of unless
    delete($currentlist{  }
                             $entries{$fields{'username'}}.':'.  
                             $domain});  ###################################################################
         }  ###################################################################
                      } @studentdata;  
 # ----------------------------------------------------------- Print out choices  
                      &show_drop_list($r,%currentlist);  
          } else {  
                      $r->print(  
                   '<font color=red><h3>Could not access classlist: '.$classlst.  
                   '</h3></font>');  
                  }  
      }  
 # ------------------------------------------------------------------------ Done  
   
   }  =pod
   
   =item &drop_students
   
   Inputs: \@droplist, a pointer to an array of students to drop.
   Students should be in format of studentname:studentdomain
   
   Returns: $errors, a string describing any errors encountered.
   $successes, a string describing the successful dropping of students.
   
   =cut
   
   ###################################################################
   ###################################################################
   sub drop_students {
       my @droplist = @{shift()};
       my $courseid = $ENV{'request.course.id'};
       my $successes = '';
       my $errors = '';
       foreach (@droplist) {
           my ($sname,$sdom)=split(/:/,$_);
           my $result = &drop_student($sname,$sdom,$courseid);
           if ($result !~ /ok/) {
               $errors .= "Error dropping $sname\@$sdom: $result\n";
           } else {
               $successes .= "Dropped $sname\@$sdom\n";
           }
       }
       return ($errors,$successes);
 }  }
   ###################################################################
   ###################################################################
   
 # ================================================================== Phase four  
   
   # ================================================================== Phase four
 sub drop_student_list {  sub drop_student_list {
     my $r=shift;      my $r=shift;
     my $count=0;      my $count=0;
     map {      my @droplist;
  if ($_=~/^form\.drop\:/) {      if (ref($ENV{'form.droplist'})) {
     my ($dummy,$uname,$udom)=split(/\:/,$_);          @droplist = @{$ENV{'form.droplist'}};
             &dropstudent($udom,$uname,$ENV{'request.course.id'});      } else {
           @droplist = ($ENV{'form.droplist'});
       }
       foreach (@droplist) {
           my ($uname,$udom)=split(/\:/,$_);
           my $result = &modifystudent($udom,$uname,$ENV{'request.course.id'});
           if ($result eq 'ok' || $result eq 'ok:') {
             $r->print('Dropped '.$uname.' at '.$udom.'<br>');              $r->print('Dropped '.$uname.' at '.$udom.'<br>');
             $count++;          } else {
               $r->print('Error dropping '.$uname.' at '.$udom.': '.$result.
                         '<br />');
         }          }
     } keys %ENV;          $count++;
       }
     $r->print('<p><b>Dropped '.$count.' student(s).</b>');      $r->print('<p><b>Dropped '.$count.' student(s).</b>');
     $r->print('<p>Re-enrollment will re-activate data.');      $r->print('<p>Re-enrollment will re-activate data.');
 }  }
   
 # ================================================================ Main Handler  ###################################################################
   ###################################################################
 sub handler {  
    my $r=shift;  
   
    if ($r->header_only) {  
       $r->content_type('text/html');  
       $r->send_http_header;  
       return OK;  
    }  
   
 # ----------------------------------------------------- Needs to be in a course  =pod
   
    if (($ENV{'request.course.fn'}) &&   =item &handler
        (&Apache::lonnet::allowed('cst',$ENV{'request.course.id'}))) {  
   
 # ------------------------------------------------------------------ Start page  The typical handler you see in all these modules.  Takes $r, the
       $r->content_type('text/html');  http request, as an argument.  
       $r->send_http_header;  
       &header($r);  The response to the request is governed by two form variables
   
 # --------------------------------------------------- Phase one, initial screen   form.action      form.state     response
       unless ($ENV{'form.phase'}) {   ---------------------------------------------------
   &menu_phase_one($r);   undefined        undefined      print main menu
       }   upload           undefined      print courselist upload menu
 # ------------------------------------------------------------------- Phase two   upload           got_file       deal with uploaded file,
       if ($ENV{'form.phase'} eq 'two') {                                   print the upload managing menu
  if ($ENV{'form.fileupload'}) {   upload           enrolling      enroll students based on upload
      &menu_phase_two_upload($r);   drop             undefined      print the classlist ready to drop
          } elsif ($ENV{'form.enroll'}) {   drop             done           drop the selected students
              &menu_phase_two_enroll($r);   enrollstudent    undefined      print single student enroll menu
          } elsif ($ENV{'form.drop'}) {   enrollstudent    enrolling      enroll student
              &menu_phase_two_drop($r);   classlist        undefined      print html classlist
          }   classlist        csv            print csv classlist
       }   modifystudent    undefined      print classlist to select student to modify
    modifystudent    selected       print modify student menu
    modifystudent    done           make modifications to student record
   
   =cut
   
   ###################################################################
   ###################################################################
 # ----------------------------------------------------------------- Phase three  sub handler {
       if ($ENV{'form.phase'} eq 'three') {      my $r=shift;
   if ($ENV{'form.datatoken'}) {      if ($r->header_only) {
       &upfile_drop_add($r);          $r->content_type('text/html');
           }          $r->send_http_header;
       }          return OK;
 # ------------------------------------------------------------------ Phase four      }
       if ($ENV{'form.phase'} eq 'four') {      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
   &drop_student_list($r);                                              ['action','state']);
       }      #  Needs to be in a course
 # ------------------------------------------------------------------------- End      if (! (($ENV{'request.course.fn'}) &&
       $r->print('</form></body></html>');            (&Apache::lonnet::allowed('cst',$ENV{'request.course.id'})))) {
    } else {          # Not in a course, or not allowed to modify parms
 # ----------------------------- Not in a course, or not allowed to modify parms          $ENV{'user.error.msg'}=
       $ENV{'user.error.msg'}=              "/adm/dropadd:cst:0:0:Cannot drop or add students";
         "/adm/dropadd:cst:0:0:Cannot drop or add students";          return HTTP_NOT_ACCEPTABLE; 
       return HTTP_NOT_ACCEPTABLE;       }
    }      #
    return OK;      # Only output the header information if they did not request csv format
       #
       if (exists($ENV{'form.state'}) && ($ENV{'form.state'} eq 'csv')) {
           $r->content_type('text/csv');
       } else {
           # Start page
           $r->content_type('text/html');
           $r->send_http_header;
           $r->print(&header());
       }
       #
       # Main switch on form.action and form.state, as appropriate
       if (! exists($ENV{'form.action'})) {
           &print_main_menu($r);
       } elsif ($ENV{'form.action'} eq 'upload') {
           if (! exists($ENV{'form.state'})) {
               &print_first_courselist_upload_form($r);            
           } elsif ($ENV{'form.state'} eq 'got_file') {
               &print_upload_manager_form($r);
           } elsif ($ENV{'form.state'} eq 'enrolling') {
               if ($ENV{'form.datatoken'}) {
                   &upfile_drop_add($r);
               } else {
                   # Hmmm, this is an error
               }
           } else {
               &print_first_courselist_upload_form($r);            
           }
       } elsif ($ENV{'form.action'} eq 'drop') {
           if (! exists($ENV{'form.state'})) {
               &print_drop_menu($r);
           } elsif ($ENV{'form.state'} eq 'done') {
               &drop_student_list($r);
           } else {
               &menu_phase_two_drop($r);
           }
       } elsif ($ENV{'form.action'} eq 'enrollstudent') {
           if (! exists($ENV{'form.state'})) {
               &print_enroll_single_student_form($r);
           } elsif ($ENV{'form.state'} eq 'enrolling') {
               &enroll_single_student($r);
           } else {
               &print_enroll_single_student_form($r);
           }
       } elsif ($ENV{'form.action'} eq 'classlist') {
           if (! exists($ENV{'form.state'})) {
               &print_html_classlist($r);
           } elsif ($ENV{'form.state'} eq 'csv') {
               &print_csv_classlist($r);
           } else {
               &print_html_classlist($r);
           }
       } elsif ($ENV{'form.action'} eq 'modifystudent') {
           if (! exists($ENV{'form.state'})) {
               &print_html_classlist($r);
           } elsif ($ENV{'form.state'} eq 'selected') {
               &print_modify_student_form($r);
           } elsif ($ENV{'form.state'} eq 'done') {
               &modify_single_student($r);
           } else {
               &print_html_classlist($r);
           }        
       } else {
           # We should not end up here, but I guess it is possible
           &Apache::lonnet::logthis("Undetermined state in londropadd.pm.  ".
                                    "form.action = ".$ENV{'form.action'}.
                                    "Someone should fix this.");
           &print_main_menu($r);
       }
       #
       # Finish up
       if (exists($ENV{'form.state'}) && ($ENV{'form.state'} eq 'csv')) {
           $r->print("\n");
       } else {
           $r->print('</form></body></html>');
       }
       return OK;
 }  }
   
   ###################################################################
   ###################################################################
   
 1;  1;
 __END__  __END__
   
   
   
   

Removed from v.1.11  
changed lines
  Added in v.1.52


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