Diff for /loncom/interface/statistics/lonstudentassessment.pm between versions 1.75 and 1.80

version 1.75, 2003/11/20 20:21:17 version 1.80, 2004/01/27 16:04:27
Line 52  package Apache::lonstudentassessment; Line 52  package Apache::lonstudentassessment;
 use strict;  use strict;
 use Apache::lonstatistics;  use Apache::lonstatistics;
 use Apache::lonhtmlcommon;  use Apache::lonhtmlcommon;
   use Apache::loncommon();
 use Apache::loncoursedata;  use Apache::loncoursedata;
 use Apache::lonnet; # for logging porpoises  use Apache::lonnet; # for logging porpoises
 use Apache::lonlocal;  use Apache::lonlocal;
 use Spreadsheet::WriteExcel;  use Spreadsheet::WriteExcel;
   use Spreadsheet::WriteExcel::Utility();
   
 #######################################################  #######################################################
 #######################################################  #######################################################
Line 859  my $cols_output; Line 861  my $cols_output;
 my %prog_state; # progress window state  my %prog_state; # progress window state
 my $request_aborted;  my $request_aborted;
   
   my $total_formula;
   
 sub excel_initialize {  sub excel_initialize {
     my ($r) = @_;      my ($r) = @_;
     #      #
Line 869  sub excel_initialize { Line 873  sub excel_initialize {
     undef ($cols_output);      undef ($cols_output);
     undef (%prog_state);      undef (%prog_state);
     undef ($request_aborted);      undef ($request_aborted);
       undef ($total_formula);
     #      #
     my $total_columns = scalar(&get_student_fields_to_show());      my $total_columns = scalar(&get_student_fields_to_show());
     foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) {      foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) {
Line 904  You may consider reducing the number of Line 909  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 1000  END Line 1005  END
     }      }
     #      #
     # Add the remaining column headers      # Add the remaining column headers
       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'});
         if ($data eq 'tries' || $data eq 'scores') {          if ($data eq 'tries' || $data eq 'scores') {
               # Determine starting cell
               $seq->{'Excel:startcell'}=
                   &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell
                   ($rows_output,$cols_output);
               $seq->{'Excel:startcol'}=$cols_output;
               # Put the names of the problems and parts into the sheet
             foreach my $res (@{$seq->{'contents'}}) {              foreach my $res (@{$seq->{'contents'}}) {
                 next if ($res->{'type'} ne 'assessment');                  next if ($res->{'type'} ne 'assessment');
                 if (scalar(@{$res->{'parts'}}) > 1) {                  if (scalar(@{$res->{'parts'}}) > 1) {
Line 1018  END Line 1030  END
                                         $res->{'title'});                                          $res->{'title'});
                 }                  }
             }              }
             $excel_sheet->write($rows_output,$cols_output++,'score');              # Determine ending cell
             $excel_sheet->write($rows_output,$cols_output++,'maximum');              $seq->{'Excel:endcell'} = 
         } elsif ($data eq 'sum and total' || $data eq 'parts correct total') {                  &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell
             $excel_sheet->write($rows_output+1,$cols_output,'score');                                               ($rows_output,$cols_output-1);
             $excel_sheet->write($rows_output+1,$cols_output+1,'maximum');              $seq->{'Excel:endcol'}=$cols_output-1;
             $cols_output += 2;              # Create the formula for summing up this sequence
               $seq->{'Excel:sum'}= $excel_sheet->store_formula
                                           ('=SUM('.$seq->{'Excel:startcell'}.
                                                ':'.$seq->{'Excel:endcell'}.')');
           }
           # Determine cell the score is held in
           $seq->{'Excel:scorecell'} = 
               &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell
               ($rows_output,$cols_output);
           $seq->{'Excel:scorecol'}=$cols_output;
           if ($data eq 'parts correct total') {
               $excel_sheet->write($rows_output,$cols_output++,'parts correct');
         } else {          } else {
             $cols_output++;              $excel_sheet->write($rows_output,$cols_output++,'score');
         }          }
           #
           $total_formula_string.='+'.
               &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell
               ($rows_output,$cols_output-1);
           $excel_sheet->write($rows_output,$cols_output++,'maximum');
     }      }
       $excel_sheet->write($rows_output,$cols_output++,'Grand Total');
       $total_formula = $excel_sheet->store_formula($total_formula_string);
     #      #
     # Bookkeeping      # Bookkeeping
     if ($data eq 'sum and total' || $data eq 'parts correct total') {      if ($data eq 'sum and total' || $data eq 'parts correct total') {
Line 1048  END Line 1078  END
     }      }
     #      #
     # Add the maximums for each sequence or assessment      # Add the maximums for each sequence or assessment
       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'}} = 
               &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell
                           ($rows_output,$seq->{'Excel:scorecol'});
         my $weight;          my $weight;
         my $max = 0;          my $max = 0;
         foreach my $resource (@{$seq->{'contents'}}) {          foreach my $resource (@{$seq->{'contents'}}) {
Line 1074  END Line 1109  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++,'');
         }          }
         $excel_sheet->write($rows_output,$cols_output++,$max);          #
           if ($data eq 'tries' || $data eq 'scores') {
               my %replaceCells;
               $replaceCells{$seq->{'Excel:startcell'}} = 
                   &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell
                   ($rows_output,$seq->{'Excel:startcol'});
               $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++,
                                        $total_formula,undef,
                                        %total_cell_translation);
       } else {
           $excel_sheet->write($rows_output,$cols_output++,$grand_total);
     }      }
     $rows_output++;      $rows_output++;
     #      #
