Diff for /loncom/interface/statistics/lonstudentassessment.pm between versions 1.78 and 1.85

version 1.78, 2003/12/09 17:00:07 version 1.85, 2004/02/11 16:02:37
Line 785  sub StudentAverageTotal { Line 785  sub StudentAverageTotal {
         $total_ave += $ave;          $total_ave += $ave;
         my $max = $Statistics->{$seq->{'symb'}}->{'max'};          my $max = $Statistics->{$seq->{'symb'}}->{'max'};
         $total_max += $max;          $total_max += $max;
         if ($ave == 0) {          $ave = sprintf("%.2f",$ave);
             $ave = "0.00";  
         }  
         $ave .= ' ';  
         $max .= '   ';  
         $Str .= '<tr><td>'.$seq->{'title'}.'</td>'.          $Str .= '<tr><td>'.$seq->{'title'}.'</td>'.
             '<td align="right">'.$ave.'</td>'.              '<td align="right">'.$ave.'&nbsp;</td>'.
                 '<td align="right">'.$max.'</td></tr>'."\n";              '<td align="right">'.$max.'&nbsp;'.'</td></tr>'."\n";
     }      }
     $total_ave = int(100*$total_ave)/100; # only two digit      $total_ave = sprintf('%.2f',$total_ave); # only two digit
     $Str .= "</table>\n";      $Str .= "</table>\n";
     $Str .= '<table border=2 cellspacing="1">'."\n";      $Str .= '<table border=2 cellspacing="1">'."\n";
     $Str .= '<tr><th>Number of Students</th><th>Average</th>'.      $Str .= '<tr><th>Number of Students</th><th>Average</th>'.
         "<th>Maximum</th></tr>\n";          "<th>Maximum</th></tr>\n";
     $Str .= '<tr><td>'.($num_students-$nodata_count).'</td>'.      $Str .= '<tr>'.
         '<td>'.$total_ave.'</td><td>'.$total_max.'</td>';          '<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";
     return $Str;      return $Str;
 }  }
Line 909  You may consider reducing the number of Line 907  You may consider reducing the number of
 have selected.    have selected.  
 </p><p>  </p><p>
 LON-CAPA can produce <b>CSV</b> files of this data or Excel files of the  LON-CAPA can produce <b>CSV</b> files of this data or Excel files of the
 summary data (<b>Scores Sum</b> or <b>Scores Sum & Totals</b>).  <b>Scores Summary</b> data.
 </p>  </p>
 END  END
        $request_aborted = 1;         $request_aborted = 1;
Line 958  END Line 956  END
     $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($rows_output,$cols_output++,      $excel_sheet->write($rows_output,$cols_output++,
                    $ENV{'course.'.$ENV{'request.course.id'}.'.description'});                     $ENV{'course.'.$ENV{'request.course.id'}.'.description'},
                           $format->{'h1'});
     $cols_output += 3;      $cols_output += 3;
     #      #
     # Put a description of the sections listed      # Put a description of the sections listed
