Annotation of loncom/interface/londropadd.pm, revision 1.115

1.1       www         1: # The LearningOnline Network with CAPA
                      2: # Handler to drop and add students in courses 
                      3: #
1.115   ! raeburn     4: # $Id: londropadd.pm,v 1.114 2004/06/17 18:31:24 raeburn Exp $
1.17      albertel    5: #
                      6: # Copyright Michigan State University Board of Trustees
                      7: #
                      8: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
                      9: #
                     10: # LON-CAPA is free software; you can redistribute it and/or modify
                     11: # it under the terms of the GNU General Public License as published by
                     12: # the Free Software Foundation; either version 2 of the License, or
                     13: # (at your option) any later version.
                     14: #
                     15: # LON-CAPA is distributed in the hope that it will be useful,
                     16: # but WITHOUT ANY WARRANTY; without even the implied warranty of
                     17: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     18: # GNU General Public License for more details.
                     19: #
                     20: # You should have received a copy of the GNU General Public License
                     21: # along with LON-CAPA; if not, write to the Free Software
                     22: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
                     23: #
                     24: # /home/httpd/html/adm/gpl.txt
                     25: #
                     26: # http://www.lon-capa.org/
                     27: #
1.1       www        28: #
1.50      matthew    29: ###############################################################
1.82      www        30: ##############################################################
1.1       www        31: 
                     32: package Apache::londropadd;
                     33: 
                     34: use strict;
1.24      albertel   35: use Apache::lonnet();
                     36: use Apache::loncommon();
1.50      matthew    37: use Apache::lonhtmlcommon();
1.1       www        38: use Apache::Constants qw(:common :http REDIRECT);
1.60      matthew    39: use Spreadsheet::WriteExcel;
1.110     matthew    40: use Apache::lonstathelpers();
1.86      www        41: use Apache::lonlocal;
1.1       www        42: 
1.50      matthew    43: ###############################################################
                     44: ###############################################################
1.10      www        45: sub header {
1.102     matthew    46:     my $bodytag=&Apache::loncommon::bodytag('Enrollment Manager');
1.88      matthew    47:     my $title = &mt('LON-CAPA Enrollment Manager');
1.27      matthew    48:     return(<<ENDHEAD);
1.1       www        49: <html>
                     50: <head>
1.88      matthew    51: <title>$title</title>
1.1       www        52: </head>
1.46      www        53: $bodytag
1.40      matthew    54: <form method="post" enctype="multipart/form-data"  
                     55:       action="/adm/dropadd" name="studentform">
1.1       www        56: ENDHEAD
1.10      www        57: }
                     58: 
1.50      matthew    59: ###############################################################
                     60: ###############################################################
                     61: # Drop student from all sections of a course, except optional $csec
1.26      matthew    62: sub modifystudent {
1.33      matthew    63:     my ($udom,$unam,$courseid,$csec,$desiredhost)=@_;
1.26      matthew    64:     # if $csec is undefined, drop the student from all the courses matching
                     65:     # this one.  If $csec is defined, drop them from all other sections of 
                     66:     # this course and add them to section $csec
1.25      matthew    67:     $courseid=~s/\_/\//g;
                     68:     $courseid=~s/^(\w)/\/$1/;
1.26      matthew    69:     my %roles = &Apache::lonnet::dump('roles',$udom,$unam);
                     70:     my ($tmp) = keys(%roles);
                     71:     # Bail out if we were unable to get the students roles
1.35      matthew    72:     return "$1" if ($tmp =~ /^(con_lost|error|no_such_host)/i);
1.26      matthew    73:     # Go through the roles looking for enrollment in this course
1.35      matthew    74:     my $result = '';
1.26      matthew    75:     foreach my $course (keys(%roles)) {
1.35      matthew    76:         if ($course=~/^$courseid(?:\/)*(?:\s+)*(\w+)*\_st$/) {
1.26      matthew    77:             # We are in this course
1.25      matthew    78:             my $section=$1;
1.26      matthew    79:             $section='' if ($course eq $courseid.'_st');
1.87      matthew    80:             if (defined($csec) && $section eq $csec) {
1.71      matthew    81:                 $result .= 'ok:';
                     82:             } elsif ( ((!$section) && (!$csec)) || ($section ne $csec) ) {
1.27      matthew    83:                 my (undef,$end,$start)=split(/\_/,$roles{$course});
1.25      matthew    84:                 my $now=time;
1.50      matthew    85:                 # if this is an active role 
1.27      matthew    86:                 if (!($start && ($now<$start)) || !($end && ($now>$end))) {
1.25      matthew    87:                     my $reply=&Apache::lonnet::modifystudent
1.70      matthew    88:                         # dom  name  id mode pass     f     m     l     g
                     89:                         ($udom,$unam,'',  '',  '',undef,undef,undef,undef,
1.33      matthew    90:                          $section,time,undef,undef,$desiredhost);
1.35      matthew    91:                     $result .= $reply.':';
1.25      matthew    92:                 }
1.10      www        93:             }
                     94:         }
1.20      harris41   95:     }
1.35      matthew    96:     if ($result eq '') {
1.62      matthew    97:         $result = 'Unable to find section for this student';
1.37      matthew    98:     } else {
                     99:         $result =~ s/(ok:)+/ok/g;
1.35      matthew   100:     }
                    101:     return $result;
1.10      www       102: }
                    103: 
1.50      matthew   104: ###############################################################
                    105: ###############################################################
                    106: # build a domain and server selection form
1.31      matthew   107: sub domain_form {
                    108:     my ($defdom) = @_;
                    109:     # Set up domain and server selection forms
                    110:     #
                    111:     # Get the domains
                    112:     my @domains = &Apache::loncommon::get_domains();
                    113:     # build up the menu information to be passed to 
                    114:     # &Apache::loncommon::linked_select_forms
                    115:     my %select_menus;
                    116:     foreach my $dom (@domains) {
                    117:         # set up the text for this domain
                    118:         $select_menus{$dom}->{'text'}= $dom;
                    119:         # we want a choice of 'default' as the default in the second menu
                    120:         $select_menus{$dom}->{'default'}= 'default';
                    121:         $select_menus{$dom}->{'select2'}->{'default'} = 'default';
                    122:         # Now build up the other items in the second menu
1.45      matthew   123:         my %servers = &Apache::loncommon::get_library_servers($dom);
1.31      matthew   124:         foreach my $server (keys(%servers)) {
                    125:             $select_menus{$dom}->{'select2'}->{$server} 
                    126:                                             = "$server $servers{$server}";
                    127:         }
                    128:     }
                    129:     my $result  = &Apache::loncommon::linked_select_forms
                    130:         ('studentform',' with home server ',$defdom,
                    131:          'lcdomain','lcserver',\%select_menus);
                    132:     return $result;
                    133: }
                    134: 
1.50      matthew   135: ###############################################################
                    136: ###############################################################
                    137: #  Menu Phase One
                    138: sub print_main_menu {
1.10      www       139:     my $r=shift;
1.88      matthew   140:     my %Text = &Apache::lonlocal::texthash
                    141:         ('upload'    => 'Upload a class list',
                    142:          'enrollone' => 'Enroll a single student',
                    143:          'modify'    => 'Modify student data',
                    144:          'view'      => 'View Class List',
1.91      raeburn   145:          'drop'      => 'Drop Students',
                    146:          'populate'  => 'Automated Enrollment Manager');
1.98      www       147:     my %help=();
                    148:     foreach ('Course_Drop_Student','Course_Add_Student',
                    149: 	     'Course_Modify_Student_Data','Course_View_Class_List',
                    150: 	     'Course_Create_Class_List') {
                    151: 	$help{$_}=&Apache::loncommon::help_open_topic($_);
                    152:     }
1.88      matthew   153: 
1.48      matthew   154:     $r->print(<<END);
                    155: <p>
1.50      matthew   156: <font size="+1">
1.98      www       157: <a href="/adm/dropadd?action=upload">$Text{'upload'}</a>
                    158: </font>$help{'Course_Create_Class_List'}
1.50      matthew   159: </p><p>
                    160: <font size="+1">
1.88      matthew   161:     <a href="/adm/dropadd?action=enrollstudent">$Text{'enrollone'}</a>
1.98      www       162:     </font>$help{'Course_Add_Student'}
1.48      matthew   163: </p><p>
1.50      matthew   164: <font size="+1">
1.88      matthew   165:     <a href="/adm/dropadd?action=modifystudent">$Text{'modify'}</a>
1.98      www       166:     </font>$help{'Course_Modify_Student_Data'}
1.48      matthew   167: </p><p>
1.50      matthew   168: <font size="+1">
1.88      matthew   169:     <a href="/adm/dropadd?action=classlist">$Text{'view'}</a>
1.98      www       170:     </font>$help{'Course_View_Class_List'}
1.48      matthew   171: </p><p>
1.50      matthew   172: <font size="+1">
1.88      matthew   173:     <a href="/adm/dropadd?action=drop">$Text{'drop'}</a>
1.98      www       174:     </font>$help{'Course_Drop_Student'}
1.91      raeburn   175: </p><p>
1.113     raeburn   176: END
                    177:     my ($cdom,$cnum) = split/_/,$ENV{'request.course.id'};
                    178:     if (&Apache::lonnet::auto_run($cnum,$cdom) ) {
                    179:         $r->print(<<END);
1.91      raeburn   180: <font size="+1">
                    181:     <a href="/adm/populate">$Text{'populate'}</a>
                    182: </font>
1.48      matthew   183: END
1.113     raeburn   184:     }
1.10      www       185: }
                    186: 
1.50      matthew   187: ###############################################################
                    188: ###############################################################
1.89      matthew   189: sub hidden_input {
                    190:     my ($name,$value) = @_;
                    191:     return '<input type="hidden" name="'.$name.'" value="'.$value.'" />'."\n";
                    192: }
                    193: 
1.50      matthew   194: sub print_upload_manager_header {
1.23      albertel  195:     my ($r,$datatoken,$distotal,$krbdefdom)=@_;
1.24      albertel  196:     my $javascript;
1.99      matthew   197:     #
1.50      matthew   198:     if (! exists($ENV{'form.upfile_associate'})) {
                    199:         $ENV{'form.upfile_associate'} = 'forward';
                    200:     }
                    201:     if ($ENV{'form.associate'} eq 'Reverse Association') {
                    202:         if ( $ENV{'form.upfile_associate'} ne 'reverse' ) {
                    203:             $ENV{'form.upfile_associate'} = 'reverse';
                    204:         } else {
                    205:             $ENV{'form.upfile_associate'} = 'forward';
                    206:         }
                    207:     }
1.24      albertel  208:     if ($ENV{'form.upfile_associate'} eq 'reverse') {
1.50      matthew   209: 	$javascript=&upload_manager_javascript_reverse_associate();
1.24      albertel  210:     } else {
1.50      matthew   211: 	$javascript=&upload_manager_javascript_forward_associate();
1.24      albertel  212:     }
1.99      matthew   213:     #
                    214:     # Deal with restored settings
                    215:     my $password_choice = '';
                    216:     if (exists($ENV{'form.ipwd_choice'}) &&
                    217:         $ENV{'form.ipwd_choice'} ne '') {
                    218:         # If a column was specified for password, assume it is for an
                    219:         # internal password.  This is a bug waiting to be filed (could be
                    220:         # local or krb auth instead of internal) but I do not have the 
                    221:         # time to mess around with this now.
                    222:         $password_choice = 'int';        
                    223:     }
                    224:     #
                    225:     my $javascript_validations=&javascript_validations('auth',$krbdefdom,
                    226:                                     $password_choice);
1.82      www       227:     my $checked=(($ENV{'form.noFirstLine'})?' checked="1"':'');
1.88      matthew   228:     $r->print('<h3>'.&mt('Uploading Class List')."</h3>\n".
                    229:               "<hr>\n".
                    230:               '<h3>'.&mt('Identify fields')."</h3>\n");
                    231:     $r->print("<p>\n".
                    232:               &mt('Total number of records found in file: [_1].',$distotal).
                    233:               "\n".
                    234:               "</p><hr>\n");
1.94      sakharuk  235:     $r->print(&mt('Enter as many fields as you can. The system will inform you and bring you back to this page if the data selected is insufficient to enroll students in your class.')."<hr>\n");
1.89      matthew   236:     $r->print(&hidden_input('action','upload').
                    237:               &hidden_input('state','got_file').
                    238:               &hidden_input('associate','').
                    239:               &hidden_input('datatoken',$datatoken).
                    240:               &hidden_input('fileupload',$ENV{'form.fileupload'}).
                    241:               &hidden_input('upfiletype',$ENV{'form.upfiletype'}).
                    242:               &hidden_input('upfile_associate',$ENV{'form.upfile_associate'}));
                    243:     $r->print('<input type="button" value="Reverse Association" '.
                    244:               'name="'.&mt('Reverse Association').'" '.
                    245:               'onClick="javascript:this.form.associate.value=\'Reverse Association\';submit(this.form);" />');
                    246:     $r->print('<input type="checkbox" name="noFirstLine" $checked />'.
                    247:               &mt('Ignore First Line'));
                    248:     $r->print("<hr />\n".
                    249:               '<script type="text/javascript" language="Javascript">'."\n".
                    250:               $javascript."\n".$javascript_validations.'</script>');
1.24      albertel  251: }
                    252: 
1.50      matthew   253: ###############################################################
                    254: ###############################################################
