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

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

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