'."\n");
- $r->print(''."\n");
- my $Str = '';
- foreach (@Header) {
- if (/^(Part)$/) { # Do not allow sorting on this field
- $Str .= ''.$_.' | ';
- } else {
- $Str .= ''.
- ''.
- $_.' | ';
- }
- }
- $r->print(''.$Str." \n");
$r->rflush();
#
# Compile the data
- my %Statshash;
my @Statsarray;
foreach my $sequence (@Sequences) {
next if ($sequence->{'num_assess'}<1);
@@ -336,14 +334,16 @@ sub output_html_ungrouped {
$SKEW) = &Apache::loncoursedata::get_problem_statistics
(undef,$resource->{'symb'},$part,
$ENV{'request.course.id'});
+ #
+ $show_part = 1 if ($part ne '0');
+ $part = ' ' if ($part == 0);
+ #
my $wrongpercent = 0;
if (defined($num) && $num > 0) {
$wrongpercent=int(10*100*($num-$Solved+$solved)/$num)/10;
}
- my $key = $resource->{'symb'}.':'.$part;
- $Statshash{$key} =
- {
- 'sequence' => $sequence,
+ push (@Statsarray,
+ { 'sequence' => $sequence,
'resource' => $resource,
'Title' => $resource->{'title'},
'Part' => $part,
@@ -357,39 +357,40 @@ sub output_html_ungrouped {
'DoDiff' => $DegOfDiff,
'S.D.' => $STD,
'Skew' => $SKEW,
- };
- push (@Statsarray,$Statshash{$key});
+ });
}
}
}
#
+ # Table Headers
+ $r->print(''."\n");
+ my $Str = '';
+ foreach (@Header) {
+ next if ($_ eq 'Part' && !$show_part);
+ # Do not allow sorting on some fields
+ if ($_ eq $sortby || /^(Part)$/) {
+ $Str .= ''.$_.' | ';
+ } else {
+ $Str .= ''.
+ ''.
+ $_.' | ';
+ }
+ }
+ $r->print(''.$Str." \n");
+ #
# Sort the data
+ my @OutputOrder;
if ($sortby eq 'Container') {
- foreach my $sequence (@Sequences) {
- next if ($sequence->{'num_assess'}<1);
- foreach my $resource (@{$sequence->{'contents'}}) {
- next if ($resource->{'type'} ne 'assessment');
- foreach my $part (@{$resource->{'parts'}}) {
- my $key = $resource->{'symb'}.':'.$part;
- $r->print('');
- if ($show_container) {
- $r->print(''
- .$sequence->{'title'}.' | ');
- }
- $r->print(&stats_row_from_hash($Statshash{$key}));
- $r->print(" \n");
- }
- }
- }
+ @OutputOrder = @Statsarray;
} else {
# $sortby is already defined, so we can charge ahead
- my @OutputOrder;
if ($sortby =~ /^(title|part)$/i) {
# Alpha comparison
@OutputOrder = sort {
- $b->{$sortby} cmp $a->{$sortby} ||
- $b->{'Title'} cmp $a->{'Title'} ||
- $b->{'Part'} cmp $a->{'Part'};
+ lc($a->{$sortby}) cmp lc($b->{$sortby}) ||
+ lc($a->{'Title'}) cmp lc($b->{'Title'}) ||
+ lc($a->{'Part'}) cmp lc($b->{'Part'});
} @Statsarray;
} else {
# Numerical comparison
@@ -409,21 +410,21 @@ sub output_html_ungrouped {
}
if ($retvalue eq '0') {
$retvalue = $b->{$sortby} <=> $a->{$sortby} ||
- $b->{'Title'} <=> $a->{'Title'} ||
- $b->{'Part'} <=> $a->{'Part'};
+ lc($a->{'Title'}) <=> lc($b->{'Title'}) ||
+ lc($a->{'Part'}) <=> lc($b->{'Part'});
}
$retvalue;
} @Statsarray;
}
- foreach my $row (@OutputOrder) {
- $r->print('');
- if ($show_container) {
- $r->print(''
- .$row->{'sequence'}->{'title'}.' | ');
- }
- $r->print(&stats_row_from_hash($row));
- $r->print(" \n");
+ }
+ foreach my $row (@OutputOrder) {
+ $r->print('');
+ if ($show_container) {
+ $r->print(''
+ .$row->{'sequence'}->{'title'}.' | ');
}
+ $r->print(&stats_row_from_hash($row,$show_part));
+ $r->print(" \n");
}
$r->print(" \n");
$r->print(" \n");
@@ -433,17 +434,14 @@ sub output_html_ungrouped {
}
sub stats_row_from_hash {
- my ($data) = @_;
- if (ref($data) ne 'HASH') {
- my %Tmp = @_;
- $data = \%Tmp;
- }
+ my ($data,$show_part) = @_;
return &statistics_html_table_data($data->{'resource'},$data->{'Part'},
$data->{'#Stdnts'}, $data->{'Tries'},
$data->{'Mod'}, $data->{'Mean'},
$data->{'#YES'}, $data->{'#yes'},
$data->{"\%Wrng"}, $data->{'DoDiff'},
- $data->{'S.D.'}, $data->{'Skew'});
+ $data->{'S.D.'}, $data->{'Skew'},
+ $show_part);
}
###############################################
@@ -451,15 +449,133 @@ sub stats_row_from_hash {
###############################################
###############################################
+sub output_excel {
+ my ($r) = @_;
+ my $filename = '/prtspool/'.
+ $ENV{'user.name'}.'_'.$ENV{'user.domain'}.'_'.
+ time.'_'.rand(1000000000).'.xls';
+ #
+ my $excel_workbook = undef;
+ my $excel_sheet = undef;
+ #
+ my $rows_output = 0;
+ my $cols_output = 0;
+ #
+ # Create sheet
+ $excel_workbook = Spreadsheet::WriteExcel->new('/home/httpd'.$filename);
+ #
+ # Check for errors
+ if (! defined($excel_workbook)) {
+ $r->log_error("Error creating excel spreadsheet $filename: $!");
+ $r->print("Problems creating new Excel file. ".
+ "This error has been logged. ".
+ "Please alert your LON-CAPA administrator");
+ return ;
+ }
+ #
+ # The excel spreadsheet stores temporary data in files, then put them
+ # together. If needed we should be able to disable this (memory only).
+ # The temporary directory must be specified before calling 'addworksheet'.
+ # File::Temp is used to determine the temporary directory.
+ $excel_workbook->set_tempdir($Apache::lonnet::tmpdir);
+ #
+ # Add a worksheet
+ my $sheetname = $ENV{'course.'.$ENV{'request.course.id'}.'.description'};
+ if (length($sheetname) > 31) {
+ $sheetname = substr($sheetname,0,31);
+ }
+ $excel_sheet = $excel_workbook->addworksheet($sheetname);
+ #
+ # Put the course description in the header
+ $excel_sheet->write($rows_output,$cols_output++,
+ $ENV{'course.'.$ENV{'request.course.id'}.'.description'});
+ $cols_output += 3;
+ #
+ # Put a description of the sections listed
+ my $sectionstring = '';
+ my @Sections = @Apache::lonstatistics::SelectedSections;
+ if (scalar(@Sections) > 1) {
+ if (scalar(@Sections) > 2) {
+ my $last = pop(@Sections);
+ $sectionstring = "Sections ".join(', ',@Sections).', and '.$last;
+ } else {
+ $sectionstring = "Sections ".join(' and ',@Sections);
+ }
+ } else {
+ if ($Sections[0] eq 'all') {
+ $sectionstring = "All sections";
+ } else {
+ $sectionstring = "Section ".$Sections[0];
+ }
+ }
+ $excel_sheet->write($rows_output,$cols_output++,$sectionstring);
+ $cols_output += scalar(@Sections);
+ #
+ # Put the date in there too
+ $excel_sheet->write($rows_output,$cols_output++,
+ 'Compiled on '.localtime(time));
+ #
+ $rows_output++;
+ $cols_output=0;
+ #
+ # Add the headers
+ my @Header = ("Container","Title","Part","#Stdnts","Tries","Mod",
+ "Mean","#YES","#yes","%Wrng","DoDiff",
+ "S.D.","Skew.");#,"D.F.1st","D.F.2nd");
+ foreach (@Header) {
+ $excel_sheet->write($rows_output,$cols_output++,$_);
+ }
+ $rows_output++;
+ #
+ # Write the data
+ foreach my $sequence (&Apache::lonstatistics::Sequences_with_Assess()) {
+ next if ($sequence->{'num_assess'}<1);
+ foreach my $resource (@{$sequence->{'contents'}}) {
+ next if ($resource->{'type'} ne 'assessment');
+ foreach my $part (@{$resource->{'parts'}}) {
+ $cols_output=0;
+ my ($num,$tries,$mod,$mean,$Solved,$solved,$DegOfDiff,$STD,
+ $SKEW) = &Apache::loncoursedata::get_problem_statistics
+ (undef,$resource->{'symb'},$part,
+ $ENV{'request.course.id'});
+ #
+ if (!defined($part) || $part eq '') {
+ $part = ' ';
+ }
+ my $wrongpercent = 0;
+ if (defined($num) && $num > 0) {
+ $wrongpercent=int(10*100*($num-$Solved+$solved)/$num)/10;
+ }
+ foreach ($sequence->{'title'},$resource->{'title'},$part,
+ $num,$tries,$mod,$mean,$Solved,$solved,$wrongpercent,
+ $DegOfDiff,$STD,$SKEW) {
+ $excel_sheet->write($rows_output,$cols_output++,$_);
+ }
+ $rows_output++;
+ }
+ }
+ }
+ #
+ # Write the excel file
+ $excel_workbook->close();
+ # Tell the user where to get their excel file
+ $r->print(' '.
+ 'Your Excel spreadsheet.'."\n");
+ $r->rflush();
+ return;
+}
+
+
+
sub statistics_html_table_data {
my ($resource,$part,$num,$tries,$mod,$mean,$Solved,$solved,$wrongpercent,
- $DegOfDiff,$STD,$SKEW) = @_;
+ $DegOfDiff,$STD,$SKEW,$show_part) = @_;
my $row = '';
$row .= ' | '.
''.
$resource->{'title'}.''.
' | ';
- $row .= ''.$part.' | ' if (defined($part));
+ $row .= ''.$part.' | ' if ($show_part);
foreach ($num,$tries) {
$row .= ''.$_.' | ';
}