# The LearningOnline Network with CAPA # # $Id: lonsurveyreports.pm,v 1.17 2008/10/14 14:10:49 bisitz Exp $ # # Copyright Michigan State University Board of Trustees # # This file is part of the LearningOnline Network with CAPA (LON-CAPA). # # LON-CAPA is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # LON-CAPA is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with LON-CAPA; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # /home/httpd/html/adm/gpl.txt # # http://www.lon-capa.org/ # package Apache::lonsurveyreports; use strict; use Apache::lonnet; use Apache::loncommon(); use Apache::lonhtmlcommon(); use Apache::loncoursedata(); use Apache::lonstatistics; use Apache::lonlocal; use Apache::lonstathelpers; use Spreadsheet::WriteExcel; use HTML::Entities(); use Time::Local(); use lib '/home/httpd/lib/perl/'; use LONCAPA; my @SubmitButtons = ( { name => 'break'}, { name => 'PrevProblem', text => 'Previous Survey' }, { name => 'NextProblem', text => 'Next Survey' }, { name => 'SelectAnother', text => 'Choose a different Survey' }, { name => 'break'}, { name => 'Generate', text => 'Generate Report'}, ); sub BuildSurveyReportsPage { my ($r,$c)=@_; # my %Saveable_Parameters = ('Status' => 'scalar', 'Section' => 'array', 'NumPlots' => 'scalar', ); &Apache::loncommon::store_course_settings('survey_reports', \%Saveable_Parameters); &Apache::loncommon::restore_course_settings('survey_resports', \%Saveable_Parameters); # &Apache::lonstatistics::PrepareClasslist(); # $r->print(&CreateInterface()); # my @Students = @Apache::lonstatistics::Students; # if (@Students < 1) { $r->print('
'.&mt('There are no students in the sections selected.').'
'); } # my @CacheButtonHTML = &Apache::lonstathelpers::manage_caches($r,'Statistics','stats_status'); $r->rflush(); # if (exists($env{'form.problemchoice'}) && ! exists($env{'form.SelectAnother'})) { $r->print(' 'x3); foreach my $button (@SubmitButtons) { if ($button->{'name'} eq 'break') { $r->print("'. &mt('There are no survey problems in this course.'). '
'.$/; return $Str; } $Str .= ''. ' | '.&mt('Survey').' | '. '
---|---|
'. ''.' | '. '
' .&mt('There is no essay or string response data to output for this survey.') .''); } $r->rflush(); return; } ######################################################### ######################################################### ## ## make_Excel_report ## ######################################################### ######################################################### sub make_Excel_report { my ($r,$problem,$problem_data,$students) = @_; my ($workbook,$filename,$format) = &Apache::loncommon::create_workbook($r); if (! defined($workbook)) { return '';} $r->print(''); 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('
'. &mt('[_1]:[_2] responses to [_3] may be too long to fit Excel spreadsheet.', $resource->compTitle, $resource->part_display($partid), $respid). '
'); $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(%{$respdata->{'_Foils'}})); 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'}); my @foils = sort(keys(%{$respdata->{'_Foils'}})); foreach my $foilid (@foils) { undef(@rowdata); my $value = $data->{'map_fv'}->{$foilid}; 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(''. &mt('Your Excel spreadsheet.'). '
'."\n"); $r->print(''); $r->rflush(); return; } ######################################################### ######################################################### ## ## make_HTML_report ## ######################################################### ######################################################### sub make_HTML_report { my ($r,$problem,$ProblemData,$Students) = @_; my $resource = $problem->{'resource'}; 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 $Str = ''.$partid.' | '. # ''.$respid.' | '. # ''.$resptype.' | '. # '|||||||
'.&mt('Total').' | '. ''.$data->{'_count'}.' | '. ''.&mt('Part [_1], Response [_2]', $resource->part_display($partid),$respid).' | '. '|||||||
'. &HTML::Entities::encode($response,'<>&'). ' | '.
'|||||||||
' .&Apache::loncommon::start_data_table() .&Apache::loncommon::start_data_table_header_row(); my $tmp = ' | '.join(' | ', (&mt('Foil Name'), &mt('Foil Text'), &mt('Option'), &mt('Frequency'), &mt('Percent'))).' | ' .&Apache::loncommon::end_data_table_header_row(); my @foils = sort(keys(%{$ProblemData->{$partid.'.'.$respid}->{'_Foils'}})); foreach my $foilid (@foils) { my $prob_data = $ProblemData->{$partid.'.'.$respid}; my $foil_count = $data->{'foil_count'}->{$foilid}; my $foiltext = $prob_data->{'_Foils'}->{$foilid}->{'text'}; my $foilname = $prob_data->{'_Foils'}->{$foilid}->{'name'}; my $rowspan = scalar(@{$prob_data->{'_Options'}}); my $preamble = &Apache::loncommon::start_data_table_row(). ''. $foilname.' | '. ''. $foiltext.' | '; foreach my $option (sort(@{$prob_data->{'_Options'}})){ my $count = $data->{'foil_responses'}->{$foilid}->{$option}; $tmp .= $preamble. ''.$option.' | '. ''.$count.' | '. ''. sprintf('%.2f',100*$count/$foil_count).'%'. ' | '.&Apache::loncommon::end_data_table_row().$/; $preamble = &Apache::loncommon::continue_data_table_row(); #&Apache::loncommon::start_data_table_row(); } } $Str.=$tmp.&Apache::loncommon::end_data_table() .''.$foilname.' | '. ''.$foiltext.' | '. ''.$count.' | '. ''. sprintf("%.2f",$count/$total*100).'% | '. &Apache::loncommon::end_data_table_row().$/; } $Str .= &Apache::loncommon::start_data_table_row(). ''.&mt('Foil Name').' | '. ''.&mt('Text').' | '. ''.&mt('Freq').' | '. ''.&mt('Percent').' | '. &Apache::loncommon::end_data_table_row().$/. $tmp; } $Str.= &Apache::loncommon::end_data_table().'
---|
'.&mt('Sections').' | '; $Str .= ''.&mt('Groups').' | '; $Str .= ''.&mt('Access Status').' | '; $Str .= ''.&mt('Output Format').' | '; $Str .= ''.' '.' | '; $Str .= '
---|---|---|---|---|
'."\n"; $Str .= &Apache::lonstatistics::SectionSelect('Section','multiple',5); $Str .= ' | '; # $Str .= ''."\n"; $Str .= &Apache::lonstatistics::GroupSelect('Group','multiple',5); $Str .= ' | '; # $Str .= ''; $Str .= &Apache::lonhtmlcommon::StatusOptions(undef,undef,5); $Str .= ' | '; # $Str .= ''.$output_selector.' | '; # # Render problem checkbox my $prob_checkbox = ''. &mt('Show problem [_1]',$prob_checkbox).'