# The LearningOnline Network with CAPA
# Handler to drop and add students in courses
#
# $Id: londropadd.pm,v 1.112 2004/05/19 17:53:43 matthew Exp $
#
# Copyright Michigan State University Board of Trustees
#
# This file is part of the LearningOnline Network with CAPA (LON-CAPA).
#
# LON-CAPA is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# LON-CAPA is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with LON-CAPA; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# /home/httpd/html/adm/gpl.txt
#
# http://www.lon-capa.org/
#
#
###############################################################
##############################################################
package Apache::londropadd;
use strict;
use Apache::lonnet();
use Apache::loncommon();
use Apache::lonhtmlcommon();
use Apache::Constants qw(:common :http REDIRECT);
use Spreadsheet::WriteExcel;
use Apache::lonstathelpers();
use Apache::lonlocal;
###############################################################
###############################################################
sub header {
my $bodytag=&Apache::loncommon::bodytag('Enrollment Manager');
my $title = &mt('LON-CAPA Enrollment Manager');
return(<
$Text{'enrollone'} $help{'Course_Add_Student'}
$Text{'modify'} $help{'Course_Modify_Student_Data'}
$Text{'view'} $help{'Course_View_Class_List'}
$Text{'drop'} $help{'Course_Drop_Student'}
$Text{'populate'} END } ############################################################### ############################################################### sub hidden_input { my ($name,$value) = @_; return ''."\n"; } sub print_upload_manager_header { my ($r,$datatoken,$distotal,$krbdefdom)=@_; my $javascript; # if (! exists($ENV{'form.upfile_associate'})) { $ENV{'form.upfile_associate'} = 'forward'; } if ($ENV{'form.associate'} eq 'Reverse Association') { if ( $ENV{'form.upfile_associate'} ne 'reverse' ) { $ENV{'form.upfile_associate'} = 'reverse'; } else { $ENV{'form.upfile_associate'} = 'forward'; } } if ($ENV{'form.upfile_associate'} eq 'reverse') { $javascript=&upload_manager_javascript_reverse_associate(); } else { $javascript=&upload_manager_javascript_forward_associate(); } # # Deal with restored settings my $password_choice = ''; if (exists($ENV{'form.ipwd_choice'}) && $ENV{'form.ipwd_choice'} ne '') { # If a column was specified for password, assume it is for an # internal password. This is a bug waiting to be filed (could be # local or krb auth instead of internal) but I do not have the # time to mess around with this now. $password_choice = 'int'; } # my $javascript_validations=&javascript_validations('auth',$krbdefdom, $password_choice); my $checked=(($ENV{'form.noFirstLine'})?' checked="1"':''); $r->print('
\n". &mt('Total number of records found in file: [_1].',$distotal). "\n". "
\n". &mt('Note: this will not take effect if the user already exists'). "
\n"; $Str .= $krbform."\n
\n". $intform."\n
\n". $locform."\n
\n"; $Str .= '\n".&mt('LON-CAPA domain: [_1]',$domform)."\n
\n"; $Str .= "\n".$date_table."
\n"; $Str .= "\n".''; $Str .= &mt('Disable ID/Student Number Safeguard and Force Change '. 'of Conflicting IDs (only do if you know what you are doing)'). "\n
\n";
$Str .= ''."
\n";
$Str .= &mt('Note: for large courses, this operation may be time '.
'consuming');
$r->print($Str);
return;
}
###############################################################
###############################################################
sub print_upload_manager_form {
my $r=shift;
my $firstLine;
my $datatoken;
if (!$ENV{'form.datatoken'}) {
$datatoken=&Apache::loncommon::upfile_store($r);
} else {
$datatoken=$ENV{'form.datatoken'};
&Apache::loncommon::load_tmp_file($r);
}
my @records=&Apache::loncommon::upfile_record_sep();
if($ENV{'form.noFirstLine'}){
$firstLine=shift(@records);
}
my $total=$#records;
my $distotal=$total+1;
my $today=time;
my $halfyear=$today+15552000;
#
# Restore memorized settings
&Apache::loncommon::restore_course_settings
('enrollment_upload',{ 'username_choice' => 'scalar', # column settings
'names_choice' => 'scalar',
'fname_choice' => 'scalar',
'mname_choice' => 'scalar',
'lname_choice' => 'scalar',
'gen_choice' => 'scalar',
'id_choice' => 'scalar',
'sec_choice' => 'scalar',
'ipwd_choice' => 'scalar',
'email_choice' => 'scalar',
});
#
# Determine kerberos parameters as appropriate
my $defdom=$ENV{'course.'.$ENV{'request.course.id'}.'.domain'};
my ($krbdef,$krbdefdom) =
&Apache::loncommon::get_kerberos_defaults($defdom);
#
&print_upload_manager_header($r,$datatoken,$distotal,$krbdefdom);
my $i;
my $keyfields;
if ($total>=0) {
my @field=
(['username',&mt('Username'), $ENV{'form.username_choice'}],
['names',&mt('Last Name, First Names'),$ENV{'form.names_choice'}],
['fname',&mt('First Name'), $ENV{'form.fname_choice'}],
['mname',&mt('Middle Names/Initials'),$ENV{'form.mname_choice'}],
['lname',&mt('Last Name'), $ENV{'form.lname_choice'}],
['gen', &mt('Generation'), $ENV{'form.gen_choice'}],
['id', &mt('ID/Student Number'),$ENV{'form.id_choice'}],
['sec', &mt('Group/Section'), $ENV{'form.sec_choice'}],
['ipwd', &mt('Initial Password'),$ENV{'form.ipwd_choice'}],
['email',&mt('EMail Address'), $ENV{'form.email_choice'}]);
if ($ENV{'form.upfile_associate'} eq 'reverse') {
&Apache::loncommon::csv_print_samples($r,\@records);
$i=&Apache::loncommon::csv_print_select_table($r,\@records,
\@field);
foreach (@field) {
$keyfields.=$_->[0].',';
}
chop($keyfields);
} else {
unshift(@field,['none','']);
$i=&Apache::loncommon::csv_samples_select_table($r,\@records,
\@field);
my %sone=&Apache::loncommon::record_sep($records[0]);
$keyfields=join(',',sort(keys(%sone)));
}
}
&print_upload_manager_footer($r,$i,$keyfields,$defdom,$today,$halfyear);
}
###############################################################
###############################################################
sub enroll_single_student {
my $r=shift;
# Remove non alphanumeric values from section
$ENV{'form.csec'}=~s/\W//g;
#
# We do the dates first because the action of making them the defaul
# in the course is entirely separate from the action of enrolling the
# student. Also, a failure in setting the dates as default is not fatal
# to the process of enrolling / modifying a student.
my ($startdate,$enddate) = &get_dates_from_form();
if ($ENV{'form.makedatesdefault'}) {
$r->print(&make_dates_default($startdate,$enddate));
}
$r->print('
'.&mt('Enrolling').' '.$ENV{'form.cuname'}." \@ ". $ENV{'form.lcdomain'}.'
'); if (($ENV{'form.cuname'})&&($ENV{'form.cuname'}!~/\W/)&& ($ENV{'form.lcdomain'})&&($ENV{'form.lcdomain'}!~/\W/)) { # Deal with home server selection my $domain=$ENV{'form.lcdomain'}; my $desiredhost = $ENV{'form.lcserver'}; if (lc($desiredhost) eq 'default') { $desiredhost = undef; } else { my %home_servers =&Apache::loncommon::get_library_servers($domain); if (! exists($home_servers{$desiredhost})) { $r->print(''.&mt('Error').':'. &mt('Invalid home server specified')); return; } } $r->print(" ".&mt('with server')." $desiredhost :") if (defined($desiredhost)); # End of home server selection logic my $amode=''; my $genpwd=''; if ($ENV{'form.login'} eq 'krb') { $amode='krb'; $amode.=$ENV{'form.krbver'}; $genpwd=$ENV{'form.krbarg'}; } elsif ($ENV{'form.login'} eq 'int') { $amode='internal'; $genpwd=$ENV{'form.intarg'}; } elsif ($ENV{'form.login'} eq 'loc') { $amode='localauth'; $genpwd=$ENV{'form.locarg'}; if (!$genpwd) { $genpwd=" "; } } my $home = &Apache::lonnet::homeserver($ENV{'form.cuname'}, $ENV{'form.lcdomain'}); if ((($amode) && ($genpwd)) || ($home ne 'no_host')) { # Clean out any old roles the student has in this class. &modifystudent($ENV{'form.lcdomain'},$ENV{'form.cuname'}, $ENV{'request.course.id'},$ENV{'form.csec'}, $desiredhost); my $login_result = &Apache::lonnet::modifystudent ($ENV{'form.lcdomain'},$ENV{'form.cuname'}, $ENV{'form.cstid'},$amode,$genpwd, $ENV{'form.cfirst'},$ENV{'form.cmiddle'}, $ENV{'form.clast'},$ENV{'form.cgen'}, $ENV{'form.csec'},$enddate, $startdate,$ENV{'form.forceid'}, $desiredhost); if ($login_result =~ /^ok/) { $r->print($login_result); $r->print("".&mt('If active, the new role will be available when the student next logs in to LON-CAPA.')."
"); } else { $r->print(&mt('unable to enroll').": ".$login_result); } } else { $r->print(''.&mt('ERROR').' '); if ($amode =~ /^krb/) { $r->print(&mt('Missing Kerberos domain information.').' '); } else { $r->print(&mt('Invalid login mode or password.').' '); } $r->print(''.&mt('Unable to enroll').' '.$ENV{'form.cuname'}.'.
'); } } else { $r->print(&mt('Invalid username or domain')); } } sub setup_date_selectors { my ($starttime,$endtime,$mode) = @_; if (! defined($starttime)) { $starttime = time; unless ($mode eq 'createcourse') { if (exists($ENV{'course.'.$ENV{'request.course.id'}. '.default_enrollment_start_date'})) { $starttime = $ENV{'course.'.$ENV{'request.course.id'}. '.default_enrollment_start_date'}; } } } if (! defined($endtime)) { $endtime = time+(6*30*24*60*60); # 6 months from now, approx unless ($mode eq 'createcourse') { if (exists($ENV{'course.'.$ENV{'request.course.id'}. '.default_enrollment_end_date'})) { $endtime = $ENV{'course.'.$ENV{'request.course.id'}. '.default_enrollment_end_date'}; } } } my $startdateform = &Apache::lonhtmlcommon::date_setter('studentform', 'startdate', $starttime); my $enddateform = &Apache::lonhtmlcommon::date_setter('studentform', 'enddate', $endtime); if ($mode eq 'createcourse') { $startdateform = &Apache::lonhtmlcommon::date_setter('ccrs', 'startdate', $starttime); $enddateform = &Apache::lonhtmlcommon::date_setter('ccrs', 'enddate', $endtime); } return ($startdateform,$enddateform); } sub get_dates_from_form { my $startdate = &Apache::lonhtmlcommon::get_date_from_form('startdate'); my $enddate = &Apache::lonhtmlcommon::get_date_from_form('enddate'); if ($ENV{'form.no_end_date'}) { $enddate = 0; } return ($startdate,$enddate); } sub date_setting_table { my ($starttime,$endtime,$mode) = @_; my ($startform,$endform)=&setup_date_selectors($starttime,$endtime,$mode); my $dateDefault = ''.&mt('Starting Date').' | '. ''.$startform.' | '. ''.$dateDefault.' | '."
'.&mt('Ending Date').' | '. ''.$endform.' | '. ''.$perpetual.' | '."
$lt{'usr'}: | |
---|---|
$lt{'dom'}: | $domform |
$lt{'fn'}: | |
---|---|
$lt{'mn'}: | |
$lt{'ln'}: | |
$lt{'gen'}: | |
$lt{'hs'}: | $homeserver_form |
$lt{'fn'}: | |
---|---|
$lt{'mn'}: | |
$lt{'ln'}: | |
$lt{'gen'}: |
$lt{'gs'}:
$date_table
$lt{'idsn'}:
$lt{'disn'}
END return; } # ========================================================= Menu Phase Two Drop sub print_drop_menu { my $r=shift; $r->print("
'.$role.' | '); foreach my $user (split(',',$coursepersonnel{$role})) { my ($puname,$pudom)=split(':',$user); $r->print(' '.&Apache::loncommon::aboutmewrapper( &Apache::loncommon::plainname($puname, $pudom), $puname,$pudom)); } $r->print(' |
\n"); if ($ENV{'form.action'} ne 'modifystudent') { my %lt=&Apache::lonlocal::texthash('csv' => "CSV", 'excel' => "Excel", 'html' => 'HTML'); my $output_selector = ''; $r->print(&mt('Output Format: [_1]',$output_selector).(' 'x3)); } $r->print(&mt('Student Status: [_1]',$status_select)."\n"); $r->print(''. "\n
\n"); # # Print the classlist $r->print('
Count | $lt{'usrn'} | $lt{'dom'} | ID | $lt{'sn'} | $lt{'sec'} | $lt{'start'} | $lt{'end'} |
---|---|---|---|---|---|---|---|
".(++$studentcount)." | \n "); if ($linkto eq 'nothing') { $r->print($username); } elsif ($linkto eq 'aboutme') { $r->print(&Apache::loncommon::aboutmewrapper($username, $username, $domain)); } elsif ($linkto eq 'modify') { $r->print(''. $username."\n"); } $r->print(<<"END"); | $domain | $id | $name | $section | $start | $end |
'. &mt('Your Excel spreadsheet').' '.&mt('is ready for download').'.
'."\n"); } elsif ($mode eq 'csv') { close($CSVfile); $r->print(''. &mt('Your CSV file').' is ready for download.'. "\n"); $r->rflush(); } } # # print out form for modification of a single students data # sub print_modify_student_form { my $r = shift(); &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['sdom','sname']); my $sname = $ENV{'form.sname'}; my $sdom = $ENV{'form.sdom'}; my $sortby = $ENV{'form.sortby'}; # determine the students name information my %info=&Apache::lonnet::get('environment', ['firstname','middlename', 'lastname','generation','id'], $sdom, $sname); my ($tmp) = keys(%info); if ($tmp =~ /^(con_lost|error|no_such_host)/i) { $r->print(''.&mt('Error').''. ''. &mt('Unable to retrieve environment data for').' '.$sname. &mt('in domain').' '.$sdom.'
'. &mt('Please contact your LON-CAPA administrator regarding this situation.').'