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

version 1.66, 2003/09/03 18:23:10 version 1.78, 2003/12/09 17:00:07
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 Spreadsheet::WriteExcel;  use Spreadsheet::WriteExcel;
   use Spreadsheet::WriteExcel::Utility();
   
 #######################################################  #######################################################
 #######################################################  #######################################################
Line 138  Inputs: Line 141  Inputs:
 #######################################################  #######################################################
 sub BuildStudentAssessmentPage {  sub BuildStudentAssessmentPage {
     my ($r,$c)=@_;      my ($r,$c)=@_;
       #
     undef($Statistics);      undef($Statistics);
     undef($show_links);      undef($show_links);
     undef($output_mode);      undef($output_mode);
Line 146  sub BuildStudentAssessmentPage { Line 149  sub BuildStudentAssessmentPage {
     undef($base);      undef($base);
     undef($datadescription);      undef($datadescription);
     undef($single_student_mode);      undef($single_student_mode);
       #
       my %Saveable_Parameters = ('Status' => 'scalar',
                                  'chartoutputmode' => 'scalar',
                                  'chartoutputdata' => 'scalar',
                                  'Section' => 'array',
                                  'StudentData' => 'array',
                                  'Maps' => 'array');
       &Apache::loncommon::store_course_settings('chart',\%Saveable_Parameters);
       &Apache::loncommon::restore_course_settings('chart',\%Saveable_Parameters);
       #
       &Apache::lonstatistics::PrepareClasslist();
       #
     $single_student_mode = 0;      $single_student_mode = 0;
     $single_student_mode = 1 if ($ENV{'form.SelectedStudent'});      $single_student_mode = 1 if ($ENV{'form.SelectedStudent'});
     if ($ENV{'form.selectstudent'}) {      if ($ENV{'form.selectstudent'}) {
Line 200  sub BuildStudentAssessmentPage { Line 214  sub BuildStudentAssessmentPage {
     #       are immediately reflected in the chart.      #       are immediately reflected in the chart.
     &Apache::lonnet::clear_EXT_cache_status();      &Apache::lonnet::clear_EXT_cache_status();
     #      #
       # Clean out loncoursedata's package data, just to be safe.
       &Apache::loncoursedata::clear_internal_caches();
       #
     # Call the initialize routine selected above      # Call the initialize routine selected above
     $initialize->($r);      $initialize->($r);
     foreach my $student (@Students) {      foreach my $student (@Students) {
Line 302  sub CreateInterface { Line 319  sub CreateInterface {
 #    $Str .= &CreateLegend();  #    $Str .= &CreateLegend();
     $Str .= '<table cellspacing="5">'."\n";      $Str .= '<table cellspacing="5">'."\n";
     $Str .= '<tr>';      $Str .= '<tr>';
     $Str .= '<td align="center"><b>Sections</b></td>';      $Str .= '<td align="center"><b>'.&mt('Sections').'</b></td>';
     $Str .= '<td align="center"><b>Student Data</b></td>';      $Str .= '<td align="center"><b>'.&mt('Student Data</b>').'</td>';
     $Str .= '<td align="center"><b>Enrollment Status</b></td>';      $Str .= '<td align="center"><b>'.&mt('Enrollment Status').'</b></td>';
     $Str .= '<td align="center"><b>Sequences and Folders</b></td>';      $Str .= '<td align="center"><b>'.&mt('Sequences and Folders').'</b></td>';
     $Str .= '<td align="center"><b>Output Format</b>'.      $Str .= '<td align="center"><b>'.&mt('Output Format').'</b>'.
         &Apache::loncommon::help_open_topic("Chart_Output_Formats").          &Apache::loncommon::help_open_topic("Chart_Output_Formats").
         '</td>';          '</td>';
     $Str .= '<td align="center"><b>Output Data</b>'.      $Str .= '<td align="center"><b>'.&mt('Output Data').'</b>'.
         &Apache::loncommon::help_open_topic("Chart_Output_Data").          &Apache::loncommon::help_open_topic("Chart_Output_Data").
         '</td>';          '</td>';
     $Str .= '</tr>'."\n";      $Str .= '</tr>'."\n";
Line 338  sub CreateInterface { Line 355  sub CreateInterface {
     $Str .= &CreateAndParseOutputDataSelector();      $Str .= &CreateAndParseOutputDataSelector();
     $Str .= '</td></tr>'."\n";      $Str .= '</td></tr>'."\n";
     $Str .= '</table>'."\n";      $Str .= '</table>'."\n";
     $Str .= '<input type="submit" value="Generate Chart" />';      $Str .= '<input type="submit" name="Generate Chart" value="'.
           &mt('Generate Chart').'" />';
     $Str .= '&nbsp;'x5;      $Str .= '&nbsp;'x5;
     $Str .= '<input type="submit" name="selectstudent" '.      $Str .= '<input type="submit" name="selectstudent" value="'.
                                   'value="Select One Student" />';          &mt('Select One Student').'" />';
     $Str .= '&nbsp;'x5;      $Str .= '&nbsp;'x5;
     $Str .= '<input type="submit" name="ClearCache" value="Clear Caches" />';      $Str .= '<input type="submit" name="ClearCache" value="'.
           &mt('Clear Caches').'" />';
     $Str .= '&nbsp;'x5;      $Str .= '&nbsp;'x5;
     $Str .= '<br />';      $Str .= '<br />';
     return $Str;      return $Str;
Line 416  sub OutputDescriptions { Line 435  sub OutputDescriptions {
 sub CreateAndParseOutputSelector {  sub CreateAndParseOutputSelector {
     my $Str = '';      my $Str = '';
     my $elementname = 'chartoutputmode';      my $elementname = 'chartoutputmode';
       &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                                               [$elementname]);
     #      #
     # Format for output options is 'mode, restrictions';      # Format for output options is 'mode, restrictions';
     my $selected = 'html, without links';      my $selected = 'html, without links';
Line 442  sub CreateAndParseOutputSelector { Line 463  sub CreateAndParseOutputSelector {
     foreach my $option (@OutputOptions) {      foreach my $option (@OutputOptions) {
         $Str .= "\n".'    <option value="'.$option->{'value'}.'"';          $Str .= "\n".'    <option value="'.$option->{'value'}.'"';
         $Str .= " selected " if ($option->{'value'} eq $selected);          $Str .= " selected " if ($option->{'value'} eq $selected);
         $Str .= ">".$option->{'name'}."<\/option>";          $Str .= ">".&mt($option->{'name'})."<\/option>";
     }      }
     $Str .= "\n</select>";      $Str .= "\n</select>";
     return $Str;      return $Str;
Line 453  sub CreateAndParseOutputSelector { Line 474  sub CreateAndParseOutputSelector {
 ##  ##
 my @OutputDataOptions =  my @OutputDataOptions =
     (      (
      { name  => 'Scores',       { name  => 'Scores Summary',
        base  => 'scores',  
        value => 'scores',  
        shortdesc => 'Score on each Problem Part',  
        longdesc =>'The students score on each problem part, computed as'.  
            'the part weight * part awarded',  
        },  
      { name  => 'Scores Sum',  
        base  => 'scores',  
        value => 'sum only',  
        shortdesc => 'Sum of Scores on each Problem Part',  
        longdesc =>'The total of the scores of the student on each problem'.  
            ' part in the sequences or folders selected.',  
        },  
      { name  => 'Scores Sum & Maximums',  
        base  => 'scores',         base  => 'scores',
        value => 'sum and total',         value => 'sum and total',
        shortdesc => 'Total Score and Maximum Possible for each '.         shortdesc => 'Total Score and Maximum Possible for each '.
Line 475  my @OutputDataOptions = Line 482  my @OutputDataOptions =
        longdesc => 'The score of each student as well as the '.         longdesc => 'The score of each student as well as the '.
            ' maximum possible on each Sequence or Folder.',             ' maximum possible on each Sequence or Folder.',
        },         },
      { name  => 'Scores Summary Table Only',       { name  => 'Scores Per Problem',
        base  => 'scores',         base  => 'scores',
        value => 'final table scores',         value => 'scores',
        shortdesc => 'Summary of Scores',         shortdesc => 'Score on each Problem Part',
        longdesc  => 'The average score on each sequence or folder for the '.         longdesc =>'The students score on each problem part, computed as'.
            'selected students.',             'the part weight * part awarded',
        },         },
   #     { name  => 'Scores Sum',
   #       base  => 'scores',
   #       value => 'sum only',
   #       shortdesc => 'Sum of Scores on each Problem Part',
   #       longdesc =>'The total of the scores of the student on each problem'.
   #           ' part in the sequences or folders selected.',
   #       },
   #     { name  => 'Scores Summary Table Only',
   #       base  => 'scores',
   #       value => 'final table scores',
   #       shortdesc => 'Summary of Scores',
   #       longdesc  => 'The average score on each sequence or folder for the '.
   #           'selected students.',
   #       },
      { name  =>'Tries',       { name  =>'Tries',
        base  =>'tries',         base  =>'tries',
        value => 'tries',         value => 'tries',
Line 490  my @OutputDataOptions = Line 511  my @OutputDataOptions =
        },         },
      { name  =>'Parts Correct',       { name  =>'Parts Correct',
        base  =>'tries',         base  =>'tries',
        value => 'parts correct',  
        shortdesc => 'Number of Problem Parts completed successfully.',  
        longdesc => 'The Number of Problem Parts completed successfully'.  
            ' on each sequence or folder.',  
        },  
      { name  =>'Parts Correct & Maximums',  
        base  =>'tries',  
        value => 'parts correct total',         value => 'parts correct total',
        shortdesc => 'Number of Problem Parts completed successfully.',         shortdesc => 'Number of Problem Parts completed successfully.',
        longdesc => 'The Number of Problem Parts completed successfully and '.         longdesc => 'The Number of Problem Parts completed successfully and '.
            'the maximum possible for each student',             'the maximum possible for each student',
        },         },
      { name  => 'Parts Summary Table Only',  #     { name  =>'Parts Correct',
        base  => 'tries',  #       base  =>'tries',
        value => 'final table parts',  #       value => 'parts correct',
        shortdesc => 'Summary of Parts Correct',  #       shortdesc => 'Number of Problem Parts completed successfully.',
        longdesc  => 'A summary table of the average number of problem parts '.  #       longdesc => 'The Number of Problem Parts completed successfully'.
            'students were able to get correct on each sequence.',  #           ' on each sequence or folder.',
        },  #       },
   #     { name  => 'Parts Summary Table Only',
   #       base  => 'tries',
   #       value => 'final table parts',
   #       shortdesc => 'Summary of Parts Correct',
   #       longdesc  => 'A summary table of the average number of problem parts '.
   #           'students were able to get correct on each sequence.',
   #       },
      );       );
   
 sub HTMLifyOutputDataDescriptions {  sub HTMLifyOutputDataDescriptions {
Line 550  sub CreateAndParseOutputDataSelector { Line 571  sub CreateAndParseOutputDataSelector {
     foreach my $option (@OutputDataOptions) {      foreach my $option (@OutputDataOptions) {
         $Str .= "\n".'    <option value="'.$option->{'value'}.'"';          $Str .= "\n".'    <option value="'.$option->{'value'}.'"';
         $Str .= " selected " if ($option->{'value'} eq $data);          $Str .= " selected " if ($option->{'value'} eq $data);
         $Str .= ">".$option->{'name'}."<\/option>";          $Str .= ">".&mt($option->{'name'})."<\/option>";
     }      }
     $Str .= "\n</select>";      $Str .= "\n</select>";
     return $Str;      return $Str;
Line 840  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 850  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 931  END Line 955  END
     #      #
     # Add a worksheet      # Add a worksheet
     my $sheetname = $ENV{'course.'.$ENV{'request.course.id'}.'.description'};      my $sheetname = $ENV{'course.'.$ENV{'request.course.id'}.'.description'};
     if (length($sheetname) > 31) {      $sheetname = &Apache::loncommon::clean_excel_name($sheetname);
         $sheetname = substr($sheetname,0,31);  
     }  
     $excel_sheet = $excel_workbook->addworksheet($sheetname);      $excel_sheet = $excel_workbook->addworksheet($sheetname);
     #      #
     # Put the course description in the header      # Put the course description in the header
Line 983  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 1001  END Line 1030  END
                                         $res->{'title'});                                          $res->{'title'});
                 }                  }
             }              }
               # Determine ending cell
               $seq->{'Excel:endcell'} = 
                   &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell
                                                ($rows_output,$cols_output-1);
               $seq->{'Excel:endcol'}=$cols_output-1;
               # 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;
             $excel_sheet->write($rows_output,$cols_output++,'score');              $excel_sheet->write($rows_output,$cols_output++,'score');
               # Create the formula for summing up this sequence
               $seq->{'Excel:sum'}= $excel_sheet->store_formula
                                           ('=SUM('.$seq->{'Excel:startcell'}.
                                                ':'.$seq->{'Excel:endcell'}.')');
               #
               $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++,'maximum');
         } elsif ($data eq 'sum and total' || $data eq 'parts correct total') {          } elsif ($data eq 'sum and total') {
             $excel_sheet->write($rows_output+1,$cols_output,'score');              $excel_sheet->write($rows_output+1,$cols_output,'score');
               $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;
           } 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');              $excel_sheet->write($rows_output+1,$cols_output+1,'maximum');
             $cols_output += 2;              $cols_output += 2;
         } else {          } else {
             $cols_output++;              $cols_output++;
         }          }
     }      }
       $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 1031  END Line 1090  END
     }      }
     #      #
     # Add the maximums for each sequence or assessment      # Add the maximums for each sequence or assessment
       my %total_cell_translation;
     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 1057  END Line 1120  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);          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);
       }
       $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
Line 1102  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 1117  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 1128  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 1393  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_student' &&                  } elsif ($status eq 'correct_by_override') {
                     exists($resource_data->{'resource.'.$partnum.'.tries'})){                      $symbol = '+';
                     $tries = $resource_data->{'resource.'.$partnum.'.tries'};                      $sum++;
                   } 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=' ';
                 }                  }
             }              }
             #              #
Line 1514  sub StudentPerformanceOnSequence { Line 1625  sub StudentPerformanceOnSequence {
             my $awarded = 0;              my $awarded = 0;
             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);
             }              }
             #              #
             $partscore = $weight*$awarded;              $partscore = $weight*$awarded;
             $score += $partscore;              $score += $partscore;
             $symbol = $partscore;               $symbol = $partscore; 
               if (abs($symbol - sprintf("%.0f",$symbol)) < 0.001) {
                   $symbol = sprintf("%.0f",$symbol);
               }
             if (length($symbol) > 1) {              if (length($symbol) > 1) {
                 $symbol = '*';                  $symbol = '*';
             }              }

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


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