--- loncom/interface/Attic/londropadd.pm 2002/09/17 15:52:44 1.50 +++ loncom/interface/Attic/londropadd.pm 2003/08/25 16:36:58 1.80.2.1 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to drop and add students in courses # -# $Id: londropadd.pm,v 1.50 2002/09/17 15:52:44 matthew Exp $ +# $Id: londropadd.pm,v 1.80.2.1 2003/08/25 16:36:58 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -41,6 +41,7 @@ use Apache::lonnet(); use Apache::loncommon(); use Apache::lonhtmlcommon(); use Apache::Constants qw(:common :http REDIRECT); +use Spreadsheet::WriteExcel; ############################################################### ############################################################### @@ -78,13 +79,16 @@ sub modifystudent { # We are in this course my $section=$1; $section='' if ($course eq $courseid.'_st'); - if ( ((!$section) && (!$csec)) || ($section ne $csec) ) { + if ($section eq $csec) { + $result .= 'ok:'; + } elsif ( ((!$section) && (!$csec)) || ($section ne $csec) ) { my (undef,$end,$start)=split(/\_/,$roles{$course}); my $now=time; # if this is an active role if (!($start && ($now<$start)) || !($end && ($now>$end))) { my $reply=&Apache::lonnet::modifystudent - ($udom,$unam,'','','','','','','', + # dom name id mode pass f m l g + ($udom,$unam,'', '', '',undef,undef,undef,undef, $section,time,undef,undef,$desiredhost); $result .= $reply.':'; } @@ -92,7 +96,7 @@ sub modifystudent { } } if ($result eq '') { - $result eq 'Unable to find section for this student'; + $result = 'Unable to find section for this student'; } else { $result =~ s/(ok:)+/ok/g; } @@ -150,7 +154,7 @@ sub print_main_menu {
- View Classlist + View Class List
@@ -212,14 +216,16 @@ sub javascript_validations {
my %param = ( formname => 'studentform',
kerb_def_dom => $krbdefdom );
my $authheader = &Apache::loncommon::authform_header(%param);
+ my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition();
return (<
+
+$date_table
+
@@ -520,12 +516,11 @@ sub print_upload_manager_form {
my @records=&Apache::loncommon::upfile_record_sep();
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');
+ my $defdom=$ENV{'request.role.domain'};
+ my ($krbdef,$krbdefdom) =
+ &Apache::loncommon::get_kerberos_defaults($defdom);
&print_upload_manager_header($r,$datatoken,$distotal,$krbdefdom);
my $i;
my $keyfields;
@@ -538,7 +533,8 @@ sub print_upload_manager_form {
['gen','Generation'],
['id','ID/Student Number'],
['sec','Group/Section'],
- ['ipwd','Initial Password']);
+ ['ipwd','Initial Password'],
+ ['email','EMail Address']);
if ($ENV{'form.upfile_associate'} eq 'reverse') {
&Apache::loncommon::csv_print_samples($r,\@records);
$i=&Apache::loncommon::csv_print_select_table($r,\@records,\@d);
@@ -557,8 +553,20 @@ sub print_upload_manager_form {
# ======================================================= Enroll single student
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 seperate 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(' Enrolling '.$ENV{'form.cuname'}." in domain ".
+ $r->print(' Enrolling '.$ENV{'form.cuname'}." \@ ".
$ENV{'form.lcdomain'}.' If active, the new role will be available ".
+ "when the student next logs in to LON-CAPA. ERROR '.
- 'Invalid login mode or password. '.
- 'Unable to enroll '.$ENV{'form.cuname'}.'. ERROR ');
+ if ($amode =~ /^krb/) {
+ $r->print('Missing Kerberos domain information. ');
+ } else {
+ $r->print('Invalid login mode or password. ');
+ }
+ $r->print('Unable to enroll '.$ENV{'form.cuname'}.'.
+$krbform
+ Username: Domain: $domform Note: login settings below will not take effect if the user already exists
-
-$krbform
-
-$intform
-
-$locform
-
+$user_data_html
Group/Section:
-
-
-
-
-
-
-
-Set Ending Date
+$date_table
@@ -726,179 +899,223 @@ END
return;
}
-# =================================================== 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;
- }
- }
- return (undef,%currentlist);
- } else {
- $tmp =~ s/^error://;
- return ($tmp,undef);
- }
-}
-
# ========================================================= Menu Phase Two Drop
-sub menu_phase_two_drop {
+sub print_drop_menu {
my $r=shift;
$r->print("
-Current Classlist
-CSV format
-
'.
+ 'Your Excel spreadsheet is ready for download.LON-CAPA Domain for Students
LON-CAPA domain: $domform Starting and Ending Dates
-
-
-
-
-
-Set Starting DateFull Update
Full update
(also print list of users not enrolled anymore)Enrolling Student
');
- $r->print('\n";
+ $result .= '
\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 \n";
+ $result .= 'Starting Date '.
+ ''.$startform.' '.
+ ''.$dateDefault.' '." \n";
+ $result .= "Ending Date '.
+ ''.$endform.' '.
+ ''.$perpetual.' '."
";
+ #
+ # Refresh the course environment
+ &Apache::lonnet::coursedescription($ENV{'request.course.id'});
+ } else {
+ $result .= "Unable to set default dates for course:".$put_result.
+ '
';
+ }
+ return $result;
+}
+
+##
+## Single student enrollment routines (some of them)
+##
+sub get_student_username_domain_form {
+ my $r = shift;
+ my $domform = &Apache::loncommon::select_dom_form
+ ($ENV{'request.role.domain'},'cudomain',0);
+ $r->print(<Enroll One Student
+
+
+END
+ return;
+}
+
sub print_enroll_single_student_form {
my $r=shift;
$r->print("
+Username:
+
+Domain:
+ $domform
+
+
+
+ Enroll One Student
");
- 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);
- # Set up authentication forms
- my %param = ( formname => 'document.studentform');
- 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 $domform = &domain_form($defdom);
- # Print it all out
+ #
+ my $username = $ENV{'form.cuname'};
+ my $domain = $ENV{'form.cudomain'};
+ my $home = &Apache::lonnet::homeserver($username,$domain);
+ # $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;
+ }
+ &Apache::lonnet::logthis('home = '.$home);
+ #
+ my $user_data_html = '';
+ my $javascript_validations = '';
+ if ($new_user) {
+ my $defdom=$ENV{'request.role.domain'};
+ # Set up authentication forms
+ my ($krbdef,$krbdefdom) =
+ &Apache::loncommon::get_kerberos_defaults($domain);
+ $javascript_validations=&javascript_validations($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::loncommon::get_library_servers($domain);
+ $homeserver_form = '\n";
+ #
+ #
+ $user_data_html = <
+
+
+First Name:
+
+Middle Name:
+
+Last Name:
+
+Generation:
+
+Home Server:
+ $homeserver_form Password
+Please select an authentication mechanism
+
+
+$intform
+
+$locform
+
+
+END
+ }
+ my $date_table = &date_setting_table();
+ # Print it all out
$r->print(<
+First Name:
+
+
+
+Middle Name:
+
+
+
+Last Name:
+
+
+
+Generation:
+
+
+ Personal Data
-
-
-
-First Name:
-Middle Name:
-Last Name:
-Generation: Login Data
-Course Data
ID/Student Number
Drop Students
");
my $cid=$ENV{'request.course.id'};
- my ($error,%currentlist)=&get_current_classlist
- ($ENV{'course.'.$cid.'.domain'},$ENV{'course.'.$cid.'.num'});
- if (defined($error)) {
- if ($error =~ /^No such file or directory/) {
- $r->print("There are no students currently enrolled.\n");
- } else {
- $r->print("ERROR:$error
");
- }
- } elsif (!defined(%currentlist)) {
+ my ($classlist,$keylist) = &Apache::loncoursedata::get_classlist();
+ if (! defined($classlist)) {
$r->print("There are no students currently enrolled.\n");
- } else {
- # Print out the available choices
- &show_drop_list($r,%currentlist);
+ return;
}
+ # Print out the available choices
+ &show_drop_list($r,$classlist,$keylist);
+ return;
}
# ============================================== view classlist
sub print_html_classlist {
my $r=shift;
+ if (! exists($ENV{'form.sortby'})) {
+ $ENV{'form.sortby'} = 'username';
+ }
+ if ($ENV{'form.Status'} !~ /^(Any|Expired|Active)$/) {
+ $ENV{'form.Status'} = 'Active';
+ }
+ my $status_select = &Apache::lonhtmlcommon::StatusOptions
+ ($ENV{'form.Status'},'studentform');
$r->print(<ERROR:$error
");
- }
- } elsif (!defined(%currentlist)) {
+ my ($classlist,$keylist)=&Apache::loncoursedata::get_classlist();
+ if (! defined($classlist)) {
$r->print("There are no students currently enrolled.\n");
} else {
# Print out the available choices
if ($ENV{'form.action'} eq 'modifystudent') {
- &show_class_list($r,'view','modify',%currentlist);
+ &show_class_list($r,'view','modify','modifystudent',
+ $ENV{'form.Status'},$classlist,$keylist);
} else {
- &show_class_list($r,'view','aboutme',%currentlist);
+ &show_class_list($r,'view','aboutme','classlist',
+ $ENV{'form.Status'},$classlist,$keylist);
}
}
}
# ============================================== view classlist
-sub print_csv_classlist {
+sub print_formatted_classlist {
my $r=shift;
+ my $mode = shift;
my $cid=$ENV{'request.course.id'};
- my ($error,%currentlist)=&get_current_classlist
- ($ENV{'course.'.$cid.'.domain'},$ENV{'course.'.$cid.'.num'});
- if (defined($error)) {
- if ($error =~ /^No such file or directory/) {
- $r->print("There are no students currently enrolled.\n");
- } else {
- $r->print("ERROR:$error
");
- }
- } elsif (!defined(%currentlist)) {
+ my ($classlist,$keylist)=&Apache::loncoursedata::get_classlist();
+ if (! defined($classlist)) {
$r->print("There are no students currently enrolled.\n");
} else {
- &show_class_list($r,'csv','nolink',%currentlist);
+ &show_class_list($r,$mode,'nolink','csv',
+ $ENV{'form.Status'},$classlist,$keylist);
}
}
# =================================================== Show student list to drop
sub show_class_list {
- my ($r,$mode,$linkto,%currentlist)=@_;
+ my ($r,$mode,$linkto,$action,$statusmode,$classlist,$keylist)=@_;
my $cid=$ENV{'request.course.id'};
+ #
+ # Variables for excel output
+ my ($excel_workbook, $excel_sheet, $excel_filename,$row);
+ #
+ my $sortby = $ENV{'form.sortby'};
+ if ($sortby !~ /^(username|domain|section|fullname|id)$/) {
+ $sortby = 'username';
+ }
# Print out header
if ($mode eq 'view') {
if ($linkto eq 'aboutme') {
- $r->print('Select a user name to view the users page.');
+ $r->print('Select a user name to view the users personal page.');
} elsif ($linkto eq 'modify') {
$r->print('Select a user name to modify the students information');
}
$r->print(<
-
+username domain ID
- student name generation section
END
} elsif ($mode eq 'csv') {
- $r->print('"'.join('","',("username","domain","ID","last name",
- "first name","middle name","generation",
- "section")).'"'."\n");
- }
- 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) {
- if ($mode eq 'view') {
- $r->print('
+ username
+
+ domain
+
+ ID
+
+ student name
+
+ section
+
+ ');
- } else {
- $r->print('"Internal error: unable to get environment for '.
- $sname.' in domain '.$sdom.'"');
- }
+ if($statusmode eq 'Expired') {
+ $r->print('"Students with expired roles"');
+ }
+ if ($statusmode eq 'Any') {
+ $r->print('"'.join('","',("username","domain","ID","student name",
+ "section","status")).'"'."\n");
} else {
- if ($mode eq 'view') {
- $r->print("'.
- 'Internal error: unable to get environment '.
- 'for '.$sname.' in domain '.$sdom.' \n \n ");
- if ($linkto eq 'nothing') {
- $r->print($sname);
- } elsif ($linkto eq 'aboutme') {
- $r->print(&Apache::loncommon::aboutmewrapper($sname,$sname,
- $sdom));
- } elsif ($linkto eq 'modify') {
- $r->print(''.$sname."\n");
- }
- $r->print(<<"END");
+ $r->print('"'.join('","',("username","domain","ID","student name",
+ "section")).'"'."\n");
+ }
+ } elsif ($mode eq 'excel') {
+ # Create the excel spreadsheet
+ $excel_filename = '/prtspool/'.
+ $ENV{'user.name'}.'_'.$ENV{'user.domain'}.'_'.
+ time.'_'.rand(1000000000).'.xls';
+ $excel_workbook = Spreadsheet::WriteExcel->new('/home/httpd'.
+ $excel_filename);
+ $excel_workbook->set_tempdir('/home/httpd/perl/tmp');
+ $excel_sheet = $excel_workbook->addworksheet('classlist');
+ #
+ my $description = 'Class List for '.
+ $ENV{'course.'.$ENV{'request.course.id'}.'.description'};
+ $excel_sheet->write($row++,0,$description);
+ #
+ $excel_sheet->write($row++,0,["username","domain","ID",
+ "student name","section","status"]);
+ }
+ #
+ # Sort the students
+ my %index;
+ my $i;
+ foreach (@$keylist) {
+ $index{$_} = $i++;
+ }
+ 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 $username = $classlist->{$student}->[$index{'username'}];
+ my $domain = $classlist->{$student}->[$index{'domain'}];
+ my $section = $classlist->{$student}->[$index{'section'}];
+ my $name = $classlist->{$student}->[$index{'fullname'}];
+ my $id = $classlist->{$student}->[$index{'id'}];
+ my $status = $classlist->{$student}->[$index{'status'}];
+ next if (($statusmode ne 'Any') && ($status ne $statusmode));
+ if ($mode eq 'view') {
+ $r->print(" \n
END
- } elsif ($mode eq 'csv') {
- # no need to bother with $linkto
- my @line = ();
- foreach ($sname,$sdom,$reply{$sname},
- $info{'lastname'},$info{'firstname'},
- $info{'middlename'},$info{'generation'},$ssec) {
- push @line,&Apache::loncommon::csv_translate($_);
- }
- my $tmp = $";
- $" = '","';
- $r->print("\"@line\"\n");
- $" = $tmp;
+ } elsif ($mode eq 'csv') {
+ # no need to bother with $linkto
+ my @line = ();
+ foreach ($username,$domain,$id,$name,$section) {
+ push @line,&Apache::loncommon::csv_translate($_);
+ }
+ if ($statusmode eq 'Any') {
+ push @line,&Apache::loncommon::csv_translate($status);
}
+ my $tmp = $";
+ $" = '","';
+ $r->print("\"@line\"\n");
+ $" = $tmp;
+ } elsif ($mode eq 'excel') {
+ $excel_sheet->write($row++,0,[$username,$domain,$id,
+ $name,$section,$status]);
}
}
- $r->print('\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");
- $sdom
- $reply{$sname}
- $info{'lastname'}, $info{'firstname'} $info{'middlename'}
- $info{'generation'}
- $ssec
+ $domain
+ $id
+ $name
+ $section
') if ($mode eq 'view');
+ if ($mode eq 'view') {
+ $r->print('
');
+ } elsif ($mode eq 'excel') {
+ $excel_workbook->close();
+ $r->print('
@@ -955,13 +1180,15 @@ $info{'lastname'} $info{'generation'}, $
-Section: +Student ID:
-
Starting Date: | $startdateform |
Ending Date: | $enddateform |
+Section:
+$date_table