--- loncom/interface/statistics/lonstudentassessment.pm 2004/03/31 19:34:10 1.99 +++ loncom/interface/statistics/lonstudentassessment.pm 2004/07/13 15:03:34 1.102 @@ -1,6 +1,6 @@ # The LearningOnline Network with CAPA # -# $Id: lonstudentassessment.pm,v 1.99 2004/03/31 19:34:10 matthew Exp $ +# $Id: lonstudentassessment.pm,v 1.102 2004/07/13 15:03:34 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; @@ -474,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 '. @@ -491,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', @@ -507,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', @@ -522,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.', @@ -601,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) = @_; @@ -627,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 @@ -636,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; } @@ -666,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();
@@ -761,9 +771,9 @@ sub html_outputstudent {
         $max   += $seq_stats->{'max'};
     }
     if (! defined($score)) {
-        $score = ' 'x3;
+        $score = ' ' x $total_sum_width;
     }
-    $Str .= ' '.' 'x(length($max)-length($score)).$score.'/'.$max;
+    $Str .= ' '.' 'x($total_sum_width-length($score)).$score.' / '.$max;
     $Str .= " \n";
     #
     $r->print($Str);
@@ -886,6 +896,7 @@ my %prog_state; # progress window state
 my $request_aborted;
 
 my $total_formula;
+my $maximum_formula;
 
 sub excel_initialize {
     my ($r) = @_;
@@ -898,6 +909,7 @@ sub excel_initialize {
     undef (%prog_state);
     undef ($request_aborted);
     undef ($total_formula);
+    undef ($maximum_formula);
     #
     my $total_columns = scalar(&get_student_fields_to_show());
     my $num_students = scalar(@Apache::lonstatistics::Students);
@@ -1046,6 +1058,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'});
@@ -1123,16 +1136,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
     ##############################################
@@ -1150,11 +1177,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'}}) {
@@ -1203,6 +1234,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;
     ##############################################
@@ -1304,6 +1340,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
@@ -1377,6 +1414,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++; 
@@ -1524,6 +1566,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";
@@ -1555,6 +1601,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'}){
@@ -1588,10 +1635,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;