[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--