--- loncom/interface/Attic/londropadd.pm 2003/06/20 18:34:52 1.67
+++ loncom/interface/Attic/londropadd.pm 2007/09/27 18:58:52 1.170
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Handler to drop and add students in courses
#
-# $Id: londropadd.pm,v 1.67 2003/06/20 18:34:52 matthew Exp $
+# $Id: londropadd.pm,v 1.170 2007/09/27 18:58:52 www Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -25,34 +25,35 @@
#
# http://www.lon-capa.org/
#
-# (Handler to set parameters for assessments
-#
-# (Handler to resolve ambiguous file locations
-#
-# (TeX Content Handler
#
###############################################################
-###############################################################
+##############################################################
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();
###############################################################
###############################################################
sub header {
- my $bodytag=&Apache::loncommon::bodytag('Enrollment Manager');
+ 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(<
- - Enroll a single student - -
- - Modify student data - -
- - View Classlist - -
- - Drop Students - -
-END + my ($r,$permission)=@_; + # + my $cid =$env{'request.course.id'}; + my $cdom=$env{'course.'.$cid.'.domain'}; + my $cnum=$env{'course.'.$cid.'.num'}; + my @menu = + ( + { text => 'Upload a class list', + help => 'Course_Create_Class_List', + action => 'upload', + permission => $permission->{'enrl'}, + }, + { text => 'Enroll a single student', + help => 'Course_Add_Student', + action => 'enrollstudent', + permission => $permission->{'enrl'}, + }, + { text => 'Modify student data', + help => 'Course_Modify_Student_Data', + action => 'modifystudent', + permission => $permission->{'enrl'}, + }, + { text => 'View Class List', + help => 'Course_View_Class_List', + action => 'classlist', + permission => $permission->{'view'}, + }, + { text => 'Drop Students', + help => 'Course_Drop_Student', + action => 'drop', + permission => $permission->{'enrl'}, + }, + { text => 'Automated Enrollment Manager', + permission => (&Apache::lonnet::auto_run($cnum,$cdom) + && $permission->{'enrl'}), + url => '/adm/populate', + }, + { text => 'Create a new group', + help => 'Course_Create_Group', + permission => $permission->{'grp_manage'}, + url => '/adm/coursegroups?refpage=enrl&action=create', + }, + { text => 'Modify an existing group', + help => 'Course_Modify_Group', + permission => $permission->{'grp_manage'}, + url => '/adm/coursegroups?refpage=enrl&action=modify', + }, + { text => 'Delete an existing group', + help => 'Course_Delete_Group', + permission => $permission->{'grp_manage'}, + url => '/adm/coursegroups?refpage=enrl&action=delete', + }, + { text => 'Re-enable a deleted group', + help => 'Course_Reenable_Group', + permission => $permission->{'grp_manage'}, + url => '/adm/coursegroups?refpage=enrl&action=reenable', + }, + { text => 'Enter an existing group', + help => 'Course_Display_Group', + permission => $permission->{'grp_view'}, + url => '/adm/coursegroups?refpage=enrl&action=view', + }, + ); + my $menu_html = ''; + foreach my $menu_item (@menu) { + next if (! $menu_item->{'permission'}); + $menu_html.=''; + $menu_html.=''; + if (exists($menu_item->{'url'})) { + $menu_html.=qq{}; + } else { + $menu_html.= + qq{}; + } + $menu_html.= &mt($menu_item->{'text'}).''; + if (exists($menu_item->{'help'})) { + $menu_html.= + &Apache::loncommon::help_open_topic($menu_item->{'help'}); + } + $menu_html.='
'.$/; + } + $r->print($menu_html); + return; } ############################################################### ############################################################### +sub hidden_input { + my ($name,$value) = @_; + return ''."\n"; +} + sub print_upload_manager_header { my ($r,$datatoken,$distotal,$krbdefdom)=@_; my $javascript; - if (! exists($ENV{'form.upfile_associate'})) { - $ENV{'form.upfile_associate'} = 'forward'; + # + if (! exists($env{'form.upfile_associate'})) { + $env{'form.upfile_associate'} = 'forward'; } - if ($ENV{'form.associate'} eq 'Reverse Association') { - if ( $ENV{'form.upfile_associate'} ne 'reverse' ) { - $ENV{'form.upfile_associate'} = 'reverse'; + if ($env{'form.associate'} eq 'Reverse Association') { + if ( $env{'form.upfile_associate'} ne 'reverse' ) { + $env{'form.upfile_associate'} = 'reverse'; } else { - $ENV{'form.upfile_associate'} = 'forward'; + $env{'form.upfile_associate'} = 'forward'; } } - if ($ENV{'form.upfile_associate'} eq 'reverse') { + if ($env{'form.upfile_associate'} eq 'reverse') { $javascript=&upload_manager_javascript_reverse_associate(); } else { $javascript=&upload_manager_javascript_forward_associate(); } - my $javascript_validations=&javascript_validations($krbdefdom); - $r->print(<\n". + &mt('Total number of records found in file: [_1].',$distotal). + "\n". + "
Note: this will not take effect if the user already exists
--$krbform -
--$intform -
--$locform -
--
-
-
-
-Note: for large courses, this operation may be time consuming.
-ENDPICK
+ my $date_table = &date_setting_table();
+ my $Str = "\n";
+ $Str .= &hidden_input('nfields',$i);
+ $Str .= &hidden_input('keyfields',$keyfields);
+ $Str .= '
\n". + &mt('Note: this will not take effect if the user already exists'). + &Apache::loncommon::help_open_topic('Auth_Options'). + "
\n"; + $Str .= $krbform."\n
\n". + $intform."\n
\n". + $locform."\n
\n"; + $Str .= '\n".&mt('LON-CAPA domain: [_1]',$domform)."\n
\n"; + $Str .= "\n".$date_table."
\n"; + $Str .= "\n".'\n
\n";
+ $Str .= ''."
\n";
+ $Str .= &mt('Note: for large courses, this operation may be time '.
+ 'consuming');
+ $r->print($Str);
+ return;
}
-# ======================================================= Menu Phase Two Upload
+###############################################################
+###############################################################
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;
my $today=time;
my $halfyear=$today+15552000;
- my $defdom=$r->dir_config('lonDefDomain');
+ #
+ # 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)));
}
@@ -555,112 +741,132 @@ sub print_upload_manager_form {
&print_upload_manager_footer($r,$i,$keyfields,$defdom,$today,$halfyear);
}
-# ======================================================= Enroll single student
+###############################################################
+###############################################################
sub enroll_single_student {
- my $r=shift;
- $r->print('
Enrolling '.$ENV{'form.cuname'}." \@ ". - $ENV{'form.lcdomain'}.'
'); - if (($ENV{'form.cuname'})&&($ENV{'form.cuname'}!~/\W/)&& - ($ENV{'form.lcdomain'})&&($ENV{'form.lcdomain'}!~/\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(''.&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'}; + my $domain=$env{'form.lcdomain'}; + my $desiredhost = $env{'form.lcserver'}; if (lc($desiredhost) eq 'default') { $desiredhost = undef; } else { - my %home_servers =&Apache::loncommon::get_library_servers($domain); + my %home_servers =&Apache::lonnet::get_servers($domain,'library'); if (! exists($home_servers{$desiredhost})) { - $r->print('Error:'. - 'Invalid home server specified'); + $r->print(''.&mt('Error').':'. + &mt('Invalid home server specified')); return; } } - $r->print(" with server $desiredhost :") if (defined($desiredhost)); + $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') { + if ($env{'form.login'} eq 'krb') { $amode='krb'; - $amode.=$ENV{'form.krbver'}; - $genpwd=$ENV{'form.krbarg'}; - } elsif ($ENV{'form.login'} eq 'int') { + $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=" "; } } - my $home = &Apache::lonnet::homeserver($ENV{'form.cuname'}, - $ENV{'form.lcdomain'}); + my $home = &Apache::lonnet::homeserver($env{'form.cuname'}, + $env{'form.lcdomain'}); if ((($amode) && ($genpwd)) || ($home ne 'no_host')) { # Clean out any old roles the student has in this class. - &modifystudent($ENV{'form.lcdomain'},$ENV{'form.cuname'}, - $ENV{'request.course.id'},$ENV{'form.csec'}, + &modifystudent($env{'form.lcdomain'},$env{'form.cuname'}, + $env{'request.course.id'},$env{'form.csec'}, $desiredhost); - my $startdate = - &Apache::lonhtmlcommon::get_date_from_form('startdate'); - my $enddate = - &Apache::lonhtmlcommon::get_date_from_form('enddate'); - &Apache::lonnet::logthis('startdate = '.$startdate); - &Apache::lonnet::logthis('enddate = '.$enddate); 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.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("If active, the new role will be available ". - "when the student next logs in to LON-CAPA.
"); + $r->print("".&mt('If active, the new role will be available when the student next logs in to LON-CAPA.')."
"); } else { - $r->print("unable to enroll: ".$login_result); + $r->print(&mt('unable to enroll').": ".$login_result); } } else { - $r->print('ERROR '. - 'Invalid login mode or password. '. - 'Unable to enroll '.$ENV{'form.cuname'}.'.
'); - } + $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')); } -} - -# ======================================================= Menu Phase Two Enroll -sub print_enroll_single_student_form { - my $r=shift; - $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', @@ -668,13 +874,295 @@ sub print_enroll_single_student_form { my $enddateform = &Apache::lonhtmlcommon::date_setter('studentform', 'enddate', $endtime); - # Print it all out + 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 |
: | +
: | +|
: | +|
: | +|
: | +|
: | +
First Name: | |
Middle Name: | |
Last Name: | |
Generation: |
Username:
-Domain: $domform
-Note: login settings below will not take effect if the user already exists -
-$krbform -
-$intform -
-$locform -
+$user_data_html -
Group/Section: -
- - - - - - -
-
Starting Date | $startdateform |
Ending Date | $enddateform |
:
--ID/Student Number: +:
- -Disable ID/Student Number Safeguard and Force Change of Conflicting IDs -(only do if you know what you are doing) +
- +
END + $r->print(''."\n". + ''."\n". + ''."\n"); + if (ref($srch) eq 'HASH') { + foreach my $item (sort(keys(%{$srch}))) { + $r->print(''."\n"); + } + } + foreach my $item ('sortby','seluname','seludom') { + if (exists($env{'form.'.$item})) { + $r->print(''."\n"); + } + } return; } # ========================================================= Menu Phase Two Drop sub print_drop_menu { my $r=shift; - $r->print("
-Current Classlist
-
-END
- if ($ENV{'form.action'} ne 'modifystudent') {
- $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($status_select."
'.&Apache::loncommon::start_data_table());
+ foreach my $role (sort keys %coursepersonnel) {
+ next if ($role =~ /^\s*$/);
+ $r->print(&Apache::loncommon::start_data_table_row().
+ ''.$role.' ');
+ foreach my $user (split(',',$coursepersonnel{$role})) {
+ my ($puname,$pudom)=split(':',$user);
+ $r->print(' '.&Apache::loncommon::aboutmewrapper(
+ &Apache::loncommon::plainname($puname,
+ $pudom),
+ $puname,$pudom));
+ }
+ $r->print(' '.&Apache::loncommon::end_data_table_row());
+ }
+ $r->print(&Apache::loncommon::end_data_table());
+ #
+ # Interface output
+ $r->print('');
+ $r->print("
-
- username +".&Apache::loncommon::start_data_table()." + | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
$lt{'type'} | + "); + } else { + $r->print(" +Count | + "); + } + $r->print(<- domain + $lt{'dom'} | ID | - student name + $lt{'sn'} + | + $lt{'sec'} + | + $lt{'start'} | - section + $lt{'end'} + | + $lt{'grp'} + | + $lt{'email'} | -'."\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(" \n"); + +# Done with the HTML header line + } elsif ($mode eq 'csv') { + # + # Open a file + $CSVfilename = '/prtspool/'. + $env{'user.name'}.'_'.$env{'user.domain'}.'_'. + time.'_'.rand(1000000000).'.csv'; + unless ($CSVfile = Apache::File->new('>/home/httpd'.$CSVfilename)) { + $r->log_error("Couldn't open $CSVfilename for output $!"); + $r->print("Problems occured in writing the csv file. ". + "This error has been logged. ". + "Please alert your LON-CAPA administrator."); + $CSVfile = undef; + } + # + # Write headers and data to file if($statusmode eq 'Expired') { - $r->print('"Students with expired roles"'); + print $CSVfile '"'.&mt('Students with expired roles').'"'."\n"; + } + if($statusmode eq 'Future') { + print $CSVfile '"'.&mt('Students with future roles').'"'."\n"; } if ($statusmode eq 'Any') { - $r->print('"'.join('","',("username","domain","ID","student name", - "section","status")).'"'."\n"); + print $CSVfile '"'.join('","',map { + &Apache::loncommon::csv_translate(&mt($_)) + } ("username","domain","ID","student name", + "section","start date","end date","status", + "active groups","email address")) + .'"'."\n"; } else { - $r->print('"'.join('","',("username","domain","ID","student name", - "section")).'"'."\n"); + print $CSVfile '"'.join('","',map { + &Apache::loncommon::csv_translate(&mt($_)) + } ("username","domain","ID","student name", + "section","start date","end date", + "active groups","email address")).'"'."\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_workbook,$excel_filename,$format) = + &Apache::loncommon::create_workbook($r); + return if (! defined($excel_workbook)); $excel_sheet = $excel_workbook->addworksheet('classlist'); # - my $description = 'Classlist for '. - $ENV{'course.'.$ENV{'request.course.id'}.'.description'}; - $excel_sheet->write($row++,0,$description); + my $description = 'Class List for '. + $env{'course.'.$env{'request.course.id'}.'.description'}; + $excel_sheet->write($row++,0,$description,$format->{'h1'}); # $excel_sheet->write($row++,0,["username","domain","ID", - "student name","section","status"]); + "student name","section", + "start date","end date","status", + "active groups","email address"], + $format->{'bold'}); } + +# Done with header lines in all formats + # # Sort the students my %index; @@ -908,6 +1553,7 @@ END foreach (@$keylist) { $index{$_} = $i++; } + $index{'groups'} = scalar(@{$keylist}); my $index = $index{$sortby}; my $second = $index{'username'}; my $third = $index{'domain'}; @@ -918,16 +1564,70 @@ END || lc($classlist->{$a}->[$third]) cmp lc($classlist->{$b}->[$third]) } (keys(%$classlist)); + my $studentcount = 0; + my $autocount = 0; + my $manualcount = 0; + my $unlockcount = 0; + my $lockcount = 0; 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'}]; + my $sdata = $classlist->{$student}; + my $groups = $classgroups->{$student}; + my $username = $sdata->[$index{'username'}]; + my $domain = $sdata->[$index{'domain'}]; + my $section = $sdata->[$index{'section'}]; + my $active_groups; + if (ref($groups->{active}) eq 'HASH') { + $active_groups = join(', ',keys(%{$groups->{'active'}})); + } + my $name = $sdata->[$index{'fullname'}]; + my $id = $sdata->[$index{'id'}]; + my $status = $sdata->[$index{'status'}]; next if (($statusmode ne 'Any') && ($status ne $statusmode)); - if ($mode eq 'view') { - $r->print("
\n ");
+ my $start = $sdata->[$index{'start'}];
+ my $end = $sdata->[$index{'end'}];
+ my $type = $sdata->[$index{'type'}];
+
+ my %emails = &Apache::loncommon::getemails($username,$domain);
+ my $email;
+ if ($emails{'permanentemail'} =~ /\S/) {
+ $email = $emails{'permanentemail'};
+ }
+
+ if ($mode eq 'view' || $mode eq 'html' || $mode eq 'autoenroll') {
+ 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);
+ }
+ $r->print(&Apache::loncommon::start_data_table_row());
+ if ($mode eq 'autoenroll') {
+ my $lockedtype = $sdata->[$index{'lockedtype'}];
+ $studentcount++;
+ my $cellentry;
+ if ($type eq 'auto') {
+ $cellentry = ''.&mt('auto').' ';
+ $autocount ++;
+ } else {
+ $cellentry = '
| $cellentry | \n "); + } else { + $r->print(" | ".(++$studentcount)." | \n "); + } if ($linkto eq 'nothing') { $r->print($username); } elsif ($linkto eq 'aboutme') { @@ -949,33 +1649,97 @@ END | $id | $name | $section | -$start | +$end | +$active_groups | +'.$clickers.' | '); + } else { + $r->print(''); + } + +# Photos + + if ($env{'course.'.$env{'request.course.id'}. + '.internal.showphoto'}) { + if ($displayphotos eq 'on') { + my $imgurl = + &Apache::lonnet::retrievestudentphoto($domain, + $username,'gif', + 'thumbnail'); + + $r->print(' | '); + } + } + $r->print(&Apache::loncommon::end_data_table_row()); } elsif ($mode eq 'csv') { + next if (! defined($CSVfile)); # no need to bother with $linkto + 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 @line = (); - foreach ($username,$domain,$id,$name,$section) { + foreach ($username,$domain,$id,$name,$section,$start,$end) { push @line,&Apache::loncommon::csv_translate($_); } if ($statusmode eq 'Any') { push @line,&Apache::loncommon::csv_translate($status); } - my $tmp = $"; - $" = '","'; - $r->print("\"@line\"\n"); - $" = $tmp; + push @line,&Apache::loncommon::csv_translate($active_groups); + push @line,&Apache::loncommon::csv_translate($email); + print $CSVfile '"'.join('","',@line).'"'."\n"; } elsif ($mode eq 'excel') { - $excel_sheet->write($row++,0,[$username,$domain,$id, - $name,$section,$status]); + $excel_sheet->write($row,0,[$username,$domain,$id, + $name,$section]); + my $col = 5; + foreach my $time ($start,$end) { + if (defined($time) && $time != 0) { + $excel_sheet->write($row,$col++, + &Apache::lonstathelpers::calc_serial($time), + $format->{'date'}); + } else { + $excel_sheet->write($row,$col++,'none'); + } + } + $excel_sheet->write($row,$col++,$status); + $excel_sheet->write($row,$col++,$active_groups); + $excel_sheet->write($row,$col++,$email); + $row++; } } - if ($mode eq 'view') { - $r->print(' |
'. - 'Your Excel spreadsheet is ready for download.
'."\n"); + &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; } @@ -986,43 +1750,89 @@ 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'}; + my $sname = $env{'form.sname'}; + my $sdom = $env{'form.sdom'}; + my $sortby = $env{'form.sortby'}; # determine the students name information my %info=&Apache::lonnet::get('environment', ['firstname','middlename', - 'lastname','generation','id'], - $sdom, $sname); + 'lastname','generation','id', + 'permanentemail'], $sdom, $sname); my ($tmp) = keys(%info); if ($tmp =~ /^(con_lost|error|no_such_host)/i) { - $r->print('Error'. + $r->print(''.&mt('Error').''. ''. - 'Unable to retrieve environment data for '.$sname. - 'in domain '.$sdom.'
'. - 'Please contact your LON-CAPA administrator '. - 'regarding this situation.