1.24      albertel  255: sub javascript_validations {
1.96      raeburn   256:     my ($mode,$krbdefdom,$curr_authtype,$curr_authfield)=@_;
1.89      matthew   257:     my $authheader;
                    258:     if ($mode eq 'auth') {
                    259:         my %param = ( formname => 'studentform',
1.99      matthew   260:                       kerb_def_dom => $krbdefdom,
                    261:                       curr_authtype => $curr_authtype);
1.89      matthew   262:         $authheader = &Apache::loncommon::authform_header(%param);
1.91      raeburn   263:     } elsif ($mode eq 'createcourse') {
                    264:         my %param = ( formname => 'ccrs',
1.99      matthew   265:                   kerb_def_dom => $krbdefdom,
                    266:                       curr_authtype => $curr_authtype );
1.91      raeburn   267:         $authheader = &Apache::loncommon::authform_header(%param);
1.96      raeburn   268:     } elsif ($mode eq 'modifycourse') {
                    269:         my %param = ( formname => 'cmod',
                    270:                   kerb_def_dom => $krbdefdom,
                    271:                   mode => 'modifycourse',
                    272:                   curr_authtype => $curr_authtype,
                    273:                   curr_autharg => $curr_authfield );
                    274:         $authheader = &Apache::loncommon::authform_header(%param);
1.89      matthew   275:     }
1.96      raeburn   276: 
1.91      raeburn   277:     
1.89      matthew   278:     my %alert = &Apache::lonlocal::texthash
                    279:         (username => 'You need to specify the username field.',
                    280:          authen   => 'You must choose an authentication type.',
                    281:          krb      => 'You need to specify the Kerberos domain.',
                    282:          ipass    => 'You need to specify the initial password.',
                    283:          name     => 'The optional name field was not specified.',
                    284:          snum     => 'The optional student number field was not specified.',
                    285:          section  => 'The optional section or group field was not specified.', 
                    286:          email    => 'The optional email address field was not specified.',
                    287:          continue => 'Continue enrollment?',
                    288:          );
                    289:     
                    290: #    my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition();
                    291:     my $function_name =(<<END);
1.73      www       292: function verify_message (vf,founduname,foundpwd,foundname,foundid,foundsec,foundemail) {
1.89      matthew   293: END
1.97      raeburn   294:     my $auth_checks;
1.96      raeburn   295:     if ($mode eq 'createcourse') {
                    296:         $auth_checks .= (<<END);
1.97      raeburn   297:     if (vf.autoadds[0].checked == true) {
1.96      raeburn   298:         if (current.radiovalue == null || current.radiovalue == 'nochange') {
                    299:             alert('$alert{'authen'}');
                    300:             return;
                    301:         }
                    302:     }
                    303: END
                    304:     } else {
1.91      raeburn   305:         $auth_checks .= (<<END);
1.97      raeburn   306:     var foundatype=0;
1.3       www       307:     if (founduname==0) {
1.89      matthew   308: 	alert('$alert{'username'}');
1.3       www       309:         return;
                    310:     }
1.61      matthew   311:     // alert('current.radiovalue = '+current.radiovalue);
1.29      matthew   312:     if (current.radiovalue == null || current.radiovalue == 'nochange') {
1.28      matthew   313:         // They did not check any of the login radiobuttons.
1.89      matthew   314:         alert('$alert{'authen'}');
1.28      matthew   315:         return;
                    316:     }
1.96      raeburn   317: END
                    318:     }
1.97      raeburn   319:     if ($mode eq 'createcourse') {
                    320:         $auth_checks .= "
                    321:     if ( (vf.autoadds[0].checked == true) &&
                    322:          (vf.elements[current.argfield].value == null || vf.elements[current.argfield].value == '') ) {
                    323: ";
                    324:     } elsif ($mode eq 'modifycourse') {
                    325:         $auth_checks .= " 
                    326:     if (vf.elements[current.argfield].value == null || vf.elements[current.argfield].value == '') {
                    327: ";
                    328:     }
1.96      raeburn   329:     if ( ($mode eq 'createcourse') || ($mode eq 'modifycourse') ) {
1.97      raeburn   330:         $auth_checks .= (<<END);
                    331:         var alertmsg = '';
                    332:         switch (current.radiovalue) {
                    333:             case 'krb':
                    334:                 alertmsg = '$alert{'krb'}';
                    335:                 break;
                    336:             default:
                    337:                 alertmsg = '';
1.96      raeburn   338:         }
1.97      raeburn   339:         if (alertmsg != '') {
                    340:             alert(alertmsg);
                    341:             return;
1.96      raeburn   342:         }
                    343:     }
                    344: END
                    345:     } else {
                    346:         $auth_checks .= (<<END);
1.28      matthew   347:     foundatype=1;
1.29      matthew   348:     if (current.argfield == null || current.argfield == '') {
1.28      matthew   349:         var alertmsg = '';
1.29      matthew   350:         switch (current.value) {
1.28      matthew   351:             case 'krb': 
1.89      matthew   352:                 alertmsg = '$alert{'krb'}';
1.28      matthew   353:                 break;
                    354:             case 'loc':
                    355:             case 'fsys':
1.89      matthew   356:                 alertmsg = '$alert{'ipass'}';
1.28      matthew   357:                 break;
                    358:             case 'fsys':
                    359:                 alertmsg = '';
                    360:                 break;
                    361:             default: 
                    362:                 alertmsg = '';
1.3       www       363:         }
1.28      matthew   364:         if (alertmsg != '') {
                    365:             alert(alertmsg);
1.3       www       366:             return;
                    367:         }
                    368:     }
1.89      matthew   369: END
1.96      raeburn   370:     }
1.91      raeburn   371:     my $optional_checks = '';
1.96      raeburn   372:     if ( ($mode eq 'createcourse') || ($mode eq 'modifycourse') ) {
1.91      raeburn   373:         $optional_checks = (<<END);
                    374:     vf.submit();
                    375: }
                    376: END
                    377:     } else {
                    378:         $optional_checks = (<<END);
1.89      matthew   379:     var message='';
                    380:     if (foundname==0) { 
                    381:         message='$alert{'name'}';
1.24      albertel  382:     }
1.89      matthew   383:     if (foundid==0) { 
                    384:         if (message!='') { 
                    385:             message+='\\n'; 
                    386:         }
                    387:         message+='$alert{'snum'}';
                    388:     }
                    389:     if (foundsec==0) {
                    390:         if (message!='') {
                    391:             message+='\\n';
                    392:         } 
                    393:         message+='$alert{'section'}';
                    394:     }
                    395:     if (foundemail==0) {
                    396:         if (message!='') {
                    397:             message+='\\n';
                    398:         }
                    399:         message+='$alert{'email'}';
1.74      matthew   400:     }
                    401:     if (message!='') {
1.89      matthew   402:         message+= '\\n$alert{'continue'}';
                    403:         if (confirm(message)) {
                    404:             vf.state.value='enrolling';
                    405:             vf.submit();
                    406:         }
1.74      matthew   407:     } else {
1.89      matthew   408:         vf.state.value='enrolling';
                    409:         vf.submit();
1.74      matthew   410:     }
                    411: }
1.89      matthew   412: END
1.91      raeburn   413:     }
1.89      matthew   414:     my $result = $function_name;
1.96      raeburn   415:     if ( ($mode eq 'auth') || ($mode eq 'createcourse') || ($mode eq 'modifycourse')  ) {
1.89      matthew   416:         $result .= $auth_checks;
                    417:     }
                    418:     $result .= $optional_checks;
1.96      raeburn   419:     if ( ($mode eq 'auth') || ($mode eq 'createcourse') || ($mode eq 'modifycourse')  ) {
1.89      matthew   420:         $result .= $authheader;
                    421:     }
                    422:     return $result;
1.74      matthew   423: }
                    424: 
1.50      matthew   425: ###############################################################
                    426: ###############################################################
                    427: sub upload_manager_javascript_forward_associate {
1.24      albertel  428:     return(<<ENDPICK);
                    429: function verify(vf) {
                    430:     var founduname=0;
                    431:     var foundpwd=0;
                    432:     var foundname=0;
                    433:     var foundid=0;
                    434:     var foundsec=0;
1.73      www       435:     var foundemail=0;
1.24      albertel  436:     var tw;
                    437:     for (i=0;i<=vf.nfields.value;i++) {
                    438:         tw=eval('vf.f'+i+'.selectedIndex');
                    439:         if (tw==1) { founduname=1; }
                    440:         if ((tw>=2) && (tw<=6)) { foundname=1; }
                    441:         if (tw==7) { foundid=1; }
                    442:         if (tw==8) { foundsec=1; }
                    443:         if (tw==9) { foundpwd=1; }
1.73      www       444:         if (tw==10) { foundemail=1; }
1.24      albertel  445:     }
1.73      www       446:     verify_message(vf,founduname,foundpwd,foundname,foundid,foundsec,foundemail);
1.24      albertel  447: }
                    448: 
1.49      matthew   449: //
                    450: // vf = this.form
                    451: // tf = column number
                    452: //
                    453: // values of nw
                    454: //
                    455: // 0 = none
                    456: // 1 = username
                    457: // 2 = names (lastname, firstnames)
                    458: // 3 = fname (firstname)
                    459: // 4 = mname (middlename)
                    460: // 5 = lname (lastname)
                    461: // 6 = gen   (generation)
                    462: // 7 = id
                    463: // 8 = section
                    464: // 9 = ipwd  (password)
1.73      www       465: // 10 = email address
                    466: 
1.24      albertel  467: function flip(vf,tf) {
                    468:    var nw=eval('vf.f'+tf+'.selectedIndex');
                    469:    var i;
1.49      matthew   470:    // make sure no other columns are labeled the same as this one
1.24      albertel  471:    for (i=0;i<=vf.nfields.value;i++) {
                    472:       if ((i!=tf) && (eval('vf.f'+i+'.selectedIndex')==nw)) {
                    473:           eval('vf.f'+i+'.selectedIndex=0;')
                    474:       }
                    475:    }
1.49      matthew   476:    // If we set this to 'lastname, firstnames', clear out all the ones
                    477:    // set to 'fname','mname','lname','gen' (3,4,5,6) currently.
1.24      albertel  478:    if (nw==2) {
                    479:       for (i=0;i<=vf.nfields.value;i++) {
                    480:          if ((eval('vf.f'+i+'.selectedIndex')>=3) &&
                    481:              (eval('vf.f'+i+'.selectedIndex')<=6)) {
                    482:              eval('vf.f'+i+'.selectedIndex=0;')
                    483:          }
                    484:       }
                    485:    }
1.49      matthew   486:    // If we set this to one of 'fname','mname','lname','gen' (3,4,5,6),
                    487:    // clear out any that are set to 'lastname, firstnames' (2)
1.24      albertel  488:    if ((nw>=3) && (nw<=6)) {
                    489:       for (i=0;i<=vf.nfields.value;i++) {
                    490:          if (eval('vf.f'+i+'.selectedIndex')==2) {
                    491:              eval('vf.f'+i+'.selectedIndex=0;')
                    492:          }
                    493:       }
                    494:    }
1.49      matthew   495:    // If we set the password, make the password form below correspond to 
                    496:    // the new value.
1.24      albertel  497:    if (nw==9) {
1.28      matthew   498:        changed_radio('int',document.studentform);
                    499:        set_auth_radio_buttons('int',document.studentform);
                    500:        vf.intarg.value='';
                    501:        vf.krbarg.value='';
1.24      albertel  502:        vf.locarg.value='';
                    503:    }
                    504: }
                    505: 
                    506: function clearpwd(vf) {
                    507:     var i;
                    508:     for (i=0;i<=vf.nfields.value;i++) {
                    509:         if (eval('vf.f'+i+'.selectedIndex')==9) {
                    510:             eval('vf.f'+i+'.selectedIndex=0;')
                    511:         }
                    512:     }
                    513: }
                    514: 
                    515: ENDPICK
                    516: }
                    517: 
1.50      matthew   518: ###############################################################
                    519: ###############################################################
                    520: sub upload_manager_javascript_reverse_associate {
1.24      albertel  521:     return(<<ENDPICK);
                    522: function verify(vf) {
                    523:     var founduname=0;
                    524:     var foundpwd=0;
                    525:     var foundname=0;
                    526:     var foundid=0;
                    527:     var foundsec=0;
                    528:     var tw;
                    529:     for (i=0;i<=vf.nfields.value;i++) {
                    530:         tw=eval('vf.f'+i+'.selectedIndex');
                    531:         if (i==0 && tw!=0) { founduname=1; }
                    532:         if (((i>=1) && (i<=5)) && tw!=0 ) { foundname=1; }
                    533:         if (i==6 && tw!=0) { foundid=1; }
                    534:         if (i==7 && tw!=0) { foundsec=1; }
                    535:         if (i==8 && tw!=0) { foundpwd=1; }
                    536:     }
                    537:     verify_message(vf,founduname,foundpwd,foundname,foundid,foundsec);
                    538: }
                    539: 
                    540: function flip(vf,tf) {
                    541:    var nw=eval('vf.f'+tf+'.selectedIndex');
                    542:    var i;
                    543:    // picked the all one one name field, reset the other name ones to blank
                    544:    if (tf==1 && nw!=0) {
                    545:       for (i=2;i<=5;i++) {
                    546:          eval('vf.f'+i+'.selectedIndex=0;')
                    547:       }
                    548:    }
                    549:    //picked one of the piecewise name fields, reset the all in
                    550:    //one field to blank
                    551:    if ((tf>=2) && (tf<=5) && (nw!=0)) {
                    552:       eval('vf.f1.selectedIndex=0;')
                    553:    }
                    554:    // intial password specified, pick internal authentication
                    555:    if (tf==8 && nw!=0) {
1.28      matthew   556:        changed_radio('int',document.studentform);
                    557:        set_auth_radio_buttons('int',document.studentform);
                    558:        vf.krbarg.value='';
                    559:        vf.intarg.value='';
1.24      albertel  560:        vf.locarg.value='';
                    561:    }
                    562: }
                    563: 
                    564: function clearpwd(vf) {
                    565:     var i;
                    566:     if (eval('vf.f8.selectedIndex')!=0) {
                    567:         eval('vf.f8.selectedIndex=0;')
                    568:     }
                    569: }
1.2       www       570: ENDPICK
1.23      albertel  571: }
1.10      www       572: 
1.50      matthew   573: ###############################################################
                    574: ###############################################################
                    575: sub print_upload_manager_footer {
1.23      albertel  576:     my ($r,$i,$keyfields,$defdom,$today,$halfyear)=@_;
1.64      albertel  577: 
                    578:     my ($krbdef,$krbdefdom) =
                    579:         &Apache::loncommon::get_kerberos_defaults($defdom);
                    580:     my %param = ( formname => 'document.studentform',
                    581:                   kerb_def_dom => $krbdefdom,
                    582:                   kerb_def_auth => $krbdef
                    583:                   );
1.99      matthew   584:     if (exists($ENV{'form.ipwd_choice'}) &&
                    585:         defined($ENV{'form.ipwd_choice'}) &&
                    586:         $ENV{'form.ipwd_choice'} ne '') {
                    587:         $param{'curr_authtype'} = 'int';
                    588:     }
1.28      matthew   589:     my $krbform = &Apache::loncommon::authform_kerberos(%param);
                    590:     my $intform = &Apache::loncommon::authform_internal(%param);
                    591:     my $locform = &Apache::loncommon::authform_local(%param);
1.31      matthew   592:     my $domform = &domain_form($defdom);
1.68      matthew   593:     my $date_table = &date_setting_table();
1.90      matthew   594:     my $Str = "</table>\n";
                    595:     $Str .= &hidden_input('nfields',$i);
                    596:     $Str .= &hidden_input('keyfields',$keyfields);
                    597:     $Str .= '<h3>'.&mt('Login Type')."</h3>\n";
                    598:     $Str .= "<p>\n".
                    599:         &mt('Note: this will not take effect if the user already exists').
                    600:         "</p><p>\n";
                    601:     $Str .= $krbform."\n</p><p>\n".
                    602:         $intform."\n</p><p>\n".
                    603:         $locform."\n</p>\n";
                    604:     $Str .= '<h3>'.&mt('LON-CAPA Domain for Students')."</h3>\n";
                    605:     $Str .= "<p>\n".&mt('LON-CAPA domain: [_1]',$domform)."\n</p>\n";
                    606:     $Str .= "<h3>".&mt('Starting and Ending Dates')."</h3>\n";
                    607:     $Str .= "<p>\n".$date_table."</p>\n";
                    608:     $Str .= "<h3>".&mt('Full Update')."</h3>\n";
                    609:     $Str .= '<input type="checkbox" name="fullup" value="yes">'.
                    610:         ' '.&mt('Full update (also print list of users not enrolled anymore)').
                    611:         "</p>\n";
                    612:     $Str .= "<h3>".&mt('Student Number')."</h3>\n";
                    613:     $Str .= "<p>\n".'<input type="checkbox" name="forceid" value="yes">';
                    614:     $Str .= &mt('Disable ID/Student Number Safeguard and Force Change '.
                    615:                 'of Conflicting IDs (only do if you know what you are doing)').
                    616:                 "\n</p><p>\n";
                    617:     $Str .= '<input type="button" onClick="javascript:verify(this.form)" '.
1.95      albertel  618:         'value="Update Class List" />'."<br />\n";
1.90      matthew   619:     $Str .= &mt('Note: for large courses, this operation may be time '.
                    620:                 'consuming');
                    621:     $r->print($Str);
                    622:     return;
1.23      albertel  623: }
1.24      albertel  624: 
1.90      matthew   625: ###############################################################
                    626: ###############################################################
