--- loncom/interface/statistics/lonstudentassessment.pm 2004/02/26 18:28:33 1.94 +++ loncom/interface/statistics/lonstudentassessment.pm 2005/01/14 21:15:09 1.109 @@ -1,6 +1,6 @@ # The LearningOnline Network with CAPA # -# $Id: lonstudentassessment.pm,v 1.94 2004/02/26 18:28:33 matthew Exp $ +# $Id: lonstudentassessment.pm,v 1.109 2005/01/14 21:15:09 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -153,6 +153,8 @@ sub BuildStudentAssessmentPage { # $single_student_mode = 0; $single_student_mode = 1 if ($ENV{'form.SelectedStudent'}); + &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, + ['selectstudent']); if ($ENV{'form.selectstudent'}) { &Apache::lonstatistics::DisplayClasslist($r); return; @@ -306,7 +308,7 @@ the chart page. ####################################################### sub CreateInterface { my $Str = ''; - $Str .= &Apache::lonhtmlcommon::breadcrumbs(undef,&mt('Chart')); + $Str .= &Apache::lonhtmlcommon::breadcrumbs(undef,'Chart'); # $Str .= &CreateLegend(); $Str .= '
Title | Average | Maximum |
---|---|---|
'.&mt('Title').' | '. + ''.&mt('Average').' | '. + ''.&mt('Maximum').' | '. + '
'.$seq->{'title'}.' | '. ''.$ave.' | '. ''.$max.' '.' |
Number of Students | Average | '. - "Maximum |
---|---|---|
'.($num_students-$nodata_count).' | '. - ''.$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); # @@ -938,6 +955,7 @@ END # Determine rows my $header_row = $rows_output++; my $description_row = $rows_output++; + my $notes_row = $rows_output++; $rows_output++; # blank row my $summary_header_row; if ($chosen_output->{'summary_table'}) { @@ -1012,7 +1030,13 @@ END $cols_output = 0; $excel_sheet->write($description_row,$cols_output++, $chosen_output->{'shortdesc'}, - $format->{'h3'}); + $format->{'b'}); + # + $cols_output = 0; + $excel_sheet->write($notes_row,$cols_output++, + $chosen_output->{'non_html_notes'}, + $format->{'i'}); + ############################################## # Output headings for the raw data ############################################## @@ -1026,6 +1050,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'}); @@ -1050,13 +1075,14 @@ END $cols_output++, $res->{'title'}.' part '.$part, $format->{'bold'}); + $count++; } } else { $excel_sheet->write($resource_name_row, $cols_output++, $res->{'title'},$format->{'bold'}); + $count++; } - $count++; } } # Determine ending cell @@ -1103,16 +1129,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 ############################################## @@ -1130,11 +1170,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'}}) { @@ -1183,6 +1227,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, + %maximum_cell_translation); + } } # End of MAXIMUM row output if ($chosen_output->{'maximum_row'}) { $rows_output = $first_data_row; ############################################## @@ -1253,7 +1302,8 @@ END # Initialize progress window %prog_state=&Apache::lonhtmlcommon::Create_PrgWin ($r,'Excel File Compilation Status', - 'Excel File Compilation Progress', $studentcount); + 'Excel File Compilation Progress', $studentcount, + 'inline',undef,'Statistics','stats_status'); # &Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state, 'Processing first student'); @@ -1269,7 +1319,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 @@ -1284,12 +1339,17 @@ 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 $total_cell_translation{$seq->{'Excel:scorecell'}} = &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell ($rows_output,$seq->{'Excel:scorecol'}); + # and maximum cell + $maximum_cell_translation{$seq->{'Excel:maxcell'}} = + &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell + ($rows_output,$seq->{'Excel:maxcol'}); # my ($performance,$performance_length,$score,$seq_max,$rawdata); if ($chosen_output->{'tries'} || $chosen_output->{'correct'}){ @@ -1311,7 +1371,12 @@ sub excel_outputstudent { } } else { foreach my $value (@$rawdata) { - $excel_sheet->write($rows_output,$cols_output++,$value); + if ($score eq ' ' || !defined($value)) { + $cols_output++; + } else { + $excel_sheet->write($rows_output,$cols_output++, + $value); + } } } } @@ -1336,7 +1401,11 @@ sub excel_outputstudent { %replaceCells); } } elsif ($chosen_output->{'sequence_sum'}) { - $excel_sheet->write($rows_output,$cols_output++,$score); + if ($score eq ' ') { + $cols_output++; + } else { + $excel_sheet->write($rows_output,$cols_output++,$score); + } } if ($chosen_output->{'sequence_max'}) { $excel_sheet->write($rows_output,$cols_output++,$seq_max); @@ -1348,6 +1417,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, + %maximum_cell_translation); + } # # Bookkeeping $rows_output++; @@ -1430,7 +1504,8 @@ END my $studentcount = scalar(@Apache::lonstatistics::Students); %prog_state=&Apache::lonhtmlcommon::Create_PrgWin ($r,'CSV File Compilation Status', - 'CSV File Compilation Progress', $studentcount); + 'CSV File Compilation Progress', $studentcount, + 'inline',undef,'Statistics','stats_status'); # # Open a file $filename = '/prtspool/'. @@ -1449,6 +1524,12 @@ END print $outputfile '"'.&Apache::loncommon::csv_translate($description).'",'. '"'.&Apache::loncommon::csv_translate(scalar(localtime(time))).'"'. "\n"; + foreach my $item ('shortdesc','non_html_notes') { + next if (! exists($chosen_output->{$item})); + print $outputfile + '"'.&Apache::loncommon::csv_translate($chosen_output->{$item}).'"'. + "\n"; + } # # Print out the headings my $sequence_row = ''; @@ -1495,6 +1576,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"; @@ -1511,7 +1596,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 @@ -1526,6 +1616,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'}){ @@ -1559,10 +1650,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; @@ -1586,7 +1681,7 @@ sub csv_finish { # # Tell the user where to get their csv file $r->print('