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

1.1       www         1: # The LearningOnline Network with CAPA
                      2: # Handler to drop and add students in courses 
                      3: #
1.118   ! raeburn     4: # $Id: londropadd.pm,v 1.117 2004/07/26 21:57:27 albertel 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'};
1.116     albertel  927:     $username=~s/[\W|_]//gs;
                    928:     $domain=~s/[\W|_]//gs;
1.74      matthew   929:     my $home = &Apache::lonnet::homeserver($username,$domain);
                    930:     # $new_user flags whether we are creating a new user or using an old one
                    931:     my $new_user = 1;
                    932:     if ($home ne 'no_host') {
                    933:         $new_user = 0;
                    934:     }
                    935:     #
                    936:     my $user_data_html = '';
                    937:     my $javascript_validations = '';
                    938:     if ($new_user) {
1.85      matthew   939:         my $defdom=$ENV{'course.'.$ENV{'request.course.id'}.'.domain'};
1.74      matthew   940:         # Set up authentication forms
                    941:         my ($krbdef,$krbdefdom) =
1.75      matthew   942:             &Apache::loncommon::get_kerberos_defaults($domain);
1.89      matthew   943:         $javascript_validations=&javascript_validations('auth',$krbdefdom);
1.74      matthew   944:         my %param = ( formname => 'document.studentform',
                    945:                       kerb_def_dom => $krbdefdom,
                    946:                       kerb_def_auth => $krbdef
                    947:                       );
                    948:         my $krbform = &Apache::loncommon::authform_kerberos(%param);
                    949:         my $intform = &Apache::loncommon::authform_internal(%param);
                    950:         my $locform = &Apache::loncommon::authform_local(%param);
                    951:         #
                    952:         # Set up domain selection form
                    953:         my $homeserver_form = '';
                    954:         my %servers = &Apache::loncommon::get_library_servers($domain);
                    955:         $homeserver_form = '<select name="lcserver" size="1">'."\n".
                    956:             '<option value="default" selected>default</option>'."\n";
                    957:         while (my ($servername,$serverdescription) = each (%servers)) {
                    958:             $homeserver_form .= '<option value="'.$servername.'">'.
                    959:                 $serverdescription."</option>\n";
                    960:         }
                    961:         $homeserver_form .= "</select>\n";
                    962:         #
                    963:         #
1.94      sakharuk  964: 	my %lt=&Apache::lonlocal::texthash(
                    965: 		       'udf'  => "User Data for",
                    966:                        'fn'   => "First Name",
                    967:                        'mn'   => "Middle Name",
                    968:                        'ln'   => "Last Name",
                    969:                        'gen'  => "Generation",
                    970:                        'hs'   => "Home Server",
                    971:                        'pswd' => "Password",
                    972: 		       'psam' => "Please select an authentication mechanism",
                    973: 					   );
1.74      matthew   974:         $user_data_html = <<END;
1.94      sakharuk  975: <h3>$lt{'udf'} $username\@$domain</h3>
1.74      matthew   976: <table>
1.94      sakharuk  977: <tr><th>$lt{'fn'}:</th>
1.74      matthew   978:     <td><input type="text" name="cfirst"  size="15"></td></tr>
1.94      sakharuk  979: <tr><th>$lt{'mn'}:</th>
1.74      matthew   980:     <td><input type="text" name="cmiddle" size="15"></td></tr>
1.94      sakharuk  981: <tr><th>$lt{'ln'}:</th>
1.74      matthew   982:     <td><input type="text" name="clast"   size="15"></td></tr>
1.94      sakharuk  983: <tr><th>$lt{'gen'}:</th>
1.74      matthew   984:     <td><input type="text" name="cgen"    size="5"> </td></tr>
1.94      sakharuk  985: <tr><th>$lt{'hs'}:</th>
1.74      matthew   986:     <td>$homeserver_form</td></tr>
                    987: </table>
1.94      sakharuk  988: <h3>$lt{'pswd'}</h3>
                    989: $lt{'psam'}
1.74      matthew   990: <table>
                    991: <p>
                    992: $krbform
1.75      matthew   993: <br />
1.74      matthew   994: $intform
1.75      matthew   995: <br />
1.74      matthew   996: $locform
                    997: </p>
                    998: END
                    999:     } else {
                   1000:         # User already exists.  Do not worry about authentication
                   1001:         my %uenv = &Apache::lonnet::dump('environment',$domain,$username);
1.89      matthew  1002:         $javascript_validations = &javascript_validations('noauth');
1.94      sakharuk 1003: 	my %lt=&Apache::lonlocal::texthash(
                   1004: 		       'udf'  => "User Data for",
                   1005:                        'fn'   => "First Name",
                   1006:                        'mn'   => "Middle Name",
                   1007:                        'ln'   => "Last Name",
                   1008:                        'gen'  => "Generation",
                   1009: 					   );
1.74      matthew  1010:         $user_data_html = <<END;
1.94      sakharuk 1011: <h3>$lt{'udf'} $username\@$domain</h3>
1.74      matthew  1012: <input type="hidden" name="lcserver" value="default" />
                   1013: <table>
1.94      sakharuk 1014: <tr><th>$lt{'fn'}:</th>
1.74      matthew  1015:     <td>
                   1016:     <input type="text" name="cfirst" value="$uenv{'firstname'}" size="15" />
                   1017:     </td></tr>
1.94      sakharuk 1018: <tr><th>$lt{'mn'}:</th>
1.74      matthew  1019:     <td>
                   1020:     <input type="text" name="cmiddle" value="$uenv{'middlename'}" size="15" />
                   1021:     </td></tr>
1.94      sakharuk 1022: <tr><th>$lt{'ln'}:</th>
1.74      matthew  1023:     <td>
                   1024:     <input type="text" name="clast"value="$uenv{'lastname'}" size="15" />
                   1025:     </td></tr>
1.94      sakharuk 1026: <tr><th>$lt{'gen'}:</th>
1.74      matthew  1027:     <td>
                   1028:     <input type="text" name="cgen" value="$uenv{'generation'}" size="5" />
                   1029:     </td></tr>
                   1030: </table>
                   1031: END
                   1032:     }
1.68      matthew  1033:     my $date_table = &date_setting_table();
1.74      matthew  1034:         # Print it all out
1.94      sakharuk 1035:     my %lt=&Apache::lonlocal::texthash(
                   1036: 		   'cd'   => "Course Data",
                   1037:                    'gs'   => "Group/Section",
                   1038:                    'idsn' => "ID/Student Number",
                   1039:                    'disn' => "Disable ID/Student Number Safeguard and Force Change of Conflicting IDs (only do if you know what you are doing)",
                   1040:                    'eas'  => "Enroll as student",
                   1041: 				       );
1.50      matthew  1042:     $r->print(<<END);
1.74      matthew  1043: <input type="hidden" name="action" value="enrollstudent" />
                   1044: <input type="hidden" name="state"  value="done" />
                   1045: <input type="hidden" name="cuname" value="$username" />
                   1046: <input type="hidden" name="lcdomain" value="$domain" />
1.28      matthew  1047: <script type="text/javascript" language="Javascript">
1.12      www      1048: function verify(vf) {
                   1049:     var founduname=0;
                   1050:     var foundpwd=0;
                   1051:     var foundname=0;
                   1052:     var foundid=0;
                   1053:     var foundsec=0;
                   1054:     var tw;
1.26      matthew  1055:     if ((typeof(vf.cuname.value) !="undefined") && (vf.cuname.value!='') && 
1.31      matthew  1056: 	(typeof(vf.lcdomain.value)!="undefined") && (vf.lcdomain.value!='')) {
1.12      www      1057:         founduname=1;
                   1058:     }
1.14      harris41 1059:     if ((typeof(vf.cfirst.value)!="undefined") && (vf.cfirst.value!='') &&
1.26      matthew  1060: 	(typeof(vf.clast.value) !="undefined") && (vf.clast.value!='')) {
1.12      www      1061:         foundname=1;
                   1062:     }
1.14      harris41 1063:     if ((typeof(vf.csec.value)!="undefined") && (vf.csec.value!='')) {
1.12      www      1064:         foundsec=1;
                   1065:     }
1.14      harris41 1066:     if ((typeof(vf.cstid.value)!="undefined") && (vf.cstid.value!='')) {
1.12      www      1067: 	foundid=1;
                   1068:     }
                   1069:     if (founduname==0) {
                   1070: 	alert('You need to specify at least the username and domain fields');
                   1071:         return;
                   1072:     }
1.24      albertel 1073:     verify_message(vf,founduname,foundpwd,foundname,foundid,foundsec);
1.12      www      1074: }
                   1075: 
1.24      albertel 1076: $javascript_validations
1.12      www      1077: 
1.24      albertel 1078: function clearpwd(vf) {
                   1079:     //nothing else needs clearing
1.15      albertel 1080: }
                   1081: 
1.12      www      1082: </script>
1.11      www      1083: 
1.74      matthew  1084: $user_data_html
1.50      matthew  1085: 
1.94      sakharuk 1086: <h3>$lt{'cd'}</h3>
1.50      matthew  1087: 
1.94      sakharuk 1088: <p>$lt{'gs'}: <input type="text" name="csec" size="5" />
1.50      matthew  1089: <p>
1.68      matthew  1090: $date_table
1.50      matthew  1091: </p>
1.94      sakharuk 1092: <h3>$lt{'idsn'}</h3>
1.50      matthew  1093: <p>
1.94      sakharuk 1094: $lt{'idsn'}: <input type="text" name="cstid" size="10">
1.26      matthew  1095: </p><p>
                   1096: <input type="checkbox" name="forceid" value="yes"> 
1.94      sakharuk 1097: $lt{'disn'}
1.50      matthew  1098: </p><p>
1.94      sakharuk 1099: <input type="button" onClick="verify(this.form)" value="$lt{'eas'}">
1.26      matthew  1100: </p>
1.50      matthew  1101: END
                   1102:     return;
1.10      www      1103: }
                   1104: 
                   1105: # ========================================================= Menu Phase Two Drop
