--- loncom/interface/Attic/londropadd.pm 2002/04/23 21:03:59 1.29
+++ loncom/interface/Attic/londropadd.pm 2007/10/22 22:16:38 1.173
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Handler to drop and add students in courses
#
-# $Id: londropadd.pm,v 1.29 2002/04/23 21:03:59 matthew Exp $
+# $Id: londropadd.pm,v 1.173 2007/10/22 22:16:38 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -25,162 +25,382 @@
#
# http://www.lon-capa.org/
#
-# (Handler to set parameters for assessments
#
-# (Handler to resolve ambiguous file locations
-#
-# (TeX Content Handler
-#
-# YEAR=2000
-# 05/29/00,05/30,10/11 Gerd Kortemeyer)
-#
-# 10/11,10/12,10/16 Gerd Kortemeyer)
-#
-# 11/20,11/21,11/22,11/23,11/24,11/25,11/27,11/28,
-# 12/08,12/12 Gerd Kortemeyer)
-#
-# 12/26,12/27,12/28,
-# YEAR=2001
-# 01/01/01,01/15,02/10,02/13,02/14,02/22 Gerd Kortemeyer
-# 8/6 Scott Harrison
-# Guy Albertelli
-# 9/25 Gerd Kortemeyer
-# 12/19 Guy Albertelli
-# YEAR=2002
-# 1/4 Gerd Kortemeyer
+###############################################################
+##############################################################
package Apache::londropadd;
use strict;
-use Apache::lonnet();
+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;
+use Apache::longroup;
+use LONCAPA();
-# ================================================================ Print header
-
+###############################################################
+###############################################################
sub header {
+ my ($jscript,$loaditems) = @_;
+ my $start_page;
+ if (ref($loaditems) eq 'HASH') {
+ $start_page=&Apache::loncommon::start_page('Enrollment Manager',$jscript,{'add_entries' => $loaditems,});
+ } else {
+ $start_page=&Apache::loncommon::start_page('Enrollment Manager',$jscript);
+ }
return(<
-
Drop/Add Students
-
\n".'\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);
+ if (!$env{'form.datatoken'}) {
+ $datatoken=&Apache::loncommon::upfile_store($r);
} else {
- $datatoken=$ENV{'form.datatoken'};
- &Apache::loncommon::load_tmp_file($r);
+ $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;
- $ENV{'SERVER_NAME'}=~/(\w+\.\w+)$/;
- my $krbdefdom=$1;
- $krbdefdom=~tr/a-z/A-Z/;
my $today=time;
my $halfyear=$today+15552000;
- my $defdom=$r->dir_config('lonDefDomain');
- &phase_two_header($r,$datatoken,$distotal,$krbdefdom);
+ #
+ # 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 @d=(['username','Username'],['names','Last Name, First Names'],
- ['fname','First Name'],['mname','Middle Names/Initials'],
- ['lname','Last Name'],['gen','Generation'],
- ['id','ID/Student Number'],['sec','Group/Section'],
- ['ipwd','Initial Password']);
- if ($ENV{'form.upfile_associate'} eq 'reverse') {
+ 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('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,\@d);
- foreach (@d) { $keyfields.=$_->[0].','; }
+ $i=&Apache::loncommon::csv_print_select_table($r,\@records,
+ \@field);
+ foreach (@field) {
+ $keyfields.=$_->[0].',';
+ }
chop($keyfields);
} else {
- unshift(@d,['none','']);
- $i=&Apache::loncommon::csv_samples_select_table($r,\@records,\@d);
+ 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)));
}
}
- &phase_two_end($r,$i,$keyfields,$defdom,$today,$halfyear);
+ &print_upload_manager_footer($r,$i,$keyfields,$defdom,$today,$halfyear);
}
-# ======================================================= Enroll single student
+###############################################################
+###############################################################
sub enroll_single_student {
- my $r=shift;
- $r->print('
'.&mt('Enrolling [_1] : [_2]',$env{'form.cuname'}, + $env{'form.lcdomain'}).'
'); + if (($env{'form.cuname'}) + && ($env{'form.cuname'} + eq &LONCAPA::clean_username($env{'form.cuname'})) + && ($env{'form.lcdomain'}) + && ($env{'form.lcdomain'} + eq &LONCAPA::clean_domain($env{'form.lcdomain'}))) { + # 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::lonnet::get_servers($domain,'library'); + 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='krb4'; - $genpwd=$ENV{'form.krbarg'}; - } elsif ($ENV{'form.login'} eq 'int') { + 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') { + $genpwd=$env{'form.intarg'}; + } elsif ($env{'form.login'} eq 'loc') { $amode='localauth'; - $genpwd=$ENV{'form.locarg'}; + $genpwd=$env{'form.locarg'}; if (!$genpwd) { $genpwd=" "; } } - if (($amode) && ($genpwd)) { - &modifystudent($ENV{'form.cdomain'},$ENV{'form.cuname'}, - $ENV{'request.course.id'},$ENV{'form.csec'}); - $r->print(&Apache::lonnet::modifystudent( - $ENV{'form.cdomain'},$ENV{'form.cuname'}, - $ENV{'form.cstid'},$amode,$genpwd, - $ENV{'form.cfirst'},$ENV{'form.cmiddle'}, - $ENV{'form.clast'},$ENV{'form.cgen'}, - $ENV{'form.csec'},$ENV{'form.enddate'}, - $ENV{'form.startdate'},$ENV{'form.forceid'})); + 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. + &Apache::lonuserutils::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,$env{'form.emailaddress'}); + 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('Invalid login mode or password'); - } + $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('Invalid username or domain'); + $r->print(&mt('Invalid username or domain')); } + $r->print("".&mt("Enroll another student")."
"); + if (ref($srcharray) eq 'ARRAY') { + foreach my $item (@{$srcharray},'ccuname','ccdomain') { + $r->print(''."\n"); + } + } + foreach my $item ('sortby','seluname','seludom') { + if (exists($env{'form.'.$item})) { + $r->print(''."\n"); + } + } + $r->print(''."\n". + ''."\n". + ''."\n". + ''."\n". + ''); +} + +sub setup_date_selectors { + my ($starttime,$endtime,$mode) = @_; + if (! defined($starttime)) { + $starttime = time; + unless ($mode eq 'create_enrolldates' || $mode eq 'create_defaultdates') { + 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 'create_enrolldates') { + $startdateform = &Apache::lonhtmlcommon::date_setter('ccrs', + 'startenroll', + $starttime); + $enddateform = &Apache::lonhtmlcommon::date_setter('ccrs', + 'endenroll', + $endtime); + } + if ($mode eq 'create_defaultdates') { + $startdateform = &Apache::lonhtmlcommon::date_setter('ccrs', + 'startaccess', + $starttime); + $enddateform = &Apache::lonhtmlcommon::date_setter('ccrs', + 'endaccess', + $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.' | '."
: | +|
: | +|
: | +|
: | +|
: | +$homeserver_form |
: | +
+END
+ if ($krbform ne '') {
+ $user_data_html .= $krbform.'
';
+ }
+ if ($intform ne '') {
+ $user_data_html .= $intform.'
';
+ }
+ if ($locform ne '') {
+ $user_data_html .= $locform.'
';
+ }
+ $user_data_html .= "\n
: | +|
: | +|
: | +|
: | +|
: | +
ID/Student Number:
- -Group/Section:
- -Username:
-Domain: $domform
-Note: login settings below will not take effect if the user already exists -
-$krbform -
-$intform -
-$locform -
-
-Set Starting Date + +$user_data_html + +
: +
+$date_table ++:
-
-
-
+
ERROR:$error'); + $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(''.(' 'x3)); + } + $r->print('\n"); + $r->print(''. + "\n
\n"); + # + # Print the classlist + $r->print('username | domain | -ID | student name | generation | -section | |||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
'. - 'Internal error: unable to get environment '. - 'for '.$sname.' in domain '.$sdom.' | ||||||||||||||||||||||||||||||||
$lt{'type'} | + "); + } else { + $r->print(" +Count | + "); + } + $r->print(<+ $lt{'dom'} + | + ID + | + $lt{'sn'} + | + $lt{'sec'} + | + $lt{'start'} + | + $lt{'end'} + | + $lt{'grp'} + | + $lt{'email'} + | +END + +# Clicker display on or off? + + my %clicker_options = &Apache::lonlocal::texthash( + 'on' => 'Show', + 'off' => 'Hide', + ); + my $clickerchg = 'on'; + if ($displayclickers eq 'on') { + $clickerchg = 'off'; + } + $r->print(''."\n".' '. + ''. + $clicker_options{$clickerchg}.' '.$lt{'clicker'}."\n". + ' | '."\n"); + +# Photo display on or off? + if ($env{'course.'.$env{'request.course.id'}.'.internal.showphoto'}) { + my %photo_options = &Apache::lonlocal::texthash( + 'on' => 'Show', + 'off' => 'Hide', + ); + my $photochg = 'on'; + if ($displayphotos eq 'on') { + $photochg = 'off'; + } + $r->print(''."\n".' '. + ''. + $photo_options{$photochg}.' '.$lt{'photo'}."\n". + ' | '."\n"); + } + $r->print("
'.&mt('manual').' | |
'. + &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(); + } + if ($mode eq 'autoenroll') { + return ($studentcount,$autocount,$manualcount,$lockcount,$unlockcount); + } + return; +} + + +# +# 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', + 'permanentemail'], $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.').'
'.&Apache::loncommon::end_page()); + return; + } + # determine the students starting and ending times and section + my ($starttime,$endtime,$section) = &get_enrollment_data($sname,$sdom); + if ($starttime =~ /^error/) { + $r->print(''.$starttime.'
'); + return; + } + # + # Deal with date forms + my $current_date_description = ''; + my $textdate = ''; + + if (! defined($starttime) || $starttime == 0) { + $current_date_description = &mt('Current Starting Date: not set'). + '+ +$lt{'odcc'} + +
+ + + + + + ++$lt{'sn'} +
$lt{'fn'} | $lt{'mn'} | $lt{'ln'} | $lt{'gen'} |
---|---|---|---|
+ | + | + | + |
+$lt{'email'}: +
+$lt{'sid'}: +
+ +
+$lt{'sec'}: +
+$current_date_description
+$date_table
+ +END + $r->print(&Apache::loncommon::end_page()); + return; +} + +# +# modify a single students section +# +sub modify_single_student { + my ($r) = @_; + # + # Remove non alphanumeric values from the section + $env{'form.section'} =~ s/\W//g; + # + # Do the date defaults first + my ($starttime,$endtime) = &Apache::lonuserutils::get_dates_from_form(); + if ($env{'form.makedatesdefault'}) { + $r->print(&Apache::lonuserutils::make_dates_default($starttime, + $endtime)); + } + # Get the 'sortby' and 'Status' variables so the user goes back to their + # previous screen + my $sortby = $env{'form.sortby'}; + my $status = $env{'form.Status'}; + # + # We always need this information + my $slogin = $env{'form.slogin'}; + my $sdom = $env{'form.sdomain'}; + # + # Get the old data + my %old=&Apache::lonnet::get('environment', + ['firstname','middlename', + 'lastname','generation','id', + 'permanentemail'],$sdom, $slogin); + $old{'section'} = &Apache::lonnet::getsection($sdom,$slogin, + $env{'request.course.id'}); + my ($tmp) = keys(%old); + if ($tmp =~ /^(con_lost|error|no_such_host)/i) { + $r->print(&mt('There was an error determining the environment values for')." $slogin : $sdom."); + return; + } + undef $tmp; + # + # Get the new data + my $firstname = $env{'form.firstname'}; + my $middlename = $env{'form.middlename'}; + my $lastname = $env{'form.lastname'}; + my $generation = $env{'form.generation'}; + my $permanentemail = $env{'form.permanentemail'}; + my $section = $env{'form.section'}; + my $courseid = $env{'request.course.id'}; + my $sid = $env{'form.id'}; + my $displayable_starttime = localtime($starttime); + my $displayable_endtime = localtime($endtime); + # + # check for forceid override + if ((defined($old{'id'})) && ($old{'id'} ne '') && + ($sid ne $old{'id'}) && (! exists($env{'form.forceid'}))) { + $r->print("".&mt('You changed the students id but did not disable the ID change safeguard. The students id will not be changed.').""); + $sid = $old{'id'}; + } + # + # talk to the user about what we are going to do + my %lt=&Apache::lonlocal::texthash( + 'mdu' => "Modifying data for user", + 'si' => "Student Information", + 'fd' => "Field", + 'ov' => "Old Value", + 'nv' => "New Value", + 'fn' => "First name", + 'mn' => "Middle name", + 'ln' => "Last name", + 'gen' => "Generation", + 'em' => "E-mail address", + 'sec' => "Section", + 'ri' => "Role Information", + 'st' => "Start Time", + 'et' => "End Time", + ); + $r->print(<$lt{si} | +||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
+
|
+
$lt{'ri'} | +||||
---|---|---|---|---|
+
|
+
+END
+ #
+ # Send request(s) to modify data (final undef is for 'desiredhost',
+ # which is a moot point because the student already has an account.
+ my $modify_section_results =
+ &Apache::lonuserutils::modifystudent($sdom,$slogin,
+ $env{'request.course.id'},
+ $section,undef);
+ if ($modify_section_results !~ /^ok/) {
+ $r->print(&mt('An error occured during the attempt to change the section for this student.')."
+
+
+
+$Masd
+END
+ $r->print(&Apache::loncommon::end_page());
+ return;
+}
+
+sub get_enrollment_data {
+ my ($sname,$sdomain) = @_;
+ my $courseid = $env{'request.course.id'};
+ my $cdom = $env{'course.'.$courseid.'.domain'};
+ my $cnum = $env{'course.'.$courseid.'.num'};
+ my %roles = &Apache::lonnet::dump('roles',$sdomain,$sname);
+ my ($tmp) = keys(%roles);
+ # Bail out if we were unable to get the students roles
+ return ('error'.$tmp) if ($tmp =~ /^(con_lost|error|no_such_host)/i);
+ # Go through the roles looking for enrollment in this course
+ my ($end,$start) = (undef,undef);
+ my $section = '';
+ my $count = scalar(keys(%roles));
+ while (my ($course,$role) = each(%roles)) {
+ if ($course=~m{^/\Q$cdom\E/\Q$cnum\E/*\s*(\w+)*_st$} ) {
+ #
+ # Get active role
+ $section=$1;
+ (undef,$end,$start)=split(/\_/,$role);
+ my $now=time;
+ my $notactive=0;
+ if ($start) {
+ if ($now<$start) { $notactive=1; }
+ }
+ if ($end) {
+ if ($now>$end) { $notactive=1; }
+ }
+ unless ($notactive) { return ($start,$end,$section); }
+ }
+ }
+ return ($start,$end,$section);
+}
+
+#################################################
+#################################################
+
+=pod
+
+=item show_drop_list
+
+Display a list of students to drop
+Inputs:
+
+=over 4
+
+=item $r, Apache request
+
+=item $classlist, hash pointer returned from loncoursedata::get_classlist();
+
+=item $keylist, array pointer returned from loncoursedata::get_classlist()
+which describes the order elements are stored in the %$classlist values.
+
+=item $nosort, if true, sorting links are omitted.
+
+=back
+
+=cut
+
+#################################################
+#################################################
+sub show_drop_list {
+ my ($r,$classlist,$keylist,$nosort)=@_;
+ my $cid=$env{'request.course.id'};
+ if (! exists($env{'form.sortby'})) {
+ &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
+ ['sortby']);
+ }
+ my $sortby = $env{'form.sortby'};
+ if ($sortby !~ /^(username|domain|section|groups|fullname|id|start|end)$/) {
+ $sortby = 'username';
+ }
+ my $cdom = $env{'course.'.$cid.'.domain'};
+ my $cnum = $env{'course.'.$cid,'.num'};
+ my ($classgroups) = &Apache::loncoursedata::get_group_memberships(
+ $classlist,$keylist,$cdom,$cnum);
+ #
+ my $action = "drop";
+ $r->print(<
+
+END
+
+my %lt=&Apache::lonlocal::texthash('usrn' => "username",
+ 'dom' => "domain",
+ 'sn' => "student name",
+ 'sec' => "section",
+ 'start' => "start date",
+ 'end' => "end date",
+ 'groups' => "active groups",
+ );
+ if ($nosort) {
+ $r->print(&Apache::loncommon::start_data_table());
+ $r->print(<
+
+
+ \n";
+ $str .= ''."\n";
+ $str .= '
");
+ }
+ my $roleresults = &Apache::lonnet::modifystudent
+ ($sdom,$slogin,$sid,undef,undef,$firstname,$middlename,$lastname,
+ $generation,$section,$endtime,$starttime,$env{'form.forceid'},
+ undef,$permanentemail);
+ if ($old{'permanentemail'} ne $permanentemail) {
+ &Apache::loncommon::flush_email_cache($slogin,$sdom);
+ }
+ if ($roleresults eq 'refused' ) {
+ $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.'));
+ } elsif ($roleresults !~ /ok/) {
+ $r->print(&mt('An error occurred during the attempt to change the role information for this student.')."
".
+ &mt('The error reported was')." ".
+ $roleresults);
+ &Apache::lonnet::logthis("londropadd:failed attempt to modify student".
+ " data for ".$slogin." : ".$sdom." by ".
+ $env{'user.name'}." : ".$env{'user.domain'}.
+ ":".$roleresults);
+ } else { # everything is okay!
+ $r->print(&mt('Student information updated successfully.')."
".
+ &mt('The student must log out and log in again to see these changes.'));
+ }
+ my $Masd=&mt('Modify another students data');
+ $r->print(<
- $sname
- $sdom
- $reply{$sname}
- $info{'lastname'}, $info{'firstname'} $info{'middlename'}
- $info{'generation'}
- $ssec
+
+ $lt{'usrn'}
+ $lt{'dom'}
+ ID
+ $lt{'sn'}
+ $lt{'sec'}
+ $lt{'start'}
+ $lt{'end'}
+ $lt{'groups'}
END
+
+ } else {
+ $r->print(&Apache::loncommon::start_data_table());
+ $r->print(<
+
+ $lt{'usrn'}
+
+ $lt{'dom'}
+
+ ID
+
+ $lt{'sn'}
+
+ $lt{'sec'}
+
+ $lt{'start'}
+
+ $lt{'end'}
+
+ $lt{'groups'}
+
+
+END
+ }
+ #
+ # Sort the students
+ my %index;
+ my $i;
+ foreach (@$keylist) {
+ $index{$_} = $i++;
+ }
+ $index{'groups'} = scalar(@$keylist);
+ my $index = $index{$sortby};
+ my $second = $index{'username'};
+ my $third = $index{'domain'};
+ my @Sorted_Students = sort {
+ lc($classlist->{$a}->[$index]) cmp lc($classlist->{$b}->[$index])
+ ||
+ lc($classlist->{$a}->[$second]) cmp lc($classlist->{$b}->[$second])
+ ||
+ lc($classlist->{$a}->[$third]) cmp lc($classlist->{$b}->[$third])
+ } (keys(%$classlist));
+ foreach my $student (@Sorted_Students) {
+ my $error;
+ my $sdata = $classlist->{$student};
+ my $username = $sdata->[$index{'username'}];
+ my $domain = $sdata->[$index{'domain'}];
+ my $section = $sdata->[$index{'section'}];
+ my $name = $sdata->[$index{'fullname'}];
+ my $id = $sdata->[$index{'id'}];
+ my $start = $sdata->[$index{'start'}];
+ my $end = $sdata->[$index{'end'}];
+ my $groups = $classgroups->{$student};
+ my $active_groups;
+ if (ref($groups->{active}) eq 'HASH') {
+ $active_groups = join(', ',keys(%{$groups->{'active'}}));
}
+ if (! defined($start) || $start == 0) {
+ $start = &mt('none');
+ } else {
+ $start = &Apache::lonlocal::locallocaltime($start);
+ }
+ if (! defined($end) || $end == 0) {
+ $end = &mt('none');
+ } else {
+ $end = &Apache::lonlocal::locallocaltime($end);
+ }
+ my $status = $sdata->[$index{'status'}];
+ next if ($status ne 'Active');
+ #
+ $r->print(&Apache::loncommon::start_data_table_row());
+ $r->print(<<"END");
+
+ $username
+ $domain
+ $id
+ $name
+ $section
+ $start
+ $end
+ $active_groups
+END
+ $r->print(&Apache::loncommon::end_data_table_row());
}
- $r->print('
');
- $r->print('');
+ $r->print(&Apache::loncommon::end_data_table().'
');
+ %lt=&Apache::lonlocal::texthash(
+ 'dp' => "Drop Students",
+ 'ca' => "check all",
+ 'ua' => "uncheck all",
+ );
+ $r->print(<<"END");
+".&mt('Upload a class list')."
\n";
+ $str .= &Apache::loncommon::upfile_select_html();
+ $str .= "
\n";
+ $str .= &Apache::loncommon::help_open_topic("Course_Convert_To_CSV",
+ &mt("How do I create a CSV file from a spreadsheet")).
+ "
\n";
+ $str .= &Apache::loncommon::end_page();
+ $r->print($str);
+ return;
}
# ================================================= Drop/Add from uploaded file
@@ -696,50 +2337,93 @@ sub upfile_drop_add {
my $r=shift;
&Apache::loncommon::load_tmp_file($r);
my @studentdata=&Apache::loncommon::upfile_record_sep();
- my @keyfields = split(/\,/,$ENV{'form.keyfields'});
- my $cid = $ENV{'request.course.id'};
+ if($env{'form.noFirstLine'}){shift(@studentdata);}
+ my @keyfields = split(/\,/,$env{'form.keyfields'});
+ my $cid = $env{'request.course.id'};
my %fields=();
- for (my $i=0; $i<=$ENV{'form.nfields'}; $i++) {
- if ($ENV{'form.upfile_associate'} eq 'reverse') {
- if ($ENV{'form.f'.$i} ne 'none') {
- $fields{$keyfields[$i]}=$ENV{'form.f'.$i};
+ for (my $i=0; $i<=$env{'form.nfields'}; $i++) {
+ if ($env{'form.upfile_associate'} eq 'reverse') {
+ if ($env{'form.f'.$i} ne 'none') {
+ $fields{$keyfields[$i]}=$env{'form.f'.$i};
}
} else {
- $fields{$ENV{'form.f'.$i}}=$keyfields[$i];
+ $fields{$env{'form.f'.$i}}=$keyfields[$i];
}
}
#
- my $startdate = $ENV{'form.startdate'};
- my $enddate = $ENV{'form.enddate'};
- if ($startdate=~/\D/) { $startdate=''; }
- if ($enddate=~/\D/) { $enddate=''; }
+ # Store the field choices away
+ foreach my $field (qw/username names
+ fname mname lname gen id sec ipwd email/) {
+ $env{'form.'.$field.'_choice'}=$fields{$field};
+ }
+ &Apache::loncommon::store_course_settings('enrollment_upload',
+ { 'username_choice' => 'scalar',
+ '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' });
+
#
- my $domain=$ENV{'form.lcdomain'};
+ my ($startdate,$enddate) = &get_dates_from_form();
+ if ($env{'form.makedatesdefault'}) {
+ $r->print(&make_dates_default($startdate,$enddate));
+ }
+ # Determine domain and desired host (home server)
+ my $domain=$env{'form.lcdomain'};
+ my $desiredhost = $env{'form.lcserver'};
+ if (lc($desiredhost) eq 'default') {
+ $desiredhost = undef;
+ } else {
+ my %home_servers = &Apache::lonnet::get_servers($domain,'library');
+ if (! exists($home_servers{$desiredhost})) {
+ $r->print(''.&mt('Error').''.
+ &mt('Invalid home server specified'));
+ $r->print(&Apache::loncommon::end_page());
+ return;
+ }
+ }
# Determine authentication mechanism
my $amode = '';
my $genpwd = '';
- if ($ENV{'form.login'} eq 'krb') {
- $amode='krb4';
- $genpwd=$ENV{'form.krbarg'};
- } elsif ($ENV{'form.login'} eq 'int') {
+ if ($env{'form.login'} eq 'krb') {
+ $amode='krb';
+ $amode.=$env{'form.krbver'};
+ $genpwd=$env{'form.krbarg'};
+ } elsif ($env{'form.login'} eq 'int') {
$amode='internal';
- if ((defined($ENV{'form.intarg'})) && ($ENV{'form.intarg'})) {
- $genpwd=$ENV{'form.intarg'};
+ if ((defined($env{'form.intarg'})) && ($env{'form.intarg'})) {
+ $genpwd=$env{'form.intarg'};
}
- } elsif ($ENV{'form.login'} eq 'loc') {
+ } elsif ($env{'form.login'} eq 'loc') {
$amode='localauth';
- if ((defined($ENV{'form.locarg'})) && ($ENV{'form.locarg'})) {
- $genpwd=$ENV{'form.locarg'};
+ if ((defined($env{'form.locarg'})) && ($env{'form.locarg'})) {
+ $genpwd=$env{'form.locarg'};
}
}
- unless (($domain=~/\W/) || ($amode eq '')) {
+ if ($amode =~ /^krb/) {
+ if (! defined($genpwd) || $genpwd eq '') {
+ $r->print(''.
+ &mt('Unable to enroll students').' '.
+ &mt('No Kerberos domain was specified.').'
\n"); my $count=0; my $flushc=0; my %student=(); + # Get information about course groups + my %curr_groups = &Apache::longroup::coursegroups(); # Get new classlist foreach (@studentdata) { my %entries=&Apache::loncommon::record_sep($_); @@ -764,10 +2448,12 @@ sub upfile_drop_add { $gen=$entries{$fields{'gen'}}; } } - if ($entries{$fields{'username'}}=~/\W/) { - $r->print('
Unacceptable username: '. - $entries{$fields{'username'}}.' for user '. - $fname.' '.$mname.' '.$lname.' '.$gen.'
');
+ if ($entries{$fields{'username'}}
+ ne &LONCAPA::clean_username($entries{$fields{'username'}})) {
+ $r->print('
'.
+ &mt('[_1]: Unacceptable username for user [_2] [_3] [_4] [_5]',
+ $entries{$fields{'username'}},$fname,$mname,$lname,$gen).
+ '');
} else {
# determine section number
my $sec='';
@@ -777,6 +2463,19 @@ sub upfile_drop_add {
$sec=$entries{$fields{'sec'}};
}
}
+ # remove non alphanumeric values from section
+ $sec =~ s/\W//g;
+ if ($sec eq "none" || $sec eq 'all') {
+ $r->print('
'.
+ &mt('[_1]: Unable to enroll: section name "[_2]" for user [_3] [_4] [_5] [_6] is a reserved word.',
+ $username,$sec,$fname,$mname,$lname,$gen));
+ next;
+ } elsif (($sec ne '') && (exists($curr_groups{$sec}))) {
+ $r->print('
'.
+ &mt('[_1]: Unable to enroll: section name "[_2]" for user [_3] [_4] [_5] [_6] is a course group. Section names and group names must be distinct.',
+ $username,$sec,$fname,$mname,$lname,$gen));
+ next;
+ }
# determine student id number
my $id='';
if (defined($fields{'id'})) {
@@ -785,6 +2484,14 @@ sub upfile_drop_add {
}
$id=~tr/A-Z/a-z/;
}
+ # determine email address
+ my $email='';
+ if (defined($fields{'email'})) {
+ if (defined($entries{$fields{'email'}})) {
+ $email=$entries{$fields{'email'}};
+ unless ($email=~/^[^\@]+\@[^\@]+$/) { $email=''; }
+ }
+ }
# determine student password
my $password='';
if ($genpwd) {
@@ -796,16 +2503,24 @@ sub upfile_drop_add {
}
}
}
- if ($password) {
- &modifystudent($domain,$username,$cid,$sec);
+ # Clean up whitespace
+ foreach (\$domain,\$username,\$id,\$fname,\$mname,
+ \$lname,\$gen,\$sec) {
+ $$_ =~ s/(\s+$|^\s+)//g;
+ }
+ if ($password || $env{'form.login'} eq 'loc') {
+ &Apache::lonuserutils::modifystudent($domain,
+ $username,$cid,
+ $sec,$desiredhost);
my $reply=&Apache::lonnet::modifystudent
($domain,$username,$id,$amode,$password,
$fname,$mname,$lname,$gen,$sec,$enddate,
- $startdate,$ENV{'form.forceid'});
+ $startdate,$env{'form.forceid'},$desiredhost,
+ $email);
if ($reply ne 'ok') {
- $r->print('
'. - 'Error enrolling '.$username.': '. - $reply.'
'); + $reply =~ s/^error://; + $r->print('No password for $username
");
+ $r->print('
'.
+ &mt('[_1]: Unable to enroll. No password specified.',$username)
+ );
}
}
}
} # end of foreach (@studentdata)
- $r->print('
Processed Students: '.$count); + $r->print("
\n\n".&mt('Processed [_1] student(s).',$count). + "
\n"); + $r->print("\n". + &mt('If active, the new role will be available when the '. + 'students next log in to LON-CAPA.')."
\n"); ##################################### # Drop students # ##################################### - if ($ENV{'form.fullup'} eq 'yes') { - $r->print('ERROR:$error'); - } - if (defined(%currentlist)) { - # Drop the students + my ($classlist,$keylist)=&Apache::loncoursedata::get_classlist(); + if (! defined($classlist)) { + $r->print(&mt('There are no students currently enrolled.'). + "\n"); + } else { + # Remove the students we just added from the list of students. foreach (@studentdata) { my %entries=&Apache::loncommon::record_sep($_); unless (($entries{$fields{'username'}} eq '') || (!defined($entries{$fields{'username'}}))) { - delete($currentlist{$entries{$fields{'username'}}. + delete($classlist->{$entries{$fields{'username'}}. ':'.$domain}); } } - # Print out list of dropped students - &show_drop_list($r,%currentlist); - } else { - $r->print("There are no students currently enrolled.\n"); + # Print out list of dropped students. + &show_drop_list($r,$classlist,$keylist,'nosort'); } } } # end of unless @@ -857,79 +2574,326 @@ sub upfile_drop_add { sub drop_student_list { my $r=shift; my $count=0; - foreach (@{$ENV{'form.droplist'}}) { + my @droplist = &Apache::loncommon::get_env_multiple('form.droplist'); + foreach (@droplist) { my ($uname,$udom)=split(/\:/,$_); - &modifystudent($udom,$uname,$ENV{'request.course.id'}); - $r->print('Dropped '.$uname.' at '.$udom.'
Dropped '.$count.' student(s).'); - $r->print('
Re-enrollment will re-activate data.'); + $r->print('
'.&mt('Dropped [_1] student(s).',$count).'
'); + $r->print(''.&mt('Re-enrollment will re-activate data.')) if ($count);
+}
+
+sub section_check_js {
+ my $groupslist;
+ my %curr_groups = &Apache::longroup::coursegroups();
+ if (%curr_groups) {
+ $groupslist = join('","',sort(keys(%curr_groups)));
+ }
+ return <<"END";
+function validate(caller) {
+ var groups = new Array("$groupslist");
+ var secname = caller.value;
+ if ((secname == 'all') || (secname == 'none')) {
+ alert("'"+secname+"' may not be used as the name for a section, as it is a reserved word.\\nPlease choose a different section name.");
+ return 'error';
+ }
+ if (secname != '') {
+ for (var k=0; k