--- loncom/interface/statistics/lonsurveyreports.pm 2005/03/10 00:23:15 1.4
+++ loncom/interface/statistics/lonsurveyreports.pm 2008/10/23 09:07:51 1.18
@@ -1,6 +1,6 @@
# The LearningOnline Network with CAPA
#
-# $Id: lonsurveyreports.pm,v 1.4 2005/03/10 00:23:15 matthew Exp $
+# $Id: lonsurveyreports.pm,v 1.18 2008/10/23 09:07:51 bisitz Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -27,7 +27,7 @@
package Apache::lonsurveyreports;
use strict;
-use Apache::lonnet();
+use Apache::lonnet;
use Apache::loncommon();
use Apache::lonhtmlcommon();
use Apache::loncoursedata();
@@ -37,14 +37,19 @@ use Apache::lonstathelpers;
use Spreadsheet::WriteExcel;
use HTML::Entities();
use Time::Local();
+use lib '/home/httpd/lib/perl/';
+use LONCAPA;
+
-my @SubmitButtons = ({ name => 'PrevProblem',
+my @SubmitButtons = (
+ { name => 'break'},
+ { name => 'PrevProblem',
text => 'Previous Survey' },
{ name => 'NextProblem',
text => 'Next Survey' },
- { name => 'break'},
{ name => 'SelectAnother',
- text => 'Choose a different Survey Problem' },
+ text => 'Choose a different Survey' },
+ { name => 'break'},
{ name => 'Generate',
text => 'Generate Report'},
);
@@ -68,15 +73,16 @@ sub BuildSurveyReportsPage {
my @Students = @Apache::lonstatistics::Students;
#
if (@Students < 1) {
- $r->print('
There are no students in the sections selected ');
+ $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'})) {
+ if (exists($env{'form.problemchoice'}) &&
+ ! exists($env{'form.SelectAnother'})) {
+ $r->print(' 'x3);
foreach my $button (@SubmitButtons) {
if ($button->{'name'} eq 'break') {
$r->print(" \n");
@@ -91,30 +97,34 @@ sub BuildSurveyReportsPage {
}
#
$r->print(' ');
+ $r->print(''.
+ &Apache::lonlocal::locallocaltime(time).','.
+ &Apache::lonstatistics::section_and_enrollment_description().
+ ' ');
$r->rflush();
#
# Determine which problem we are to analyze
my $current_problem = &Apache::lonstathelpers::get_target_from_id
- ($ENV{'form.problemchoice'});
+ ($env{'form.problemchoice'});
#
my ($navmap,$prev,$curr,$next) =
&Apache::lonstathelpers::get_prev_curr_next($current_problem,
'.',
'part_survey',
);
- if (exists($ENV{'form.PrevProblem'}) && defined($prev)) {
+ if (exists($env{'form.PrevProblem'}) && defined($prev)) {
$current_problem = $prev;
- } elsif (exists($ENV{'form.NextProblem'}) && defined($next)) {
+ } elsif (exists($env{'form.NextProblem'}) && defined($next)) {
$current_problem = $next;
} else {
$current_problem = $curr;
}
#
# Store the current problem choice and send it out in the form
- $ENV{'form.problemchoice'} =
+ $env{'form.problemchoice'} =
&Apache::lonstathelpers::make_target_id($current_problem);
$r->print(' ');
+ $env{'form.problemchoice'}.'" />');
#
if (! defined($current_problem->{'resource'})) {
$r->print('resource is undefined');
@@ -122,15 +132,20 @@ sub BuildSurveyReportsPage {
my $resource = $current_problem->{'resource'};
$r->print(''.$resource->compTitle.' ');
$r->print(''.$resource->src.' ');
- $r->print(&Apache::lonstathelpers::render_resource($resource));
+ if ($env{'form.renderprob'} eq 'true') {
+ $r->print(&Apache::lonstathelpers::render_resource($resource));
+ }
$r->rflush();
my %Data = &Apache::lonstathelpers::get_problem_data
($resource->src);
- if ($ENV{'form.output'} eq 'HTML' ||
- ! defined($ENV{'form.output'})) {
+ &compile_student_answers($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') {
+ } elsif ($env{'form.output'} eq 'Excel') {
&make_Excel_report($r,$current_problem,\%Data,\@Students);
+ } elsif ($env{'form.output'} eq 'TXT') {
+ &make_text_report($r,$current_problem,\%Data,\@Students);
}
}
$r->print(' ');
@@ -167,9 +182,9 @@ sub SurveyProblemSelector {
}
}
if (! scalar(@SurveyProblems)) {
- $Str = ''.
- &mt('There are no survey problems in this course').
- ' '.$/;
+ $Str = ''.
+ &mt('There are no survey problems in this course.').
+ '
'.$/;
return $Str;
}
$Str .= '';
return $Str;
@@ -209,9 +224,13 @@ sub SurveyProblemSelector {
##
#########################################################
#########################################################
-sub Compile_Student_Answers {
- my ($problem,$ProblemData,$Students) = @_;
+sub compile_student_answers {
+ my ($r,$problem,$ProblemData,$Students) = @_;
my $resource = $problem->{'resource'};
+ my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin
+ ($r,'Processing Student Submissions',
+ 'Processing Student Submissions',
+ scalar(@$Students),'inline',undef,'Statistics','stats_status');
foreach my $student (@$Students) {
foreach my $partid (@{$resource->parts}) {
my @response_ids = $resource->responseIds($partid);
@@ -233,18 +252,19 @@ sub Compile_Student_Answers {
foreach my $response (@responses) {
my ($foilid,$option) =
map {
- &Apache::lonnet::unescape($_);
+ &unescape($_);
} split('=',$response);
$data->{'foil_count'}->{$foilid}++;
$data->{'foil_responses'}->{$foilid}->{$option}++;
}
} elsif ($resptype =~ /^(radiobutton)$/) {
- my ($foil,$value) = map { &Apache::lonnet::unescape($_); } split('=',$student_response);
+ my ($foil,$value) = map { &unescape($_); } split('=',$student_response);
$value += 1; # explicitly increment it...
$data->{'foil_responses'}->{$foil}++;
$data->{'foil_values'}->{$value}++;
if (! exists($data->{'map'}->{$value})) {
$data->{'map'}->{$value} = $foil;
+ $data->{'map_fv'}->{$foil} = $value;
}
} else {
# Variable stuff (essays, raw numbers, strings) go here
@@ -252,10 +272,77 @@ sub Compile_Student_Answers {
}
}
}
+ &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,
+ 'last student');
+ }
+ &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
+ return;
+}
+
+
+#########################################################
+#########################################################
+##
+## make_text_report
+##
+#########################################################
+#########################################################
+sub make_text_report {
+ my ($r,$problem,$problem_data,$students) = @_;
+ my ($file,$filename) = &Apache::loncommon::create_text_file($r,'txt');
+ if (! defined($file)) { return '';}
+ $r->print('');
+ my $resource = $problem->{'resource'};
+ print $file $resource->compTitle.$/;
+ print $file &Apache::lonstatistics::section_and_enrollment_description().
+ ' '.&mt('Generated on [_1]',&Apache::lonlocal::locallocaltime(time)).
+ $/;
+ my $something_has_been_output = 0;
+ 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};
+ if (exists($data->{'responses'}) &&
+ ref($data->{'responses'}) eq 'ARRAY') {
+ # Essay type response
+ print $file ('-'x40).$/;
+ print $file
+ $resource->part_display($partid).', '.$respid.':'.$resptype.$/;
+ foreach my $submission (@{$data->{'responses'}}) {
+ print $file ('-'x20).$/;
+ $submission =~ s/(\\r\\n|\\n)/\n/g;
+ $submission =~ s/\\(\'|\"|\`)/$1/g;
+ print $file $submission.$/.$/;
+ $something_has_been_output=1;
+ }
+ }
+ }
}
+ close($file);
+ if($something_has_been_output) {
+ $r->print(''.
+ &mt('Your text file').
+ '
'."\n");
+ $r->print('');
+ } else {
+ $r->print(''
+ .&mt('There is no essay or string response data to output for this survey.')
+ .'');
+ }
+ $r->rflush();
return;
}
+
#########################################################
#########################################################
##
@@ -265,7 +352,6 @@ sub Compile_Student_Answers {
#########################################################
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('');
$r->rflush();
return;
@@ -381,8 +468,6 @@ sub make_Excel_report {
#########################################################
sub make_HTML_report {
my ($r,$problem,$ProblemData,$Students) = @_;
- &Compile_Student_Answers($problem,$ProblemData,$Students);
- # &output_hash('',$ProblemData);
my $resource = $problem->{'resource'};
foreach my $partid (@{$resource->parts}) {
my @response_ids = $resource->responseIds($partid);
@@ -404,7 +489,8 @@ sub make_HTML_report {
$Str .= '
'.
''.&mt('Total').' '.
''.$data->{'_count'}.' '.
- ''.&mt('Part [_1], Response [_2]',$partid,$respid).' '.
+ ''.&mt('Part [_1], Response [_2]',
+ $resource->part_display($partid),$respid).' '.
' ';
if (exists($data->{'responses'}) &&
ref($data->{'responses'}) eq 'ARRAY') {
@@ -421,22 +507,25 @@ sub make_HTML_report {
}
} elsif (exists($data->{'foil_count'}) &&
exists($data->{'foil_responses'})) {
- $Str.=''.
- '';
+ $Str.=' '
+ .''
+ .&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'))).' ';
- my @foils = sort(keys(%{$data->{'foil_responses'}}));
+ &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 = ''.
+ my $preamble = &Apache::loncommon::start_data_table_row().
''.
$foilname.' '.
''.
@@ -449,11 +538,12 @@ sub make_HTML_report {
' '.$count.' '.
''.
sprintf('%.2f',100*$count/$foil_count).'%'.
- ' '.$/;
- $preamble = '';
+ ''.&Apache::loncommon::end_data_table_row().$/;
+ $preamble = &Apache::loncommon::continue_data_table_row(); #&Apache::loncommon::start_data_table_row();
}
}
- $Str.=$tmp.'
';
+ $Str.=$tmp.&Apache::loncommon::end_data_table()
+ .'';
} elsif (exists($data->{'_count'}) &&
exists($data->{'foil_values'}) &&
exists($data->{'map'})) {
@@ -461,28 +551,30 @@ sub make_HTML_report {
my $total = $data->{'_count'};
my $sum = 0;
my $tmp;
- foreach my $value (sort(keys(%{$data->{'foil_values'}}))) {
+ my @foils = sort(keys(%{$ProblemData->{$partid.'.'.$respid}
+ ->{'_Foils'}}));
+ foreach my $foilid (@foils) {
+ my $value = $data->{'map_fv'}->{$foilid};
my $count = $data->{'foil_values'}->{$value};
- my $foilid = $data->{'map'}->{$value};
my $foiltext = $ProblemData->{$partid.'.'.$respid}->{'_Foils'}->{$foilid}->{'text'};
my $foilname = $ProblemData->{$partid.'.'.$respid}->{'_Foils'}->{$foilid}->{'name'};
- $tmp .= ''.
+ $tmp .= &Apache::loncommon::start_data_table_row().
''.$foilname.' '.
''.$foiltext.' '.
''.$count.' '.
''.
sprintf("%.2f",$count/$total*100).'% '.
- ' '.$/;
+ &Apache::loncommon::end_data_table_row().$/;
}
- $Str .= ''.
+ $Str .= &Apache::loncommon::start_data_table_row().
''.&mt('Foil Name').' '.
''.&mt('Text').' '.
''.&mt('Freq').' '.
''.&mt('Percent').' '.
- ' '.$/.
+ &Apache::loncommon::end_data_table_row().$/.
$tmp;
}
- $Str.= ' ';
+ $Str.= &Apache::loncommon::end_data_table().' ';
$r->print($Str);
$r->rflush();
}
@@ -512,45 +604,66 @@ sub CreateInterface {
## Environment variable initialization
my $Str = '';
my $output_selector = ''.$/;
- if (! exists($ENV{'form.output'})) {
- $ENV{'form.output'} = 'HTML';
+ if (! exists($env{'form.output'})) {
+ $env{'form.output'} = 'HTML';
}
foreach my $output_format ( {name=>'HTML',text=>&mt("HTML") },
- {name=>'Excel',text=>&mt("Excel") }) {
+ {name=>'Excel',text=>&mt("Excel") },
+ {name=>'TXT',text=>&mt("Text (essays only)") },
+ ) {
$output_selector.='{'name'}) {
+ if ($env{'form.output'} eq $output_format->{'name'}) {
$output_selector.=' selected';
}
$output_selector.= '>'.$output_format->{'text'}.' '.$/;
}
$output_selector .= ' '.$/;
- $Str .= &Apache::lonhtmlcommon::breadcrumbs
- (undef,'Student Submission Reports');
+ $Str .= &Apache::lonhtmlcommon::breadcrumbs('Student Submission Reports');
$Str .= '';
$Str .= '
'."\n";
#
- $Str .= ''.&mt('Status: [_1]',
- ' ').
- ' '.'';
+ $Str .= ''
+ .&mt('Status: [_1]',
+ ' ')
+ .'
';
+ $Str .= '';
##
return $Str;
}