Diff for /loncom/interface/Attic/londropadd.pm between versions 1.116 and 1.151

version 1.116, 2004/07/19 17:58:10 version 1.151, 2006/12/10 23:48:44
Line 32 Line 32
 package Apache::londropadd;  package Apache::londropadd;
   
 use strict;  use strict;
 use Apache::lonnet();  use Apache::lonnet;
 use Apache::loncommon();  use Apache::loncommon();
 use Apache::lonhtmlcommon();  use Apache::lonhtmlcommon();
 use Apache::Constants qw(:common :http REDIRECT);  use Apache::Constants qw(:common :http REDIRECT);
 use Spreadsheet::WriteExcel;  use Spreadsheet::WriteExcel;
 use Apache::lonstathelpers();  use Apache::lonstathelpers();
 use Apache::lonlocal;  use Apache::lonlocal;
   use Apache::longroup;
   
 ###############################################################  ###############################################################
 ###############################################################  ###############################################################
 sub header {  sub header {
     my $bodytag=&Apache::loncommon::bodytag('Enrollment Manager');      my $start_page=&Apache::loncommon::start_page('Enrollment Manager');
     my $title = &mt('LON-CAPA Enrollment Manager');  
     return(<<ENDHEAD);      return(<<ENDHEAD);
 <html>  $start_page
 <head>  
 <title>$title</title>  
 </head>  
 $bodytag  
 <form method="post" enctype="multipart/form-data"    <form method="post" enctype="multipart/form-data"  
       action="/adm/dropadd" name="studentform">        action="/adm/dropadd" name="studentform">
 ENDHEAD  ENDHEAD
Line 64  sub modifystudent { Line 60  sub modifystudent {
     # if $csec is undefined, drop the student from all the courses matching      # if $csec is undefined, drop the student from all the courses matching
     # this one.  If $csec is defined, drop them from all other sections of       # this one.  If $csec is defined, drop them from all other sections of 
     # this course and add them to section $csec      # this course and add them to section $csec
     $courseid=~s/\_/\//g;      my $cdom = $env{'course.'.$courseid.'.domain'};
     $courseid=~s/^(\w)/\/$1/;      my $cnum = $env{'course.'.$courseid.'.num'};
     my %roles = &Apache::lonnet::dump('roles',$udom,$unam);      my %roles = &Apache::lonnet::dump('roles',$udom,$unam);
     my ($tmp) = keys(%roles);      my ($tmp) = keys(%roles);
     # Bail out if we were unable to get the students roles      # Bail out if we were unable to get the students roles
Line 73  sub modifystudent { Line 69  sub modifystudent {
     # Go through the roles looking for enrollment in this course      # Go through the roles looking for enrollment in this course
     my $result = '';      my $result = '';
     foreach my $course (keys(%roles)) {      foreach my $course (keys(%roles)) {
         if ($course=~/^$courseid(?:\/)*(?:\s+)*(\w+)*\_st$/) {          if ($course=~m{^/\Q$cdom\E/\Q$cnum\E(?:\/)*(?:\s+)*(\w+)*\_st$}) {
             # We are in this course              # We are in this course
             my $section=$1;              my $section=$1;
             $section='' if ($course eq $courseid.'_st');              $section='' if ($course eq "/$cdom/$cnum".'_st');
             if (defined($csec) && $section eq $csec) {              if (defined($csec) && $section eq $csec) {
                 $result .= 'ok:';                  $result .= 'ok:';
             } elsif ( ((!$section) && (!$csec)) || ($section ne $csec) ) {              } elsif ( ((!$section) && (!$csec)) || ($section ne $csec) ) {
                 my (undef,$end,$start)=split(/\_/,$roles{$course});                  my (undef,$end,$start)=split(/\_/,$roles{$course});
                 my $now=time;                  my $now=time;
                 # if this is an active role                   # if this is an active role
                 if (!($start && ($now<$start)) || !($end && ($now>$end))) {                  if (!($start && ($now<$start)) || !($end && ($now>$end))) {
                     my $reply=&Apache::lonnet::modifystudent                      my $reply=&Apache::lonnet::modifystudent
                         # dom  name  id mode pass     f     m     l     g                          # dom  name  id mode pass     f     m     l     g
Line 136  sub domain_form { Line 132  sub domain_form {
 ###############################################################  ###############################################################
 #  Menu Phase One  #  Menu Phase One
 sub print_main_menu {  sub print_main_menu {
     my $r=shift;      my ($r,$enrl_permission,$view_permission,$grp_manage_permission,
     my %Text = &Apache::lonlocal::texthash          $grp_view_permission)=@_;
         ('upload'    => 'Upload a class list',      #
          'enrollone' => 'Enroll a single student',      my $cid =$env{'request.course.id'};
          'modify'    => 'Modify student data',      my $cdom=$env{'course.'.$cid.'.domain'};
          'view'      => 'View Class List',      my $cnum=$env{'course.'.$cid.'.num'};
          'drop'      => 'Drop Students',      my @menu = 
          'populate'  => 'Automated Enrollment Manager');          ( 
     my %help=();            { text => 'Upload a class list', 
     foreach ('Course_Drop_Student','Course_Add_Student',              help => 'Course_Create_Class_List',
      'Course_Modify_Student_Data','Course_View_Class_List',              action => 'upload',
      'Course_Create_Class_List') {              permission => $enrl_permission,
  $help{$_}=&Apache::loncommon::help_open_topic($_);              },
     }            { text => 'Enroll a single student', 
               help => 'Course_Add_Student',
     $r->print(<<END);              action => 'enrollstudent',
 <p>              permission => $enrl_permission,
 <font size="+1">              },
 <a href="/adm/dropadd?action=upload">$Text{'upload'}</a>            { text => 'Modify student data', 
 </font>$help{'Course_Create_Class_List'}              help => 'Course_Modify_Student_Data',
 </p><p>              action => 'modifystudent',
 <font size="+1">              permission => $enrl_permission,
     <a href="/adm/dropadd?action=enrollstudent">$Text{'enrollone'}</a>              },
     </font>$help{'Course_Add_Student'}            { text => 'View Class List', 
 </p><p>              help => 'Course_View_Class_List',
 <font size="+1">              action => 'classlist',
     <a href="/adm/dropadd?action=modifystudent">$Text{'modify'}</a>              permission => $view_permission,
     </font>$help{'Course_Modify_Student_Data'}              },
 </p><p>            { text => 'Drop Students', 
 <font size="+1">              help => 'Course_Drop_Student',
     <a href="/adm/dropadd?action=classlist">$Text{'view'}</a>              action => 'drop',
     </font>$help{'Course_View_Class_List'}              permission => $enrl_permission,
 </p><p>              },
 <font size="+1">            { text => 'Automated Enrollment Manager', 
     <a href="/adm/dropadd?action=drop">$Text{'drop'}</a>              permission => &Apache::lonnet::auto_run($cnum,$cdom),
     </font>$help{'Course_Drop_Student'}              url  => '/adm/populate',
 </p><p>              },
 END            { text => 'Create a new group',
     my ($cdom,$cnum) = split/_/,$ENV{'request.course.id'};              help => 'Course_Create_Group',
     if (&Apache::lonnet::auto_run($cnum,$cdom) ) {              permission => $grp_manage_permission,
         $r->print(<<END);              url => '/adm/coursegroups?refpage=enrl&action=create',
 <font size="+1">              },
     <a href="/adm/populate">$Text{'populate'}</a>            { text => 'Modify an existing group',
 </font>              help => 'Course_Modify_Group',
 END              permission => $grp_manage_permission,
               url => '/adm/coursegroups?refpage=enrl&action=modify',
               },
   #          { text => 'Delete an existing group',
   #            help => 'Course_Delete_Group',
   #            permission => $grp_manage_permission,
   #            url => '/adm/coursegroups?refpage=enrl&action=delete',
   #            },
             { text => 'Enter an existing group',
               help => 'Course_Display_Group',
               permission => $grp_view_permission,
               url => '/adm/coursegroups?refpage=enrl&action=view',
               },
             );
       my $menu_html = '';
       foreach my $menu_item (@menu) {
           next if (! $menu_item->{'permission'});
           $menu_html.='<p>';
           $menu_html.='<font size="+1">';
           if (exists($menu_item->{'url'})) {
               $menu_html.=qq{<a href="$menu_item->{'url'}">};
           } else {
               $menu_html.=
                   qq{<a href="/adm/dropadd?action=$menu_item->{'action'}">};
           }
           $menu_html.= &mt($menu_item->{'text'}).'</a></font>';
           if (exists($menu_item->{'help'})) {
               $menu_html.=
                   &Apache::loncommon::help_open_topic($menu_item->{'help'});
           }
           $menu_html.='</p>'.$/;
     }      }
       $r->print($menu_html);
       return;
 }  }
   
 ###############################################################  ###############################################################
Line 195  sub print_upload_manager_header { Line 223  sub print_upload_manager_header {
     my ($r,$datatoken,$distotal,$krbdefdom)=@_;      my ($r,$datatoken,$distotal,$krbdefdom)=@_;
     my $javascript;      my $javascript;
     #      #
     if (! exists($ENV{'form.upfile_associate'})) {      if (! exists($env{'form.upfile_associate'})) {
         $ENV{'form.upfile_associate'} = 'forward';          $env{'form.upfile_associate'} = 'forward';
     }      }
     if ($ENV{'form.associate'} eq 'Reverse Association') {      if ($env{'form.associate'} eq 'Reverse Association') {
         if ( $ENV{'form.upfile_associate'} ne 'reverse' ) {          if ( $env{'form.upfile_associate'} ne 'reverse' ) {
             $ENV{'form.upfile_associate'} = 'reverse';              $env{'form.upfile_associate'} = 'reverse';
         } else {          } else {
             $ENV{'form.upfile_associate'} = 'forward';              $env{'form.upfile_associate'} = 'forward';
         }          }
     }      }
     if ($ENV{'form.upfile_associate'} eq 'reverse') {      if ($env{'form.upfile_associate'} eq 'reverse') {
  $javascript=&upload_manager_javascript_reverse_associate();   $javascript=&upload_manager_javascript_reverse_associate();
     } else {      } else {
  $javascript=&upload_manager_javascript_forward_associate();   $javascript=&upload_manager_javascript_forward_associate();
Line 213  sub print_upload_manager_header { Line 241  sub print_upload_manager_header {
     #      #
     # Deal with restored settings      # Deal with restored settings
     my $password_choice = '';      my $password_choice = '';
     if (exists($ENV{'form.ipwd_choice'}) &&      if (exists($env{'form.ipwd_choice'}) &&
         $ENV{'form.ipwd_choice'} ne '') {          $env{'form.ipwd_choice'} ne '') {
         # If a column was specified for password, assume it is for an          # If a column was specified for password, assume it is for an
         # internal password.  This is a bug waiting to be filed (could be          # internal password.  This is a bug waiting to be filed (could be
         # local or krb auth instead of internal) but I do not have the           # local or krb auth instead of internal) but I do not have the 
Line 224  sub print_upload_manager_header { Line 252  sub print_upload_manager_header {
     #      #
     my $javascript_validations=&javascript_validations('auth',$krbdefdom,      my $javascript_validations=&javascript_validations('auth',$krbdefdom,
                                     $password_choice);                                      $password_choice);
     my $checked=(($ENV{'form.noFirstLine'})?' checked="1"':'');      my $checked=(($env{'form.noFirstLine'})?' checked="checked" ':'');
     $r->print('<h3>'.&mt('Uploading Class List')."</h3>\n".      $r->print('<h3>'.&mt('Uploading Class List')."</h3>\n".
               "<hr>\n".                "<hr>\n".
               '<h3>'.&mt('Identify fields')."</h3>\n");                '<h3>'.&mt('Identify fields')."</h3>\n");
Line 237  sub print_upload_manager_header { Line 265  sub print_upload_manager_header {
               &hidden_input('state','got_file').                &hidden_input('state','got_file').
               &hidden_input('associate','').                &hidden_input('associate','').
               &hidden_input('datatoken',$datatoken).                &hidden_input('datatoken',$datatoken).
               &hidden_input('fileupload',$ENV{'form.fileupload'}).                &hidden_input('fileupload',$env{'form.fileupload'}).
               &hidden_input('upfiletype',$ENV{'form.upfiletype'}).                &hidden_input('upfiletype',$env{'form.upfiletype'}).
               &hidden_input('upfile_associate',$ENV{'form.upfile_associate'}));                &hidden_input('upfile_associate',$env{'form.upfile_associate'}));
     $r->print('<input type="button" value="Reverse Association" '.      $r->print('<input type="button" value="Reverse Association" '.
               'name="'.&mt('Reverse Association').'" '.                'name="'.&mt('Reverse Association').'" '.
               'onClick="javascript:this.form.associate.value=\'Reverse Association\';submit(this.form);" />');                'onClick="javascript:this.form.associate.value=\'Reverse Association\';submit(this.form);" />');
     $r->print('<input type="checkbox" name="noFirstLine" $checked />'.      $r->print('<label><input type="checkbox" name="noFirstLine"'.$checked.'/>'.
               &mt('Ignore First Line'));                &mt('Ignore First Line').'</label>');
     $r->print("<hr />\n".      $r->print("<hr />\n".
               '<script type="text/javascript" language="Javascript">'."\n".                '<script type="text/javascript" language="Javascript">'."\n".
               $javascript."\n".$javascript_validations.'</script>');                $javascript."\n".$javascript_validations.'</script>');
Line 282  sub javascript_validations { Line 310  sub javascript_validations {
          ipass    => 'You need to specify the initial password.',           ipass    => 'You need to specify the initial password.',
          name     => 'The optional name field was not specified.',           name     => 'The optional name field was not specified.',
          snum     => 'The optional student number field was not specified.',           snum     => 'The optional student number field was not specified.',
          section  => 'The optional section or group field was not specified.',            section  => 'The optional section field was not specified.', 
          email    => 'The optional email address field was not specified.',           email    => 'The optional email address field was not specified.',
          continue => 'Continue enrollment?',           continue => 'Continue enrollment?',
          );           );
Line 309  END Line 337  END
         return;          return;
     }      }
     // alert('current.radiovalue = '+current.radiovalue);      // alert('current.radiovalue = '+current.radiovalue);
     if (current.radiovalue == null || current.radiovalue == 'nochange') {      if (current.radiovalue == null || current.radiovalue == '' || current.radiovalue == 'nochange') {
         // They did not check any of the login radiobuttons.          // They did not check any of the login radiobuttons.
         alert('$alert{'authen'}');          alert('$alert{'authen'}');
         return;          return;
Line 368  END Line 396  END
     }      }
 END  END
     }      }
       my $section_checks;
     my $optional_checks = '';      my $optional_checks = '';
     if ( ($mode eq 'createcourse') || ($mode eq 'modifycourse') ) {      if ( ($mode eq 'createcourse') || ($mode eq 'modifycourse') ) {
         $optional_checks = (<<END);          $optional_checks = (<<END);
Line 375  END Line 404  END
 }  }
 END  END
     } else {      } else {
           $section_checks = &section_check_js();
         $optional_checks = (<<END);          $optional_checks = (<<END);
     var message='';      var message='';
     if (foundname==0) {       if (foundname==0) { 
Line 415  END Line 445  END
     if ( ($mode eq 'auth') || ($mode eq 'createcourse') || ($mode eq 'modifycourse')  ) {      if ( ($mode eq 'auth') || ($mode eq 'createcourse') || ($mode eq 'modifycourse')  ) {
         $result .= $auth_checks;          $result .= $auth_checks;
     }      }
     $result .= $optional_checks;      $result .= $optional_checks."\n".$section_checks;
     if ( ($mode eq 'auth') || ($mode eq 'createcourse') || ($mode eq 'modifycourse')  ) {      if ( ($mode eq 'auth') || ($mode eq 'createcourse') || ($mode eq 'modifycourse')  ) {
         $result .= $authheader;          $result .= $authheader;
     }      }
Line 426  END Line 456  END
 ###############################################################  ###############################################################
 sub upload_manager_javascript_forward_associate {  sub upload_manager_javascript_forward_associate {
     return(<<ENDPICK);      return(<<ENDPICK);
 function verify(vf) {  function verify(vf,sec_caller) {
     var founduname=0;      var founduname=0;
     var foundpwd=0;      var foundpwd=0;
     var foundname=0;      var foundname=0;
Line 519  ENDPICK Line 549  ENDPICK
 ###############################################################  ###############################################################
 sub upload_manager_javascript_reverse_associate {  sub upload_manager_javascript_reverse_associate {
     return(<<ENDPICK);      return(<<ENDPICK);
 function verify(vf) {  function verify(vf,sec_caller) {
     var founduname=0;      var founduname=0;
     var foundpwd=0;      var foundpwd=0;
     var foundname=0;      var foundname=0;
Line 581  sub print_upload_manager_footer { Line 611  sub print_upload_manager_footer {
                   kerb_def_dom => $krbdefdom,                    kerb_def_dom => $krbdefdom,
                   kerb_def_auth => $krbdef                    kerb_def_auth => $krbdef
                   );                    );
     if (exists($ENV{'form.ipwd_choice'}) &&      if (exists($env{'form.ipwd_choice'}) &&
         defined($ENV{'form.ipwd_choice'}) &&          defined($env{'form.ipwd_choice'}) &&
         $ENV{'form.ipwd_choice'} ne '') {          $env{'form.ipwd_choice'} ne '') {
         $param{'curr_authtype'} = 'int';          $param{'curr_authtype'} = 'int';
     }      }
     my $krbform = &Apache::loncommon::authform_kerberos(%param);      my $krbform = &Apache::loncommon::authform_kerberos(%param);
Line 597  sub print_upload_manager_footer { Line 627  sub print_upload_manager_footer {
     $Str .= '<h3>'.&mt('Login Type')."</h3>\n";      $Str .= '<h3>'.&mt('Login Type')."</h3>\n";
     $Str .= "<p>\n".      $Str .= "<p>\n".
         &mt('Note: this will not take effect if the user already exists').          &mt('Note: this will not take effect if the user already exists').
    &Apache::loncommon::help_open_topic('Auth_Options').
         "</p><p>\n";          "</p><p>\n";
     $Str .= $krbform."\n</p><p>\n".      $Str .= $krbform."\n</p><p>\n".
         $intform."\n</p><p>\n".          $intform."\n</p><p>\n".
Line 606  sub print_upload_manager_footer { Line 637  sub print_upload_manager_footer {
     $Str .= "<h3>".&mt('Starting and Ending Dates')."</h3>\n";      $Str .= "<h3>".&mt('Starting and Ending Dates')."</h3>\n";
     $Str .= "<p>\n".$date_table."</p>\n";      $Str .= "<p>\n".$date_table."</p>\n";
     $Str .= "<h3>".&mt('Full Update')."</h3>\n";      $Str .= "<h3>".&mt('Full Update')."</h3>\n";
     $Str .= '<input type="checkbox" name="fullup" value="yes">'.      $Str .= '<label><input type="checkbox" name="fullup" value="yes">'.
         ' '.&mt('Full update (also print list of users not enrolled anymore)').          ' '.&mt('Full update (also print list of users not enrolled anymore)').
         "</p>\n";          "</label></p>\n";
     $Str .= "<h3>".&mt('Student Number')."</h3>\n";      $Str .= "<h3>".&mt('Student Number')."</h3>\n";
     $Str .= "<p>\n".'<input type="checkbox" name="forceid" value="yes">';      $Str .= "<p>\n".'<label><input type="checkbox" name="forceid" value="yes">';
     $Str .= &mt('Disable ID/Student Number Safeguard and Force Change '.      $Str .= &mt('Disable ID/Student Number Safeguard and Force Change '.
                 'of Conflicting IDs (only do if you know what you are doing)').                  'of Conflicting IDs (only do if you know what you are doing)').
                 "\n</p><p>\n";                  "</label>\n</p><p>\n";
     $Str .= '<input type="button" onClick="javascript:verify(this.form)" '.      $Str .= '<input type="button"'. 
                 'onClick="javascript:verify(this.form,this.form.csec)" '.
         'value="Update Class List" />'."<br />\n";          'value="Update Class List" />'."<br />\n";
     $Str .= &mt('Note: for large courses, this operation may be time '.      $Str .= &mt('Note: for large courses, this operation may be time '.
                 'consuming');                  'consuming');
Line 629  sub print_upload_manager_form { Line 661  sub print_upload_manager_form {
   
     my $firstLine;      my $firstLine;
     my $datatoken;      my $datatoken;
     if (!$ENV{'form.datatoken'}) {      if (!$env{'form.datatoken'}) {
         $datatoken=&Apache::loncommon::upfile_store($r);          $datatoken=&Apache::loncommon::upfile_store($r);
     } else {      } else {
         $datatoken=$ENV{'form.datatoken'};          $datatoken=$env{'form.datatoken'};
         &Apache::loncommon::load_tmp_file($r);          &Apache::loncommon::load_tmp_file($r);
     }      }
     my @records=&Apache::loncommon::upfile_record_sep();      my @records=&Apache::loncommon::upfile_record_sep();
     if($ENV{'form.noFirstLine'}){      if($env{'form.noFirstLine'}){
         $firstLine=shift(@records);          $firstLine=shift(@records);
     }      }
     my $total=$#records;      my $total=$#records;
Line 659  sub print_upload_manager_form { Line 691  sub print_upload_manager_form {
                            });                             });
     #      #
     # Determine kerberos parameters as appropriate      # Determine kerberos parameters as appropriate
     my $defdom=$ENV{'course.'.$ENV{'request.course.id'}.'.domain'};      my $defdom=$env{'course.'.$env{'request.course.id'}.'.domain'};
     my ($krbdef,$krbdefdom) =      my ($krbdef,$krbdefdom) =
         &Apache::loncommon::get_kerberos_defaults($defdom);          &Apache::loncommon::get_kerberos_defaults($defdom);
     #      #
Line 668  sub print_upload_manager_form { Line 700  sub print_upload_manager_form {
     my $keyfields;      my $keyfields;
     if ($total>=0) {      if ($total>=0) {
         my @field=          my @field=
             (['username',&mt('Username'),     $ENV{'form.username_choice'}],              (['username',&mt('Username'),     $env{'form.username_choice'}],
              ['names',&mt('Last Name, First Names'),$ENV{'form.names_choice'}],               ['names',&mt('Last Name, First Names'),$env{'form.names_choice'}],
              ['fname',&mt('First Name'),      $ENV{'form.fname_choice'}],               ['fname',&mt('First Name'),      $env{'form.fname_choice'}],
              ['mname',&mt('Middle Names/Initials'),$ENV{'form.mname_choice'}],               ['mname',&mt('Middle Names/Initials'),$env{'form.mname_choice'}],
              ['lname',&mt('Last Name'),       $ENV{'form.lname_choice'}],               ['lname',&mt('Last Name'),       $env{'form.lname_choice'}],
              ['gen',  &mt('Generation'),      $ENV{'form.gen_choice'}],               ['gen',  &mt('Generation'),      $env{'form.gen_choice'}],
              ['id',   &mt('ID/Student Number'),$ENV{'form.id_choice'}],               ['id',   &mt('ID/Student Number'),$env{'form.id_choice'}],
              ['sec',  &mt('Group/Section'),   $ENV{'form.sec_choice'}],               ['sec',  &mt('Section'),          $env{'form.sec_choice'}],
              ['ipwd', &mt('Initial Password'),$ENV{'form.ipwd_choice'}],               ['ipwd', &mt('Initial Password'),$env{'form.ipwd_choice'}],
              ['email',&mt('EMail Address'),   $ENV{'form.email_choice'}]);               ['email',&mt('EMail Address'),   $env{'form.email_choice'}]);
  if ($ENV{'form.upfile_associate'} eq 'reverse') {   if ($env{'form.upfile_associate'} eq 'reverse') {
     &Apache::loncommon::csv_print_samples($r,\@records);      &Apache::loncommon::csv_print_samples($r,\@records);
     $i=&Apache::loncommon::csv_print_select_table($r,\@records,      $i=&Apache::loncommon::csv_print_select_table($r,\@records,
                                                           \@field);                                                            \@field);
Line 702  sub print_upload_manager_form { Line 734  sub print_upload_manager_form {
 sub enroll_single_student {  sub enroll_single_student {
     my $r=shift;      my $r=shift;
     # Remove non alphanumeric values from section      # Remove non alphanumeric values from section
     $ENV{'form.csec'}=~s/\W//g;      $env{'form.csec'}=~s/\W//g;
     #      #
     # We do the dates first because the action of making them the defaul      # We do the dates first because the action of making them the defaul
     # in the course is entirely separate from the action of enrolling the      # in the course is entirely separate from the action of enrolling the
     # student.  Also, a failure in setting the dates as default is not fatal      # student.  Also, a failure in setting the dates as default is not fatal
     # to the process of enrolling / modifying a student.      # to the process of enrolling / modifying a student.
     my ($startdate,$enddate) = &get_dates_from_form();      my ($startdate,$enddate) = &get_dates_from_form();
     if ($ENV{'form.makedatesdefault'}) {      if ($env{'form.makedatesdefault'}) {
         $r->print(&make_dates_default($startdate,$enddate));          $r->print(&make_dates_default($startdate,$enddate));
     }      }
   
     $r->print('<h3>'.&mt('Enrolling Student').'</h3>');      $r->print('<h3>'.&mt('Enrolling Student').'</h3>');
     $r->print('<p>'.&mt('Enrolling').' '.$ENV{'form.cuname'}." \@ ".      $r->print('<p>'.&mt('Enrolling').' '.$env{'form.cuname'}." \@ ".
               $ENV{'form.lcdomain'}.'</p>');                $env{'form.lcdomain'}.'</p>');
     if (($ENV{'form.cuname'})&&($ENV{'form.cuname'}!~/\W/)&&      if (($env{'form.cuname'})
         ($ENV{'form.lcdomain'})&&($ENV{'form.lcdomain'}!~/\W/)) {   && ($env{'form.cuname'} 
       eq &LONCAPA::clean_username($env{'form.cuname'}))
    && ($env{'form.lcdomain'})
    && ($env{'form.lcdomain'}
       eq &LONCAPA::clean_domain($env{'form.lcdomain'}))) {
         # Deal with home server selection          # Deal with home server selection
         my $domain=$ENV{'form.lcdomain'};          my $domain=$env{'form.lcdomain'};
         my $desiredhost = $ENV{'form.lcserver'};          my $desiredhost = $env{'form.lcserver'};
         if (lc($desiredhost) eq 'default') {          if (lc($desiredhost) eq 'default') {
             $desiredhost = undef;              $desiredhost = undef;
         } else {          } else {
Line 735  sub enroll_single_student { Line 771  sub enroll_single_student {
         # End of home server selection logic          # End of home server selection logic
  my $amode='';   my $amode='';
         my $genpwd='';          my $genpwd='';
         if ($ENV{'form.login'} eq 'krb') {          if ($env{'form.login'} eq 'krb') {
            $amode='krb';             $amode='krb';
    $amode.=$ENV{'form.krbver'};     $amode.=$env{'form.krbver'};
            $genpwd=$ENV{'form.krbarg'};             $genpwd=$env{'form.krbarg'};
         } elsif ($ENV{'form.login'} eq 'int') {          } elsif ($env{'form.login'} eq 'int') {
            $amode='internal';             $amode='internal';
            $genpwd=$ENV{'form.intarg'};             $genpwd=$env{'form.intarg'};
         }  elsif ($ENV{'form.login'} eq 'loc') {          }  elsif ($env{'form.login'} eq 'loc') {
     $amode='localauth';      $amode='localauth';
     $genpwd=$ENV{'form.locarg'};      $genpwd=$env{'form.locarg'};
     if (!$genpwd) { $genpwd=" "; }      if (!$genpwd) { $genpwd=" "; }
  }   }
         my $home = &Apache::lonnet::homeserver($ENV{'form.cuname'},          my $home = &Apache::lonnet::homeserver($env{'form.cuname'},
                                                    $ENV{'form.lcdomain'});                                                     $env{'form.lcdomain'});
         if ((($amode) && ($genpwd)) || ($home ne 'no_host')) {          if ((($amode) && ($genpwd)) || ($home ne 'no_host')) {
             # Clean out any old roles the student has in this class.              # Clean out any old roles the student has in this class.
             &modifystudent($ENV{'form.lcdomain'},$ENV{'form.cuname'},              &modifystudent($env{'form.lcdomain'},$env{'form.cuname'},
                            $ENV{'request.course.id'},$ENV{'form.csec'},                             $env{'request.course.id'},$env{'form.csec'},
                             $desiredhost);                              $desiredhost);
             my $login_result = &Apache::lonnet::modifystudent              my $login_result = &Apache::lonnet::modifystudent
                 ($ENV{'form.lcdomain'},$ENV{'form.cuname'},                  ($env{'form.lcdomain'},$env{'form.cuname'},
                  $ENV{'form.cstid'},$amode,$genpwd,                   $env{'form.cstid'},$amode,$genpwd,
                  $ENV{'form.cfirst'},$ENV{'form.cmiddle'},                   $env{'form.cfirst'},$env{'form.cmiddle'},
                  $ENV{'form.clast'},$ENV{'form.cgen'},                   $env{'form.clast'},$env{'form.cgen'},
                  $ENV{'form.csec'},$enddate,                   $env{'form.csec'},$enddate,
                  $startdate,$ENV{'form.forceid'},                   $startdate,$env{'form.forceid'},
                  $desiredhost);                   $desiredhost,$env{'form.emailaddress'});
             if ($login_result =~ /^ok/) {              if ($login_result =~ /^ok/) {
                 $r->print($login_result);                  $r->print($login_result);
                 $r->print("<p> ".&mt('If active, the new role will be available when the student next logs in to LON-CAPA.')."</p>");                  $r->print("<p> ".&mt('If active, the new role will be available when the student next logs in to LON-CAPA.')."</p>");
Line 775  sub enroll_single_student { Line 811  sub enroll_single_student {
             } else {              } else {
                 $r->print(&mt('Invalid login mode or password.').'  ');                  $r->print(&mt('Invalid login mode or password.').'  ');
             }              }
             $r->print('<b>'.&mt('Unable to enroll').' '.$ENV{'form.cuname'}.'.</b></p>');              $r->print('<b>'.&mt('Unable to enroll').' '.$env{'form.cuname'}.'.</b></p>');
         }          }
     } else {      } else {
         $r->print(&mt('Invalid username or domain'));          $r->print(&mt('Invalid username or domain'));
Line 787  sub setup_date_selectors { Line 823  sub setup_date_selectors {
     if (! defined($starttime)) {      if (! defined($starttime)) {
         $starttime = time;          $starttime = time;
         unless ($mode eq 'create_enrolldates' || $mode eq 'create_defaultdates') {          unless ($mode eq 'create_enrolldates' || $mode eq 'create_defaultdates') {
             if (exists($ENV{'course.'.$ENV{'request.course.id'}.              if (exists($env{'course.'.$env{'request.course.id'}.
                             '.default_enrollment_start_date'})) {                              '.default_enrollment_start_date'})) {
                 $starttime = $ENV{'course.'.$ENV{'request.course.id'}.                  $starttime = $env{'course.'.$env{'request.course.id'}.
                                   '.default_enrollment_start_date'};                                    '.default_enrollment_start_date'};
             }              }
         }          }
Line 797  sub setup_date_selectors { Line 833  sub setup_date_selectors {
     if (! defined($endtime)) {      if (! defined($endtime)) {
         $endtime = time+(6*30*24*60*60); # 6 months from now, approx          $endtime = time+(6*30*24*60*60); # 6 months from now, approx
         unless ($mode eq 'createcourse') {          unless ($mode eq 'createcourse') {
             if (exists($ENV{'course.'.$ENV{'request.course.id'}.              if (exists($env{'course.'.$env{'request.course.id'}.
                             '.default_enrollment_end_date'})) {                              '.default_enrollment_end_date'})) {
                 $endtime = $ENV{'course.'.$ENV{'request.course.id'}.                  $endtime = $env{'course.'.$env{'request.course.id'}.
                                 '.default_enrollment_end_date'};                                  '.default_enrollment_end_date'};
             }              }
         }          }
Line 832  sub setup_date_selectors { Line 868  sub setup_date_selectors {
 sub get_dates_from_form {  sub get_dates_from_form {
     my $startdate = &Apache::lonhtmlcommon::get_date_from_form('startdate');      my $startdate = &Apache::lonhtmlcommon::get_date_from_form('startdate');
     my $enddate   = &Apache::lonhtmlcommon::get_date_from_form('enddate');      my $enddate   = &Apache::lonhtmlcommon::get_date_from_form('enddate');
     if ($ENV{'form.no_end_date'}) {      if ($env{'form.no_end_date'}) {
         $enddate = 0;          $enddate = 0;
     }      }
     return ($startdate,$enddate);      return ($startdate,$enddate);
Line 842  sub date_setting_table { Line 878  sub date_setting_table {
     my ($starttime,$endtime,$mode) = @_;      my ($starttime,$endtime,$mode) = @_;
     my ($startform,$endform)=&setup_date_selectors($starttime,$endtime,$mode);      my ($startform,$endform)=&setup_date_selectors($starttime,$endtime,$mode);
     my $dateDefault = '<nobr>'.      my $dateDefault = '<nobr>'.
         '<input type="checkbox" name="makedatesdefault" /> '.          '<label><input type="checkbox" name="makedatesdefault" /> '.
         &mt('make these dates the default for future enrollment');          &mt('make these dates the default for future enrollment').'</label>';
     if ($mode eq 'create_enrolldates' || $mode eq 'create_defaultdates') {      if ($mode eq 'create_enrolldates' || $mode eq 'create_defaultdates') {
         $dateDefault = '&nbsp;';          $dateDefault = '&nbsp;';
     }      }
     my $perpetual = '<nobr><input type="checkbox" name="no_end_date"';      my $perpetual = '<nobr><label><input type="checkbox" name="no_end_date"';
     if (defined($endtime) && $endtime == 0) {      if (defined($endtime) && $endtime == 0) {
         $perpetual .= ' checked';          $perpetual .= ' checked';
     }      }
     $perpetual.= ' /> '.&mt('no ending date').'</nobr>';      $perpetual.= ' /> '.&mt('no ending date').'</label></nobr>';
     if ($mode eq 'create_enrolldates') {      if ($mode eq 'create_enrolldates') {
         $perpetual = '&nbsp;';          $perpetual = '&nbsp;';
     }      }
Line 870  sub date_setting_table { Line 906  sub date_setting_table {
 sub make_dates_default {  sub make_dates_default {
     my ($startdate,$enddate) = @_;      my ($startdate,$enddate) = @_;
     my $result = '';      my $result = '';
     my $dom = $ENV{'course.'.$ENV{'request.course.id'}.'.domain'};      my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
     my $crs = $ENV{'course.'.$ENV{'request.course.id'}.'.num'};      my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
     my $put_result = &Apache::lonnet::put('environment',      my $put_result = &Apache::lonnet::put('environment',
             {'default_enrollment_start_date'=>$startdate,              {'default_enrollment_start_date'=>$startdate,
              'default_enrollment_end_date'  =>$enddate},$dom,$crs);               'default_enrollment_end_date'  =>$enddate},$dom,$crs);
Line 879  sub make_dates_default { Line 915  sub make_dates_default {
         $result .= "Set default start and end dates for course<br />";          $result .= "Set default start and end dates for course<br />";
         #          #
         # Refresh the course environment          # Refresh the course environment
         &Apache::lonnet::coursedescription($ENV{'request.course.id'});          &Apache::lonnet::coursedescription($env{'request.course.id'},
      {'freshen_cache' => 1});
     } else {      } else {
         $result .= &mt('Unable to set default dates for course').":".$put_result.          $result .= &mt('Unable to set default dates for course').":".$put_result.
             '<br />';              '<br />';
Line 893  sub make_dates_default { Line 930  sub make_dates_default {
 sub get_student_username_domain_form {  sub get_student_username_domain_form {
     my $r = shift;      my $r = shift;
     my $domform = &Apache::loncommon::select_dom_form      my $domform = &Apache::loncommon::select_dom_form
         ($ENV{'course.'.$ENV{'request.course.id'}.'.domain'},'cudomain',0);          ($env{'course.'.$env{'request.course.id'}.'.domain'},'cudomain',0);
     my %lt=&Apache::lonlocal::texthash(      my %lt=&Apache::lonlocal::texthash(
     'eos'  => "Enroll One Student",      'eos'  => "Enroll One Student",
     'usr'  => "Username",      'usr'  => "Username",
Line 914  sub get_student_username_domain_form { Line 951  sub get_student_username_domain_form {
     <input type="submit" name="Begin Enrollment" value="$lt{'been'}" />      <input type="submit" name="Begin Enrollment" value="$lt{'been'}" />
     </td></tr>      </td></tr>
 </table>  </table>
   <script type="text/javascript">
   // the if prevents the script error if the browser can not handle this
   if ( document.studentform.cuname ) { document.studentform.cuname.focus(); }
   </script>
 END  END
     return;      return;
 }  }
Line 922  sub print_enroll_single_student_form { Line 963  sub print_enroll_single_student_form {
     my $r=shift;      my $r=shift;
     $r->print("<h3>".&mt('Enroll One Student')."</h3>");      $r->print("<h3>".&mt('Enroll One Student')."</h3>");
     #      #
     my $username = $ENV{'form.cuname'};      my $username = &LONCAPA::clean_username($env{'form.cuname'});
     my $domain   = $ENV{'form.cudomain'};      my $domain   = &LONCAPA::clean_domain($env{'form.cudomain'});
     $username=~s/[\W|_]//gs;  
     $domain=~s/[\W|_]//gs;  
     my $home = &Apache::lonnet::homeserver($username,$domain);      my $home = &Apache::lonnet::homeserver($username,$domain);
     # $new_user flags whether we are creating a new user or using an old one      # $new_user flags whether we are creating a new user or using an old one
     my $new_user = 1;      my $new_user = 1;
Line 936  sub print_enroll_single_student_form { Line 975  sub print_enroll_single_student_form {
     my $user_data_html = '';      my $user_data_html = '';
     my $javascript_validations = '';      my $javascript_validations = '';
     if ($new_user) {      if ($new_user) {
         my $defdom=$ENV{'course.'.$ENV{'request.course.id'}.'.domain'};          my $defdom=$env{'course.'.$env{'request.course.id'}.'.domain'};
         # Set up authentication forms          # Set up authentication forms
         my ($krbdef,$krbdefdom) =          my ($krbdef,$krbdefdom) =
             &Apache::loncommon::get_kerberos_defaults($domain);              &Apache::loncommon::get_kerberos_defaults($domain);
Line 970  sub print_enroll_single_student_form { Line 1009  sub print_enroll_single_student_form {
                        'hs'   => "Home Server",                         'hs'   => "Home Server",
                        'pswd' => "Password",                         'pswd' => "Password",
        'psam' => "Please select an authentication mechanism",         'psam' => "Please select an authentication mechanism",
                          'mail' => "Email Address"
    );     );
    my $authhelp=&Apache::loncommon::help_open_topic('Auth_Options');
         $user_data_html = <<END;          $user_data_html = <<END;
 <h3>$lt{'udf'} $username\@$domain</h3>  <h3>$lt{'udf'} $username\@$domain</h3>
 <table>  <table>
Line 984  sub print_enroll_single_student_form { Line 1025  sub print_enroll_single_student_form {
     <td><input type="text" name="cgen"    size="5"> </td></tr>      <td><input type="text" name="cgen"    size="5"> </td></tr>
 <tr><th>$lt{'hs'}:</th>  <tr><th>$lt{'hs'}:</th>
     <td>$homeserver_form</td></tr>      <td>$homeserver_form</td></tr>
   <tr><th>$lt{'mail'}:</th>
       <td><input type="text" name="emailaddress" size="20" /></td></tr>
 </table>  </table>
 <h3>$lt{'pswd'}</h3>  <h3>$lt{'pswd'}</h3>
 $lt{'psam'}  $lt{'psam'}$authhelp
 <table>  <table>
 <p>  <p>
 $krbform  $krbform
Line 1006  END Line 1049  END
                        'mn'   => "Middle Name",                         'mn'   => "Middle Name",
                        'ln'   => "Last Name",                         'ln'   => "Last Name",
                        'gen'  => "Generation",                         'gen'  => "Generation",
                          'mail' => "Email Address",
    );     );
         $user_data_html = <<END;          $user_data_html = <<END;
 <h3>$lt{'udf'} $username\@$domain</h3>  <h3>$lt{'udf'} $username\@$domain</h3>
Line 1027  END Line 1071  END
     <td>      <td>
     <input type="text" name="cgen" value="$uenv{'generation'}" size="5" />      <input type="text" name="cgen" value="$uenv{'generation'}" size="5" />
     </td></tr>      </td></tr>
   <tr><th>$lt{'mail'}:</th>
       <td>
       <input type="text" name="emailaddress" value="$uenv{'permanentemail'}" size="20" />
       </td></tr>
 </table>  </table>
 END  END
     }      }
Line 1034  END Line 1082  END
         # Print it all out          # Print it all out
     my %lt=&Apache::lonlocal::texthash(      my %lt=&Apache::lonlocal::texthash(
    'cd'   => "Course Data",     'cd'   => "Course Data",
                    'gs'   => "Group/Section",                     'gs'   => "Section",
                    'idsn' => "ID/Student Number",                     'idsn' => "ID/Student Number",
                    'disn' => "Disable ID/Student Number Safeguard and Force Change of Conflicting IDs (only do if you know what you are doing)",                     'disn' => "Disable ID/Student Number Safeguard and Force Change of Conflicting IDs (only do if you know what you are doing)",
                    'eas'  => "Enroll as student",                     'eas'  => "Enroll as student",
Line 1045  END Line 1093  END
 <input type="hidden" name="cuname" value="$username" />  <input type="hidden" name="cuname" value="$username" />
 <input type="hidden" name="lcdomain" value="$domain" />  <input type="hidden" name="lcdomain" value="$domain" />
 <script type="text/javascript" language="Javascript">  <script type="text/javascript" language="Javascript">
 function verify(vf) {  function verify(vf,sec_caller) {
     var founduname=0;      var founduname=0;
     var foundpwd=0;      var foundpwd=0;
     var foundname=0;      var foundname=0;
Line 1062  function verify(vf) { Line 1110  function verify(vf) {
     }      }
     if ((typeof(vf.csec.value)!="undefined") && (vf.csec.value!='')) {      if ((typeof(vf.csec.value)!="undefined") && (vf.csec.value!='')) {
         foundsec=1;          foundsec=1;
           if (validate(sec_caller) == "error") {
               return;
           }
     }      }
     if ((typeof(vf.cstid.value)!="undefined") && (vf.cstid.value!='')) {      if ((typeof(vf.cstid.value)!="undefined") && (vf.cstid.value!='')) {
  foundid=1;   foundid=1;
Line 1093  $date_table Line 1144  $date_table
 <p>  <p>
 $lt{'idsn'}: <input type="text" name="cstid" size="10">  $lt{'idsn'}: <input type="text" name="cstid" size="10">
 </p><p>  </p><p>
   <label>
 <input type="checkbox" name="forceid" value="yes">   <input type="checkbox" name="forceid" value="yes"> 
 $lt{'disn'}  $lt{'disn'}
   </label>
 </p><p>  </p><p>
 <input type="button" onClick="verify(this.form)" value="$lt{'eas'}">  <input type="button" onClick="verify(this.form,this.form.csec)" value="$lt{'eas'}">
 </p>  </p>
 END  END
     return;      return;
Line 1106  END Line 1159  END
 sub print_drop_menu {  sub print_drop_menu {
     my $r=shift;      my $r=shift;
     $r->print("<h3>".&mt('Drop Students')."</h3>");      $r->print("<h3>".&mt('Drop Students')."</h3>");
     my $cid=$ENV{'request.course.id'};      my $cid=$env{'request.course.id'};
     my ($classlist,$keylist) = &Apache::loncoursedata::get_classlist();      my ($classlist,$keylist) = &Apache::loncoursedata::get_classlist();
     if (! defined($classlist)) {      if (! defined($classlist)) {
         $r->print(&mt('There are no students currently enrolled.')."\n");          $r->print(&mt('There are no students currently enrolled.')."\n");
Line 1120  sub print_drop_menu { Line 1173  sub print_drop_menu {
 # ============================================== view classlist  # ============================================== view classlist
 sub print_html_classlist {  sub print_html_classlist {
     my ($r,$mode) = @_;      my ($r,$mode) = @_;
     if (! exists($ENV{'form.sortby'})) {      if (! exists($env{'form.sortby'})) {
         $ENV{'form.sortby'} = 'username';          $env{'form.sortby'} = 'username';
     }      }
     if ($ENV{'form.Status'} !~ /^(Any|Expired|Active)$/) {      if ($env{'form.Status'} !~ /^(Any|Expired|Active|Future)$/) {
         $ENV{'form.Status'} = 'Active';          $env{'form.Status'} = 'Active';
     }      }
     my $status_select = &Apache::lonhtmlcommon::StatusOptions      my $status_select = &Apache::lonhtmlcommon::StatusOptions
         ($ENV{'form.Status'});          ($env{'form.Status'});
     my $cid=$ENV{'request.course.id'};      my $cid =$env{'request.course.id'};
     my $cdom=$ENV{'course.'.$cid.'.domain'};      my $cdom=$env{'course.'.$cid.'.domain'};
     my $cnum=$ENV{'course.'.$cid.'.num'};      my $cnum=$env{'course.'.$cid.'.num'};
     #      #
     # List course personnel      # List course personnel
     my %coursepersonnel=&Apache::lonnet::get_course_adv_roles($cdom.'/'.$cnum);      my %coursepersonnel=&Apache::lonnet::get_course_adv_roles($cdom.'/'.$cnum);
     #      #
     if (! defined($ENV{'form.output'}) ||      if (! defined($env{'form.output'}) ||
         $ENV{'form.output'} !~ /^(csv|excel|html)$/ ) {          $env{'form.output'} !~ /^(csv|excel|html)$/ ) {
         $ENV{'form.output'} = 'html';          $env{'form.output'} = 'html';
     }      }
     #      #
     $r->print('<br /><table border="2">');      $r->print('<br />'.&Apache::loncommon::start_data_table());
     foreach my $role (sort keys %coursepersonnel) {      foreach my $role (sort keys %coursepersonnel) {
         next if ($role =~ /^\s*$/);          next if ($role =~ /^\s*$/);
  $r->print('<tr><td>'.$role.'</td><td>');   $r->print(&Apache::loncommon::start_data_table_row().
     '<td>'.$role.'</td><td>');
         foreach my $user (split(',',$coursepersonnel{$role})) {          foreach my $user (split(',',$coursepersonnel{$role})) {
     my ($puname,$pudom)=split(':',$user);      my ($puname,$pudom)=split(':',$user);
     $r->print(' '.&Apache::loncommon::aboutmewrapper(      $r->print(' '.&Apache::loncommon::aboutmewrapper(
Line 1151  sub print_html_classlist { Line 1205  sub print_html_classlist {
                                                                   $pudom),                                                                    $pudom),
                                                              $puname,$pudom));                                                               $puname,$pudom));
  }   }
         $r->print('</td></tr>');          $r->print('</td>'.&Apache::loncommon::end_data_table_row());
     }      }
     $r->print('</table>');      $r->print(&Apache::loncommon::end_data_table());
     #      #
     # Interface output      # Interface output
     $r->print('<input type="hidden" name="action" value="'.      $r->print('<input type="hidden" name="action" value="'.
               $ENV{'form.action'}.'" />');                $env{'form.action'}.'" />');
     $r->print("<p>\n");      $r->print("<p>\n");
     if ($ENV{'form.action'} ne 'modifystudent') {      if ($env{'form.action'} ne 'modifystudent') {
  my %lt=&Apache::lonlocal::texthash('csv' => "CSV",   my %lt=&Apache::lonlocal::texthash('csv' => "CSV",
                                            'excel' => "Excel",                                             'excel' => "Excel",
                                            'html'  => 'HTML');                                             'html'  => 'HTML');
         my $output_selector = '<select size="1" name="output" >';          my $output_selector = '<select size="1" name="output" >';
         foreach my $outputformat ('html','csv','excel') {          foreach my $outputformat ('html','csv','excel') {
             my $option = '<option value="'.$outputformat.'" ';              my $option = '<option value="'.$outputformat.'" ';
             if ($outputformat eq $ENV{'form.output'}) {              if ($outputformat eq $env{'form.output'}) {
                 $option .= 'selected ';                  $option .= 'selected ';
             }              }
             $option .='>'.$lt{$outputformat}.'</option>';              $option .='>'.$lt{$outputformat}.'</option>';
Line 1186  sub print_html_classlist { Line 1240  sub print_html_classlist {
         $r->print(&mt('There are no students currently enrolled.')."\n");          $r->print(&mt('There are no students currently enrolled.')."\n");
     } else {      } else {
         # Print out the available choices          # Print out the available choices
         if ($ENV{'form.action'} eq 'modifystudent') {          if ($env{'form.action'} eq 'modifystudent') {
             &show_class_list($r,'view','modify',              &show_class_list($r,'view','modify',
                              $ENV{'form.Status'},$classlist,$keylist);                               $env{'form.Status'},$classlist,$keylist);
         } else {          } else {
             &show_class_list($r,$ENV{'form.output'},'aboutme',              &show_class_list($r,$env{'form.output'},'aboutme',
                              $ENV{'form.Status'},$classlist,$keylist);                               $env{'form.Status'},$classlist,$keylist);
         }          }
     }      }
 }  }
Line 1199  sub print_html_classlist { Line 1253  sub print_html_classlist {
 # =================================================== Show student list to drop  # =================================================== Show student list to drop
 sub show_class_list {  sub show_class_list {
     my ($r,$mode,$linkto,$statusmode,$classlist,$keylist)=@_;      my ($r,$mode,$linkto,$statusmode,$classlist,$keylist)=@_;
     my $cid=$ENV{'request.course.id'};      my $cid=$env{'request.course.id'};
       my $cdom = $env{'course.'.$cid.'.domain'};
       my $cnum = $env{'course.'.$cid.'.num'};
       my ($classgroups) = &Apache::loncoursedata::get_group_memberships(
                                                 $classlist,$keylist,$cdom,$cnum);
     #      #
     # Variables for excel output      # Variables for excel output
     my ($excel_workbook, $excel_sheet, $excel_filename,$row,$format);      my ($excel_workbook, $excel_sheet, $excel_filename,$row,$format);
Line 1207  sub show_class_list { Line 1265  sub show_class_list {
     # Variables for csv output      # Variables for csv output
     my ($CSVfile,$CSVfilename);      my ($CSVfile,$CSVfilename);
     #      #
     my $sortby = $ENV{'form.sortby'};      my $sortby = $env{'form.sortby'};
     if ($sortby !~ /^(username|domain|section|fullname|id|start|end|type)$/) {      if ($sortby !~ /^(username|domain|section|groups|fullname|id|start|end|type)$/) {
         $sortby = 'username';          $sortby = 'username';
     }      }
       if (! exists($env{'form.displayphotos'})) {
           $env{'form.displayphotos'} = 'off';
       }
       my $displayphotos = $env{'form.displayphotos'};
   
     # Print out header       # Print out header 
     unless ($mode eq 'autoenroll') {      unless ($mode eq 'autoenroll') {
         $r->print(<<END);          $r->print(<<END);
 <input type="hidden" name="state" value="$ENV{'form.state'}" />  <input type="hidden" name="state" value="$env{'form.state'}" />
 END  END
     }      }
     $r->print(<<END);      $r->print(<<END);
 <input type="hidden" name="sortby" value="$sortby" />  <input type="hidden" name="sortby" value="$sortby" />
   <input type="hidden" name="displayphotos" value="$displayphotos" />
 END  END
     if ($mode eq 'html' || $mode eq 'view' || $mode eq 'autoenroll') {      if ($mode eq 'html' || $mode eq 'view' || $mode eq 'autoenroll') {
         if ($linkto eq 'aboutme') {          if ($linkto eq 'aboutme') {
             $r->print(&mt('Select a user name to view the users personal page.'));              $r->print(&mt("Select a user name to view the user's personal page."));
         } elsif ($linkto eq 'modify') {          } elsif ($linkto eq 'modify') {
             $r->print(&mt('Select a user name to modify the students information'));              $r->print(&mt("Select a user name to modify the student's information"));
         }          }
  my %lt=&Apache::lonlocal::texthash(   my %lt=&Apache::lonlocal::texthash(
                                            'usrn'   => "username",                                             'usrn'   => "username",
                                            'dom'    => "domain",                                             'dom'    => "domain",
                                            'sn'     => "student name",                                             'sn'     => "student name",
                                            'sec'    => "section",                                             'sec'    => "section",
                                              'grp'    => "active groups",
                                            'start'  => "start date",                                             'start'  => "start date",
                                            'end'    => "end date",                                             'end'    => "end date",
                                            'type'   => "enroll type/action"                                             'type'   => "enroll type/action",
                                              'photo'  => "photo",
    );     );
         unless ($mode eq 'autoenroll') {          unless ($mode eq 'autoenroll') {
             $r->print(<<END);              $r->print(<<END);
Line 1241  END Line 1307  END
 <input type="hidden" name="sdom"   value="" />  <input type="hidden" name="sdom"   value="" />
 END  END
         }          }
           if ($env{'course.'.$env{'request.course.id'}.'.internal.showphoto'}) {
               $r->print('
   <script type="text/javascript">
   function photowindow(photolink) {
       var title = "Photo_Viewer";
       var options = "scrollbars=1,resizable=1,menubar=0";
       options += ",width=240,height=240";
       stdeditbrowser = open(photolink,title,options,"1");
       stdeditbrowser.focus();
   }
   </script>
              ');
           }
         $r->print("          $r->print("
 <p>  <p>
 <table border=2>  ".&Apache::loncommon::start_data_table()."
 <tr>  <tr>
         ");          ");
         if ($mode eq 'autoenroll') {          if ($mode eq 'autoenroll') {
Line 1270  END Line 1349  END
        <a href="javascript:document.studentform.sortby.value='start';document.studentform.submit();">$lt{'start'}</a>         <a href="javascript:document.studentform.sortby.value='start';document.studentform.submit();">$lt{'start'}</a>
     </th><th>      </th><th>
        <a href="javascript:document.studentform.sortby.value='end';document.studentform.submit();">$lt{'end'}</a>         <a href="javascript:document.studentform.sortby.value='end';document.studentform.submit();">$lt{'end'}</a>
       </th><th>
          <a href="javascript:document.studentform.sortby.value='groups';document.studentform.submit();">$lt{'grp'}</a>
     </th>      </th>
   </tr>  
 END  END
           if ($env{'course.'.$env{'request.course.id'}.'.internal.showphoto'}) {
               my %photo_options = &Apache::lonlocal::texthash(
                                                               'on' => 'Show',
                                                               'off' => 'Hide',
                                                               );
               my $photochg = 'on';
               if ($displayphotos eq 'on') {
                   $photochg = 'off';
               }
               $r->print('    <th>'."\n".'     '. 
               '<a href="javascript:document.studentform.displayphotos.value='.
                         "'".$photochg."'".';document.studentform.submit();">'.
                         $photo_options{$photochg}.'</a>&nbsp;'.$lt{'photo'}."\n".
                         '    </th>'."\n");
           }
           $r->print("  </tr>\n");
     } elsif ($mode eq 'csv') {      } elsif ($mode eq 'csv') {
  #   #
  # Open a file   # Open a file
  $CSVfilename = '/prtspool/'.   $CSVfilename = '/prtspool/'.
     $ENV{'user.name'}.'_'.$ENV{'user.domain'}.'_'.      $env{'user.name'}.'_'.$env{'user.domain'}.'_'.
             time.'_'.rand(1000000000).'.csv';              time.'_'.rand(1000000000).'.csv';
  unless ($CSVfile = Apache::File->new('>/home/httpd'.$CSVfilename)) {   unless ($CSVfile = Apache::File->new('>/home/httpd'.$CSVfilename)) {
     $r->log_error("Couldn't open $CSVfilename for output $!");      $r->log_error("Couldn't open $CSVfilename for output $!");
Line 1291  END Line 1387  END
         if($statusmode eq 'Expired') {          if($statusmode eq 'Expired') {
             print $CSVfile '"'.&mt('Students with expired roles').'"'."\n";              print $CSVfile '"'.&mt('Students with expired roles').'"'."\n";
         }          }
           if($statusmode eq 'Future') {
               print $CSVfile '"'.&mt('Students with future roles').'"'."\n";
           }
         if ($statusmode eq 'Any') {          if ($statusmode eq 'Any') {
             print $CSVfile '"'.join('","',map {              print $CSVfile '"'.join('","',map {
  &Apache::loncommon::csv_translate(&mt($_))   &Apache::loncommon::csv_translate(&mt($_))
                 } ("username","domain","ID","student name",                  } ("username","domain","ID","student name",
                    "section","start date","end date","status")).'"'."\n";                     "section","start date","end date","status","active groups"))
                     .'"'."\n";
         } else {          } else {
             print $CSVfile '"'.join('","',map {              print $CSVfile '"'.join('","',map {
  &Apache::loncommon::csv_translate(&mt($_))   &Apache::loncommon::csv_translate(&mt($_))
                 } ("username","domain","ID","student name",                  } ("username","domain","ID","student name",
                    "section","start date","end date")).'"'."\n";                     "section","start date","end date","active groups")).'"'."\n";
         }          }
     } elsif ($mode eq 'excel') {      } elsif ($mode eq 'excel') {
         # Create the excel spreadsheet          # Create the excel spreadsheet
         $excel_filename = '/prtspool/'.          ($excel_workbook,$excel_filename,$format) = 
             $ENV{'user.name'}.'_'.$ENV{'user.domain'}.'_'.              &Apache::loncommon::create_workbook($r);
                 time.'_'.rand(1000000000).'.xls';          return if (! defined($excel_workbook));
         $excel_workbook = Spreadsheet::WriteExcel->new('/home/httpd'.  
                                                        $excel_filename);  
         $excel_workbook->set_tempdir('/home/httpd/perl/tmp');  
         #  
         $format = &Apache::loncommon::define_excel_formats($excel_workbook);  
         $excel_sheet = $excel_workbook->addworksheet('classlist');          $excel_sheet = $excel_workbook->addworksheet('classlist');
         #          #
         my $description = 'Class List for '.          my $description = 'Class List for '.
             $ENV{'course.'.$ENV{'request.course.id'}.'.description'};              $env{'course.'.$env{'request.course.id'}.'.description'};
         $excel_sheet->write($row++,0,$description,$format->{'h1'});          $excel_sheet->write($row++,0,$description,$format->{'h1'});
         #          #
         $excel_sheet->write($row++,0,["username","domain","ID",          $excel_sheet->write($row++,0,["username","domain","ID",
                                       "student name","section",                                        "student name","section",
                                       "start date","end date","status"],                                        "start date","end date","status",
                                         "active groups"],
                             $format->{'bold'});                              $format->{'bold'});
     }      }
     #      #
Line 1330  END Line 1426  END
     foreach (@$keylist) {      foreach (@$keylist) {
         $index{$_} = $i++;          $index{$_} = $i++;
     }      }
       $index{'groups'} = scalar(@{$keylist});
     my $index  = $index{$sortby};      my $index  = $index{$sortby};
     my $second = $index{'username'};      my $second = $index{'username'};
     my $third  = $index{'domain'};      my $third  = $index{'domain'};
Line 1347  END Line 1444  END
     my $lockcount = 0;      my $lockcount = 0;
     foreach my $student (@Sorted_Students) {      foreach my $student (@Sorted_Students) {
         my $sdata = $classlist->{$student};          my $sdata = $classlist->{$student};
           my $groups = $classgroups->{$student};
         my $username = $sdata->[$index{'username'}];          my $username = $sdata->[$index{'username'}];
         my $domain   = $sdata->[$index{'domain'}];          my $domain   = $sdata->[$index{'domain'}];
         my $section  = $sdata->[$index{'section'}];          my $section  = $sdata->[$index{'section'}];
           my $active_groups;
           if (ref($groups->{active}) eq 'HASH') {
               $active_groups = join(', ',keys(%{$groups->{'active'}}));
           }
         my $name     = $sdata->[$index{'fullname'}];          my $name     = $sdata->[$index{'fullname'}];
         my $id       = $sdata->[$index{'id'}];          my $id       = $sdata->[$index{'id'}];
         my $status   = $sdata->[$index{'status'}];          my $status   = $sdata->[$index{'status'}];
Line 1368  END Line 1470  END
             } else {              } else {
                 $end = &Apache::lonlocal::locallocaltime($end);                  $end = &Apache::lonlocal::locallocaltime($end);
             }              }
             $r->print("<tr>\n    ");      $r->print(&Apache::loncommon::start_data_table_row());
             if ($mode eq 'autoenroll') {              if ($mode eq 'autoenroll') {
                 my $lockedtype = $sdata->[$index{'lockedtype'}];                  my $lockedtype = $sdata->[$index{'lockedtype'}];
                 $studentcount++;                  $studentcount++;
                 my $cellentry;                  my $cellentry;
                 if ($type eq 'auto') {                  if ($type eq 'auto') {
                     $cellentry = '<b>'.&mt('auto').'</b>&nbsp;<input type="checkbox" name="chgauto" value="'.$username.':'.$domain.'" />&nbsp;Change';                      $cellentry = '<b>'.&mt('auto').'</b>&nbsp;<label><input type="checkbox" name="chgauto" value="'.$username.':'.$domain.'" />&nbsp;Change</label>';
                     $autocount ++;                      $autocount ++;
                 } else {                  } else {
                     $cellentry = '<table border="0" cellspacing="0"><tr><td rowspan="2"><b>'.&mt('manual').'</b></td><td><input type="checkbox" name="chgmanual" value="'.$username.':'.$domain.'" />&nbsp;Change</td></tr><tr><td>';                      $cellentry = '<table border="0" cellspacing="0"><tr><td rowspan="2"><b>'.&mt('manual').'</b></td><td><nobr><label><input type="checkbox" name="chgmanual" value="'.$username.':'.$domain.'" />&nbsp;Change</label></nobr></td></tr><tr><td><nobr>';
                     $manualcount ++;                      $manualcount ++;
                     if ($lockedtype) {                      if ($lockedtype) {
                         $cellentry .= '<input type="checkbox" name="unlockchg" value="'.$username.':'.$domain.'" />&nbsp;'.&mt('Unlock');                          $cellentry .= '<label><input type="checkbox" name="unlockchg" value="'.$username.':'.$domain.'" />&nbsp;'.&mt('Unlock').'</label>';
                         $unlockcount ++;                          $unlockcount ++;
                     } else {                      } else {
                         $cellentry .= '<input type="checkbox" name="lockchg" value="'.$username.':'.$domain.'" />&nbsp;'.&mt('Lock');                          $cellentry .= '<label><input type="checkbox" name="lockchg" value="'.$username.':'.$domain.'" />&nbsp;'.&mt('Lock').'</label>';
                         $lockcount ++;                          $lockcount ++;
                     }                      }
                     $cellentry .= '</td></tr></table>';                      $cellentry .= '</nobr></td></tr></table>';
                 }                  }
                 $r->print("<td>$cellentry<td>\n    ");                  $r->print("<td>$cellentry<td>\n    ");
             } else {              } else {
Line 1415  END Line 1517  END
     <td>$section</td>      <td>$section</td>
     <td>$start</td>      <td>$start</td>
     <td>$end</td>      <td>$end</td>
    </tr>      <td>$active_groups</td>
 END  END
               if ($env{'course.'.$env{'request.course.id'}.
    '.internal.showphoto'}) {
                   if ($displayphotos eq 'on') {
                       my $imgurl = 
    &Apache::lonnet::retrievestudentphoto($domain,
         $username,'gif',
         'thumbnail');
                   
                       $r->print('    <td align="right"><a href="javascript:photowindow('."'".&Apache::lonnet::studentphoto($domain,$username,'jpg')."'".')"><img src="'.$imgurl.'" border="1"></a></td>');
                   } else {
                       $r->print('    <td>&nbsp;</td>  ');
                   }
               }
       $r->print(&Apache::loncommon::end_data_table_row());
         } elsif ($mode eq 'csv') {          } elsif ($mode eq 'csv') {
             next if (! defined($CSVfile));              next if (! defined($CSVfile));
             # no need to bother with $linkto              # no need to bother with $linkto
Line 1437  END Line 1553  END
             if ($statusmode eq 'Any') {              if ($statusmode eq 'Any') {
                 push @line,&Apache::loncommon::csv_translate($status);                  push @line,&Apache::loncommon::csv_translate($status);
             }              }
               push @line,&Apache::loncommon::csv_translate($active_groups);
             print $CSVfile '"'.join('","',@line).'"'."\n";              print $CSVfile '"'.join('","',@line).'"'."\n";
         } elsif ($mode eq 'excel') {          } elsif ($mode eq 'excel') {
             $excel_sheet->write($row,0,[$username,$domain,$id,              $excel_sheet->write($row,0,[$username,$domain,$id,
                                           $name,$section]);                                            $name,$section]);
             my $col = 5;              my $col = 5;
             foreach my $time ($start,$end) {              foreach my $time ($start,$end) {
                 $excel_sheet->write($row,$col++,                  if (defined($time) && $time != 0) {
                       $excel_sheet->write($row,$col++,
                                    &Apache::lonstathelpers::calc_serial($time),                                     &Apache::lonstathelpers::calc_serial($time),
                                     $format->{'date'});                                      $format->{'date'});
                   } else {
                       $excel_sheet->write($row,$col++,'none');
                   }                    
             }              }
             $excel_sheet->write($row,$col++,$status);              $excel_sheet->write($row,$col++,$status);
               $excel_sheet->write($row,$col++,$active_groups);
             $row++;              $row++;
         }          }
     }      }
     if ($mode eq 'view' || $mode eq 'html' || $mode eq 'autoenroll') {      if ($mode eq 'view' || $mode eq 'html' || $mode eq 'autoenroll') {
         $r->print('</table><br>');   $r->print(&Apache::loncommon::end_data_table().'<br />');
     } elsif ($mode eq 'excel') {      } elsif ($mode eq 'excel') {
         $excel_workbook->close();          $excel_workbook->close();
         $r->print('<p><a href="'.$excel_filename.'">'.          $r->print('<p><a href="'.$excel_filename.'">'.
Line 1478  sub print_modify_student_form { Line 1600  sub print_modify_student_form {
     my $r = shift();      my $r = shift();
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                                             ['sdom','sname']);                                                  ['sdom','sname']);    
     my $sname  = $ENV{'form.sname'};      my $sname  = $env{'form.sname'};
     my $sdom   = $ENV{'form.sdom'};      my $sdom   = $env{'form.sdom'};
     my $sortby = $ENV{'form.sortby'};      my $sortby = $env{'form.sortby'};
     # determine the students name information      # determine the students name information
     my %info=&Apache::lonnet::get('environment',      my %info=&Apache::lonnet::get('environment',
                                   ['firstname','middlename',                                    ['firstname','middlename',
Line 1492  sub print_modify_student_form { Line 1614  sub print_modify_student_form {
                   '<p>'.                    '<p>'.
                   &mt('Unable to retrieve environment data for').' '.$sname.                    &mt('Unable to retrieve environment data for').' '.$sname.
                   &mt('in domain').' '.$sdom.'</p><p>'.                    &mt('in domain').' '.$sdom.'</p><p>'.
                   &mt('Please contact your LON-CAPA administrator regarding this situation.').'</p></body></html>');                    &mt('Please contact your LON-CAPA administrator regarding this situation.').'</p>'.&Apache::loncommon::end_page());
         return;          return;
     }      }
     # determine the students starting and ending times and section      # determine the students starting and ending times and section
Line 1526  sub print_modify_student_form { Line 1648  sub print_modify_student_form {
     }      }
     my $date_table = &date_setting_table($starttime,$endtime);      my $date_table = &date_setting_table($starttime,$endtime);
     #      #
     if (! exists($ENV{'form.Status'}) ||       if (! exists($env{'form.Status'}) || 
         $ENV{'form.Status'} !~ /^(Any|Expired|Active)$/) {          $env{'form.Status'} !~ /^(Any|Expired|Active|Future)$/) {
         $ENV{'form.Status'} = 'crap';          $env{'form.Status'} = 'crap';
     }      }
     # Make sure student is enrolled in course      # Make sure student is enrolled in course
     my %lt=&Apache::lonlocal::texthash(      my %lt=&Apache::lonlocal::texthash(
Line 1544  sub print_modify_student_form { Line 1666  sub print_modify_student_form {
                    'sec'   => "Section",                     'sec'   => "Section",
                    'sm'    => "Submit Modifications",                     'sm'    => "Submit Modifications",
        );         );
     $r->print(<<END);  # Check if section name is valid
       my $section_check = &section_check_js();
       $r->print(<<"END");
   <script type="text/javascript">
   $section_check
   function secverify(formname,caller) {
       if (validate(caller) == "error") {
           return;
       } else {
           formname.submit();
       }
   }
   </script>
 <p>  <p>
 <font size="+1">  <font size="+1">
 $lt{'odcc'}  $lt{'odcc'}
Line 1555  $lt{'odcc'} Line 1689  $lt{'odcc'}
 <input type="hidden" name="action"  value="modifystudent" />  <input type="hidden" name="action"  value="modifystudent" />
 <input type="hidden" name="state"   value="done" />  <input type="hidden" name="state"   value="done" />
 <input type="hidden" name="sortby"  value="$sortby" />  <input type="hidden" name="sortby"  value="$sortby" />
 <input type="hidden" name="Status"  value="$ENV{'form.Status'}" />  <input type="hidden" name="Status"  value="$env{'form.Status'}" />
 <h2>$lt{'mef'} $info{'firstname'} $info{'middlename'}   <h2>$lt{'mef'} $info{'firstname'} $info{'middlename'} 
 $info{'lastname'} $info{'generation'}, $sname\@$sdom</h2>  $info{'lastname'} $info{'generation'}, $sname\@$sdom</h2>
 <p>  <p>
Line 1571  $info{'lastname'} $info{'generation'}, $ Line 1705  $info{'lastname'} $info{'generation'}, $
 </p><p>  </p><p>
 <b>$lt{'sid'}</b>: <input type="text" name="id" value="$info{'id'}" size="12"/>  <b>$lt{'sid'}</b>: <input type="text" name="id" value="$info{'id'}" size="12"/>
 </p><p>  </p><p>
   <label>
 <input type="checkbox" name="forceid" >   <input type="checkbox" name="forceid" > 
 $lt{'disn'}  $lt{'disn'}
   </label>
 </p><p>  </p><p>
 <b>$lt{'sec'}</b>: <input type="text" name="section" value="$section" size="14"/>  <b>$lt{'sec'}</b>: <input type="text" name="section" value="$section" size="14"/>
 </p>  </p>
 <p>$current_date_description</p>  <p>$current_date_description</p>
 <p>$date_table</p>  <p>$date_table</p>
 <input type="submit" value="$lt{'sm'}" />  <input type="button" value="$lt{'sm'}" onClick="secverify(this.form,this.form.section)" />
 </body></html>  
 END  END
       $r->print(&Apache::loncommon::end_page());
     return;      return;
 }  }
   
Line 1588  END Line 1724  END
 # modify a single students section   # modify a single students section 
 #  #
 sub modify_single_student {  sub modify_single_student {
     my $r = shift;      my ($r) = @_;
     #      #
     # Remove non alphanumeric values from the section      # Remove non alphanumeric values from the section
     $ENV{'form.section'} =~ s/\W//g;      $env{'form.section'} =~ s/\W//g;
     #      #
     # Do the date defaults first      # Do the date defaults first
     my ($starttime,$endtime) = &get_dates_from_form();      my ($starttime,$endtime) = &get_dates_from_form();
     if ($ENV{'form.makedatesdefault'}) {      if ($env{'form.makedatesdefault'}) {
         $r->print(&make_dates_default($starttime,$endtime));          $r->print(&make_dates_default($starttime,$endtime));
     }      }
     # Get the 'sortby' and 'Status' variables so the user goes back to their      # Get the 'sortby' and 'Status' variables so the user goes back to their
     # previous screen      # previous screen
     my $sortby = $ENV{'form.sortby'};      my $sortby = $env{'form.sortby'};
     my $status = $ENV{'form.Status'};      my $status = $env{'form.Status'};
     #      #
     # We always need this information      # We always need this information
     my $slogin     = $ENV{'form.slogin'};      my $slogin     = $env{'form.slogin'};
     my $sdom       = $ENV{'form.sdomain'};      my $sdom       = $env{'form.sdomain'};
     #      #
     # Get the old data      # Get the old data
     my %old=&Apache::lonnet::get('environment',      my %old=&Apache::lonnet::get('environment',
Line 1613  sub modify_single_student { Line 1749  sub modify_single_student {
                                   'lastname','generation','id'],                                    'lastname','generation','id'],
                                  $sdom, $slogin);                                   $sdom, $slogin);
     $old{'section'} = &Apache::lonnet::getsection($sdom,$slogin,      $old{'section'} = &Apache::lonnet::getsection($sdom,$slogin,
                                                   $ENV{'request.course.id'});                                                    $env{'request.course.id'});
     my ($tmp) = keys(%old);      my ($tmp) = keys(%old);
     if ($tmp =~ /^(con_lost|error|no_such_host)/i) {      if ($tmp =~ /^(con_lost|error|no_such_host)/i) {
         $r->print(&mt('There was an error determining the environment values for')." $slogin \@ $sdom.");          $r->print(&mt('There was an error determining the environment values for')." $slogin \@ $sdom.");
Line 1622  sub modify_single_student { Line 1758  sub modify_single_student {
     undef $tmp;      undef $tmp;
     #      #
     # Get the new data      # Get the new data
     my $firstname  = $ENV{'form.firstname'};      my $firstname  = $env{'form.firstname'};
     my $middlename = $ENV{'form.middlename'};      my $middlename = $env{'form.middlename'};
     my $lastname   = $ENV{'form.lastname'};      my $lastname   = $env{'form.lastname'};
     my $generation = $ENV{'form.generation'};      my $generation = $env{'form.generation'};
     my $section    = $ENV{'form.section'};      my $section    = $env{'form.section'};
     my $courseid   = $ENV{'request.course.id'};      my $courseid   = $env{'request.course.id'};
     my $sid        = $ENV{'form.id'};      my $sid        = $env{'form.id'};
     my $displayable_starttime = localtime($starttime);      my $displayable_starttime = localtime($starttime);
     my $displayable_endtime   = localtime($endtime);      my $displayable_endtime   = localtime($endtime);
     #       # 
     # check for forceid override      # check for forceid override
     if ((defined($old{'id'})) && ($old{'id'} ne '') &&       if ((defined($old{'id'})) && ($old{'id'} ne '') && 
         ($sid ne $old{'id'}) && (! exists($ENV{'form.forceid'}))) {          ($sid ne $old{'id'}) && (! exists($env{'form.forceid'}))) {
         $r->print("<font color=\"ff0000\">".&mt('You changed the students id but did not disable the ID change safeguard. The students id will not be changed.')."</font>");          $r->print("<font color=\"ff0000\">".&mt('You changed the students id but did not disable the ID change safeguard. The students id will not be changed.')."</font>");
         $sid = $old{'id'};          $sid = $old{'id'};
     }      }
Line 1701  END Line 1837  END
     # Send request(s) to modify data (final undef is for 'desiredhost',      # Send request(s) to modify data (final undef is for 'desiredhost',
     # which is a moot point because the student already has an account.      # which is a moot point because the student already has an account.
     my $modify_section_results = &modifystudent($sdom,$slogin,      my $modify_section_results = &modifystudent($sdom,$slogin,
                                                 $ENV{'request.course.id'},                                                  $env{'request.course.id'},
                                                 $section,undef);                                                  $section,undef);
     if ($modify_section_results !~ /^ok/) {      if ($modify_section_results !~ /^ok/) {
         $r->print(&mt('An error occured during the attempt to change the section for this student.')."<br />");          $r->print(&mt('An error occured during the attempt to change the section for this student.')."<br />");
     }      }
     my $roleresults = &Apache::lonnet::modifystudent      my $roleresults = &Apache::lonnet::modifystudent
         ($sdom,$slogin,$sid,undef,undef,$firstname,$middlename,$lastname,          ($sdom,$slogin,$sid,undef,undef,$firstname,$middlename,$lastname,
          $generation,$section,$endtime,$starttime,$ENV{'form.forceid'});           $generation,$section,$endtime,$starttime,$env{'form.forceid'});
     if ($roleresults eq 'refused' ) {      if ($roleresults eq 'refused' ) {
         $r->print(&mt('Your request to change the role information for this student was refused. You do not appear to have sufficient authority to change student information.'));          $r->print(&mt('Your request to change the role information for this student was refused. You do not appear to have sufficient authority to change student information.'));
     } elsif ($roleresults !~ /ok/) {      } elsif ($roleresults !~ /ok/) {
Line 1717  END Line 1853  END
                   $roleresults);                    $roleresults);
         &Apache::lonnet::logthis("londropadd:failed attempt to modify student".          &Apache::lonnet::logthis("londropadd:failed attempt to modify student".
                                  " data for ".$slogin." \@ ".$sdom." by ".                                   " data for ".$slogin." \@ ".$sdom." by ".
                                  $ENV{'user.name'}." \@ ".$ENV{'user.domain'}.                                   $env{'user.name'}." \@ ".$env{'user.domain'}.
                                  ":".$roleresults);                                   ":".$roleresults);
     } else { # everything is okay!      } else { # everything is okay!
         $r->print(&mt('Student information updated successfully.')." <br />".          $r->print(&mt('Student information updated successfully.')." <br />".
Line 1730  END Line 1866  END
 <input type="hidden" name="sortby" value="$sortby" />  <input type="hidden" name="sortby" value="$sortby" />
 <input type="hidden" name="Status" value="$status" />  <input type="hidden" name="Status" value="$status" />
 <a href="javascript:document.studentform.submit();">$Masd</a>  <a href="javascript:document.studentform.submit();">$Masd</a>
 </body></html>  
 END  END
       $r->print(&Apache::loncommon::end_page());
     return;      return;
 }  }
   
 sub get_enrollment_data {  sub get_enrollment_data {
     my ($sname,$sdomain) = @_;      my ($sname,$sdomain) = @_;
     my $courseid = $ENV{'request.course.id'};      my $courseid = $env{'request.course.id'};
     $courseid =~ s:_:/:g;      my $cdom = $env{'course.'.$courseid.'.domain'};
       my $cnum = $env{'course.'.$courseid.'.num'};
     my %roles = &Apache::lonnet::dump('roles',$sdomain,$sname);      my %roles = &Apache::lonnet::dump('roles',$sdomain,$sname);
     my ($tmp) = keys(%roles);      my ($tmp) = keys(%roles);
     # Bail out if we were unable to get the students roles      # Bail out if we were unable to get the students roles
Line 1748  sub get_enrollment_data { Line 1885  sub get_enrollment_data {
     my $section = '';      my $section = '';
     my $count = scalar(keys(%roles));      my $count = scalar(keys(%roles));
     while (my ($course,$role) = each(%roles)) {      while (my ($course,$role) = each(%roles)) {
         if ($course=~ /^\/$courseid\/*\s*(\w+)*_st$/ ) {          if ($course=~m{^/\Q$cdom\E/\Q$cnum\E/*\s*(\w+)*_st$} ) {
             #              #
             # Get active role              # Get active role
             $section=$1;              $section=$1;
Line 1796  which describes the order elements are s Line 1933  which describes the order elements are s
 #################################################  #################################################
 sub show_drop_list {  sub show_drop_list {
     my ($r,$classlist,$keylist,$nosort)=@_;      my ($r,$classlist,$keylist,$nosort)=@_;
     my $cid=$ENV{'request.course.id'};      my $cid=$env{'request.course.id'};
     if (! exists($ENV{'form.sortby'})) {      if (! exists($env{'form.sortby'})) {
         &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},          &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                                                 ['sortby']);                                                  ['sortby']);
     }      }
     my $sortby = $ENV{'form.sortby'};      my $sortby = $env{'form.sortby'};
     if ($sortby !~ /^(username|domain|section|fullname|id|start|end)$/) {      if ($sortby !~ /^(username|domain|section|groups|fullname|id|start|end)$/) {
         $sortby = 'username';          $sortby = 'username';
     }      }
       my $cdom = $env{'course.'.$cid.'.domain'};
       my $cnum = $env{'course.'.$cid,'.num'};
       my ($classgroups) = &Apache::loncoursedata::get_group_memberships(
                                                 $classlist,$keylist,$cdom,$cnum);
     #      #
     my $action = "drop";      my $action = "drop";
     $r->print(<<END);      $r->print(<<END);
Line 1832  my %lt=&Apache::lonlocal::texthash('usrn Line 1973  my %lt=&Apache::lonlocal::texthash('usrn
                                    'sec'    => "section",                                     'sec'    => "section",
                                    'start'  => "start date",                                     'start'  => "start date",
                                    'end'    => "end date",                                     'end'    => "end date",
                                      'groups' => "active groups",
                                    );                                     );
     if ($nosort) {      if ($nosort) {
    $r->print(&Apache::loncommon::start_data_table());
         $r->print(<<END);          $r->print(<<END);
 <table border=2>  
 <tr>  <tr>
     <th>&nbsp;</th>      <th>&nbsp;</th>
     <th>$lt{'usrn'}</th>      <th>$lt{'usrn'}</th>
Line 1845  my %lt=&Apache::lonlocal::texthash('usrn Line 1987  my %lt=&Apache::lonlocal::texthash('usrn
     <th>$lt{'sec'}</th>      <th>$lt{'sec'}</th>
     <th>$lt{'start'}</th>      <th>$lt{'start'}</th>
     <th>$lt{'end'}</th>      <th>$lt{'end'}</th>
       <th>$lt{'groups'}</th>
 </tr>  </tr>
 END  END
   
     } else  {      } else  {
    $r->print(&Apache::loncommon::start_data_table());
         $r->print(<<END);          $r->print(<<END);
 <table border=2>  
 <tr><th>&nbsp;</th>  <tr><th>&nbsp;</th>
     <th>      <th>
        <a href="/adm/dropadd?action=$action&sortby=username">$lt{'usrn'}</a>         <a href="/adm/dropadd?action=$action&sortby=username">$lt{'usrn'}</a>
Line 1866  END Line 2009  END
        <a href="/adm/dropadd?action=$action&sortby=start">$lt{'start'}</a>         <a href="/adm/dropadd?action=$action&sortby=start">$lt{'start'}</a>
     </th><th>      </th><th>
        <a href="/adm/dropadd?action=$action&sortby=end">$lt{'end'}</a>         <a href="/adm/dropadd?action=$action&sortby=end">$lt{'end'}</a>
       </th><th>
          <a href="/adm/dropadd?action=$action&sortby=groups">$lt{'groups'}</a>
     </th>      </th>
 </tr>  </tr>
 END  END
Line 1877  END Line 2022  END
     foreach (@$keylist) {      foreach (@$keylist) {
         $index{$_} = $i++;          $index{$_} = $i++;
     }      }
       $index{'groups'} = scalar(@$keylist);
     my $index  = $index{$sortby};      my $index  = $index{$sortby};
     my $second = $index{'username'};      my $second = $index{'username'};
     my $third  = $index{'domain'};      my $third  = $index{'domain'};
Line 1897  END Line 2043  END
         my $id       = $sdata->[$index{'id'}];          my $id       = $sdata->[$index{'id'}];
         my $start    = $sdata->[$index{'start'}];          my $start    = $sdata->[$index{'start'}];
         my $end      = $sdata->[$index{'end'}];          my $end      = $sdata->[$index{'end'}];
           my $groups = $classgroups->{$student};
           my $active_groups;
           if (ref($groups->{active}) eq 'HASH') {
               $active_groups = join(', ',keys(%{$groups->{'active'}}));
           }
         if (! defined($start) || $start == 0) {          if (! defined($start) || $start == 0) {
             $start = &mt('none');              $start = &mt('none');
         } else {          } else {
Line 1910  END Line 2061  END
         my $status   = $sdata->[$index{'status'}];          my $status   = $sdata->[$index{'status'}];
         next if ($status ne 'Active');          next if ($status ne 'Active');
         #          #
           $r->print(&Apache::loncommon::start_data_table_row());
         $r->print(<<"END");          $r->print(<<"END");
 <tr>  
     <td><input type="checkbox" name="droplist" value="$student"></td>      <td><input type="checkbox" name="droplist" value="$student"></td>
     <td>$username</td>      <td>$username</td>
     <td>$domain</td>      <td>$domain</td>
Line 1920  END Line 2071  END
     <td>$section</td>      <td>$section</td>
     <td>$start</td>      <td>$start</td>
     <td>$end</td>      <td>$end</td>
 </tr>      <td>$active_groups</td>
 END  END
           $r->print(&Apache::loncommon::end_data_table_row());
     }      }
     $r->print('</table><br>');      $r->print(&Apache::loncommon::end_data_table().'<br />');
     %lt=&Apache::lonlocal::texthash(      %lt=&Apache::lonlocal::texthash(
                'dp'   => "Drop Students",                 'dp'   => "Drop Students",
                        'ca'   => "check all",                         'ca'   => "check all",
Line 1952  sub print_first_courselist_upload_form { Line 2104  sub print_first_courselist_upload_form {
     $str .= "<p>\n";      $str .= "<p>\n";
     $str .= '<input type="submit" name="fileupload" value="'.      $str .= '<input type="submit" name="fileupload" value="'.
         &mt('Upload class list').'">'."\n";          &mt('Upload class list').'">'."\n";
     $str .= '<input type="checkbox" name="noFirstLine" /> '.      $str .= '<label><input type="checkbox" name="noFirstLine" /> '.
         &mt('Ignore First Line')."</p>\n";          &mt('Ignore First Line')."</label></p>\n";
     $str .= &Apache::loncommon::help_open_topic("Course_Create_Class_List",      $str .= &Apache::loncommon::help_open_topic("Course_Create_Class_List",
                          &mt("How do I create a class list from a spreadsheet")).                           &mt("How do I create a class list from a spreadsheet")).
                              "<br />\n";                               "<br />\n";
     $str .= &Apache::loncommon::help_open_topic("Course_Convert_To_CSV",      $str .= &Apache::loncommon::help_open_topic("Course_Convert_To_CSV",
                            &mt("How do I create a CSV file from a spreadsheet")).                             &mt("How do I create a CSV file from a spreadsheet")).
                                "<br />\n";                                 "<br />\n";
     $str .= "</body>\n</html>\n";      $str .= &Apache::loncommon::end_page();
     $r->print($str);      $r->print($str);
     return;      return;
 }  }
Line 1970  sub upfile_drop_add { Line 2122  sub upfile_drop_add {
     my $r=shift;      my $r=shift;
     &Apache::loncommon::load_tmp_file($r);      &Apache::loncommon::load_tmp_file($r);
     my @studentdata=&Apache::loncommon::upfile_record_sep();      my @studentdata=&Apache::loncommon::upfile_record_sep();
     if($ENV{'form.noFirstLine'}){shift(@studentdata);}      if($env{'form.noFirstLine'}){shift(@studentdata);}
     my @keyfields = split(/\,/,$ENV{'form.keyfields'});      my @keyfields = split(/\,/,$env{'form.keyfields'});
     my $cid = $ENV{'request.course.id'};      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++) {
         if ($ENV{'form.upfile_associate'} eq 'reverse') {          if ($env{'form.upfile_associate'} eq 'reverse') {
             if ($ENV{'form.f'.$i} ne 'none') {              if ($env{'form.f'.$i} ne 'none') {
                 $fields{$keyfields[$i]}=$ENV{'form.f'.$i};                  $fields{$keyfields[$i]}=$env{'form.f'.$i};
             }              }
         } else {          } else {
             $fields{$ENV{'form.f'.$i}}=$keyfields[$i];              $fields{$env{'form.f'.$i}}=$keyfields[$i];
         }          }
     }      }
     #      #
     # Store the field choices away      # Store the field choices away
     foreach my $field (qw/username names       foreach my $field (qw/username names 
                        fname mname lname gen id sec ipwd email/) {                         fname mname lname gen id sec ipwd email/) {
         $ENV{'form.'.$field.'_choice'}=$fields{$field};          $env{'form.'.$field.'_choice'}=$fields{$field};
     }      }
     &Apache::loncommon::store_course_settings('enrollment_upload',      &Apache::loncommon::store_course_settings('enrollment_upload',
                                               { 'username_choice' => 'scalar',                                                { 'username_choice' => 'scalar',
Line 2003  sub upfile_drop_add { Line 2155  sub upfile_drop_add {
   
     #      #
     my ($startdate,$enddate) = &get_dates_from_form();      my ($startdate,$enddate) = &get_dates_from_form();
     if ($ENV{'form.makedatesdefault'}) {      if ($env{'form.makedatesdefault'}) {
         $r->print(&make_dates_default($startdate,$enddate));          $r->print(&make_dates_default($startdate,$enddate));
     }      }
     # Determine domain and desired host (home server)      # Determine domain and desired host (home server)
     my $domain=$ENV{'form.lcdomain'};      my $domain=$env{'form.lcdomain'};
     my $desiredhost = $ENV{'form.lcserver'};      my $desiredhost = $env{'form.lcserver'};
     if (lc($desiredhost) eq 'default') {      if (lc($desiredhost) eq 'default') {
         $desiredhost = undef;          $desiredhost = undef;
     } else {      } else {
Line 2016  sub upfile_drop_add { Line 2168  sub upfile_drop_add {
         if (! exists($home_servers{$desiredhost})) {          if (! exists($home_servers{$desiredhost})) {
             $r->print('<font color="#ff0000">'.&mt('Error').'</font>'.              $r->print('<font color="#ff0000">'.&mt('Error').'</font>'.
                       &mt('Invalid home server specified'));                        &mt('Invalid home server specified'));
             $r->print("</body>\n</html>\n");              $r->print(&Apache::loncommon::end_page());
             return;              return;
         }          }
     }      }
     # Determine authentication mechanism      # Determine authentication mechanism
     my $amode  = '';      my $amode  = '';
     my $genpwd = '';      my $genpwd = '';
     if ($ENV{'form.login'} eq 'krb') {      if ($env{'form.login'} eq 'krb') {
         $amode='krb';          $amode='krb';
  $amode.=$ENV{'form.krbver'};   $amode.=$env{'form.krbver'};
         $genpwd=$ENV{'form.krbarg'};          $genpwd=$env{'form.krbarg'};
     } elsif ($ENV{'form.login'} eq 'int') {      } elsif ($env{'form.login'} eq 'int') {
         $amode='internal';          $amode='internal';
         if ((defined($ENV{'form.intarg'})) && ($ENV{'form.intarg'})) {          if ((defined($env{'form.intarg'})) && ($env{'form.intarg'})) {
             $genpwd=$ENV{'form.intarg'};              $genpwd=$env{'form.intarg'};
         }          }
     } elsif ($ENV{'form.login'} eq 'loc') {      } elsif ($env{'form.login'} eq 'loc') {
         $amode='localauth';          $amode='localauth';
         if ((defined($ENV{'form.locarg'})) && ($ENV{'form.locarg'})) {          if ((defined($env{'form.locarg'})) && ($env{'form.locarg'})) {
             $genpwd=$ENV{'form.locarg'};              $genpwd=$env{'form.locarg'};
         }          }
     }      }
     if ($amode =~ /^krb/) {      if ($amode =~ /^krb/) {
Line 2046  sub upfile_drop_add { Line 2198  sub upfile_drop_add {
             $amode = ''; # This causes the loop below to be skipped              $amode = ''; # This causes the loop below to be skipped
         }          }
     }      }
     unless (($domain=~/\W/) || ($amode eq '')) {      if ( $domain eq &clean_domain($domain)
    && ($amode ne '')) {
         #######################################          #######################################
         ##         Enroll Students           ##          ##         Enroll Students           ##
         #######################################          #######################################
Line 2054  sub upfile_drop_add { Line 2207  sub upfile_drop_add {
         my $count=0;          my $count=0;
         my $flushc=0;          my $flushc=0;
         my %student=();          my %student=();
           # Get information about course groups
           my %curr_groups = &Apache::longroup::coursegroups();
         # Get new classlist          # Get new classlist
         foreach (@studentdata) {          foreach (@studentdata) {
             my %entries=&Apache::loncommon::record_sep($_);              my %entries=&Apache::loncommon::record_sep($_);
Line 2078  sub upfile_drop_add { Line 2233  sub upfile_drop_add {
                         $gen=$entries{$fields{'gen'}};                          $gen=$entries{$fields{'gen'}};
                     }                      }
                 }                  }
                 if ($entries{$fields{'username'}}=~/\W/) {                  if ($entries{$fields{'username'}}
       ne &LONCAPA::clean_username($entries{$fields{'username'}})) {
                     $r->print('<br />'.                      $r->print('<br />'.
       &mt('<b>[_1]</b>: Unacceptable username for user [_2] [_3] [_4] [_5]',        &mt('<b>[_1]</b>: Unacceptable username for user [_2] [_3] [_4] [_5]',
           $entries{$fields{'username'}},$fname,$mname,$lname,$gen).            $entries{$fields{'username'}},$fname,$mname,$lname,$gen).
Line 2094  sub upfile_drop_add { Line 2250  sub upfile_drop_add {
                     }                      }
                     # remove non alphanumeric values from section                      # remove non alphanumeric values from section
                     $sec =~ s/\W//g;                      $sec =~ s/\W//g;
                       if ($sec eq "none" || $sec eq 'all') {
                           $r->print('<br />'.
         &mt('<b>[_1]</b>: Unable to enroll: section name "[_2]" for user [_3] [_4] [_5] [_6] is a reserved word.',
                           $username,$sec,$fname,$mname,$lname,$gen));
                           next;
                       } elsif (($sec ne '') && (exists($curr_groups{$sec}))) {
                           $r->print('<br />'.
         &mt('<b>[_1]</b>: Unable to enroll: section name "[_2]" for user [_3] [_4] [_5] [_6] is a course group. Section names and group names must be distinct.',
                           $username,$sec,$fname,$mname,$lname,$gen));
                           next;
                       }
                     # determine student id number                      # determine student id number
                     my $id='';                      my $id='';
                     if (defined($fields{'id'})) {                      if (defined($fields{'id'})) {
Line 2126  sub upfile_drop_add { Line 2293  sub upfile_drop_add {
                              \$lname,\$gen,\$sec) {                               \$lname,\$gen,\$sec) {
                         $$_ =~ s/(\s+$|^\s+)//g;                          $$_ =~ s/(\s+$|^\s+)//g;
                     }                      }
                     if ($password || $ENV{'form.login'} eq 'loc') {                      if ($password || $env{'form.login'} eq 'loc') {
                         &modifystudent($domain,$username,$cid,$sec,                          &modifystudent($domain,$username,$cid,$sec,
                                        $desiredhost);                                         $desiredhost);
                         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,                               $fname,$mname,$lname,$gen,$sec,$enddate,
                              $startdate,$ENV{'form.forceid'},$desiredhost,                               $startdate,$env{'form.forceid'},$desiredhost,
                              $email);                               $email);
                         if ($reply ne 'ok') {                          if ($reply ne 'ok') {
                             $reply =~ s/^error://;                              $reply =~ s/^error://;
Line 2163  sub upfile_drop_add { Line 2330  sub upfile_drop_add {
         #####################################          #####################################
         #           Drop students           #          #           Drop students           #
         #####################################          #####################################
         if ($ENV{'form.fullup'} eq 'yes') {          if ($env{'form.fullup'} eq 'yes') {
             $r->print('<h3>'.&mt('Dropping Students')."</h3>\n");              $r->print('<h3>'.&mt('Dropping Students')."</h3>\n");
             #  Get current classlist              #  Get current classlist
             my ($classlist,$keylist)=&Apache::loncoursedata::get_classlist();              my ($classlist,$keylist)=&Apache::loncoursedata::get_classlist();
Line 2191  sub upfile_drop_add { Line 2358  sub upfile_drop_add {
 sub drop_student_list {  sub drop_student_list {
     my $r=shift;      my $r=shift;
     my $count=0;      my $count=0;
     my @droplist;      my @droplist = &Apache::loncommon::get_env_multiple('form.droplist');
     if (ref($ENV{'form.droplist'})) {  
         @droplist = @{$ENV{'form.droplist'}};  
     } else {  
         @droplist = ($ENV{'form.droplist'});  
     }  
     foreach (@droplist) {      foreach (@droplist) {
         my ($uname,$udom)=split(/\:/,$_);          my ($uname,$udom)=split(/\:/,$_);
         # drop student          # drop student
         my $result = &modifystudent($udom,$uname,$ENV{'request.course.id'});          my $result = &modifystudent($udom,$uname,$env{'request.course.id'});
         if ($result eq 'ok' || $result eq 'ok:') {          if ($result eq 'ok' || $result eq 'ok:') {
             $r->print(&mt('Dropped [_1]',$uname.'@'.$udom).'<br>');              $r->print(&mt('Dropped [_1]',$uname.'@'.$udom).'<br>');
             $count++;              $count++;
Line 2214  sub drop_student_list { Line 2376  sub drop_student_list {
     $r->print('<p>'.&mt('Re-enrollment will re-activate data.')) if ($count);      $r->print('<p>'.&mt('Re-enrollment will re-activate data.')) if ($count);
 }  }
   
   sub section_check_js {
       my $groupslist;
       my %curr_groups = &Apache::longroup::coursegroups();
       if (%curr_groups) {
           $groupslist = join('","',sort(keys(%curr_groups)));
       }
       return <<"END";
   function validate(caller) {
       var groups = new Array("$groupslist");
       var secname = caller.value;
       if ((secname == 'all') || (secname == 'none')) {
           alert("'"+secname+"' may not be used as the name for a section, as it is a reserved word.\\nPlease choose a different section name.");
           return 'error';
       }
       if (secname != '') {
           for (var k=0; k<groups.length; k++) {
               if (secname == groups[k]) {
                   alert("'"+secname+"' may not be used as the name for a section, as it is the name of a course group.\\nSection names and group names must be distinct. Please choose a different section name.");
                   return 'error';
               }
           }
       }
       return 'ok';
   }
   END
   }
   
 ###################################################################  ###################################################################
 ###################################################################  ###################################################################
   
Line 2264  sub handler { Line 2453  sub handler {
           text=>"Enrollment Manager",            text=>"Enrollment Manager",
           faq=>9,bug=>'Instructor Interface',});            faq=>9,bug=>'Instructor Interface',});
     #  Needs to be in a course      #  Needs to be in a course
     if (! (($ENV{'request.course.fn'}) &&      if (! ($env{'request.course.fn'})) {
           (&Apache::lonnet::allowed('cst',$ENV{'request.course.id'})))) {          # Not in a course
         # Not in a course, or not allowed to modify parms          $env{'user.error.msg'}=
         $ENV{'user.error.msg'}=              "/adm/dropadd:cst:0:0:Cannot manage or view course groups, ".
             "/adm/dropadd:cst:0:0:Cannot drop or add students";                                    "or drop or add students";
         return HTTP_NOT_ACCEPTABLE;           return HTTP_NOT_ACCEPTABLE; 
     }      }
     #      #
       my $view_permission = 
           &Apache::lonnet::allowed('vcl',$env{'request.course.id'});
       my $enrl_permission = 
           &Apache::lonnet::allowed('cst',$env{'request.course.id'});
   
       my $grp_view_permission =
           &Apache::lonnet::allowed('vcg',$env{'request.course.id'});
       my $grp_manage_permission =
           &Apache::lonnet::allowed('mdg',$env{'request.course.id'});
   
   
       if (! $grp_view_permission && ! $grp_manage_permission && 
                                     ! $view_permission && ! $enrl_permission) {
           $env{'user.error.msg'}=
        "/adm/coursegroups:cst:0:0:Cannot manage or view course groups, ".
                                    "or drop or add students";
           return HTTP_NOT_ACCEPTABLE;
       }
   
       #
     # Only output the header information if they did not request csv format      # Only output the header information if they did not request csv format
     #      #
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},  
                                             ['state','action']);  
     # Start page      # Start page
     &Apache::loncommon::content_type($r,'text/html');      &Apache::loncommon::content_type($r,'text/html');
     $r->send_http_header;      $r->send_http_header;
     $r->print(&header());      $r->print(&header());
     #      #
     # Main switch on form.action and form.state, as appropriate      # Main switch on form.action and form.state, as appropriate
     if (! exists($ENV{'form.action'})) {      if (! exists($env{'form.action'})) {
         $r->print(&Apache::lonhtmlcommon::breadcrumbs          $r->print(&Apache::lonhtmlcommon::breadcrumbs('Enrollment Manager'));
                   (undef,'Enrollment Manager'));          &print_main_menu($r,$enrl_permission,$view_permission,$grp_manage_permission,
         &print_main_menu($r);                           $grp_view_permission);
     } elsif ($ENV{'form.action'} eq 'upload') {      } elsif ($env{'form.action'} eq 'upload' && $enrl_permission) {
         &Apache::lonhtmlcommon::add_breadcrumb          &Apache::lonhtmlcommon::add_breadcrumb
             ({href=>'/adm/dropadd?action=upload&state=',              ({href=>'/adm/dropadd?action=upload&state=',
               text=>"Upload Classlist"});                text=>"Upload Classlist"});
         $r->print(&Apache::lonhtmlcommon::breadcrumbs          $r->print(&Apache::lonhtmlcommon::breadcrumbs('Upload Classlist',
                   (undef,'Upload Classlist'));        'Course_Create_Class_List'));
         if (! exists($ENV{'form.state'})) {          if (! exists($env{'form.state'})) {
             &print_first_courselist_upload_form($r);                          &print_first_courselist_upload_form($r);            
         } elsif ($ENV{'form.state'} eq 'got_file') {          } elsif ($env{'form.state'} eq 'got_file') {
             &print_upload_manager_form($r);              &print_upload_manager_form($r);
         } elsif ($ENV{'form.state'} eq 'enrolling') {          } elsif ($env{'form.state'} eq 'enrolling') {
             if ($ENV{'form.datatoken'}) {              if ($env{'form.datatoken'}) {
                 &upfile_drop_add($r);                  &upfile_drop_add($r);
             } else {              } else {
                 # Hmmm, this is an error                  # Hmmm, this is an error
Line 2305  sub handler { Line 2512  sub handler {
         } else {          } else {
             &print_first_courselist_upload_form($r);                          &print_first_courselist_upload_form($r);            
         }          }
     } elsif ($ENV{'form.action'} eq 'drop') {      } elsif ($env{'form.action'} eq 'drop' && $enrl_permission) {
         &Apache::lonhtmlcommon::add_breadcrumb          &Apache::lonhtmlcommon::add_breadcrumb
             ({href=>'/adm/dropadd?action=drop',              ({href=>'/adm/dropadd?action=drop',
               text=>"Drop Students"});                text=>"Drop Students"});
         $r->print(&Apache::lonhtmlcommon::breadcrumbs          $r->print(&Apache::lonhtmlcommon::breadcrumbs('Drop Students',
                   (undef,'Drop Students'));        'Course_Drop_Student'));
         if (! exists($ENV{'form.state'})) {          if (! exists($env{'form.state'})) {
             &print_drop_menu($r);              &print_drop_menu($r);
         } elsif ($ENV{'form.state'} eq 'done') {          } elsif ($env{'form.state'} eq 'done') {
             &drop_student_list($r);              &drop_student_list($r);
         } else {          } else {
             &print_drop_menu($r);              &print_drop_menu($r);
         }          }
     } elsif ($ENV{'form.action'} eq 'enrollstudent') {      } elsif ($env{'form.action'} eq 'enrollstudent' && $enrl_permission) {
         &Apache::lonhtmlcommon::add_breadcrumb          &Apache::lonhtmlcommon::add_breadcrumb
             ({href=>'/adm/dropadd?action=enrollstudent',              ({href=>'/adm/dropadd?action=enrollstudent',
               text=>"Enroll Student"});                text=>"Enroll Student"});
         $r->print(&Apache::lonhtmlcommon::breadcrumbs          $r->print(&Apache::lonhtmlcommon::breadcrumbs('Enroll Student',
                   (undef,'Enroll Student'));        'Course_Add_Student'));
         if (! exists($ENV{'form.state'})) {          if (! exists($env{'form.state'})) {
             &get_student_username_domain_form($r);              &get_student_username_domain_form($r);
         } elsif ($ENV{'form.state'} eq 'gotusername') {          } elsif ($env{'form.state'} eq 'gotusername') {
             &print_enroll_single_student_form($r);              &print_enroll_single_student_form($r);
         } elsif ($ENV{'form.state'} eq 'enrolling') {          } elsif ($env{'form.state'} eq 'enrolling') {
             &enroll_single_student($r);              &enroll_single_student($r);
         } else {          } else {
             &get_student_username_domain_form($r);              &get_student_username_domain_form($r);
         }          }
     } elsif ($ENV{'form.action'} eq 'classlist') {      } elsif ($env{'form.action'} eq 'classlist' && $view_permission) {
         &Apache::lonhtmlcommon::add_breadcrumb          &Apache::lonhtmlcommon::add_breadcrumb
             ({href=>'/adm/dropadd?action=classlist',              ({href=>'/adm/dropadd?action=classlist',
               text=>"View Classlist"});                text=>"View Classlist"});
         $r->print(&Apache::lonhtmlcommon::breadcrumbs          $r->print(&Apache::lonhtmlcommon::breadcrumbs('View Classlist',
                   (undef,'View Classlist'));        'Course_View_Class_List'));
         if (! exists($ENV{'form.state'})) {          if (! exists($env{'form.state'})) {
             &print_html_classlist($r,undef);              &print_html_classlist($r,undef);
         } elsif ($ENV{'form.state'} eq 'csv') {          } elsif ($env{'form.state'} eq 'csv') {
             &print_html_classlist($r,'csv');              &print_html_classlist($r,'csv');
         } elsif ($ENV{'form.state'} eq 'excel') {          } elsif ($env{'form.state'} eq 'excel') {
             &print_html_classlist($r,'excel');              &print_html_classlist($r,'excel');
         } else {          } else {
             &print_html_classlist($r,undef);              &print_html_classlist($r,undef);
         }          }
     } elsif ($ENV{'form.action'} eq 'modifystudent') {      } elsif ($env{'form.action'} eq 'modifystudent' && $enrl_permission) {
         &Apache::lonhtmlcommon::add_breadcrumb          &Apache::lonhtmlcommon::add_breadcrumb
             ({href=>'/adm/dropadd?action=modifystudent',              ({href=>'/adm/dropadd?action=modifystudent',
               text=>"Modify Student Data"});                text=>"Modify Student Data"});
         $r->print(&Apache::lonhtmlcommon::breadcrumbs          $r->print(&Apache::lonhtmlcommon::breadcrumbs('Modify Student Data',
                   (undef,'Modify Student Data'));        'Course_Modify_Student_Data'));
         if (! exists($ENV{'form.state'})) {          if (! exists($env{'form.state'})) {
             &print_html_classlist($r);              &print_html_classlist($r);
         } elsif ($ENV{'form.state'} eq 'selected') {          } elsif ($env{'form.state'} eq 'selected') {
             &print_modify_student_form($r);              &print_modify_student_form($r);
         } elsif ($ENV{'form.state'} eq 'done') {          } elsif ($env{'form.state'} eq 'done') {
             &modify_single_student($r);              &modify_single_student($r);
         } else {          } else {
             &print_html_classlist($r);              &print_html_classlist($r);
Line 2366  sub handler { Line 2573  sub handler {
     } else {      } else {
         # We should not end up here, but I guess it is possible          # We should not end up here, but I guess it is possible
         &Apache::lonnet::logthis("Undetermined state in londropadd.pm.  ".          &Apache::lonnet::logthis("Undetermined state in londropadd.pm.  ".
                                  "form.action = ".$ENV{'form.action'}.                                   "form.action = ".$env{'form.action'}.
                                  "Someone should fix this.");                                   "Someone should fix this.");
         $r->print(&Apache::lonhtmlcommon::breadcrumbs          $r->print(&Apache::lonhtmlcommon::breadcrumbs('Enrollment Manager'));
                   (undef,'Enrollment Manager'));          &print_main_menu($r,$enrl_permission,$view_permission);
         &print_main_menu($r);  
     }      }
     #      #
     # Finish up      # Finish up
     $r->print('</form></body></html>');      $r->print('</form>'.&Apache::loncommon::end_page());
     return OK;      return OK;
 }  }
   

Removed from v.1.116  
changed lines
  Added in v.1.151


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