[LON-CAPA-cvs] cvs: loncom /interface/statistics lonsurveyreports.pm
matthew
lon-capa-cvs@mail.lon-capa.org
Thu, 10 Mar 2005 00:23:15 -0000
This is a MIME encoded message
--matthew1110414195
Content-Type: text/plain
matthew Wed Mar 9 19:23:15 2005 EDT
Modified files:
/loncom/interface/statistics lonsurveyreports.pm
Log:
Added Excel output. It's pretty good - a little rough around the edges.
--matthew1110414195
Content-Type: text/plain
Content-Disposition: attachment; filename="matthew-20050309192315.txt"
Index: loncom/interface/statistics/lonsurveyreports.pm
diff -u loncom/interface/statistics/lonsurveyreports.pm:1.3 loncom/interface/statistics/lonsurveyreports.pm:1.4
--- loncom/interface/statistics/lonsurveyreports.pm:1.3 Tue Mar 1 17:04:55 2005
+++ loncom/interface/statistics/lonsurveyreports.pm Wed Mar 9 19:23:15 2005
@@ -1,6 +1,6 @@
# The LearningOnline Network with CAPA
#
-# $Id: lonsurveyreports.pm,v 1.3 2005/03/01 22:04:55 matthew Exp $
+# $Id: lonsurveyreports.pm,v 1.4 2005/03/10 00:23:15 matthew Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -34,6 +34,7 @@
use Apache::lonstatistics;
use Apache::lonlocal;
use Apache::lonstathelpers;
+use Spreadsheet::WriteExcel;
use HTML::Entities();
use Time::Local();
@@ -125,7 +126,12 @@
$r->rflush();
my %Data = &Apache::lonstathelpers::get_problem_data
($resource->src);
- &make_HTML_report($r,$current_problem,\%Data,\@Students);
+ if ($ENV{'form.output'} eq 'HTML' ||
+ ! defined($ENV{'form.output'})) {
+ &make_HTML_report($r,$current_problem,\%Data,\@Students);
+ } elsif ($ENV{'form.output'} eq 'Excel') {
+ &make_Excel_report($r,$current_problem,\%Data,\@Students);
+ }
}
$r->print('<hr />');
} else {
@@ -253,6 +259,122 @@
#########################################################
#########################################################
##
+## make_Excel_report
+##
+#########################################################
+#########################################################
+sub make_Excel_report {
+ my ($r,$problem,$problem_data,$students) = @_;
+ &Compile_Student_Answers($problem,$problem_data,$students);
+ my ($workbook,$filename,$format) = &Apache::loncommon::create_workbook($r);
+ if (! defined($workbook)) { return '';}
+ $r->print('<script>'.
+ 'window.document.Statistics.stats_status.value="'.
+ &mt('Building spreadsheet.').
+ '";</script>');
+ my $worksheet = $workbook->addworksheet('Survey Reports');
+ #
+ my $rows_output=0;
+ $worksheet->write($rows_output++,0,
+ $ENV{'course.'.$ENV{'request.course.id'}.'.description'},
+ $format->{'h1'});
+ $rows_output++;
+ #
+ my $resource = $problem->{'resource'};
+ $worksheet->write($rows_output++,0,$resource->compTitle,$format->{'h2'});
+ foreach my $partid (@{$resource->parts}) {
+ my @response_ids = $resource->responseIds($partid);
+ my @response_types = $resource->responseType($partid);
+ for (my $i=0;$i<=$#response_ids;$i++) {
+ my $respid = $response_ids[$i];
+ my $resptype = $response_types[$i];
+ my $data = $problem->{'responsedata'}->{$partid}->{$respid};
+ my $cols_output=0;
+ $worksheet->write($rows_output,$cols_output++,
+ $resource->part_display($partid),$format->{'h3'});
+ $worksheet->write($rows_output,$cols_output++,
+ 'Response '.$respid.', '.$resptype,
+ $format->{'h3'});
+ $rows_output++;
+ if (exists($data->{'responses'}) &&
+ ref($data->{'responses'}) eq 'ARRAY') {
+ my $warned_about_size = 0;
+ foreach my $data (@{$data->{'responses'}}) {
+ if (length($data) > 255 && ! $warned_about_size) {
+ $r->print('<p>'.
+ &mt('[_1]:[_2] responses to [_3] may be too long to fit Excel spreadsheet.',
+ $resource->compTitle,
+ $resource->part_display($partid),
+ $respid).
+ '</p>');
+ $r->rflush();
+ $warned_about_size=1;
+ }
+ $worksheet->write($rows_output++,0,$data);
+ }
+ } elsif (exists($data->{'foil_count'}) &&
+ exists($data->{'foil_responses'})) {
+ my $respdata = $problem_data->{$partid.'.'.$respid};
+ my @rowdata = ('Foil Name','Foil Text','Option',
+ 'Frequency');
+ $worksheet->write_row($rows_output++,0,
+ \@rowdata,$format->{'h4'});
+ #
+ my @foils = sort(keys(%{$data->{'foil_responses'}}));
+ foreach my $foilid (@foils) {
+ my $foil_count = $data->{'foil_count'}->{$foilid};
+ my $foiltext = $respdata->{'_Foils'}->{$foilid}->{'text'};
+ my $foilname = $respdata->{'_Foils'}->{$foilid}->{'name'};
+ $foiltext = &HTML::Entities::decode($foilname);
+ my $cols_output=0;
+ $worksheet->write($rows_output,$cols_output++,$foilname);
+ $worksheet->write($rows_output,$cols_output++,$foiltext);
+ my $option_start_col = $cols_output;
+ #
+ foreach my $option (sort(@{$respdata->{'_Options'}})){
+ $cols_output= $option_start_col;
+ $worksheet->write($rows_output,$cols_output++,
+ $option);
+ my $count=
+ $data->{'foil_responses'}->{$foilid}->{$option};
+ $worksheet->write($rows_output,$cols_output++,$count);
+ $rows_output++;
+ }
+ }
+ } elsif (exists($data->{'_count'}) &&
+ exists($data->{'foil_values'}) &&
+ exists($data->{'map'})) {
+ my $respdata = $problem_data->{$partid.'.'.$respid};
+ my @rowdata = ('Foil Name','Foil Text','Frequency');
+ $worksheet->write_row($rows_output++,0,
+ \@rowdata,$format->{'h4'});
+ foreach my $value (sort(keys(%{$data->{'foil_values'}}))) {
+ undef(@rowdata);
+ my $foilid = $data->{'map'}->{$value};
+ push(@rowdata,$respdata->{'_Foils'}->{$foilid}->{'name'});
+ push(@rowdata,$respdata->{'_Foils'}->{$foilid}->{'text'});
+ push(@rowdata,$data->{'foil_values'}->{$value});
+ $worksheet->write_row($rows_output++,0,\@rowdata);
+ }
+ }
+ $rows_output++;
+ } #response ids
+ } # partids
+ $workbook->close();
+ $r->print('<p><a href="'.$filename.'">'.
+ &mt('Your Excel spreadsheet.').
+ '</a></p>'."\n");
+ $r->print('<script>'.
+ 'window.document.Statistics.stats_status.value="'.
+ &mt('Done compiling spreadsheet. See link below to download.').
+ '";</script>');
+ $r->rflush();
+ return;
+}
+
+#########################################################
+#########################################################
+##
## make_HTML_report
##
#########################################################
@@ -344,7 +466,6 @@
my $foilid = $data->{'map'}->{$value};
my $foiltext = $ProblemData->{$partid.'.'.$respid}->{'_Foils'}->{$foilid}->{'text'};
my $foilname = $ProblemData->{$partid.'.'.$respid}->{'_Foils'}->{$foilid}->{'name'};
- $sum = $value * $data->{'foil_values'}->{$value};
$tmp .= '<tr>'.
'<td>'.$foilname.'</td>'.
'<td>'.$foiltext.'</td>'.
@@ -390,6 +511,19 @@
##
## Environment variable initialization
my $Str = '';
+ my $output_selector = '<select name="output" size="5">'.$/;
+ if (! exists($ENV{'form.output'})) {
+ $ENV{'form.output'} = 'HTML';
+ }
+ foreach my $output_format ( {name=>'HTML',text=>&mt("HTML") },
+ {name=>'Excel',text=>&mt("Excel") }) {
+ $output_selector.='<option value="'.$output_format->{'name'}.'"';
+ if ($ENV{'form.output'} eq $output_format->{'name'}) {
+ $output_selector.=' selected';
+ }
+ $output_selector.= '>'.$output_format->{'text'}.'</option>'.$/;
+ }
+ $output_selector .= '</select>'.$/;
$Str .= &Apache::lonhtmlcommon::breadcrumbs
(undef,'Student Submission Reports');
$Str .= '<p>';
@@ -397,6 +531,7 @@
$Str .= '<tr>';
$Str .= '<td align="center"><b>'.&mt('Sections').'</b></td>';
$Str .= '<td align="center"><b>'.&mt('Enrollment Status').'</b></td>';
+ $Str .= '<td align="center"><b>'.&mt('Output Format').'</b></td>';
$Str .= '</tr>'."\n";
#
$Str .= '<tr><td align="center">'."\n";
@@ -407,6 +542,8 @@
$Str .= &Apache::lonhtmlcommon::StatusOptions(undef,undef,5);
$Str .= '</td>';
#
+ $Str .= '<td align="center">'.$output_selector.'</td>';
+ #
$Str .= '</tr>'."\n";
$Str .= '</table>'."\n";
#
--matthew1110414195--