1.50      matthew   627: sub print_upload_manager_form {
1.23      albertel  628:     my $r=shift;
1.99      matthew   629: 
1.82      www       630:     my $firstLine;
1.24      albertel  631:     my $datatoken;
                    632:     if (!$ENV{'form.datatoken'}) {
1.90      matthew   633:         $datatoken=&Apache::loncommon::upfile_store($r);
1.24      albertel  634:     } else {
1.90      matthew   635:         $datatoken=$ENV{'form.datatoken'};
                    636:         &Apache::loncommon::load_tmp_file($r);
1.24      albertel  637:     }
                    638:     my @records=&Apache::loncommon::upfile_record_sep();
1.90      matthew   639:     if($ENV{'form.noFirstLine'}){
                    640:         $firstLine=shift(@records);
                    641:     }
1.23      albertel  642:     my $total=$#records;
                    643:     my $distotal=$total+1;
                    644:     my $today=time;
                    645:     my $halfyear=$today+15552000;
1.99      matthew   646:     #
                    647:     # Restore memorized settings
                    648:     &Apache::loncommon::restore_course_settings
                    649:         ('enrollment_upload',{ 'username_choice' => 'scalar', # column settings
                    650:                                'names_choice' => 'scalar',
                    651:                                'fname_choice' => 'scalar',
                    652:                                'mname_choice' => 'scalar',
                    653:                                'lname_choice' => 'scalar',
                    654:                                'gen_choice' => 'scalar',
                    655:                                'id_choice' => 'scalar',
                    656:                                'sec_choice' => 'scalar',
                    657:                                'ipwd_choice' => 'scalar',
                    658:                                'email_choice' => 'scalar',
                    659:                            });
                    660:     #
                    661:     # Determine kerberos parameters as appropriate
1.85      matthew   662:     my $defdom=$ENV{'course.'.$ENV{'request.course.id'}.'.domain'};
1.64      albertel  663:     my ($krbdef,$krbdefdom) =
                    664:         &Apache::loncommon::get_kerberos_defaults($defdom);
1.99      matthew   665:     #
1.50      matthew   666:     &print_upload_manager_header($r,$datatoken,$distotal,$krbdefdom);
1.24      albertel  667:     my $i;
                    668:     my $keyfields;
1.23      albertel  669:     if ($total>=0) {
1.99      matthew   670:         my @field=
                    671:             (['username',&mt('Username'),     $ENV{'form.username_choice'}],
                    672:              ['names',&mt('Last Name, First Names'),$ENV{'form.names_choice'}],
                    673:              ['fname',&mt('First Name'),      $ENV{'form.fname_choice'}],
                    674:              ['mname',&mt('Middle Names/Initials'),$ENV{'form.mname_choice'}],
                    675:              ['lname',&mt('Last Name'),       $ENV{'form.lname_choice'}],
                    676:              ['gen',  &mt('Generation'),      $ENV{'form.gen_choice'}],
                    677:              ['id',   &mt('ID/Student Number'),$ENV{'form.id_choice'}],
                    678:              ['sec',  &mt('Group/Section'),   $ENV{'form.sec_choice'}],
                    679:              ['ipwd', &mt('Initial Password'),$ENV{'form.ipwd_choice'}],
                    680:              ['email',&mt('EMail Address'),   $ENV{'form.email_choice'}]);
1.24      albertel  681: 	if ($ENV{'form.upfile_associate'} eq 'reverse') {	
                    682: 	    &Apache::loncommon::csv_print_samples($r,\@records);
1.90      matthew   683: 	    $i=&Apache::loncommon::csv_print_select_table($r,\@records,
                    684:                                                           \@field);
                    685: 	    foreach (@field) { 
                    686:                 $keyfields.=$_->[0].','; 
                    687:             }
1.24      albertel  688: 	    chop($keyfields);
                    689: 	} else {
1.90      matthew   690: 	    unshift(@field,['none','']);
                    691: 	    $i=&Apache::loncommon::csv_samples_select_table($r,\@records,
                    692:                                                             \@field);
1.24      albertel  693: 	    my %sone=&Apache::loncommon::record_sep($records[0]);
                    694: 	    $keyfields=join(',',sort(keys(%sone)));
1.23      albertel  695: 	}
                    696:     }
1.50      matthew   697:     &print_upload_manager_footer($r,$i,$keyfields,$defdom,$today,$halfyear);
1.10      www       698: }
                    699: 
1.90      matthew   700: ###############################################################
                    701: ###############################################################
1.12      www       702: sub enroll_single_student {
                    703:     my $r=shift;
1.80      matthew   704:     # Remove non alphanumeric values from section
                    705:     $ENV{'form.csec'}=~s/\W//g;
1.68      matthew   706:     #
                    707:     # We do the dates first because the action of making them the defaul
1.107     www       708:     # in the course is entirely separate from the action of enrolling the
1.68      matthew   709:     # student.  Also, a failure in setting the dates as default is not fatal
                    710:     # to the process of enrolling / modifying a student.
                    711:     my ($startdate,$enddate) = &get_dates_from_form();
                    712:     if ($ENV{'form.makedatesdefault'}) {
                    713:         $r->print(&make_dates_default($startdate,$enddate));
                    714:     }
                    715: 
1.94      sakharuk  716:     $r->print('<h3>'.&mt('Enrolling Student').'</h3>');
                    717:     $r->print('<p>'.&mt('Enrolling').' '.$ENV{'form.cuname'}." \@ ".
1.34      matthew   718:               $ENV{'form.lcdomain'}.'</p>');
1.12      www       719:     if (($ENV{'form.cuname'})&&($ENV{'form.cuname'}!~/\W/)&&
1.31      matthew   720:         ($ENV{'form.lcdomain'})&&($ENV{'form.lcdomain'}!~/\W/)) {
                    721:         # Deal with home server selection
                    722:         my $domain=$ENV{'form.lcdomain'};
                    723:         my $desiredhost = $ENV{'form.lcserver'};
                    724:         if (lc($desiredhost) eq 'default') {
                    725:             $desiredhost = undef;
                    726:         } else {
1.45      matthew   727:             my %home_servers =&Apache::loncommon::get_library_servers($domain);
1.31      matthew   728:             if (! exists($home_servers{$desiredhost})) {
1.94      sakharuk  729:                 $r->print('<font color="#ff0000">'.&mt('Error').':</font>'.
                    730:                           &mt('Invalid home server specified'));
1.31      matthew   731:                 return;
                    732:             }
                    733:         }
1.94      sakharuk  734:         $r->print(" ".&mt('with server')." $desiredhost :") if (defined($desiredhost));
1.31      matthew   735:         # End of home server selection logic
1.12      www       736: 	my $amode='';
                    737:         my $genpwd='';
                    738:         if ($ENV{'form.login'} eq 'krb') {
1.47      albertel  739:            $amode='krb';
                    740: 	   $amode.=$ENV{'form.krbver'};
1.28      matthew   741:            $genpwd=$ENV{'form.krbarg'};
1.12      www       742:         } elsif ($ENV{'form.login'} eq 'int') {
1.26      matthew   743:            $amode='internal';
1.28      matthew   744:            $genpwd=$ENV{'form.intarg'};
1.15      albertel  745:         }  elsif ($ENV{'form.login'} eq 'loc') {
                    746: 	    $amode='localauth';
                    747: 	    $genpwd=$ENV{'form.locarg'};
                    748: 	    if (!$genpwd) { $genpwd=" "; }
                    749: 	}
1.34      matthew   750:         my $home = &Apache::lonnet::homeserver($ENV{'form.cuname'},
                    751:                                                    $ENV{'form.lcdomain'});
                    752:         if ((($amode) && ($genpwd)) || ($home ne 'no_host')) {
1.55      matthew   753:             # Clean out any old roles the student has in this class.
1.33      matthew   754:             &modifystudent($ENV{'form.lcdomain'},$ENV{'form.cuname'},
                    755:                            $ENV{'request.course.id'},$ENV{'form.csec'},
                    756:                             $desiredhost);
1.55      matthew   757:             my $login_result = &Apache::lonnet::modifystudent
                    758:                 ($ENV{'form.lcdomain'},$ENV{'form.cuname'},
                    759:                  $ENV{'form.cstid'},$amode,$genpwd,
                    760:                  $ENV{'form.cfirst'},$ENV{'form.cmiddle'},
                    761:                  $ENV{'form.clast'},$ENV{'form.cgen'},
1.67      matthew   762:                  $ENV{'form.csec'},$enddate,
                    763:                  $startdate,$ENV{'form.forceid'},
1.55      matthew   764:                  $desiredhost);
                    765:             if ($login_result =~ /^ok/) {
                    766:                 $r->print($login_result);
1.94      sakharuk  767:                 $r->print("<p> ".&mt('If active, the new role will be available when the student next logs in to LON-CAPA.')."</p>");
1.55      matthew   768:             } else {
1.94      sakharuk  769:                 $r->print(&mt('unable to enroll').": ".$login_result);
1.55      matthew   770:             }
1.12      www       771: 	} else {
1.94      sakharuk  772:             $r->print('<p><font color="#ff0000">'.&mt('ERROR').'</font>&nbsp;');
1.79      matthew   773:             if ($amode =~ /^krb/) {
1.94      sakharuk  774:                 $r->print(&mt('Missing Kerberos domain information.').'  ');
1.79      matthew   775:             } else {
1.94      sakharuk  776:                 $r->print(&mt('Invalid login mode or password.').'  ');
1.79      matthew   777:             }
1.94      sakharuk  778:             $r->print('<b>'.&mt('Unable to enroll').' '.$ENV{'form.cuname'}.'.</b></p>');
1.79      matthew   779:         }
1.12      www       780:     } else {
1.94      sakharuk  781:         $r->print(&mt('Invalid username or domain'));
1.26      matthew   782:     }    
1.12      www       783: }
                    784: 
1.68      matthew   785: sub setup_date_selectors {
1.91      raeburn   786:     my ($starttime,$endtime,$mode) = @_;
1.68      matthew   787:     if (! defined($starttime)) {
                    788:         $starttime = time;
1.114     raeburn   789:         unless ($mode eq 'create_enrolldates' || $mode eq 'create_defaultdates') {
1.91      raeburn   790:             if (exists($ENV{'course.'.$ENV{'request.course.id'}.
1.68      matthew   791:                             '.default_enrollment_start_date'})) {
1.91      raeburn   792:                 $starttime = $ENV{'course.'.$ENV{'request.course.id'}.
1.68      matthew   793:                                   '.default_enrollment_start_date'};
1.91      raeburn   794:             }
1.68      matthew   795:         }
                    796:     }
                    797:     if (! defined($endtime)) {
                    798:         $endtime = time+(6*30*24*60*60); # 6 months from now, approx
1.91      raeburn   799:         unless ($mode eq 'createcourse') {
                    800:             if (exists($ENV{'course.'.$ENV{'request.course.id'}.
1.68      matthew   801:                             '.default_enrollment_end_date'})) {
1.91      raeburn   802:                 $endtime = $ENV{'course.'.$ENV{'request.course.id'}.
1.68      matthew   803:                                 '.default_enrollment_end_date'};
1.91      raeburn   804:             }
1.68      matthew   805:         }
                    806:     }
                    807:     my $startdateform = &Apache::lonhtmlcommon::date_setter('studentform',
                    808:                                                             'startdate',
                    809:                                                             $starttime);
                    810:     my $enddateform = &Apache::lonhtmlcommon::date_setter('studentform',
                    811:                                                           'enddate',
                    812:                                                           $endtime);
1.114     raeburn   813:     if ($mode eq 'create_enrolldates') {
                    814:         $startdateform = &Apache::lonhtmlcommon::date_setter('ccrs',
                    815:                                                             'startenroll',
                    816:                                                             $starttime);
                    817:         $enddateform = &Apache::lonhtmlcommon::date_setter('ccrs',
                    818:                                                           'endenroll',
                    819:                                                           $endtime);
                    820:     }
                    821:     if ($mode eq 'create_defaultdates') {
1.91      raeburn   822:         $startdateform = &Apache::lonhtmlcommon::date_setter('ccrs',
1.114     raeburn   823:                                                             'startaccess',
1.91      raeburn   824:                                                             $starttime);
                    825:         $enddateform = &Apache::lonhtmlcommon::date_setter('ccrs',
1.114     raeburn   826:                                                           'endaccess',
1.91      raeburn   827:                                                           $endtime);
                    828:     }
1.68      matthew   829:     return ($startdateform,$enddateform);
                    830: }
                    831: 
                    832: sub get_dates_from_form {
                    833:     my $startdate = &Apache::lonhtmlcommon::get_date_from_form('startdate');
                    834:     my $enddate   = &Apache::lonhtmlcommon::get_date_from_form('enddate');
                    835:     if ($ENV{'form.no_end_date'}) {
                    836:         $enddate = 0;
                    837:     }
                    838:     return ($startdate,$enddate);
                    839: }
                    840: 
                    841: sub date_setting_table {
1.91      raeburn   842:     my ($starttime,$endtime,$mode) = @_;
                    843:     my ($startform,$endform)=&setup_date_selectors($starttime,$endtime,$mode);
1.68      matthew   844:     my $dateDefault = '<nobr>'.
1.94      sakharuk  845:         '<input type="checkbox" name="makedatesdefault" /> '.
                    846:         &mt('make these dates the default for future enrollment');
1.114     raeburn   847:     if ($mode eq 'create_enrolldates' || $mode eq 'create_defaultdates') {
1.91      raeburn   848:         $dateDefault = '&nbsp;';
                    849:     }
1.68      matthew   850:     my $perpetual = '<nobr><input type="checkbox" name="no_end_date"';
                    851:     if (defined($endtime) && $endtime == 0) {
                    852:         $perpetual .= ' checked';
                    853:     }
1.94      sakharuk  854:     $perpetual.= ' /> '.&mt('no ending date').'</nobr>';
1.114     raeburn   855:     if ($mode eq 'create_enrolldates') {
                    856:         $perpetual = '&nbsp;';
                    857:     }
1.68      matthew   858:     my $result = '';
                    859:     $result .= "<table>\n";
1.94      sakharuk  860:     $result .= '<tr><td align="right">'.&mt('Starting Date').'</td>'.
1.68      matthew   861:         '<td>'.$startform.'</td>'.
                    862:         '<td>'.$dateDefault.'</td>'."</tr>\n";
1.94      sakharuk  863:     $result .= '<tr><td align="right">'.&mt('Ending Date').'</td>'.
1.68      matthew   864:         '<td>'.$endform.'</td>'.
                    865:         '<td>'.$perpetual.'</td>'."</tr>\n";
                    866:     $result .= "</table>\n";
                    867:     return $result;
                    868: }
                    869: 
                    870: sub make_dates_default {
                    871:     my ($startdate,$enddate) = @_;
                    872:     my $result = '';
                    873:     my $dom = $ENV{'course.'.$ENV{'request.course.id'}.'.domain'};
                    874:     my $crs = $ENV{'course.'.$ENV{'request.course.id'}.'.num'};
                    875:     my $put_result = &Apache::lonnet::put('environment',
                    876:             {'default_enrollment_start_date'=>$startdate,
                    877:              'default_enrollment_end_date'  =>$enddate},$dom,$crs);
                    878:     if ($put_result eq 'ok') {
                    879:         $result .= "Set default start and end dates for course<br />";
1.69      matthew   880:         #
                    881:         # Refresh the course environment
                    882:         &Apache::lonnet::coursedescription($ENV{'request.course.id'});
1.68      matthew   883:     } else {
1.94      sakharuk  884:         $result .= &mt('Unable to set default dates for course').":".$put_result.
1.68      matthew   885:             '<br />';
                    886:     }
                    887:     return $result;
                    888: }
                    889: 
1.74      matthew   890: ##
                    891: ## Single student enrollment routines (some of them)
                    892: ##
                    893: sub get_student_username_domain_form {
                    894:     my $r = shift;
                    895:     my $domform = &Apache::loncommon::select_dom_form
1.85      matthew   896:         ($ENV{'course.'.$ENV{'request.course.id'}.'.domain'},'cudomain',0);
1.94      sakharuk  897:     my %lt=&Apache::lonlocal::texthash(
                    898: 		    'eos'  => "Enroll One Student",
                    899: 		    'usr'  => "Username",
                    900:                     'dom'  => "Domain",
                    901:                     'been' => "Begin Enrollment",
                    902: 				       );
1.74      matthew   903:     $r->print(<<END);
                    904: <input type="hidden" name="action" value="enrollstudent" />
                    905: <input type="hidden" name="state"  value="gotusername" />
1.94      sakharuk  906: <h3>$lt{'eos'}</h3>
1.74      matthew   907: <table>
1.94      sakharuk  908: <tr><th>$lt{'usr'}:</th>
1.74      matthew   909:     <td><input type="text" name="cuname"  size="15" /></td></tr>
1.94      sakharuk  910: <tr><th>$lt{'dom'}:</th>
1.74      matthew   911:     <td>$domform</td></tr>
                    912: <tr><th>&nbsp;</th>
                    913:     <td>
1.94      sakharuk  914:     <input type="submit" name="Begin Enrollment" value="$lt{'been'}" />
1.74      matthew   915:     </td></tr>
                    916: </table>
                    917: END
                    918:     return;
                    919: }
                    920: 
