[LON-CAPA-cvs] cvs: loncom /interface/statistics lonstudentsubmissions.pm
matthew
lon-capa-cvs@mail.lon-capa.org
Wed, 02 Feb 2005 23:05:27 -0000
This is a MIME encoded message
--matthew1107385527
Content-Type: text/plain
matthew Wed Feb 2 18:05:27 2005 EDT
Modified files:
/loncom/interface/statistics lonstudentsubmissions.pm
Log:
CSV foil per column output complete.
--matthew1107385527
Content-Type: text/plain
Content-Disposition: attachment; filename="matthew-20050202180527.txt"
Index: loncom/interface/statistics/lonstudentsubmissions.pm
diff -u loncom/interface/statistics/lonstudentsubmissions.pm:1.31 loncom/interface/statistics/lonstudentsubmissions.pm:1.32
--- loncom/interface/statistics/lonstudentsubmissions.pm:1.31 Wed Feb 2 16:19:53 2005
+++ loncom/interface/statistics/lonstudentsubmissions.pm Wed Feb 2 18:05:26 2005
@@ -1,6 +1,6 @@
# The LearningOnline Network with CAPA
#
-# $Id: lonstudentsubmissions.pm,v 1.31 2005/02/02 21:19:53 matthew Exp $
+# $Id: lonstudentsubmissions.pm,v 1.32 2005/02/02 23:05:26 matthew Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -789,7 +789,7 @@
}
#
my $submission = &HTML::Entities::decode($response->{'Submission'});
- return '' if (! defined($submission) || $submission eq '');
+ return () if (! defined($submission) || $submission eq '');
$submission =~ s/\\\"/\"/g;
$submission =~ s/\\\'/\'/g;
if ($resptype eq 'radiobutton') {
@@ -891,17 +891,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');
@@ -910,33 +900,40 @@
push(@{$headers{'student'}},@student_columns);
# Pad for the student data
foreach my $row ('problem','part','response') {
- foreach (@student_columns) {
- push(@{$headers{$row}},'');
- }
+ $headers{$row}=[map {''} @student_columns];
}
#
# we put the headers into the %headers hash
- my $prob_start_idx = 0;
+ my %problem_analysis;
+ my %start_col;
+ my $max_column = scalar(@student_columns);
foreach my $prob (@$problems) {
- $headers{'problem'}->[$prob_start_idx] = $prob->compTitle;
- my $part_start_idx = $prob_start_idx;
+ my %analysis = &Apache::lonstathelpers::get_problem_data($prob->src);
+ $problem_analysis{$prob->src}=\%analysis;
+ $headers{'problem'}->[$max_column] = $prob->compTitle;
foreach my $partid (@{$prob->parts}) {
- $headers{'part'}->[$part_start_idx] = $prob->part_display($partid);
+ $headers{'part'}->[$max_column] = $prob->part_display($partid);
my $responses = [$prob->responseIds($partid)];
+ my $resptypes = [$prob->responseType($partid)];
for (my $i=0;$i<scalar(@$responses);$i++) {
- my $resp_idx = $prob_start_idx + $response_multiplier * $i;
- $headers{'response'}->[$resp_idx]=
+ my @headers = &get_headers($prob,$partid,$responses->[$i],
+ $resptypes->[$i],
+ $problem_analysis{$prob->src},
+ 'csv','display',
+ @extra_resp_headers);
+ $start_col{$prob->symb}->{$partid}->{$responses->[$i]}=
+ $max_column;
+ $headers{'response'}->[$max_column]=
&mt('Response [_1]',$responses->[$i]);
- for (my $j=0;$j<=$#extra_resp_headers;$j++) {
- $headers{'student'}->[$resp_idx+$j]=$extra_resp_headers[$j];
+ for (my $j=0;$j<=$#headers;$j++) {
+ $headers{'student'}->[$max_column+$j]=$headers[$j];
}
+ $max_column += scalar(@headers);
}
- $part_start_idx += scalar(@$responses)*$response_multiplier;
}
- $prob_start_idx += $prob->countResponses * $response_multiplier;
}
foreach my $row ('problem','part','response','student') {
- print $outputfile '"'.join('","',map { ''; } @student_columns).'","'.
+ print $outputfile '"'.
join('","',
map {
&Apache::loncommon::csv_translate($_);
@@ -944,18 +941,22 @@
}
#
# Main loop
+ my $mycount = 10;
foreach my $student (@$students) {
+ last if ($mycount-- <0);
last if ($c->aborted());
my @rows;
- my $prob_start_idx = 0;
foreach my $prob (@$problems) {
- my $part_start_idx = 0;
foreach my $partid (@{$prob->parts}) {
my @responses = $prob->responseIds($partid);
my @response_type = $prob->responseType($partid);
for (my $i=0;$i<=$#responses;$i++) {
- my $resp_start_idx = $response_multiplier * $i;
my $respid = $responses[$i];
+ my $resptype = $response_type[$i];
+ my @headers = &get_headers($prob,$partid,$respid,$resptype,
+ $problem_analysis{$prob->src},
+ 'csv','normal',
+ @extra_resp_headers);
my $results =
&Apache::loncoursedata::get_response_data_by_student
($student,$prob->symb(),$respid);
@@ -967,26 +968,26 @@
next if ($j != 0);
}
my $idx = scalar(@$results) - $j - 1;
- my $response = $results->[$idx];
- my @data = &compile_response_data($response,$student,
+ my $response = &hashify_response($results->[$idx],
+ $prob,$student,
+ $partid,$respid);
+ my @data = &compile_response_data(\@headers,$response,
$prob,$partid,
- $respid);
+ $respid,$resptype);
+ my $resp_start_idx =
+ $start_col{$prob->symb}->{$partid}->{$respid};
for (my $k=0;$k<=$#data;$k++) {
- $rows[$j]->[$prob_start_idx + $part_start_idx +
- $resp_start_idx + $k] = $data[$k];
+ $rows[$j]->[$resp_start_idx + $k] = $data[$k];
}
}
}
- $part_start_idx += scalar(@responses)*$response_multiplier;
}
- $prob_start_idx += $prob->countResponses * $response_multiplier;
}
foreach my $row (@rows) {
print $outputfile '"'.join('","',
map { $student->{$_}; }
@student_columns).'"';
-
- for (my $i=0;$i<$prob_start_idx;$i++) {
+ for (my $i=scalar(@student_columns);$i<$max_column;$i++) {
my $value = &Apache::loncommon::csv_translate($row->[$i]);
$value ||='';
print $outputfile ',"'.$value.'"';
@@ -1010,23 +1011,65 @@
}
sub compile_response_data {
- my ($response,$student,$prob,$partid,$respid) = @_;
- my @rowdata;
- push(@rowdata,&Apache::lonnet::unescape($response->[&Apache::loncoursedata::RDs_submission()]));
- if ($ENV{'form.correctans'} eq 'true') {
- my $correct = &Apache::lonstathelpers::get_student_answer
- ($prob,$student->{'username'},$student->{'domain'},
- $partid,$respid);
- push(@rowdata,$correct);
+ my ($headers,$response,$prob,$partid,$respid,$resptype) = @_;
+ if (! ref($headers) || ref($headers) ne 'ARRAY' || ! scalar(@$headers)) {
+ return ();
}
- if ($ENV{'form.prob_status'}) {
- push(@rowdata,$response->[&Apache::loncoursedata::RDs_awarddetail()]);
- push(@rowdata,&Apache::lonlocal::locallocaltime
- ($response->[&Apache::loncoursedata::RDs_timestamp()]));
- push(@rowdata,$response->[&Apache::loncoursedata::RDs_tries()]);
- push(@rowdata,$response->[&Apache::loncoursedata::RDs_awarded()]);
+ #
+ my $submission =
+ &HTML::Entities::decode
+ (&Apache::lonnet::unescape($response->{'Submission'}));
+ return () if (! defined($submission) || $submission eq '');
+ $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,&csv_format_item($option,$header));
+ } else {
+ # A normal column
+ push(@values,
+ &csv_format_item($response->{$original_header},
+ $original_header));
+ }
+ }
+ } else {
+ @values = map { &csv_format_item($response->{$_},$_); } @$headers;
}
- return @rowdata;
+ return @values;
+}
+
+sub csv_format_item {
+ my ($item,$type) = @_;
+ if ($type eq 'Time') {
+ $item = localtime($item);
+ }
+ $item =&Apache::loncommon::csv_translate($item);
+ return $item;
}
#########################################################
--matthew1107385527--