Line 1119  sub excel_outputstudent { Line 1177  sub excel_outputstudent {
     }      }
     #      #
     # Write out sequence scores and totals data      # Write out sequence scores and totals data
       my %total_cell_translation;
     foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) {      foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) {
           # 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'});
           #
         my ($performance,$performance_length,$score,$seq_max,$rawdata);          my ($performance,$performance_length,$score,$seq_max,$rawdata);
         if ($base eq 'tries') {          if ($base eq 'tries') {
             ($performance,$performance_length,$score,$seq_max,$rawdata) =              ($performance,$performance_length,$score,$seq_max,$rawdata) =
Line 1134  sub excel_outputstudent { Line 1198  sub excel_outputstudent {
             foreach my $value (@$rawdata) {              foreach my $value (@$rawdata) {
                 $excel_sheet->write($rows_output,$cols_output++,$value);                  $excel_sheet->write($rows_output,$cols_output++,$value);
             }              }
             $excel_sheet->write($rows_output,$cols_output++,$score);              # Write a formula for the sum of this sequence
               my %replaceCells;
               $replaceCells{$seq->{'Excel:startcell'}} = 
                   &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell
                               ($rows_output,$seq->{'Excel:startcol'});
               $replaceCells{$seq->{'Excel:endcell'}} = 
                   &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell
                               ($rows_output,$seq->{'Excel:endcol'});
               # The undef is for the format
               $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' || 
             $data eq 'parts correct' || $data eq 'parts correct total') {              $data eq 'parts correct' || $data eq 'parts correct total') {
Line 1145  sub excel_outputstudent { Line 1221  sub excel_outputstudent {
         }          }
     }      }
     #      #
       $excel_sheet->repeat_formula($rows_output,$cols_output++,
                                    $total_formula,undef,
                                    %total_cell_translation);
   
       #
     # Bookkeeping      # Bookkeeping
     $rows_output++;       $rows_output++; 
     $cols_output=0;      $cols_output=0;
Line 1410  sub StudentTriesOnSequence { Line 1491  sub StudentTriesOnSequence {
             $performance_length++;              $performance_length++;
             my $symbol = ' '; # default to space              my $symbol = ' '; # default to space
             #              #
               my $awarded = 0;
               if (exists($resource_data->{'resource.'.$partnum.'.awarded'})) {
                   $awarded = $resource_data->{'resource.'.$partnum.'.awarded'};
                   $awarded = 0 if (! $awarded);
               }
               #
               my $status = '';
             if (exists($resource_data->{'resource.'.$partnum.'.solved'})) {              if (exists($resource_data->{'resource.'.$partnum.'.solved'})) {
                 my $status = $resource_data->{'resource.'.$partnum.'.solved'};                  $status = $resource_data->{'resource.'.$partnum.'.solved'};
                 if ($status eq 'correct_by_override') {              }
                     $symbol = '+';              #
                     $sum++;              my $tries = 0;
                 } elsif ($status eq 'incorrect_by_override') {              if(exists($resource_data->{'resource.'.$partnum.'.tries'})) {
                     $symbol = '-';                  $tries = $resource_data->{'resource.'.$partnum.'.tries'};
                 } elsif ($status eq 'ungraded_attempted') {              }
                     $symbol = '#';              #
                 } elsif ($status eq 'incorrect_attempted')  {              if ($awarded > 0) {
                     $symbol = '.';                  # The student has gotten the problem correct to some degree
                 } elsif ($status eq 'excused') {                  if ($status eq 'excused') {
                     $symbol = 'x';                      $symbol = 'x';
                     $max--;                      $max--;
                 } elsif (($status eq 'correct_by_scantron' ||                  } elsif ($status eq 'correct_by_override') {
                           $status eq 'correct_by_student') &&                      $symbol = '+';
                     exists($resource_data->{'resource.'.$partnum.'.tries'})){                      $sum++;
                     $tries = $resource_data->{'resource.'.$partnum.'.tries'};                  } elsif ($tries > 0) {
                     if ($tries > 9) {                      if ($tries > 9) {
                         $symbol = '*';                          $symbol = '*';
                     } elsif ($tries > 0) {  
                         $symbol = $tries;  
                     } else {                      } else {
                         $symbol = ' ';                          $symbol = $tries;
                     }                      }
                     $sum++;                      $sum++;
                 } elsif (exists($resource_data->{'resource.'.  
                                                      $partnum.'.tries'})){  
                     $symbol = '.';  
                 } else {                  } else {
                     $symbol = ' ';                      $symbol = '+';
                       $sum++;
                 }                  }
             } else {              } else {
                 # Unsolved.  Did they try?                  # The student has the problem incorrect or it is ungraded
                 if (exists($resource_data->{'resource.'.$partnum.'.tries'})){                  if ($status eq 'excused') {
                       $symbol = 'x';
                       $max--;
                   } elsif ($status eq 'incorrect_by_override') {
                       $symbol = '-';
                   } elsif ($status eq 'ungraded_attempted') {
                       $symbol = '#';
                   } elsif ($status eq 'incorrect_attempted' ||
                            $tries > 0)  {
                     $symbol = '.';                      $symbol = '.';
                 } else {                  } else {
                     $symbol = ' ';                      # Problem is wrong and has not been attempted.
                       $symbol=' ';
                 }                  }
             }              }
             #              #

Removed from v.1.75  
changed lines
  Added in v.1.80


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