1.50      matthew   921: sub print_enroll_single_student_form {
1.10      www       922:     my $r=shift;
1.94      sakharuk  923:     $r->print("<h3>".&mt('Enroll One Student')."</h3>");
1.74      matthew   924:     #
                    925:     my $username = $ENV{'form.cuname'};
                    926:     my $domain   = $ENV{'form.cudomain'};
                    927:     my $home = &Apache::lonnet::homeserver($username,$domain);
                    928:     # $new_user flags whether we are creating a new user or using an old one
                    929:     my $new_user = 1;
                    930:     if ($home ne 'no_host') {
                    931:         $new_user = 0;
                    932:     }
                    933:     #
                    934:     my $user_data_html = '';
                    935:     my $javascript_validations = '';
                    936:     if ($new_user) {
1.85      matthew   937:         my $defdom=$ENV{'course.'.$ENV{'request.course.id'}.'.domain'};
1.74      matthew   938:         # Set up authentication forms
                    939:         my ($krbdef,$krbdefdom) =
1.75      matthew   940:             &Apache::loncommon::get_kerberos_defaults($domain);
1.89      matthew   941:         $javascript_validations=&javascript_validations('auth',$krbdefdom);
1.74      matthew   942:         my %param = ( formname => 'document.studentform',
                    943:                       kerb_def_dom => $krbdefdom,
                    944:                       kerb_def_auth => $krbdef
                    945:                       );
                    946:         my $krbform = &Apache::loncommon::authform_kerberos(%param);
                    947:         my $intform = &Apache::loncommon::authform_internal(%param);
                    948:         my $locform = &Apache::loncommon::authform_local(%param);
                    949:         #
                    950:         # Set up domain selection form
                    951:         my $homeserver_form = '';
                    952:         my %servers = &Apache::loncommon::get_library_servers($domain);
                    953:         $homeserver_form = '<select name="lcserver" size="1">'."\n".
                    954:             '<option value="default" selected>default</option>'."\n";
                    955:         while (my ($servername,$serverdescription) = each (%servers)) {
                    956:             $homeserver_form .= '<option value="'.$servername.'">'.
                    957:                 $serverdescription."</option>\n";
                    958:         }
                    959:         $homeserver_form .= "</select>\n";
                    960:         #
                    961:         #
1.94      sakharuk  962: 	my %lt=&Apache::lonlocal::texthash(
                    963: 		       'udf'  => "User Data for",
                    964:                        'fn'   => "First Name",
                    965:                        'mn'   => "Middle Name",
                    966:                        'ln'   => "Last Name",
                    967:                        'gen'  => "Generation",
                    968:                        'hs'   => "Home Server",
                    969:                        'pswd' => "Password",
                    970: 		       'psam' => "Please select an authentication mechanism",
                    971: 					   );
1.74      matthew   972:         $user_data_html = <<END;
1.94      sakharuk  973: <h3>$lt{'udf'} $username\@$domain</h3>
1.74      matthew   974: <table>
1.94      sakharuk  975: <tr><th>$lt{'fn'}:</th>
1.74      matthew   976:     <td><input type="text" name="cfirst"  size="15"></td></tr>
1.94      sakharuk  977: <tr><th>$lt{'mn'}:</th>
1.74      matthew   978:     <td><input type="text" name="cmiddle" size="15"></td></tr>
1.94      sakharuk  979: <tr><th>$lt{'ln'}:</th>
1.74      matthew   980:     <td><input type="text" name="clast"   size="15"></td></tr>
1.94      sakharuk  981: <tr><th>$lt{'gen'}:</th>
1.74      matthew   982:     <td><input type="text" name="cgen"    size="5"> </td></tr>
1.94      sakharuk  983: <tr><th>$lt{'hs'}:</th>
1.74      matthew   984:     <td>$homeserver_form</td></tr>
                    985: </table>
1.94      sakharuk  986: <h3>$lt{'pswd'}</h3>
                    987: $lt{'psam'}
1.74      matthew   988: <table>
                    989: <p>
                    990: $krbform
1.75      matthew   991: <br />
1.74      matthew   992: $intform
1.75      matthew   993: <br />
1.74      matthew   994: $locform
                    995: </p>
                    996: END
                    997:     } else {
                    998:         # User already exists.  Do not worry about authentication
                    999:         my %uenv = &Apache::lonnet::dump('environment',$domain,$username);
1.89      matthew  1000:         $javascript_validations = &javascript_validations('noauth');
1.94      sakharuk 1001: 	my %lt=&Apache::lonlocal::texthash(
                   1002: 		       'udf'  => "User Data for",
                   1003:                        'fn'   => "First Name",
                   1004:                        'mn'   => "Middle Name",
                   1005:                        'ln'   => "Last Name",
                   1006:                        'gen'  => "Generation",
                   1007: 					   );
1.74      matthew  1008:         $user_data_html = <<END;
1.94      sakharuk 1009: <h3>$lt{'udf'} $username\@$domain</h3>
1.74      matthew  1010: <input type="hidden" name="lcserver" value="default" />
                   1011: <table>
1.94      sakharuk 1012: <tr><th>$lt{'fn'}:</th>
1.74      matthew  1013:     <td>
                   1014:     <input type="text" name="cfirst" value="$uenv{'firstname'}" size="15" />
                   1015:     </td></tr>
1.94      sakharuk 1016: <tr><th>$lt{'mn'}:</th>
1.74      matthew  1017:     <td>
                   1018:     <input type="text" name="cmiddle" value="$uenv{'middlename'}" size="15" />
                   1019:     </td></tr>
1.94      sakharuk 1020: <tr><th>$lt{'ln'}:</th>
1.74      matthew  1021:     <td>
                   1022:     <input type="text" name="clast"value="$uenv{'lastname'}" size="15" />
                   1023:     </td></tr>
1.94      sakharuk 1024: <tr><th>$lt{'gen'}:</th>
1.74      matthew  1025:     <td>
                   1026:     <input type="text" name="cgen" value="$uenv{'generation'}" size="5" />
                   1027:     </td></tr>
                   1028: </table>
                   1029: END
                   1030:     }
1.68      matthew  1031:     my $date_table = &date_setting_table();
1.74      matthew  1032:         # Print it all out
1.94      sakharuk 1033:     my %lt=&Apache::lonlocal::texthash(
                   1034: 		   'cd'   => "Course Data",
                   1035:                    'gs'   => "Group/Section",
                   1036:                    'idsn' => "ID/Student Number",
                   1037:                    'disn' => "Disable ID/Student Number Safeguard and Force Change of Conflicting IDs (only do if you know what you are doing)",
                   1038:                    'eas'  => "Enroll as student",
                   1039: 				       );
1.50      matthew  1040:     $r->print(<<END);
1.74      matthew  1041: <input type="hidden" name="action" value="enrollstudent" />
                   1042: <input type="hidden" name="state"  value="done" />
                   1043: <input type="hidden" name="cuname" value="$username" />
                   1044: <input type="hidden" name="lcdomain" value="$domain" />
1.28      matthew  1045: <script type="text/javascript" language="Javascript">
1.12      www      1046: function verify(vf) {
                   1047:     var founduname=0;
                   1048:     var foundpwd=0;
                   1049:     var foundname=0;
                   1050:     var foundid=0;
                   1051:     var foundsec=0;
                   1052:     var tw;
1.26      matthew  1053:     if ((typeof(vf.cuname.value) !="undefined") && (vf.cuname.value!='') && 
1.31      matthew  1054: 	(typeof(vf.lcdomain.value)!="undefined") && (vf.lcdomain.value!='')) {
1.12      www      1055:         founduname=1;
                   1056:     }
1.14      harris41 1057:     if ((typeof(vf.cfirst.value)!="undefined") && (vf.cfirst.value!='') &&
1.26      matthew  1058: 	(typeof(vf.clast.value) !="undefined") && (vf.clast.value!='')) {
1.12      www      1059:         foundname=1;
                   1060:     }
1.14      harris41 1061:     if ((typeof(vf.csec.value)!="undefined") && (vf.csec.value!='')) {
1.12      www      1062:         foundsec=1;
                   1063:     }
1.14      harris41 1064:     if ((typeof(vf.cstid.value)!="undefined") && (vf.cstid.value!='')) {
1.12      www      1065: 	foundid=1;
                   1066:     }
                   1067:     if (founduname==0) {
                   1068: 	alert('You need to specify at least the username and domain fields');
                   1069:         return;
                   1070:     }
1.24      albertel 1071:     verify_message(vf,founduname,foundpwd,foundname,foundid,foundsec);
1.12      www      1072: }
                   1073: 
1.24      albertel 1074: $javascript_validations
1.12      www      1075: 
1.24      albertel 1076: function clearpwd(vf) {
                   1077:     //nothing else needs clearing
1.15      albertel 1078: }
                   1079: 
1.12      www      1080: </script>
1.11      www      1081: 
1.74      matthew  1082: $user_data_html
1.50      matthew  1083: 
1.94      sakharuk 1084: <h3>$lt{'cd'}</h3>
1.50      matthew  1085: 
1.94      sakharuk 1086: <p>$lt{'gs'}: <input type="text" name="csec" size="5" />
1.50      matthew  1087: <p>
1.68      matthew  1088: $date_table
1.50      matthew  1089: </p>
1.94      sakharuk 1090: <h3>$lt{'idsn'}</h3>
1.50      matthew  1091: <p>
1.94      sakharuk 1092: $lt{'idsn'}: <input type="text" name="cstid" size="10">
1.26      matthew  1093: </p><p>
                   1094: <input type="checkbox" name="forceid" value="yes"> 
1.94      sakharuk 1095: $lt{'disn'}
1.50      matthew  1096: </p><p>
1.94      sakharuk 1097: <input type="button" onClick="verify(this.form)" value="$lt{'eas'}">
1.26      matthew  1098: </p>
1.50      matthew  1099: END
                   1100:     return;
1.10      www      1101: }
                   1102: 
                   1103: # ========================================================= Menu Phase Two Drop
1.51      matthew  1104: sub print_drop_menu {
1.10      www      1105:     my $r=shift;
1.92      sakharuk 1106:     $r->print("<h3>".&mt('Drop Students')."</h3>");
1.11      www      1107:     my $cid=$ENV{'request.course.id'};
1.56      matthew  1108:     my ($classlist,$keylist) = &Apache::loncoursedata::get_classlist();
                   1109:     if (! defined($classlist)) {
1.94      sakharuk 1110:         $r->print(&mt('There are no students currently enrolled.')."\n");
1.51      matthew  1111:         return;
1.25      matthew  1112:     }
1.51      matthew  1113:     # Print out the available choices
1.56      matthew  1114:     &show_drop_list($r,$classlist,$keylist);
1.51      matthew  1115:     return;
1.11      www      1116: }
                   1117: 
1.40      matthew  1118: # ============================================== view classlist
1.50      matthew  1119: sub print_html_classlist {
1.103     matthew  1120:     my ($r,$mode) = @_;
1.57      matthew  1121:     if (! exists($ENV{'form.sortby'})) {
                   1122:         $ENV{'form.sortby'} = 'username';
                   1123:     }
1.59      matthew  1124:     if ($ENV{'form.Status'} !~ /^(Any|Expired|Active)$/) {
1.57      matthew  1125:         $ENV{'form.Status'} = 'Active';
                   1126:     }
                   1127:     my $status_select = &Apache::lonhtmlcommon::StatusOptions
1.103     matthew  1128:         ($ENV{'form.Status'});
1.100     www      1129:     my $cid=$ENV{'request.course.id'};
                   1130:     my $cdom=$ENV{'course.'.$cid.'.domain'};
                   1131:     my $cnum=$ENV{'course.'.$cid.'.num'};
1.103     matthew  1132:     #
                   1133:     # List course personnel
1.100     www      1134:     my %coursepersonnel=&Apache::lonnet::get_course_adv_roles($cdom.'/'.$cnum);
1.110     matthew  1135:     #
                   1136:     if (! defined($ENV{'form.output'}) ||
                   1137:         $ENV{'form.output'} !~ /^(csv|excel|html)$/ ) {
                   1138:         $ENV{'form.output'} = 'html';
                   1139:     }
                   1140:     #
1.103     matthew  1141:     $r->print('<br /><table border="2">');
1.110     matthew  1142:     foreach my $role (sort keys %coursepersonnel) {
                   1143:         next if ($role =~ /^\s*$/);
                   1144: 	$r->print('<tr><td>'.$role.'</td><td>');
                   1145:         foreach my $user (split(',',$coursepersonnel{$role})) {
                   1146: 	    my ($puname,$pudom)=split(':',$user);
1.100     www      1147: 	    $r->print(' '.&Apache::loncommon::aboutmewrapper(
1.110     matthew  1148:                                     &Apache::loncommon::plainname($puname,
                   1149:                                                                   $pudom),
                   1150:                                                              $puname,$pudom));
1.100     www      1151: 	}
                   1152:         $r->print('</td></tr>');
                   1153:     }
                   1154:     $r->print('</table>');
1.103     matthew  1155:     #
                   1156:     # Interface output
                   1157:     $r->print('<input type="hidden" name="action" value="'.
                   1158:               $ENV{'form.action'}.'" />');
                   1159:     $r->print("<p>\n");
1.59      matthew  1160:     if ($ENV{'form.action'} ne 'modifystudent') {
1.103     matthew  1161: 	my %lt=&Apache::lonlocal::texthash('csv' => "CSV",
                   1162:                                            'excel' => "Excel",
                   1163:                                            'html'  => 'HTML');
1.110     matthew  1164:         my $output_selector = '<select size="1" name="output" >';
1.103     matthew  1165:         foreach my $outputformat ('html','csv','excel') {
                   1166:             my $option = '<option value="'.$outputformat.'" ';
1.110     matthew  1167:             if ($outputformat eq $ENV{'form.output'}) {
1.104     matthew  1168:                 $option .= 'selected ';
1.103     matthew  1169:             }
                   1170:             $option .='>'.$lt{$outputformat}.'</option>';
                   1171:             $output_selector .= "\n".$option;
                   1172:         }
                   1173:         $output_selector .= '</select>';
                   1174:         $r->print(&mt('Output Format: [_1]',$output_selector).('&nbsp;'x3));
1.59      matthew  1175:     }
1.103     matthew  1176:     $r->print(&mt('Student Status: [_1]',$status_select)."\n");
1.105     matthew  1177:     $r->print('<input type="submit" value="'.&mt('Update Display').'" />'.
                   1178:               "\n</p>\n");
1.103     matthew  1179:     #
                   1180:     # Print the classlist
                   1181:     $r->print('<h2>'.&mt('Current Class List').'</h2>');
1.56      matthew  1182:     my ($classlist,$keylist)=&Apache::loncoursedata::get_classlist();
                   1183:     if (! defined($classlist)) {
1.94      sakharuk 1184:         $r->print(&mt('There are no students currently enrolled.')."\n");
1.40      matthew  1185:     } else {
                   1186:         # Print out the available choices
1.50      matthew  1187:         if ($ENV{'form.action'} eq 'modifystudent') {
1.110     matthew  1188:             &show_class_list($r,'view','modify',
1.57      matthew  1189:                              $ENV{'form.Status'},$classlist,$keylist);
1.110     matthew  1190:         } else {
                   1191:             &show_class_list($r,$ENV{'form.output'},'aboutme',
1.103     matthew  1192:                              $ENV{'form.Status'},$classlist,$keylist);
1.50      matthew  1193:         }
1.41      matthew  1194:     }
                   1195: }
                   1196: 