Line 980  END Line 991  END
             $sectionstring = "Section ".$Sections[0];              $sectionstring = "Section ".$Sections[0];
         }          }
     }      }
     $excel_sheet->write($rows_output,$cols_output++,$sectionstring);      $excel_sheet->write($rows_output,$cols_output++,$sectionstring,
                           $format->{'h3'});
     $cols_output += scalar(@Sections);      $cols_output += scalar(@Sections);
     #      #
     # Put the date in there too      # Put the date in there too
     $excel_sheet->write($rows_output++,$cols_output++,      $excel_sheet->write($rows_output++,$cols_output++,
                         'Compiled on '.localtime(time));                          'Compiled on '.localtime(time),$format->{'h3'});
     #      #
     $cols_output = 0;      $cols_output = 0;
     $excel_sheet->write($rows_output++,$cols_output++,$datadescription);      $excel_sheet->write($rows_output++,$cols_output++,$datadescription,
                           $format->{'h3'});
     #      #
     if ($data eq 'tries' || $data eq 'scores') {      if ($data eq 'tries' || $data eq 'scores') {
         $rows_output++;          $rows_output++;
Line 997  END Line 1010  END
     # Add the student headers      # Add the student headers
     $cols_output = 0;      $cols_output = 0;
     foreach my $field (&get_student_fields_to_show()) {      foreach my $field (&get_student_fields_to_show()) {
         $excel_sheet->write($rows_output,$cols_output++,$field);          $excel_sheet->write($rows_output,$cols_output++,$field,
                               $format->{'bold'});
     }      }
     my $row_offset = 0;      my $row_offset = 0;
     if ($data eq 'tries' || $data eq 'scores') {      if ($data eq 'tries' || $data eq 'scores') {
Line 1008  END Line 1022  END
     my $total_formula_string = '=0';      my $total_formula_string = '=0';
     foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) {      foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) {
         $excel_sheet->write($rows_output+$row_offset,          $excel_sheet->write($rows_output+$row_offset,
                             $cols_output,$seq->{'title'});                              $cols_output,$seq->{'title'},$format->{'h3'});
         if ($data eq 'tries' || $data eq 'scores') {          if ($data eq 'tries' || $data eq 'scores') {
             # Determine starting cell              # Determine starting cell
             $seq->{'Excel:startcell'}=              $seq->{'Excel:startcell'}=
Line 1016  END Line 1030  END
                 ($rows_output,$cols_output);                  ($rows_output,$cols_output);
             $seq->{'Excel:startcol'}=$cols_output;              $seq->{'Excel:startcol'}=$cols_output;
             # Put the names of the problems and parts into the sheet              # Put the names of the problems and parts into the sheet
               my $count = 0;
             foreach my $res (@{$seq->{'contents'}}) {              foreach my $res (@{$seq->{'contents'}}) {
                 next if ($res->{'type'} ne 'assessment');                  if ($res->{'type'} ne 'assessment'  || 
                       ! exists($res->{'parts'})       ||
                       ref($res->{'parts'}) ne 'ARRAY' ||
                       scalar(@{$res->{'parts'}}) < 1) {
                       next;
                   }
                 if (scalar(@{$res->{'parts'}}) > 1) {                  if (scalar(@{$res->{'parts'}}) > 1) {
                     foreach my $part (@{$res->{'parts'}}) {                      foreach my $part (@{$res->{'parts'}}) {
                         $excel_sheet->write($rows_output,                          $excel_sheet->write($rows_output,
                                             $cols_output++,                                              $cols_output++,
                                             $res->{'title'}.' part '.$part);                                              $res->{'title'}.' part '.$part,
                                               $format->{'bold'});
                     }                      }
                 } else {                  } else {
                     $excel_sheet->write($rows_output,                      $excel_sheet->write($rows_output,
                                         $cols_output++,                                          $cols_output++,
                                         $res->{'title'});                                          $res->{'title'},$format->{'bold'});
                 }                  }
                   $count++;
             }              }
             # Determine ending cell              # Determine ending cell
             $seq->{'Excel:endcell'} =               if ($count == 1) {
                 &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell                  $seq->{'Excel:endcell'} = $seq->{'Excel:startcell'};
                                              ($rows_output,$cols_output-1);                  $seq->{'Excel:endcol'}  = $seq->{'Excel:startcol'};
             $seq->{'Excel:endcol'}=$cols_output-1;              } else {
             # Determine cell the score is held in                  $seq->{'Excel:endcell'} = 
             $seq->{'Excel:scorecell'} =                       &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell
                 &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell                          ($rows_output,$cols_output-1);
                                              ($rows_output,$cols_output);                  $seq->{'Excel:endcol'} = $cols_output-1;
             $seq->{'Excel:scorecol'}=$cols_output;              }
             $excel_sheet->write($rows_output,$cols_output++,'score');  
             # Create the formula for summing up this sequence              # Create the formula for summing up this sequence
               if (! exists($seq->{'Excel:endcell'}) ||
                   ! defined($seq->{'Excel:endcell'})) {
                   $seq->{'Excel:endcell'} = $seq->{'Excel:startcell'};
               }
             $seq->{'Excel:sum'}= $excel_sheet->store_formula              $seq->{'Excel:sum'}= $excel_sheet->store_formula
                                         ('=SUM('.$seq->{'Excel:startcell'}.                                          ('=SUM('.$seq->{'Excel:startcell'}.
                                              ':'.$seq->{'Excel:endcell'}.')');                                               ':'.$seq->{'Excel:endcell'}.')');
             #          }
             $total_formula_string.='+'.          # Determine cell the score is held in
                 &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell          $seq->{'Excel:scorecell'} = 
                                         ($rows_output,$cols_output-1);              &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell
             $excel_sheet->write($rows_output,$cols_output++,'maximum');              ($rows_output,$cols_output);
         } elsif ($data eq 'sum and total') {          $seq->{'Excel:scorecol'}=$cols_output;
             $excel_sheet->write($rows_output+1,$cols_output,'score');          if ($data eq 'parts correct total') {
             $total_formula_string.='+'.              $excel_sheet->write($rows_output,$cols_output++,'parts correct',
                 &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell                                  $format->{'bold'});
                                         ($rows_output+1,$cols_output);  
             $excel_sheet->write($rows_output+1,$cols_output+1,'maximum');  
             $cols_output += 2;  
         } elsif ($data eq 'parts correct total') {  
             $excel_sheet->write($rows_output+1,$cols_output,'parts correct');  
             $total_formula_string.='+'.  
                 &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell  
                                         ($rows_output+1,$cols_output);  
             $excel_sheet->write($rows_output+1,$cols_output+1,'maximum');  
             $cols_output += 2;  
         } else {          } else {
             $cols_output++;              $excel_sheet->write($rows_output,$cols_output++,'score',
                                   $format->{'bold'});
         }          }
           #
           $total_formula_string.='+'.
               &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell
               ($rows_output,$cols_output-1);
           $excel_sheet->write($rows_output,$cols_output++,'maximum',
                               $format->{'bold'});
     }      }
     $excel_sheet->write($rows_output,$cols_output,'Grand Total');      $excel_sheet->write($rows_output,$cols_output++,'Grand Total',
                           $format->{'bold'});
     $total_formula = $excel_sheet->store_formula($total_formula_string);      $total_formula = $excel_sheet->store_formula($total_formula_string);
     #      #
     # Bookkeeping      # Bookkeeping
Line 1083  END Line 1106  END
     foreach my $field (&get_student_fields_to_show()) {      foreach my $field (&get_student_fields_to_show()) {
         if ($field eq 'username' || $field eq 'fullname' ||           if ($field eq 'username' || $field eq 'fullname' || 
             $field eq 'id') {              $field eq 'id') {
             $excel_sheet->write($rows_output,$cols_output++,'Maximum');              $excel_sheet->write($rows_output,$cols_output++,'Maximum',
                                   $format->{'bold'});
         } else {          } else {
             $excel_sheet->write($rows_output,$cols_output++,'');              $excel_sheet->write($rows_output,$cols_output++,'');
         }          }
Line 1091  END Line 1115  END
     #      #
     # Add the maximums for each sequence or assessment      # Add the maximums for each sequence or assessment
     my %total_cell_translation;      my %total_cell_translation;
       my $grand_total = 0;
     foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) {      foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) {
         $total_cell_translation{$seq->{'Excel:scorecell'}} =           $total_cell_translation{$seq->{'Excel:scorecell'}} = 
             &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell              &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell
Line 1120  END Line 1145  END
         if (! ($data eq 'sum only' || $data eq 'parts correct')) {          if (! ($data eq 'sum only' || $data eq 'parts correct')) {
             $excel_sheet->write($rows_output,$cols_output++,'');              $excel_sheet->write($rows_output,$cols_output++,'');
         }          }
         my %replaceCells;          #
         $replaceCells{$seq->{'Excel:startcell'}} =           if ($data eq 'tries' || $data eq 'scores') {
             &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell              my %replaceCells;
                                    ($rows_output,$seq->{'Excel:startcol'});              $replaceCells{$seq->{'Excel:startcell'}} = 
         $replaceCells{$seq->{'Excel:endcell'}} =                   &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell
             &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell                  ($rows_output,$seq->{'Excel:startcol'});
                                    ($rows_output,$seq->{'Excel:endcol'});              $replaceCells{$seq->{'Excel:endcell'}} = 
                   &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell
                   ($rows_output,$seq->{'Excel:endcol'});
               $excel_sheet->repeat_formula($rows_output,$cols_output++,
                                            $seq->{'Excel:sum'},undef,
                                            %replaceCells);
           } else {
               $excel_sheet->write($rows_output,$cols_output++,
                                   $max);
           }
           $grand_total+=$max;
       }
       if ($data eq 'tries' || $data eq 'scores') {
         $excel_sheet->repeat_formula($rows_output,$cols_output++,          $excel_sheet->repeat_formula($rows_output,$cols_output++,
                                      $seq->{'Excel:sum'},undef,                                       $total_formula,undef,
                                      %replaceCells);                                       %total_cell_translation);
       } else {
           $excel_sheet->write($rows_output,$cols_output++,$grand_total);
     }      }
     $excel_sheet->repeat_formula($rows_output,$cols_output++,  
                                  $total_formula,undef,  
                                  %total_cell_translation);  
     $rows_output++;      $rows_output++;
     #      #
     # Let the user know what we are doing      # Let the user know what we are doing
     my $studentcount = scalar(@Apache::lonstatistics::Students);       my $studentcount = scalar(@Apache::lonstatistics::Students); 
     $r->print("<h1>Compiling Excel spreadsheet for ".      if ($ENV{'form.SelectedStudent'}) {
               $studentcount.' student');          $studentcount = '1';
     $r->print('s') if ($studentcount > 1);      }
     $r->print("</h1>\n");      if ($studentcount > 1) {
           $r->print('<h1>'.&mt('Compiling Excel spreadsheet for [_1] students',
                                $studentcount)."</h1>\n");
       } else {
           $r->print('<h1>'.
                     &mt('Compiling Excel spreadsheet for 1 student').
                     "</h1>\n");
       }
     $r->rflush();      $r->rflush();
     #      #
     # Initialize progress window      # Initialize progress window
Line 1179  sub excel_outputstudent { Line 1222  sub excel_outputstudent {
     # Write out sequence scores and totals data      # Write out sequence scores and totals data
     my %total_cell_translation;      my %total_cell_translation;
     foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) {      foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) {
           $cols_output = $seq->{'Excel:startcol'};
         # Keep track of cells to translate in total cell          # Keep track of cells to translate in total cell
         $total_cell_translation{$seq->{'Excel:scorecell'}} =           $total_cell_translation{$seq->{'Excel:scorecell'}} = 
             &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell              &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell
Line 1207  sub excel_outputstudent { Line 1251  sub excel_outputstudent {
                 &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell                  &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell
                             ($rows_output,$seq->{'Excel:endcol'});                              ($rows_output,$seq->{'Excel:endcol'});
             # The undef is for the format              # The undef is for the format
             $excel_sheet->repeat_formula($rows_output,$cols_output++,              if (scalar(keys(%replaceCells)) == 1) {
                                          $seq->{'Excel:sum'},undef,                  $excel_sheet->repeat_formula($rows_output,$cols_output++,
                                          %replaceCells);                                               $seq->{'Excel:sum'},undef,
                                                %replaceCells,%replaceCells);
               } else {
                   $excel_sheet->repeat_formula($rows_output,$cols_output++,
                                                $seq->{'Excel:sum'},undef,
                                                %replaceCells);
               }
             #              #
             $excel_sheet->write($rows_output,$cols_output++,$seq_max);              $excel_sheet->write($rows_output,$cols_output++,$seq_max);
         } elsif ($data eq 'sum and total' || $data eq 'sum only' ||           } elsif ($data eq 'sum and total' || $data eq 'sum only' || 
Line 1224  sub excel_outputstudent { Line 1274  sub excel_outputstudent {
     $excel_sheet->repeat_formula($rows_output,$cols_output++,      $excel_sheet->repeat_formula($rows_output,$cols_output++,
                                  $total_formula,undef,                                   $total_formula,undef,
                                  %total_cell_translation);                                   %total_cell_translation);
   
     #      #
     # Bookkeeping      # Bookkeeping
     $rows_output++;       $rows_output++; 

Removed from v.1.78  
changed lines
  Added in v.1.85


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>