--- loncom/interface/statistics/lonstudentassessment.pm 2004/04/01 18:49:39 1.100 +++ loncom/interface/statistics/lonstudentassessment.pm 2004/09/23 17:48:00 1.105 @@ -1,6 +1,6 @@ # The LearningOnline Network with CAPA # -# $Id: lonstudentassessment.pm,v 1.100 2004/04/01 18:49:39 matthew Exp $ +# $Id: lonstudentassessment.pm,v 1.105 2004/09/23 17:48:00 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -476,6 +476,7 @@ my @OutputDataOptions = sequence_sum => 1, sequence_max => 1, grand_total => 1, + grand_maximum => 1, summary_table => 1, maximum_row => 1, shortdesc => 'Total Score and Maximum Possible for each '. @@ -493,6 +494,7 @@ my @OutputDataOptions = sequence_sum => 1, sequence_max => 1, grand_total => 1, + grand_maximum => 1, summary_table => 1, maximum_row => 1, shortdesc => 'Score on each Problem Part', @@ -509,6 +511,7 @@ my @OutputDataOptions = sequence_sum => 0, sequence_max => 0, grand_total => 0, + grand_maximum => 0, summary_table => 0, maximum_row => 0, shortdesc => 'Number of Tries before success on each Problem Part', @@ -524,6 +527,7 @@ my @OutputDataOptions = sequence_sum => 1, sequence_max => 1, grand_total => 1, + grand_maximum => 1, summary_table => 1, maximum_row => 0, shortdesc => 'Number of Problem Parts completed successfully.', @@ -603,6 +607,7 @@ Return a line of the chart for a student my $nodata_count; # The number of students for which there is no data my %prog_state; # progress state used by loncommon PrgWin routines + my $total_sum_width; sub html_initialize { my ($r) = @_; @@ -629,6 +634,7 @@ sub html_initialize { } # # Compute the column widths and output the sequence titles + my $total_count; foreach my $sequence (&Apache::lonstatistics::Sequences_with_Assess()){ # # Comptue column widths @@ -638,6 +644,7 @@ sub html_initialize { # Use 1 digit for a space $sequence->{'width_sum'} += 1; } + $total_count += $sequence->{'num_assess_parts'}; # Use 3 digits for the sum $sequence->{'width_sum'} += 3; } @@ -668,7 +675,8 @@ sub html_initialize { length($sequence->{'title'}) ).$padding; } - $Str .= "total\n"; + $total_sum_width = length($total_count)+1; + $Str .= " total\n"; $Str .= "
"; $r->print($Str); $r->rflush(); @@ -686,6 +694,10 @@ sub html_outputstudent { my @to_show = &get_student_fields_to_show(); foreach my $field (@to_show) { my $title=$student->{$field}; + # Deal with 'comments' - how I love special cases + if ($field eq 'comments') { + $title = ''.&mt('Comments').''; + } my $base = length($title); my $width=$Apache::lonstatistics::StudentData{$field}->{'width'}; $Str .= $title.' 'x($width-$base).$padding; @@ -763,9 +775,11 @@ sub html_outputstudent { $max += $seq_stats->{'max'}; } if (! defined($score)) { - $score = ' 'x3; + $score = ' ' x $total_sum_width; + } else { + $score = sprintf("%.0f",$score); } - $Str .= ' '.' 'x(length($max)-length($score)).$score.'/'.$max; + $Str .= ' '.' 'x($total_sum_width-length($score)).$score.' / '.$max; $Str .= " \n"; # $r->print($Str); @@ -791,18 +805,16 @@ sub html_finish { } sub StudentAverageTotal { - my $Str = "Summary Tables
\n"; -# my $max_students; -# my $total_ave = 0; -# my $total_max = 0; + my $Str = ''.&mt('Summary Tables').'
'.$/; $Str .= '
Title | Average | Maximum |
---|---|---|
'.&mt('Title').' | '. + ''.&mt('Average').' | '. + ''.&mt('Maximum').' | '. + '
'.$seq->{'title'}.' | '. ''.$ave.' | '. ''.$max.' '.' |
Number of Students | Average | '. -# "Maximum |
---|---|---|
'.$max_students.' | '. -# ''.$total_ave.' '.' | '. -# ''.$total_max.' '.' | '; -# $Str .= "
Sequence or Folder | Score | Maximum | |
---|---|---|---|
'.&mt('Sequence or Folder').' | '; + if ($chosen_output->{'base'} eq 'tries') { + $Str .= ''.&mt('Parts Correct').' | '; + } else { + $Str .= ''.&mt('Score').' | '; + } + $Str .= ''.&mt('Maximum').' | '."
Total | '. + $Str .= '|||
'.&mt('Total').' | '. ''.$total.' | '. ''.$total_max." |
'.&mt('LON-CAPA is unable to produce your Excel spreadsheet because your selections will result in more than 255 columns. Excel allows only 255 columns in a spreadsheet.').'
'.$/. + ''.&mt('You may consider reducing the number of Sequences or Folders you have selected.').'
'.$/. + ''.&mt('LON-CAPA can produce CSV files of this data or Excel files of the Scores Summary data.').'
'.$/; if ($chosen_output->{'base'} eq 'tries' && $total_columns > 255) { - $r->print(<-LON-CAPA is unable to produce your Excel spreadsheet because your selections -will result in more than 255 columns. Excel allows only 255 columns in a -spreadsheet. -
-You may consider reducing the number of Sequences or Folders you -have selected. -
-LON-CAPA can produce CSV files of this data or Excel files of the -summary data (Parts Correct or Parts Correct & Totals). -
-END - $request_aborted = 1; + $r->print($too_many_cols_error_message); + $request_aborted = 1; } if ($chosen_output->{'base'} eq 'scores' && $total_columns > 255) { - $r->print(<-LON-CAPA is unable to produce your Excel spreadsheet because your selections -will result in more than 255 columns. Excel allows only 255 columns in a -spreadsheet. -
-You may consider reducing the number of Sequences or Folders you -have selected. -
-LON-CAPA can produce CSV files of this data or Excel files of the -Scores Summary data. -
-END - $request_aborted = 1; + $r->print($too_many_cols_error_message); + $request_aborted = 1; } return if ($request_aborted); # @@ -1048,6 +1039,7 @@ END # # Add the remaining column headers my $total_formula_string = '=0'; + my $maximum_formula_string = '=0'; foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) { $excel_sheet->write($sequence_name_row,, $cols_output,$seq->{'title'},$format->{'bold'}); @@ -1125,16 +1117,30 @@ END &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell ($first_data_row,$cols_output-1); if ($chosen_output->{'sequence_max'}) { - $excel_sheet->write($resource_name_row,$cols_output++, + $excel_sheet->write($resource_name_row,$cols_output, 'maximum', $format->{'bold'}); + $seq->{'Excel:maxcell'} = + &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell + ($first_data_row,$cols_output); + $seq->{'Excel:maxcol'}=$cols_output; + $maximum_formula_string.='+'. + &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell + ($first_data_row,$cols_output); + $cols_output++; + } } if ($chosen_output->{'grand_total'}) { $excel_sheet->write($resource_name_row,$cols_output++,'Total', $format->{'bold'}); } + if ($chosen_output->{'grand_maximum'}) { + $excel_sheet->write($resource_name_row,$cols_output++,'Max. Total', + $format->{'bold'}); + } $total_formula = $excel_sheet->store_formula($total_formula_string); + $maximum_formula = $excel_sheet->store_formula($maximum_formula_string); ############################################## # Output a row for MAX, if appropriate ############################################## @@ -1152,11 +1158,15 @@ END # # Add the maximums for each sequence or assessment my %total_cell_translation; + my %maximum_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'}); + $maximum_cell_translation{$seq->{'Excel:maxcell'}} = + &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell + ($maximum_data_row,$seq->{'Excel:maxcol'}); my $weight; my $max = 0; foreach my $resource (@{$seq->{'contents'}}) { @@ -1205,6 +1215,11 @@ END $total_formula,undef, %total_cell_translation); } + if ($chosen_output->{'grand_maximum'}) { + $excel_sheet->repeat_formula($maximum_data_row,$cols_output++, + $maximum_formula,undef, + %total_cell_translation); + } } # End of MAXIMUM row output if ($chosen_output->{'maximum_row'}) { $rows_output = $first_data_row; ############################################## @@ -1291,7 +1306,12 @@ sub excel_outputstudent { # Write out student data my @to_show = &get_student_fields_to_show(); foreach my $field (@to_show) { - $excel_sheet->write($rows_output,$cols_output++,$student->{$field}); + my $value = $student->{$field}; + if ($field eq 'comments') { + $value = &Apache::lonmsg::retrieve_instructor_comments + ($student->{'username'},$student->{'domain'}); + } + $excel_sheet->write($rows_output,$cols_output++,$value); } # # Get student assessment data @@ -1306,6 +1326,7 @@ sub excel_outputstudent { # # Write out sequence scores and totals data my %total_cell_translation; + my %maximum_cell_translation; foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) { $cols_output = $seq->{'Excel:startcol'}; # Keep track of cells to translate in total cell @@ -1379,6 +1400,11 @@ sub excel_outputstudent { $total_formula,undef, %total_cell_translation); } + if ($chosen_output->{'grand_maximum'}) { + $excel_sheet->repeat_formula($rows_output,$cols_output++, + $maximum_formula,undef, + %total_cell_translation); + } # # Bookkeeping $rows_output++; @@ -1526,6 +1552,10 @@ END $sequence_row.= '"",'; $resource_row.= '"Total",'; } + if ($chosen_output->{'grand_maximum'}) { + $sequence_row.= '"",'; + $resource_row.= '"Maximum",'; + } chomp($sequence_row); chomp($resource_row); print $outputfile $sequence_row."\n"; @@ -1542,7 +1572,12 @@ sub csv_outputstudent { # Output student fields my @to_show = &get_student_fields_to_show(); foreach my $field (@to_show) { - $Str .= '"'.&Apache::loncommon::csv_translate($student->{$field}).'",'; + my $value = $student->{$field}; + if ($field eq 'comments') { + $value = &Apache::lonmsg::retrieve_instructor_comments + ($student->{'username'},$student->{'domain'}); + } + $Str .= '"'.&Apache::loncommon::csv_translate($value).'",'; } # # Get student assessment data @@ -1557,6 +1592,7 @@ sub csv_outputstudent { # # Output performance data my $total = 0; + my $maximum = 0; foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) { my ($performance,$performance_length,$score,$seq_max,$rawdata); if ($chosen_output->{'tries'}){ @@ -1590,10 +1626,14 @@ sub csv_outputstudent { $Str .= '"'.$seq_max.'",'; } $total+=$score; + $maximum += $seq_max; } if ($chosen_output->{'grand_total'}) { $Str .= '"'.$total.'",'; } + if ($chosen_output->{'grand_maximum'}) { + $Str .= '"'.$maximum.'",'; + } chop($Str); $Str .= "\n"; print $outputfile $Str; @@ -1723,7 +1763,7 @@ sub StudentTriesOnSequence { } } # - if (! defined($tries)) { + if (! defined($tries) || $symbol eq '.') { $tries = $symbol; } push (@TriesData,$tries);