--- loncom/interface/statistics/lonstudentassessment.pm	2004/02/20 16:24:20	1.92
+++ loncom/interface/statistics/lonstudentassessment.pm	2004/04/01 18:49:39	1.100
@@ -1,6 +1,6 @@
 # The LearningOnline Network with CAPA
 #
-# $Id: lonstudentassessment.pm,v 1.92 2004/02/20 16:24:20 matthew Exp $
+# $Id: lonstudentassessment.pm,v 1.100 2004/04/01 18:49:39 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;
@@ -402,7 +404,7 @@ my @OutputOptions =
    },
      { name  => 'CSV',
        value => 'csv',
-       description => 'Output a comma seperated values file suitable for '.
+       description => 'Output a comma separated values file suitable for '.
            'import into a spreadsheet program.  Using this method as opposed '.
            'to Excel output allows you to organize your data before importing'.
            ' it into a spreadsheet program.',
@@ -632,8 +634,12 @@ sub html_initialize {
         # Comptue column widths
         $sequence->{'width_sum'} = 0;
         if ($chosen_output->{'sequence_sum'}) {
+            if ($chosen_output->{'every_problem'}) {
+                # Use 1 digit for a space
+                $sequence->{'width_sum'} += 1;            
+            }
             # Use 3 digits for the sum
-            $sequence->{'width_sum'} = 3;
+            $sequence->{'width_sum'} += 3;
         }
         if ($chosen_output->{'sequence_max'}) {
             if ($sequence->{'width_sum'}>0) {
@@ -643,6 +649,7 @@ sub html_initialize {
             # Use 3 digits for the total
             $sequence->{'width_sum'}+=3;
         }
+	#
         if ($chosen_output->{'every_problem'}) {
             # one problem per digit
             $sequence->{'width_problem'} = $sequence->{'num_assess_parts'};
@@ -651,10 +658,8 @@ sub html_initialize {
         }
         $sequence->{'width_total'} = $sequence->{'width_problem'} + 
                                      $sequence->{'width_sum'};
-        if ($sequence->{'width_total'} < length($sequence->{'title'})) {
-            $sequence->{'width_total'} = length($sequence->{'title'});
-            $sequence->{'width_problem'} = 
-                $sequence->{'width_total'} - $sequence->{'width_sum'};
+        if ($sequence->{'width_total'} < length(&HTML::Entities::decode($sequence->{'title'}))) {
+            $sequence->{'width_total'} = length(&HTML::Entities::decode($sequence->{'title'}));
         }
         #
         # Output the sequence titles
@@ -716,20 +721,26 @@ sub html_outputstudent {
                                               $seq,$show_links);
         }
         my $ratio='';
-        if ($chosen_output->{'sequence_sum'}) {
-            $ratio .= sprintf("%3d",$score);
+        if ($chosen_output->{'every_problem'}) {
+            $ratio .= ' ';
+        }
+        if ($chosen_output->{'sequence_sum'} && $score ne ' ') {
+            $ratio .= sprintf("%3.0f",$score);
+        } elsif($chosen_output->{'sequence_sum'}) {
+            $ratio .= ' 'x3;
         }
         if ($chosen_output->{'sequence_max'}) {
             if ($chosen_output->{'sequence_sum'}) {
                 $ratio .= '/';
             }
-            $ratio .= sprintf("%3d",$seq_max);
+            $ratio .= sprintf("%3.0f",$seq_max);
         }
         #
         if (! $chosen_output->{'every_problem'}) {
             $performance = '';
+	    $performance_length=0;
         }
-        $performance .= ' 'x($seq->{'width_problem'}-$performance_length).
+        $performance .= ' 'x($seq->{'width_total'}-$performance_length-$seq->{'width_sum'}).
             $ratio;
         #
         $Str .= $performance.$padding;
@@ -739,15 +750,21 @@ sub html_outputstudent {
     }
     #
     # Total it up and store the statistics info.
-    my ($score,$max) = (0,0);
+    my ($score,$max);
     while (my ($symb,$seq_stats) = each (%{$studentstats})) {
         $Statistics->{$symb}->{'score'} += $seq_stats->{'score'};
         if ($Statistics->{$symb}->{'max'} < $seq_stats->{'max'}) {
             $Statistics->{$symb}->{'max'} = $seq_stats->{'max'};
         }
-        $score += $seq_stats->{'score'};
+        if ($seq_stats->{'score'} ne ' ') {
+            $score += $seq_stats->{'score'};
+            $Statistics->{$symb}->{'num_students'}++;
+        }
         $max   += $seq_stats->{'max'};
     }
+    if (! defined($score)) {
+        $score = ' 'x3;
+    }
     $Str .= ' '.' 'x(length($max)-length($score)).$score.'/'.$max;
     $Str .= " \n";
     #
@@ -775,37 +792,42 @@ sub html_finish {
 
 sub StudentAverageTotal {
     my $Str = "<h3>Summary Tables</h3>\n";
-    my $num_students = scalar(@Apache::lonstatistics::Students);
-    my $total_ave = 0;
-    my $total_max = 0;
+#    my $max_students;
+#    my $total_ave = 0;
+#    my $total_max = 0;
     $Str .= '<table border=2 cellspacing="1">'."\n";
     $Str .= "<tr><th>Title</th><th>Average</th><th>Maximum</th></tr>\n";
     foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) {
         my $ave;
-        if ($num_students > $nodata_count) {
-            $ave = int(100*($Statistics->{$seq->{'symb'}}->{'score'}/
-                            ($num_students-$nodata_count)))/100;
+        my $num_students = $Statistics->{$seq->{'symb'}}->{'num_students'};
+#        if ($num_students > $max_students) {
+#            $max_students = $num_students;
+#        }
+        if ($num_students > 0) {
+            $ave = int(100*
+                       ($Statistics->{$seq->{'symb'}}->{'score'}/$num_students)
+                       )/100;
         } else {
             $ave = 0;
         }
-        $total_ave += $ave;
+#        $total_ave += $ave;
         my $max = $Statistics->{$seq->{'symb'}}->{'max'};
-        $total_max += $max;
+#        $total_max += $max;
         $ave = sprintf("%.2f",$ave);
         $Str .= '<tr><td>'.$seq->{'title'}.'</td>'.
             '<td align="right">'.$ave.'&nbsp;</td>'.
             '<td align="right">'.$max.'&nbsp;'.'</td></tr>'."\n";
     }
-    $total_ave = sprintf('%.2f',$total_ave); # only two digit
-    $Str .= "</table>\n";
-    $Str .= '<table border=2 cellspacing="1">'."\n";
-    $Str .= '<tr><th>Number of Students</th><th>Average</th>'.
-        "<th>Maximum</th></tr>\n";
-    $Str .= '<tr>'.
-        '<td align="right">'.($num_students-$nodata_count).'</td>'.
-        '<td align="right">'.$total_ave.'&nbsp;'.'</td>'.
-        '<td align="right">'.$total_max.'&nbsp;'.'</td>';
+#    $total_ave = sprintf('%.2f',$total_ave); # only two digit
     $Str .= "</table>\n";
+#    $Str .= '<table border=2 cellspacing="1">'."\n";
+#    $Str .= '<tr><th>Number of Students</th><th>Average</th>'.
+#        "<th>Maximum</th></tr>\n";
+#    $Str .= '<tr>'.
+#        '<td align="right">'.$max_students.'</td>'.
+#        '<td align="right">'.$total_ave.'&nbsp;'.'</td>'.
+#        '<td align="right">'.$total_max.'&nbsp;'.'</td>';
+#    $Str .= "</table>\n";
     return $Str;
 }
 
@@ -1311,7 +1333,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 +1363,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);
@@ -1586,7 +1617,7 @@ sub csv_finish {
     #
     # Tell the user where to get their csv file
     $r->print('<br />'.
-              '<a href="'.$filename.'">Your csv file.</a>'."\n");
+              '<a href="'.$filename.'">'.&mt('Your csv file.').'</a>'."\n");
     $r->rflush();
     return;
     
@@ -1627,6 +1658,7 @@ sub StudentTriesOnSequence {
     my $performance_length = 0;
     my @TriesData = ();
     my $tries;
+    my $hasdata = 0; # flag - true if the student has any data on the sequence
     foreach my $resource (@{$seq->{'contents'}}) {
         next if ($resource->{'type'} ne 'assessment');
         my $resource_data = $studentdata->{$resource->{'symb'}};
@@ -1651,6 +1683,7 @@ sub StudentTriesOnSequence {
             my $tries = 0;
             if(exists($resource_data->{'resource.'.$partnum.'.tries'})) {
                 $tries = $resource_data->{'resource.'.$partnum.'.tries'};
+                $hasdata =1;
             }
             #
             if ($awarded > 0) {
@@ -1713,6 +1746,9 @@ sub StudentTriesOnSequence {
     if ($seq->{'randompick'}) {
         $max = $seq->{'randompick'};
     }
+    if (! $hasdata && $sum == 0) {
+        $sum = ' ';
+    }
     return ($Str,$performance_length,$sum,$max,\@TriesData);
 }
 
@@ -1750,6 +1786,7 @@ sub StudentPerformanceOnSequence {
     my $symbol;
     my @ScoreData = ();
     my $partscore;
+    my $hasdata = 0; # flag, 0 if there were no submissions on the sequence
     foreach my $resource (@{$seq->{'contents'}}) {
         next if ($resource->{'type'} ne 'assessment');
         my $resource_data = $studentdata->{$resource->{'symb'}};
@@ -1768,13 +1805,17 @@ sub StudentPerformanceOnSequence {
             $performance_length++; # one character per part
             $symbol = ' '; # default to space
             #
-            my $awarded = 0;
+            my $awarded;
             if (exists($resource_data->{'resource.'.$part.'.awarded'})) {
                 $awarded = $resource_data->{'resource.'.$part.'.awarded'};
                 $awarded = 0 if (! $awarded);
+                $hasdata = 1;
             }
             #
             $partscore = $weight*$awarded;
+            if (! defined($awarded)) {
+                $partscore = undef;
+            }
             $score += $partscore;
             $symbol = $partscore; 
             if (abs($symbol - sprintf("%.0f",$symbol)) < 0.001) {
@@ -1789,10 +1830,12 @@ sub StudentPerformanceOnSequence {
                     $symbol = 'x';
                     $max -= $weight; # Do not count 'excused' problems.
                 }
+                $hasdata = 1;
             } else {
                 # Unsolved.  Did they try?
                 if (exists($resource_data->{'resource.'.$part.'.tries'})){
                     $symbol = '.';
+                    $hasdata = 1;
                 } else {
                     $symbol = ' ';
                 }
@@ -1813,6 +1856,9 @@ sub StudentPerformanceOnSequence {
             $Str .= $symbol;
         }
     }
+    if (! $hasdata && $score == 0) {
+        $score = ' ';
+    }
     return ($Str,$performance_length,$score,$max,\@ScoreData);
 }