version 1.60, 2010/08/04 01:56:07
|
version 1.71, 2014/03/28 15:07:01
|
Line 30 use strict;
|
Line 30 use strict;
|
use Apache::lonnet; |
use Apache::lonnet; |
use Apache::loncommon(); |
use Apache::loncommon(); |
use Apache::lonhtmlcommon(); |
use Apache::lonhtmlcommon(); |
|
use Apache::lonquickgrades(); |
use Apache::loncoursedata(); |
use Apache::loncoursedata(); |
use Apache::lonstatistics; |
use Apache::lonstatistics; |
use Apache::lonlocal; |
use Apache::lonlocal; |
use Apache::lonstathelpers; |
use Apache::lonstathelpers; |
|
use Apache::lonmsgdisplay(); |
use HTML::Entities(); |
use HTML::Entities(); |
use Time::Local(); |
use Time::Local(); |
use Spreadsheet::WriteExcel(); |
use Spreadsheet::WriteExcel(); |
Line 61 sub BuildStudentSubmissionsPage {
|
Line 63 sub BuildStudentSubmissionsPage {
|
# |
# |
&Apache::lonstatistics::PrepareClasslist(); |
&Apache::lonstatistics::PrepareClasslist(); |
# |
# |
|
$r->print( &Apache::lonhtmlcommon::breadcrumbs('Student Submission Reports')); |
|
&Apache::lonquickgrades::startGradeScreen($r,'statistics'); |
$r->print(&CreateInterface()); |
$r->print(&CreateInterface()); |
# |
# |
my @Students = @Apache::lonstatistics::Students; |
my @Students = @Apache::lonstatistics::Students; |
Line 177 sub BuildStudentSubmissionsPage {
|
Line 181 sub BuildStudentSubmissionsPage {
|
&array_shuffle(\@Students); |
&array_shuffle(\@Students); |
} |
} |
# |
# |
$r->print('<h4>'. |
|
|
my $threshold = $env{'course.'.$env{'request.course.id'}.'.internal.anonsurvey_threshold'}; |
|
if ($threshold eq '') { |
|
my %domconfig = |
|
&Apache::lonnet::get_dom('configuration',['coursedefaults'], |
|
$env{'course.'.$env{'request.course.id'}.'.domain'}); |
|
if (ref($domconfig{'coursedefaults'}) eq 'HASH') { |
|
$threshold = $domconfig{'coursedefaults'}{'anonsurvey_threshold'}; |
|
if ($threshold eq '') { |
|
$threshold = 10; |
|
} |
|
} else { |
|
$threshold = 10; |
|
} |
|
} |
|
$r->print('<p>'. |
&Apache::lonstatistics::section_and_enrollment_description(). |
&Apache::lonstatistics::section_and_enrollment_description(). |
'</h4>'); |
'</p>'); |
if (! scalar(@Problems) || ! defined($Problems[0])) { |
if (! scalar(@Problems) || ! defined($Problems[0])) { |
$r->print('resource is undefined'); |
$r->print(&mt('resource is undefined')); |
|
} elsif (!$show_named && @Students < $threshold) { |
|
$r->print(&mt('The number of students matching the selection criteria is too few for display of submission data for anonymous surveys.').'<br />'.&mt('There must be at least [quant,_1,student].',$threshold).' '.&mt('Contact a Domain Coordinator if you need the threshold to be changed for this course.')); |
} else { |
} else { |
if (scalar(@Problems) == 1) { |
if (scalar(@Problems) == 1) { |
my $resource = $Problems[0]; |
my $resource = $Problems[0]; |
Line 206 sub BuildStudentSubmissionsPage {
|
Line 227 sub BuildStudentSubmissionsPage {
|
&mt('Prepare Report').'" />'); |
&mt('Prepare Report').'" />'); |
$r->print(' 'x5); |
$r->print(' 'x5); |
$r->print('<p>'. |
$r->print('<p>'. |
&mt('Computing correct answers greatly increasese the amount of time required to prepare a report.'). |
&mt('Computing correct answers greatly increases the amount of time required to prepare a report.'). |
'</p>'); |
'</p>'); |
$r->print('<p>'. |
$r->print('<p>'. |
&mt('Please select problems and use the [_1]Prepare Report[_2] button to continue.','<b>','</b>'). |
&mt('Please select problems and use the [_1]Prepare Report[_2] button to continue.','<b>','</b>'). |
Line 304 sub prepare_html_output {
|
Line 325 sub prepare_html_output {
|
my @extra_resp_headers = &get_extra_response_headers($show_named); |
my @extra_resp_headers = &get_extra_response_headers($show_named); |
# |
# |
# Create the table header |
# Create the table header |
my @student_columns; |
my @student_columns = &get_student_columns($show_named); |
if ($show_named) { |
|
@student_columns = @Apache::lonstatistics::SelectedStudentData; |
|
if (grep(/^all$/,@student_columns)) { |
|
@student_columns = qw(fullname username domain id section status groups comments); |
|
} |
|
} else { |
|
@student_columns = ('username'); |
|
} |
|
# |
|
my %headers; |
my %headers; |
my $student_column_count = scalar(@student_columns); |
my $student_column_count = scalar(@student_columns); |
$headers{'problem'} = qq{<th colspan="$student_column_count">\ </th>}; |
$headers{'problem'} = qq{<th colspan="$student_column_count">\ </th>}; |
foreach (@student_columns) { |
foreach my $field (@student_columns) { |
$headers{'student'}.= '<th>'.ucfirst($_).'</th>'; |
$headers{'student'}.= '<th>'.&mt(ucfirst($field)).'</th>'; |
} |
} |
# |
# |
# we put the headers into the %headers hash |
# we put the headers into the %headers hash |
my $total_col = scalar(@student_columns); |
my $total_col = $student_column_count; |
my $nonempty_part_headers = 0; |
my $nonempty_part_headers = 0; |
# |
# |
my %problem_analysis; |
my %problem_analysis; |
Line 402 sub prepare_html_output {
|
Line 414 sub prepare_html_output {
|
qq{<th colspan="$student_column_count">\ </th>}. |
qq{<th colspan="$student_column_count">\ </th>}. |
$headers{'response'}; |
$headers{'response'}; |
} |
} |
my $full_header = $/.'<table>'.$/; |
#my $full_header = $/.'<table>'.$/; |
|
my $full_header = $/.&Apache::loncommon::start_data_table().$/; |
$full_header .= '<tr align="left">'.$headers{'problem'}.'</tr>'.$/; |
$full_header .= '<tr align="left">'.$headers{'problem'}.'</tr>'.$/; |
if ($nonempty_part_headers) { |
if ($nonempty_part_headers) { |
$full_header .= '<tr align="left">'.$headers{'part'}.'</tr>'.$/; |
$full_header .= '<tr align="left">'.$headers{'part'}.'</tr>'.$/; |
Line 413 sub prepare_html_output {
|
Line 426 sub prepare_html_output {
|
# Main loop |
# Main loop |
my $count; |
my $count; |
$r->print($/.$full_header.$/); |
$r->print($/.$full_header.$/); |
my $row_class = 'odd'; # css |
|
foreach my $student (@$students) { |
foreach my $student (@$students) { |
my $student_row_data; |
my $student_row_data; |
if ($count++ >= 30) { |
if ($count++ >= 30) { |
$r->print('</table>'.$/.$full_header.$/); |
$r->print(&Apache::loncommon::end_data_table().$/.$full_header.$/); |
$count = 0; |
$count = 0; |
} |
} |
last if ($c->aborted()); |
last if ($c->aborted()); |
Line 515 sub prepare_html_output {
|
Line 527 sub prepare_html_output {
|
next if (! $maxrow && ! scalar(@essays)); |
next if (! $maxrow && ! scalar(@essays)); |
# |
# |
# Go through the problem data and output a row. |
# Go through the problem data and output a row. |
if ($row_class eq 'even') { |
|
$row_class = 'odd'; |
|
} else { |
|
$row_class = 'even'; |
|
} |
|
my $printed_something; |
my $printed_something; |
for (my $rows_output = 0;$rows_output<$maxrow;$rows_output++) { |
for (my $rows_output = 0;$rows_output<$maxrow;$rows_output++) { |
my $html; |
my $html; |
Line 543 sub prepare_html_output {
|
Line 550 sub prepare_html_output {
|
} |
} |
} |
} |
if (! $no_data) { |
if (! $no_data) { |
$r->print(qq{<tr class="$row_class">$student_row_data$html</tr>}.$/); |
$r->print(&Apache::loncommon::start_data_table_row().$student_row_data.$html. |
|
&Apache::loncommon::end_data_table_row().$/); |
$printed_something=1; |
$printed_something=1; |
} |
} |
} |
} |
if (@essays) { |
if (@essays) { |
my $tr = qq{<tr class="$row_class">}; |
my $tr = &Apache::loncommon::start_data_table_row(); |
my $td = qq{<td valign="top" class="essay" colspan="$total_col">}; |
my $td = qq{<td valign="top" class="essay" colspan="$total_col">}; |
if (! $printed_something) { |
if (! $printed_something) { |
$r->print($tr.$student_row_data.'</tr>'.$/); |
$r->print($tr.$student_row_data.&Apache::loncommon::end_data_table_row().$/); |
} |
} |
$r->print($tr.$td. |
$r->print($tr.$td. |
join('</td></tr>'.$/.$tr.$td,@essays).'</td></tr>'.$/); |
join('</td></tr>'.$/.$tr.$td,@essays).'</td></tr>'.$/); |
undef(@essays); |
undef(@essays); |
} |
} |
} # end of student loop |
} # end of student loop |
$r->print('</table>'.$/); |
$r->print(&Apache::loncommon::end_data_table().$/); |
return; |
return; |
} |
} |
|
|
Line 723 sub html_non_essay_results {
|
Line 731 sub html_non_essay_results {
|
push(@values,$response->{$original_header}); |
push(@values,$response->{$original_header}); |
} |
} |
} |
} |
|
# FIXME: Bug #6700 - Properly process multiple answer fields |
|
# Would be a good place here but the data needs to be properly |
|
# compiled somewhere before. |
|
# elsif (($resptype =~ /^(numerical|formula|custom)$/) && |
|
# (submission) && (ref)) { |
|
# de-ref...: push(@values,$response->{$original_header}); } |
} else { |
} else { |
@values = map { $response->{$_}; } @$headers; |
foreach my $original_header (@$headers) { |
|
if ($original_header eq 'Time') { |
|
push(@values,&Apache::lonlocal::locallocaltime($response->{$original_header})); |
|
} elsif (($original_header eq 'Submission') && |
|
!($resptype =~ /^(radiobutton|option|match|rank)$/)) { |
|
# encode all submissions which have not been encoded above |
|
push(@values,&HTML::Entities::encode($response->{$original_header},'<>&"')); |
|
} elsif (($original_header eq 'Correct') && |
|
($resptype eq 'radiobutton')) { |
|
# encode foil separators |
|
push(@values,&HTML::Entities::encode($response->{$original_header},'&')); |
|
} else { |
|
# A normal column |
|
push(@values,$response->{$original_header}); |
|
} |
|
} |
} |
} |
my $td = '<td valign="top">'; |
my $td = '<td valign="top">'; |
my $str = $td.join('</td>'.$td,@values).'</td>'; |
my $str = $td.join('</td>'.$td,@values).'</td>'; |
Line 775 sub prepare_excel_output {
|
Line 804 sub prepare_excel_output {
|
$lastprob = $prob; |
$lastprob = $prob; |
} |
} |
if ($columncount > 255) { |
if ($columncount > 255) { |
$r->print('<h1>'.&mt('Unable to complete request').'</h1>'.$/. |
$r->print('<p class="LC_error">'.&mt('Unable to complete request').'</p>'.$/. |
'<p>'.&mt('LON-CAPA is unable to produce your Excel spreadsheet because your selections will result in more than 255 columns. Excel allows only 255 columns in a spreadsheet.').'</p>'.$/. |
'<p class="LC_warning">'.&mt('LON-CAPA is unable to produce your Excel spreadsheet because your selections will result in more than 255 columns. Excel allows only 255 columns in a spreadsheet.').'</p>'.$/. |
'<p>'.&mt('Consider selecting fewer problems to generate reports on, or reducing the number of items per problem. Or use HTML or CSV output.').'</p>'.$/); |
'<p class="LC_warning">'.&mt('Consider selecting fewer problems to generate reports on, or reducing the number of items per problem. Or use HTML or CSV output.').'</p>'.$/); |
if (ref($lastprob)) { |
if (ref($lastprob)) { |
$r->print('<p>'.&mt('The last problem that will fit in the current spreadsheet is [_1].',$lastprob->compTitle).'</p>'); |
$r->print('<p>'.&mt('The last problem that will fit in the current spreadsheet is [_1].',$lastprob->compTitle).'</p>'); |
} |
} |
Line 787 sub prepare_excel_output {
|
Line 816 sub prepare_excel_output {
|
# |
# |
# Print out a message telling them what we are doing |
# Print out a message telling them what we are doing |
if (scalar(@$Problems) > 1) { |
if (scalar(@$Problems) > 1) { |
$r->print('<h2>'. |
$r->print('<p class="LC_info">'. |
&mt('Preparing Excel spreadsheet of student responses to [_1] problems', |
&mt('Preparing Excel spreadsheet of student responses to [_1] problems', |
scalar(@$Problems)). |
scalar(@$Problems)). |
'</h2>'); |
'</p>'); |
} else { |
} else { |
$r->print('<h2>'. |
$r->print('<p class="LC_info">'. |
&mt('Preparing Excel spreadsheet of student responses'). |
&mt('Preparing Excel spreadsheet of student responses'). |
'</h2>'); |
'</p>'); |
} |
} |
$r->rflush(); |
$r->rflush(); |
# |
# |
Line 802 sub prepare_excel_output {
|
Line 831 sub prepare_excel_output {
|
my ($workbook,$filename,$format) = |
my ($workbook,$filename,$format) = |
&Apache::loncommon::create_workbook($r); |
&Apache::loncommon::create_workbook($r); |
return if (! defined($workbook)); |
return if (! defined($workbook)); |
my $worksheet = $workbook->addworksheet('Student Submission Data'); |
|
|
# Worksheet name |
|
# The length of a worksheet name in Excel 95 is limited to 31 characters. |
|
# Let's make sure to not exceed the maximum length in the translation files. |
|
# Otherwise, no Excel file would be created. |
|
my $worksheetname = &mt('Student Submission Data'); |
|
if (length($worksheetname) > 31) { |
|
# nice way to cut off too long name |
|
$worksheetname = substr($worksheetname,0,28,).'...'; |
|
} |
|
my $worksheet = $workbook->addworksheet($worksheetname); |
# |
# |
# Add headers to the worksheet |
# Add headers to the worksheet |
my $rows_output = 0; |
my $rows_output = 0; |
Line 815 sub prepare_excel_output {
|
Line 854 sub prepare_excel_output {
|
my $partid_row = $rows_output++; |
my $partid_row = $rows_output++; |
my $respid_row = $rows_output++; |
my $respid_row = $rows_output++; |
my $header_row = $rows_output++; |
my $header_row = $rows_output++; |
$worksheet->write($title_row ,0,'Problem Title',$format->{'bold'}); |
$worksheet->write($title_row ,0,&mt('Problem Title'),$format->{'bold'}); |
$worksheet->write($partid_row,0,'Part ID',$format->{'bold'}); |
$worksheet->write($partid_row,0,&mt('Part ID'),$format->{'bold'}); |
$worksheet->write($respid_row,0,'Response ID',$format->{'bold'}); |
$worksheet->write($respid_row,0,&mt('Response ID'),$format->{'bold'}); |
# Student headers |
# Student headers |
my @StudentColumns; |
my @StudentColumns = &get_student_columns($show_named); |
if ($show_named) { |
foreach my $field (@StudentColumns) { |
@StudentColumns = qw(username domain id section); |
$worksheet->write($header_row,$cols_output++,&mt(ucfirst($field)), |
} else { |
|
@StudentColumns = qw(username); |
|
} |
|
foreach (@StudentColumns) { |
|
$worksheet->write($header_row,$cols_output++,ucfirst($_), |
|
$format->{'bold'}); |
$format->{'bold'}); |
} |
} |
# Problem headers |
# Problem headers |
Line 868 sub prepare_excel_output {
|
Line 902 sub prepare_excel_output {
|
} |
} |
# |
# |
# Populate the worksheet with the student data |
# Populate the worksheet with the student data |
my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin |
my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,scalar(@$Students)); |
($r,'Excel File Compilation Status', |
|
'Excel File Compilation Progress', |
|
scalar(@$Students),'inline',undef,'Statistics','stats_status'); |
|
my $max_row = $rows_output; |
my $max_row = $rows_output; |
foreach my $student (@$Students) { |
foreach my $student (@$Students) { |
last if ($c->aborted()); |
last if ($c->aborted()); |
$cols_output = 0; |
$cols_output = 0; |
my $student_row = $max_row; |
my $student_row = $max_row; |
foreach my $field (@StudentColumns) { |
|
if ($show_named) { |
|
$worksheet->write($student_row,$cols_output++, |
|
$student->{$field}); |
|
} else { |
|
$worksheet->write($student_row,$cols_output++, |
|
&mt('Anonymized')); |
|
} |
|
} |
|
my $last_student_col = $cols_output-1; |
|
foreach my $prob (@$Problems) { |
foreach my $prob (@$Problems) { |
my $symb = $prob->symb(); |
my $symb = $prob->symb(); |
foreach my $partid (@{$prob->parts}) { |
foreach my $partid (@{$prob->parts}) { |
Line 941 sub prepare_excel_output {
|
Line 962 sub prepare_excel_output {
|
} |
} |
} |
} |
} |
} |
# Fill in the remaining rows with the students data |
# Prepend current student's user information to all rows |
for (my $row = $student_row+1;$row<$max_row;$row++) { |
for (my $row = $student_row;$row<$max_row;$row++) { |
my $cols = 0; |
my $cols = 0; |
foreach my $field (@StudentColumns) { |
foreach my $field (@StudentColumns) { |
if ($show_named) { |
if ($show_named) { |
$worksheet->write($row,$cols++, |
my $value = $student->{$field}; |
$student->{$field}); |
if ($field eq 'comments') { |
|
$value = &Apache::lonmsgdisplay::retrieve_instructor_comments |
|
($student->{'username'},$student->{'domain'}); |
|
} |
|
$worksheet->write($row,$cols++,$value); |
} else { |
} else { |
$worksheet->write($row,$cols++, |
$worksheet->write($row,$cols++, |
&mt('Anonymized')); |
&mt('Anonymized')); |
} |
} |
} |
} |
} |
} |
&Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state, |
&Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,'last student'); |
'last student'); |
|
} |
} |
&Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); |
&Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); |
# |
# |
Line 1064 sub prepare_csv_output {
|
Line 1088 sub prepare_csv_output {
|
my ($r,$problems,$students,$anoncounter,$show_named) = @_; |
my ($r,$problems,$students,$anoncounter,$show_named) = @_; |
my $c = $r->connection(); |
my $c = $r->connection(); |
# |
# |
$r->print('<h2>'. |
$r->print('<p class="LC_info">'. |
&mt('Generating CSV report of student responses').'</h2>'); |
&mt('Generating CSV report of student responses').'</p>'); |
# |
# |
# Progress window |
# Progress window |
my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin |
my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,scalar(@$students)); |
($r,'CSV File Compilation Status', |
|
'CSV File Compilation Progress', |
|
scalar(@$students),'inline',undef,'Statistics','stats_status'); |
|
|
|
$r->rflush(); |
$r->rflush(); |
# |
# |
Line 1096 sub prepare_csv_output {
|
Line 1117 sub prepare_csv_output {
|
my @extra_resp_headers = &get_extra_response_headers($show_named); |
my @extra_resp_headers = &get_extra_response_headers($show_named); |
# |
# |
# Create the table header |
# Create the table header |
my @student_columns = ('username','domain','id','section'); |
my @student_columns = &get_student_columns($show_named); |
if ($show_named) { |
|
@student_columns = qw(username domain id section); |
|
} else { |
|
@student_columns = qw(username); |
|
} |
|
my $student_column_count = scalar(@student_columns); |
my $student_column_count = scalar(@student_columns); |
# |
# |
my %headers; |
my %headers; |
Line 1114 sub prepare_csv_output {
|
Line 1130 sub prepare_csv_output {
|
# we put the headers into the %headers hash |
# we put the headers into the %headers hash |
my %problem_analysis; |
my %problem_analysis; |
my %start_col; |
my %start_col; |
my $max_column = scalar(@student_columns); |
my $max_column = $student_column_count; |
foreach my $prob (@$problems) { |
foreach my $prob (@$problems) { |
my $symb = $prob->symb(); |
my $symb = $prob->symb(); |
my %analysis = &Apache::lonstathelpers::get_problem_data($prob->src); |
my %analysis = &Apache::lonstathelpers::get_problem_data($prob->src); |
Line 1205 sub prepare_csv_output {
|
Line 1221 sub prepare_csv_output {
|
foreach my $row (@rows) { |
foreach my $row (@rows) { |
my $student_row_data = ''; |
my $student_row_data = ''; |
if ($show_named) { |
if ($show_named) { |
$student_row_data = '"'.join('","', |
foreach my $field (@student_columns) { |
map { $student->{$_}; } |
my $value = $student->{$field}; |
@student_columns).'"'; |
if ($field eq 'comments') { |
|
$value = &Apache::lonmsgdisplay::retrieve_instructor_comments |
|
($student->{'username'},$student->{'domain'}); |
|
} |
|
$student_row_data .= '"'.&Apache::loncommon::csv_translate($value).'",'; |
|
} |
|
$student_row_data =~ s/,$//; |
} else { |
} else { |
$student_row_data = '"'.&mt('Anonymized').'"'; |
$student_row_data = '"'.&mt('Anonymized').'"'; |
} |
} |
Line 1220 sub prepare_csv_output {
|
Line 1242 sub prepare_csv_output {
|
print $outputfile $/; |
print $outputfile $/; |
} |
} |
undef(@rows); |
undef(@rows); |
&Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state, |
&Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,'last student'); |
'last student'); |
|
} |
} |
close($outputfile); |
close($outputfile); |
# |
# |
Line 1238 sub prepare_csv_output {
|
Line 1259 sub prepare_csv_output {
|
sub csv_format_item { |
sub csv_format_item { |
my ($item,$type) = @_; |
my ($item,$type) = @_; |
if ($type eq 'Time') { |
if ($type eq 'Time') { |
$item = localtime($item); |
$item = &Apache::lonlocal::locallocaltime($item); |
} |
} |
$item =&Apache::loncommon::csv_translate($item); |
$item =&Apache::loncommon::csv_translate($item); |
return $item; |
return $item; |
Line 1266 sub CreateInterface {
|
Line 1287 sub CreateInterface {
|
## |
## |
## Environment variable initialization |
## Environment variable initialization |
my $Str = ''; |
my $Str = ''; |
$Str .= &Apache::lonhtmlcommon::breadcrumbs('Student Submission Reports'); |
|
$Str .= '<br />'; |
$Str .= '<br />'; |
$Str .= &Apache::loncommon::start_data_table(); |
$Str .= &Apache::loncommon::start_data_table(); |
$Str .= &Apache::loncommon::start_data_table_header_row(); |
$Str .= &Apache::loncommon::start_data_table_header_row(); |
Line 1346 sub CreateInterface {
|
Line 1366 sub CreateInterface {
|
$Str .= &Apache::loncommon::end_data_table_row(); |
$Str .= &Apache::loncommon::end_data_table_row(); |
$Str .= &Apache::loncommon::end_data_table(); |
$Str .= &Apache::loncommon::end_data_table(); |
# |
# |
$Str .= '<p><span class="LC_nobreak">' |
|
.&mt('Status: [_1]', |
|
'<input type="text" name="stats_status"' |
|
.' size="60" value="" readonly="readonly" />') |
|
.'</span></p>'; |
|
## |
|
return $Str; |
return $Str; |
} |
} |
|
|
|
sub get_student_columns { |
|
my ($show_named) = @_; |
|
my @student_columns; |
|
if ($show_named) { |
|
@student_columns = @Apache::lonstatistics::SelectedStudentData; |
|
if (grep(/^all$/,@student_columns)) { |
|
@student_columns = qw(fullname username domain id section status groups comments); |
|
} |
|
} else { |
|
@student_columns = ('username'); |
|
} |
|
return @student_columns; |
|
} |
|
|
1; |
1; |
|
|
__END__ |
__END__ |