Diff for /loncom/interface/statistics/lonstudentassessment.pm between versions 1.135 and 1.167

version 1.135, 2006/03/21 16:49:59 version 1.167, 2012/02/17 00:49:46
Line 50  Presents assessment data about a student Line 50  Presents assessment data about a student
 package Apache::lonstudentassessment;  package Apache::lonstudentassessment;
   
 use strict;  use strict;
 use Apache::lonstatistics;  use Apache::lonstatistics();
 use Apache::lonhtmlcommon;  use Apache::lonquickgrades();
   use Apache::lonhtmlcommon();
 use Apache::loncommon();  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 Apache::grades;  use Apache::grades();
   use Apache::lonmsgdisplay();
 use Time::HiRes;  use Time::HiRes;
 use Spreadsheet::WriteExcel;  use Spreadsheet::WriteExcel;
 use Spreadsheet::WriteExcel::Utility();  use Spreadsheet::WriteExcel::Utility();
   use lib '/home/httpd/lib/perl/';
   use LONCAPA;
    
   
 #######################################################  #######################################################
 #######################################################  #######################################################
Line 146  sub BuildStudentAssessmentPage { Line 151  sub BuildStudentAssessmentPage {
                                'chartoutputmode' => 'scalar',                                 'chartoutputmode' => 'scalar',
                                'chartoutputdata' => 'scalar',                                 'chartoutputdata' => 'scalar',
                                'Section' => 'array',                                 'Section' => 'array',
                                  'Groups' => 'array',
                                'StudentData' => 'array',                                 'StudentData' => 'array',
                                'Maps' => 'array');                                 'Maps' => 'array');
     &Apache::loncommon::store_course_settings('chart',\%Saveable_Parameters);      &Apache::loncommon::store_course_settings('chart',\%Saveable_Parameters);
Line 161  sub BuildStudentAssessmentPage { Line 167  sub BuildStudentAssessmentPage {
         &Apache::lonstatistics::DisplayClasslist($r);          &Apache::lonstatistics::DisplayClasslist($r);
         return;          return;
     }      }
       $r->print(&Apache::lonhtmlcommon::breadcrumbs('Chart','Chart_Description:Chart_Sections:Chart_Student_Data:Chart_Enrollment_Status:Chart_Sequences:Chart_Output_Formats:Chart_Output_Data'));
       &Apache::lonquickgrades::startGradeScreen($r,'chart');
   
     #      #
     # Print out the HTML headers for the interface      # Print out the HTML headers for the interface
     #    This also parses the output mode selector      #    This also parses the output mode selector
Line 225  sub BuildStudentAssessmentPage { Line 234  sub BuildStudentAssessmentPage {
         $output_student->($r,$student);          $output_student->($r,$student);
     }      }
     # Call the "finish" routine selected above      # Call the "finish" routine selected above
       &Apache::lonquickgrades::endGradeScreen($r);
     $finish->($r);      $finish->($r);
     #      #
     return;      return;