1.51      matthew  1106: sub print_drop_menu {
1.10      www      1107:     my $r=shift;
1.92      sakharuk 1108:     $r->print("<h3>".&mt('Drop Students')."</h3>");
1.11      www      1109:     my $cid=$ENV{'request.course.id'};
1.56      matthew  1110:     my ($classlist,$keylist) = &Apache::loncoursedata::get_classlist();
                   1111:     if (! defined($classlist)) {
1.94      sakharuk 1112:         $r->print(&mt('There are no students currently enrolled.')."\n");
1.51      matthew  1113:         return;
1.25      matthew  1114:     }
1.51      matthew  1115:     # Print out the available choices
1.56      matthew  1116:     &show_drop_list($r,$classlist,$keylist);
1.51      matthew  1117:     return;
1.11      www      1118: }
                   1119: 
1.40      matthew  1120: # ============================================== view classlist
1.50      matthew  1121: sub print_html_classlist {
1.103     matthew  1122:     my ($r,$mode) = @_;
1.57      matthew  1123:     if (! exists($ENV{'form.sortby'})) {
                   1124:         $ENV{'form.sortby'} = 'username';
                   1125:     }
1.59      matthew  1126:     if ($ENV{'form.Status'} !~ /^(Any|Expired|Active)$/) {
1.57      matthew  1127:         $ENV{'form.Status'} = 'Active';
                   1128:     }
                   1129:     my $status_select = &Apache::lonhtmlcommon::StatusOptions
1.103     matthew  1130:         ($ENV{'form.Status'});
1.100     www      1131:     my $cid=$ENV{'request.course.id'};
                   1132:     my $cdom=$ENV{'course.'.$cid.'.domain'};
                   1133:     my $cnum=$ENV{'course.'.$cid.'.num'};
1.103     matthew  1134:     #
                   1135:     # List course personnel
1.100     www      1136:     my %coursepersonnel=&Apache::lonnet::get_course_adv_roles($cdom.'/'.$cnum);
1.110     matthew  1137:     #
                   1138:     if (! defined($ENV{'form.output'}) ||
                   1139:         $ENV{'form.output'} !~ /^(csv|excel|html)$/ ) {
                   1140:         $ENV{'form.output'} = 'html';
                   1141:     }
                   1142:     #
1.103     matthew  1143:     $r->print('<br /><table border="2">');
1.110     matthew  1144:     foreach my $role (sort keys %coursepersonnel) {
                   1145:         next if ($role =~ /^\s*$/);
                   1146: 	$r->print('<tr><td>'.$role.'</td><td>');
                   1147:         foreach my $user (split(',',$coursepersonnel{$role})) {
                   1148: 	    my ($puname,$pudom)=split(':',$user);
1.100     www      1149: 	    $r->print(' '.&Apache::loncommon::aboutmewrapper(
1.110     matthew  1150:                                     &Apache::loncommon::plainname($puname,
                   1151:                                                                   $pudom),
                   1152:                                                              $puname,$pudom));
1.100     www      1153: 	}
                   1154:         $r->print('</td></tr>');
                   1155:     }
                   1156:     $r->print('</table>');
1.103     matthew  1157:     #
                   1158:     # Interface output
                   1159:     $r->print('<input type="hidden" name="action" value="'.
                   1160:               $ENV{'form.action'}.'" />');
                   1161:     $r->print("<p>\n");
1.59      matthew  1162:     if ($ENV{'form.action'} ne 'modifystudent') {
1.103     matthew  1163: 	my %lt=&Apache::lonlocal::texthash('csv' => "CSV",
                   1164:                                            'excel' => "Excel",
                   1165:                                            'html'  => 'HTML');
1.110     matthew  1166:         my $output_selector = '<select size="1" name="output" >';
1.103     matthew  1167:         foreach my $outputformat ('html','csv','excel') {
                   1168:             my $option = '<option value="'.$outputformat.'" ';
1.110     matthew  1169:             if ($outputformat eq $ENV{'form.output'}) {
1.104     matthew  1170:                 $option .= 'selected ';
1.103     matthew  1171:             }
                   1172:             $option .='>'.$lt{$outputformat}.'</option>';
                   1173:             $output_selector .= "\n".$option;
                   1174:         }
                   1175:         $output_selector .= '</select>';
                   1176:         $r->print(&mt('Output Format: [_1]',$output_selector).('&nbsp;'x3));
1.59      matthew  1177:     }
1.103     matthew  1178:     $r->print(&mt('Student Status: [_1]',$status_select)."\n");
1.105     matthew  1179:     $r->print('<input type="submit" value="'.&mt('Update Display').'" />'.
                   1180:               "\n</p>\n");
1.103     matthew  1181:     #
                   1182:     # Print the classlist
                   1183:     $r->print('<h2>'.&mt('Current Class List').'</h2>');
1.56      matthew  1184:     my ($classlist,$keylist)=&Apache::loncoursedata::get_classlist();
                   1185:     if (! defined($classlist)) {
1.94      sakharuk 1186:         $r->print(&mt('There are no students currently enrolled.')."\n");
1.40      matthew  1187:     } else {
                   1188:         # Print out the available choices
1.50      matthew  1189:         if ($ENV{'form.action'} eq 'modifystudent') {
1.110     matthew  1190:             &show_class_list($r,'view','modify',
1.57      matthew  1191:                              $ENV{'form.Status'},$classlist,$keylist);
1.110     matthew  1192:         } else {
                   1193:             &show_class_list($r,$ENV{'form.output'},'aboutme',
1.103     matthew  1194:                              $ENV{'form.Status'},$classlist,$keylist);
1.50      matthew  1195:         }
1.41      matthew  1196:     }
                   1197: }
                   1198: 
