Diff for /loncom/interface/Attic/londropadd.pm between versions 1.8 and 1.21

version 1.8, 2001/01/01 17:30:00 version 1.21, 2002/04/03 16:45:25
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 
 #  #
   # $Id$
   #
   # Copyright Michigan State University Board of Trustees
   #
   # 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
   #
   # /home/httpd/html/adm/gpl.txt
   #
   # http://www.lon-capa.org/
   #
 # (Handler to set parameters for assessments  # (Handler to set parameters for assessments
 #  #
 # (Handler to resolve ambiguous file locations  # (Handler to resolve ambiguous file locations
 #  #
 # (TeX Content Handler  # (TeX Content Handler
 #  #
   # YEAR=2000
 # 05/29/00,05/30,10/11 Gerd Kortemeyer)  # 05/29/00,05/30,10/11 Gerd Kortemeyer)
 #  #
 # 10/11,10/12,10/16 Gerd Kortemeyer)  # 10/11,10/12,10/16 Gerd Kortemeyer)
Line 15 Line 40
 # 12/08,12/12 Gerd Kortemeyer)  # 12/08,12/12 Gerd Kortemeyer)
 #  #
 # 12/26,12/27,12/28,  # 12/26,12/27,12/28,
 # 01/01/01 Gerd Kortemeyer  # YEAR=2001
   # 01/01/01,01/15,02/10,02/13,02/14,02/22 Gerd Kortemeyer
   # 8/6 Scott Harrison
   # Guy Albertelli
   # 9/25 Gerd Kortemeyer
   # 12/19 Guy Albertelli
   # YEAR=2002
   # 1/4 Gerd Kortemeyer
   
 package Apache::londropadd;  package Apache::londropadd;
   
