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

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

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