Line 243  sub next_and_previous_buttons { Line 253  sub next_and_previous_buttons {
     if (defined($previous)) {      if (defined($previous)) {
         my $sname = $previous->{'username'}.':'.$previous->{'domain'};          my $sname = $previous->{'username'}.':'.$previous->{'domain'};
         $previousbutton .= '<input type="button" value="'.          $previousbutton .= '<input type="button" value="'.
             'Previous Student ('.              &mt('Previous Student ([_1])',
             $previous->{'username'}.'@'.$previous->{'domain'}.')'.              $previous->{'username'}.':'.$previous->{'domain'}).
             '" onclick="document.Statistics.SelectedStudent.value='.              '" onclick="document.Statistics.SelectedStudent.value='.
             "'".$sname."'".';'.              "'".$sname."'".';'.
             'document.Statistics.submit();" />';              'document.Statistics.submit();" />';
     } else {      } else {
         $previousbutton .= '<input type="button" value="'.          $previousbutton .= '<input type="button" value="'.
             'Previous student (none)'.'" />';              &mt('Previous Student').'" disabled="disabled" />';
     }      }
     #      #
     # Build the next student link      # Build the next student link
Line 259  sub next_and_previous_buttons { Line 269  sub next_and_previous_buttons {
     if (defined($next)) {      if (defined($next)) {
         my $sname = $next->{'username'}.':'.$next->{'domain'};          my $sname = $next->{'username'}.':'.$next->{'domain'};
         $nextbutton .= '<input type="button" value="'.          $nextbutton .= '<input type="button" value="'.
             'Next Student ('.              &mt('Next Student ([_1])',
             $next->{'username'}.'@'.$next->{'domain'}.')'.              $next->{'username'}.':'.$next->{'domain'}).
             '" onclick="document.Statistics.SelectedStudent.value='.              '" onclick="document.Statistics.SelectedStudent.value='.
             "'".$sname."'".';'.              "'".$sname."'".';'.
             'document.Statistics.submit();" />';              'document.Statistics.submit();" />';
     } else {      } else {
         $nextbutton .= '<input type="button" value="'.          $nextbutton .= '<input type="button" value="'.
             'Next student (none)'.'" />';              &mt('Next Student').'" disabled="disabled" />';
     }      }
     #      #
     # Build the 'all students' button      # Build the 'all students' button
     my $all = '';      my $all = '';
     $all .= '<input type="button" value="All Students" '.      $all .= '<input type="button" value="'.&mt('All Students').'" '.
             '" onclick="document.Statistics.SelectedStudent.value='.              '" onclick="document.Statistics.SelectedStudent.value='.
             "''".';'.'document.Statistics.submit();" />';              "''".';'.'document.Statistics.submit();" />';
     $Str .= $previousbutton.('&nbsp;'x5).$all.('&nbsp;'x5).$nextbutton;      $Str .= $previousbutton.('&nbsp;'x5).$all.('&nbsp;'x5).$nextbutton;
Line 313  the chart page. Line 323  the chart page.
 #######################################################  #######################################################
 sub CreateInterface {  sub CreateInterface {
     my $Str = '';      my $Str = '';
     $Str .= &Apache::lonhtmlcommon::breadcrumbs(undef,'Chart');  
 #    $Str .= &CreateLegend();  
     $Str .= '<table cellspacing="5">'."\n";      $Str .= '<table cellspacing="5">'."\n";
     $Str .= '<tr>';      $Str .= '<tr>';
     $Str .= '<td align="center"><b>'.&mt('Sections').'</b></td>';      $Str .= '<td align="center"><b>'.&mt('Sections').'</b>'.
     $Str .= '<td align="center"><b>'.&mt('Student Data</b>').'</td>';   &Apache::loncommon::help_open_topic("Chart_Sections").
     $Str .= '<td align="center"><b>'.&mt('Enrollment Status').'</b></td>';   '</td>';
     $Str .= '<td align="center"><b>'.&mt('Sequences and Folders').'</b></td>';      $Str .= '<td align="center"><b>'.&mt('Groups').'</b>'.
    '</td>';
       $Str .= '<td align="center"><b>'.&mt('Student Data').'</b>'.
    &Apache::loncommon::help_open_topic("Chart_Student_Data").
    '</td>';
       $Str .= '<td align="center"><b>'.&mt('Access Status').'</b>'.
    &Apache::loncommon::help_open_topic("Chart_Enrollment_Status").
    '</td>';
       $Str .= '<td align="center"><b>'.&mt('Sequences and Folders').'</b>'.
    &Apache::loncommon::help_open_topic("Chart_Sequences").
    '</td>';
     $Str .= '<td align="center"><b>'.&mt('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>';
Line 332  sub CreateInterface { Line 350  sub CreateInterface {
     $Str .= '<tr><td align="center">'."\n";      $Str .= '<tr><td align="center">'."\n";
     $Str .= &Apache::lonstatistics::SectionSelect('Section','multiple',5);      $Str .= &Apache::lonstatistics::SectionSelect('Section','multiple',5);
     $Str .= '</td><td align="center">';      $Str .= '</td><td align="center">';
       $Str .= &Apache::lonstatistics::GroupSelect('Group','multiple',5);
       $Str .= '</td><td align="center">';
     $Str .= &Apache::lonstatistics::StudentDataSelect('StudentData','multiple',      $Str .= &Apache::lonstatistics::StudentDataSelect('StudentData','multiple',
                                                       5,undef);                                                        5,undef);
     $Str .= '</td><td>'."\n";      $Str .= '</td><td>'."\n";
Line 344  sub CreateInterface { Line 364  sub CreateInterface {
     $Str .= &CreateAndParseOutputDataSelector();      $Str .= &CreateAndParseOutputDataSelector();
     $Str .= '</td></tr>'."\n";      $Str .= '</td></tr>'."\n";
     $Str .= '</table>'."\n";      $Str .= '</table>'."\n";
     $Str .= '<input type="submit" name="Generate Chart" value="'.  
         &mt('Generate Chart').'" />';  
     $Str .= '&nbsp;'x5;  
     $Str .= '<input type="submit" name="selectstudent" value="'.      $Str .= '<input type="submit" name="selectstudent" value="'.
         &mt('Select One Student').'" />';          &mt('Select One Student').'" />';
     $Str .= '&nbsp;'x5;      $Str .= '&nbsp;'x5;
     $Str .= '<input type="submit" name="ClearCache" value="'.      $Str .= '<input type="submit" name="ClearCache" value="'.
         &mt('Clear Caches').'" />';          &mt('Clear Caches').'" />';
     $Str .= '&nbsp;'x5;      $Str .= '<p>'
     $Str .=              .'<input type="submit" name="Generate Chart"'
         &mt('Status [_1]',             .' value="'.&mt('Generate Chart').'" />'
             '<input type="text" name="stats_status" size="60" value="" />');             .'</p>';
     $Str .= '<br />';  
     return $Str;      return $Str;
 }  }
   
Line 529  my @OutputDataOptions = Line 545  my @OutputDataOptions =
        summary_table => 1,         summary_table => 1,
        maximum_row => 0,         maximum_row => 0,
        ignore_weight => 1,         ignore_weight => 1,
        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',
        },         },
Line 537  my @OutputDataOptions = Line 553  my @OutputDataOptions =
   
 sub HTMLifyOutputDataDescriptions {  sub HTMLifyOutputDataDescriptions {
     my $Str = '';      my $Str = '';
     $Str .= "<h2>Output Data</h2>\n";      $Str .= '<h2>'.&mt('Output Data').'</h2>'."\n";
     $Str .= "<dl>\n";      $Str .= "<dl>\n";
     foreach my $option (@OutputDataOptions) {      foreach my $option (@OutputDataOptions) {
         $Str .= '    <dt>'.$option->{'name'}.'</dt>';          $Str .= '    <dt>'.$option->{'name'}.'</dt>';
Line 646  sub html_initialize { Line 662  sub html_initialize {
         &Apache::lonstatistics::selected_sequences_with_assessments();          &Apache::lonstatistics::selected_sequences_with_assessments();
     if (! ref($navmap)) {      if (! ref($navmap)) {
         # Unable to get data, so bail out          # Unable to get data, so bail out
         $r->print("<h3>".          $r->print('<p class="LC_error">'
                   &mt('Unable to retrieve course information.').                   .&mt('Unable to retrieve course information.')
                   '</h3>');                   .'</p>');
     }      }
   
     # If we're showing links, show a checkbox to open in new      # If we're showing links, show a checkbox to open in new
     # windows.      # windows.
     if ($show_links ne 'no') {      if ($show_links ne 'no') {
           my $labeltext = &mt('Show links in new window');
         $r->print(<<NEW_WINDOW_CHECKBOX);          $r->print(<<NEW_WINDOW_CHECKBOX);
 <script type="text/javascript">new_window = true;</script>  <script type="text/javascript">new_window = true;</script>
 <p><label>Show links in new window:   <p><label> 
 <input type="checkbox" checked="1" onclick="new_window=this.checked" />  <input type="checkbox" checked="checked" onclick="new_window=this.checked" />
   $labeltext
 </label></p>  </label></p>
 NEW_WINDOW_CHECKBOX  NEW_WINDOW_CHECKBOX
     }      }
   
     #      #
     $r->print("<h3>".$env{'course.'.$env{'request.course.id'}.'.description'}.      $r->print("<h3>".$env{'course.'.$env{'request.course.id'}.'.description'}.
               "&nbsp;&nbsp;".localtime(time)."</h3>");                "&nbsp;&nbsp;".&Apache::lonlocal::locallocaltime(time)."</h3>");
     #      #
     if ($chosen_output->{'base'} !~ /^final table/) {      if ($chosen_output->{'base'} !~ /^final table/) {
         $r->print("<h3>".$chosen_output->{'shortdesc'}."</h3>");                  $r->print("<h3>".&mt($chosen_output->{'shortdesc'})."</h3>");        
     }      }
     my $Str = "<pre>\n";      my $Str = "<pre>\n";
     # First, the @StudentData fields need to be listed      # First, the @StudentData fields need to be listed
Line 695  NEW_WINDOW_CHECKBOX Line 713  NEW_WINDOW_CHECKBOX
                 $width{$symb}->{'width_sum'} += 1;                              $width{$symb}->{'width_sum'} += 1;            
             }              }
     $total_count += &count_parts($navmap,$seq);      $total_count += &count_parts($navmap,$seq);
             # Use 3 digits for the sum              # Use 6 digits for the sum
             $width{$symb}->{'width_sum'} += 3;              $width{$symb}->{'width_sum'} += 6;
         }          }
         # Compute width of maximum          # Compute width of maximum
         if ($chosen_output->{'sequence_max'}) {          if ($chosen_output->{'sequence_max'}) {
Line 704  NEW_WINDOW_CHECKBOX Line 722  NEW_WINDOW_CHECKBOX
                 # One digit for the '/'                  # One digit for the '/'
                 $width{$symb}->{'width_sum'} +=1;                  $width{$symb}->{'width_sum'} +=1;
             }              }
             # Use 3 digits for the total              # Use 6 digits for the total
             $width{$symb}->{'width_sum'}+=3;              $width{$symb}->{'width_sum'}+=6;
         }          }
  #   #
         if ($chosen_output->{'every_problem'}) {          if ($chosen_output->{'every_problem'}) {
Line 729  NEW_WINDOW_CHECKBOX Line 747  NEW_WINDOW_CHECKBOX
     $total_sum_width = length($total_count)+1;      $total_sum_width = length($total_count)+1;
     $Str .= "    total</pre>\n";      $Str .= "    total</pre>\n";
     $Str .= "<pre>";      $Str .= "<pre>";
     $r->print($Str);  
     $r->rflush();  
   
     $r->print(<<JS);      $r->print(<<JS);
 <script>  <script type="text/javascript">
 // get the left offset of a given widget as an absolute position  // get the left offset of a given widget as an absolute position
 function getLeftOffset (element) {  function getLeftOffset (element) {
     return collect(element, "offsetLeft");      return collect(element, "offsetLeft");
Line 754  function collect(element, att) { Line 770  function collect(element, att) {
 }  }
   
 var currentDiv;  var currentDiv;
 var oldBorder;  
 var currentElement;  var currentElement;
 function popup_score(element, score) {  function popup_score(element, score) {
     popdown_score();      popdown_score();
     var left = getLeftOffset(element);      var left = getLeftOffset(element);
     var top = getTopOffset(element);      var top = getTopOffset(element);
     var div = document.createElement("div");      var div = document.createElement("div");
     div.style.border = "1px solid #8888FF";      div.className = "LC_chrt_popup";
     div.style.backgroundColor = "#CCCCFF";  
     div.appendChild(document.createTextNode(score));      div.appendChild(document.createTextNode(score));
     div.style.position = "absolute";      div.style.position = "absolute";
     div.style.top = (top - 25) + "px";      div.style.top = (top - 25) + "px";
     div.style.left = (left - 10) + "px";      div.style.left = (left - 10) + "px";
     currentDiv = div;      currentDiv = div;
     document.body.insertBefore(div, document.body.childNodes[0]);      document.body.insertBefore(div, document.body.childNodes[0]);
     oldBorder = element.style.border;      element.className = "LC_chrt_popup_up";
     element.style.border = "1px solid yellow";  
     currentElement = element;      currentElement = element;
 }  }
   
Line 779  function popdown_score() { Line 792  function popdown_score() {
         document.body.removeChild(currentDiv);          document.body.removeChild(currentDiv);
     }      }
     if (currentElement) {      if (currentElement) {
         currentElement.style.border = oldBorder;          currentElement.className = 'LC_chrt_popup_exists';
     }      }
     currentDiv = undefined;      currentDiv = undefined;
 }  }
Line 794  JS Line 807  JS
     }      }
     #      #
     # Initialize progress window      # Initialize progress window
     %prog_state=&Apache::lonhtmlcommon::Create_PrgWin  
         ($r,'HTML Chart Status',  
          'HTML Chart Progress', $studentcount,  
          'inline',undef,'Statistics','stats_status');  
     #      #
       %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,$studentcount);
     &Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state,      &Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state,
                                           'Processing first student');                                            'Processing first student');
       $r->print($Str);
       $r->rflush();
   
     return;      return;
 }  }
   
Line 810  sub html_outputstudent { Line 823  sub html_outputstudent {
     return if (! defined($navmap));      return if (! defined($navmap));
     #      #
     if($count++ % 5 == 0 && $count > 0) {      if($count++ % 5 == 0 && $count > 0) {
         $r->print("</pre><pre>");  #       $r->print("</pre><pre>");
           $r->print('</pre>');
           &Apache::lonhtmlcommon::Increment_PrgWin(
               $r,\%prog_state,'last five students',5);
           $r->rflush();
           $r->print('<pre>');
     }      }
     # First, the @StudentData fields need to be listed      # First, the @StudentData fields need to be listed
     my @to_show = &get_student_fields_to_show();      my @to_show = &get_student_fields_to_show();
Line 822  sub html_outputstudent { Line 840  sub html_outputstudent {
         }          }
         my $base = length($title);          my $base = length($title);
         my $width=$Apache::lonstatistics::StudentData{$field}->{'width'};          my $width=$Apache::lonstatistics::StudentData{$field}->{'width'};
           utf8::decode($title);
         $Str .= $title.' 'x($width-$base).$padding;          $Str .= $title.' 'x($width-$base).$padding;
     }      }
     # Get ALL the students data      # Get ALL the students data
Line 829  sub html_outputstudent { Line 848  sub html_outputstudent {
     my @tmp = &Apache::loncoursedata::get_current_state      my @tmp = &Apache::loncoursedata::get_current_state
         ($student->{'username'},$student->{'domain'},undef,          ($student->{'username'},$student->{'domain'},undef,
          $env{'request.course.id'});           $env{'request.course.id'});
     if ((scalar @tmp > 0) && ($tmp[0] !~ /^error:/)) {      if ((scalar @tmp > 0) && ($tmp[0] !~ /^error:(.*)/)) {
         %StudentsData = @tmp;          %StudentsData = @tmp;
     }      } else {
     if (scalar(@tmp) < 1) {   my $error = $1;
    if (scalar(@tmp) < 1) {
       $Str .= '<span class="LC_warning">'
                      .&mt('No Course Data')
                      .'</span>'."\n";
    } else {
               $Str .= '<span class="LC_error">'
                      .&mt('Error getting student data ([_1])',$error)
                      .'</span>'."\n";
    }
         $nodata_count++;          $nodata_count++;
         $Str .= '<font color="blue">No Course Data</font>'."\n";  
         $r->print($Str);          $r->print($Str);
         $r->rflush();          $r->rflush();
         return;          return;
Line 845  sub html_outputstudent { Line 872  sub html_outputstudent {
     my $PerformanceStr = '';      my $PerformanceStr = '';
     foreach my $seq (@sequences) {      foreach my $seq (@sequences) {
         my $symb = $seq->symb;          my $symb = $seq->symb;
           my $randompick = $seq->randompick();
         my ($performance,$performance_length,$score,$seq_max,$rawdata);          my ($performance,$performance_length,$score,$seq_max,$rawdata);
         if ($chosen_output->{'tries'}) {          if ($chosen_output->{'tries'}) {
             ($performance,$performance_length,$score,$seq_max,$rawdata) =              ($performance,$performance_length,$score,$seq_max,$rawdata) =
                 &student_tries_on_sequence($student,\%StudentsData,                  &student_tries_on_sequence($student,\%StudentsData,
                                            $navmap,$seq,$show_links);                                             $navmap,$seq,$show_links,$randompick);
         } else {          } else {
             ($performance,$performance_length,$score,$seq_max,$rawdata) =              ($performance,$performance_length,$score,$seq_max,$rawdata) =
                 &student_performance_on_sequence($student,\%StudentsData,                  &student_performance_on_sequence($student,\%StudentsData,
                                                  $navmap,$seq,$show_links,                                                   $navmap,$seq,$show_links,
                                                  $chosen_output->{ignore_weight});                                                   $chosen_output->{ignore_weight},
                                                    $randompick);
         }          }
         my $ratio='';          my $ratio='';
         if ($chosen_output->{'every_problem'} &&           if ($chosen_output->{'every_problem'} && 
Line 862  sub html_outputstudent { Line 891  sub html_outputstudent {
             $ratio .= ' ';              $ratio .= ' ';
         }          }
         if ($chosen_output->{'sequence_sum'} && $score ne ' ') {          if ($chosen_output->{'sequence_sum'} && $score ne ' ') {
             my $score .= sprintf("%3.0f",$score);              my $score .= sprintf("%3.2f",$score);
             $ratio .= (' 'x(3-length($score))).$score;              $ratio .= (' 'x(6-length($score))).$score;
         } elsif($chosen_output->{'sequence_sum'}) {          } elsif($chosen_output->{'sequence_sum'}) {
             $ratio .= ' 'x3;              $ratio .= ' 'x6;
         }          }
         if ($chosen_output->{'sequence_max'}) {          if ($chosen_output->{'sequence_max'}) {
             if ($chosen_output->{'sequence_sum'}) {              if ($chosen_output->{'sequence_sum'}) {
                 $ratio .= '/';                  $ratio .= '/';
             }              }
             $ratio .= sprintf("%3.0f",$seq_max);              my $sequence_total=sprintf("%3.2f",$seq_max);
               $ratio .= $sequence_total.(' 'x(6-length($sequence_total)));
         }          }
         #          #
         if (! $chosen_output->{'every_problem'}) {          if (! $chosen_output->{'every_problem'}) {
Line 905  sub html_outputstudent { Line 935  sub html_outputstudent {
     if (! defined($score)) {      if (! defined($score)) {
         $score = ' ' x $total_sum_width;          $score = ' ' x $total_sum_width;
     } else {      } else {
         $score = sprintf("%.0f",$score);          $score = sprintf("%.2f",$score);
         $score = (' 'x(3-length($score))).$score;          $score = (' 'x(6-length($score))).$score;
     }      }
     $Str .= ' '.' 'x($total_sum_width-length($score)).$score.' / '.$max;      $Str .= ' '.' 'x($total_sum_width-length($score)).$score.' / '.$max;
     $Str .= " \n";      $Str .= " \n";
     #      #
     $r->print($Str);      $r->print($Str);
     #      #
     $r->rflush();  #   $r->rflush();
     &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,'last student');  #   &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,'last student');
     return;      return;
 }      }    
   
Line 939  sub html_finish { Line 969  sub html_finish {
   
 sub StudentAverageTotal {  sub StudentAverageTotal {
     my $Str = '<h3>'.&mt('Summary Tables').'</h3>'.$/;      my $Str = '<h3>'.&mt('Summary Tables').'</h3>'.$/;
     $Str .= '<table border=2 cellspacing="1">'."\n";      $Str .= &Apache::loncommon::start_data_table();
     $Str .= '<tr>'.      $Str .= &Apache::loncommon::start_data_table_header_row().
         '<th>'.&mt('Title').'</th>'.          '<th>'.&mt('Title').'</th>'.
         '<th>'.&mt('Average').'</th>'.          '<th>'.&mt('Average').'</th>'.
         '<th>'.&mt('Maximum').'</th>'.          '<th>'.&mt('Maximum').'</th>'.
         '</tr>'.$/;          &Apache::loncommon::end_data_table_header_row().$/;
     foreach my $seq (@sequences) {      foreach my $seq (@sequences) {
         my $symb = $seq->symb;          my $symb = $seq->symb;
         my $ave;          my $ave;
Line 958  sub StudentAverageTotal { Line 988  sub StudentAverageTotal {
         }          }
         my $max = $Statistics->{$symb}->{'max'};          my $max = $Statistics->{$symb}->{'max'};
         $ave = sprintf("%.2f",$ave);          $ave = sprintf("%.2f",$ave);
         $Str .= '<tr><td>'.$seq->compTitle.'</td>'.          $Str .= &Apache::loncommon::start_data_table_row().
               '<td>'.$seq->compTitle.'</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>'.
               &Apache::loncommon::end_data_table_row()."\n";
     }      }
     $Str .= "</table>\n";      $Str .= &Apache::loncommon::end_data_table()."\n";
     return $Str;      return $Str;
 }  }
   
 sub SingleStudentTotal {  sub SingleStudentTotal {
     return if (! defined($navmap));      return if (! defined($navmap));
     my $student = &Apache::lonstatistics::current_student();      my $student = &Apache::lonstatistics::current_student();
     my $Str = '<h3>'.&mt('Summary table for [_1] ([_2]@[_3])',      my $Str = '<h3>'.&mt('Summary table for [_1] ([_2])',
                          $student->{'fullname'},                           $student->{'fullname'},
                          $student->{'username'},$student->{'domain'}).'</h3>';                           $student->{'username'}.':'.$student->{'domain'}).'</h3>';
     $Str .= $/;      $Str .= $/;
     $Str .= '<table border=2 cellspacing="1">'."\n";      $Str .= &Apache::loncommon::start_data_table()."\n";
     $Str .=       $Str .= 
         '<tr>'.          &Apache::loncommon::start_data_table_header_row().
         '<th>'.&mt('Sequence or Folder').'</th>';          '<th>'.&mt('Sequence or Folder').'</th>';
     if ($chosen_output->{'base'} eq 'tries') {      if ($chosen_output->{'base'} eq 'tries') {
         $Str .= '<th>'.&mt('Parts Correct').'</th>';          $Str .= '<th>'.&mt('Parts Correct').'</th>';
     } else {      } else {
         $Str .= '<th>'.&mt('Score').'</th>';          $Str .= '<th>'.&mt('Score').'</th>';
     }      }
     $Str .= '<th>'.&mt('Maximum').'</th>'."</tr>\n";      $Str .= '<th>'.&mt('Maximum').'</th>'.
               &Apache::loncommon::end_data_table_header_row()."\n";
     my $total = 0;      my $total = 0;
     my $total_max = 0;      my $total_max = 0;
     foreach my $seq (@sequences) {      foreach my $seq (@sequences) {
         my $value = $Statistics->{$seq->symb}->{'score'};          my $value = $Statistics->{$seq->symb}->{'score'};
         my $max = $Statistics->{$seq->symb}->{'max'};          my $max = $Statistics->{$seq->symb}->{'max'};
         $Str .= '<tr><td>'.&HTML::Entities::encode($seq->compTitle).'</td>'.          $Str .= &Apache::loncommon::start_data_table_row().
               '<td>'.&HTML::Entities::encode($seq->compTitle).'</td>'.
             '<td align="right">'.$value.'</td>'.              '<td align="right">'.$value.'</td>'.
                 '<td align="right">'.$max.'</td></tr>'."\n";              '<td align="right">'.$max.'</td>'.
               &Apache::loncommon::end_data_table_row()."\n";
         $total += $value;          $total += $value;
         $total_max +=$max;          $total_max +=$max;
     }      }
     $Str .= '<tr><td><b>'.&mt('Total').'</b></td>'.      $Str .= &Apache::loncommon::start_data_table_row().
           '<td><b>'.&mt('Total').'</b></td>'.
         '<td align="right">'.$total.'</td>'.          '<td align="right">'.$total.'</td>'.
         '<td align="right">'.$total_max."</td></tr>\n";          '<td align="right">'.$total_max.'</td>'.
     $Str .= "</table>\n";          &Apache::loncommon::end_data_table_row()."\n";
       $Str .= &Apache::loncommon::end_data_table()."\n";
     return $Str;      return $Str;
 }  }
   
Line 1147  sub excel_initialize { Line 1184  sub excel_initialize {
     #      #
     # Put the date in there too      # Put the date in there too
     $excel_sheet->write($header_row,$cols_output++,      $excel_sheet->write($header_row,$cols_output++,
                         'Compiled on '.localtime(time),$format->{'h3'});                          &mt('Compiled on [_1]',&Apache::lonlocal::locallocaltime(time)),$format->{'h3'});
     #      #
     $cols_output = 0;      $cols_output = 0;
     $excel_sheet->write($description_row,$cols_output++,      $excel_sheet->write($description_row,$cols_output++,
                         $chosen_output->{'shortdesc'},                          &mt($chosen_output->{'shortdesc'}),
                         $format->{'b'});                          $format->{'b'});
     #      #
     $cols_output = 0;      $cols_output = 0;
Line 1229  sub excel_initialize { Line 1266  sub excel_initialize {
         $formula_data{$symb}->{'Excel:scorecol'}=$cols_output;          $formula_data{$symb}->{'Excel:scorecol'}=$cols_output;
         if ($chosen_output->{'base'} eq 'parts correct total') {          if ($chosen_output->{'base'} eq 'parts correct total') {
             $excel_sheet->write($resource_name_row,$cols_output++,              $excel_sheet->write($resource_name_row,$cols_output++,
                                 'parts correct',                                  &mt('parts correct'),
                                 $format->{'bold'});                                  $format->{'bold'});
         } elsif ($chosen_output->{'sequence_sum'}) {          } elsif ($chosen_output->{'sequence_sum'}) {
             if ($chosen_output->{'correct'}) {              if ($chosen_output->{'correct'}) {
                 # Only reporting the number correct, so do not call it score                  # Only reporting the number correct, so do not call it score
                 $excel_sheet->write($resource_name_row,$cols_output++,                  $excel_sheet->write($resource_name_row,$cols_output++,
                                     'sum',                                      &mt('sum'),
                                     $format->{'bold'});                                      $format->{'bold'});
             } else {              } else {
                 $excel_sheet->write($resource_name_row,$cols_output++,                  $excel_sheet->write($resource_name_row,$cols_output++,
                                     'score',                                      &mt('score'),
                                     $format->{'bold'});                                      $format->{'bold'});
             }              }
         }          }
Line 1249  sub excel_initialize { Line 1286  sub excel_initialize {
             ($first_data_row,$cols_output-1);              ($first_data_row,$cols_output-1);
         if ($chosen_output->{'sequence_max'}) {          if ($chosen_output->{'sequence_max'}) {
             $excel_sheet->write($resource_name_row,$cols_output,              $excel_sheet->write($resource_name_row,$cols_output,
                                 'maximum',                                  &mt('maximum'),
                                 $format->{'bold'});                                  $format->{'bold'});
             $formula_data{$symb}->{'Excel:maxcell'} =               $formula_data{$symb}->{'Excel:maxcell'} = 
                 &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell                  &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell
Line 1263  sub excel_initialize { Line 1300  sub excel_initialize {
         }          }
     }      }
     if ($chosen_output->{'grand_total'}) {      if ($chosen_output->{'grand_total'}) {
         $excel_sheet->write($resource_name_row,$cols_output++,'Total',          $excel_sheet->write($resource_name_row,$cols_output++,&mt('Total'),
                             $format->{'bold'});                              $format->{'bold'});
     }      }
     if ($chosen_output->{'grand_maximum'}) {      if ($chosen_output->{'grand_maximum'}) {
         $excel_sheet->write($resource_name_row,$cols_output++,'Max. Total',          $excel_sheet->write($resource_name_row,$cols_output++,&mt('Max. Total'),
                             $format->{'bold'});                              $format->{'bold'});
     }      }
     $total_formula = $excel_sheet->store_formula($total_formula_string);      $total_formula = $excel_sheet->store_formula($total_formula_string);
Line 1358  sub excel_initialize { Line 1395  sub excel_initialize {
     if ($chosen_output->{'summary_table'}) {      if ($chosen_output->{'summary_table'}) {
         $cols_output = 0;          $cols_output = 0;
         $excel_sheet->write($summary_header_row,$cols_output++,          $excel_sheet->write($summary_header_row,$cols_output++,
                             'Summary Table',$format->{'bold'});                              &mt('Summary Table'),$format->{'bold'});
         if ($chosen_output->{'maximum_row'}) {          if ($chosen_output->{'maximum_row'}) {
             $excel_sheet->write($summary_header_row,$cols_output++,              $excel_sheet->write($summary_header_row,$cols_output++,
                                 'Maximum',$format->{'bold'});                                  &mt('Maximum'),$format->{'bold'});
         }          }
         $excel_sheet->write($summary_header_row,$cols_output++,          $excel_sheet->write($summary_header_row,$cols_output++,
                             'Average',$format->{'bold'});                              &mt('Average'),$format->{'bold'});
         $excel_sheet->write($summary_header_row,$cols_output++,          $excel_sheet->write($summary_header_row,$cols_output++,
                             'Median',$format->{'bold'});                              &mt('Median'),$format->{'bold'});
         $excel_sheet->write($summary_header_row,$cols_output++,          $excel_sheet->write($summary_header_row,$cols_output++,
                             'Std Dev',$format->{'bold'});                              &mt('Std Dev'),$format->{'bold'});
         my $row = $summary_header_row+1;          my $row = $summary_header_row+1;
         foreach my $seq (@sequences) {          foreach my $seq (@sequences) {
             my $symb = $seq->symb;              my $symb = $seq->symb;
Line 1408  sub excel_initialize { Line 1445  sub excel_initialize {
     if ($env{'form.SelectedStudent'}) {      if ($env{'form.SelectedStudent'}) {
         $studentcount = '1';          $studentcount = '1';
     }      }
     if ($studentcount > 1) {      $r->print('<p>'
         $r->print('<h1>'.&mt('Compiling Excel spreadsheet for [_1] students',               .&mt('Compiling Excel spreadsheet for [quant,_1,student]...',$studentcount)
                              $studentcount)."</h1>\n");              ."</p>\n"
     } else {      );
         $r->print('<h1>'.  
                   &mt('Compiling Excel spreadsheet for 1 student').  
                   "</h1>\n");  
     }  
     $r->rflush();      $r->rflush();
     #      #
     # Initialize progress window      # Initialize progress window
     %prog_state=&Apache::lonhtmlcommon::Create_PrgWin      %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,$studentcount);
         ($r,'Excel File Compilation Status',  
          'Excel File Compilation Progress', $studentcount,  
          'inline',undef,'Statistics','stats_status');  
     #      #
     &Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state,      &Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state,
                                           'Processing first student');                                            'Processing first student');
Line 1441  sub excel_outputstudent { Line 1471  sub excel_outputstudent {
     foreach my $field (@to_show) {      foreach my $field (@to_show) {
         my $value = $student->{$field};          my $value = $student->{$field};
         if ($field eq 'comments') {          if ($field eq 'comments') {
             $value = &Apache::lonmsg::retrieve_instructor_comments              $value = &Apache::lonmsgdisplay::retrieve_instructor_comments
                 ($student->{'username'},$student->{'domain'});                  ($student->{'username'},$student->{'domain'});
         }          }
         $excel_sheet->write($rows_output,$cols_output++,$value);          $excel_sheet->write($rows_output,$cols_output++,$value);
Line 1462  sub excel_outputstudent { Line 1492  sub excel_outputstudent {
     my %maximum_cell_translation;      my %maximum_cell_translation;
     foreach my $seq (@sequences) {      foreach my $seq (@sequences) {
         my $symb = $seq->symb;          my $symb = $seq->symb;
           my $randompick = $seq->randompick();
         $cols_output = $formula_data{$symb}->{'Excel:startcol'};          $cols_output = $formula_data{$symb}->{'Excel:startcol'};
         # Keep track of cells to translate in total cell          # Keep track of cells to translate in total cell
         $total_cell_translation{$formula_data{$symb}->{'Excel:scorecell'}} =           $total_cell_translation{$formula_data{$symb}->{'Excel:scorecell'}} = 
Line 1476  sub excel_outputstudent { Line 1507  sub excel_outputstudent {
         if ($chosen_output->{'tries'} || $chosen_output->{'correct'}){          if ($chosen_output->{'tries'} || $chosen_output->{'correct'}){
             ($performance,$performance_length,$score,$seq_max,$rawdata) =              ($performance,$performance_length,$score,$seq_max,$rawdata) =
                 &student_tries_on_sequence($student,\%StudentsData,                  &student_tries_on_sequence($student,\%StudentsData,
                                            $navmap,$seq,'no');                                             $navmap,$seq,'no',$randompick);
         } else {          } else {
             ($performance,$performance_length,$score,$seq_max,$rawdata) =              ($performance,$performance_length,$score,$seq_max,$rawdata) =
                 &student_performance_on_sequence($student,\%StudentsData,                  &student_performance_on_sequence($student,\%StudentsData,
                                                  $navmap,$seq,'no',                                                   $navmap,$seq,'no',
                                                  $chosen_output->{ignore_weight});                                                   $chosen_output->{ignore_weight},
                                                    $randompick);
         }           } 
         if ($chosen_output->{'every_problem'}) {          if ($chosen_output->{'every_problem'}) {
             if ($chosen_output->{'correct'}) {              if ($chosen_output->{'correct'}) {
Line 1563  sub excel_finish { Line 1595  sub excel_finish {
     #      #
     # Tell the user where to get their excel file      # Tell the user where to get their excel file
     $r->print('<br />'.      $r->print('<br />'.
               '<a href="'.$filename.'">Your Excel spreadsheet.</a>'."\n");                '<a href="'.$filename.'">'.&mt('Your Excel spreadsheet').'</a>'."\n");
     $r->rflush();      $r->rflush();
     &excel_cleanup();      &excel_cleanup();
     return;      return;
Line 1634  END Line 1666  END
     #      #
     # Initialize progress window      # Initialize progress window
     my $studentcount = scalar(@Apache::lonstatistics::Students);      my $studentcount = scalar(@Apache::lonstatistics::Students);
     %prog_state=&Apache::lonhtmlcommon::Create_PrgWin      %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,$studentcount);
         ($r,'CSV File Compilation Status',  
          'CSV File Compilation Progress', $studentcount,  
          'inline',undef,'Statistics','stats_status');  
     #      #
     # Open a file      # Open a file
     ($outputfile,$filename) = &Apache::loncommon::create_text_file($r,'csv');      ($outputfile,$filename) = &Apache::loncommon::create_text_file($r,'csv');
Line 1646  END Line 1675  END
     # Datestamp      # Datestamp
     my $description = $env{'course.'.$env{'request.course.id'}.'.description'};      my $description = $env{'course.'.$env{'request.course.id'}.'.description'};
     print $outputfile '"'.&Apache::loncommon::csv_translate($description).'",'.      print $outputfile '"'.&Apache::loncommon::csv_translate($description).'",'.
         '"'.&Apache::loncommon::csv_translate(scalar(localtime(time))).'"'.          '"'.&Apache::loncommon::csv_translate(scalar(&Apache::lonlocal::locallocaltime(time))).'"'.
             "\n";              "\n";
     print $outputfile '"'.      print $outputfile '"'.
         &Apache::loncommon::csv_translate          &Apache::loncommon::csv_translate
Line 1686  END Line 1715  END
         $sequence_row.='"",'x$count;          $sequence_row.='"",'x$count;
         if ($chosen_output->{'sequence_sum'}) {          if ($chosen_output->{'sequence_sum'}) {
             if($chosen_output->{'correct'}) {              if($chosen_output->{'correct'}) {
                 $resource_row .= '"sum",';                  $resource_row .= '"'.&mt('sum').'",';
             } else {              } else {
                 $resource_row .= '"score",';                  $resource_row .= '"'.&mt('score').'",';
             }              }
         }          }
         if ($chosen_output->{'sequence_max'}) {          if ($chosen_output->{'sequence_max'}) {
             $sequence_row.= '"",';              $sequence_row.= '"",';
             $resource_row .= '"maximum possible",';              $resource_row .= '"'.&mt('maximum possible').'",';
         }          }
     }      }
     if ($chosen_output->{'grand_total'}) {      if ($chosen_output->{'grand_total'}) {
         $sequence_row.= '"",';          $sequence_row.= '"",';
         $resource_row.= '"Total",';          $resource_row.= '"'.&mt('Total').'",';
     }       } 
     if ($chosen_output->{'grand_maximum'}) {      if ($chosen_output->{'grand_maximum'}) {
         $sequence_row.= '"",';          $sequence_row.= '"",';
         $resource_row.= '"Maximum",';          $resource_row.= '"'.&mt('Maximum').'",';
     }       } 
     chomp($sequence_row);      chomp($sequence_row);
     chomp($resource_row);      chomp($resource_row);
Line 1723  sub csv_outputstudent { Line 1752  sub csv_outputstudent {
     foreach my $field (@to_show) {      foreach my $field (@to_show) {
         my $value = $student->{$field};          my $value = $student->{$field};
         if ($field eq 'comments') {          if ($field eq 'comments') {
             $value = &Apache::lonmsg::retrieve_instructor_comments              $value = &Apache::lonmsgdisplay::retrieve_instructor_comments
                 ($student->{'username'},$student->{'domain'});                  ($student->{'username'},$student->{'domain'});
         }                  }        
         $Str .= '"'.&Apache::loncommon::csv_translate($value).'",';          $Str .= '"'.&Apache::loncommon::csv_translate($value).'",';
Line 1743  sub csv_outputstudent { Line 1772  sub csv_outputstudent {
     my $total = 0;      my $total = 0;
     my $maximum = 0;      my $maximum = 0;
     foreach my $seq (@sequences) {      foreach my $seq (@sequences) {
           my $randompick = $seq->randompick();
         my ($performance,$performance_length,$score,$seq_max,$rawdata);          my ($performance,$performance_length,$score,$seq_max,$rawdata);
         if ($chosen_output->{'tries'}){          if ($chosen_output->{'tries'}){
             ($performance,$performance_length,$score,$seq_max,$rawdata) =              ($performance,$performance_length,$score,$seq_max,$rawdata) =
                 &student_tries_on_sequence($student,\%StudentsData,                  &student_tries_on_sequence($student,\%StudentsData,
                                            $navmap,$seq,'no');                                             $navmap,$seq,'no',$randompick);
         } else {          } else {
             ($performance,$performance_length,$score,$seq_max,$rawdata) =              ($performance,$performance_length,$score,$seq_max,$rawdata) =
                 &student_performance_on_sequence($student,\%StudentsData,                  &student_performance_on_sequence($student,\%StudentsData,
                                                  $navmap,$seq,'no',                                                   $navmap,$seq,'no',
                                                  $chosen_output->{ignore_weight});                                                   $chosen_output->{ignore_weight},
                                                    $randompick);
         }          }
         if ($chosen_output->{'every_problem'}) {          if ($chosen_output->{'every_problem'}) {
             if ($chosen_output->{'correct'}) {              if ($chosen_output->{'correct'}) {
Line 1806  sub csv_finish { Line 1837  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.'">'.&mt('Your csv file.').'</a>'."\n");                '<a href="'.$filename.'">'.&mt('Your CSV file.').'</a>'."\n");
     $r->rflush();      $r->rflush();
     &csv_cleanup();      &csv_cleanup();
     return;      return;
Line 1824  sub show_star { Line 1855  sub show_star {
     # Escape the popup for JS.      # Escape the popup for JS.
     $popup =~ s/([^-a-zA-Z0-9:;,._ ()|!\/?=&*])/'\\' . sprintf("%lo", ord($1))/ge;      $popup =~ s/([^-a-zA-Z0-9:;,._ ()|!\/?=&*])/'\\' . sprintf("%lo", ord($1))/ge;
           
     return "<span onmouseover='popup_score(this, \"$popup\");return false;' onmouseout='popdown_score();return false;' style='border: 1px solid #339933; margin: -1px;'>$symbol</span>";      return "<span class=\"LC_chrt_popup_exists\" onmouseover='popup_score(this, \"$popup\");return false;' onmouseout='popdown_score();return false;'>$symbol</span>";
 }  }
   
 #######################################################  #######################################################
Line 1853  Inputs: Line 1884  Inputs:
 #######################################################  #######################################################
 #######################################################  #######################################################
 sub student_tries_on_sequence {  sub student_tries_on_sequence {
     my ($student,$studentdata,$navmap,$seq,$links) = @_;      my ($student,$studentdata,$navmap,$seq,$links,$randompick) = @_;
     $links = 'no' if (! defined($links));      $links = 'no' if (! defined($links));
     my $Str = '';      my $Str = '';
     my ($sum,$max) = (0,0);      my ($sum,$max) = (0,0);
Line 1892  sub student_tries_on_sequence { Line 1923  sub student_tries_on_sequence {
                 if ($status eq 'excused') {                  if ($status eq 'excused') {
                     $symbol = 'x';                      $symbol = 'x';
                     $max--;                      $max--;
                 } elsif ($status eq 'correct_by_override') {                  } elsif ($status eq 'correct_by_override' && !$resource->is_task()) {
                     $symbol = '+';                      $symbol = '+';
                     $sum++;                      $sum++;
                 } elsif ($tries > 0) {                  } elsif ($tries > 0) {
Line 1937  sub student_tries_on_sequence { Line 1968  sub student_tries_on_sequence {
             #              #
             if ( ($links eq 'yes' && $symbol ne ' ') ||              if ( ($links eq 'yes' && $symbol ne ' ') ||
                  ($links eq 'all')) {                   ($links eq 'all')) {
                 if (length($symbol) > 1) {  
                     &Apache::lonnet::logthis('length of symbol "'.$symbol.'" > 1');  
                 }  
                 my $link = '/adm/grades'.                  my $link = '/adm/grades'.
                     '?symb='.&Apache::lonnet::escape($resource->symb).                      '?symb='.&escape($resource->shown_symb).
                         '&student='.$student->{'username'}.                          '&student='.$student->{'username'}.
                             '&userdom='.$student->{'domain'}.                              '&userdom='.$student->{'domain'}.
                                 '&command=submission';                                  '&command=submission';
Line 1951  sub student_tries_on_sequence { Line 1979  sub student_tries_on_sequence {
         }          }
         $Str .= $value;          $Str .= $value;
     }      }
     if ($seq->randompick()) {      if ($randompick) {
         $max = $seq->randompick();          $max = $randompick;
     }      }
     if (! $hasdata && $sum == 0) {      if (! $hasdata && $sum == 0) {
         $sum = ' ';          $sum = ' ';
Line 2017  Inputs: Line 2045  Inputs:
 #######################################################  #######################################################
 #######################################################  #######################################################
 sub student_performance_on_sequence {  sub student_performance_on_sequence {
     my ($student,$studentdata,$navmap,$seq,$links,$awarded_only) = @_;      my ($student,$studentdata,$navmap,$seq,$links,$awarded_only,$randompick) = @_;
     $links = 'no' if (! defined($links));      $links = 'no' if (! defined($links));
     my $Str = ''; # final result string      my $Str = ''; # final result string
     my ($score,$max) = (0,0);      my ($score,$max) = (0,0);
Line 2026  sub student_performance_on_sequence { Line 2054  sub student_performance_on_sequence {
     my @ScoreData = ();      my @ScoreData = ();
     my $partscore;      my $partscore;
     my $hasdata = 0; # flag, 0 if there were no submissions on the sequence      my $hasdata = 0; # flag, 0 if there were no submissions on the sequence
       my %ptsfreq;
     foreach my $resource (&get_resources($navmap,$seq)) {      foreach my $resource (&get_resources($navmap,$seq)) {
         my $symb = $resource->symb;          my $symb = $resource->symb;
         my $resource_data = $studentdata->{$symb};          my $resource_data = $studentdata->{$symb};
           my $resmax = 0;
         foreach my $part (@{$resource->parts()}) {          foreach my $part (@{$resource->parts()}) {
             $partscore = undef;              $partscore = undef;
             my $weight;              my $weight;
Line 2044  sub student_performance_on_sequence { Line 2074  sub student_performance_on_sequence {
             }              }
             #              #
             $max += $weight; # see the 'excused' branch below...              $max += $weight; # see the 'excused' branch below...
               $resmax += $weight;
             $performance_length++; # one character per part              $performance_length++; # one character per part
             $symbol = ' '; # default to space              $symbol = ' '; # default to space
             #              #
Line 2096  sub student_performance_on_sequence { Line 2127  sub student_performance_on_sequence {
             #              #
             if ( ($links eq 'yes' && $symbol ne ' ') || ($links eq 'all')) {              if ( ($links eq 'yes' && $symbol ne ' ') || ($links eq 'all')) {
                 my $link = '/adm/grades' .                  my $link = '/adm/grades' .
                     '?symb='.&Apache::lonnet::escape($symb).                      '?symb='.&escape($resource->shown_symb).
                     '&student='.$student->{'username'}.                      '&student='.$student->{'username'}.
                     '&userdom='.$student->{'domain'}.                      '&userdom='.$student->{'domain'}.
                     '&command=submission';                      '&command=submission';
Line 2104  sub student_performance_on_sequence { Line 2135  sub student_performance_on_sequence {
             }              }
             $Str .= $symbol;              $Str .= $symbol;
         }          }
           if ($ptsfreq{$resmax}) {
               $ptsfreq{$resmax} ++;
           } else {
               $ptsfreq{$resmax} = 1;
           }
       }
       if ($randompick) {
           my @uniquetotals = keys(%ptsfreq);
           if ((@uniquetotals = 1) && ($ptsfreq{$uniquetotals[0]} > 0)) {
               $max = $max * $randompick/$ptsfreq{$uniquetotals[0]};
           }
     }      }
     if (! $hasdata && $score == 0) {      if (! $hasdata && $score == 0) {
         $score = ' ';          $score = ' ';

Removed from v.1.135  
changed lines
  Added in v.1.167


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.