1.40      matthew  1199: # =================================================== Show student list to drop
                   1200: sub show_class_list {
1.110     matthew  1201:     my ($r,$mode,$linkto,$statusmode,$classlist,$keylist)=@_;
1.40      matthew  1202:     my $cid=$ENV{'request.course.id'};
1.60      matthew  1203:     #
                   1204:     # Variables for excel output
1.104     matthew  1205:     my ($excel_workbook, $excel_sheet, $excel_filename,$row,$format);
1.60      matthew  1206:     #
1.103     matthew  1207:     # Variables for csv output
                   1208:     my ($CSVfile,$CSVfilename);
                   1209:     #
1.53      matthew  1210:     my $sortby = $ENV{'form.sortby'};
1.114     raeburn  1211:     if ($sortby !~ /^(username|domain|section|fullname|id|start|end|type)$/) {
1.53      matthew  1212:         $sortby = 'username';
                   1213:     }
1.42      matthew  1214:     # Print out header 
1.114     raeburn  1215:     unless ($mode eq 'autoenroll') {
                   1216:         $r->print(<<END);
                   1217: <input type="hidden" name="state" value="$ENV{'form.state'}" />
                   1218: END
                   1219:     }
1.103     matthew  1220:     $r->print(<<END);
                   1221: <input type="hidden" name="sortby" value="$sortby" />
                   1222: END
1.114     raeburn  1223:     if ($mode eq 'html' || $mode eq 'view' || $mode eq 'autoenroll') {
1.50      matthew  1224:         if ($linkto eq 'aboutme') {
1.94      sakharuk 1225:             $r->print(&mt('Select a user name to view the users personal page.'));
1.50      matthew  1226:         } elsif ($linkto eq 'modify') {
1.94      sakharuk 1227:             $r->print(&mt('Select a user name to modify the students information'));
1.50      matthew  1228:         }
1.94      sakharuk 1229: 	my %lt=&Apache::lonlocal::texthash(
1.110     matthew  1230:                                            'usrn'   => "username",
                   1231:                                            'dom'    => "domain",
                   1232:                                            'sn'     => "student name",
                   1233:                                            'sec'    => "section",
                   1234:                                            'start'  => "start date",
                   1235:                                            'end'    => "end date",
1.115     raeburn  1236:                                            'type'   => "enroll type/action"
1.94      sakharuk 1237: 					   );
1.114     raeburn  1238:         unless ($mode eq 'autoenroll') {
                   1239:             $r->print(<<END);
1.59      matthew  1240: <input type="hidden" name="sname"  value="" />
                   1241: <input type="hidden" name="sdom"   value="" />
1.114     raeburn  1242: END
                   1243:         }
1.115     raeburn  1244:         $r->print("
1.40      matthew  1245: <p>
                   1246: <table border=2>
1.115     raeburn  1247: <tr>
                   1248:         ");
                   1249:         if ($mode eq 'autoenroll') {
                   1250:             $r->print("
                   1251:  <th><a href=\"javascript:document.studentform.sortby.value='type';document.studentform.submit();\">$lt{'type'}</a></th>
                   1252:             ");
                   1253:         } else {
                   1254:             $r->print("
                   1255: <th>Count</th>
                   1256:             ");
                   1257:         }
                   1258:         $r->print(<<END);
                   1259:     <th>
1.94      sakharuk 1260:        <a href="javascript:document.studentform.sortby.value='username';document.studentform.submit();">$lt{'usrn'}</a>
1.53      matthew  1261:     </th><th>
1.94      sakharuk 1262:        <a href="javascript:document.studentform.sortby.value='domain';document.studentform.submit();">$lt{'dom'}</a>
1.53      matthew  1263:     </th><th>
1.57      matthew  1264:        <a href="javascript:document.studentform.sortby.value='id';document.studentform.submit();">ID</a>
1.53      matthew  1265:     </th><th>
1.94      sakharuk 1266:        <a href="javascript:document.studentform.sortby.value='fullname';document.studentform.submit();">$lt{'sn'}</a>
1.53      matthew  1267:     </th><th>
1.94      sakharuk 1268:        <a href="javascript:document.studentform.sortby.value='section';document.studentform.submit();">$lt{'sec'}</a>
1.110     matthew  1269:     </th><th>
                   1270:        <a href="javascript:document.studentform.sortby.value='start';document.studentform.submit();">$lt{'start'}</a>
                   1271:     </th><th>
                   1272:        <a href="javascript:document.studentform.sortby.value='end';document.studentform.submit();">$lt{'end'}</a>
1.53      matthew  1273:     </th>
1.115     raeburn  1274:   </tr>
1.40      matthew  1275: END
1.41      matthew  1276:     } elsif ($mode eq 'csv') {
1.103     matthew  1277: 	#
                   1278: 	# Open a file
                   1279: 	$CSVfilename = '/prtspool/'.
                   1280: 	    $ENV{'user.name'}.'_'.$ENV{'user.domain'}.'_'.
                   1281:             time.'_'.rand(1000000000).'.csv';
                   1282: 	unless ($CSVfile = Apache::File->new('>/home/httpd'.$CSVfilename)) {
                   1283: 	    $r->log_error("Couldn't open $CSVfilename for output $!");
                   1284: 	    $r->print("Problems occured in writing the csv file.  ".
                   1285: 		      "This error has been logged.  ".
                   1286: 		      "Please alert your LON-CAPA administrator.");
                   1287: 	    $CSVfile = undef;
                   1288: 	}
                   1289: 	#
                   1290: 	# Write headers and data to file
1.58      matthew  1291:         if($statusmode eq 'Expired') {
1.103     matthew  1292:             print $CSVfile '"'.&mt('Students with expired roles').'"'."\n";
1.58      matthew  1293:         }
                   1294:         if ($statusmode eq 'Any') {
1.103     matthew  1295:             print $CSVfile '"'.join('","',map {
                   1296: 		&Apache::loncommon::csv_translate(&mt($_))
                   1297:                 } ("username","domain","ID","student name",
1.110     matthew  1298:                    "section","start date","end date","status")).'"'."\n";
1.58      matthew  1299:         } else {
1.103     matthew  1300:             print $CSVfile '"'.join('","',map {
                   1301: 		&Apache::loncommon::csv_translate(&mt($_))
                   1302:                 } ("username","domain","ID","student name",
1.110     matthew  1303:                    "section","start date","end date")).'"'."\n";
1.58      matthew  1304:         }
1.60      matthew  1305:     } elsif ($mode eq 'excel') {
                   1306:         # Create the excel spreadsheet
                   1307:         $excel_filename = '/prtspool/'.
                   1308:             $ENV{'user.name'}.'_'.$ENV{'user.domain'}.'_'.
                   1309:                 time.'_'.rand(1000000000).'.xls';
                   1310:         $excel_workbook = Spreadsheet::WriteExcel->new('/home/httpd'.
                   1311:                                                        $excel_filename);
                   1312:         $excel_workbook->set_tempdir('/home/httpd/perl/tmp');
1.104     matthew  1313:         #
                   1314:         $format = &Apache::loncommon::define_excel_formats($excel_workbook);
1.60      matthew  1315:         $excel_sheet = $excel_workbook->addworksheet('classlist');
                   1316:         #
1.76      albertel 1317:         my $description = 'Class List for '.
1.60      matthew  1318:             $ENV{'course.'.$ENV{'request.course.id'}.'.description'};
1.104     matthew  1319:         $excel_sheet->write($row++,0,$description,$format->{'h1'});
1.60      matthew  1320:         #
                   1321:         $excel_sheet->write($row++,0,["username","domain","ID",
1.110     matthew  1322:                                       "student name","section",
                   1323:                                       "start date","end date","status"],
                   1324:                             $format->{'bold'});
1.41      matthew  1325:     }
1.56      matthew  1326:     #
                   1327:     # Sort the students
                   1328:     my %index;
                   1329:     my $i;
                   1330:     foreach (@$keylist) {
                   1331:         $index{$_} = $i++;
                   1332:     }
                   1333:     my $index  = $index{$sortby};
                   1334:     my $second = $index{'username'};
                   1335:     my $third  = $index{'domain'};
1.53      matthew  1336:     my @Sorted_Students = sort {
1.56      matthew  1337:         lc($classlist->{$a}->[$index])  cmp lc($classlist->{$b}->[$index])
                   1338:             ||
                   1339:         lc($classlist->{$a}->[$second]) cmp lc($classlist->{$b}->[$second])
                   1340:             ||
                   1341:         lc($classlist->{$a}->[$third]) cmp lc($classlist->{$b}->[$third])
                   1342:         } (keys(%$classlist));
1.108     matthew  1343:     my $studentcount = 0;
1.115     raeburn  1344:     my $autocount = 0;
                   1345:     my $manualcount = 0;
                   1346:     my $unlockcount = 0;
                   1347:     my $lockcount = 0;
1.53      matthew  1348:     foreach my $student (@Sorted_Students) {
1.110     matthew  1349:         my $sdata = $classlist->{$student};
                   1350:         my $username = $sdata->[$index{'username'}];
                   1351:         my $domain   = $sdata->[$index{'domain'}];
                   1352:         my $section  = $sdata->[$index{'section'}];
                   1353:         my $name     = $sdata->[$index{'fullname'}];
                   1354:         my $id       = $sdata->[$index{'id'}];
                   1355:         my $status   = $sdata->[$index{'status'}];
                   1356:         my $start    = $sdata->[$index{'start'}];
                   1357:         my $end      = $sdata->[$index{'end'}];
1.115     raeburn  1358:         my $type     = $sdata->[$index{'type'}];
1.57      matthew  1359:         next if (($statusmode ne 'Any') && ($status ne $statusmode));
1.114     raeburn  1360:         if ($mode eq 'view' || $mode eq 'html' || $mode eq 'autoenroll') {
                   1361:             if (! defined($start) || $start == 0) {
                   1362:                 $start = &mt('none');
                   1363:             } else {
                   1364:                 $start = &Apache::lonlocal::locallocaltime($start);
                   1365:             }
                   1366:             if (! defined($end) || $end == 0) {
                   1367:                 $end = &mt('none');
                   1368:             } else {
                   1369:                 $end = &Apache::lonlocal::locallocaltime($end);
                   1370:             }
1.115     raeburn  1371:             $r->print("<tr>\n    ");
                   1372:             if ($mode eq 'autoenroll') {
                   1373:                 my $lockedtype = $sdata->[$index{'lockedtype'}];
                   1374:                 $studentcount++;
                   1375:                 my $cellentry;
                   1376:                 if ($type eq 'auto') {
                   1377:                     $cellentry = '<b>'.&mt('auto').'</b>&nbsp;<input type="checkbox" name="chgauto" value="'.$username.':'.$domain.'" />&nbsp;Change';
                   1378:                     $autocount ++;
                   1379:                 } else {
1.118   ! raeburn  1380:                     $cellentry = '<table border="0" cellspacing="0"><tr><td rowspan="2"><b>'.&mt('manual').'</b></td><td><nobr><input type="checkbox" name="chgmanual" value="'.$username.':'.$domain.'" />&nbsp;Change</nobr></td></tr><tr><td><nobr>';
1.115     raeburn  1381:                     $manualcount ++;
                   1382:                     if ($lockedtype) {
                   1383:                         $cellentry .= '<input type="checkbox" name="unlockchg" value="'.$username.':'.$domain.'" />&nbsp;'.&mt('Unlock');
                   1384:                         $unlockcount ++;
                   1385:                     } else {
                   1386:                         $cellentry .= '<input type="checkbox" name="lockchg" value="'.$username.':'.$domain.'" />&nbsp;'.&mt('Lock');
                   1387:                         $lockcount ++;
                   1388:                     }
1.118   ! raeburn  1389:                     $cellentry .= '</nobr></td></tr></table>';
1.115     raeburn  1390:                 }
                   1391:                 $r->print("<td>$cellentry<td>\n    ");
                   1392:             } else {
                   1393:                 $r->print("<td>".(++$studentcount)."</td><td>\n    ");
                   1394:             }
1.51      matthew  1395:             if ($linkto eq 'nothing') {
                   1396:                 $r->print($username);
                   1397:             } elsif ($linkto eq 'aboutme') {
                   1398:                 $r->print(&Apache::loncommon::aboutmewrapper($username,
                   1399:                                                              $username,
                   1400:                                                              $domain));
                   1401:             } elsif ($linkto eq 'modify') {
1.59      matthew  1402:                 $r->print('<a href="'.
                   1403:                           "javascript:document.studentform.sname.value='".
                   1404:                           $username.
                   1405:                           "';document.studentform.sdom.value='".$domain.
                   1406:                           "';document.studentform.state.value='selected".
                   1407:                           "';document.studentform.submit();".'">'.
1.53      matthew  1408:                           $username."</a>\n");
1.50      matthew  1409:             }
1.51      matthew  1410:             $r->print(<<"END");
1.50      matthew  1411:     </td>
1.51      matthew  1412:     <td>$domain</td>
                   1413:     <td>$id</td>
                   1414:     <td>$name</td>
                   1415:     <td>$section</td>
1.110     matthew  1416:     <td>$start</td>
                   1417:     <td>$end</td>
1.115     raeburn  1418:    </tr>
1.114     raeburn  1419: END
1.51      matthew  1420:         } elsif ($mode eq 'csv') {
1.103     matthew  1421:             next if (! defined($CSVfile));
1.51      matthew  1422:             # no need to bother with $linkto
1.114     raeburn  1423:             if (! defined($start) || $start == 0) {
                   1424:                 $start = &mt('none');
                   1425:             } else {
                   1426:                 $start = &Apache::lonlocal::locallocaltime($start);
                   1427:             }
                   1428:             if (! defined($end) || $end == 0) {
                   1429:                 $end = &mt('none');
                   1430:             } else {
                   1431:                 $end = &Apache::lonlocal::locallocaltime($end);
                   1432:             }
1.51      matthew  1433:             my @line = ();
1.110     matthew  1434:             foreach ($username,$domain,$id,$name,$section,$start,$end) {
1.51      matthew  1435:                 push @line,&Apache::loncommon::csv_translate($_);
1.58      matthew  1436:             }
                   1437:             if ($statusmode eq 'Any') {
                   1438:                 push @line,&Apache::loncommon::csv_translate($status);
1.41      matthew  1439:             }
1.103     matthew  1440:             print $CSVfile '"'.join('","',@line).'"'."\n";
1.60      matthew  1441:         } elsif ($mode eq 'excel') {
1.110     matthew  1442:             $excel_sheet->write($row,0,[$username,$domain,$id,
                   1443:                                           $name,$section]);
                   1444:             my $col = 5;
                   1445:             foreach my $time ($start,$end) {
                   1446:                 $excel_sheet->write($row,$col++,
                   1447:                                    &Apache::lonstathelpers::calc_serial($time),
                   1448:                                     $format->{'date'});
                   1449:             }
                   1450:             $excel_sheet->write($row,$col++,$status);
                   1451:             $row++;
1.40      matthew  1452:         }
                   1453:     }
1.114     raeburn  1454:     if ($mode eq 'view' || $mode eq 'html' || $mode eq 'autoenroll') {
1.60      matthew  1455:         $r->print('</table><br>');
                   1456:     } elsif ($mode eq 'excel') {
                   1457:         $excel_workbook->close();
                   1458:         $r->print('<p><a href="'.$excel_filename.'">'.
1.94      sakharuk 1459:                   &mt('Your Excel spreadsheet').'</a> '.&mt('is ready for download').'.</p>'."\n");
1.103     matthew  1460:     } elsif ($mode eq 'csv') {
                   1461:         close($CSVfile);
                   1462:         $r->print('<a href="'.$CSVfilename.'">'.
                   1463:                   &mt('Your CSV file').'</a> is ready for download.'.
                   1464:                   "\n");
                   1465:         $r->rflush();
1.60      matthew  1466:     }
1.114     raeburn  1467:     if ($mode eq 'autoenroll') {
1.115     raeburn  1468:         return ($studentcount,$autocount,$manualcount,$lockcount,$unlockcount);
1.114     raeburn  1469:     }
1.115     raeburn  1470:     return;
1.40      matthew  1471: }
                   1472: 
1.50      matthew  1473: 
                   1474: #
                   1475: # print out form for modification of a single students data
                   1476: #
                   1477: sub print_modify_student_form {
                   1478:     my $r = shift();
                   1479:     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
1.59      matthew  1480:                                             ['sdom','sname']);    
1.53      matthew  1481:     my $sname  = $ENV{'form.sname'};
                   1482:     my $sdom   = $ENV{'form.sdom'};
                   1483:     my $sortby = $ENV{'form.sortby'};
1.50      matthew  1484:     # determine the students name information
                   1485:     my %info=&Apache::lonnet::get('environment',
                   1486:                                   ['firstname','middlename',
1.52      matthew  1487:                                    'lastname','generation','id'],
1.50      matthew  1488:                                   $sdom, $sname);
                   1489:     my ($tmp) = keys(%info);
                   1490:     if ($tmp =~ /^(con_lost|error|no_such_host)/i) {
1.94      sakharuk 1491:         $r->print('<font color="#ff0000" size="+2">'.&mt('Error').'</font>'.
1.50      matthew  1492:                   '<p>'.
1.94      sakharuk 1493:                   &mt('Unable to retrieve environment data for').' '.$sname.
                   1494:                   &mt('in domain').' '.$sdom.'</p><p>'.
                   1495:                   &mt('Please contact your LON-CAPA administrator regarding this situation.').'</p></body></html>');
1.50      matthew  1496:         return;
                   1497:     }
                   1498:     # determine the students starting and ending times and section
                   1499:     my ($starttime,$endtime,$section) = &get_enrollment_data($sname,$sdom);
1.87      matthew  1500:     if ($starttime =~ /^error/) {
1.94      sakharuk 1501:         $r->print('<h2>'&mt('Error').'</h2>');
1.87      matthew  1502:         $r->print('<p>'.$starttime.'</p>');
                   1503:         return;
                   1504:     }
1.101     matthew  1505:     #
1.50      matthew  1506:     # Deal with date forms
1.101     matthew  1507:     my $current_date_description = '';
                   1508:     my $textdate = '';
                   1509: 
                   1510:     if (! defined($starttime) || $starttime == 0) {
                   1511:         $current_date_description = &mt('Current Starting Date: not set').
                   1512:             '<br />';
                   1513:     } else {
                   1514:         $current_date_description = 
                   1515:             &mt('Current Starting Date: [_1]',
                   1516:                 &Apache::lonlocal::locallocaltime($starttime)).'<br />';
                   1517:     }
                   1518:     if (! defined($endtime) || $endtime == 0) {
                   1519:         $current_date_description.= &mt('Current Ending Date: not set').
                   1520:             '<br />';
                   1521:     } else {
                   1522:         $current_date_description.= 
                   1523:             &mt('Current Ending Date: [_1]',
                   1524:                 &Apache::lonlocal::locallocaltime($endtime)).'<br />';
                   1525: 
                   1526:     }
1.68      matthew  1527:     my $date_table = &date_setting_table($starttime,$endtime);
1.59      matthew  1528:     #
                   1529:     if (! exists($ENV{'form.Status'}) || 
                   1530:         $ENV{'form.Status'} !~ /^(Any|Expired|Active)$/) {
                   1531:         $ENV{'form.Status'} = 'crap';
                   1532:     }
1.94      sakharuk 1533:     # Make sure student is enrolled in course
                   1534:     my %lt=&Apache::lonlocal::texthash(
                   1535: 	           'mef'   => "Modify Enrollment for",
                   1536:                    'odcc'  => "Only domain coordinators can change a users password.",
                   1537:                    'sn'    => "Student Name",
                   1538:                    'fn'    => "First",
                   1539:                    'mn'    => "Middle",
                   1540:                    'ln'    => "Last",
                   1541:                    'gen'   => "Generation",
                   1542:                    'sid'   => "Student ID",
                   1543:                    'disn'  => "Disable ID/Student Number Safeguard and Force Change of Conflicting IDs (only do if you know what you are doing)",
                   1544:                    'sec'   => "Section",
                   1545:                    'sm'    => "Submit Modifications",
                   1546: 				       );
1.50      matthew  1547:     $r->print(<<END);
1.52      matthew  1548: <p>
                   1549: <font size="+1">
1.94      sakharuk 1550: $lt{'odcc'}
1.52      matthew  1551: </font>
                   1552: </p>
1.50      matthew  1553: <input type="hidden" name="slogin"  value="$sname"  />
                   1554: <input type="hidden" name="sdomain" value="$sdom" />
                   1555: <input type="hidden" name="action"  value="modifystudent" />
1.53      matthew  1556: <input type="hidden" name="state"   value="done" />
                   1557: <input type="hidden" name="sortby"  value="$sortby" />
1.59      matthew  1558: <input type="hidden" name="Status"  value="$ENV{'form.Status'}" />
1.94      sakharuk 1559: <h2>$lt{'mef'} $info{'firstname'} $info{'middlename'} 
1.50      matthew  1560: $info{'lastname'} $info{'generation'}, $sname\@$sdom</h2>
                   1561: <p>
1.94      sakharuk 1562: <b>$lt{'sn'}</b>
1.50      matthew  1563: <table>
1.94      sakharuk 1564: <tr><th>$lt{'fn'}</th><th>$lt{'mn'}</th><th>$lt{'ln'}</th><th>$lt{'gen'}</th></tr>
1.50      matthew  1565: <tr><td>
                   1566: <input type="text" name="firstname"  value="$info{'firstname'}"  /></td><td>
                   1567: <input type="text" name="middlename" value="$info{'middlename'}" /></td><td>
                   1568: <input type="text" name="lastname"   value="$info{'lastname'}"   /></td><td>
                   1569: <input type="text" name="generation" value="$info{'generation'}" /></td></tr>
                   1570: </table>
                   1571: </p><p>
1.94      sakharuk 1572: <b>$lt{'sid'}</b>: <input type="text" name="id" value="$info{'id'}" size="12"/>
1.52      matthew  1573: </p><p>
1.53      matthew  1574: <input type="checkbox" name="forceid" > 
1.94      sakharuk 1575: $lt{'disn'}
1.53      matthew  1576: </p><p>
1.101     matthew  1577: <b>$lt{'sec'}</b>: <input type="text" name="section" value="$section" size="14"/>
1.50      matthew  1578: </p>
1.101     matthew  1579: <p>$current_date_description</p>
1.68      matthew  1580: <p>$date_table</p>
1.94      sakharuk 1581: <input type="submit" value="$lt{'sm'}" />
1.50      matthew  1582: </body></html>
                   1583: END
                   1584:     return;
                   1585: }
                   1586: 
                   1587: #
                   1588: # modify a single students section 
                   1589: #
                   1590: sub modify_single_student {
                   1591:     my $r = shift;
1.68      matthew  1592:     #
1.80      matthew  1593:     # Remove non alphanumeric values from the section
                   1594:     $ENV{'form.section'} =~ s/\W//g;
1.77      matthew  1595:     #
1.68      matthew  1596:     # Do the date defaults first
                   1597:     my ($starttime,$endtime) = &get_dates_from_form();
                   1598:     if ($ENV{'form.makedatesdefault'}) {
                   1599:         $r->print(&make_dates_default($starttime,$endtime));
                   1600:     }
1.59      matthew  1601:     # Get the 'sortby' and 'Status' variables so the user goes back to their
                   1602:     # previous screen
1.53      matthew  1603:     my $sortby = $ENV{'form.sortby'};
1.59      matthew  1604:     my $status = $ENV{'form.Status'};
1.53      matthew  1605:     #
                   1606:     # We always need this information
                   1607:     my $slogin     = $ENV{'form.slogin'};
                   1608:     my $sdom       = $ENV{'form.sdomain'};
                   1609:     #
                   1610:     # Get the old data
                   1611:     my %old=&Apache::lonnet::get('environment',
                   1612:                                  ['firstname','middlename',
                   1613:                                   'lastname','generation','id'],
                   1614:                                  $sdom, $slogin);
1.59      matthew  1615:     $old{'section'} = &Apache::lonnet::getsection($sdom,$slogin,
                   1616:                                                   $ENV{'request.course.id'});
1.53      matthew  1617:     my ($tmp) = keys(%old);
                   1618:     if ($tmp =~ /^(con_lost|error|no_such_host)/i) {
1.94      sakharuk 1619:         $r->print(&mt('There was an error determining the environment values for')." $slogin \@ $sdom.");
1.53      matthew  1620:         return;
                   1621:     }
                   1622:     undef $tmp;
                   1623:     #
                   1624:     # Get the new data
1.50      matthew  1625:     my $firstname  = $ENV{'form.firstname'};
                   1626:     my $middlename = $ENV{'form.middlename'};
                   1627:     my $lastname   = $ENV{'form.lastname'};
                   1628:     my $generation = $ENV{'form.generation'};
                   1629:     my $section    = $ENV{'form.section'};
                   1630:     my $courseid   = $ENV{'request.course.id'};
1.52      matthew  1631:     my $sid        = $ENV{'form.id'};
1.50      matthew  1632:     my $displayable_starttime = localtime($starttime);
                   1633:     my $displayable_endtime   = localtime($endtime);
1.53      matthew  1634:     # 
                   1635:     # check for forceid override
1.63      matthew  1636:     if ((defined($old{'id'})) && ($old{'id'} ne '') && 
                   1637:         ($sid ne $old{'id'}) && (! exists($ENV{'form.forceid'}))) {
1.94      sakharuk 1638:         $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  1639:         $sid = $old{'id'};
                   1640:     }
                   1641:     #
1.50      matthew  1642:     # talk to the user about what we are going to do
1.94      sakharuk 1643:     my %lt=&Apache::lonlocal::texthash(
                   1644: 	           'mdu'   => "Modifying data for user",
                   1645:                    'si'    => "Student Information",
                   1646:                    'fd'    => "Field",
                   1647:                    'ov'    => "Old Value",
                   1648:                    'nv'    => "New Value",
                   1649:                    'fn'    => "First name",
                   1650:                    'mn'    => "Middle name",
                   1651:                    'ln'    => "Last name",
                   1652:                    'gen'   => "Generation",
                   1653:                    'sec'   => "Section",
                   1654:                    'ri'    => "Role Information",
                   1655:                    'st'    => "Start Time",
                   1656:                    'et'    => "End Time",
                   1657: 				       );
1.50      matthew  1658:     $r->print(<<END);
1.94      sakharuk 1659:     <h2>$lt{'mdu'} $slogin \@ $sdom </h2>
                   1660: <h3>$lt{'si'}</h3>
1.53      matthew  1661: <table rules="rows" border="1" cellpadding="3" >
                   1662: <tr>
1.94      sakharuk 1663:     <th> $lt{'fd'} </th>
                   1664:     <th> $lt{'ov'} </th>
                   1665:     <th> $lt{'nv'} </th>
1.53      matthew  1666: </tr>
                   1667: <tr>
1.94      sakharuk 1668:     <td> <b>$lt{'fn'}</b> </td>
1.53      matthew  1669:     <td> $old{'firstname'} </td>
                   1670:     <td> $firstname </td>
                   1671: </tr><tr>
1.94      sakharuk 1672:     <td> <b>$lt{'mn'}</b> </td>
1.53      matthew  1673:     <td> $old{'middlename'} </td>
                   1674:     <td> $middlename </td>
                   1675: </tr><tr>
1.94      sakharuk 1676:     <td> <b>$lt{'ln'}</b> </td>
1.53      matthew  1677:     <td> $old{'lastname'} </td>
                   1678:     <td> $lastname </td>
                   1679: </tr><tr>
1.94      sakharuk 1680:     <td> <b>$lt{'gen'}</b> </td>
1.53      matthew  1681:     <td> $old{'generation'} </td>
                   1682:     <td> $generation </td>
                   1683: </tr><tr>
                   1684:     <td> <b>ID</b> </td>
                   1685:     <td> $old{'id'} </td>
                   1686:     <td> $sid </td>
1.59      matthew  1687: </tr><tr>
1.94      sakharuk 1688:     <td> <b>$lt{'sec'}</b> </td>
1.59      matthew  1689:     <td> $old{'section'} </td>
                   1690:     <td> $section</td>
1.53      matthew  1691: </tr>
1.50      matthew  1692: </table>
1.94      sakharuk 1693: <h3>$lt{'ri'}</h3>
1.50      matthew  1694: <table>
1.94      sakharuk 1695: <tr><td align="right"><b>$lt{'st'}:</b></td><td> $displayable_starttime </td></tr>
                   1696: <tr><td align="right"><b>$lt{'et'}:</b></td><td> $displayable_endtime   </td></tr>
1.50      matthew  1697: </table>
1.52      matthew  1698: <p>
1.50      matthew  1699: END
1.53      matthew  1700:     #
1.63      matthew  1701:     # Send request(s) to modify data (final undef is for 'desiredhost',
                   1702:     # which is a moot point because the student already has an account.
                   1703:     my $modify_section_results = &modifystudent($sdom,$slogin,
                   1704:                                                 $ENV{'request.course.id'},
                   1705:                                                 $section,undef);
                   1706:     if ($modify_section_results !~ /^ok/) {
1.94      sakharuk 1707:         $r->print(&mt('An error occured during the attempt to change the section for this student.')."<br />");
1.63      matthew  1708:     }
1.52      matthew  1709:     my $roleresults = &Apache::lonnet::modifystudent
1.53      matthew  1710:         ($sdom,$slogin,$sid,undef,undef,$firstname,$middlename,$lastname,
                   1711:          $generation,$section,$endtime,$starttime,$ENV{'form.forceid'});
                   1712:     if ($roleresults eq 'refused' ) {
1.94      sakharuk 1713:         $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  1714:     } elsif ($roleresults !~ /ok/) {
1.94      sakharuk 1715:         $r->print(&mt('An error occurred during the attempt to change the role information for this student.')."  <br />".
                   1716:                   &mt('The error reported was')." ".
1.50      matthew  1717:                   $roleresults);
1.53      matthew  1718:         &Apache::lonnet::logthis("londropadd:failed attempt to modify student".
                   1719:                                  " data for ".$slogin." \@ ".$sdom." by ".
                   1720:                                  $ENV{'user.name'}." \@ ".$ENV{'user.domain'}.
                   1721:                                  ":".$roleresults);
1.50      matthew  1722:     } else { # everything is okay!
1.94      sakharuk 1723:         $r->print(&mt('Student information updated successfully.')." <br />".
                   1724:                   &mt('The student must log out and log in again to see these changes.'));
1.50      matthew  1725:     }
1.94      sakharuk 1726:     my $Masd=&mt('Modify another students data');
1.50      matthew  1727:     $r->print(<<END);
1.52      matthew  1728: </p><p>
1.59      matthew  1729: <input type="hidden" name="action" value="modifystudent" />
                   1730: <input type="hidden" name="sortby" value="$sortby" />
                   1731: <input type="hidden" name="Status" value="$status" />
1.94      sakharuk 1732: <a href="javascript:document.studentform.submit();">$Masd</a>
1.50      matthew  1733: </body></html>
                   1734: END
                   1735:     return;
                   1736: }
                   1737: 
                   1738: sub get_enrollment_data {
                   1739:     my ($sname,$sdomain) = @_;
                   1740:     my $courseid = $ENV{'request.course.id'};
                   1741:     $courseid =~ s:_:/:g;
                   1742:     my %roles = &Apache::lonnet::dump('roles',$sdomain,$sname);
                   1743:     my ($tmp) = keys(%roles);
                   1744:     # Bail out if we were unable to get the students roles
1.87      matthew  1745:     return ('error'.$tmp) if ($tmp =~ /^(con_lost|error|no_such_host)/i);
1.50      matthew  1746:     # Go through the roles looking for enrollment in this course
                   1747:     my ($end,$start) = (undef,undef);
                   1748:     my $section = '';
                   1749:     my $count = scalar(keys(%roles));
                   1750:     while (my ($course,$role) = each(%roles)) {
                   1751:         if ($course=~ /^\/$courseid\/*\s*(\w+)*_st$/ ) {
                   1752:             #
                   1753:             # Get active role
                   1754:             $section=$1;
                   1755:             (undef,$end,$start)=split(/\_/,$role);
                   1756:             my $now=time;
                   1757:             my $notactive=0;
                   1758:             if ($start) {
                   1759:                 if ($now<$start) { $notactive=1; }
                   1760:             }
                   1761:             if ($end) {
                   1762:                 if ($now>$end) { $notactive=1; }
                   1763:             } 
                   1764:             unless ($notactive) { return ($start,$end,$section); }
                   1765:         }
                   1766:     }
                   1767:     return ($start,$end,$section);
                   1768: }
                   1769: 
1.56      matthew  1770: #################################################
                   1771: #################################################
                   1772: 
                   1773: =pod
                   1774: 
                   1775: =item show_drop_list
                   1776: 
                   1777: Display a list of students to drop
                   1778: Inputs: 
                   1779: 
                   1780: =over 4
                   1781: 
                   1782: =item $r, Apache request
                   1783: 
                   1784: =item $classlist, hash pointer returned from loncoursedata::get_classlist();
                   1785: 
                   1786: =item $keylist, array pointer returned from loncoursedata::get_classlist() 
                   1787: which describes the order elements are stored in the %$classlist values.
                   1788: 
                   1789: =item $nosort, if true, sorting links are omitted.
                   1790: 
                   1791: =back
                   1792: 
                   1793: =cut
                   1794: 
                   1795: #################################################
                   1796: #################################################
1.11      www      1797: sub show_drop_list {
1.56      matthew  1798:     my ($r,$classlist,$keylist,$nosort)=@_;
1.11      www      1799:     my $cid=$ENV{'request.course.id'};
1.59      matthew  1800:     if (! exists($ENV{'form.sortby'})) {
                   1801:         &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                   1802:                                                 ['sortby']);
                   1803:     }
1.54      matthew  1804:     my $sortby = $ENV{'form.sortby'};
1.110     matthew  1805:     if ($sortby !~ /^(username|domain|section|fullname|id|start|end)$/) {
1.54      matthew  1806:         $sortby = 'username';
                   1807:     }
1.56      matthew  1808:     #
1.54      matthew  1809:     my $action = "drop";
                   1810:     $r->print(<<END);
                   1811: <input type="hidden" name="sortby" value="$sortby" />
                   1812: <input type="hidden" name="action" value="$action" />
1.50      matthew  1813: <input type="hidden" name="state"  value="done" />
1.32      matthew  1814: <script>
1.51      matthew  1815: function checkAll(field) {
1.32      matthew  1816:     for (i = 0; i < field.length; i++)
                   1817:         field[i].checked = true ;
                   1818: }
                   1819: 
1.51      matthew  1820: function uncheckAll(field) {
1.32      matthew  1821:     for (i = 0; i < field.length; i++)
                   1822:         field[i].checked = false ;
                   1823: }
                   1824: </script>
                   1825: <p>
1.26      matthew  1826: <input type="hidden" name="phase" value="four">
1.56      matthew  1827: END
                   1828: 
1.110     matthew  1829: my %lt=&Apache::lonlocal::texthash('usrn'   => "username",
                   1830:                                    'dom'    => "domain",
                   1831:                                    'sn'     => "student name",
                   1832:                                    'sec'    => "section",
                   1833:                                    'start'  => "start date",
                   1834:                                    'end'    => "end date",
                   1835:                                    );
1.56      matthew  1836:     if ($nosort) {
                   1837:         $r->print(<<END);
                   1838: <table border=2>
                   1839: <tr>
                   1840:     <th>&nbsp;</th>
1.94      sakharuk 1841:     <th>$lt{'usrn'}</th>
                   1842:     <th>$lt{'dom'}</th>
1.56      matthew  1843:     <th>ID</th>
1.94      sakharuk 1844:     <th>$lt{'sn'}</th>
                   1845:     <th>$lt{'sec'}</th>
1.110     matthew  1846:     <th>$lt{'start'}</th>
                   1847:     <th>$lt{'end'}</th>
1.56      matthew  1848: </tr>
                   1849: END
                   1850: 
                   1851:     } else  {
                   1852:         $r->print(<<END);
1.26      matthew  1853: <table border=2>
1.54      matthew  1854: <tr><th>&nbsp;</th>
                   1855:     <th>
1.94      sakharuk 1856:        <a href="/adm/dropadd?action=$action&sortby=username">$lt{'usrn'}</a>
1.54      matthew  1857:     </th><th>
1.94      sakharuk 1858:        <a href="/adm/dropadd?action=$action&sortby=domain">$lt{'dom'}</a>
1.54      matthew  1859:     </th><th>
                   1860:        <a href="/adm/dropadd?action=$action&sortby=id">ID</a>
                   1861:     </th><th>
1.94      sakharuk 1862:        <a href="/adm/dropadd?action=$action&sortby=fullname">$lt{'sn'}</a>
1.54      matthew  1863:     </th><th>
1.94      sakharuk 1864:        <a href="/adm/dropadd?action=$action&sortby=section">$lt{'sec'}</a>
1.110     matthew  1865:     </th><th>
                   1866:        <a href="/adm/dropadd?action=$action&sortby=start">$lt{'start'}</a>
                   1867:     </th><th>
                   1868:        <a href="/adm/dropadd?action=$action&sortby=end">$lt{'end'}</a>
1.54      matthew  1869:     </th>
                   1870: </tr>
1.26      matthew  1871: END
1.56      matthew  1872:     }
                   1873:     #
                   1874:     # Sort the students
                   1875:     my %index;
                   1876:     my $i;
                   1877:     foreach (@$keylist) {
                   1878:         $index{$_} = $i++;
                   1879:     }
                   1880:     my $index  = $index{$sortby};
                   1881:     my $second = $index{'username'};
                   1882:     my $third  = $index{'domain'};
1.54      matthew  1883:     my @Sorted_Students = sort {
1.56      matthew  1884:         lc($classlist->{$a}->[$index])  cmp lc($classlist->{$b}->[$index])
                   1885:             ||
                   1886:         lc($classlist->{$a}->[$second]) cmp lc($classlist->{$b}->[$second])
                   1887:             ||
                   1888:         lc($classlist->{$a}->[$third]) cmp lc($classlist->{$b}->[$third])
                   1889:         } (keys(%$classlist));
1.54      matthew  1890:     foreach my $student (@Sorted_Students) {
1.52      matthew  1891:         my $error;
1.110     matthew  1892:         my $sdata = $classlist->{$student};
                   1893:         my $username = $sdata->[$index{'username'}];
                   1894:         my $domain   = $sdata->[$index{'domain'}];
                   1895:         my $section  = $sdata->[$index{'section'}];
                   1896:         my $name     = $sdata->[$index{'fullname'}];
                   1897:         my $id       = $sdata->[$index{'id'}];
                   1898:         my $start    = $sdata->[$index{'start'}];
                   1899:         my $end      = $sdata->[$index{'end'}];
                   1900:         if (! defined($start) || $start == 0) {
                   1901:             $start = &mt('none');
                   1902:         } else {
                   1903:             $start = &Apache::lonlocal::locallocaltime($start);
                   1904:         }
                   1905:         if (! defined($end) || $end == 0) {
                   1906:             $end = &mt('none');
                   1907:         } else {
                   1908:             $end = &Apache::lonlocal::locallocaltime($end);
                   1909:         }
                   1910:         my $status   = $sdata->[$index{'status'}];
1.51      matthew  1911:         next if ($status ne 'Active');
                   1912:         #
                   1913:         $r->print(<<"END");
1.26      matthew  1914: <tr>
1.51      matthew  1915:     <td><input type="checkbox" name="droplist" value="$student"></td>
                   1916:     <td>$username</td>
                   1917:     <td>$domain</td>
                   1918:     <td>$id</td>
                   1919:     <td>$name</td>
                   1920:     <td>$section</td>
1.110     matthew  1921:     <td>$start</td>
                   1922:     <td>$end</td>
1.26      matthew  1923: </tr>
                   1924: END
1.25      matthew  1925:     }
                   1926:     $r->print('</table><br>');
1.111     matthew  1927:     %lt=&Apache::lonlocal::texthash(
1.94      sakharuk 1928: 	               'dp'   => "Drop Students",
                   1929:                        'ca'   => "check all",
                   1930:                        'ua'   => "uncheck all",
                   1931: 				       );
1.32      matthew  1932:     $r->print(<<"END");
                   1933: </p><p>
1.94      sakharuk 1934: <input type="button" value="$lt{'ca'}" onclick="javascript:checkAll(document.studentform.droplist)"> &nbsp;
                   1935: <input type="button" value="$lt{'ua'}" onclick="javascript:uncheckAll(document.studentform.droplist)"> 
                   1936: <p><input type=submit value="$lt{'dp'}"></p>
1.32      matthew  1937: END
1.51      matthew  1938:     return;
1.10      www      1939: }
                   1940: 
1.48      matthew  1941: #
                   1942: # Print out the initial form to get the courselist file
                   1943: #
                   1944: sub print_first_courselist_upload_form {
                   1945:     my $r=shift;
1.88      matthew  1946:     my $str;
                   1947:     $str  = '<input type="hidden" name="phase" value="two">';
                   1948:     $str .= '<input type="hidden" name="action" value="upload" />';
                   1949:     $str .= '<input type="hidden"   name="state"  value="got_file" />';
                   1950:     $str .= "<h3>".&mt('Upload a class list')."</h3>\n";
                   1951:     $str .= &Apache::loncommon::upfile_select_html();
                   1952:     $str .= "<p>\n";
                   1953:     $str .= '<input type="submit" name="fileupload" value="'.
                   1954:         &mt('Upload class list').'">'."\n";
                   1955:     $str .= '<input type="checkbox" name="noFirstLine" /> '.
                   1956:         &mt('Ignore First Line')."</p>\n";
                   1957:     $str .= &Apache::loncommon::help_open_topic("Course_Create_Class_List",
1.92      sakharuk 1958:                          &mt("How do I create a class list from a spreadsheet")).
1.88      matthew  1959:                              "<br />\n";
                   1960:     $str .= &Apache::loncommon::help_open_topic("Course_Convert_To_CSV",
1.92      sakharuk 1961:                            &mt("How do I create a CSV file from a spreadsheet")).
1.88      matthew  1962:                                "<br />\n";
                   1963:     $str .= "</body>\n</html>\n";
                   1964:     $r->print($str);
1.48      matthew  1965:     return;
                   1966: }
                   1967: 
1.10      www      1968: # ================================================= Drop/Add from uploaded file
                   1969: sub upfile_drop_add {
                   1970:     my $r=shift;
1.24      albertel 1971:     &Apache::loncommon::load_tmp_file($r);
                   1972:     my @studentdata=&Apache::loncommon::upfile_record_sep();
1.82      www      1973:     if($ENV{'form.noFirstLine'}){shift(@studentdata);}
1.26      matthew  1974:     my @keyfields = split(/\,/,$ENV{'form.keyfields'});
                   1975:     my $cid = $ENV{'request.course.id'};
1.25      matthew  1976:     my %fields=();
1.26      matthew  1977:     for (my $i=0; $i<=$ENV{'form.nfields'}; $i++) {
1.25      matthew  1978:         if ($ENV{'form.upfile_associate'} eq 'reverse') {
                   1979:             if ($ENV{'form.f'.$i} ne 'none') {
                   1980:                 $fields{$keyfields[$i]}=$ENV{'form.f'.$i};
                   1981:             }
                   1982:         } else {
                   1983:             $fields{$ENV{'form.f'.$i}}=$keyfields[$i];
                   1984:         }
                   1985:     }
1.99      matthew  1986:     #
                   1987:     # Store the field choices away
                   1988:     foreach my $field (qw/username names 
                   1989:                        fname mname lname gen id sec ipwd email/) {
                   1990:         $ENV{'form.'.$field.'_choice'}=$fields{$field};
                   1991:     }
                   1992:     &Apache::loncommon::store_course_settings('enrollment_upload',
                   1993:                                               { 'username_choice' => 'scalar',
                   1994:                                                 'names_choice' => 'scalar',
                   1995:                                                 'fname_choice' => 'scalar',
                   1996:                                                 'mname_choice' => 'scalar',
                   1997:                                                 'lname_choice' => 'scalar',
                   1998:                                                 'gen_choice' => 'scalar',
                   1999:                                                 'id_choice' => 'scalar',
                   2000:                                                 'sec_choice' => 'scalar',
                   2001:                                                 'ipwd_choice' => 'scalar',
                   2002:                                                 'email_choice' => 'scalar' });
                   2003: 
1.26      matthew  2004:     #
1.68      matthew  2005:     my ($startdate,$enddate) = &get_dates_from_form();
                   2006:     if ($ENV{'form.makedatesdefault'}) {
                   2007:         $r->print(&make_dates_default($startdate,$enddate));
                   2008:     }
1.31      matthew  2009:     # Determine domain and desired host (home server)
1.25      matthew  2010:     my $domain=$ENV{'form.lcdomain'};
1.31      matthew  2011:     my $desiredhost = $ENV{'form.lcserver'};
                   2012:     if (lc($desiredhost) eq 'default') {
                   2013:         $desiredhost = undef;
                   2014:     } else {
1.45      matthew  2015:         my %home_servers = &Apache::loncommon::get_library_servers($domain);
1.31      matthew  2016:         if (! exists($home_servers{$desiredhost})) {
1.88      matthew  2017:             $r->print('<font color="#ff0000">'.&mt('Error').'</font>'.
                   2018:                       &mt('Invalid home server specified'));
                   2019:             $r->print("</body>\n</html>\n");
1.31      matthew  2020:             return;
                   2021:         }
                   2022:     }
1.26      matthew  2023:     # Determine authentication mechanism
                   2024:     my $amode  = '';
                   2025:     my $genpwd = '';
1.25      matthew  2026:     if ($ENV{'form.login'} eq 'krb') {
1.47      albertel 2027:         $amode='krb';
                   2028: 	$amode.=$ENV{'form.krbver'};
1.28      matthew  2029:         $genpwd=$ENV{'form.krbarg'};
1.25      matthew  2030:     } elsif ($ENV{'form.login'} eq 'int') {
                   2031:         $amode='internal';
1.28      matthew  2032:         if ((defined($ENV{'form.intarg'})) && ($ENV{'form.intarg'})) {
                   2033:             $genpwd=$ENV{'form.intarg'};
1.25      matthew  2034:         }
                   2035:     } elsif ($ENV{'form.login'} eq 'loc') {
                   2036:         $amode='localauth';
                   2037:         if ((defined($ENV{'form.locarg'})) && ($ENV{'form.locarg'})) {
                   2038:             $genpwd=$ENV{'form.locarg'};
1.79      matthew  2039:         }
                   2040:     }
                   2041:     if ($amode =~ /^krb/) {
                   2042:         if (! defined($genpwd) || $genpwd eq '') {
                   2043:             $r->print('<font color="red" size="+1">'.
1.88      matthew  2044:                       &mt('Unable to enroll students').'</font>  '.
                   2045:                       &mt('No Kerberos domain was specified.').'</p>');
1.79      matthew  2046:             $amode = ''; # This causes the loop below to be skipped
1.25      matthew  2047:         }
                   2048:     }
                   2049:     unless (($domain=~/\W/) || ($amode eq '')) {
1.26      matthew  2050:         #######################################
                   2051:         ##         Enroll Students           ##
                   2052:         #######################################
1.88      matthew  2053:         $r->print('<h3>'.&mt('Enrolling Students')."</h3>\n<p>\n");
1.25      matthew  2054:         my $count=0;
                   2055:         my $flushc=0;
                   2056:         my %student=();
1.26      matthew  2057:         # Get new classlist
1.25      matthew  2058:         foreach (@studentdata) {
                   2059:             my %entries=&Apache::loncommon::record_sep($_);
1.26      matthew  2060:             # Determine student name
1.25      matthew  2061:             unless (($entries{$fields{'username'}} eq '') ||
                   2062:                     (!defined($entries{$fields{'username'}}))) {
1.26      matthew  2063:                 my ($fname, $mname, $lname,$gen) = ('','','','');
1.25      matthew  2064:                 if (defined($fields{'names'})) {
1.26      matthew  2065:                     ($lname,$fname,$mname)=($entries{$fields{'names'}}=~
                   2066:                                             /([^\,]+)\,\s*(\w+)\s*(.*)$/);
1.25      matthew  2067:                 } else {
                   2068:                     if (defined($fields{'fname'})) {
                   2069:                         $fname=$entries{$fields{'fname'}};
                   2070:                     }
                   2071:                     if (defined($fields{'mname'})) {
                   2072:                         $mname=$entries{$fields{'mname'}};
                   2073:                     }
                   2074:                     if (defined($fields{'lname'})) {
                   2075:                         $lname=$entries{$fields{'lname'}};
                   2076:                     }
                   2077:                     if (defined($fields{'gen'})) {
                   2078:                         $gen=$entries{$fields{'gen'}};
                   2079:                     }
                   2080:                 }
                   2081:                 if ($entries{$fields{'username'}}=~/\W/) {
1.88      matthew  2082:                     $r->print('<br />'.
                   2083:       &mt('<b>[_1]</b>: Unacceptable username for user [_2] [_3] [_4] [_5]',
                   2084:           $entries{$fields{'username'}},$fname,$mname,$lname,$gen).
                   2085:                               '</b>');
1.25      matthew  2086:                 } else {
1.26      matthew  2087:                     # determine section number
1.25      matthew  2088:                     my $sec='';
                   2089:                     my $username=$entries{$fields{'username'}};
                   2090:                     if (defined($fields{'sec'})) {
                   2091:                         if (defined($entries{$fields{'sec'}})) {
                   2092:                             $sec=$entries{$fields{'sec'}};
                   2093:                         }
                   2094:                     }
1.80      matthew  2095:                     # remove non alphanumeric values from section
                   2096:                     $sec =~ s/\W//g;
1.26      matthew  2097:                     # determine student id number
1.25      matthew  2098:                     my $id='';
                   2099:                     if (defined($fields{'id'})) {
                   2100:                         if (defined($entries{$fields{'id'}})) {
                   2101:                             $id=$entries{$fields{'id'}};
                   2102:                         }
                   2103:                         $id=~tr/A-Z/a-z/;
                   2104:                     }
1.73      www      2105:                     # determine email address
                   2106:                     my $email='';
                   2107:                     if (defined($fields{'email'})) {
                   2108:                         if (defined($entries{$fields{'email'}})) {
                   2109:                             $email=$entries{$fields{'email'}};
                   2110:                             unless ($email=~/^[^\@]+\@[^\@]+$/) { $email=''; }
                   2111:                         }
                   2112:                     }
1.26      matthew  2113:                     # determine student password
1.25      matthew  2114:                     my $password='';
                   2115:                     if ($genpwd) { 
                   2116:                         $password=$genpwd; 
                   2117:                     } else {
                   2118:                         if (defined($fields{'ipwd'})) {
                   2119:                             if ($entries{$fields{'ipwd'}}) {
                   2120:                                 $password=$entries{$fields{'ipwd'}};
                   2121:                             }
                   2122:                         }
                   2123:                     }
1.56      matthew  2124:                     # Clean up whitespace
                   2125:                     foreach (\$domain,\$username,\$id,\$fname,\$mname,
                   2126:                              \$lname,\$gen,\$sec) {
                   2127:                         $$_ =~ s/(\s+$|^\s+)//g;
                   2128:                     }
1.84      albertel 2129:                     if ($password || $ENV{'form.login'} eq 'loc') {
1.33      matthew  2130:                         &modifystudent($domain,$username,$cid,$sec,
                   2131:                                        $desiredhost);
1.25      matthew  2132:                         my $reply=&Apache::lonnet::modifystudent
                   2133:                             ($domain,$username,$id,$amode,$password,
                   2134:                              $fname,$mname,$lname,$gen,$sec,$enddate,
1.73      www      2135:                              $startdate,$ENV{'form.forceid'},$desiredhost,
                   2136:                              $email);
1.26      matthew  2137:                         if ($reply ne 'ok') {
1.72      matthew  2138:                             $reply =~ s/^error://;
1.88      matthew  2139:                             $r->print('<br />'.
                   2140:                 &mt('<b>[_1]</b>:  Unable to enroll: [_2]',$username,$reply));
1.10      www      2141:          		} else {
1.7       www      2142:                             $count++; $flushc++;
                   2143:                             $student{$username}=1;
1.6       www      2144:                             $r->print('. ');
1.7       www      2145:                             if ($flushc>15) {
                   2146: 				$r->rflush;
                   2147:                                 $flushc=0;
                   2148:                             }
1.6       www      2149:                         }
1.25      matthew  2150:                     } else {
1.88      matthew  2151:                         $r->print('<br />'.
                   2152:       &mt('<b>[_1]</b>: Unable to enroll.  No password specified.',$username)
                   2153:                                   );
1.25      matthew  2154:                     }
                   2155:                 }
1.26      matthew  2156:             }
                   2157:         } # end of foreach (@studentdata)
1.88      matthew  2158:         $r->print("</p>\n<p>\n".&mt('Processed [_1] student(s).',$count).
                   2159:                   "</p>\n");
                   2160:         $r->print("<p>\n".
                   2161:                   &mt('If active, the new role will be available when the '.
                   2162:                   'students next log in to LON-CAPA.')."</p>\n");
1.26      matthew  2163:         #####################################
                   2164:         #           Drop students           #
                   2165:         #####################################
1.25      matthew  2166:         if ($ENV{'form.fullup'} eq 'yes') {
1.88      matthew  2167:             $r->print('<h3>'.&mt('Dropping Students')."</h3>\n");
1.26      matthew  2168:             #  Get current classlist
1.56      matthew  2169:             my ($classlist,$keylist)=&Apache::loncoursedata::get_classlist();
                   2170:             if (! defined($classlist)) {
1.88      matthew  2171:                 $r->print(&mt('There are no students currently enrolled.').
                   2172:                           "\n");
1.56      matthew  2173:             } else {
                   2174:                 # Remove the students we just added from the list of students.
1.25      matthew  2175:                 foreach (@studentdata) {
                   2176:                     my %entries=&Apache::loncommon::record_sep($_);
                   2177:                     unless (($entries{$fields{'username'}} eq '') ||
                   2178:                             (!defined($entries{$fields{'username'}}))) {
1.56      matthew  2179:                         delete($classlist->{$entries{$fields{'username'}}.
1.26      matthew  2180:                                                 ':'.$domain});
1.25      matthew  2181:                     }
                   2182:                 }
1.56      matthew  2183:                 # Print out list of dropped students.
                   2184:                 &show_drop_list($r,$classlist,$keylist,'nosort');
1.25      matthew  2185:             }
                   2186:         }
1.26      matthew  2187:     } # end of unless
1.10      www      2188: }
                   2189: 
1.11      www      2190: # ================================================================== Phase four
                   2191: sub drop_student_list {
                   2192:     my $r=shift;
                   2193:     my $count=0;
1.35      matthew  2194:     my @droplist;
                   2195:     if (ref($ENV{'form.droplist'})) {
                   2196:         @droplist = @{$ENV{'form.droplist'}};
                   2197:     } else {
                   2198:         @droplist = ($ENV{'form.droplist'});
                   2199:     }
                   2200:     foreach (@droplist) {
1.26      matthew  2201:         my ($uname,$udom)=split(/\:/,$_);
1.56      matthew  2202:         # drop student
1.35      matthew  2203:         my $result = &modifystudent($udom,$uname,$ENV{'request.course.id'});
1.37      matthew  2204:         if ($result eq 'ok' || $result eq 'ok:') {
1.88      matthew  2205:             $r->print(&mt('Dropped [_1]',$uname.'@'.$udom).'<br>');
1.59      matthew  2206:             $count++;
1.35      matthew  2207:         } else {
1.88      matthew  2208:             $r->print(
                   2209:           &mt('Error dropping [_1]:[_2]',$uname.'@'.$udom,$result).
1.35      matthew  2210:                       '<br />');
                   2211:         }
1.20      harris41 2212:     }
1.88      matthew  2213:     $r->print('<p><b>'.&mt('Dropped [_1] student(s).',$count).'</b></p>');
                   2214:     $r->print('<p>'.&mt('Re-enrollment will re-activate data.')) if ($count);
1.11      www      2215: }
                   2216: 
1.50      matthew  2217: ###################################################################
                   2218: ###################################################################
                   2219: 
                   2220: =pod
                   2221: 
                   2222: =item &handler
                   2223: 
                   2224: The typical handler you see in all these modules.  Takes $r, the
                   2225: http request, as an argument.  
                   2226: 
                   2227: The response to the request is governed by two form variables
                   2228: 
                   2229:  form.action      form.state     response
                   2230:  ---------------------------------------------------
                   2231:  undefined        undefined      print main menu
                   2232:  upload           undefined      print courselist upload menu
                   2233:  upload           got_file       deal with uploaded file,
                   2234:                                  print the upload managing menu
                   2235:  upload           enrolling      enroll students based on upload
                   2236:  drop             undefined      print the classlist ready to drop
                   2237:  drop             done           drop the selected students
1.74      matthew  2238:  enrollstudent    undefined      print student username domain form
                   2239:  enrollstudent    gotusername    print single student enroll menu
1.50      matthew  2240:  enrollstudent    enrolling      enroll student
                   2241:  classlist        undefined      print html classlist
                   2242:  classlist        csv            print csv classlist
                   2243:  modifystudent    undefined      print classlist to select student to modify
                   2244:  modifystudent    selected       print modify student menu
                   2245:  modifystudent    done           make modifications to student record
                   2246: 
                   2247: =cut
                   2248: 
                   2249: ###################################################################
                   2250: ###################################################################
1.10      www      2251: sub handler {
1.26      matthew  2252:     my $r=shift;
                   2253:     if ($r->header_only) {
1.86      www      2254:         &Apache::loncommon::content_type($r,'text/html');
1.26      matthew  2255:         $r->send_http_header;
                   2256:         return OK;
                   2257:     }
1.48      matthew  2258:     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
1.50      matthew  2259:                                             ['action','state']);
1.102     matthew  2260: 
                   2261:     &Apache::lonhtmlcommon::clear_breadcrumbs();
                   2262:     &Apache::lonhtmlcommon::add_breadcrumb
                   2263:         ({href=>"/adm/dropadd",
                   2264:           text=>"Enrollment Manager",
                   2265:           faq=>9,bug=>'Instructor Interface',});
1.26      matthew  2266:     #  Needs to be in a course
1.50      matthew  2267:     if (! (($ENV{'request.course.fn'}) &&
                   2268:           (&Apache::lonnet::allowed('cst',$ENV{'request.course.id'})))) {
                   2269:         # Not in a course, or not allowed to modify parms
                   2270:         $ENV{'user.error.msg'}=
                   2271:             "/adm/dropadd:cst:0:0:Cannot drop or add students";
                   2272:         return HTTP_NOT_ACCEPTABLE; 
                   2273:     }
                   2274:     #
                   2275:     # Only output the header information if they did not request csv format
                   2276:     #
1.102     matthew  2277:     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                   2278:                                             ['state','action']);
1.103     matthew  2279:     # Start page
                   2280:     &Apache::loncommon::content_type($r,'text/html');
                   2281:     $r->send_http_header;
                   2282:     $r->print(&header());
1.50      matthew  2283:     #
                   2284:     # Main switch on form.action and form.state, as appropriate
                   2285:     if (! exists($ENV{'form.action'})) {
1.102     matthew  2286:         $r->print(&Apache::lonhtmlcommon::breadcrumbs
                   2287:                   (undef,'Enrollment Manager'));
1.50      matthew  2288:         &print_main_menu($r);
                   2289:     } elsif ($ENV{'form.action'} eq 'upload') {
1.102     matthew  2290:         &Apache::lonhtmlcommon::add_breadcrumb
                   2291:             ({href=>'/adm/dropadd?action=upload&state=',
1.106     matthew  2292:               text=>"Upload Classlist"});
1.102     matthew  2293:         $r->print(&Apache::lonhtmlcommon::breadcrumbs
1.117     albertel 2294:                   (undef,'Upload Classlist','Course_Create_Class_List'));
1.50      matthew  2295:         if (! exists($ENV{'form.state'})) {
                   2296:             &print_first_courselist_upload_form($r);            
                   2297:         } elsif ($ENV{'form.state'} eq 'got_file') {
                   2298:             &print_upload_manager_form($r);
                   2299:         } elsif ($ENV{'form.state'} eq 'enrolling') {
1.26      matthew  2300:             if ($ENV{'form.datatoken'}) {
                   2301:                 &upfile_drop_add($r);
1.50      matthew  2302:             } else {
                   2303:                 # Hmmm, this is an error
1.26      matthew  2304:             }
1.50      matthew  2305:         } else {
                   2306:             &print_first_courselist_upload_form($r);            
1.26      matthew  2307:         }
1.50      matthew  2308:     } elsif ($ENV{'form.action'} eq 'drop') {
1.102     matthew  2309:         &Apache::lonhtmlcommon::add_breadcrumb
                   2310:             ({href=>'/adm/dropadd?action=drop',
1.106     matthew  2311:               text=>"Drop Students"});
1.102     matthew  2312:         $r->print(&Apache::lonhtmlcommon::breadcrumbs
1.117     albertel 2313:                   (undef,'Drop Students','Course_Drop_Student'));
1.50      matthew  2314:         if (! exists($ENV{'form.state'})) {
1.51      matthew  2315:             &print_drop_menu($r);
1.50      matthew  2316:         } elsif ($ENV{'form.state'} eq 'done') {
1.26      matthew  2317:             &drop_student_list($r);
1.50      matthew  2318:         } else {
1.55      matthew  2319:             &print_drop_menu($r);
1.26      matthew  2320:         }
1.50      matthew  2321:     } elsif ($ENV{'form.action'} eq 'enrollstudent') {
1.102     matthew  2322:         &Apache::lonhtmlcommon::add_breadcrumb
                   2323:             ({href=>'/adm/dropadd?action=enrollstudent',
1.106     matthew  2324:               text=>"Enroll Student"});
1.102     matthew  2325:         $r->print(&Apache::lonhtmlcommon::breadcrumbs
1.117     albertel 2326:                   (undef,'Enroll Student','Course_Add_Student'));
1.50      matthew  2327:         if (! exists($ENV{'form.state'})) {
1.74      matthew  2328:             &get_student_username_domain_form($r);
                   2329:         } elsif ($ENV{'form.state'} eq 'gotusername') {
1.50      matthew  2330:             &print_enroll_single_student_form($r);
                   2331:         } elsif ($ENV{'form.state'} eq 'enrolling') {
1.26      matthew  2332:             &enroll_single_student($r);
1.50      matthew  2333:         } else {
1.74      matthew  2334:             &get_student_username_domain_form($r);
1.26      matthew  2335:         }
1.50      matthew  2336:     } elsif ($ENV{'form.action'} eq 'classlist') {
1.102     matthew  2337:         &Apache::lonhtmlcommon::add_breadcrumb
                   2338:             ({href=>'/adm/dropadd?action=classlist',
1.106     matthew  2339:               text=>"View Classlist"});
1.102     matthew  2340:         $r->print(&Apache::lonhtmlcommon::breadcrumbs
1.117     albertel 2341:                   (undef,'View Classlist','Course_View_Class_List'));
1.50      matthew  2342:         if (! exists($ENV{'form.state'})) {
1.103     matthew  2343:             &print_html_classlist($r,undef);
1.50      matthew  2344:         } elsif ($ENV{'form.state'} eq 'csv') {
1.103     matthew  2345:             &print_html_classlist($r,'csv');
1.60      matthew  2346:         } elsif ($ENV{'form.state'} eq 'excel') {
1.103     matthew  2347:             &print_html_classlist($r,'excel');
1.50      matthew  2348:         } else {
1.103     matthew  2349:             &print_html_classlist($r,undef);
1.50      matthew  2350:         }
                   2351:     } elsif ($ENV{'form.action'} eq 'modifystudent') {
1.102     matthew  2352:         &Apache::lonhtmlcommon::add_breadcrumb
                   2353:             ({href=>'/adm/dropadd?action=modifystudent',
1.106     matthew  2354:               text=>"Modify Student Data"});
1.102     matthew  2355:         $r->print(&Apache::lonhtmlcommon::breadcrumbs
1.117     albertel 2356:                   (undef,'Modify Student Data','Course_Modify_Student_Data'));
1.50      matthew  2357:         if (! exists($ENV{'form.state'})) {
                   2358:             &print_html_classlist($r);
                   2359:         } elsif ($ENV{'form.state'} eq 'selected') {
                   2360:             &print_modify_student_form($r);
                   2361:         } elsif ($ENV{'form.state'} eq 'done') {
                   2362:             &modify_single_student($r);
                   2363:         } else {
                   2364:             &print_html_classlist($r);
                   2365:         }        
                   2366:     } else {
                   2367:         # We should not end up here, but I guess it is possible
                   2368:         &Apache::lonnet::logthis("Undetermined state in londropadd.pm.  ".
                   2369:                                  "form.action = ".$ENV{'form.action'}.
                   2370:                                  "Someone should fix this.");
1.102     matthew  2371:         $r->print(&Apache::lonhtmlcommon::breadcrumbs
                   2372:                   (undef,'Enrollment Manager'));
1.50      matthew  2373:         &print_main_menu($r);
                   2374:     }
                   2375:     #
                   2376:     # Finish up
1.103     matthew  2377:     $r->print('</form></body></html>');
1.26      matthew  2378:     return OK;
1.1       www      2379: }
                   2380: 
1.50      matthew  2381: ###################################################################
                   2382: ###################################################################
                   2383: 
1.1       www      2384: 1;
                   2385: __END__
1.50      matthew  2386: 
1.1       www      2387: 

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