Diff for /loncom/interface/statistics/lonstudentassessment.pm between versions 1.90 and 1.100

version 1.90, 2004/02/12 21:15:47 version 1.100, 2004/04/01 18:49:39
Line 153  sub BuildStudentAssessmentPage { Line 153  sub BuildStudentAssessmentPage {
     #      #
     $single_student_mode = 0;      $single_student_mode = 0;
     $single_student_mode = 1 if ($ENV{'form.SelectedStudent'});      $single_student_mode = 1 if ($ENV{'form.SelectedStudent'});
       &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                                               ['selectstudent']);
     if ($ENV{'form.selectstudent'}) {      if ($ENV{'form.selectstudent'}) {
         &Apache::lonstatistics::DisplayClasslist($r);          &Apache::lonstatistics::DisplayClasslist($r);
         return;          return;
Line 306  the chart page. Line 308  the chart page.
 #######################################################  #######################################################
 sub CreateInterface {  sub CreateInterface {
     my $Str = '';      my $Str = '';
       $Str .= &Apache::lonhtmlcommon::breadcrumbs(undef,'Chart');
 #    $Str .= &CreateLegend();  #    $Str .= &CreateLegend();
     $Str .= '<table cellspacing="5">'."\n";      $Str .= '<table cellspacing="5">'."\n";
     $Str .= '<tr>';      $Str .= '<tr>';
Line 401  my @OutputOptions = Line 404  my @OutputOptions =
    },     },
      { name  => 'CSV',       { name  => 'CSV',
        value => '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 '.             'import into a spreadsheet program.  Using this method as opposed '.
            'to Excel output allows you to organize your data before importing'.             'to Excel output allows you to organize your data before importing'.
            ' it into a spreadsheet program.',             ' it into a spreadsheet program.',
Line 631  sub html_initialize { Line 634  sub html_initialize {
         # Comptue column widths          # Comptue column widths
         $sequence->{'width_sum'} = 0;          $sequence->{'width_sum'} = 0;
         if ($chosen_output->{'sequence_sum'}) {          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              # Use 3 digits for the sum
             $sequence->{'width_sum'} = 3;              $sequence->{'width_sum'} += 3;
         }          }
         if ($chosen_output->{'sequence_max'}) {          if ($chosen_output->{'sequence_max'}) {
             if ($sequence->{'width_sum'}>0) {              if ($sequence->{'width_sum'}>0) {
Line 642  sub html_initialize { Line 649  sub html_initialize {
             # Use 3 digits for the total              # Use 3 digits for the total
             $sequence->{'width_sum'}+=3;              $sequence->{'width_sum'}+=3;
         }          }
    #
         if ($chosen_output->{'every_problem'}) {          if ($chosen_output->{'every_problem'}) {
             # one problem per digit              # one problem per digit
             $sequence->{'width_problem'} = $sequence->{'num_assess_parts'};              $sequence->{'width_problem'} = $sequence->{'num_assess_parts'};
Line 650  sub html_initialize { Line 658  sub html_initialize {
         }          }
         $sequence->{'width_total'} = $sequence->{'width_problem'} +           $sequence->{'width_total'} = $sequence->{'width_problem'} + 
                                      $sequence->{'width_sum'};                                       $sequence->{'width_sum'};
         if ($sequence->{'width_total'} < length($sequence->{'title'})) {          if ($sequence->{'width_total'} < length(&HTML::Entities::decode($sequence->{'title'}))) {
             $sequence->{'width_total'} = length($sequence->{'title'});              $sequence->{'width_total'} = length(&HTML::Entities::decode($sequence->{'title'}));
             $sequence->{'width_problem'} =   
                 $sequence->{'width_total'} - $sequence->{'width_sum'};  
         }          }
         #          #
         # Output the sequence titles          # Output the sequence titles
Line 715  sub html_outputstudent { Line 721  sub html_outputstudent {
                                               $seq,$show_links);                                                $seq,$show_links);
         }          }
         my $ratio='';          my $ratio='';
         if ($chosen_output->{'sequence_sum'}) {          if ($chosen_output->{'every_problem'}) {
             $ratio .= sprintf("%3d",$score);              $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_max'}) {
             if ($chosen_output->{'sequence_sum'}) {              if ($chosen_output->{'sequence_sum'}) {
                 $ratio .= '/';                  $ratio .= '/';
             }              }
             $ratio .= sprintf("%3d",$seq_max);              $ratio .= sprintf("%3.0f",$seq_max);
         }          }
         #          #
         if (! $chosen_output->{'every_problem'}) {          if (! $chosen_output->{'every_problem'}) {
             $performance = '';              $performance = '';
       $performance_length=0;
         }          }
         $performance .= ' 'x($seq->{'width_problem'}-$performance_length).          $performance .= ' 'x($seq->{'width_total'}-$performance_length-$seq->{'width_sum'}).
             $ratio;              $ratio;
         #          #
         $Str .= $performance.$padding;          $Str .= $performance.$padding;
Line 738  sub html_outputstudent { Line 750  sub html_outputstudent {
     }      }
     #      #
     # Total it up and store the statistics info.      # Total it up and store the statistics info.
     my ($score,$max) = (0,0);      my ($score,$max);
     while (my ($symb,$seq_stats) = each (%{$studentstats})) {      while (my ($symb,$seq_stats) = each (%{$studentstats})) {
         $Statistics->{$symb}->{'score'} += $seq_stats->{'score'};          $Statistics->{$symb}->{'score'} += $seq_stats->{'score'};
         if ($Statistics->{$symb}->{'max'} < $seq_stats->{'max'}) {          if ($Statistics->{$symb}->{'max'} < $seq_stats->{'max'}) {
             $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'};          $max   += $seq_stats->{'max'};
     }      }
       if (! defined($score)) {
           $score = ' 'x3;
       }
     $Str .= ' '.' 'x(length($max)-length($score)).$score.'/'.$max;      $Str .= ' '.' 'x(length($max)-length($score)).$score.'/'.$max;
     $Str .= " \n";      $Str .= " \n";
     #      #
Line 774  sub html_finish { Line 792  sub html_finish {
   
 sub StudentAverageTotal {  sub StudentAverageTotal {
     my $Str = "<h3>Summary Tables</h3>\n";      my $Str = "<h3>Summary Tables</h3>\n";
     my $num_students = scalar(@Apache::lonstatistics::Students);  #    my $max_students;
     my $total_ave = 0;  #    my $total_ave = 0;
     my $total_max = 0;  #    my $total_max = 0;
     $Str .= '<table border=2 cellspacing="1">'."\n";      $Str .= '<table border=2 cellspacing="1">'."\n";
     $Str .= "<tr><th>Title</th><th>Average</th><th>Maximum</th></tr>\n";      $Str .= "<tr><th>Title</th><th>Average</th><th>Maximum</th></tr>\n";
     foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) {      foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) {
         my $ave;          my $ave;
         if ($num_students > $nodata_count) {          my $num_students = $Statistics->{$seq->{'symb'}}->{'num_students'};
             $ave = int(100*($Statistics->{$seq->{'symb'}}->{'score'}/  #        if ($num_students > $max_students) {
                             ($num_students-$nodata_count)))/100;  #            $max_students = $num_students;
   #        }
           if ($num_students > 0) {
               $ave = int(100*
                          ($Statistics->{$seq->{'symb'}}->{'score'}/$num_students)
                          )/100;
         } else {          } else {
             $ave = 0;              $ave = 0;
         }          }
         $total_ave += $ave;  #        $total_ave += $ave;
         my $max = $Statistics->{$seq->{'symb'}}->{'max'};          my $max = $Statistics->{$seq->{'symb'}}->{'max'};
         $total_max += $max;  #        $total_max += $max;
         $ave = sprintf("%.2f",$ave);          $ave = sprintf("%.2f",$ave);
         $Str .= '<tr><td>'.$seq->{'title'}.'</td>'.          $Str .= '<tr><td>'.$seq->{'title'}.'</td>'.
             '<td align="right">'.$ave.'&nbsp;</td>'.              '<td align="right">'.$ave.'&nbsp;</td>'.
             '<td align="right">'.$max.'&nbsp;'.'</td></tr>'."\n";              '<td align="right">'.$max.'&nbsp;'.'</td></tr>'."\n";
     }      }
     $total_ave = sprintf('%.2f',$total_ave); # only two digit  #    $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>';  
     $Str .= "</table>\n";      $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;      return $Str;
 }  }
   
Line 970  END Line 993  END
     # File::Temp is used to determine the temporary directory.      # File::Temp is used to determine the temporary directory.
     $excel_workbook->set_tempdir($Apache::lonnet::tmpdir);      $excel_workbook->set_tempdir($Apache::lonnet::tmpdir);
     #      #
       my $format = &Apache::loncommon::define_excel_formats($excel_workbook);
       #
     # Add a worksheet      # Add a worksheet
     my $sheetname = $ENV{'course.'.$ENV{'request.course.id'}.'.description'};      my $sheetname = $ENV{'course.'.$ENV{'request.course.id'}.'.description'};
     $sheetname = &Apache::loncommon::clean_excel_name($sheetname);      $sheetname = &Apache::loncommon::clean_excel_name($sheetname);
     $excel_sheet = $excel_workbook->addworksheet($sheetname);      $excel_sheet = $excel_workbook->addworksheet($sheetname);
     #      #
     # Define some potentially useful formats  
     my $format;  
     $format->{'header'} = $excel_workbook->add_format(bold      => 1,   
                                                       bottom    => 1,  
                                                       align     => 'center');  
     $format->{'bold'} = $excel_workbook->add_format(bold=>1);  
     $format->{'h1'}   = $excel_workbook->add_format(bold=>1, size=>18);  
     $format->{'h2'}   = $excel_workbook->add_format(bold=>1, size=>16);  
     $format->{'h3'}   = $excel_workbook->add_format(bold=>1, size=>14);  
     $format->{'date'} = $excel_workbook->add_format(num_format=>  
                                                     'mmm d yyyy hh:mm AM/PM');  
     #  
     # Put the course description in the header      # Put the course description in the header
     $excel_sheet->write($header_row,$cols_output++,      $excel_sheet->write($header_row,$cols_output++,
                    $ENV{'course.'.$ENV{'request.course.id'}.'.description'},                     $ENV{'course.'.$ENV{'request.course.id'}.'.description'},
Line 1320  sub excel_outputstudent { Line 1333  sub excel_outputstudent {
                 }                  }
             } else {              } else {
                 foreach my $value (@$rawdata) {                  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);
                       }
                 }                  }
             }              }
         }          }
Line 1345  sub excel_outputstudent { Line 1363  sub excel_outputstudent {
                                              %replaceCells);                                               %replaceCells);
             }              }
         } elsif ($chosen_output->{'sequence_sum'}) {          } 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'}) {          if ($chosen_output->{'sequence_max'}) {
             $excel_sheet->write($rows_output,$cols_output++,$seq_max);              $excel_sheet->write($rows_output,$cols_output++,$seq_max);
Line 1595  sub csv_finish { Line 1617  sub csv_finish {
     #      #
     # Tell the user where to get their csv file      # Tell the user where to get their csv file
     $r->print('<br />'.      $r->print('<br />'.
               '<a href="'.$filename.'">Your csv file.</a>'."\n");                '<a href="'.$filename.'">'.&mt('Your csv file.').'</a>'."\n");
     $r->rflush();      $r->rflush();
     return;      return;
           
Line 1636  sub StudentTriesOnSequence { Line 1658  sub StudentTriesOnSequence {
     my $performance_length = 0;      my $performance_length = 0;
     my @TriesData = ();      my @TriesData = ();
     my $tries;      my $tries;
       my $hasdata = 0; # flag - true if the student has any data on the sequence
     foreach my $resource (@{$seq->{'contents'}}) {      foreach my $resource (@{$seq->{'contents'}}) {
         next if ($resource->{'type'} ne 'assessment');          next if ($resource->{'type'} ne 'assessment');
         my $resource_data = $studentdata->{$resource->{'symb'}};          my $resource_data = $studentdata->{$resource->{'symb'}};
Line 1660  sub StudentTriesOnSequence { Line 1683  sub StudentTriesOnSequence {
             my $tries = 0;              my $tries = 0;
             if(exists($resource_data->{'resource.'.$partnum.'.tries'})) {              if(exists($resource_data->{'resource.'.$partnum.'.tries'})) {
                 $tries = $resource_data->{'resource.'.$partnum.'.tries'};                  $tries = $resource_data->{'resource.'.$partnum.'.tries'};
                   $hasdata =1;
             }              }
             #              #
             if ($awarded > 0) {              if ($awarded > 0) {
Line 1722  sub StudentTriesOnSequence { Line 1746  sub StudentTriesOnSequence {
     if ($seq->{'randompick'}) {      if ($seq->{'randompick'}) {
         $max = $seq->{'randompick'};          $max = $seq->{'randompick'};
     }      }
       if (! $hasdata && $sum == 0) {
           $sum = ' ';
       }
     return ($Str,$performance_length,$sum,$max,\@TriesData);      return ($Str,$performance_length,$sum,$max,\@TriesData);
 }  }
   
Line 1759  sub StudentPerformanceOnSequence { Line 1786  sub StudentPerformanceOnSequence {
     my $symbol;      my $symbol;
     my @ScoreData = ();      my @ScoreData = ();
     my $partscore;      my $partscore;
       my $hasdata = 0; # flag, 0 if there were no submissions on the sequence
     foreach my $resource (@{$seq->{'contents'}}) {      foreach my $resource (@{$seq->{'contents'}}) {
         next if ($resource->{'type'} ne 'assessment');          next if ($resource->{'type'} ne 'assessment');
         my $resource_data = $studentdata->{$resource->{'symb'}};          my $resource_data = $studentdata->{$resource->{'symb'}};
Line 1777  sub StudentPerformanceOnSequence { Line 1805  sub StudentPerformanceOnSequence {
             $performance_length++; # one character per part              $performance_length++; # one character per part
             $symbol = ' '; # default to space              $symbol = ' '; # default to space
             #              #
             my $awarded = 0;              my $awarded;
             if (exists($resource_data->{'resource.'.$part.'.awarded'})) {              if (exists($resource_data->{'resource.'.$part.'.awarded'})) {
                 $awarded = $resource_data->{'resource.'.$part.'.awarded'};                  $awarded = $resource_data->{'resource.'.$part.'.awarded'};
                 $awarded = 0 if (! $awarded);                  $awarded = 0 if (! $awarded);
                   $hasdata = 1;
             }              }
             #              #
             $partscore = $weight*$awarded;              $partscore = $weight*$awarded;
               if (! defined($awarded)) {
                   $partscore = undef;
               }
             $score += $partscore;              $score += $partscore;
             $symbol = $partscore;               $symbol = $partscore; 
             if (abs($symbol - sprintf("%.0f",$symbol)) < 0.001) {              if (abs($symbol - sprintf("%.0f",$symbol)) < 0.001) {
Line 1798  sub StudentPerformanceOnSequence { Line 1830  sub StudentPerformanceOnSequence {
                     $symbol = 'x';                      $symbol = 'x';
                     $max -= $weight; # Do not count 'excused' problems.                      $max -= $weight; # Do not count 'excused' problems.
                 }                  }
                   $hasdata = 1;
             } else {              } else {
                 # Unsolved.  Did they try?                  # Unsolved.  Did they try?
                 if (exists($resource_data->{'resource.'.$part.'.tries'})){                  if (exists($resource_data->{'resource.'.$part.'.tries'})){
                     $symbol = '.';                      $symbol = '.';
                       $hasdata = 1;
                 } else {                  } else {
                     $symbol = ' ';                      $symbol = ' ';
                 }                  }
Line 1822  sub StudentPerformanceOnSequence { Line 1856  sub StudentPerformanceOnSequence {
             $Str .= $symbol;              $Str .= $symbol;
         }          }
     }      }
       if (! $hasdata && $score == 0) {
           $score = ' ';
       }
     return ($Str,$performance_length,$score,$max,\@ScoreData);      return ($Str,$performance_length,$score,$max,\@ScoreData);
 }  }
   

Removed from v.1.90  
changed lines
  Added in v.1.100


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>
500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.