Line 23  use strict; Line 55  use strict;
 use Apache::lonnet;  use Apache::lonnet;
 use Apache::Constants qw(:common :http REDIRECT);  use Apache::Constants qw(:common :http REDIRECT);
   
   # ================================================================ Print header
   
 # ================================================================ Main Handler  sub header {
       my $r=shift;
 sub handler {      $r->print(<<ENDHEAD);
    my $r=shift;  
   
    if ($r->header_only) {  
       $r->content_type('text/html');  
       $r->send_http_header;  
       return OK;  
    }  
   
 # ----------------------------------------------------- Needs to be in a course  
   
    if (($ENV{'request.course.fn'}) &&   
        (&Apache::lonnet::allowed('cst',$ENV{'request.course.id'}))) {  
   
 # ------------------------------------------------------------------ Start page  
       $r->content_type('text/html');  
       $r->send_http_header;  
       $r->print(<<ENDHEAD);  
 <html>  <html>
 <head>  <head>
 <title>LON-CAPA Student Drop/Add</title>  <title>LON-CAPA Student Drop/Add</title>
Line 55  sub handler { Line 71  sub handler {
 action="/adm/dropadd" name="studentform">  action="/adm/dropadd" name="studentform">
 <h2>Course: $ENV{'course.'.$ENV{'request.course.id'}.'.description'}</h2>  <h2>Course: $ENV{'course.'.$ENV{'request.course.id'}.'.description'}</h2>
 ENDHEAD  ENDHEAD
 # --------------------------------------------------- Phase one, initial screen  }
     unless ($ENV{'form.phase'}) {  
  $r->print(<<ENDUPFORM);  # ========================================================= Store uploaded file
   # needs $ENV{'form.upfile'}
   # return $datatoken to be put into hidden field
   
   sub upfile_store {
       my $r=shift;
       $ENV{'form.upfile'}=~s/\r/\n/gs;
       $ENV{'form.upfile'}=~s/\f/\n/gs;
       $ENV{'form.upfile'}=~s/\n+/\n/gs;
       $ENV{'form.upfile'}=~s/\n+$//gs;
         
       my $datatoken=$ENV{'user.name'}.'_'.$ENV{'user.domain'}.
     '_enroll_'.$ENV{'request.course.id'}.'_'.time.'_'.$$;
       {
          my $fh=Apache::File->new('>'.$r->dir_config('lonDaemons').
                                      '/tmp/'.$datatoken.'.tmp');
          print $fh $ENV{'form.upfile'};
       }
       return $datatoken;
   }
   
   # ================================================= Load uploaded file from tmp
   # needs $ENV{'form.datatoken'}
   # sets $ENV{'form.upfile'}
   
   sub load_tmp_file {
       my $r=shift;
       my @studentdata=();
       {
         my $fh;
         if ($fh=Apache::File->new($r->dir_config('lonDaemons').
     '/tmp/'.$ENV{'form.datatoken'}.'.tmp')) {
        @studentdata=<$fh>;
         }
       }
       $ENV{'form.upfile'}=join('',@studentdata);
   }
   
   # ========================================= Separate uploaded file into records
   # returns array of records
   
   sub upfile_record_sep {
       if ($ENV{'form.upfiletype'} eq 'xml') {
       } else {
          return split(/\n/,$ENV{'form.upfile'});
       }
   }
   
   # =============================================== Separate a record into fields
   
   sub record_sep {
       my $record=shift;
       my %components=();
       if ($ENV{'form.upfiletype'} eq 'xml') {
       } elsif ($ENV{'form.upfiletype'} eq 'space') {
           my $i=0;
           foreach (split(/\s+/,$record)) {
               my $field=$_;
               $field=~s/^(\"|\')//;
               $field=~s/(\"|\')$//;
               $components{$i}=$field;
               $i++;
           }
       } elsif ($ENV{'form.upfiletype'} eq 'tab') {
           my $i=0;
           foreach (split(/\t+/,$record)) {
               my $field=$_;
               $field=~s/^(\"|\')//;
               $field=~s/(\"|\')$//;
               $components{$i}=$field;
               $i++;
           }
       } 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;
   }
   
   # =========== Drop student from all sections of a course, except optional $csec
   
   sub dropstudent {
        my ($udom,$unam,$courseid,$csec)=@_;
        $courseid=~s/\_/\//g;
        $courseid=~s/^(\w)/\/$1/;
        foreach (split(/\&/,
       &Apache::lonnet::reply('dump:'.$udom.':'.$unam.':roles',
        &Apache::lonnet::homeserver($unam,$udom)))) {
           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) && (!$csec)) || ($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);
               }
     }
           }
       }
   }
   
   # ============================================================== Menu Phase One
   
   sub menu_phase_one {
       my $r=shift;
       $r->print(<<ENDUPFORM);
 <input type=hidden name=phase value=two>  <input type=hidden name=phase value=two>
 <hr>  <hr>
 <h3>Upload a courselist</h3>  <h3>Upload a courselist</h3>
Line 73  ENDHEAD Line 222  ENDHEAD
 <h3>Enroll a single student</h3>  <h3>Enroll a single student</h3>
 <p><input type=submit name=enroll value="Enroll Student">  <p><input type=submit name=enroll value="Enroll Student">
 <hr>  <hr>
 <h3>Drop a student</h3>  <h3>Drop students</h3>
 <p><input type=submit name=drop value="Drop Student">  <p><input type=submit name=drop value="Selection List">
 ENDUPFORM  ENDUPFORM
       }  }
 # ------------------------------------------------------------------- Phase two  
       if ($ENV{'form.phase'} eq 'two') {  # ======================================================= Menu Phase Two Upload
   if ($ENV{'form.fileupload'}) {  
       my $datatoken=$ENV{'user.name'}.'_'.$ENV{'user.domain'}.  sub menu_phase_two_upload {
   '_enroll_'.$ENV{'request.course.id'}.'_'.time.'_'.$$;      my $r=shift;
     {  
                 my $fh=Apache::File->new('>'.$r->dir_config('lonDaemons').      my $datatoken=&upfile_store($r);
                                          '/tmp/'.$datatoken.'.tmp');  
  print $fh $ENV{'form.upfile'};      my @records=&upfile_record_sep();
     }      my $total=$#records;
              my $separator='';      my $distotal=$total+1;
              my $remove='';      
              if ($ENV{'form.upfiletype'} eq 'csv') {      $ENV{'SERVER_NAME'}=~/(\w+\.\w+)$/;
  $separator='\"\,\s*\"';      my $krbdefdom=$1;
                  $remove='"';      $krbdefdom=~tr/a-z/A-Z/;
              } elsif ($ENV{'form.upfiletype'} eq 'space') {  
                  $separator='\s+';      my $today=time;
              } elsif ($ENV{'form.upfiletype'} eq 'tab') {      my $halfyear=$today+15552000;
                  $separator='\t+';  
              } elsif ($ENV{'form.upfiletype'} eq 'xml') {      my $defdom=$r->dir_config('lonDefDomain');
              }  
              my @lines=split(/\n/,$ENV{'form.upfile'});      $r->print(<<ENDPICK);
              my $total=$#lines;  
              $ENV{'SERVER_NAME'}=~/(\w+\.\w+)$/;  
      my $krbdefdom=$1;  
              $krbdefdom=~tr/a-z/A-Z/;  
              my $today=time;  
              my $halfyear=$today+15552000;  
              my $defdom=$r->dir_config('lonDefDomain');  
      $r->print(<<ENDPICK);  
 <input type=hidden name=phase value=three>  <input type=hidden name=phase value=three>
 <input type=hidden name=datatoken value="$datatoken">  <input type=hidden name=datatoken value="$datatoken">
 <input type=hidden name=upfiletype value=$ENV{'form.upfiletype'}>  <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: $total  Total number of records found in file: $distotal
 <script>  <script>
 function verify(vf) {  function verify(vf) {
     var founduname=0;      var founduname=0;
Line 149  function verify(vf) { Line 290  function verify(vf) {
             return;              return;
         }          }
     }      }
       if (vf.login[2].checked) {
    foundatype=1;
    //An argument is not required
       }
     if (foundatype==0) {      if (foundatype==0) {
  alert('You need to set the login type');   alert('You need to set the login type');
         return;          return;
Line 163  function verify(vf) { Line 308  function verify(vf) {
         message+='No ending date set. ';          message+='No ending date set. ';
     }      }
     if ((vf.enddate.value!='') && (vf.startdate.value!='')) {      if ((vf.enddate.value!='') && (vf.startdate.value!='')) {
        if (vf.enddate.value<vf.startdate.value) {         if (Math.round(vf.enddate.value)<Math.round(vf.startdate.value)) {
           alert('Ending date is before starting date');            alert('Ending date is before starting date');
           return;            return;
        }         }
Line 207  function flip(vf,tf) { Line 352  function flip(vf,tf) {
        vf.login[1].checked=true;         vf.login[1].checked=true;
        vf.intpwd.value='';         vf.intpwd.value='';
        vf.krbdom.value='';         vf.krbdom.value='';
          vf.locarg.value='';
    }     }
   
 }  }
Line 277  function clickint(vf) { Line 423  function clickint(vf) {
 </script>  </script>
 <table border=2><tr><th>Field</th><th>Samples</th></tr>  <table border=2><tr><th>Field</th><th>Samples</th></tr>
 ENDPICK  ENDPICK
              my @sone; my @stwo; my @sthree; my $nfields=0;               my %sone; my %stwo; my %sthree;
              if ($#lines>=0) {               my $i=0;
  $lines[0]=~s/^$remove//;  
                 $lines[0]=~s/$remove$//;               if ($total>=0) {
                 @sone=split(/$separator/,$lines[0]);                  %sone=&record_sep($records[0]);
                 $nfields=$#sone;                  if ($total>=1) {
                 if ($#lines>=1) {                     %stwo=&record_sep($records[1]);
           $lines[1]=~s/^$remove//;                     
                    $lines[1]=~s/$remove$//;  
                    @stwo=split(/$separator/,$lines[1]);  
                    $nfields=$#stwo;  
         }          }
                 if ($#lines>=2) {                  if ($total>=2) {
    $lines[2]=~s/^$remove//;                     %sthree=&record_sep($records[2]);
                    $lines[2]=~s/$remove$//;  
                    @sthree=split(/$separator/,$lines[2]);  
                    $nfields=$#sthree;  
         }          }
                 my $i;                  foreach (sort keys %sone) {
                 for ($i=0;$i<=$nfields;$i++) {  
                    $r->print('<tr><td><select name=f'.$i.                     $r->print('<tr><td><select name=f'.$i.
                        ' onChange="flip(this.form,'.$i.');">');                         ' onChange="flip(this.form,'.$i.');">');
                    map {                     foreach ('none: ','username:Username',
                       my ($value,$display)=split(/\:/,$_);  
                       $r->print('<option value='.$value.'>'.$display.  
                               '</option>');  
                    } ('none: ','username:Username',  
                       'names:Last Name, First Names',                        'names:Last Name, First Names',
                       'fname:First Name','mname:Middle Names/Initials',                        'fname:First Name','mname:Middle Names/Initials',
                       'lname:Last Name','gen:Generation',                        'lname:Last Name','gen:Generation',
                       'id:ID/Student Number','sec:Group/Section',                        'id:ID/Student Number','sec:Group/Section',
                       'ipwd:Initial Password');                        'ipwd:Initial Password') {
         my ($value,$display)=split(/\:/,$_);
                         $r->print('<option value='.$value.'>'.$display.
                                 '</option>');
                      }
                    $r->print('</select></td><td>');                     $r->print('</select></td><td>');
                    if (defined($sone[$i])) {                      if (defined($sone{$_})) { 
                       $r->print($sone[$i]."</br>\n");                         $r->print($sone{$_}."</br>\n"); 
                    }                     }
            if (defined($stwo[$i])) {              if (defined($stwo{$_})) { 
                       $r->print($stwo[$i]."</br>\n");                         $r->print($stwo{$_}."</br>\n"); 
                    }                     }
            if (defined($sthree[$i])) {              if (defined($sthree{$_})) { 
                       $r->print($sthree[$i]."</br>\n");                         $r->print($sthree{$_}."</br>\n"); 
                    }                     }
                    $r->print('</td></tr>');                     $r->print('</td></tr>');
                      $i++;
        }         }
          $i--;
      }       }
                my $keyfields=join(',',sort keys %sone);
              $r->print(<<ENDPICK);               $r->print(<<ENDPICK);
 </table>  </table>
 <input type=hidden name=nfields value=$nfields>  <input type=hidden name=nfields value=$i>
   <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>
   <p>
   <input type=radio name=login value=krb onClick="clickkrb(this.form);" />
 Kerberos authenticated with domain  Kerberos authenticated with domain
 <input type=text size=10 name=krbdom onChange="setkrb(this.form);"><p>  <input type=text size=10 name=krbdom onChange="setkrb(this.form);" />
 <input type=radio name=login value=int onClick="clickint(this.form);">   </p>
   <p>
   <input type=radio name=login value=int onClick="clickint(this.form);" />
 Internally authenticated (with initial password   Internally authenticated (with initial password 
 <input type=text size=10 name=intpwd onChange="setint(this.form);">)  <input type=text size=10 name=intpwd onChange="setint(this.form);" />)
   </p>
   <p>
   <input type=radio name=login value=loc onClick="clickloc(this.form);" />
   Local Authentication with argument
   <input type=text size=10 name=locarg onChange="setloc(this.form);" />
   </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: <input type=text size=10 value=$defdom name=lcdomain><p>
 <h3>Starting and Ending Dates</h3>  <h3>Starting and Ending Dates</h3>
Line 349  LON-CAPA domain: <input type=text size=1 Line 502  LON-CAPA domain: <input type=text size=1
 >Set Ending Date</a><p>  >Set Ending Date</a><p>
 <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 dropping students)<p>  (also print list of users not enrolled anymore)<p>
   <h3>ID/Student Number</h3>
   <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="verify(this.form)" value="Update Courselist"><br>  <input type=button onClick="verify(this.form)" value="Update Courselist"><br>
 Note: for large courses, this operation might be time consuming.  Note: for large courses, this operation might be time consuming.
 ENDPICK  ENDPICK
          } elsif ($ENV{'form.enroll'}) {  }
          } elsif ($ENV{'form.drop'}) {  
          }  # ======================================================= Enroll single student
       }  
 # ----------------------------------------------------------------- Phase three  sub enroll_single_student {
       if ($ENV{'form.phase'} eq 'three') {      my $r=shift;
   if ($ENV{'form.datatoken'}) {      $r->print('<h3>Enrolling Student</h3>');
              my $separator='';      if (($ENV{'form.cuname'})&&($ENV{'form.cuname'}!~/\W/)&&
              my $remove='';          ($ENV{'form.cdomain'})&&($ENV{'form.cdomain'}!~/\W/)) {
              if ($ENV{'form.upfiletype'} eq 'csv') {   my $amode='';
  $separator='\"\,\s*\"';          my $genpwd='';
                  $remove='"';          if ($ENV{'form.login'} eq 'krb') {
              } elsif ($ENV{'form.upfiletype'} eq 'space') {             $amode='krb4';
                  $separator='\s+';             $genpwd=$ENV{'form.krbdom'};
              } elsif ($ENV{'form.upfiletype'} eq 'tab') {          } elsif ($ENV{'form.login'} eq 'int') {
                  $separator='\t+';             $amode='internal';
              } elsif ($ENV{'form.upfiletype'} eq 'xml') {             $genpwd=$ENV{'form.intpwd'};
              }          }  elsif ($ENV{'form.login'} eq 'loc') {
       $amode='localauth';
       $genpwd=$ENV{'form.locarg'};
       if (!$genpwd) { $genpwd=" "; }
    }
           if (($amode) && ($genpwd)) {
      &dropstudent($ENV{'form.cdomain'},$ENV{'form.cuname'},
          $ENV{'request.course.id'},$ENV{'form.csec'});
             $r->print(&Apache::lonnet::modifystudent(
                         $ENV{'form.cdomain'},$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'}));
    } else {
              $r->print('Invalid login mode or password');    
           }          
       } else {
           $r->print('Invalid username or domain');
       }    
   }
   
   # ======================================================= Menu Phase Two Enroll
   
   sub menu_phase_two_enroll {
       my $r=shift;
       
       $ENV{'SERVER_NAME'}=~/(\w+\.\w+)$/;
       my $krbdefdom=$1;
       $krbdefdom=~tr/a-z/A-Z/;
   
       my $today=time;
       my $halfyear=$today+15552000;
   
       my $defdom=$r->dir_config('lonDefDomain');
   
       $r->print(<<ENDSENROLL);
   <script>
   function verify(vf) {
       var founduname=0;
       var foundpwd=0;
       var foundname=0;
       var foundid=0;
       var foundsec=0;
       var foundatype=0;
       var tw;
       var message='';
       if ((typeof(vf.cuname.value)!="undefined") && (vf.cuname.value!='') && 
    (typeof(vf.cdomain.value)!="undefined") && (vf.cdomain.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;
       }
       if (vf.login[0].checked) {
    foundatype=1;
           if (vf.krbdom.value=='') {
       alert('You need to specify the Kerberos domain');
               return;
           }
       }
       if (vf.login[1].checked) {
    foundatype=1;
           if ((vf.intpwd.value=='') && (foundpwd==0)) {
       alert('You need to specify the initial password');
               return;
           }
       }
       if (vf.login[2].checked) {
    foundatype=1;
    //An argument is not required
       }
       if (foundatype==0) {
    alert('You need to set the login type');
           return;
       }
       if (foundname==0) { message='No first and last name specified. '; }
       if (foundid==0) { message+='No ID or student number field specified. '; }
       if (foundsec==0) { message+='No section or group field specified. '; }
       if (vf.startdate.value=='') {
    message+='No starting date set. ';
       }
       if (vf.enddate.value=='') {
           message+='No ending date set. ';
       }
       if ((vf.enddate.value!='') && (vf.startdate.value!='')) {
          if (Math.round(vf.enddate.value)<Math.round(vf.startdate.value)) {
             alert('Ending date is before starting date');
             return;
          }
       }
       if (message!='') {
          message+='Continue enrollment?';
          if (confirm(message)) {
     pclose();
     vf.submit();
          }
       } else {
         pclose();
         vf.submit();
       }   
   }
   
   function setkrb(vf) {
       if (vf.krbdom.value!='') {
          vf.login[0].checked=true;
          vf.krbdom.value=vf.krbdom.value.toUpperCase();
          vf.intpwd.value='';
          vf.locarg.value='';
      }
   }
   
   function setint(vf) {
       if (vf.intpwd.value!='') {
          vf.login[1].checked=true;
          vf.krbdom.value='';
          vf.locarg.value='';
      }
   }
   
   function setloc(vf) {
       if (vf.locarg.value!='') {
          vf.login[2].checked=true;
          vf.krbdom.value='';
          vf.intpwd.value='';
      }
   }
   
   function clickkrb(vf) {
       vf.krbdom.value='$krbdefdom';
       vf.intpwd.value='';
       vf.locarg.value='';
   }
   
   function clickint(vf) {
       vf.krbdom.value='';
       vf.locarg.value='';
   }
   
   function clickloc(vf) {
       vf.krbdom.value='';
       vf.intpwd.value='';
   }
   
       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();
       }
   
   </script>
   <h3>Personal Data</h3>
   First Name: <input type=text name=cfirst size=15><br>
   Middle Name: <input type=text name=cmiddle size=15><br>
   Last Name: <input type=text name=clast size=15><br>
   Generation: <input type=text name=cgen size=5><p>
   
   ID/Student Number: <input type=text name=cstid size=10><p>
   
   Group/Section: <input type=text name=csec size=5><p>
   
   <h3>Login Data</h3>
   Username: <input type=text name=cuname size=15><p>
   Domain: <input type=text size=10 value=$defdom name=cdomain><p>
   Note: login settings below  will not take effect if the user already exists<p>
   
   <input type=radio name=login value=krb onClick="clickkrb(this.form);">
   Kerberos authenticated with domain
   <input type=text size=10 name=krbdom onChange="setkrb(this.form);"><p>
   <input type=radio name=login value=int onClick="clickint(this.form);"> 
   Internally authenticated (with initial password 
   <input type=text size=10 name=intpwd onChange="setint(this.form);">)
   <p>
   <input type=radio name=login value=loc onClick="clickloc(this.form);" />
   Local Authentication with argument
   <input type=text size=10 name=locarg onChange="setloc(this.form);" />
   </p>
   <h3>Starting and Ending Dates</h3>
   <input type="hidden" value='' name="pres_value">
   <input type="hidden" value='' name="pres_type">
   <input type="hidden" value='' name="pres_marker">
   <input type="hidden" value='$today' name=startdate>
   <input type="hidden" value='$halfyear' name=enddate>
   <a 
    href="javascript:pjump('date_start','Enrollment Starting Date',document.studentform.startdate.value,'start','studentform.pres','dateset');"
   >Set Starting Date</a><p>
   
   <a 
    href="javascript:pjump('date_end','Enrollment Ending Date',document.studentform.enddate.value,'end','studentform.pres','dateset');"
   >Set Ending Date</a><p>
   <h3>ID/Student Number</h3>
   <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="verify(this.form)" value="Enroll as student"><br>
   <input type=hidden name=phase value=five>
   ENDSENROLL
   }
   
   # ========================================================= Menu Phase Two Drop
   
   sub menu_phase_two_drop {
       my $r=shift;
       my $cid=$ENV{'request.course.id'};
                    my $classlst=&Apache::lonnet::reply
                    ('dump:'.$ENV{'course.'.$cid.'.domain'}.':'.
                     $ENV{'course.'.$cid.'.num'}.':classlist',
                     $ENV{'course.'.$cid.'.home'});
                    my %currentlist=();
                    my $now=time;
                    unless ($classlst=~/^error\:/) {
                        foreach (split(/\&/,$classlst)) {
                           my ($name,$value)=split(/\=/,$_);
                           my ($end,$start)=split(/\:/,
                                               &Apache::lonnet::unescape($value));
                           my $active=1;
                           if (($end) && ($now>$end)) { $active=0; }
                           if ($active) {
              $currentlist{&Apache::lonnet::unescape($name)}=1;
                           }
                        }
   # ----------------------------------------------------------- Print out choices
                        &show_drop_list($r,%currentlist);
            } else {
                        $r->print(
                     '<font color=red><h3>Could not access classlist: '.$classlst.
                     '</h3></font>');
                    }
   }
   
   # =================================================== Show student list to drop
   
   sub show_drop_list {
       my ($r,%currentlist)=@_;
       my $cid=$ENV{'request.course.id'};
   
       $r->print('<input type=hidden name=phase value=four>');
                        $r->print('<table border=2>');
                        foreach (sort keys %currentlist) {
                            my ($sname,$sdom)=split(/\:/,$_);
                            my %reply=&Apache::lonnet::idrget($sdom,$sname);
                            my $ssec=&Apache::lonnet::usection($sdom,$sname,$cid);
                            my @reply=split(/[\&\=]/,&Apache::lonnet::reply(
                              'get:'.$sdom.':'.$sname.
         ':environment:firstname&middlename&lastname&generation',
                              &Apache::lonnet::homeserver($sname,$sdom)));
     $r->print(
                     '<tr><td><input type=checkbox name="drop:'.$_.'"></td><td>'.
                                      $sname.'</td><td>'.$sdom.'</td><td>'.
                                      $reply{$sname}.'</td><td>'.
                                      &Apache::lonnet::unescape($reply[2]).' '.
                                      &Apache::lonnet::unescape($reply[3]).', '.
                                      &Apache::lonnet::unescape($reply[0]).' '.
                                      &Apache::lonnet::unescape($reply[1]).
                                      '</td><td>'.
                                      $ssec."</td></tr>\n");
                        }
                        $r->print('</table><br>');
                        $r->print('<input type=submit value="Drop Students">');
   }
   
   # ================================================= Drop/Add from uploaded file
   
   sub upfile_drop_add {
       my $r=shift;
   
       &load_tmp_file($r);
       my @studentdata=&upfile_record_sep();
   
       my @keyfields=split(/\,/,$ENV{'form.keyfields'});
       my $cid=$ENV{'request.course.id'};
   
              my %fields=();               my %fields=();
              for (my $i=0;$i<=$ENV{'form.nfields'};$i++) {               for (my $i=0;$i<=$ENV{'form.nfields'};$i++) {
                  $fields{$ENV{'form.f'.$i}}=$i;                   $fields{$ENV{'form.f'.$i}}=$keyfields[$i];
              }               }
              my $startdate=$ENV{'form.startdate'};               my $startdate=$ENV{'form.startdate'};
              my $enddate=$ENV{'form.enddate'};               my $enddate=$ENV{'form.enddate'};
Line 390  ENDPICK Line 851  ENDPICK
                  if ((defined($ENV{'form.intpwd'})) && ($ENV{'form.intpwd'})) {                   if ((defined($ENV{'form.intpwd'})) && ($ENV{'form.intpwd'})) {
      $genpwd=$ENV{'form.intpwd'};       $genpwd=$ENV{'form.intpwd'};
                  }                   }
              }               } elsif ($ENV{'form.login'} eq 'loc') {
    $amode='localauth';
    if ((defined($ENV{'form.locarg'})) && ($ENV{'form.locarg'})) {
        $genpwd=$ENV{'form.locarg'};
                    }
        }
              unless (($domain=~/\W/) || ($amode eq '')) {               unless (($domain=~/\W/) || ($amode eq '')) {
               $r->print('<h3>Enrolling Students</h3>');                $r->print('<h3>Enrolling Students</h3>');
               my $count=0;                my $count=0;
               my $flushc=0;                my $flushc=0;
               my %student=();                my %student=();
 # ----------------------------------------------------------- Get new classlist  # ----------------------------------------------------------- Get new classlist
               my @studentdata=();  
              {  
                 my $fh;  
                 if ($fh=Apache::File->new($r->dir_config('lonDaemons').  
               '/tmp/'.$ENV{'form.datatoken'}.'.tmp')) {  
     @studentdata=<$fh>;  
                 }  
      }  
 # --------------------------------------------------------- Enroll new students  # --------------------------------------------------------- Enroll new students
       map {        foreach (@studentdata) {
                 my $line=$_;    my %entries=&record_sep($_);
                 chomp($line);  
                 $line=~s/^$remove//;                  unless (($entries{$fields{'username'}} eq '') ||
                 $line=~s/$remove$//;                          (!defined($entries{$fields{'username'}}))) {
         my @entries=split(/$separator/,$line);  
                 unless (($entries[$fields{'username'}] eq '') ||  
                         (!defined($entries[$fields{'username'}]))) {  
                   my $fname=''; my $mname=''; my $lname=''; my $gen='';                    my $fname=''; my $mname=''; my $lname=''; my $gen='';
                   if (defined($fields{'names'})) {                    if (defined($fields{'names'})) {
       ($lname,$fname,$mname)=        ($lname,$fname,$mname)=
             ($entries[$fields{'names'}]=~/([^\,]+)\,\s*(\w+)\s*(.*)$/);              ($entries{$fields{'names'}}=~/([^\,]+)\,\s*(\w+)\s*(.*)$/);
                   } else {                    } else {
                       if (defined($fields{'fname'})) {                        if (defined($fields{'fname'})) {
          $fname=$entries[$fields{'fname'}];           $fname=$entries{$fields{'fname'}};
       }        }
                       if (defined($fields{'mname'})) {                        if (defined($fields{'mname'})) {
          $mname=$entries[$fields{'mname'}];           $mname=$entries{$fields{'mname'}};
       }        }
                       if (defined($fields{'lname'})) {                        if (defined($fields{'lname'})) {
          $lname=$entries[$fields{'lname'}];           $lname=$entries{$fields{'lname'}};
       }        }
                       if (defined($fields{'gen'})) {                        if (defined($fields{'gen'})) {
          $gen=$entries[$fields{'gen'}];           $gen=$entries{$fields{'gen'}};
       }        }
                   }                    }
                   if ($entries[$fields{'username'}]=~/\W/) {                    if ($entries{$fields{'username'}}=~/\W/) {
                      $r->print('<p><b>Unacceptable username: '.                       $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='';                        my $sec='';
                       my $username=$entries[$fields{'username'}];                        my $username=$entries{$fields{'username'}};
                       if (defined($fields{'sec'})) {                        if (defined($fields{'sec'})) {
                          if (defined($entries[$fields{'sec'}])) {                           if (defined($entries{$fields{'sec'}})) {
      $sec=$entries[$fields{'sec'}];       $sec=$entries{$fields{'sec'}};
                          }                           }
                       }                        }
                       my $id='';                        my $id='';
                       if (defined($fields{'id'})) {                        if (defined($fields{'id'})) {
                          if (defined($entries[$fields{'id'}])) {                           if (defined($entries{$fields{'id'}})) {
      $id=$entries[$fields{'id'}];       $id=$entries{$fields{'id'}};
                          }                           }
                          $id=~tr/A-Z/a-z/;                           $id=~tr/A-Z/a-z/;
                       }                        }
Line 456  ENDPICK Line 911  ENDPICK
                          $password=$genpwd;                            $password=$genpwd; 
       } else {        } else {
                          if (defined($fields{'ipwd'})) {                           if (defined($fields{'ipwd'})) {
      if ($entries[$fields{'ipwd'}]) {       if ($entries{$fields{'ipwd'}}) {
  $password=$entries[$fields{'ipwd'}];   $password=$entries{$fields{'ipwd'}};
                              }                               }
                          }                           }
                       }                        }
                       if ($password) {                         if ($password) {
    &dropstudent($domain,$username,$cid,$sec);
                          my $reply=&Apache::lonnet::modifystudent(                           my $reply=&Apache::lonnet::modifystudent(
                           $domain,$username,$id,$amode,$password,                            $domain,$username,$id,$amode,$password,
    $fname,$mname,$lname,$gen,$sec,$enddate,$startdate);     $fname,$mname,$lname,$gen,$sec,$enddate,$startdate,
                              $ENV{'form.forceid'});
                          unless ($reply eq 'ok') {                           unless ($reply eq 'ok') {
                             $r->print(                              $r->print(
                              "<p><b>Error enrolling $username: $reply</b><p>");                               "<p><b>Error enrolling $username: $reply</b><p>");
  } else {            } else {
                             $count++; $flushc++;                              $count++; $flushc++;
                             $student{$username}=1;                              $student{$username}=1;
                             $r->print('. ');                              $r->print('. ');
Line 483  ENDPICK Line 940  ENDPICK
                      }                       }
                   }                    }
                  }                                    }                 
               } @studentdata;                }
               $r->print('<p>Processed Students: '.$count);                $r->print('<p>Processed Students: '.$count);
 # --------------------------------------------------------------- Drop students  # --------------------------------------------------------------- Drop students
               if ($ENV{'form.fullup'} eq 'yes') {                if ($ENV{'form.fullup'} eq 'yes') {
  $r->print('<h3>Dropping Students</h3>');   $r->print('<h3>Dropping Students</h3>');
 # ------------------------------------------------------- Get current classlist  # ------------------------------------------------------- Get current classlist
                  my $cid=$ENV{'request.course.id'};  
                  my $classlst=&Apache::lonnet::reply                   my $classlst=&Apache::lonnet::reply
                  ('dump:'.$ENV{'course.'.$cid.'.domain'}.':'.                   ('dump:'.$ENV{'course.'.$cid.'.domain'}.':'.
                   $ENV{'course.'.$cid.'.num'}.':classlist',                    $ENV{'course.'.$cid.'.num'}.':classlist',
Line 497  ENDPICK Line 953  ENDPICK
                  my %currentlist=();                   my %currentlist=();
                  my $now=time;                   my $now=time;
                  unless ($classlst=~/^error\:/) {                   unless ($classlst=~/^error\:/) {
                      map {                       foreach (split(/\&/,$classlst)) {
                         my ($name,$value)=split(/\=/,$_);                          my ($name,$value)=split(/\=/,$_);
                         my ($end,$start)=split(/\:/,                          my ($end,$start)=split(/\:/,
                                             &Apache::lonnet::unescape($value));                                              &Apache::lonnet::unescape($value));
Line 506  ENDPICK Line 962  ENDPICK
                         if ($active) {                          if ($active) {
            $currentlist{&Apache::lonnet::unescape($name)}=1;             $currentlist{&Apache::lonnet::unescape($name)}=1;
                         }                          }
                      } split(/\&/,$classlst);                       }
   # ------------------------------------------------ Now got up-to-date classlist
                        foreach (@studentdata) {
                    my %entries=&record_sep($_);
                           unless (($entries{$fields{'username'}} eq '') ||
                             (!defined($entries{$fields{'username'}}))) {
      delete($currentlist{
                               $entries{$fields{'username'}}.':'.
                               $domain});
           }
                        }
   # ----------------------------------------------------------- Print out choices
                        &show_drop_list($r,%currentlist);
          } else {           } else {
                      $r->print(                       $r->print(
                   '<font color=red><h3>Could not access classlist: '.$classlst.                    '<font color=red><h3>Could not access classlist: '.$classlst.
Line 515  ENDPICK Line 982  ENDPICK
                  }                   }
      }       }
 # ------------------------------------------------------------------------ Done  # ------------------------------------------------------------------------ Done
           }  
     }
   }
   
   # ================================================================== Phase four
   
   sub drop_student_list {
       my $r=shift;
       my $count=0;
       foreach (keys %ENV) {
    if ($_=~/^form\.drop\:/) {
       my ($dummy,$uname,$udom)=split(/\:/,$_);
               &dropstudent($udom,$uname,$ENV{'request.course.id'});
               $r->print('Dropped '.$uname.' at '.$udom.'<br>');
               $count++;
         }          }
       }
       $r->print('<p><b>Dropped '.$count.' student(s).</b>');
       $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
   
      if (($ENV{'request.course.fn'}) && 
          (&Apache::lonnet::allowed('cst',$ENV{'request.course.id'}))) {
   
   # ------------------------------------------------------------------ Start page
         $r->content_type('text/html');
         $r->send_http_header;
         &header($r);
   
   # --------------------------------------------------- Phase one, initial screen
         unless ($ENV{'form.phase'}) {
     &menu_phase_one($r);
         }
   # ------------------------------------------------------------------- Phase two
         if ($ENV{'form.phase'} eq 'two') {
    if ($ENV{'form.fileupload'}) {
        &menu_phase_two_upload($r);
            } elsif ($ENV{'form.enroll'}) {
                &menu_phase_two_enroll($r);
            } elsif ($ENV{'form.drop'}) {
                &menu_phase_two_drop($r);
            }
         }
   
   
   
   
   # ----------------------------------------------------------------- Phase three
         if ($ENV{'form.phase'} eq 'three') {
     if ($ENV{'form.datatoken'}) {
         &upfile_drop_add($r);
             }
         }
   # ------------------------------------------------------------------ Phase four
         if ($ENV{'form.phase'} eq 'four') {
     &drop_student_list($r);
         }
   # ------------------------------------------------------------------ Phase four
         if ($ENV{'form.phase'} eq 'five') {
     &enroll_single_student($r);
       }        }
 # ------------------------------------------------------------------------- End  # ------------------------------------------------------------------------- End
       $r->print('</form></body></html>');        $r->print('</form></body></html>');

Removed from v.1.8  
changed lines
  Added in v.1.21


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>
500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.