[LON-CAPA-cvs] cvs: loncom /interface/statistics lonstudentassessment.pm
matthew
lon-capa-cvs@mail.lon-capa.org
Wed, 11 Feb 2004 21:15:01 -0000
This is a MIME encoded message
--matthew1076534101
Content-Type: text/plain
matthew Wed Feb 11 16:15:01 2004 EDT
Modified files:
/loncom/interface/statistics lonstudentassessment.pm
Log:
Major cleanup to output data code to simplify logic. The changes are to
all output types (html, excel, and csv). Only minor improvements should
be visible to the users.
--matthew1076534101
Content-Type: text/plain
Content-Disposition: attachment; filename="matthew-20040211161501.txt"
Index: loncom/interface/statistics/lonstudentassessment.pm
diff -u loncom/interface/statistics/lonstudentassessment.pm:1.86 loncom/interface/statistics/lonstudentassessment.pm:1.87
--- loncom/interface/statistics/lonstudentassessment.pm:1.86 Wed Feb 11 12:42:34 2004
+++ loncom/interface/statistics/lonstudentassessment.pm Wed Feb 11 16:15:01 2004
@@ -1,6 +1,6 @@
# The LearningOnline Network with CAPA
#
-# $Id: lonstudentassessment.pm,v 1.86 2004/02/11 17:42:34 matthew Exp $
+# $Id: lonstudentassessment.pm,v 1.87 2004/02/11 21:15:01 matthew Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -88,12 +88,6 @@
=item $show 'all', 'totals', or 'scores' determines how much data is output
-=item $data determines what performance data is shown
-
-=item $datadescription A short description of the output data selected.
-
-=item $base 'tries' or 'scores' determines the base of the performance shown
-
=item $single_student_mode evaluates to true if we are showing only one
student.
@@ -103,9 +97,7 @@
#######################################################
my $show_links;
my $output_mode;
-my $data;
-my $base;
-my $datadescription;
+my $chosen_output;
my $single_student_mode;
#######################################################
@@ -145,9 +137,7 @@
undef($Statistics);
undef($show_links);
undef($output_mode);
- undef($data);
- undef($base);
- undef($datadescription);
+ undef($chosen_output);
undef($single_student_mode);
#
my %Saveable_Parameters = ('Status' => 'scalar',
@@ -477,6 +467,12 @@
{ name => 'Scores Summary',
base => 'scores',
value => 'sum and total',
+ scores => 1,
+ tries => 0,
+ every_problem => 0,
+ sequence_sum => 1,
+ sequence_max => 1,
+ grand_total => 1,
shortdesc => 'Total Score and Maximum Possible for each '.
'Sequence or Folder',
longdesc => 'The score of each student as well as the '.
@@ -485,51 +481,44 @@
{ name => 'Scores Per Problem',
base => 'scores',
value => 'scores',
+ scores => 1,
+ tries => 0,
+ correct => 0,
+ every_problem => 1,
+ sequence_sum => 1,
+ sequence_max => 1,
+ grand_total => 1,
shortdesc => 'Score on each Problem Part',
longdesc =>'The students score on each problem part, computed as'.
'the part weight * part awarded',
},
-# { name => 'Scores Sum',
-# base => 'scores',
-# value => 'sum only',
-# shortdesc => 'Sum of Scores on each Problem Part',
-# longdesc =>'The total of the scores of the student on each problem'.
-# ' part in the sequences or folders selected.',
-# },
-# { name => 'Scores Summary Table Only',
-# base => 'scores',
-# value => 'final table scores',
-# shortdesc => 'Summary of Scores',
-# longdesc => 'The average score on each sequence or folder for the '.
-# 'selected students.',
-# },
{ name =>'Tries',
base =>'tries',
value => 'tries',
+ scores => 0,
+ tries => 1,
+ correct => 0,
+ every_problem => 1,
+ sequence_sum => 0,
+ sequence_max => 0,
+ grand_total => 0,
shortdesc => 'Number of Tries before success on each Problem Part',
longdesc =>'The number of tries before success on each problem part.',
},
{ name =>'Parts Correct',
base =>'tries',
value => 'parts correct total',
+ scores => 0,
+ tries => 0,
+ correct => 1,
+ every_problem => 1,
+ sequence_sum => 1,
+ sequence_max => 1,
+ grand_total => 1,
shortdesc => 'Number of Problem Parts completed successfully.',
longdesc => 'The Number of Problem Parts completed successfully and '.
'the maximum possible for each student',
},
-# { name =>'Parts Correct',
-# base =>'tries',
-# value => 'parts correct',
-# shortdesc => 'Number of Problem Parts completed successfully.',
-# longdesc => 'The Number of Problem Parts completed successfully'.
-# ' on each sequence or folder.',
-# },
-# { name => 'Parts Summary Table Only',
-# base => 'tries',
-# value => 'final table parts',
-# shortdesc => 'Summary of Parts Correct',
-# longdesc => 'A summary table of the average number of problem parts '.
-# 'students were able to get correct on each sequence.',
-# },
);
sub HTMLifyOutputDataDescriptions {
@@ -557,12 +546,10 @@
}
}
#
- $data = 'scores';
+ $chosen_output = $OutputDataOptions[0];
foreach my $option (@OutputDataOptions) {
if ($option->{'value'} eq $selected) {
- $data = $option->{'value'};
- $base = $option->{'base'};
- $datadescription = $option->{'shortdesc'};
+ $chosen_output = $option;
}
}
#
@@ -570,7 +557,7 @@
$Str = qq/<select size="5" name="$elementname">/;
foreach my $option (@OutputDataOptions) {
$Str .= "\n".' <option value="'.$option->{'value'}.'"';
- $Str .= " selected " if ($option->{'value'} eq $data);
+ $Str .= " selected " if ($option->{'value'} eq $chosen_output->{'value'});
$Str .= ">".&mt($option->{'name'})."<\/option>";
}
$Str .= "\n</select>";
@@ -617,16 +604,8 @@
$r->print("<h3>".$ENV{'course.'.$ENV{'request.course.id'}.'.description'}.
" ".localtime(time)."</h3>");
- if ($data !~ /^final table/) {
- $r->print("<h3>".$datadescription."</h3>");
- }
- #
- # Set up progress window for 'final table' display only
- if ($data =~ /^final table/) {
- my $studentcount = scalar(@Apache::lonstatistics::Students);
- %prog_state=&Apache::lonhtmlcommon::Create_PrgWin
- ($r,'Summary Table Status',
- 'Summary Table Compilation Progress', $studentcount);
+ if ($chosen_output->{'base'} !~ /^final table/) {
+ $r->print("<h3>".$chosen_output->{'shortdesc'}."</h3>");
}
my $Str = "<pre>\n";
# First, the @StudentData fields need to be listed
@@ -646,11 +625,6 @@
}
$Str .= "total</pre>\n";
$Str .= "<pre>";
- #
- # Check for suppression of output
- if ($data =~ /^final table/) {
- $Str = '';
- }
$r->print($Str);
$r->rflush();
return;
@@ -660,7 +634,7 @@
my ($r,$student) = @_;
my $Str = '';
#
- if($count++ % 5 == 0 && $count > 0 && $data !~ /^final table/) {
+ if($count++ % 5 == 0 && $count > 0) {
$r->print("</pre><pre>");
}
# First, the @StudentData fields need to be listed
@@ -681,7 +655,6 @@
}
if (scalar(@tmp) < 1) {
$nodata_count++;
- return if ($data =~ /^final table/);
$Str .= '<font color="blue">No Course Data</font>'."\n";
$r->print($Str);
$r->rflush();
@@ -693,7 +666,7 @@
my $PerformanceStr = '';
foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) {
my ($performance,$performance_length,$score,$seq_max,$rawdata);
- if ($base eq 'tries') {
+ if ($chosen_output->{'tries'}) {
($performance,$performance_length,$score,$seq_max,$rawdata) =
&StudentTriesOnSequence($student,\%StudentsData,
$seq,$show_links);
@@ -704,12 +677,9 @@
}
my $ratio = sprintf("%3d",$score).'/'.sprintf("%3d",$seq_max);
#
- if ($data eq 'sum and total' || $data eq 'parts correct total') {
+ if ($chosen_output->{'sequence_sum'}) {
$performance = $ratio;
$performance .= ' 'x($seq->{'width'}-length($ratio));
- } elsif ($data eq 'sum only' || $data eq 'parts correct') {
- $performance = $score;
- $performance .= ' 'x($seq->{'width'}-length($score));
} else {
# Pad with extra spaces
$performance .= ' 'x($seq->{'width'}-$performance_length-
@@ -736,13 +706,6 @@
$Str .= ' '.' 'x(length($max)-length($score)).$score.'/'.$max;
$Str .= " \n";
#
- # Check for suppressed output and update the progress window if so...
- if ($data =~ /^final table/) {
- $Str = '';
- &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,
- 'last student');
- }
- #
$r->print($Str);
#
$r->rflush();
@@ -753,11 +716,7 @@
my ($r) = @_;
#
# Check for suppressed output and close the progress window if so
- if ($data =~ /^final table/) {
- &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
- } else {
- $r->print("</pre>\n");
- }
+ $r->print("</pre>\n");
if ($single_student_mode) {
$r->print(&SingleStudentTotal());
} else {
@@ -875,10 +834,10 @@
#
my $total_columns = scalar(&get_student_fields_to_show());
foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) {
- # Add 2 because we need a 'sum' and 'total' column for each
+ # Add 2 because we need a 'sequence_sum' and 'total' column for each
$total_columns += $seq->{'num_assess_parts'}+2;
}
- if ($data eq 'tries' && $total_columns > 255) {
+ if ($chosen_output->{'base'} eq 'tries' && $total_columns > 255) {
$r->print(<<END);
<h2>Unable to Complete Request</h2>
<p>
@@ -895,7 +854,7 @@
END
$request_aborted = 1;
}
- if ($data eq 'scores' && $total_columns > 255) {
+ if ($chosen_output->{'base'} eq 'scores' && $total_columns > 255) {
$r->print(<<END);
<h2>Unable to Complete Request</h2>
<p>
@@ -912,15 +871,6 @@
END
$request_aborted = 1;
}
- if ($data =~ /^final table/) {
- $r->print(<<END);
-<h2>Unable to Complete Request</h2>
-<p>
-The <b>Summary Table (Scores)</b> option is not available for non-HTML output.
-</p>
-END
- $request_aborted = 1;
- }
return if ($request_aborted);
#
$filename = '/prtspool/'.
@@ -1000,13 +950,10 @@
'Compiled on '.localtime(time),$format->{'h3'});
#
$cols_output = 0;
- $excel_sheet->write($rows_output++,$cols_output++,$datadescription,
+ $excel_sheet->write($rows_output++,$cols_output++,
+ $chosen_output->{'shortdesc'},
$format->{'h3'});
#
- if ($data eq 'tries' || $data eq 'scores') {
- $rows_output++;
- }
- #
# Figure out the rows we need
my $sequence_name_row = $rows_output+1;
my $resource_name_row = $sequence_name_row+1;
@@ -1030,9 +977,9 @@
&Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell
($maximum_data_row,$cols_output);
$seq->{'Excel:startcol'}=$cols_output;
- if ($data eq 'tries' || $data eq 'scores') {
+ my $count = 0;
+ if ($chosen_output->{'every_problem'}) {
# Put the names of the problems and parts into the sheet
- my $count = 0;
foreach my $res (@{$seq->{'contents'}}) {
if ($res->{'type'} ne 'assessment' ||
! exists($res->{'parts'}) ||
@@ -1054,120 +1001,131 @@
}
$count++;
}
- # Determine ending cell
- if ($count == 1) {
- $seq->{'Excel:endcell'} = $seq->{'Excel:startcell'};
- $seq->{'Excel:endcol'} = $seq->{'Excel:startcol'};
- } else {
- $seq->{'Excel:endcell'} =
- &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell
- ($maximum_data_row,$cols_output-1);
- $seq->{'Excel:endcol'} = $cols_output-1;
- }
- # Create the formula for summing up this sequence
- if (! exists($seq->{'Excel:endcell'}) ||
- ! defined($seq->{'Excel:endcell'})) {
- $seq->{'Excel:endcell'} = $seq->{'Excel:startcell'};
- }
- $seq->{'Excel:sum'}= $excel_sheet->store_formula
- ('=SUM('.$seq->{'Excel:startcell'}.
- ':'.$seq->{'Excel:endcell'}.')');
}
+ # Determine ending cell
+ if ($count <= 1) {
+ $seq->{'Excel:endcell'} = $seq->{'Excel:startcell'};
+ $seq->{'Excel:endcol'} = $seq->{'Excel:startcol'};
+ } else {
+ $seq->{'Excel:endcell'} =
+ &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell
+ ($maximum_data_row,$cols_output-1);
+ $seq->{'Excel:endcol'} = $cols_output-1;
+ }
+ # Create the formula for summing up this sequence
+ if (! exists($seq->{'Excel:endcell'}) ||
+ ! defined($seq->{'Excel:endcell'})) {
+ $seq->{'Excel:endcell'} = $seq->{'Excel:startcell'};
+ }
+ $seq->{'Excel:sum'}= $excel_sheet->store_formula
+ ('=SUM('.$seq->{'Excel:startcell'}.
+ ':'.$seq->{'Excel:endcell'}.')');
# Determine cell the score is held in
$seq->{'Excel:scorecell'} =
&Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell
($maximum_data_row,$cols_output);
$seq->{'Excel:scorecol'}=$cols_output;
- if ($data eq 'parts correct total') {
+ if ($chosen_output->{'base'} eq 'parts correct total') {
$excel_sheet->write($resource_name_row,$cols_output++,
'parts correct',
$format->{'bold'});
- } else {
- $excel_sheet->write($resource_name_row,$cols_output++,
- 'score',
- $format->{'bold'});
+ } elsif ($chosen_output->{'sequence_sum'}) {
+ if ($chosen_output->{'correct'}) {
+ # Only reporting the number correct, so do not call it score
+ $excel_sheet->write($resource_name_row,$cols_output++,
+ 'sum',
+ $format->{'bold'});
+ } else {
+ $excel_sheet->write($resource_name_row,$cols_output++,
+ 'score',
+ $format->{'bold'});
+ }
}
#
$total_formula_string.='+'.
&Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell
($maximum_data_row,$cols_output-1);
- $excel_sheet->write($resource_name_row,$cols_output++,
- 'maximum',
+ if ($chosen_output->{'sequence_max'}) {
+ $excel_sheet->write($resource_name_row,$cols_output++,
+ 'maximum',
+ $format->{'bold'});
+ }
+ }
+ if ($chosen_output->{'grand_total'}) {
+ $excel_sheet->write($resource_name_row,$cols_output++,'Total',
$format->{'bold'});
}
- $excel_sheet->write($resource_name_row,$cols_output++,'Grand Total',
- $format->{'bold'});
$total_formula = $excel_sheet->store_formula($total_formula_string);
#
- # Output a row for MAX
- $cols_output = 0;
- foreach my $field (&get_student_fields_to_show()) {
- if ($field eq 'username' || $field eq 'fullname' ||
- $field eq 'id') {
- $excel_sheet->write($maximum_data_row,$cols_output++,'Maximum',
- $format->{'bold'});
- } else {
- $excel_sheet->write($maximum_data_row,$cols_output++,'');
+ # Output a row for MAX, if appropriate
+ if ($chosen_output->{'scores'}) {
+ $cols_output = 0;
+ foreach my $field (&get_student_fields_to_show()) {
+ if ($field eq 'username' || $field eq 'fullname' ||
+ $field eq 'id') {
+ $excel_sheet->write($maximum_data_row,$cols_output++,'Maximum',
+ $format->{'bold'});
+ } else {
+ $excel_sheet->write($maximum_data_row,$cols_output++,'');
+ }
}
- }
- #
- # Add the maximums for each sequence or assessment
- my %total_cell_translation;
- my $grand_total = 0;
- foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) {
- $total_cell_translation{$seq->{'Excel:scorecell'}} =
- &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell
- ($maximum_data_row,$seq->{'Excel:scorecol'});
- my $weight;
- my $max = 0;
- foreach my $resource (@{$seq->{'contents'}}) {
- next if ($resource->{'type'} ne 'assessment');
- foreach my $part (@{$resource->{'parts'}}) {
- $weight = 1;
- if ($base eq 'scores') {
- $weight = &Apache::lonnet::EXT
- ('resource.'.$part.'.weight',$resource->{'symb'},
- undef,undef,undef);
- if (!defined($weight) || ($weight eq '')) {
- $weight=1;
+ #
+ # Add the maximums for each sequence or assessment
+ my %total_cell_translation;
+ foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) {
+ $cols_output=$seq->{'Excel:startcol'};
+ $total_cell_translation{$seq->{'Excel:scorecell'}} =
+ &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell
+ ($maximum_data_row,$seq->{'Excel:scorecol'});
+ my $weight;
+ my $max = 0;
+ foreach my $resource (@{$seq->{'contents'}}) {
+ next if ($resource->{'type'} ne 'assessment');
+ foreach my $part (@{$resource->{'parts'}}) {
+ $weight = 1;
+ if ($chosen_output->{'scores'}) {
+ $weight = &Apache::lonnet::EXT
+ ('resource.'.$part.'.weight',$resource->{'symb'},
+ undef,undef,undef);
+ if (!defined($weight) || ($weight eq '')) {
+ $weight=1;
+ }
}
+ if ($chosen_output->{'scores'} &&
+ $chosen_output->{'every_problem'}) {
+ $excel_sheet->write($maximum_data_row,$cols_output++,
+ $weight);
+ }
+ $max += $weight;
}
- if ($data eq 'scores') {
- $excel_sheet->write($maximum_data_row,$cols_output++,$weight);
- } elsif ($data eq 'tries') {
- $excel_sheet->write($maximum_data_row,$cols_output++,'');
- }
- $max += $weight;
+ }
+ #
+ if ($chosen_output->{'sequence_sum'} &&
+ $chosen_output->{'every_problem'}) {
+ my %replaceCells;
+ $replaceCells{$seq->{'Excel:startcell'}} =
+ &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell
+ ($maximum_data_row,$seq->{'Excel:startcol'});
+ $replaceCells{$seq->{'Excel:endcell'}} =
+ &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell
+ ($maximum_data_row,$seq->{'Excel:endcol'});
+ $excel_sheet->repeat_formula($maximum_data_row,$cols_output++,
+ $seq->{'Excel:sum'},undef,
+ %replaceCells);
+ } elsif ($chosen_output->{'sequence_sum'}) {
+ $excel_sheet->write($maximum_data_row,$cols_output++,$max);
}
- }
- if (! ($data eq 'sum only' || $data eq 'parts correct')) {
- $excel_sheet->write($maximum_data_row,$cols_output++,'');
+ if ($chosen_output->{'sequence_max'}) {
+ $excel_sheet->write($maximum_data_row,$cols_output++,$max);
+ }
+ #
}
- #
- if ($data eq 'tries' || $data eq 'scores') {
- my %replaceCells;
- $replaceCells{$seq->{'Excel:startcell'}} =
- &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell
- ($maximum_data_row,$seq->{'Excel:startcol'});
- $replaceCells{$seq->{'Excel:endcell'}} =
- &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell
- ($maximum_data_row,$seq->{'Excel:endcol'});
+ if ($chosen_output->{'grand_total'}) {
$excel_sheet->repeat_formula($maximum_data_row,$cols_output++,
- $seq->{'Excel:sum'},undef,
- %replaceCells);
- } else {
- $excel_sheet->write($maximum_data_row,$cols_output++,
- $max);
+ $total_formula,undef,
+ %total_cell_translation);
}
- $grand_total+=$max;
- }
- if ($data eq 'tries' || $data eq 'scores') {
- $excel_sheet->repeat_formula($maximum_data_row,$cols_output++,
- $total_formula,undef,
- %total_cell_translation);
- } else {
- $excel_sheet->write($maximum_data_row,$cols_output++,$grand_total);
- }
+ } # End of MAXIMUM row output if ($chosen_output->{'scores'}) {
$rows_output = $first_data_row;
#
# Let the user know what we are doing
@@ -1227,7 +1185,7 @@
($rows_output,$seq->{'Excel:scorecol'});
#
my ($performance,$performance_length,$score,$seq_max,$rawdata);
- if ($base eq 'tries') {
+ if ($chosen_output->{'tries'} || $chosen_output->{'correct'}){
($performance,$performance_length,$score,$seq_max,$rawdata) =
&StudentTriesOnSequence($student,\%StudentsData,
$seq,'no');
@@ -1235,11 +1193,23 @@
($performance,$performance_length,$score,$seq_max,$rawdata) =
&StudentPerformanceOnSequence($student,\%StudentsData,
$seq,'no');
- }
- if ($data eq 'tries' || $data eq 'scores') {
- foreach my $value (@$rawdata) {
- $excel_sheet->write($rows_output,$cols_output++,$value);
+ }
+ if ($chosen_output->{'every_problem'}) {
+ if ($chosen_output->{'correct'}) {
+ # only indiciate if each item is correct or not
+ foreach my $value (@$rawdata) {
+ # nonzero means correct
+ $value = 1 if ($value > 0);
+ $excel_sheet->write($rows_output,$cols_output++,$value);
+ }
+ } else {
+ foreach my $value (@$rawdata) {
+ $excel_sheet->write($rows_output,$cols_output++,$value);
+ }
}
+ }
+ if ($chosen_output->{'sequence_sum'} &&
+ $chosen_output->{'every_problem'}) {
# Write a formula for the sum of this sequence
my %replaceCells;
$replaceCells{$seq->{'Excel:startcell'}} =
@@ -1258,20 +1228,19 @@
$seq->{'Excel:sum'},undef,
%replaceCells);
}
- #
- $excel_sheet->write($rows_output,$cols_output++,$seq_max);
- } elsif ($data eq 'sum and total' || $data eq 'sum only' ||
- $data eq 'parts correct' || $data eq 'parts correct total') {
+ } elsif ($chosen_output->{'sequence_sum'}) {
$excel_sheet->write($rows_output,$cols_output++,$score);
}
- if ($data eq 'sum and total' || $data eq 'parts correct total') {
+ if ($chosen_output->{'sequence_max'}) {
$excel_sheet->write($rows_output,$cols_output++,$seq_max);
}
}
#
- $excel_sheet->repeat_formula($rows_output,$cols_output++,
- $total_formula,undef,
- %total_cell_translation);
+ if ($chosen_output->{'grand_total'}) {
+ $excel_sheet->repeat_formula($rows_output,$cols_output++,
+ $total_formula,undef,
+ %total_cell_translation);
+ }
#
# Bookkeeping
$rows_output++;
@@ -1339,7 +1308,7 @@
#
# Deal with unimplemented requests
$request_aborted = undef;
- if ($data =~ /final table/) {
+ if ($chosen_output->{'base'} =~ /final table/) {
$r->print(<<END);
<h2>Unable to Complete Request</h2>
<p>
@@ -1349,7 +1318,12 @@
$request_aborted = 1;
}
return if ($request_aborted);
-
+ #
+ # Initialize progress window
+ my $studentcount = scalar(@Apache::lonstatistics::Students);
+ %prog_state=&Apache::lonhtmlcommon::Create_PrgWin
+ ($r,'CSV File Compilation Status',
+ 'CSV File Compilation Progress', $studentcount);
#
# Open a file
$filename = '/prtspool/'.
@@ -1370,55 +1344,54 @@
"\n";
#
# Print out the headings
- my $Str = '';
- my $Str2 = undef;
+ my $sequence_row = '';
+ my $resource_row = undef;
foreach my $field (&get_student_fields_to_show()) {
- if ($data eq 'sum only') {
- $Str .= '"'.&Apache::loncommon::csv_translate($field).'",';
- } elsif ($data eq 'sum and total' || $data eq 'parts correct total') {
- $Str .= '"",'; # first row empty on the student fields
- $Str2 .= '"'.&Apache::loncommon::csv_translate($field).'",';
- } elsif ($data eq 'scores' || $data eq 'tries' ||
- $data eq 'parts correct') {
- $Str .= '"",';
- $Str2 .= '"'.&Apache::loncommon::csv_translate($field).'",';
- }
+ $sequence_row .='"",';
+ $resource_row .= '"'.&Apache::loncommon::csv_translate($field).'",';
}
foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) {
- if ($data eq 'sum only' || $data eq 'parts correct') {
- $Str .= '"'.&Apache::loncommon::csv_translate($seq->{'title'}).
- '",';
- } elsif ($data eq 'sum and total' || $data eq 'parts correct total') {
- $Str .= '"'.&Apache::loncommon::csv_translate($seq->{'title'}).
- '","",';
- $Str2 .= '"score","total possible",';
- } elsif ($data eq 'scores' || $data eq 'tries') {
- $Str .= '"'.&Apache::loncommon::csv_translate($seq->{'title'}).
- '",';
- $Str .= '"",'x($seq->{'num_assess_parts'}-1+2);
+ $sequence_row .= '"'.
+ &Apache::loncommon::csv_translate($seq->{'title'}).'",';
+ my $count = 0;
+ if ($chosen_output->{'every_problem'}) {
foreach my $res (@{$seq->{'contents'}}) {
- next if ($res->{'type'} ne 'assessment');
+ if ($res->{'type'} ne 'assessment' ||
+ ! exists($res->{'parts'}) ||
+ ref($res->{'parts'}) ne 'ARRAY' ||
+ scalar(@{$res->{'parts'}}) < 1) {
+ next;
+ }
foreach my $part (@{$res->{'parts'}}) {
- $Str2 .= '"'.&Apache::loncommon::csv_translate($res->{'title'}.', Part '.$part).'",';
+ $resource_row .= '"'.
+ &Apache::loncommon::csv_translate($res->{'title'}.
+ ', Part '.$part
+ ).'",';
+ $count++;
}
}
- $Str2 .= '"score","total possible",';
+ }
+ $sequence_row.='"",'x$count;
+ if ($chosen_output->{'sequence_sum'}) {
+ if($chosen_output->{'correct'}) {
+ $resource_row .= '"sum",';
+ } else {
+ $resource_row .= '"score",';
+ }
+ }
+ if ($chosen_output->{'sequence_max'}) {
+ $sequence_row.= '"",';
+ $resource_row .= '"maximum possible",';
}
}
- chop($Str);
- $Str .= "\n";
- print $outputfile $Str;
- if (defined($Str2)) {
- chop($Str2);
- $Str2 .= "\n";
- print $outputfile $Str2;
- }
- #
- # Initialize progress window
- my $studentcount = scalar(@Apache::lonstatistics::Students);
- %prog_state=&Apache::lonhtmlcommon::Create_PrgWin
- ($r,'CSV File Compilation Status',
- 'CSV File Compilation Progress', $studentcount);
+ if ($chosen_output->{'grand_total'}) {
+ $sequence_row.= '"",';
+ $resource_row.= '"Total",';
+ }
+ chomp($sequence_row);
+ chomp($resource_row);
+ print $outputfile $sequence_row."\n";
+ print $outputfile $resource_row."\n";
return;
}
@@ -1445,9 +1418,10 @@
}
#
# Output performance data
+ my $total = 0;
foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) {
my ($performance,$performance_length,$score,$seq_max,$rawdata);
- if ($base eq 'tries') {
+ if ($chosen_output->{'tries'}){
($performance,$performance_length,$score,$seq_max,$rawdata) =
&StudentTriesOnSequence($student,\%StudentsData,
$seq,'no');
@@ -1456,13 +1430,31 @@
&StudentPerformanceOnSequence($student,\%StudentsData,
$seq,'no');
}
- if ($data eq 'sum only' || $data eq 'parts correct') {
+ if ($chosen_output->{'every_problem'}) {
+ if ($chosen_output->{'correct'}) {
+ $score = 0;
+ # Deal with number of parts correct data
+ $Str .= '"'.join('","',( map { if ($_>0) {
+ $score += 1;
+ 1;
+ } else {
+ 0;
+ }
+ } @$rawdata)).'",';
+ } else {
+ $Str .= '"'.join('","',(@$rawdata)).'",';
+ }
+ }
+ if ($chosen_output->{'sequence_sum'}) {
$Str .= '"'.$score.'",';
- } elsif ($data eq 'sum and total' || $data eq 'parts correct total') {
- $Str .= '"'.$score.'","'.$seq_max.'",';
- } elsif ($data eq 'scores' || $data eq 'tries') {
- $Str .= '"'.join('","',(@$rawdata,$score,$seq_max)).'",';
+ }
+ if ($chosen_output->{'sequence_max'}) {
+ $Str .= '"'.$seq_max.'",';
}
+ $total+=$score;
+ }
+ if ($chosen_output->{'grand_total'}) {
+ $Str .= '"'.$total.'",';
}
chop($Str);
$Str .= "\n";
--matthew1076534101--