version 1.75, 2003/11/20 20:21:17
|
version 1.78, 2003/12/09 17:00:07
|
Line 52 package Apache::lonstudentassessment;
|
Line 52 package Apache::lonstudentassessment;
|
use strict; |
use strict; |
use Apache::lonstatistics; |
use Apache::lonstatistics; |
use Apache::lonhtmlcommon; |
use Apache::lonhtmlcommon; |
|
use Apache::loncommon(); |
use Apache::loncoursedata; |
use Apache::loncoursedata; |
use Apache::lonnet; # for logging porpoises |
use Apache::lonnet; # for logging porpoises |
use Apache::lonlocal; |
use Apache::lonlocal; |
use Spreadsheet::WriteExcel; |
use Spreadsheet::WriteExcel; |
|
use Spreadsheet::WriteExcel::Utility(); |
|
|
####################################################### |
####################################################### |
####################################################### |
####################################################### |
Line 859 my $cols_output;
|
Line 861 my $cols_output;
|
my %prog_state; # progress window state |
my %prog_state; # progress window state |
my $request_aborted; |
my $request_aborted; |
|
|
|
my $total_formula; |
|
|
sub excel_initialize { |
sub excel_initialize { |
my ($r) = @_; |
my ($r) = @_; |
# |
# |
Line 869 sub excel_initialize {
|
Line 873 sub excel_initialize {
|
undef ($cols_output); |
undef ($cols_output); |
undef (%prog_state); |
undef (%prog_state); |
undef ($request_aborted); |
undef ($request_aborted); |
|
undef ($total_formula); |
# |
# |
my $total_columns = scalar(&get_student_fields_to_show()); |
my $total_columns = scalar(&get_student_fields_to_show()); |
foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) { |
foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) { |
Line 1000 END
|
Line 1005 END
|
} |
} |
# |
# |
# Add the remaining column headers |
# Add the remaining column headers |
|
my $total_formula_string = '=0'; |
foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) { |
foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) { |
$excel_sheet->write($rows_output+$row_offset, |
$excel_sheet->write($rows_output+$row_offset, |
$cols_output,$seq->{'title'}); |
$cols_output,$seq->{'title'}); |
if ($data eq 'tries' || $data eq 'scores') { |
if ($data eq 'tries' || $data eq 'scores') { |
|
# Determine starting cell |
|
$seq->{'Excel:startcell'}= |
|
&Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell |
|
($rows_output,$cols_output); |
|
$seq->{'Excel:startcol'}=$cols_output; |
|
# Put the names of the problems and parts into the sheet |
foreach my $res (@{$seq->{'contents'}}) { |
foreach my $res (@{$seq->{'contents'}}) { |
next if ($res->{'type'} ne 'assessment'); |
next if ($res->{'type'} ne 'assessment'); |
if (scalar(@{$res->{'parts'}}) > 1) { |
if (scalar(@{$res->{'parts'}}) > 1) { |
Line 1018 END
|
Line 1030 END
|
$res->{'title'}); |
$res->{'title'}); |
} |
} |
} |
} |
|
# Determine ending cell |
|
$seq->{'Excel:endcell'} = |
|
&Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell |
|
($rows_output,$cols_output-1); |
|
$seq->{'Excel:endcol'}=$cols_output-1; |
|
# Determine cell the score is held in |
|
$seq->{'Excel:scorecell'} = |
|
&Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell |
|
($rows_output,$cols_output); |
|
$seq->{'Excel:scorecol'}=$cols_output; |
$excel_sheet->write($rows_output,$cols_output++,'score'); |
$excel_sheet->write($rows_output,$cols_output++,'score'); |
|
# Create the formula for summing up this sequence |
|
$seq->{'Excel:sum'}= $excel_sheet->store_formula |
|
('=SUM('.$seq->{'Excel:startcell'}. |
|
':'.$seq->{'Excel:endcell'}.')'); |
|
# |
|
$total_formula_string.='+'. |
|
&Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell |
|
($rows_output,$cols_output-1); |
$excel_sheet->write($rows_output,$cols_output++,'maximum'); |
$excel_sheet->write($rows_output,$cols_output++,'maximum'); |
} elsif ($data eq 'sum and total' || $data eq 'parts correct total') { |
} elsif ($data eq 'sum and total') { |
$excel_sheet->write($rows_output+1,$cols_output,'score'); |
$excel_sheet->write($rows_output+1,$cols_output,'score'); |
|
$total_formula_string.='+'. |
|
&Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell |
|
($rows_output+1,$cols_output); |
|
$excel_sheet->write($rows_output+1,$cols_output+1,'maximum'); |
|
$cols_output += 2; |
|
} elsif ($data eq 'parts correct total') { |
|
$excel_sheet->write($rows_output+1,$cols_output,'parts correct'); |
|
$total_formula_string.='+'. |
|
&Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell |
|
($rows_output+1,$cols_output); |
$excel_sheet->write($rows_output+1,$cols_output+1,'maximum'); |
$excel_sheet->write($rows_output+1,$cols_output+1,'maximum'); |
$cols_output += 2; |
$cols_output += 2; |
} else { |
} else { |
$cols_output++; |
$cols_output++; |
} |
} |
} |
} |
|
$excel_sheet->write($rows_output,$cols_output,'Grand Total'); |
|
$total_formula = $excel_sheet->store_formula($total_formula_string); |
# |
# |
# Bookkeeping |
# Bookkeeping |
if ($data eq 'sum and total' || $data eq 'parts correct total') { |
if ($data eq 'sum and total' || $data eq 'parts correct total') { |
Line 1048 END
|
Line 1090 END
|
} |
} |
# |
# |
# Add the maximums for each sequence or assessment |
# Add the maximums for each sequence or assessment |
|
my %total_cell_translation; |
foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) { |
foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) { |
|
$total_cell_translation{$seq->{'Excel:scorecell'}} = |
|
&Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell |
|
($rows_output,$seq->{'Excel:scorecol'}); |
my $weight; |
my $weight; |
my $max = 0; |
my $max = 0; |
foreach my $resource (@{$seq->{'contents'}}) { |
foreach my $resource (@{$seq->{'contents'}}) { |
Line 1074 END
|
Line 1120 END
|
if (! ($data eq 'sum only' || $data eq 'parts correct')) { |
if (! ($data eq 'sum only' || $data eq 'parts correct')) { |
$excel_sheet->write($rows_output,$cols_output++,''); |
$excel_sheet->write($rows_output,$cols_output++,''); |
} |
} |
$excel_sheet->write($rows_output,$cols_output++,$max); |
my %replaceCells; |
} |
$replaceCells{$seq->{'Excel:startcell'}} = |
|
&Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell |
|
($rows_output,$seq->{'Excel:startcol'}); |
|
$replaceCells{$seq->{'Excel:endcell'}} = |
|
&Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell |
|
($rows_output,$seq->{'Excel:endcol'}); |
|
$excel_sheet->repeat_formula($rows_output,$cols_output++, |
|
$seq->{'Excel:sum'},undef, |
|
%replaceCells); |
|
} |
|
$excel_sheet->repeat_formula($rows_output,$cols_output++, |
|
$total_formula,undef, |
|
%total_cell_translation); |
$rows_output++; |
$rows_output++; |
# |
# |
# Let the user know what we are doing |
# Let the user know what we are doing |
Line 1119 sub excel_outputstudent {
|
Line 1177 sub excel_outputstudent {
|
} |
} |
# |
# |
# Write out sequence scores and totals data |
# Write out sequence scores and totals data |
|
my %total_cell_translation; |
foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) { |
foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) { |
|
# Keep track of cells to translate in total cell |
|
$total_cell_translation{$seq->{'Excel:scorecell'}} = |
|
&Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell |
|
($rows_output,$seq->{'Excel:scorecol'}); |
|
# |
my ($performance,$performance_length,$score,$seq_max,$rawdata); |
my ($performance,$performance_length,$score,$seq_max,$rawdata); |
if ($base eq 'tries') { |
if ($base eq 'tries') { |
($performance,$performance_length,$score,$seq_max,$rawdata) = |
($performance,$performance_length,$score,$seq_max,$rawdata) = |
Line 1134 sub excel_outputstudent {
|
Line 1198 sub excel_outputstudent {
|
foreach my $value (@$rawdata) { |
foreach my $value (@$rawdata) { |
$excel_sheet->write($rows_output,$cols_output++,$value); |
$excel_sheet->write($rows_output,$cols_output++,$value); |
} |
} |
$excel_sheet->write($rows_output,$cols_output++,$score); |
# Write a formula for the sum of this sequence |
|
my %replaceCells; |
|
$replaceCells{$seq->{'Excel:startcell'}} = |
|
&Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell |
|
($rows_output,$seq->{'Excel:startcol'}); |
|
$replaceCells{$seq->{'Excel:endcell'}} = |
|
&Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell |
|
($rows_output,$seq->{'Excel:endcol'}); |
|
# The undef is for the format |
|
$excel_sheet->repeat_formula($rows_output,$cols_output++, |
|
$seq->{'Excel:sum'},undef, |
|
%replaceCells); |
|
# |
$excel_sheet->write($rows_output,$cols_output++,$seq_max); |
$excel_sheet->write($rows_output,$cols_output++,$seq_max); |
} elsif ($data eq 'sum and total' || $data eq 'sum only' || |
} elsif ($data eq 'sum and total' || $data eq 'sum only' || |
$data eq 'parts correct' || $data eq 'parts correct total') { |
$data eq 'parts correct' || $data eq 'parts correct total') { |
Line 1145 sub excel_outputstudent {
|
Line 1221 sub excel_outputstudent {
|
} |
} |
} |
} |
# |
# |
|
$excel_sheet->repeat_formula($rows_output,$cols_output++, |
|
$total_formula,undef, |
|
%total_cell_translation); |
|
|
|
# |
# Bookkeeping |
# Bookkeeping |
$rows_output++; |
$rows_output++; |
$cols_output=0; |
$cols_output=0; |
Line 1410 sub StudentTriesOnSequence {
|
Line 1491 sub StudentTriesOnSequence {
|
$performance_length++; |
$performance_length++; |
my $symbol = ' '; # default to space |
my $symbol = ' '; # default to space |
# |
# |
|
my $awarded = 0; |
|
if (exists($resource_data->{'resource.'.$partnum.'.awarded'})) { |
|
$awarded = $resource_data->{'resource.'.$partnum.'.awarded'}; |
|
$awarded = 0 if (! $awarded); |
|
} |
|
# |
|
my $status = ''; |
if (exists($resource_data->{'resource.'.$partnum.'.solved'})) { |
if (exists($resource_data->{'resource.'.$partnum.'.solved'})) { |
my $status = $resource_data->{'resource.'.$partnum.'.solved'}; |
$status = $resource_data->{'resource.'.$partnum.'.solved'}; |
if ($status eq 'correct_by_override') { |
} |
$symbol = '+'; |
# |
$sum++; |
my $tries = 0; |
} elsif ($status eq 'incorrect_by_override') { |
if(exists($resource_data->{'resource.'.$partnum.'.tries'})) { |
$symbol = '-'; |
$tries = $resource_data->{'resource.'.$partnum.'.tries'}; |
} elsif ($status eq 'ungraded_attempted') { |
} |
$symbol = '#'; |
# |
} elsif ($status eq 'incorrect_attempted') { |
if ($awarded > 0) { |
$symbol = '.'; |
# The student has gotten the problem correct to some degree |
} elsif ($status eq 'excused') { |
if ($status eq 'excused') { |
$symbol = 'x'; |
$symbol = 'x'; |
$max--; |
$max--; |
} elsif (($status eq 'correct_by_scantron' || |
} elsif ($status eq 'correct_by_override') { |
$status eq 'correct_by_student') && |
$symbol = '+'; |
exists($resource_data->{'resource.'.$partnum.'.tries'})){ |
$sum++; |
$tries = $resource_data->{'resource.'.$partnum.'.tries'}; |
} elsif ($tries > 0) { |
if ($tries > 9) { |
if ($tries > 9) { |
$symbol = '*'; |
$symbol = '*'; |
} elsif ($tries > 0) { |
|
$symbol = $tries; |
|
} else { |
} else { |
$symbol = ' '; |
$symbol = $tries; |
} |
} |
$sum++; |
$sum++; |
} elsif (exists($resource_data->{'resource.'. |
|
$partnum.'.tries'})){ |
|
$symbol = '.'; |
|
} else { |
} else { |
$symbol = ' '; |
$symbol = '+'; |
|
$sum++; |
} |
} |
} else { |
} else { |
# Unsolved. Did they try? |
# The student has the problem incorrect or it is ungraded |
if (exists($resource_data->{'resource.'.$partnum.'.tries'})){ |
if ($status eq 'excused') { |
|
$symbol = 'x'; |
|
$max--; |
|
} elsif ($status eq 'incorrect_by_override') { |
|
$symbol = '-'; |
|
} elsif ($status eq 'ungraded_attempted') { |
|
$symbol = '#'; |
|
} elsif ($status eq 'incorrect_attempted' || |
|
$tries > 0) { |
$symbol = '.'; |
$symbol = '.'; |
} else { |
} else { |
$symbol = ' '; |
# Problem is wrong and has not been attempted. |
|
$symbol=' '; |
} |
} |
} |
} |
# |
# |