--- loncom/interface/Attic/londropadd.pm 2002/04/16 21:02:17 1.26
+++ loncom/interface/Attic/londropadd.pm 2007/08/31 03:22:51 1.169
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Handler to drop and add students in courses
#
-# $Id: londropadd.pm,v 1.26 2002/04/16 21:02:17 matthew Exp $
+# $Id: londropadd.pm,v 1.169 2007/08/31 03:22:51 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -25,276 +25,456 @@
#
# 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 $r=shift;
- $r->print(<
-
-LON-CAPA Student Drop/Add
-
-
-
-
Drop/Add Students
-
\n";
+ $Str .= "
".&mt('Student Number')."
\n";
+ $Str .= "
\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('
Enrolling Student
');
- if (($ENV{'form.cuname'})&&($ENV{'form.cuname'}!~/\W/)&&
- ($ENV{'form.cdomain'})&&($ENV{'form.cdomain'}!~/\W/)) {
+ my ($r,$srcharray) = @_;
+ # 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('
\n";
+ return $result;
+}
+
+sub make_dates_default {
+ my ($startdate,$enddate) = @_;
+ my $result = '';
+ my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+ my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
+ my $put_result = &Apache::lonnet::put('environment',
+ {'default_enrollment_start_date'=>$startdate,
+ 'default_enrollment_end_date' =>$enddate},$dom,$crs);
+ if ($put_result eq 'ok') {
+ $result .= "Set default start and end dates for course ";
+ #
+ # Refresh the course environment
+ &Apache::lonnet::coursedescription($env{'request.course.id'},
+ {'freshen_cache' => 1});
+ } else {
+ $result .= &mt('Unable to set default dates for course').":".$put_result.
+ ' ';
+ }
+ return $result;
}
-# ======================================================= Menu Phase Two Enroll
-sub menu_phase_two_enroll {
- my $r=shift;
- my ($krbdefdom) = $ENV{'SERVER_NAME'}=~/(\w+\.\w+)$/;
- $krbdefdom=~tr/a-z/A-Z/;
- my $today = time;
- my $halfyear = $today+15552000;
- my $defdom=$r->dir_config('lonDefDomain');
- my $javascript_validations=&javascript_validations($krbdefdom);
- $r->print(<
-function verify(vf) {
+##
+## Single student enrollment routines (some of them)
+##
+sub get_student_username_domain_form {
+ my ($r,$elements,$response,$srch,$forcenewuser) = @_;
+ my $loaditems = {
+ 'onload' => "javascript:setFormElements(document.studentform)",
+ };
+ $r->print(&header(undef,$loaditems));
+ &Apache::lonhtmlcommon::add_breadcrumb
+ ({href=>"javascript:backPage(document.studentform,'','')",
+ text=>"Single user search"});
+ $r->print(&Apache::lonhtmlcommon::breadcrumbs('Enroll Student',
+ 'Course_Add_Student'));
+ my $defdom=$env{'request.role.domain'};
+
+ my $jscript = &Apache::loncommon::studentbrowser_javascript()."\n".
+ ''."\n";
+
+ my %lt=&Apache::lonlocal::texthash(
+ 'eos' => "Enroll One Student",
+ 'usr' => "Username",
+ 'dom' => "Domain",
+ 'been' => "Begin Enrollment",
+ );
+ $r->print(<$lt{'eos'}
+END
+ $r->print($response);
+ $r->print(&single_user_entry_form($defdom,$srch,$forcenewuser));
+ return;
+}
+
+sub single_user_entry_form {
+ my ($dom,$srch,$forcenewuser) = @_;
+ my $userpicker =
+ &Apache::loncommon::user_picker($dom,$srch,$forcenewuser,
+ 'document.studentform');
+ my $srchbutton = &mt('Search');
+ my $output = <<"ENDDOCUMENT";
+
+
+
+$userpicker
+
+ENDDOCUMENT
+ return $output;
+}
+
+sub print_enroll_single_student_form {
+ my ($r,$jscript,$ccuname,$ccdomain,$srch) = @_;
+ $r->print(&header($jscript));
+ &Apache::lonhtmlcommon::add_breadcrumb
+ ({href=>"javascript:backPage(document.studentform,'','')",
+ text=>"Single user search"});
+ if ($env{'form.phase'} eq 'userpicked') {
+ &Apache::lonhtmlcommon::add_breadcrumb
+ ({href=>"javascript:backPage(document.studentform,'get_user_info','select')",
+ text=>"Select user",});
+ }
+ &Apache::lonhtmlcommon::add_breadcrumb
+ ({href=>"javascript:backPage(document.studentform,'$env{'form.phase'}','modify')",
+ text=>"Set enrollment",});
+ $r->print(&Apache::lonhtmlcommon::breadcrumbs('Enroll Student',
+ 'Course_Add_Student'));
+ $r->print("
".&mt('Enroll One Student')."
");
+ #
+ my $home = &Apache::lonnet::homeserver($ccuname,$ccdomain);
+ # $new_user flags whether we are creating a new user or using an old one
+ my $new_user = 1;
+ if ($home ne 'no_host') {
+ $new_user = 0;
+ }
+ #
+ my $user_data_html = '';
+ my $javascript_validations = '';
+ if ($new_user) {
+ my $usertoadd;
+ my $instsrch = {
+ srchin => 'instd',
+ srchby => 'uname',
+ srchtype => 'exact',
+ srchterm => $ccuname,
+ srchdomain => $ccdomain,
+ };
+ if (($instsrch->{'srchterm'} ne '') && ($instsrch->{'srchdomain'} ne '')) {
+ $usertoadd = $instsrch->{'srchterm'}.':'.$instsrch->{'srchdomain'};
+ }
+ my (%dirsrch_results,%inst_results);
+ if ($usertoadd) {
+ if (&Apache::loncreateuser::directorysrch_check($instsrch) eq 'ok') {
+ %dirsrch_results = &Apache::lonnet::inst_directory_query($instsrch);
+ if (ref($dirsrch_results{$usertoadd}) eq 'HASH') {
+ %inst_results = %{$dirsrch_results{$usertoadd}};
+ }
+ }
+ }
+
+ my $defdom=$env{'course.'.$env{'request.course.id'}.'.domain'};
+ # Set up authentication forms
+ my ($krbdef,$krbdefdom) =
+ &Apache::loncommon::get_kerberos_defaults($ccdomain);
+ $javascript_validations=&javascript_validations('auth',$krbdefdom);
+ my %param = ( formname => 'document.studentform',
+ kerb_def_dom => $krbdefdom,
+ kerb_def_auth => $krbdef
+ );
+ my $krbform = &Apache::loncommon::authform_kerberos(%param);
+ my $intform = &Apache::loncommon::authform_internal(%param);
+ my $locform = &Apache::loncommon::authform_local(%param);
+ #
+ # Set up domain selection form
+ my $homeserver_form = '';
+ my %servers = &Apache::lonnet::get_servers($ccdomain,'library');
+ $homeserver_form = '\n";
+ #
+ #
+ my %lt=&Apache::lonlocal::texthash(
+ 'udf' => "User Data for",
+ 'fn' => "First Name",
+ 'mn' => "Middle Name",
+ 'ln' => "Last Name",
+ 'gen' => "Generation",
+ 'hs' => "Home Server",
+ 'pswd' => "Password",
+ 'psam' => "Please select an authentication mechanism",
+ 'mail' => "Email Address"
+ );
+ my $authhelp=&Apache::loncommon::help_open_topic('Auth_Options');
+ $user_data_html = <$lt{'udf'} $ccuname:$ccdomain
+
+
:
+
+
:
+
+
:
+
+
:
+
+
:
+
$homeserver_form
+
:
+
+
+
$lt{'pswd'}
+$lt{'psam'}$authhelp
+
+
+$krbform
+
+$intform
+
+$locform
+
+END
+ } else {
+ # User already exists. Do not worry about authentication
+ my %uenv = &Apache::lonnet::dump('environment',$ccdomain,$ccuname);
+ $javascript_validations = &javascript_validations('noauth');
+ my %lt=&Apache::lonlocal::texthash(
+ 'udf' => "User Data for",
+ 'fn' => "First Name",
+ 'mn' => "Middle Name",
+ 'ln' => "Last Name",
+ 'gen' => "Generation",
+ 'mail' => "Email Address",
+ );
+ $user_data_html = <$lt{'udf'} $ccuname:$ccdomain
+
+
+
:
+
+
:
+
+
:
+
+
:
+
+
:
+
+
+END
+ }
+ my $date_table = &date_setting_table();
+ # Print it all out
+ my %lt=&Apache::lonlocal::texthash(
+ 'cd' => "Course Data",
+ 'gs' => "Section",
+ 'idsn' => "ID/Student Number",
+ 'disn' => "Disable ID/Student Number Safeguard and Force Change of Conflicting IDs (only do if you know what you are doing)",
+ 'eas' => "Enroll as student",
+ );
+ $r->print(<
+
+
+
+
-
-
-Disable ID/Student Number Safeguard and Force Change of Conflicting IDs
-(only do if you know what you are doing)
-
-
+
-ENDSENROLL
-}
-
-# =================================================== get the current classlist
-sub get_current_classlist {
- my ($domain,$identifier) = @_;
- # domain is the domain the class is being run in
- # identifier is the internal, unique identifier for the class.
- my %currentlist=();
- my $now=time;
- my %results=&Apache::lonnet::dump('classlist',$domain,$identifier);
- my ($tmp) = keys(%results);
- if ($tmp !~ /^(con_lost|error|no_such_host)/i) {
- foreach my $student (keys(%results)) {
- # Extract the start and end dates
- my ($end,$start)=split(/\:/,$results{$student});
- # If the class isn't over, put it in the list
- unless (($end) && ($now>$end)) {
- $currentlist{$student}=1;
- }
+END
+ $r->print(''."\n".
+ ''."\n".
+ ''."\n");
+ if (ref($srch) eq 'HASH') {
+ foreach my $item (sort(keys(%{$srch}))) {
+ $r->print(''."\n");
}
- return %currentlist;
- } else {
- return undef;
}
+ foreach my $item ('sortby','seluname','seludom') {
+ if (exists($env{'form.'.$item})) {
+ $r->print(''."\n");
+ }
+ }
+ return;
}
# ========================================================= Menu Phase Two Drop
-sub menu_phase_two_drop {
+sub print_drop_menu {
my $r=shift;
- my $cid=$ENV{'request.course.id'};
- my %currentlist=&get_current_classlist($ENV{'course.'.$cid.'.domain'},
- $ENV{'course.'.$cid.'.num'});
- if (!defined(%currentlist)) {
- $r->print(''.
- '
Could not access classlist.
');
+ $r->print("
".&mt('Drop Students')."
");
+ my $cid=$env{'request.course.id'};
+ my ($classlist,$keylist) = &Apache::loncoursedata::get_classlist();
+ if (! defined($classlist)) {
+ $r->print(&mt('There are no students currently enrolled.')."\n");
+ return;
+ }
+ # Print out the available choices
+ &show_drop_list($r,$classlist,$keylist);
+ return;
+}
+
+# ============================================== view classlist
+sub print_html_classlist {
+ my ($r,$mode,$permission) = @_;
+ if (! exists($env{'form.sortby'})) {
+ $env{'form.sortby'} = 'username';
+ }
+ if ($env{'form.Status'} !~ /^(Any|Expired|Active|Future)$/) {
+ $env{'form.Status'} = 'Active';
+ }
+ my $status_select = &Apache::lonhtmlcommon::StatusOptions
+ ($env{'form.Status'});
+ my $cid =$env{'request.course.id'};
+ my $cdom=$env{'course.'.$cid.'.domain'};
+ my $cnum=$env{'course.'.$cid.'.num'};
+ #
+ # List course personnel
+ my %coursepersonnel=&Apache::lonnet::get_course_adv_roles($cdom.'/'.$cnum);
+ #
+ if (! defined($env{'form.output'}) ||
+ $env{'form.output'} !~ /^(csv|excel|html)$/ ) {
+ $env{'form.output'} = 'html';
+ }
+ #
+ $r->print(' '.&Apache::loncommon::start_data_table());
+ foreach my $role (sort keys %coursepersonnel) {
+ next if ($role =~ /^\s*$/);
+ $r->print(&Apache::loncommon::start_data_table_row().
+ '
\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('
'.&mt('Current Class List').'
');
+ my ($classlist,$keylist)=&Apache::loncoursedata::get_classlist();
+
+ if (exists($permission->{'view_section'})) {
+ my $sec = &Apache::loncoursedata::CL_SECTION();
+ foreach my $student (keys(%{$classlist})) {
+ if ($classlist->{$student}[$sec] ne $permission->{'view_section'}) {
+ delete($classlist->{$student});
+ }
+ }
+ }
+
+ if (! defined($classlist)) {
+ $r->print(&mt('There are no students currently enrolled.')."\n");
} else {
# Print out the available choices
- &show_drop_list($r,%currentlist);
+ if ($env{'form.action'} eq 'modifystudent') {
+ &show_class_list($r,'view','modify',
+ $env{'form.Status'},$classlist,$keylist);
+ } else {
+ &show_class_list($r,$env{'form.output'},'aboutme',
+ $env{'form.Status'},$classlist,$keylist);
+ }
}
}
# =================================================== Show student list to drop
-sub show_drop_list {
- my ($r,%currentlist)=@_;
- my $cid=$ENV{'request.course.id'};
- $r->print(<<'END');
-
-
-
username
domain
-
ID
student name
generation
-
section
-END
- foreach (sort keys %currentlist) {
- my ($sname,$sdom)=split(/\:/,$_);
- my %reply=&Apache::lonnet::idrget($sdom,$sname);
- my $ssec=&Apache::lonnet::usection($sdom,$sname,$cid);
- my %info=&Apache::lonnet::get('environment',
- ['firstname','middlename',
- 'lastname','generation'],
- $sdom, $sname);
- my ($tmp) = keys(%info);
- if ($tmp =~ /^(con_lost|error|no_such_host)/i) {
- $r->print('
'.
- 'Internal error: unable to get environment '.
- 'for '.$sname.' in domain '.$sdom.'
');
+sub show_class_list {
+ my ($r,$mode,$linkto,$statusmode,$classlist,$keylist)=@_;
+ my $cid=$env{'request.course.id'};
+ my $cdom = $env{'course.'.$cid.'.domain'};
+ my $cnum = $env{'course.'.$cid.'.num'};
+ my ($classgroups) = &Apache::loncoursedata::get_group_memberships(
+ $classlist,$keylist,$cdom,$cnum);
+ #
+ # Variables for excel output
+ my ($excel_workbook, $excel_sheet, $excel_filename,$row,$format);
+ #
+ # Variables for csv output
+ my ($CSVfile,$CSVfilename);
+ #
+ my $sortby = $env{'form.sortby'};
+ if ($sortby !~ /^(username|domain|section|groups|fullname|id|start|end|type)$/) {
+ $sortby = 'username';
+ }
+ if (! exists($env{'form.displayphotos'})) {
+ $env{'form.displayphotos'} = 'off';
+ }
+ my $displayphotos = $env{'form.displayphotos'};
+
+ # Print out header
+ unless ($mode eq 'autoenroll') {
+ $r->print(<
+END
+ }
+ $r->print(<
+
+END
+ if ($mode eq 'html' || $mode eq 'view' || $mode eq 'autoenroll') {
+ if ($linkto eq 'aboutme') {
+ $r->print(&mt("Select a user name to view the user's personal page."));
+ } elsif ($linkto eq 'modify') {
+ $r->print(&mt("Select a user name to modify the student's information"));
+ }
+ my %lt=&Apache::lonlocal::texthash(
+ 'usrn' => "username",
+ 'dom' => "domain",
+ 'sn' => "student name",
+ 'sec' => "section",
+ 'grp' => "active groups",
+ 'start' => "start date",
+ 'end' => "end date",
+ 'type' => "enroll type/action",
+ 'email' => "email address",
+ 'photo' => "photo",
+ );
+ unless ($mode eq 'autoenroll') {
+ $r->print(<
+
+END
+ }
+ if ($env{'course.'.$env{'request.course.id'}.'.internal.showphoto'}) {
+ $r->print('
+
+ ');
+ }
+ $r->print("
+
'."\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('
'&mt('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').
+ ' ';
+ } else {
+ $current_date_description =
+ &mt('Current Starting Date: [_1]',
+ &Apache::lonlocal::locallocaltime($starttime)).' ';
+ }
+ if (! defined($endtime) || $endtime == 0) {
+ $current_date_description.= &mt('Current Ending Date: not set').
+ ' ';
+ } else {
+ $current_date_description.=
+ &mt('Current Ending Date: [_1]',
+ &Apache::lonlocal::locallocaltime($endtime)).' ';
+
+ }
+ my $date_table = &date_setting_table($starttime,$endtime);
+ #
+ if (! exists($env{'form.Status'}) ||
+ $env{'form.Status'} !~ /^(Any|Expired|Active|Future)$/) {
+ $env{'form.Status'} = 'crap';
+ }
+ # Make sure student is enrolled in course
+ my %lt=&Apache::lonlocal::texthash(
+ 'mef' => "Modify Enrollment for",
+ 'odcc' => "Only domain coordinators can change a users password.",
+ 'sn' => "Student Name",
+ 'fn' => "First",
+ 'mn' => "Middle",
+ 'ln' => "Last",
+ 'gen' => "Generation",
+ 'email' => "E-mail address",
+ 'sid' => "Student ID",
+ 'disn' => "Disable ID/Student Number Safeguard and Force Change of Conflicting IDs (only do if you know what you are doing)",
+ 'sec' => "Section",
+ 'sm' => "Submit Modifications",
+ );
+# Check if section name is valid
+ my $section_check = §ion_check_js();
+ $r->print(<<"END");
+
+
+
+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) = &get_dates_from_form();
+ if ($env{'form.makedatesdefault'}) {
+ $r->print(&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{'mdu'} $slogin:$sdom
+END
+ $r->print(<
+
+
+
+
+
$lt{si}
+
+
+
+
+
+
$lt{'fd'}
+
$lt{'ov'}
+
$lt{'nv'}
+
+
+
$lt{'fn'}
+
$old{'firstname'}
+
$firstname
+
+
+
$lt{'mn'}
+
$old{'middlename'}
+
$middlename
+
+
+
$lt{'ln'}
+
$old{'lastname'}
+
$lastname
+
+
+
$lt{'gen'}
+
$old{'generation'}
+
$generation
+
+
+
ID
+
$old{'id'}
+
$sid
+
+
+
$lt{'em'}
+
$old{'permanentemail'}
+
$permanentemail
+
+
$lt{'sec'}
+
$old{'section'}
+
$section
+
+
+
+
+
+
+
+
+
$lt{'ri'}
+
+
+
+
+
+
$lt{'st'}:
+
$displayable_starttime
+
+
+
$lt{'et'}:
+
$displayable_endtime
+
+
+
+
+
+
+
+
+
+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 = &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.')." ");
+ }
+ 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(<
+
+
+
+$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(<
+
+
+
+
\n";
+ $str .= &Apache::loncommon::help_open_topic("Course_Create_Class_List",
+ &mt("How do I create a class list from a spreadsheet")).
+ " \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
@@ -722,50 +2277,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.krbdom'};
- } 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.intpwd'})) && ($ENV{'form.intpwd'})) {
- $genpwd=$ENV{'form.intpwd'};
+ 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.').'');
+ $amode = ''; # This causes the loop below to be skipped
+ }
+ }
+ if ( $domain eq &LONCAPA::clean_domain($domain)
+ && ($amode ne '')) {
#######################################
## Enroll Students ##
#######################################
- $r->print('
Enrolling Students
');
+ $r->print('
'.&mt('Enrolling Students')."
\n
\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($_);
@@ -790,10 +2388,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='';
@@ -803,6 +2403,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'})) {
@@ -811,6 +2424,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) {
@@ -822,16 +2443,23 @@ 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') {
+ &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('
");
+ $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('
Dropping Students
');
+ if ($env{'form.fullup'} eq 'yes') {
+ $r->print('
'.&mt('Dropping Students')."
\n");
# Get current classlist
- my %currentlist=&get_current_classlist
- ($ENV{'course.'.$cid.'.domain'},
- $ENV{'course.'.$cid.'.num'});
- 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(''.
- '
Could not access classlist
');
+ # Print out list of dropped students.
+ &show_drop_list($r,$classlist,$keylist,'nosort');
}
}
} # end of unless
@@ -881,79 +2513,320 @@ 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.' ');
- $count++;
+ # drop student
+ my $result = &modifystudent($udom,$uname,$env{'request.course.id'});
+ if ($result eq 'ok' || $result eq 'ok:') {
+ $r->print(&mt('Dropped [_1]',$uname.'@'.$udom).' ');
+ $count++;
+ } else {
+ $r->print(
+ &mt('Error dropping [_1]:[_2]',$uname.'@'.$udom,$result).
+ ' ');
+ }
}
- $r->print('
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);
}
-# ================================================================ Main Handler
+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; kheader_only) {
- $r->content_type('text/html');
+ &Apache::loncommon::content_type($r,'text/html');
$r->send_http_header;
return OK;
}
+ &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
+ ['action','state']);
+
+ &Apache::lonhtmlcommon::clear_breadcrumbs();
+ &Apache::lonhtmlcommon::add_breadcrumb
+ ({href=>"/adm/dropadd",
+ text=>"Enrollment Manager",
+ faq=>9,bug=>'Instructor Interface',});
# Needs to be in a course
- if (($ENV{'request.course.fn'}) &&
- (&Apache::lonnet::allowed('cst',$ENV{'request.course.id'}))) {
- # Start page
- $r->content_type('text/html');
- $r->send_http_header;
- &header($r);
- # Phase one, initial screen
- unless ($ENV{'form.phase'}) {
- &menu_phase_one($r);
- }
- # Phase two
- if ($ENV{'form.associate'} eq 'Reverse Association') {
- $ENV{'form.phase'} = 'two';
- if ( $ENV{'form.upfile_associate'} ne 'reverse' ) {
- $ENV{'form.upfile_associate'} = 'reverse';
+ if (! ($env{'request.course.fn'})) {
+ # Not in a course
+ $env{'user.error.msg'}=
+ "/adm/dropadd:cst:0:0:Cannot manage or view course groups, ".
+ "or drop or add students";
+ return HTTP_NOT_ACCEPTABLE;
+ }
+ #
+
+ my ($permission,$allowed) = &get_permission();
+
+ if (!$allowed) {
+ $env{'user.error.msg'}=
+ "/adm/dropadd:cst:0:0:Cannot manage or view course groups, ".
+ "or drop or add students";
+ return HTTP_NOT_ACCEPTABLE;
+ }
+
+ #
+ # Only output the header information if they did not request csv format
+ #
+ # Start page
+ &Apache::loncommon::content_type($r,'text/html');
+ $r->send_http_header;
+ #
+ # Main switch on form.action and form.state, as appropriate
+ if (! exists($env{'form.action'})) {
+ $r->print(&header());
+ $r->print(&Apache::lonhtmlcommon::breadcrumbs('Enrollment Manager'));
+ my $action = &print_main_menu($r,$permission);
+ } elsif ($env{'form.action'} eq 'upload' && $permission->{'enrl'}) {
+ $r->print(&header());
+ &Apache::lonhtmlcommon::add_breadcrumb
+ ({href=>'/adm/dropadd?action=upload&state=',
+ text=>"Upload Classlist"});
+ $r->print(&Apache::lonhtmlcommon::breadcrumbs('Upload Classlist',
+ 'Course_Create_Class_List'));
+ if (! exists($env{'form.state'})) {
+ &print_first_courselist_upload_form($r);
+ } elsif ($env{'form.state'} eq 'got_file') {
+ &print_upload_manager_form($r);
+ } elsif ($env{'form.state'} eq 'enrolling') {
+ if ($env{'form.datatoken'}) {
+ &upfile_drop_add($r);
} else {
- $ENV{'form.upfile_associate'} = 'forward';
+ # Hmmm, this is an error
}
+ } else {
+ &print_first_courselist_upload_form($r);
}
- if ($ENV{'form.phase'} eq 'two') {
- if ($ENV{'form.fileupload'}) {
- &menu_phase_two_upload($r);
- } elsif ($ENV{'form.enroll'}) {
- &menu_phase_two_enroll($r);
- } elsif ($ENV{'form.drop'}) {
- &menu_phase_two_drop($r);
- }
+ } elsif ($env{'form.action'} eq 'drop' && $permission->{'enrl'}) {
+ $r->print(&header());
+ &Apache::lonhtmlcommon::add_breadcrumb
+ ({href=>'/adm/dropadd?action=drop',
+ text=>"Drop Students"});
+ $r->print(&Apache::lonhtmlcommon::breadcrumbs('Drop Students',
+ 'Course_Drop_Student'));
+ if (! exists($env{'form.state'})) {
+ &print_drop_menu($r);
+ } elsif ($env{'form.state'} eq 'done') {
+ &drop_student_list($r);
+ } else {
+ &print_drop_menu($r);
}
- # Phase three
- if ($ENV{'form.phase'} eq 'three') {
- if ($ENV{'form.datatoken'}) {
- &upfile_drop_add($r);
+ } elsif ($env{'form.action'} eq 'enrollstudent' && $permission->{'enrl'}) {
+ my @search = ('srchterm','srchby','srchin','srchtype','srchdomain');
+ my ($jsback,$elements) = &Apache::loncreateuser::crumb_utilities();
+ my $jscript = '';
+ if ($env{'form.state'} eq 'gotusername') {
+ my $srch;
+ foreach my $item (@search) {
+ $srch->{$item} = $env{'form.'.$item};
}
+ if ($env{'form.phase'} eq 'get_user_info') {
+ my ($currstate,$response,$forcenewuser,$results) =
+ &Apache::loncreateuser::user_search_result($srch);
+ if ($currstate eq 'select') {
+ $r->print(&header());
+ &Apache::lonhtmlcommon::add_breadcrumb
+ ({href=>"javascript:backPage(document.usersrchform,'','')",
+ text=>"Single user search"},
+ {href=>"javascript:backPage(document.usersrchform,'get_user_info','select')",
+ text=>"Select User",});
+ $r->print(&Apache::lonhtmlcommon::breadcrumbs('Enroll Student',
+ 'Course_Add_Student'));
+ &Apache::loncreateuser::print_user_selection_page($r,
+ $response,$srch,$results,'enrollstudent',\@search);
+ } elsif ($currstate eq 'modify') {
+ my ($ccuname,$ccdomain);
+ if (($srch->{'srchby'} eq 'uname') &&
+ ($srch->{'srchtype'} eq 'exact')) {
+ $ccuname = $srch->{'srchterm'};
+ $ccdomain= $srch->{'srchdomain'};
+ } else {
+ my @matchedunames = keys(%{$results});
+ ($ccuname,$ccdomain) = split(/:/,$matchedunames[0]);
+ }
+ $ccuname =&LONCAPA::clean_username($ccuname);
+ $ccdomain=&LONCAPA::clean_domain($ccdomain);
+ &print_enroll_single_student_form($r,$jscript,$ccuname,
+ $ccdomain,$srch,$response);
+ } elsif ($currstate eq 'query') {
+ $r->print(&header($jscript));
+ &Apache::lonhtmlcommon::add_breadcrumb
+ ({href=>"javascript:backPage(document.studentform,'','')",
+ text=>"Single user search"});
+ $r->print(&Apache::lonhtmlcommon::breadcrumbs('Enroll Student',
+ 'Course_Add_Student'));
+ &Apache::loncreateuser::print_user_query_page($r,'enrollstudent');
+ } else {
+ &get_student_username_domain_form($r,$elements,$response,
+ $srch,$forcenewuser);
+ }
+ } elsif ($env{'form.phase'} eq 'userpicked') {
+ my $ccuname = &LONCAPA::clean_username($env{'form.seluname'});
+ my $ccdomain = &LONCAPA::clean_domain($env{'form.seludom'});
+ &print_enroll_single_student_form($r,$jscript,$ccuname,
+ $ccdomain,$srch);
+ } else {
+ &get_student_username_domain_form($r,$elements);
+ }
+ } elsif ($env{'form.state'} eq 'enrolling') {
+ $r->print(&header($jscript));
+ &Apache::lonhtmlcommon::add_breadcrumb
+ ({href=>"javascript:backPage(document.studentform,'','')",
+ text=>"Single user search"});
+ if ($env{'form.prevphase'} eq 'userpicked') {
+ &Apache::lonhtmlcommon::add_breadcrumb
+ ({href=>"javascript:backPage(document.studentform,'get_user_info','select')",
+ text=>"Select user",});
+ }
+ &Apache::lonhtmlcommon::add_breadcrumb
+ ({href=>"javascript:backPage(document.studentform,'$env{'form.prevphase'}','modify')",
+ text=>"Set enrollment",},
+ {href=>"javascript:backPage(document.studentform,$env{'form.phase'},'')",
+ text=>"Result",});
+ $r->print(&Apache::lonhtmlcommon::breadcrumbs('Enroll Student',
+ 'Course_Add_Student'));
+ &enroll_single_student($r,\@search);
+ } else {
+ &get_student_username_domain_form($r,$elements);
}
- # Phase four
- if ($ENV{'form.phase'} eq 'four') {
- &drop_student_list($r);
+ } elsif ($env{'form.action'} eq 'classlist' && $permission->{'view'}) {
+ $r->print(&header());
+ &Apache::lonhtmlcommon::add_breadcrumb
+ ({href=>'/adm/dropadd?action=classlist',
+ text=>"View Classlist"});
+ $r->print(&Apache::lonhtmlcommon::breadcrumbs('View Classlist',
+ 'Course_View_Class_List'));
+ if (! exists($env{'form.state'})) {
+ &print_html_classlist($r,undef,$permission);
+ } elsif ($env{'form.state'} eq 'csv') {
+ &print_html_classlist($r,'csv',$permission);
+ } elsif ($env{'form.state'} eq 'excel') {
+ &print_html_classlist($r,'excel',$permission);
+ } else {
+ &print_html_classlist($r,undef,$permission);
}
- # Phase five
- if ($ENV{'form.phase'} eq 'five') {
- &enroll_single_student($r);
- }
- # End
- $r->print('