[LON-CAPA-cvs] cvs: loncom /interface/statistics lonstudentsubmissions.pm
matthew
lon-capa-cvs@mail.lon-capa.org
Wed, 02 Feb 2005 21:19:54 -0000
This is a MIME encoded message
--matthew1107379194
Content-Type: text/plain
matthew Wed Feb 2 16:19:54 2005 EDT
Modified files:
/loncom/interface/statistics lonstudentsubmissions.pm
Log:
Removed debugging code from html output which caused data from at most 10
students to be output.
Implemented Excel foil per column output.
--matthew1107379194
Content-Type: text/plain
Content-Disposition: attachment; filename="matthew-20050202161954.txt"
Index: loncom/interface/statistics/lonstudentsubmissions.pm
diff -u loncom/interface/statistics/lonstudentsubmissions.pm:1.30 loncom/interface/statistics/lonstudentsubmissions.pm:1.31
--- loncom/interface/statistics/lonstudentsubmissions.pm:1.30 Wed Feb 2 13:53:32 2005
+++ loncom/interface/statistics/lonstudentsubmissions.pm Wed Feb 2 16:19:53 2005
@@ -1,6 +1,6 @@
# The LearningOnline Network with CAPA
#
-# $Id: lonstudentsubmissions.pm,v 1.30 2005/02/02 18:53:32 matthew Exp $
+# $Id: lonstudentsubmissions.pm,v 1.31 2005/02/02 21:19:53 matthew Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -149,6 +149,23 @@
}
##
+## get_extra_response_headers
+##
+sub get_extra_response_headers {
+ my @extra_resp_headers;
+ if ($ENV{'form.correctans'} eq 'true') {
+ push(@extra_resp_headers,'Correct');
+ }
+ if ($ENV{'form.prob_status'} eq 'true') {
+ push(@extra_resp_headers,'Award Detail');
+ push(@extra_resp_headers,'Time');
+ push(@extra_resp_headers,'Attempt');
+ push(@extra_resp_headers,'Awarded');
+ }
+ return @extra_resp_headers;
+}
+
+##
## get_headers:
## return the proper headers for the given response
sub get_headers {
@@ -197,17 +214,7 @@
}
#
# Compute the number of columns per response
- my @extra_resp_headers;
- if ($ENV{'form.correctans'} eq 'true') {
- push(@extra_resp_headers,'Correct');
- }
- if ($ENV{'form.prob_status'} eq 'true') {
- push(@extra_resp_headers,'Award Detail');
- push(@extra_resp_headers,'Time');
- push(@extra_resp_headers,'Attempt');
- push(@extra_resp_headers,'Awarded');
- }
- my $response_multiplier = scalar(@extra_resp_headers);
+ my @extra_resp_headers = &get_extra_response_headers();
#
# Create the table header
my @student_columns = ('username','domain','id');
@@ -225,8 +232,7 @@
#
my %problem_analysis;
foreach my $prob (@$problems) {
- my $src = $prob->src;
- my %analysis = &Apache::lonstathelpers::get_problem_data($src);
+ my %analysis = &Apache::lonstathelpers::get_problem_data($prob->src);
$problem_analysis{$prob->src}=\%analysis;
#
my $prob_span = 0;
@@ -297,9 +303,7 @@
my $count;
$r->print($/.$full_header.$/);
my $row_class = 'odd'; # css
- my $mycount = 10;
foreach my $student (@$students) {
- last if ($mycount-- < 1);
my $student_row_data;
if ($count++ >= 30) {
$r->print('</table>'.$/.$full_header.$/);
@@ -574,12 +578,24 @@
#
# Determine the number of columns in the spreadsheet
my $columncount = 3; # username, domain, id
- my $response_multiplier = 1;
- $response_multiplier ++ if ($ENV{'form.correctans'} eq 'true');
- $response_multiplier += 4 if ($ENV{'form.prob_status'} eq 'true');
+ my @extra_resp_headers = &get_extra_response_headers();
my $lastprob;
+ my %problem_analysis;
foreach my $prob (@$Problems) {
- $columncount += ($response_multiplier * $prob->countResponses);
+ my %analysis = &Apache::lonstathelpers::get_problem_data($prob->src);
+ $problem_analysis{$prob->src}=\%analysis;
+ foreach my $partid (@{$prob->parts}) {
+ my $responses = [$prob->responseIds($partid)];
+ my $resptypes = [$prob->responseType($partid)];
+ for (my $i=0;$i<scalar(@$responses);$i++) {
+ my @headers = &get_headers($prob,$partid,$responses->[$i],
+ $resptypes->[$i],
+ $problem_analysis{$prob->src},
+ 'excel','display',
+ @extra_resp_headers);
+ $columncount += scalar(@headers);
+ }
+ }
last if ($columncount > 255);
$lastprob = $prob;
}
@@ -645,6 +661,7 @@
$format->{'bold'});
}
# Problem headers
+ my %start_col;
foreach my $prob (@$Problems) {
my $title = $prob->compTitle;
$worksheet->write($title_row,$cols_output,
@@ -655,20 +672,21 @@
my $responses = [$prob->responseIds($partid)];
my $resptypes = [$prob->responseType($partid)];
for (my $i=0;$i<scalar(@$responses);$i++) {
+ $start_col{$prob->symb}->{$partid}->{$responses->[$i]}=
+ $cols_output;
$worksheet->write($respid_row,$cols_output,
$resptypes->[$i].', '.$responses->[$i]);
- $worksheet->write($header_row,$cols_output,'Submission');
- $cols_output++;
- if ($ENV{'form.correctans'} eq 'true') {
- $worksheet->write($header_row,$cols_output,'Correct');
- $cols_output++;
- }
- if ($ENV{'form.prob_status'} eq 'true') {
- $worksheet->write($header_row,$cols_output++,
- 'Award Detail');
- $worksheet->write($header_row,$cols_output++,'Attempt');
- $worksheet->write($header_row,$cols_output++,'Time');
- $worksheet->write($header_row,$cols_output++,'Awarded');
+ my @headers = &get_headers($prob,$partid,$responses->[$i],
+ $resptypes->[$i],
+ $problem_analysis{$prob->src},
+ 'excel','display',
+ @extra_resp_headers);
+ foreach my $text (@headers) {
+ if ($text eq 'Time') {
+ $worksheet->set_column($cols_output,$cols_output,undef,
+ $format->{'date'});
+ }
+ $worksheet->write($header_row,$cols_output++,$text);
}
}
}
@@ -689,38 +707,45 @@
$student->{$field});
}
my $last_student_col = $cols_output-1;
- my $response_count;
foreach my $prob (@$Problems) {
foreach my $partid (@{$prob->parts}) {
my @Response = $prob->responseIds($partid);
my @ResponseType = $prob->responseType($partid);
for (my $i=0;$i<=$#Response;$i++) {
- my $response_start_col = $last_student_col +
- $response_count * $response_multiplier + 1;
- $response_count++;
my $respid = $Response[$i];
my $resptype = $ResponseType[$i];
my $results =
&Apache::loncoursedata::get_response_data_by_student
($student,$prob->symb(),$respid);
+ my @headers = &get_headers($prob,$partid,$respid,
+ $resptype,
+ $problem_analysis{$prob->src},
+ 'excel','normal',
+ @extra_resp_headers);
+
if (! defined($results)) {
$results = [];
}
#
$rows_output = $student_row;
#
+ my $response_start_col = $start_col{$prob->symb}->{$partid}->{$respid};
for (my $j=scalar(@$results)-1;$j>=0;$j--) {
$cols_output = $response_start_col;
- my $response = $results->[$j];
if ($ENV{'form.all_sub'} ne 'true') {
next if ($j ne scalar(@$results)-1);
}
- my $cols_output = &write_excel_row
- ($worksheet,
- $rows_output++,$cols_output,
- $response,$student,
- $prob,$partid,$respid,
- $format,$resptype);
+ my $response = &hashify_response($results->[$j],
+ $prob,
+ $student,
+ $partid,
+ $respid);
+ my @response_data =
+ &excel_response_data(\@headers,$prob,$partid,
+ $respid,$response,$resptype);
+ $worksheet->write_row($rows_output++,$cols_output,
+ \@response_data);
+ $cols_output+=scalar(@response_data);
if ($rows_output > $max_row) {
$max_row = $rows_output;
}
@@ -757,56 +782,77 @@
return;
}
-sub write_excel_row {
- my ($worksheet,$row,$col,$response,$student,$prob,$partid,$respid,
- $format,$resptype) = @_;
- #
- my $submission =$response->[&Apache::loncoursedata::RDs_submission()];
- $submission = &excel_format_response($submission,$resptype);
- $worksheet->write($row,$col++,$submission);
- if ($ENV{'form.correctans'} eq 'true') {
- my $correct = &Apache::lonstathelpers::get_student_answer
- ($prob,$student->{'username'},$student->{'domain'},
- $partid,$respid);
- $correct =&excel_format_response($correct,$resptype);
- $worksheet->write($row,$col++,$correct);
+sub excel_response_data {
+ my ($headers,$prob,$partid,$respid,$response,$resptype) = @_;
+ if (! ref($headers) || ref($headers) ne 'ARRAY' || ! scalar(@$headers)) {
+ return ();
}
- if ($ENV{'form.prob_status'} eq 'true') {
- $worksheet->write
- ($row,$col++,
- $response->[&Apache::loncoursedata::RDs_awarddetail()]);
- $worksheet->write
- ($row,$col++,$response->[&Apache::loncoursedata::RDs_tries()]);
- $worksheet->write
- ($row,$col++,
- &Apache::lonstathelpers::calc_serial
- ($response->[&Apache::loncoursedata::RDs_timestamp()]),
- $format->{'date'});
- $worksheet->write
- ($row,$col++,$response->[&Apache::loncoursedata::RDs_awarded()]);
+ #
+ my $submission = &HTML::Entities::decode($response->{'Submission'});
+ return '' if (! defined($submission) || $submission eq '');
+ $submission =~ s/\\\"/\"/g;
+ $submission =~ s/\\\'/\'/g;
+ if ($resptype eq 'radiobutton') {
+ $submission =~ s/=([^=])$//;
+ }
+ $response->{'Submission'} = $submission;
+ #
+ my @values;
+ if ($resptype =~ /^(option|match|rank)$/) {
+ my %submission =
+ map {
+ my ($foil,$value) = split('=',&Apache::lonnet::unescape($_));
+ ($foil,$value);
+ } split('&',$response->{'Submission'});
+ my %correct;
+ if (exists($response->{'Correct'})) {
+ %correct =
+ map {
+ my ($foil,$value)=split('=',&Apache::lonnet::unescape($_));
+ ($foil,$value);
+ } split('&',$response->{'Correct'});
+ }
+ #
+ foreach my $original_header (@$headers) {
+ if ($original_header =~ /^_/) {
+ # '_' denotes a foil column
+ my ($header) = ($original_header =~ m/^_(.*)$/);
+ my $option = '';
+ if ( my ($foil) = ($header =~ /(.*) Correct$/)) {
+ if (exists($correct{$foil})) {
+ $option = $correct{$foil};
+ }
+ } elsif (exists($submission{$header})) {
+ $option = $submission{$header};
+ }
+ push(@values,&excel_format_item($option,$header));
+ } else {
+ # A normal column
+ push(@values,
+ &excel_format_item($response->{$original_header},
+ $original_header));
+ }
+ }
+ } else {
+ @values = map { &excel_format_item($response->{$_},$_); } @$headers;
}
- return $col;
+ return @values;
}
-sub excel_format_response {
- my ($answer,$responsetype) = @_;
- if ($responsetype eq 'radiobutton') {
- $answer =~ s/=([^=])$//;
- } elsif ($responsetype =~ /^(option|match)$/) {
- $answer = join("\n",
- map {
- &Apache::lonnet::unescape($_) ;
- } sort split('&',$answer)
- );
- } elsif ($responsetype eq 'string') {
- $answer =~ s/\\(n|r)/\n/g;
- $answer =~ s/(\s*$|^\s*)//g;
- $answer =~ s/\\\'/\'/g;
- }
- if ($answer =~ m/^=/) {
- $answer = ' '.$answer;
+sub excel_format_item {
+ my ($item,$type) = @_;
+ if ($type eq 'Time') {
+ &Apache::lonstathelpers::calc_serial($item);
+ } else {
+ if ($item =~ m/^=/) {
+ $item = ' '.$item;
+ }
+ $item =~ s/\\r//g;
+ $item =~ s/\\n/\n/g;
+ $item =~ s/(\s*$|^\s*)//g;
+ $item =~ s/\\\'/\'/g;
}
- return $answer;
+ return $item;
}
#########################################################
--matthew1107379194--