1.40      matthew  1197: # =================================================== Show student list to drop
                   1198: sub show_class_list {
1.110     matthew  1199:     my ($r,$mode,$linkto,$statusmode,$classlist,$keylist)=@_;
1.40      matthew  1200:     my $cid=$ENV{'request.course.id'};
1.60      matthew  1201:     #
                   1202:     # Variables for excel output
1.104     matthew  1203:     my ($excel_workbook, $excel_sheet, $excel_filename,$row,$format);
1.60      matthew  1204:     #
1.103     matthew  1205:     # Variables for csv output
                   1206:     my ($CSVfile,$CSVfilename);
                   1207:     #
1.53      matthew  1208:     my $sortby = $ENV{'form.sortby'};
1.114     raeburn  1209:     if ($sortby !~ /^(username|domain|section|fullname|id|start|end|type)$/) {
1.53      matthew  1210:         $sortby = 'username';
                   1211:     }
1.42      matthew  1212:     # Print out header 
1.114     raeburn  1213:     unless ($mode eq 'autoenroll') {
                   1214:         $r->print(<<END);
                   1215: <input type="hidden" name="state" value="$ENV{'form.state'}" />
                   1216: END
                   1217:     }
1.103     matthew  1218:     $r->print(<<END);
                   1219: <input type="hidden" name="sortby" value="$sortby" />
                   1220: END
1.114     raeburn  1221:     if ($mode eq 'html' || $mode eq 'view' || $mode eq 'autoenroll') {
1.50      matthew  1222:         if ($linkto eq 'aboutme') {
1.94      sakharuk 1223:             $r->print(&mt('Select a user name to view the users personal page.'));
1.50      matthew  1224:         } elsif ($linkto eq 'modify') {
1.94      sakharuk 1225:             $r->print(&mt('Select a user name to modify the students information'));
1.50      matthew  1226:         }
1.94      sakharuk 1227: 	my %lt=&Apache::lonlocal::texthash(
1.110     matthew  1228:                                            'usrn'   => "username",
                   1229:                                            'dom'    => "domain",
                   1230:                                            'sn'     => "student name",
                   1231:                                            'sec'    => "section",
                   1232:                                            'start'  => "start date",
                   1233:                                            'end'    => "end date",
1.115   ! raeburn  1234:                                            'type'   => "enroll type/action"
1.94      sakharuk 1235: 					   );
1.114     raeburn  1236:         unless ($mode eq 'autoenroll') {
                   1237:             $r->print(<<END);
1.59      matthew  1238: <input type="hidden" name="sname"  value="" />
                   1239: <input type="hidden" name="sdom"   value="" />
1.114     raeburn  1240: END
                   1241:         }
1.115   ! raeburn  1242:         $r->print("
1.40      matthew  1243: <p>
                   1244: <table border=2>
1.115   ! raeburn  1245: <tr>
        !          1246:         ");
        !          1247:         if ($mode eq 'autoenroll') {
        !          1248:             $r->print("
        !          1249:  <th><a href=\"javascript:document.studentform.sortby.value='type';document.studentform.submit();\">$lt{'type'}</a></th>
        !          1250:             ");
        !          1251:         } else {
        !          1252:             $r->print("
        !          1253: <th>Count</th>
        !          1254:             ");
        !          1255:         }
        !          1256:         $r->print(<<END);
        !          1257:     <th>
1.94      sakharuk 1258:        <a href="javascript:document.studentform.sortby.value='username';document.studentform.submit();">$lt{'usrn'}</a>
1.53      matthew  1259:     </th><th>
1.94      sakharuk 1260:        <a href="javascript:document.studentform.sortby.value='domain';document.studentform.submit();">$lt{'dom'}</a>
1.53      matthew  1261:     </th><th>
1.57      matthew  1262:        <a href="javascript:document.studentform.sortby.value='id';document.studentform.submit();">ID</a>
1.53      matthew  1263:     </th><th>
1.94      sakharuk 1264:        <a href="javascript:document.studentform.sortby.value='fullname';document.studentform.submit();">$lt{'sn'}</a>
1.53      matthew  1265:     </th><th>
1.94      sakharuk 1266:        <a href="javascript:document.studentform.sortby.value='section';document.studentform.submit();">$lt{'sec'}</a>
1.110     matthew  1267:     </th><th>
                   1268:        <a href="javascript:document.studentform.sortby.value='start';document.studentform.submit();">$lt{'start'}</a>
                   1269:     </th><th>
                   1270:        <a href="javascript:document.studentform.sortby.value='end';document.studentform.submit();">$lt{'end'}</a>
1.53      matthew  1271:     </th>
1.115   ! raeburn  1272:   </tr>
1.40      matthew  1273: END
1.41      matthew  1274:     } elsif ($mode eq 'csv') {
1.103     matthew  1275: 	#
                   1276: 	# Open a file
                   1277: 	$CSVfilename = '/prtspool/'.
                   1278: 	    $ENV{'user.name'}.'_'.$ENV{'user.domain'}.'_'.
                   1279:             time.'_'.rand(1000000000).'.csv';
                   1280: 	unless ($CSVfile = Apache::File->new('>/home/httpd'.$CSVfilename)) {
                   1281: 	    $r->log_error("Couldn't open $CSVfilename for output $!");
                   1282: 	    $r->print("Problems occured in writing the csv file.  ".
                   1283: 		      "This error has been logged.  ".
                   1284: 		      "Please alert your LON-CAPA administrator.");
                   1285: 	    $CSVfile = undef;
                   1286: 	}
                   1287: 	#
                   1288: 	# Write headers and data to file
1.58      matthew  1289:         if($statusmode eq 'Expired') {
1.103     matthew  1290:             print $CSVfile '"'.&mt('Students with expired roles').'"'."\n";
1.58      matthew  1291:         }
                   1292:         if ($statusmode eq 'Any') {
1.103     matthew  1293:             print $CSVfile '"'.join('","',map {
                   1294: 		&Apache::loncommon::csv_translate(&mt($_))
                   1295:                 } ("username","domain","ID","student name",
1.110     matthew  1296:                    "section","start date","end date","status")).'"'."\n";
1.58      matthew  1297:         } else {
1.103     matthew  1298:             print $CSVfile '"'.join('","',map {
                   1299: 		&Apache::loncommon::csv_translate(&mt($_))
                   1300:                 } ("username","domain","ID","student name",
1.110     matthew  1301:                    "section","start date","end date")).'"'."\n";
1.58      matthew  1302:         }
1.60      matthew  1303:     } elsif ($mode eq 'excel') {
                   1304:         # Create the excel spreadsheet
                   1305:         $excel_filename = '/prtspool/'.
                   1306:             $ENV{'user.name'}.'_'.$ENV{'user.domain'}.'_'.
                   1307:                 time.'_'.rand(1000000000).'.xls';
                   1308:         $excel_workbook = Spreadsheet::WriteExcel->new('/home/httpd'.
                   1309:                                                        $excel_filename);
                   1310:         $excel_workbook->set_tempdir('/home/httpd/perl/tmp');
1.104     matthew  1311:         #
                   1312:         $format = &Apache::loncommon::define_excel_formats($excel_workbook);
1.60      matthew  1313:         $excel_sheet = $excel_workbook->addworksheet('classlist');
                   1314:         #
1.76      albertel 1315:         my $description = 'Class List for '.
1.60      matthew  1316:             $ENV{'course.'.$ENV{'request.course.id'}.'.description'};
1.104     matthew  1317:         $excel_sheet->write($row++,0,$description,$format->{'h1'});
1.60      matthew  1318:         #
                   1319:         $excel_sheet->write($row++,0,["username","domain","ID",
1.110     matthew  1320:                                       "student name","section",
                   1321:                                       "start date","end date","status"],
                   1322:                             $format->{'bold'});
1.41      matthew  1323:     }
1.56      matthew  1324:     #
                   1325:     # Sort the students
                   1326:     my %index;
                   1327:     my $i;
                   1328:     foreach (@$keylist) {
                   1329:         $index{$_} = $i++;
                   1330:     }
                   1331:     my $index  = $index{$sortby};
                   1332:     my $second = $index{'username'};
                   1333:     my $third  = $index{'domain'};
1.53      matthew  1334:     my @Sorted_Students = sort {
1.56      matthew  1335:         lc($classlist->{$a}->[$index])  cmp lc($classlist->{$b}->[$index])
                   1336:             ||
                   1337:         lc($classlist->{$a}->[$second]) cmp lc($classlist->{$b}->[$second])
                   1338:             ||
                   1339:         lc($classlist->{$a}->[$third]) cmp lc($classlist->{$b}->[$third])
                   1340:         } (keys(%$classlist));
1.108     matthew  1341:     my $studentcount = 0;
1.115   ! raeburn  1342:     my $autocount = 0;
        !          1343:     my $manualcount = 0;
        !          1344:     my $unlockcount = 0;
        !          1345:     my $lockcount = 0;
1.53      matthew  1346:     foreach my $student (@Sorted_Students) {
1.110     matthew  1347:         my $sdata = $classlist->{$student};
                   1348:         my $username = $sdata->[$index{'username'}];
                   1349:         my $domain   = $sdata->[$index{'domain'}];
                   1350:         my $section  = $sdata->[$index{'section'}];
                   1351:         my $name     = $sdata->[$index{'fullname'}];
                   1352:         my $id       = $sdata->[$index{'id'}];
                   1353:         my $status   = $sdata->[$index{'status'}];
                   1354:         my $start    = $sdata->[$index{'start'}];
                   1355:         my $end      = $sdata->[$index{'end'}];
1.115   ! raeburn  1356:         my $type     = $sdata->[$index{'type'}];
1.57      matthew  1357:         next if (($statusmode ne 'Any') && ($status ne $statusmode));
1.114     raeburn  1358:         if ($mode eq 'view' || $mode eq 'html' || $mode eq 'autoenroll') {
                   1359:             if (! defined($start) || $start == 0) {
                   1360:                 $start = &mt('none');
                   1361:             } else {
                   1362:                 $start = &Apache::lonlocal::locallocaltime($start);
                   1363:             }
                   1364:             if (! defined($end) || $end == 0) {
                   1365:                 $end = &mt('none');
                   1366:             } else {
                   1367:                 $end = &Apache::lonlocal::locallocaltime($end);
                   1368:             }
1.115   ! raeburn  1369:             $r->print("<tr>\n    ");
        !          1370:             if ($mode eq 'autoenroll') {
        !          1371:                 my $lockedtype = $sdata->[$index{'lockedtype'}];
        !          1372:                 $studentcount++;
        !          1373:                 my $cellentry;
        !          1374:                 if ($type eq 'auto') {
        !          1375:                     $cellentry = '<b>'.&mt('auto').'</b>&nbsp;<input type="checkbox" name="chgauto" value="'.$username.':'.$domain.'" />&nbsp;Change';
        !          1376:                     $autocount ++;
        !          1377:                 } else {
        !          1378:                     $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>';
        !          1379:                     $manualcount ++;
        !          1380:                     if ($lockedtype) {
        !          1381:                         $cellentry .= '<input type="checkbox" name="unlockchg" value="'.$username.':'.$domain.'" />&nbsp;'.&mt('Unlock');
        !          1382:                         $unlockcount ++;
        !          1383:                     } else {
        !          1384:                         $cellentry .= '<input type="checkbox" name="lockchg" value="'.$username.':'.$domain.'" />&nbsp;'.&mt('Lock');
        !          1385:                         $lockcount ++;
        !          1386:                     }
        !          1387:                     $cellentry .= '</td></tr></table>';
        !          1388:                 }
        !          1389:                 $r->print("<td>$cellentry<td>\n    ");
        !          1390:             } else {
        !          1391:                 $r->print("<td>".(++$studentcount)."</td><td>\n    ");
        !          1392:             }
1.51      matthew  1393:             if ($linkto eq 'nothing') {
                   1394:                 $r->print($username);
                   1395:             } elsif ($linkto eq 'aboutme') {
                   1396:                 $r->print(&Apache::loncommon::aboutmewrapper($username,
                   1397:                                                              $username,
                   1398:                                                              $domain));
                   1399:             } elsif ($linkto eq 'modify') {
1.59      matthew  1400:                 $r->print('<a href="'.
                   1401:                           "javascript:document.studentform.sname.value='".
                   1402:                           $username.
                   1403:                           "';document.studentform.sdom.value='".$domain.
                   1404:                           "';document.studentform.state.value='selected".
                   1405:                           "';document.studentform.submit();".'">'.
1.53      matthew  1406:                           $username."</a>\n");
1.50      matthew  1407:             }
1.51      matthew  1408:             $r->print(<<"END");
1.50      matthew  1409:     </td>
1.51      matthew  1410:     <td>$domain</td>
                   1411:     <td>$id</td>
                   1412:     <td>$name</td>
                   1413:     <td>$section</td>
1.110     matthew  1414:     <td>$start</td>
                   1415:     <td>$end</td>
1.115   ! raeburn  1416:    </tr>
1.114     raeburn  1417: END
1.51      matthew  1418:         } elsif ($mode eq 'csv') {
1.103     matthew  1419:             next if (! defined($CSVfile));
1.51      matthew  1420:             # no need to bother with $linkto
1.114     raeburn  1421:             if (! defined($start) || $start == 0) {
                   1422:                 $start = &mt('none');
                   1423:             } else {
                   1424:                 $start = &Apache::lonlocal::locallocaltime($start);
                   1425:             }
                   1426:             if (! defined($end) || $end == 0) {
                   1427:                 $end = &mt('none');
                   1428:             } else {
                   1429:                 $end = &Apache::lonlocal::locallocaltime($end);
                   1430:             }
1.51      matthew  1431:             my @line = ();
1.110     matthew  1432:             foreach ($username,$domain,$id,$name,$section,$start,$end) {
1.51      matthew  1433:                 push @line,&Apache::loncommon::csv_translate($_);
1.58      matthew  1434:             }
                   1435:             if ($statusmode eq 'Any') {
                   1436:                 push @line,&Apache::loncommon::csv_translate($status);
1.41      matthew  1437:             }
1.103     matthew  1438:             print $CSVfile '"'.join('","',@line).'"'."\n";
1.60      matthew  1439:         } elsif ($mode eq 'excel') {
1.110     matthew  1440:             $excel_sheet->write($row,0,[$username,$domain,$id,
                   1441:                                           $name,$section]);
                   1442:             my $col = 5;
                   1443:             foreach my $time ($start,$end) {
                   1444:                 $excel_sheet->write($row,$col++,
                   1445:                                    &Apache::lonstathelpers::calc_serial($time),
                   1446:                                     $format->{'date'});
                   1447:             }
                   1448:             $excel_sheet->write($row,$col++,$status);
                   1449:             $row++;
1.40      matthew  1450:         }
                   1451:     }
1.114     raeburn  1452:     if ($mode eq 'view' || $mode eq 'html' || $mode eq 'autoenroll') {
1.60      matthew  1453:         $r->print('</table><br>');
                   1454:     } elsif ($mode eq 'excel') {
                   1455:         $excel_workbook->close();
                   1456:         $r->print('<p><a href="'.$excel_filename.'">'.
1.94      sakharuk 1457:                   &mt('Your Excel spreadsheet').'</a> '.&mt('is ready for download').'.</p>'."\n");
1.103     matthew  1458:     } elsif ($mode eq 'csv') {
                   1459:         close($CSVfile);
                   1460:         $r->print('<a href="'.$CSVfilename.'">'.
                   1461:                   &mt('Your CSV file').'</a> is ready for download.'.
                   1462:                   "\n");
                   1463:         $r->rflush();
1.60      matthew  1464:     }
1.114     raeburn  1465:     if ($mode eq 'autoenroll') {
1.115   ! raeburn  1466:         return ($studentcount,$autocount,$manualcount,$lockcount,$unlockcount);
1.114     raeburn  1467:     }
1.115   ! raeburn  1468:     return;
1.40      matthew  1469: }
                   1470: 
1.50      matthew  1471: 
                   1472: #
                   1473: # print out form for modification of a single students data
                   1474: #
                   1475: sub print_modify_student_form {
                   1476:     my $r = shift();
                   1477:     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
1.59      matthew  1478:                                             ['sdom','sname']);    
1.53      matthew  1479:     my $sname  = $ENV{'form.sname'};
                   1480:     my $sdom   = $ENV{'form.sdom'};
                   1481:     my $sortby = $ENV{'form.sortby'};
1.50      matthew  1482:     # determine the students name information
                   1483:     my %info=&Apache::lonnet::get('environment',
                   1484:                                   ['firstname','middlename',
1.52      matthew  1485:                                    'lastname','generation','id'],
1.50      matthew  1486:                                   $sdom, $sname);
                   1487:     my ($tmp) = keys(%info);
                   1488:     if ($tmp =~ /^(con_lost|error|no_such_host)/i) {
1.94      sakharuk 1489:         $r->print('<font color="#ff0000" size="+2">'.&mt('Error').'</font>'.
1.50      matthew  1490:                   '<p>'.
1.94      sakharuk 1491:                   &mt('Unable to retrieve environment data for').' '.$sname.
                   1492:                   &mt('in domain').' '.$sdom.'</p><p>'.
                   1493:                   &mt('Please contact your LON-CAPA administrator regarding this situation.').'</p></body></html>');
1.50      matthew  1494:         return;
                   1495:     }
                   1496:     # determine the students starting and ending times and section
                   1497:     my ($starttime,$endtime,$section) = &get_enrollment_data($sname,$sdom);
1.87      matthew  1498:     if ($starttime =~ /^error/) {
1.94      sakharuk 1499:         $r->print('<h2>'&mt('Error').'</h2>');
1.87      matthew  1500:         $r->print('<p>'.$starttime.'</p>');
                   1501:         return;
                   1502:     }
1.101     matthew  1503:     #
1.50      matthew  1504:     # Deal with date forms
1.101     matthew  1505:     my $current_date_description = '';
                   1506:     my $textdate = '';
                   1507: 
                   1508:     if (! defined($starttime) || $starttime == 0) {
                   1509:         $current_date_description = &mt('Current Starting Date: not set').
                   1510:             '<br />';
                   1511:     } else {
                   1512:         $current_date_description = 
                   1513:             &mt('Current Starting Date: [_1]',
                   1514:                 &Apache::lonlocal::locallocaltime($starttime)).'<br />';
                   1515:     }
                   1516:     if (! defined($endtime) || $endtime == 0) {
                   1517:         $current_date_description.= &mt('Current Ending Date: not set').
                   1518:             '<br />';
                   1519:     } else {
                   1520:         $current_date_description.= 
                   1521:             &mt('Current Ending Date: [_1]',
                   1522:                 &Apache::lonlocal::locallocaltime($endtime)).'<br />';
                   1523: 
                   1524:     }
1.68      matthew  1525:     my $date_table = &date_setting_table($starttime,$endtime);
1.59      matthew  1526:     #
                   1527:     if (! exists($ENV{'form.Status'}) || 
                   1528:         $ENV{'form.Status'} !~ /^(Any|Expired|Active)$/) {
                   1529:         $ENV{'form.Status'} = 'crap';
                   1530:     }
1.94      sakharuk 1531:     # Make sure student is enrolled in course
                   1532:     my %lt=&Apache::lonlocal::texthash(
                   1533: 	           'mef'   => "Modify Enrollment for",
                   1534:                    'odcc'  => "Only domain coordinators can change a users password.",
                   1535:                    'sn'    => "Student Name",
                   1536:                    'fn'    => "First",
                   1537:                    'mn'    => "Middle",
                   1538:                    'ln'    => "Last",
                   1539:                    'gen'   => "Generation",
                   1540:                    'sid'   => "Student ID",
                   1541:                    'disn'  => "Disable ID/Student Number Safeguard and Force Change of Conflicting IDs (only do if you know what you are doing)",
                   1542:                    'sec'   => "Section",
                   1543:                    'sm'    => "Submit Modifications",
                   1544: 				       );
1.50      matthew  1545:     $r->print(<<END);
1.52      matthew  1546: <p>
                   1547: <font size="+1">
1.94      sakharuk 1548: $lt{'odcc'}
1.52      matthew  1549: </font>
                   1550: </p>
1.50      matthew  1551: <input type="hidden" name="slogin"  value="$sname"  />
                   1552: <input type="hidden" name="sdomain" value="$sdom" />
                   1553: <input type="hidden" name="action"  value="modifystudent" />
1.53      matthew  1554: <input type="hidden" name="state"   value="done" />
                   1555: <input type="hidden" name="sortby"  value="$sortby" />
1.59      matthew  1556: <input type="hidden" name="Status"  value="$ENV{'form.Status'}" />
1.94      sakharuk 1557: <h2>$lt{'mef'} $info{'firstname'} $info{'middlename'} 
1.50      matthew  1558: $info{'lastname'} $info{'generation'}, $sname\@$sdom</h2>
                   1559: <p>
1.94      sakharuk 1560: <b>$lt{'sn'}</b>
1.50      matthew  1561: <table>
1.94      sakharuk 1562: <tr><th>$lt{'fn'}</th><th>$lt{'mn'}</th><th>$lt{'ln'}</th><th>$lt{'gen'}</th></tr>
1.50      matthew  1563: <tr><td>
                   1564: <input type="text" name="firstname"  value="$info{'firstname'}"  /></td><td>
                   1565: <input type="text" name="middlename" value="$info{'middlename'}" /></td><td>
                   1566: <input type="text" name="lastname"   value="$info{'lastname'}"   /></td><td>
                   1567: <input type="text" name="generation" value="$info{'generation'}" /></td></tr>
                   1568: </table>
                   1569: </p><p>
1.94      sakharuk 1570: <b>$lt{'sid'}</b>: <input type="text" name="id" value="$info{'id'}" size="12"/>
1.52      matthew  1571: </p><p>
1.53      matthew  1572: <input type="checkbox" name="forceid" > 
1.94      sakharuk 1573: $lt{'disn'}
1.53      matthew  1574: </p><p>
1.101     matthew  1575: <b>$lt{'sec'}</b>: <input type="text" name="section" value="$section" size="14"/>
1.50      matthew  1576: </p>
1.101     matthew  1577: <p>$current_date_description</p>
1.68      matthew  1578: <p>$date_table</p>
1.94      sakharuk 1579: <input type="submit" value="$lt{'sm'}" />
1.50      matthew  1580: </body></html>
                   1581: END
                   1582:     return;
                   1583: }
                   1584: 
                   1585: #
                   1586: # modify a single students section 
                   1587: #
                   1588: sub modify_single_student {
                   1589:     my $r = shift;
1.68      matthew  1590:     #
1.80      matthew  1591:     # Remove non alphanumeric values from the section
                   1592:     $ENV{'form.section'} =~ s/\W//g;
1.77      matthew  1593:     #
1.68      matthew  1594:     # Do the date defaults first
                   1595:     my ($starttime,$endtime) = &get_dates_from_form();
                   1596:     if ($ENV{'form.makedatesdefault'}) {
                   1597:         $r->print(&make_dates_default($starttime,$endtime));
                   1598:     }
1.59      matthew  1599:     # Get the 'sortby' and 'Status' variables so the user goes back to their
                   1600:     # previous screen
1.53      matthew  1601:     my $sortby = $ENV{'form.sortby'};
1.59      matthew  1602:     my $status = $ENV{'form.Status'};
1.53      matthew  1603:     #
                   1604:     # We always need this information
                   1605:     my $slogin     = $ENV{'form.slogin'};
                   1606:     my $sdom       = $ENV{'form.sdomain'};
                   1607:     #
                   1608:     # Get the old data
                   1609:     my %old=&Apache::lonnet::get('environment',
                   1610:                                  ['firstname','middlename',
                   1611:                                   'lastname','generation','id'],
                   1612:                                  $sdom, $slogin);
1.59      matthew  1613:     $old{'section'} = &Apache::lonnet::getsection($sdom,$slogin,
                   1614:                                                   $ENV{'request.course.id'});
1.53      matthew  1615:     my ($tmp) = keys(%old);
                   1616:     if ($tmp =~ /^(con_lost|error|no_such_host)/i) {
1.94      sakharuk 1617:         $r->print(&mt('There was an error determining the environment values for')." $slogin \@ $sdom.");
1.53      matthew  1618:         return;
                   1619:     }
                   1620:     undef $tmp;
                   1621:     #
                   1622:     # Get the new data
1.50      matthew  1623:     my $firstname  = $ENV{'form.firstname'};
                   1624:     my $middlename = $ENV{'form.middlename'};
                   1625:     my $lastname   = $ENV{'form.lastname'};
                   1626:     my $generation = $ENV{'form.generation'};
                   1627:     my $section    = $ENV{'form.section'};
                   1628:     my $courseid   = $ENV{'request.course.id'};
1.52      matthew  1629:     my $sid        = $ENV{'form.id'};
1.50      matthew  1630:     my $displayable_starttime = localtime($starttime);
                   1631:     my $displayable_endtime   = localtime($endtime);
1.53      matthew  1632:     # 
                   1633:     # check for forceid override
1.63      matthew  1634:     if ((defined($old{'id'})) && ($old{'id'} ne '') && 
                   1635:         ($sid ne $old{'id'}) && (! exists($ENV{'form.forceid'}))) {
1.94      sakharuk 1636:         $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>");
1.53      matthew  1637:         $sid = $old{'id'};
                   1638:     }
                   1639:     #
1.50      matthew  1640:     # talk to the user about what we are going to do
1.94      sakharuk 1641:     my %lt=&Apache::lonlocal::texthash(
                   1642: 	           'mdu'   => "Modifying data for user",
                   1643:                    'si'    => "Student Information",
                   1644:                    'fd'    => "Field",
                   1645:                    'ov'    => "Old Value",
                   1646:                    'nv'    => "New Value",
                   1647:                    'fn'    => "First name",
                   1648:                    'mn'    => "Middle name",
                   1649:                    'ln'    => "Last name",
                   1650:                    'gen'   => "Generation",
                   1651:                    'sec'   => "Section",
                   1652:                    'ri'    => "Role Information",
                   1653:                    'st'    => "Start Time",
                   1654:                    'et'    => "End Time",
                   1655: 				       );
1.50      matthew  1656:     $r->print(<<END);
1.94      sakharuk 1657:     <h2>$lt{'mdu'} $slogin \@ $sdom </h2>
                   1658: <h3>$lt{'si'}</h3>
1.53      matthew  1659: <table rules="rows" border="1" cellpadding="3" >
                   1660: <tr>
1.94      sakharuk 1661:     <th> $lt{'fd'} </th>
                   1662:     <th> $lt{'ov'} </th>
                   1663:     <th> $lt{'nv'} </th>
1.53      matthew  1664: </tr>
                   1665: <tr>
1.94      sakharuk 1666:     <td> <b>$lt{'fn'}</b> </td>
1.53      matthew  1667:     <td> $old{'firstname'} </td>
                   1668:     <td> $firstname </td>
                   1669: </tr><tr>
1.94      sakharuk 1670:     <td> <b>$lt{'mn'}</b> </td>
1.53      matthew  1671:     <td> $old{'middlename'} </td>
                   1672:     <td> $middlename </td>
                   1673: </tr><tr>
1.94      sakharuk 1674:     <td> <b>$lt{'ln'}</b> </td>
1.53      matthew  1675:     <td> $old{'lastname'} </td>
                   1676:     <td> $lastname </td>
                   1677: </tr><tr>
1.94      sakharuk 1678:     <td> <b>$lt{'gen'}</b> </td>
1.53      matthew  1679:     <td> $old{'generation'} </td>
                   1680:     <td> $generation </td>
                   1681: </tr><tr>
                   1682:     <td> <b>ID</b> </td>
                   1683:     <td> $old{'id'} </td>
                   1684:     <td> $sid </td>
1.59      matthew  1685: </tr><tr>
1.94      sakharuk 1686:     <td> <b>$lt{'sec'}</b> </td>
1.59      matthew  1687:     <td> $old{'section'} </td>
                   1688:     <td> $section</td>
1.53      matthew  1689: </tr>
1.50      matthew  1690: </table>
1.94      sakharuk 1691: <h3>$lt{'ri'}</h3>
1.50      matthew  1692: <table>
1.94      sakharuk 1693: <tr><td align="right"><b>$lt{'st'}:</b></td><td> $displayable_starttime </td></tr>
                   1694: <tr><td align="right"><b>$lt{'et'}:</b></td><td> $displayable_endtime   </td></tr>
1.50      matthew  1695: </table>
1.52      matthew  1696: <p>
1.50      matthew  1697: END
1.53      matthew  1698:     #
1.63      matthew  1699:     # Send request(s) to modify data (final undef is for 'desiredhost',
                   1700:     # which is a moot point because the student already has an account.
                   1701:     my $modify_section_results = &modifystudent($sdom,$slogin,
                   1702:                                                 $ENV{'request.course.id'},
                   1703:                                                 $section,undef);
                   1704:     if ($modify_section_results !~ /^ok/) {
1.94      sakharuk 1705:         $r->print(&mt('An error occured during the attempt to change the section for this student.')."<br />");
1.63      matthew  1706:     }
1.52      matthew  1707:     my $roleresults = &Apache::lonnet::modifystudent
1.53      matthew  1708:         ($sdom,$slogin,$sid,undef,undef,$firstname,$middlename,$lastname,
                   1709:          $generation,$section,$endtime,$starttime,$ENV{'form.forceid'});
                   1710:     if ($roleresults eq 'refused' ) {
1.94      sakharuk 1711:         $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.'));
1.50      matthew  1712:     } elsif ($roleresults !~ /ok/) {
1.94      sakharuk 1713:         $r->print(&mt('An error occurred during the attempt to change the role information for this student.')."  <br />".
                   1714:                   &mt('The error reported was')." ".
1.50      matthew  1715:                   $roleresults);
1.53      matthew  1716:         &Apache::lonnet::logthis("londropadd:failed attempt to modify student".
                   1717:                                  " data for ".$slogin." \@ ".$sdom." by ".
                   1718:                                  $ENV{'user.name'}." \@ ".$ENV{'user.domain'}.
                   1719:                                  ":".$roleresults);
1.50      matthew  1720:     } else { # everything is okay!
1.94      sakharuk 1721:         $r->print(&mt('Student information updated successfully.')." <br />".
                   1722:                   &mt('The student must log out and log in again to see these changes.'));
1.50      matthew  1723:     }
1.94      sakharuk 1724:     my $Masd=&mt('Modify another students data');
1.50      matthew  1725:     $r->print(<<END);
1.52      matthew  1726: </p><p>
1.59      matthew  1727: <input type="hidden" name="action" value="modifystudent" />
                   1728: <input type="hidden" name="sortby" value="$sortby" />
                   1729: <input type="hidden" name="Status" value="$status" />
1.94      sakharuk 1730: <a href="javascript:document.studentform.submit();">$Masd</a>
1.50      matthew  1731: </body></html>
                   1732: END
                   1733:     return;
                   1734: }
                   1735: 
                   1736: sub get_enrollment_data {
                   1737:     my ($sname,$sdomain) = @_;
                   1738:     my $courseid = $ENV{'request.course.id'};
                   1739:     $courseid =~ s:_:/:g;
                   1740:     my %roles = &Apache::lonnet::dump('roles',$sdomain,$sname);
                   1741:     my ($tmp) = keys(%roles);
                   1742:     # Bail out if we were unable to get the students roles
1.87      matthew  1743:     return ('error'.$tmp) if ($tmp =~ /^(con_lost|error|no_such_host)/i);
1.50      matthew  1744:     # Go through the roles looking for enrollment in this course
                   1745:     my ($end,$start) = (undef,undef);
                   1746:     my $section = '';
                   1747:     my $count = scalar(keys(%roles));
                   1748:     while (my ($course,$role) = each(%roles)) {
                   1749:         if ($course=~ /^\/$courseid\/*\s*(\w+)*_st$/ ) {
                   1750:             #
                   1751:             # Get active role
                   1752:             $section=$1;
                   1753:             (undef,$end,$start)=split(/\_/,$role);
                   1754:             my $now=time;
                   1755:             my $notactive=0;
                   1756:             if ($start) {
                   1757:                 if ($now<$start) { $notactive=1; }
                   1758:             }
                   1759:             if ($end) {
                   1760:                 if ($now>$end) { $notactive=1; }
                   1761:             } 
                   1762:             unless ($notactive) { return ($start,$end,$section); }
                   1763:         }
                   1764:     }
                   1765:     return ($start,$end,$section);
                   1766: }
                   1767: 
1.56      matthew  1768: #################################################
                   1769: #################################################
                   1770: 
                   1771: =pod
                   1772: 
                   1773: =item show_drop_list
                   1774: 
                   1775: Display a list of students to drop
                   1776: Inputs: 
                   1777: 
                   1778: =over 4
                   1779: 
                   1780: =item $r, Apache request
                   1781: 
                   1782: =item $classlist, hash pointer returned from loncoursedata::get_classlist();
                   1783: 
                   1784: =item $keylist, array pointer returned from loncoursedata::get_classlist() 
                   1785: which describes the order elements are stored in the %$classlist values.
                   1786: 
                   1787: =item $nosort, if true, sorting links are omitted.
                   1788: 
                   1789: =back
                   1790: 
                   1791: =cut
                   1792: 
                   1793: #################################################
                   1794: #################################################
1.11      www      1795: sub show_drop_list {
1.56      matthew  1796:     my ($r,$classlist,$keylist,$nosort)=@_;
1.11      www      1797:     my $cid=$ENV{'request.course.id'};
1.59      matthew  1798:     if (! exists($ENV{'form.sortby'})) {
                   1799:         &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                   1800:                                                 ['sortby']);
                   1801:     }
1.54      matthew  1802:     my $sortby = $ENV{'form.sortby'};
1.110     matthew  1803:     if ($sortby !~ /^(username|domain|section|fullname|id|start|end)$/) {
1.54      matthew  1804:         $sortby = 'username';
                   1805:     }
1.56      matthew  1806:     #
1.54      matthew  1807:     my $action = "drop";
                   1808:     $r->print(<<END);
                   1809: <input type="hidden" name="sortby" value="$sortby" />
                   1810: <input type="hidden" name="action" value="$action" />
1.50      matthew  1811: <input type="hidden" name="state"  value="done" />
1.32      matthew  1812: <script>
1.51      matthew  1813: function checkAll(field) {
1.32      matthew  1814:     for (i = 0; i < field.length; i++)
                   1815:         field[i].checked = true ;
                   1816: }
                   1817: 
1.51      matthew  1818: function uncheckAll(field) {
1.32      matthew  1819:     for (i = 0; i < field.length; i++)
                   1820:         field[i].checked = false ;
                   1821: }
                   1822: </script>
                   1823: <p>
1.26      matthew  1824: <input type="hidden" name="phase" value="four">
1.56      matthew  1825: END
                   1826: 
1.110     matthew  1827: my %lt=&Apache::lonlocal::texthash('usrn'   => "username",
                   1828:                                    'dom'    => "domain",
                   1829:                                    'sn'     => "student name",
                   1830:                                    'sec'    => "section",
                   1831:                                    'start'  => "start date",
                   1832:                                    'end'    => "end date",
                   1833:                                    );
1.56      matthew  1834:     if ($nosort) {
                   1835:         $r->print(<<END);
                   1836: <table border=2>
                   1837: <tr>
                   1838:     <th>&nbsp;</th>
1.94      sakharuk 1839:     <th>$lt{'usrn'}</th>
                   1840:     <th>$lt{'dom'}</th>
1.56      matthew  1841:     <th>ID</th>
1.94      sakharuk 1842:     <th>$lt{'sn'}</th>
                   1843:     <th>$lt{'sec'}</th>
1.110     matthew  1844:     <th>$lt{'start'}</th>
                   1845:     <th>$lt{'end'}</th>
1.56      matthew  1846: </tr>
                   1847: END
                   1848: 
                   1849:     } else  {
                   1850:         $r->print(<<END);
1.26      matthew  1851: <table border=2>
1.54      matthew  1852: <tr><th>&nbsp;</th>
                   1853:     <th>
1.94      sakharuk 1854:        <a href="/adm/dropadd?action=$action&sortby=username">$lt{'usrn'}</a>
1.54      matthew  1855:     </th><th>
1.94      sakharuk 1856:        <a href="/adm/dropadd?action=$action&sortby=domain">$lt{'dom'}</a>
1.54      matthew  1857:     </th><th>
                   1858:        <a href="/adm/dropadd?action=$action&sortby=id">ID</a>
                   1859:     </th><th>
1.94      sakharuk 1860:        <a href="/adm/dropadd?action=$action&sortby=fullname">$lt{'sn'}</a>
1.54      matthew  1861:     </th><th>
1.94      sakharuk 1862:        <a href="/adm/dropadd?action=$action&sortby=section">$lt{'sec'}</a>
1.110     matthew  1863:     </th><th>
                   1864:        <a href="/adm/dropadd?action=$action&sortby=start">$lt{'start'}</a>
                   1865:     </th><th>
                   1866:        <a href="/adm/dropadd?action=$action&sortby=end">$lt{'end'}</a>
1.54      matthew  1867:     </th>
                   1868: </tr>
1.26      matthew  1869: END
1.56      matthew  1870:     }
                   1871:     #
                   1872:     # Sort the students
                   1873:     my %index;
                   1874:     my $i;
                   1875:     foreach (@$keylist) {
                   1876:         $index{$_} = $i++;
                   1877:     }
                   1878:     my $index  = $index{$sortby};
                   1879:     my $second = $index{'username'};
                   1880:     my $third  = $index{'domain'};
1.54      matthew  1881:     my @Sorted_Students = sort {
1.56      matthew  1882:         lc($classlist->{$a}->[$index])  cmp lc($classlist->{$b}->[$index])
                   1883:             ||
                   1884:         lc($classlist->{$a}->[$second]) cmp lc($classlist->{$b}->[$second])
                   1885:             ||
                   1886:         lc($classlist->{$a}->[$third]) cmp lc($classlist->{$b}->[$third])
                   1887:         } (keys(%$classlist));
1.54      matthew  1888:     foreach my $student (@Sorted_Students) {
1.52      matthew  1889:         my $error;
1.110     matthew  1890:         my $sdata = $classlist->{$student};
                   1891:         my $username = $sdata->[$index{'username'}];
                   1892:         my $domain   = $sdata->[$index{'domain'}];
                   1893:         my $section  = $sdata->[$index{'section'}];
                   1894:         my $name     = $sdata->[$index{'fullname'}];
                   1895:         my $id       = $sdata->[$index{'id'}];
                   1896:         my $start    = $sdata->[$index{'start'}];
                   1897:         my $end      = $sdata->[$index{'end'}];
                   1898:         if (! defined($start) || $start == 0) {
                   1899:             $start = &mt('none');
                   1900:         } else {
                   1901:             $start = &Apache::lonlocal::locallocaltime($start);
                   1902:         }
                   1903:         if (! defined($end) || $end == 0) {
                   1904:             $end = &mt('none');
                   1905:         } else {
                   1906:             $end = &Apache::lonlocal::locallocaltime($end);
                   1907:         }
                   1908:         my $status   = $sdata->[$index{'status'}];
1.51      matthew  1909:         next if ($status ne 'Active');
                   1910:         #
                   1911:         $r->print(<<"END");
1.26      matthew  1912: <tr>
1.51      matthew  1913:     <td><input type="checkbox" name="droplist" value="$student"></td>
                   1914:     <td>$username</td>
                   1915:     <td>$domain</td>
                   1916:     <td>$id</td>
                   1917:     <td>$name</td>
                   1918:     <td>$section</td>
1.110     matthew  1919:     <td>$start</td>
                   1920:     <td>$end</td>
1.26      matthew  1921: </tr>
                   1922: END
1.25      matthew  1923:     }
                   1924:     $r->print('</table><br>');
1.111     matthew  1925:     %lt=&Apache::lonlocal::texthash(
1.94      sakharuk 1926: 	               'dp'   => "Drop Students",
                   1927:                        'ca'   => "check all",
                   1928:                        'ua'   => "uncheck all",
                   1929: 				       );
1.32      matthew  1930:     $r->print(<<"END");
                   1931: </p><p>
1.94      sakharuk 1932: <input type="button" value="$lt{'ca'}" onclick="javascript:checkAll(document.studentform.droplist)"> &nbsp;
                   1933: <input type="button" value="$lt{'ua'}" onclick="javascript:uncheckAll(document.studentform.droplist)"> 
                   1934: <p><input type=submit value="$lt{'dp'}"></p>
1.32      matthew  1935: END
1.51      matthew  1936:     return;
1.10      www      1937: }
                   1938: 
1.48      matthew  1939: #
                   1940: # Print out the initial form to get the courselist file
                   1941: #
                   1942: sub print_first_courselist_upload_form {
                   1943:     my $r=shift;
1.88      matthew  1944:     my $str;
                   1945:     $str  = '<input type="hidden" name="phase" value="two">';
                   1946:     $str .= '<input type="hidden" name="action" value="upload" />';
                   1947:     $str .= '<input type="hidden"   name="state"  value="got_file" />';
                   1948:     $str .= "<h3>".&mt('Upload a class list')."</h3>\n";
                   1949:     $str .= &Apache::loncommon::upfile_select_html();
                   1950:     $str .= "<p>\n";
                   1951:     $str .= '<input type="submit" name="fileupload" value="'.
                   1952:         &mt('Upload class list').'">'."\n";
                   1953:     $str .= '<input type="checkbox" name="noFirstLine" /> '.
                   1954:         &mt('Ignore First Line')."</p>\n";
                   1955:     $str .= &Apache::loncommon::help_open_topic("Course_Create_Class_List",
1.92      sakharuk 1956:                          &mt("How do I create a class list from a spreadsheet")).
1.88      matthew  1957:                              "<br />\n";
                   1958:     $str .= &Apache::loncommon::help_open_topic("Course_Convert_To_CSV",
1.92      sakharuk 1959:                            &mt("How do I create a CSV file from a spreadsheet")).
1.88      matthew  1960:                                "<br />\n";
                   1961:     $str .= "</body>\n</html>\n";
                   1962:     $r->print($str);
1.48      matthew  1963:     return;
                   1964: }
                   1965: 
1.10      www      1966: # ================================================= Drop/Add from uploaded file
                   1967: sub upfile_drop_add {
                   1968:     my $r=shift;
1.24      albertel 1969:     &Apache::loncommon::load_tmp_file($r);
                   1970:     my @studentdata=&Apache::loncommon::upfile_record_sep();
1.82      www      1971:     if($ENV{'form.noFirstLine'}){shift(@studentdata);}
1.26      matthew  1972:     my @keyfields = split(/\,/,$ENV{'form.keyfields'});
                   1973:     my $cid = $ENV{'request.course.id'};
1.25      matthew  1974:     my %fields=();
1.26      matthew  1975:     for (my $i=0; $i<=$ENV{'form.nfields'}; $i++) {
1.25      matthew  1976:         if ($ENV{'form.upfile_associate'} eq 'reverse') {
                   1977:             if ($ENV{'form.f'.$i} ne 'none') {
                   1978:                 $fields{$keyfields[$i]}=$ENV{'form.f'.$i};
                   1979:             }
                   1980:         } else {
                   1981:             $fields{$ENV{'form.f'.$i}}=$keyfields[$i];
                   1982:         }
                   1983:     }
1.99      matthew  1984:     #
                   1985:     # Store the field choices away
                   1986:     foreach my $field (qw/username names 
                   1987:                        fname mname lname gen id sec ipwd email/) {
                   1988:         $ENV{'form.'.$field.'_choice'}=$fields{$field};
                   1989:     }
                   1990:     &Apache::loncommon::store_course_settings('enrollment_upload',
                   1991:                                               { 'username_choice' => 'scalar',
                   1992:                                                 'names_choice' => 'scalar',
                   1993:                                                 'fname_choice' => 'scalar',
                   1994:                                                 'mname_choice' => 'scalar',
                   1995:                                                 'lname_choice' => 'scalar',
                   1996:                                                 'gen_choice' => 'scalar',
                   1997:                                                 'id_choice' => 'scalar',
                   1998:                                                 'sec_choice' => 'scalar',
                   1999:                                                 'ipwd_choice' => 'scalar',
                   2000:                                                 'email_choice' => 'scalar' });
                   2001: 
1.26      matthew  2002:     #
1.68      matthew  2003:     my ($startdate,$enddate) = &get_dates_from_form();
                   2004:     if ($ENV{'form.makedatesdefault'}) {
                   2005:         $r->print(&make_dates_default($startdate,$enddate));
                   2006:     }
1.31      matthew  2007:     # Determine domain and desired host (home server)
1.25      matthew  2008:     my $domain=$ENV{'form.lcdomain'};
1.31      matthew  2009:     my $desiredhost = $ENV{'form.lcserver'};
                   2010:     if (lc($desiredhost) eq 'default') {
                   2011:         $desiredhost = undef;
                   2012:     } else {
1.45      matthew  2013:         my %home_servers = &Apache::loncommon::get_library_servers($domain);
1.31      matthew  2014:         if (! exists($home_servers{$desiredhost})) {
1.88      matthew  2015:             $r->print('<font color="#ff0000">'.&mt('Error').'</font>'.
                   2016:                       &mt('Invalid home server specified'));
                   2017:             $r->print("</body>\n</html>\n");
1.31      matthew  2018:             return;
                   2019:         }
                   2020:     }
1.26      matthew  2021:     # Determine authentication mechanism
                   2022:     my $amode  = '';
                   2023:     my $genpwd = '';
1.25      matthew  2024:     if ($ENV{'form.login'} eq 'krb') {
1.47      albertel 2025:         $amode='krb';
                   2026: 	$amode.=$ENV{'form.krbver'};
1.28      matthew  2027:         $genpwd=$ENV{'form.krbarg'};
1.25      matthew  2028:     } elsif ($ENV{'form.login'} eq 'int') {
                   2029:         $amode='internal';
1.28      matthew  2030:         if ((defined($ENV{'form.intarg'})) && ($ENV{'form.intarg'})) {
                   2031:             $genpwd=$ENV{'form.intarg'};
1.25      matthew  2032:         }
                   2033:     } elsif ($ENV{'form.login'} eq 'loc') {
                   2034:         $amode='localauth';
                   2035:         if ((defined($ENV{'form.locarg'})) && ($ENV{'form.locarg'})) {
                   2036:             $genpwd=$ENV{'form.locarg'};
1.79      matthew  2037:         }
                   2038:     }
                   2039:     if ($amode =~ /^krb/) {
                   2040:         if (! defined($genpwd) || $genpwd eq '') {
                   2041:             $r->print('<font color="red" size="+1">'.
1.88      matthew  2042:                       &mt('Unable to enroll students').'</font>  '.
                   2043:                       &mt('No Kerberos domain was specified.').'</p>');
1.79      matthew  2044:             $amode = ''; # This causes the loop below to be skipped
1.25      matthew  2045:         }
                   2046:     }
                   2047:     unless (($domain=~/\W/) || ($amode eq '')) {
1.26      matthew  2048:         #######################################
                   2049:         ##         Enroll Students           ##
                   2050:         #######################################
1.88      matthew  2051:         $r->print('<h3>'.&mt('Enrolling Students')."</h3>\n<p>\n");
1.25      matthew  2052:         my $count=0;
                   2053:         my $flushc=0;
                   2054:         my %student=();
1.26      matthew  2055:         # Get new classlist
1.25      matthew  2056:         foreach (@studentdata) {
                   2057:             my %entries=&Apache::loncommon::record_sep($_);
1.26      matthew  2058:             # Determine student name
1.25      matthew  2059:             unless (($entries{$fields{'username'}} eq '') ||
                   2060:                     (!defined($entries{$fields{'username'}}))) {
1.26      matthew  2061:                 my ($fname, $mname, $lname,$gen) = ('','','','');
1.25      matthew  2062:                 if (defined($fields{'names'})) {
1.26      matthew  2063:                     ($lname,$fname,$mname)=($entries{$fields{'names'}}=~
                   2064:                                             /([^\,]+)\,\s*(\w+)\s*(.*)$/);
1.25      matthew  2065:                 } else {
                   2066:                     if (defined($fields{'fname'})) {
                   2067:                         $fname=$entries{$fields{'fname'}};
                   2068:                     }
                   2069:                     if (defined($fields{'mname'})) {
                   2070:                         $mname=$entries{$fields{'mname'}};
                   2071:                     }
                   2072:                     if (defined($fields{'lname'})) {
                   2073:                         $lname=$entries{$fields{'lname'}};
                   2074:                     }
                   2075:                     if (defined($fields{'gen'})) {
                   2076:                         $gen=$entries{$fields{'gen'}};
                   2077:                     }
                   2078:                 }
                   2079:                 if ($entries{$fields{'username'}}=~/\W/) {
1.88      matthew  2080:                     $r->print('<br />'.
                   2081:       &mt('<b>[_1]</b>: Unacceptable username for user [_2] [_3] [_4] [_5]',
                   2082:           $entries{$fields{'username'}},$fname,$mname,$lname,$gen).
                   2083:                               '</b>');
1.25      matthew  2084:                 } else {
1.26      matthew  2085:                     # determine section number
1.25      matthew  2086:                     my $sec='';
                   2087:                     my $username=$entries{$fields{'username'}};
                   2088:                     if (defined($fields{'sec'})) {
                   2089:                         if (defined($entries{$fields{'sec'}})) {
                   2090:                             $sec=$entries{$fields{'sec'}};
                   2091:                         }
                   2092:                     }
1.80      matthew  2093:                     # remove non alphanumeric values from section
                   2094:                     $sec =~ s/\W//g;
1.26      matthew  2095:                     # determine student id number
1.25      matthew  2096:                     my $id='';
                   2097:                     if (defined($fields{'id'})) {
                   2098:                         if (defined($entries{$fields{'id'}})) {
                   2099:                             $id=$entries{$fields{'id'}};
                   2100:                         }
                   2101:                         $id=~tr/A-Z/a-z/;
                   2102:                     }
1.73      www      2103:                     # determine email address
                   2104:                     my $email='';
                   2105:                     if (defined($fields{'email'})) {
                   2106:                         if (defined($entries{$fields{'email'}})) {
                   2107:                             $email=$entries{$fields{'email'}};
                   2108:                             unless ($email=~/^[^\@]+\@[^\@]+$/) { $email=''; }
                   2109:                         }
                   2110:                     }
1.26      matthew  2111:                     # determine student password
1.25      matthew  2112:                     my $password='';
                   2113:                     if ($genpwd) { 
                   2114:                         $password=$genpwd; 
                   2115:                     } else {
                   2116:                         if (defined($fields{'ipwd'})) {
                   2117:                             if ($entries{$fields{'ipwd'}}) {
                   2118:                                 $password=$entries{$fields{'ipwd'}};
                   2119:                             }
                   2120:                         }
                   2121:                     }
1.56      matthew  2122:                     # Clean up whitespace
                   2123:                     foreach (\$domain,\$username,\$id,\$fname,\$mname,
                   2124:                              \$lname,\$gen,\$sec) {
                   2125:                         $$_ =~ s/(\s+$|^\s+)//g;
                   2126:                     }
1.84      albertel 2127:                     if ($password || $ENV{'form.login'} eq 'loc') {
1.33      matthew  2128:                         &modifystudent($domain,$username,$cid,$sec,
                   2129:                                        $desiredhost);
1.25      matthew  2130:                         my $reply=&Apache::lonnet::modifystudent
                   2131:                             ($domain,$username,$id,$amode,$password,
                   2132:                              $fname,$mname,$lname,$gen,$sec,$enddate,
1.73      www      2133:                              $startdate,$ENV{'form.forceid'},$desiredhost,
                   2134:                              $email);
1.26      matthew  2135:                         if ($reply ne 'ok') {
1.72      matthew  2136:                             $reply =~ s/^error://;
1.88      matthew  2137:                             $r->print('<br />'.
                   2138:                 &mt('<b>[_1]</b>:  Unable to enroll: [_2]',$username,$reply));
1.10      www      2139:          		} else {
1.7       www      2140:                             $count++; $flushc++;
                   2141:                             $student{$username}=1;
1.6       www      2142:                             $r->print('. ');
1.7       www      2143:                             if ($flushc>15) {
                   2144: 				$r->rflush;
                   2145:                                 $flushc=0;
                   2146:                             }
1.6       www      2147:                         }
1.25      matthew  2148:                     } else {
1.88      matthew  2149:                         $r->print('<br />'.
                   2150:       &mt('<b>[_1]</b>: Unable to enroll.  No password specified.',$username)
                   2151:                                   );
1.25      matthew  2152:                     }
                   2153:                 }
1.26      matthew  2154:             }
                   2155:         } # end of foreach (@studentdata)
1.88      matthew  2156:         $r->print("</p>\n<p>\n".&mt('Processed [_1] student(s).',$count).
                   2157:                   "</p>\n");
                   2158:         $r->print("<p>\n".
                   2159:                   &mt('If active, the new role will be available when the '.
                   2160:                   'students next log in to LON-CAPA.')."</p>\n");
1.26      matthew  2161:         #####################################
                   2162:         #           Drop students           #
                   2163:         #####################################
1.25      matthew  2164:         if ($ENV{'form.fullup'} eq 'yes') {
1.88      matthew  2165:             $r->print('<h3>'.&mt('Dropping Students')."</h3>\n");
1.26      matthew  2166:             #  Get current classlist
1.56      matthew  2167:             my ($classlist,$keylist)=&Apache::loncoursedata::get_classlist();
                   2168:             if (! defined($classlist)) {
1.88      matthew  2169:                 $r->print(&mt('There are no students currently enrolled.').
                   2170:                           "\n");
1.56      matthew  2171:             } else {
                   2172:                 # Remove the students we just added from the list of students.
1.25      matthew  2173:                 foreach (@studentdata) {
                   2174:                     my %entries=&Apache::loncommon::record_sep($_);
                   2175:                     unless (($entries{$fields{'username'}} eq '') ||
                   2176:                             (!defined($entries{$fields{'username'}}))) {
1.56      matthew  2177:                         delete($classlist->{$entries{$fields{'username'}}.
1.26      matthew  2178:                                                 ':'.$domain});
1.25      matthew  2179:                     }
                   2180:                 }
1.56      matthew  2181:                 # Print out list of dropped students.
                   2182:                 &show_drop_list($r,$classlist,$keylist,'nosort');
1.25      matthew  2183:             }
                   2184:         }
1.26      matthew  2185:     } # end of unless
1.10      www      2186: }
                   2187: 
1.11      www      2188: # ================================================================== Phase four
                   2189: sub drop_student_list {
                   2190:     my $r=shift;
                   2191:     my $count=0;
1.35      matthew  2192:     my @droplist;
                   2193:     if (ref($ENV{'form.droplist'})) {
                   2194:         @droplist = @{$ENV{'form.droplist'}};
                   2195:     } else {
                   2196:         @droplist = ($ENV{'form.droplist'});
                   2197:     }
                   2198:     foreach (@droplist) {
1.26      matthew  2199:         my ($uname,$udom)=split(/\:/,$_);
1.56      matthew  2200:         # drop student
1.35      matthew  2201:         my $result = &modifystudent($udom,$uname,$ENV{'request.course.id'});
1.37      matthew  2202:         if ($result eq 'ok' || $result eq 'ok:') {
1.88      matthew  2203:             $r->print(&mt('Dropped [_1]',$uname.'@'.$udom).'<br>');
1.59      matthew  2204:             $count++;
1.35      matthew  2205:         } else {
1.88      matthew  2206:             $r->print(
                   2207:           &mt('Error dropping [_1]:[_2]',$uname.'@'.$udom,$result).
1.35      matthew  2208:                       '<br />');
                   2209:         }
1.20      harris41 2210:     }
1.88      matthew  2211:     $r->print('<p><b>'.&mt('Dropped [_1] student(s).',$count).'</b></p>');
                   2212:     $r->print('<p>'.&mt('Re-enrollment will re-activate data.')) if ($count);
1.11      www      2213: }
                   2214: 
1.50      matthew  2215: ###################################################################
                   2216: ###################################################################
                   2217: 
                   2218: =pod
                   2219: 
                   2220: =item &handler
                   2221: 
                   2222: The typical handler you see in all these modules.  Takes $r, the
                   2223: http request, as an argument.  
                   2224: 
                   2225: The response to the request is governed by two form variables
                   2226: 
                   2227:  form.action      form.state     response
                   2228:  ---------------------------------------------------
                   2229:  undefined        undefined      print main menu
                   2230:  upload           undefined      print courselist upload menu
                   2231:  upload           got_file       deal with uploaded file,
                   2232:                                  print the upload managing menu
                   2233:  upload           enrolling      enroll students based on upload
                   2234:  drop             undefined      print the classlist ready to drop
                   2235:  drop             done           drop the selected students
1.74      matthew  2236:  enrollstudent    undefined      print student username domain form
                   2237:  enrollstudent    gotusername    print single student enroll menu
1.50      matthew  2238:  enrollstudent    enrolling      enroll student
                   2239:  classlist        undefined      print html classlist
                   2240:  classlist        csv            print csv classlist
                   2241:  modifystudent    undefined      print classlist to select student to modify
                   2242:  modifystudent    selected       print modify student menu
                   2243:  modifystudent    done           make modifications to student record
                   2244: 
                   2245: =cut
                   2246: 
                   2247: ###################################################################
                   2248: ###################################################################
1.10      www      2249: sub handler {
1.26      matthew  2250:     my $r=shift;
                   2251:     if ($r->header_only) {
1.86      www      2252:         &Apache::loncommon::content_type($r,'text/html');
1.26      matthew  2253:         $r->send_http_header;
                   2254:         return OK;
                   2255:     }
1.48      matthew  2256:     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
1.50      matthew  2257:                                             ['action','state']);
1.102     matthew  2258: 
                   2259:     &Apache::lonhtmlcommon::clear_breadcrumbs();
                   2260:     &Apache::lonhtmlcommon::add_breadcrumb
                   2261:         ({href=>"/adm/dropadd",
                   2262:           text=>"Enrollment Manager",
                   2263:           faq=>9,bug=>'Instructor Interface',});
1.26      matthew  2264:     #  Needs to be in a course
1.50      matthew  2265:     if (! (($ENV{'request.course.fn'}) &&
                   2266:           (&Apache::lonnet::allowed('cst',$ENV{'request.course.id'})))) {
                   2267:         # Not in a course, or not allowed to modify parms
                   2268:         $ENV{'user.error.msg'}=
                   2269:             "/adm/dropadd:cst:0:0:Cannot drop or add students";
                   2270:         return HTTP_NOT_ACCEPTABLE; 
                   2271:     }
                   2272:     #
                   2273:     # Only output the header information if they did not request csv format
                   2274:     #
1.102     matthew  2275:     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                   2276:                                             ['state','action']);
1.103     matthew  2277:     # Start page
                   2278:     &Apache::loncommon::content_type($r,'text/html');
                   2279:     $r->send_http_header;
                   2280:     $r->print(&header());
1.50      matthew  2281:     #
                   2282:     # Main switch on form.action and form.state, as appropriate
                   2283:     if (! exists($ENV{'form.action'})) {
1.102     matthew  2284:         $r->print(&Apache::lonhtmlcommon::breadcrumbs
                   2285:                   (undef,'Enrollment Manager'));
1.50      matthew  2286:         &print_main_menu($r);
                   2287:     } elsif ($ENV{'form.action'} eq 'upload') {
1.102     matthew  2288:         &Apache::lonhtmlcommon::add_breadcrumb
                   2289:             ({href=>'/adm/dropadd?action=upload&state=',
1.106     matthew  2290:               text=>"Upload Classlist"});
1.102     matthew  2291:         $r->print(&Apache::lonhtmlcommon::breadcrumbs
                   2292:                   (undef,'Upload Classlist'));
1.50      matthew  2293:         if (! exists($ENV{'form.state'})) {
                   2294:             &print_first_courselist_upload_form($r);            
                   2295:         } elsif ($ENV{'form.state'} eq 'got_file') {
                   2296:             &print_upload_manager_form($r);
                   2297:         } elsif ($ENV{'form.state'} eq 'enrolling') {
1.26      matthew  2298:             if ($ENV{'form.datatoken'}) {
                   2299:                 &upfile_drop_add($r);
1.50      matthew  2300:             } else {
                   2301:                 # Hmmm, this is an error
1.26      matthew  2302:             }
1.50      matthew  2303:         } else {
                   2304:             &print_first_courselist_upload_form($r);            
1.26      matthew  2305:         }
1.50      matthew  2306:     } elsif ($ENV{'form.action'} eq 'drop') {
1.102     matthew  2307:         &Apache::lonhtmlcommon::add_breadcrumb
                   2308:             ({href=>'/adm/dropadd?action=drop',
1.106     matthew  2309:               text=>"Drop Students"});
1.102     matthew  2310:         $r->print(&Apache::lonhtmlcommon::breadcrumbs
                   2311:                   (undef,'Drop Students'));
1.50      matthew  2312:         if (! exists($ENV{'form.state'})) {
1.51      matthew  2313:             &print_drop_menu($r);
1.50      matthew  2314:         } elsif ($ENV{'form.state'} eq 'done') {
1.26      matthew  2315:             &drop_student_list($r);
1.50      matthew  2316:         } else {
1.55      matthew  2317:             &print_drop_menu($r);
1.26      matthew  2318:         }
1.50      matthew  2319:     } elsif ($ENV{'form.action'} eq 'enrollstudent') {
1.102     matthew  2320:         &Apache::lonhtmlcommon::add_breadcrumb
                   2321:             ({href=>'/adm/dropadd?action=enrollstudent',
1.106     matthew  2322:               text=>"Enroll Student"});
1.102     matthew  2323:         $r->print(&Apache::lonhtmlcommon::breadcrumbs
                   2324:                   (undef,'Enroll Student'));
1.50      matthew  2325:         if (! exists($ENV{'form.state'})) {
1.74      matthew  2326:             &get_student_username_domain_form($r);
                   2327:         } elsif ($ENV{'form.state'} eq 'gotusername') {
1.50      matthew  2328:             &print_enroll_single_student_form($r);
                   2329:         } elsif ($ENV{'form.state'} eq 'enrolling') {
1.26      matthew  2330:             &enroll_single_student($r);
1.50      matthew  2331:         } else {
1.74      matthew  2332:             &get_student_username_domain_form($r);
1.26      matthew  2333:         }
1.50      matthew  2334:     } elsif ($ENV{'form.action'} eq 'classlist') {
1.102     matthew  2335:         &Apache::lonhtmlcommon::add_breadcrumb
                   2336:             ({href=>'/adm/dropadd?action=classlist',
1.106     matthew  2337:               text=>"View Classlist"});
1.102     matthew  2338:         $r->print(&Apache::lonhtmlcommon::breadcrumbs
                   2339:                   (undef,'View Classlist'));
1.50      matthew  2340:         if (! exists($ENV{'form.state'})) {
1.103     matthew  2341:             &print_html_classlist($r,undef);
1.50      matthew  2342:         } elsif ($ENV{'form.state'} eq 'csv') {
1.103     matthew  2343:             &print_html_classlist($r,'csv');
1.60      matthew  2344:         } elsif ($ENV{'form.state'} eq 'excel') {
1.103     matthew  2345:             &print_html_classlist($r,'excel');
1.50      matthew  2346:         } else {
1.103     matthew  2347:             &print_html_classlist($r,undef);
1.50      matthew  2348:         }
                   2349:     } elsif ($ENV{'form.action'} eq 'modifystudent') {
1.102     matthew  2350:         &Apache::lonhtmlcommon::add_breadcrumb
                   2351:             ({href=>'/adm/dropadd?action=modifystudent',
1.106     matthew  2352:               text=>"Modify Student Data"});
1.102     matthew  2353:         $r->print(&Apache::lonhtmlcommon::breadcrumbs
                   2354:                   (undef,'Modify Student Data'));
1.50      matthew  2355:         if (! exists($ENV{'form.state'})) {
                   2356:             &print_html_classlist($r);
                   2357:         } elsif ($ENV{'form.state'} eq 'selected') {
                   2358:             &print_modify_student_form($r);
                   2359:         } elsif ($ENV{'form.state'} eq 'done') {
                   2360:             &modify_single_student($r);
                   2361:         } else {
                   2362:             &print_html_classlist($r);
                   2363:         }        
                   2364:     } else {
                   2365:         # We should not end up here, but I guess it is possible
                   2366:         &Apache::lonnet::logthis("Undetermined state in londropadd.pm.  ".
                   2367:                                  "form.action = ".$ENV{'form.action'}.
                   2368:                                  "Someone should fix this.");
1.102     matthew  2369:         $r->print(&Apache::lonhtmlcommon::breadcrumbs
                   2370:                   (undef,'Enrollment Manager'));
1.50      matthew  2371:         &print_main_menu($r);
                   2372:     }
                   2373:     #
                   2374:     # Finish up
1.103     matthew  2375:     $r->print('</form></body></html>');
1.26      matthew  2376:     return OK;
1.1       www      2377: }
                   2378: 
1.50      matthew  2379: ###################################################################
                   2380: ###################################################################
                   2381: 
1.1       www      2382: 1;
                   2383: __END__
1.50      matthew  2384: 
1.1       www      2385: 

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