Diff for /loncom/interface/statistics/lonstudentsubmissions.pm between versions 1.44 and 1.68.2.1

version 1.44, 2006/05/05 20:03:43 version 1.68.2.1, 2012/05/12 03:52:02
Line 34  use Apache::loncoursedata(); Line 34  use Apache::loncoursedata();
 use Apache::lonstatistics;  use Apache::lonstatistics;
 use Apache::lonlocal;  use Apache::lonlocal;
 use Apache::lonstathelpers;  use Apache::lonstathelpers;
   use Apache::lonmsgdisplay();
 use HTML::Entities();  use HTML::Entities();
 use Time::Local();  use Time::Local();
 use Spreadsheet::WriteExcel();  use Spreadsheet::WriteExcel();
   use lib '/home/httpd/lib/perl/';
   use LONCAPA;
     
   
 my @SubmitButtons = ({ name => 'SelectAnother',  my @SubmitButtons = ({ name => 'SelectAnother',
                        text => 'Choose a different Problem' },                         text => 'Choose a different Problem' },
Line 58  sub BuildStudentSubmissionsPage { Line 62  sub BuildStudentSubmissionsPage {
     #      #
     &Apache::lonstatistics::PrepareClasslist();      &Apache::lonstatistics::PrepareClasslist();
     #      #
       $r->print( &Apache::lonhtmlcommon::breadcrumbs('Student Submission Reports'));
     $r->print(&CreateInterface());      $r->print(&CreateInterface());
     #      #
     my @Students = @Apache::lonstatistics::Students;      my @Students = @Apache::lonstatistics::Students;
     #      #
     if (@Students < 1) {      if (@Students < 1) {
         $r->print('<h2>There are no students in the sections selected</h2>');          $r->print('<div class="LC_warning">'
                    .&mt('There are no students in the sections selected.')
                    .'</div>');
     }      }
     #      #
     my @CacheButtonHTML =       my @CacheButtonHTML = 
         &Apache::lonstathelpers::manage_caches($r,'Statistics','stats_status',          &Apache::lonstathelpers::manage_caches($r,'Statistics','stats_status',
                                    '<h3>'.&mt('Loading student data').'</h3>');                                     '<div class="LC_info">'.&mt('Loading student data...').'</div>');
     $r->rflush();      $r->rflush();
     #      #
       my %anoncounter =
            &Apache::lonnet::dump('nohist_anonsurveys',
                           $env{'course.'.$env{'request.course.id'}.'.domain'},
                           $env{'course.'.$env{'request.course.id'}.'.num'});
     if (exists($env{'form.problemchoice'}) &&       if (exists($env{'form.problemchoice'}) && 
         ! exists($env{'form.SelectAnother'})) {          ! exists($env{'form.SelectAnother'})) {
         foreach my $button (@SubmitButtons) {          foreach my $button (@SubmitButtons) {
Line 92  sub BuildStudentSubmissionsPage { Line 103  sub BuildStudentSubmissionsPage {
         # Determine which problems we are to analyze          # Determine which problems we are to analyze
         my @Symbs =           my @Symbs = 
             &Apache::lonstathelpers::get_selected_symbs('problemchoice');              &Apache::lonstathelpers::get_selected_symbs('problemchoice');
         foreach my $selected (@Symbs) {  
             $r->print('<input type="hidden" name="problemchoice" value="'.          # If there are multi-part problems with anonymous survey and named
                       $selected.'" />'.$/);          # parts check if named was picked for display.
           #
           my %mixed_named; 
           foreach my $envkey (%env) {
               if ($envkey =~ /^form\.mixed_(\d+:\d+)$/) {
                   my $item = $1; 
                   if ($env{$envkey} =~ /^symb_(.+)$/) {
                       my $symb = &unescape($1);
                       if (ref($mixed_named{$symb}) eq 'ARRAY') {
                           push(@{$mixed_named{$symb}},$item);
                       } else {
                           @{$mixed_named{$symb}} = ($item);
                       }
                   }
               }
         }          }
         #          #
         # Get resource objects          # Get resource objects
         my $navmap = Apache::lonnavmaps::navmap->new();          my $navmap = Apache::lonnavmaps::navmap->new();
         if (!defined($navmap)) {          if (!defined($navmap)) {
             $r->print('<h1>'.&mt("Internal error").'</h1>');              foreach my $selected (@Symbs) {
                   $r->print('<input type="hidden" name="problemchoice" value="'.
                             &escape($selected).'" />'.$/);
                   if (ref($mixed_named{$selected}) eq 'ARRAY') {
                       foreach my $item (@{$mixed_named{$selected}}) {
                           $r->print('<input type="hidden" name="mixed_'.$item.'" value="'.&escape($selected).'" />'.$/);
                       }
                   }
               }
               $r->print('<div class="LC_error">'.&mt("Internal error").'</div>');
             return;              return;
         }          }
         my %already_seen;          my %already_seen;
         my @Problems;          my (@Problems,@anonProbs,@namedProbs,$show_named);
         foreach my $symb (@Symbs) {          foreach my $symb (@Symbs) {
             my $resource = $navmap->getBySymb($symb);              my $resource = $navmap->getBySymb($symb);
             push(@Problems,$resource);              my ($hasanon,$hasnamed);
               if (ref($resource)) {
                   foreach my $partid (@{$resource->parts}) {
                       if (($anoncounter{$symb."\0".$partid}) || ($resource->is_anonsurvey($partid))) {
                           unless (exists($mixed_named{$symb})) {
                               $hasanon = 1;
                           }
                       } else {
                           $hasnamed = 1;
                       }
                   }
                   if ($hasanon) {
                       push(@anonProbs,$resource);
                   } elsif ($hasnamed) {
                       push(@namedProbs,$resource);
                   }
               }
           }
           if (@namedProbs > 0) {
               @Problems = @namedProbs;
               $show_named = 1;
           } elsif (@anonProbs > 0) {
               @Problems = @anonProbs;
           } 
           foreach my $selected (@Symbs) {
               $r->print('<input type="hidden" name="problemchoice" value="'.
                         &escape($selected).'" />'.$/);
               if (ref($mixed_named{$selected}) eq 'ARRAY') {
                   foreach my $item (@{$mixed_named{$selected}}) {
                       $r->print('<input type="hidden" name="mixed_'.$item.'" value="'.&escape($selected).'" />'.$/);
                   }
               }
         }          }
         #           # If these are to be anonymized, do a random shuffle of @Students. 
         $r->print('<h4>'.          unless ($show_named) {
               &array_shuffle(\@Students);
           }
           #
   
           my $threshold = $env{'course.'.$env{'request.course.id'}.'.internal.anonsurvey_threshold'};
           if ($threshold eq '') {
               my %domconfig =
                   &Apache::lonnet::get_dom('configuration',['coursedefaults'],
                                           $env{'course.'.$env{'request.course.id'}.'.domain'});
               if (ref($domconfig{'coursedefaults'}) eq 'HASH') {
                   $threshold = $domconfig{'coursedefaults'}{'anonsurvey_threshold'};
                   if ($threshold eq '') {
                       $threshold = 10;
                   }
               } else {
                   $threshold = 10;
               }
           }
           $r->print('<p>'.
                   &Apache::lonstatistics::section_and_enrollment_description().                    &Apache::lonstatistics::section_and_enrollment_description().
                   '</h4>');                    '</p>');
         if (! scalar(@Problems) || ! defined($Problems[0])) {          if (! scalar(@Problems) || ! defined($Problems[0])) {
             $r->print('resource is undefined');              $r->print(&mt('resource is undefined'));
           } elsif (!$show_named && @Students < $threshold) {
               $r->print(&mt('The number of students matching the selection criteria is too few for display of submission data for anonymous surveys.').'<br />'.&mt('There must be at least [quant,_1,student].',$threshold).' '.&mt('Contact a Domain Coordinator if you need the threshold to be changed for this course.'));
         } else {          } else {
             if (scalar(@Problems) == 1) {              if (scalar(@Problems) == 1) {
                 my $resource = $Problems[0];                  my $resource = $Problems[0];
Line 126  sub BuildStudentSubmissionsPage { Line 212  sub BuildStudentSubmissionsPage {
                 }                  }
             }              }
             if ($env{'form.output'} eq 'excel') {              if ($env{'form.output'} eq 'excel') {
                 &prepare_excel_output($r,\@Problems,\@Students);                  &prepare_excel_output($r,\@Problems,\@Students,\%anoncounter,$show_named);
             } elsif ($env{'form.output'} eq 'csv') {              } elsif ($env{'form.output'} eq 'csv') {
                 &prepare_csv_output($r,\@Problems,\@Students);                  &prepare_csv_output($r,\@Problems,\@Students,\%anoncounter,$show_named);
             } else {              } else {
                 &prepare_html_output($r,\@Problems,\@Students);                  &prepare_html_output($r,\@Problems,\@Students,\%anoncounter,$show_named);
             }              }
         }          }
         $r->print('<hr />');          $r->print('<hr />');
Line 139  sub BuildStudentSubmissionsPage { Line 225  sub BuildStudentSubmissionsPage {
                   &mt('Prepare Report').'" />');                    &mt('Prepare Report').'" />');
         $r->print('&nbsp;'x5);          $r->print('&nbsp;'x5);
         $r->print('<p>'.          $r->print('<p>'.
                   &mt('Computing correct answers greatly increasese the amount of time required to prepare a report.').                    &mt('Computing correct answers greatly increases the amount of time required to prepare a report.').
                   '</p>');                    '</p>');
         $r->print('<p>'.          $r->print('<p>'.
                   &mt('please select problems and use the <b>Prepare Report</b> button to continue.').                    &mt('Please select problems and use the [_1]Prepare Report[_2] button to continue.','<b>','</b>').
                   '</p>');                    '</p>');
         $r->print(&Apache::lonstathelpers::MultipleProblemSelector          $r->print(&Apache::lonstathelpers::MultipleProblemSelector
                   (undef,'problemchoice','Statistics'));                    (undef,'problemchoice','Statistics',\%anoncounter));
     }      }
 }  }
   
   sub array_shuffle {
       my $array = shift;
       return unless (ref($array) eq 'ARRAY');
       my $i = scalar(@$array);
       my $j;
       foreach my $item (@$array) {
           --$i;
           $j = int(rand($i+1));
           next if($i == $j);
           @$array [$i,$j] = @$array[$j,$i];
       }
       return @$array;
   }
   
 ##  ##
 ## get_extra_response_headers  ## get_extra_response_headers
 ##  ##
 sub get_extra_response_headers {  sub get_extra_response_headers {
       my ($show_named) = @_;
     my @extra_resp_headers;      my @extra_resp_headers;
     if ($env{'form.correctans'} eq 'true') {      if ($env{'form.correctans'} eq 'true') {
         push(@extra_resp_headers,'Correct');          push(@extra_resp_headers,'Correct');
     }       }
     if ($env{'form.prob_status'} eq 'true') {      if ($show_named) { 
         push(@extra_resp_headers,'Award Detail');           if ($env{'form.prob_status'} eq 'true') {
         push(@extra_resp_headers,'Time');              push(@extra_resp_headers,'Award Detail'); 
         push(@extra_resp_headers,'Attempt');              push(@extra_resp_headers,'Time');
         push(@extra_resp_headers,'Awarded');              push(@extra_resp_headers,'Attempt');
               push(@extra_resp_headers,'Awarded');
           }
     }      }
     return @extra_resp_headers;      return @extra_resp_headers;
 }  }
Line 206  sub get_headers { Line 309  sub get_headers {
 #########################################################  #########################################################
 #########################################################  #########################################################
 sub prepare_html_output {  sub prepare_html_output {
     my ($r,$problems,$students) = @_;      my ($r,$problems,$students,$anoncounter,$show_named) = @_;
     my $c = $r->connection();      my $c = $r->connection();
     #      #
     # Set a flag for the case when there is just one problem      # Set a flag for the case when there is just one problem
Line 217  sub prepare_html_output { Line 320  sub prepare_html_output {
     }      }
     #      #
     # Compute the number of columns per response      # Compute the number of columns per response
     my @extra_resp_headers = &get_extra_response_headers();      my @extra_resp_headers = &get_extra_response_headers($show_named);
     #      #
     # Create the table header      # Create the table header
     my @student_columns = ('username','domain','id','section');      my @student_columns = &get_student_columns($show_named);
     #  
     my %headers;      my %headers;
     my $student_column_count = scalar(@student_columns);      my $student_column_count = scalar(@student_columns);
     $headers{'problem'} = qq{<th colspan="$student_column_count">\&nbsp;</th>};      $headers{'problem'} = qq{<th colspan="$student_column_count">\&nbsp;</th>};
     foreach (@student_columns) {      foreach my $field (@student_columns) {
         $headers{'student'}.= '<th>'.ucfirst($_).'</th>';          $headers{'student'}.= '<th>'.&mt(ucfirst($field)).'</th>';
     }      }
     #      #
     # we put the headers into the %headers hash      # we put the headers into the %headers hash
     my $total_col = scalar(@student_columns);      my $total_col = $student_column_count;
     my $nonempty_part_headers = 0;      my $nonempty_part_headers = 0;
     #      #
     my %problem_analysis;      my %problem_analysis;
     foreach my $prob (@$problems) {      foreach my $prob (@$problems) {
         my %analysis = &Apache::lonstathelpers::get_problem_data($prob->src);          my %analysis = &Apache::lonstathelpers::get_problem_data($prob->src);
         $problem_analysis{$prob->src}=\%analysis;          $problem_analysis{$prob->src}=\%analysis;
           my $symb = $prob->symb();
         #          #
         my $prob_span = 0;          my $prob_span = 0;
         my $single_part = 0;          my $single_part = 0;
         if (scalar(@{$prob->parts}) == 1) {          if (scalar(@{$prob->parts}) == 1) {
             $single_part = 1;              $single_part = 1;
         }          }
           my $shown_parts = 0;
         foreach my $partid (@{$prob->parts}) {          foreach my $partid (@{$prob->parts}) {
               if (($prob->is_anonsurvey($partid)) || ($anoncounter->{$symb."\0".$partid})) {
                   next if ($show_named);
               } else {
                   next unless ($show_named);
               }
               $shown_parts ++;
             my $part_span = 0;              my $part_span = 0;
             my $responses = [$prob->responseIds($partid)];              my $responses = [$prob->responseIds($partid)];
             my $resptypes = [$prob->responseType($partid)];              my $resptypes = [$prob->responseType($partid)];
Line 260  sub prepare_html_output { Line 370  sub prepare_html_output {
                     $headers{'response'} .=                      $headers{'response'} .=
                         '<th colspan="'.scalar(@headers).'">'.                          '<th colspan="'.scalar(@headers).'">'.
                         &mt('Response [_1]',$responses->[$i]).'</th>';                          &mt('Response [_1]',$responses->[$i]).'</th>';
                     $headers{'student'}.= '<th>'.join('</th><th><nobr>',                      $headers{'student'}.= '<th><span class="LC_nobreak">'.
                                             join('</span></th><th><span class="LC_nobreak">',
                                                       @headers).                                                        @headers).
                                                           '</nobr></th>';                                                            '</span></th>';
                 }                  }
             }              }
             if ($part_span == 0) {              if ($part_span == 0) {
Line 279  sub prepare_html_output { Line 390  sub prepare_html_output {
                 $headers{'part'} .= qq{<th colspan="$part_span">$tmpname</th>};                  $headers{'part'} .= qq{<th colspan="$part_span">$tmpname</th>};
                 $nonempty_part_headers = 1;                  $nonempty_part_headers = 1;
             } else {              } else {
                 $headers{'part'} .= qq{<th colspan="$part_span">&nbsp</th>};                  $headers{'part'} .= qq{<th colspan="$part_span">&nbsp;</th>};
             }              }
             $prob_span += $part_span;              $prob_span += $part_span;
         }          }
           next if (!$shown_parts);
         my $title = $prob->compTitle;          my $title = $prob->compTitle;
         if ($prob_span > 0) {          if ($prob_span > 0) {
             $headers{'problem'}.= qq{<th colspan="$prob_span">$title</th>};              $headers{'problem'}.= qq{<th colspan="$prob_span">$title</th>};
Line 300  sub prepare_html_output { Line 412  sub prepare_html_output {
             qq{<th colspan="$student_column_count">\&nbsp;</th>}.              qq{<th colspan="$student_column_count">\&nbsp;</th>}.
             $headers{'response'};              $headers{'response'};
     }      }
     my $full_header = $/.'<table>'.$/;      #my $full_header = $/.'<table>'.$/;
       my $full_header = $/.&Apache::loncommon::start_data_table().$/;
     $full_header .= '<tr align="left">'.$headers{'problem'}.'</tr>'.$/;      $full_header .= '<tr align="left">'.$headers{'problem'}.'</tr>'.$/;
     if ($nonempty_part_headers) {      if ($nonempty_part_headers) {
         $full_header .= '<tr align="left">'.$headers{'part'}.'</tr>'.$/;          $full_header .= '<tr align="left">'.$headers{'part'}.'</tr>'.$/;
Line 311  sub prepare_html_output { Line 424  sub prepare_html_output {
     # Main loop      # Main loop
     my $count;      my $count;
     $r->print($/.$full_header.$/);      $r->print($/.$full_header.$/);
     my $row_class = 'odd';   # css   
     foreach my $student (@$students) {      foreach my $student (@$students) {
         my $student_row_data;          my $student_row_data;
         if ($count++ >= 30) {          if ($count++ >= 30) {
             $r->print('</table>'.$/.$full_header.$/);              $r->print(&Apache::loncommon::end_data_table().$/.$full_header.$/);
             $count = 0;              $count = 0;
         }          }
         last if ($c->aborted());          last if ($c->aborted());
         foreach my $field (@student_columns) {          if ($show_named) {
             $student_row_data .=               foreach my $field (@student_columns) {
                 '<td valign="top">'.$student->{$field}.'</td>';                  $student_row_data .= '<td valign="top">';
                   # handle comments like in lonstudentassessment.pm
                   if($field eq 'comments') {
                       $student_row_data .= 
                           '<a href="/adm/'.$student->{'domain'}.'/'.
                           $student->{'username'}.'/'.'aboutme#coursecomment">'.&mt('Comments').'</a>';
                   } else {
                       $student_row_data .= $student->{$field};
                   }
                   $student_row_data .= '</td>';
               }
           } else {
               $student_row_data = '<td valign="top" colspan="'.$student_column_count.'">'.&mt('Anonymized').'</td>';
         }          }
         #          #
         # Figure out what it is we need to output for this student          # Figure out what it is we need to output for this student
Line 329  sub prepare_html_output { Line 453  sub prepare_html_output {
         my %prob_data;          my %prob_data;
         my $maxrow;          my $maxrow;
         foreach my $prob (@$problems) {          foreach my $prob (@$problems) {
             $prob_data{$prob->symb}={};              my $symb = $prob->symb;
               $prob_data{$symb}={};
             foreach my $partid (@{$prob->parts}) {              foreach my $partid (@{$prob->parts}) {
                   if (($prob->is_anonsurvey($partid)) || ($anoncounter->{$symb."\0".$partid})) {
                       next if ($show_named);
                   } else {
                       next unless ($show_named);
                   }
                 my @responses = $prob->responseIds($partid);                  my @responses = $prob->responseIds($partid);
                 my @response_type = $prob->responseType($partid);                  my @response_type = $prob->responseType($partid);
                 for (my $i=0;$i<=$#responses;$i++) {                  for (my $i=0;$i<=$#responses;$i++) {
Line 395  sub prepare_html_output { Line 525  sub prepare_html_output {
         next if (! $maxrow && ! scalar(@essays));          next if (! $maxrow && ! scalar(@essays));
         #          #
         # Go through the problem data and output a row.          # Go through the problem data and output a row.
         if ($row_class eq 'even') {  
             $row_class = 'odd';   
         } else {  
             $row_class = 'even';   
         }  
         my $printed_something;          my $printed_something;
         for (my $rows_output = 0;$rows_output<$maxrow;$rows_output++) {          for (my $rows_output = 0;$rows_output<$maxrow;$rows_output++) {
             my $html;              my $html;
Line 423  sub prepare_html_output { Line 548  sub prepare_html_output {
                 }                  }
             }              }
             if (! $no_data) {              if (! $no_data) {
                 $r->print(qq{<tr class="$row_class">$student_row_data$html</tr>}.$/);                  $r->print(&Apache::loncommon::start_data_table_row().$student_row_data.$html.
                             &Apache::loncommon::end_data_table_row().$/);
                 $printed_something=1;                  $printed_something=1;
             }              }
         }          }
         if (@essays) {          if (@essays) {
             my $tr = qq{<tr class="$row_class">};              my $tr = &Apache::loncommon::start_data_table_row();
             my $td = qq{<td  valign="top" class="essay" colspan="$total_col">};              my $td = qq{<td  valign="top" class="essay" colspan="$total_col">};
             if (! $printed_something) {              if (! $printed_something) {
                 $r->print($tr.$student_row_data.'</tr>'.$/);                  $r->print($tr.$student_row_data.&Apache::loncommon::end_data_table_row().$/);
             }              }
             $r->print($tr.$td.              $r->print($tr.$td.
                       join('</td></tr>'.$/.$tr.$td,@essays).'</td></tr>'.$/);                        join('</td></tr>'.$/.$tr.$td,@essays).'</td></tr>'.$/);
             undef(@essays);              undef(@essays);
         }          }
     } # end of student loop      } # end of student loop
       $r->print(&Apache::loncommon::end_data_table().$/);
     return;      return;
 }  }
   
Line 496  sub html_essay_results { Line 623  sub html_essay_results {
         if (defined($respid)) {          if (defined($respid)) {
             $id .= ' '.$respid;              $id .= ' '.$respid;
         }          }
         $Str .= '<nobr>'.$id.'</nobr>'.('&nbsp;'x4);          $Str .= '<span class="LC_nobreak">'.$id.'</span>'.('&nbsp;'x4);
     }      }
     #      #
     shift(@$headers); # Get rid of the Submission header      shift(@$headers); # Get rid of the Submission header
Line 505  sub html_essay_results { Line 632  sub html_essay_results {
         $correct = &html_format_essay_sub($response->{'Correct'});          $correct = &html_format_essay_sub($response->{'Correct'});
         shift(@$headers);          shift(@$headers);
     }      }
     $Str .= '<nobr>'.      $Str .= '<span class="LC_nobreak">'.
         join('',          join('',
              map {               map {
                  ('&nbsp;'x4).&mt($_.': [_1]',$response->{$_});                   ('&nbsp;'x4).&mt($_.': [_1]',$response->{$_});
              } @$headers).'</nobr>';               } @$headers).'</span>';
     if (@$headers || ! $single_response) {      if (@$headers || ! $single_response) {
         $Str .= '<br />';          $Str .= '<br />';
     }      }
Line 555  sub html_non_essay_results { Line 682  sub html_non_essay_results {
         return '';          return '';
     }      }
     #       # 
     my $submission = &HTML::Entities::decode(&Apache::lonnet::unescape($response->{'Submission'}));       my $submission = &HTML::Entities::decode(&unescape($response->{'Submission'})); 
     return '' if (! defined($submission) || $submission eq '');      return '' if (! defined($submission) || $submission eq '');
     $submission =~ s/\\\"/\"/g;      $submission =~ s/\\\"/\"/g;
     $submission =~ s/\\\'/\'/g;      $submission =~ s/\\\'/\'/g;
     if ($resptype eq 'radiobutton') {      if ($resptype eq 'radiobutton') {
         $submission = &HTML::Entities::encode($submission,'<>&"');          $submission = &HTML::Entities::encode($submission,'<>&"');
         $submission =~ s/=([^=])$//;          $submission =~ s/=([^=])$//;
         $submission = '<nobr>'.$submission.'</nobr>';          $submission = '<span class="LC_nobreak">'.$submission.'</span>';
     }      }
     $response->{'Submission'} = $submission;      $response->{'Submission'} = $submission;
     #      #
Line 570  sub html_non_essay_results { Line 697  sub html_non_essay_results {
     if ($resptype =~ /^(option|match|rank)$/) {      if ($resptype =~ /^(option|match|rank)$/) {
         my %submission =           my %submission = 
             map {               map { 
                 my ($foil,$value) = split('=',&Apache::lonnet::unescape($_));                  my ($foil,$value) = split('=',&unescape($_));
                 ($foil,$value);                  ($foil,$value);
             } split('&',$response->{'Submission'});              } split('&',$response->{'Submission'});
         my %correct;          my %correct;
         if (exists($response->{'Correct'})) {          if (exists($response->{'Correct'})) {
             %correct =               %correct = 
                 map {                   map { 
                     my ($foil,$value)=split('=',&Apache::lonnet::unescape($_));                      my ($foil,$value)=split('=',&unescape($_));
                     ($foil,$value);                      ($foil,$value);
                 } split('&',$response->{'Correct'});                  } split('&',$response->{'Correct'});
         }          }
Line 619  sub html_non_essay_results { Line 746  sub html_non_essay_results {
 #########################################################  #########################################################
 #########################################################  #########################################################
 sub prepare_excel_output {  sub prepare_excel_output {
     my ($r,$Problems,$Students) = @_;      my ($r,$Problems,$Students,$anoncounter,$show_named) = @_;
     my $c = $r->connection();      my $c = $r->connection();
     #      #
     #      #
     # Determine the number of columns in the spreadsheet      # Determine the number of columns in the spreadsheet
     my $columncount = 3; # username, domain, id      my $columncount = 3; # username, domain, id
     my @extra_resp_headers = &get_extra_response_headers();      my @extra_resp_headers = &get_extra_response_headers($show_named);
     my $lastprob;      my $lastprob;
     my %problem_analysis;      my %problem_analysis;
     foreach my $prob (@$Problems) {      foreach my $prob (@$Problems) {
           my $symb = $prob->symb();
         my %analysis = &Apache::lonstathelpers::get_problem_data($prob->src);          my %analysis = &Apache::lonstathelpers::get_problem_data($prob->src);
         $problem_analysis{$prob->src}=\%analysis;          $problem_analysis{$prob->src}=\%analysis;
         foreach my $partid (@{$prob->parts}) {          foreach my $partid (@{$prob->parts}) {
               if (($prob->is_anonsurvey($partid)) || ($anoncounter->{$symb."\0".$partid})) {
                   next if ($show_named);
               } else {
                   next unless ($show_named);
               }
   
             my $responses = [$prob->responseIds($partid)];              my $responses = [$prob->responseIds($partid)];
             my $resptypes = [$prob->responseType($partid)];              my $resptypes = [$prob->responseType($partid)];
             for (my $i=0;$i<scalar(@$responses);$i++) {              for (my $i=0;$i<scalar(@$responses);$i++) {
Line 647  sub prepare_excel_output { Line 781  sub prepare_excel_output {
         $lastprob = $prob;          $lastprob = $prob;
     }      }
     if ($columncount > 255) {      if ($columncount > 255) {
         $r->print('<h1>'.&mt('Unable to complete request').'</h1>'.$/.          $r->print('<p class="LC_error">'.&mt('Unable to complete request').'</p>'.$/.
                   '<p>'.&mt('LON-CAPA is unable to produce your Excel spreadsheet because your selections will result in more than 255 columns.  Excel allows only 255 columns in a spreadsheet.').'</p>'.$/.                    '<p class="LC_warning">'.&mt('LON-CAPA is unable to produce your Excel spreadsheet because your selections will result in more than 255 columns.  Excel allows only 255 columns in a spreadsheet.').'</p>'.$/.
                   '<p>'.&mt('Consider selecting fewer problems to generate reports on, or reducing the number of items per problem.  Or use HTML or CSV output.').'</p>'.$/.                    '<p class="LC_warning">'.&mt('Consider selecting fewer problems to generate reports on, or reducing the number of items per problem.  Or use HTML or CSV output.').'</p>'.$/);
                   '<p>'.&mt('The last problem that will fit in the current spreadsheet is [_1].',$lastprob->compTitle).'</p>');          if (ref($lastprob)) {
               $r->print('<p>'.&mt('The last problem that will fit in the current spreadsheet is [_1].',$lastprob->compTitle).'</p>');
           }
         $r->rflush();          $r->rflush();
         return;          return;
     }      }
     #      #
     # Print out a message telling them what we are doing      # Print out a message telling them what we are doing
     if (scalar(@$Problems) > 1) {      if (scalar(@$Problems) > 1) {
         $r->print('<h2>'.          $r->print('<p class="LC_info">'.
                   &mt('Preparing Excel spreadsheet of student responses to [_1] problems',                    &mt('Preparing Excel spreadsheet of student responses to [_1] problems',
                       scalar(@$Problems)).                        scalar(@$Problems)).
                   '</h2>');                    '</p>');
     } else {      } else {
         $r->print('<h2>'.          $r->print('<p class="LC_info">'.
                   &mt('Preparing Excel spreadsheet of student responses').                    &mt('Preparing Excel spreadsheet of student responses').
                   '</h2>');                    '</p>');
     }      }
     $r->rflush();      $r->rflush();
     #      #
Line 672  sub prepare_excel_output { Line 808  sub prepare_excel_output {
     my ($workbook,$filename,$format) =       my ($workbook,$filename,$format) = 
         &Apache::loncommon::create_workbook($r);          &Apache::loncommon::create_workbook($r);
     return if (! defined($workbook));      return if (! defined($workbook));
     my $worksheet  = $workbook->addworksheet('Student Submission Data');  
       # Worksheet name
       # The length of a worksheet name in Excel 95 is limited to 31 characters.
       # Let's make sure to not exceed the maximum length in the translation files.
       # Otherwise, no Excel file would be created.
       my $worksheetname = &mt('Student Submission Data');
       if (length($worksheetname) > 31) {
           # nice way to cut off too long name
           $worksheetname = substr($worksheetname,0,28,).'...';
       }
       my $worksheet  = $workbook->addworksheet($worksheetname);
     #      #
     # Add headers to the worksheet      # Add headers to the worksheet
     my $rows_output = 0;      my $rows_output = 0;
Line 685  sub prepare_excel_output { Line 831  sub prepare_excel_output {
     my $partid_row = $rows_output++;      my $partid_row = $rows_output++;
     my $respid_row = $rows_output++;      my $respid_row = $rows_output++;
     my $header_row = $rows_output++;      my $header_row = $rows_output++;
     $worksheet->write($title_row ,0,'Problem Title',$format->{'bold'});      $worksheet->write($title_row ,0,&mt('Problem Title'),$format->{'bold'});
     $worksheet->write($partid_row,0,'Part ID',$format->{'bold'});      $worksheet->write($partid_row,0,&mt('Part ID'),$format->{'bold'});
     $worksheet->write($respid_row,0,'Response ID',$format->{'bold'});      $worksheet->write($respid_row,0,&mt('Response ID'),$format->{'bold'});
     # Student headers      # Student headers
     my @StudentColumns = ('username','domain','id','section');      my @StudentColumns = &get_student_columns($show_named);
     foreach (@StudentColumns) {      foreach my $field (@StudentColumns) {
         $worksheet->write($header_row,$cols_output++,ucfirst($_),          $worksheet->write($header_row,$cols_output++,&mt(ucfirst($field)),
                           $format->{'bold'});                            $format->{'bold'});
     }      }
     # Problem headers      # Problem headers
     my %start_col;      my %start_col;
     foreach my $prob (@$Problems) {      foreach my $prob (@$Problems) {
         my $title = $prob->compTitle;          my $title = $prob->compTitle;
           my $symb = $prob->symb();
         $worksheet->write($title_row,$cols_output,          $worksheet->write($title_row,$cols_output,
                           $title,$format->{'h3'});                            $title,$format->{'h3'});
         foreach my $partid (@{$prob->parts}) {          foreach my $partid (@{$prob->parts}) {
               if (($prob->is_anonsurvey($partid)) || ($anoncounter->{$symb."\0".$partid})) {
                   next if ($show_named);
               } else {
                   next unless ($show_named);
               }
             $worksheet->write($partid_row,$cols_output,              $worksheet->write($partid_row,$cols_output,
                               $prob->part_display($partid));                                $prob->part_display($partid));
             my $responses = [$prob->responseIds($partid)];              my $responses = [$prob->responseIds($partid)];
Line 727  sub prepare_excel_output { Line 879  sub prepare_excel_output {
     }      }
     #      #
     # Populate the worksheet with the student data      # Populate the worksheet with the student data
     my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin      my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,scalar(@$Students));
         ($r,'Excel File Compilation Status',  
          'Excel File Compilation Progress',   
          scalar(@$Students),'inline',undef,'Statistics','stats_status');  
     my $max_row = $rows_output;      my $max_row = $rows_output;
     foreach my $student (@$Students) {      foreach my $student (@$Students) {
         last if ($c->aborted());          last if ($c->aborted());
         $cols_output = 0;          $cols_output = 0;
         my $student_row = $max_row;          my $student_row = $max_row;
         foreach my $field (@StudentColumns) {  
             $worksheet->write($student_row,$cols_output++,  
                               $student->{$field});  
         }  
         my $last_student_col = $cols_output-1;  
         foreach my $prob (@$Problems) {          foreach my $prob (@$Problems) {
               my $symb = $prob->symb();
             foreach my $partid (@{$prob->parts}) {              foreach my $partid (@{$prob->parts}) {
                   if (($prob->is_anonsurvey($partid)) || ($anoncounter->{$symb."\0".$partid})) {
                       next if ($show_named);
                   } else {
                       next unless ($show_named);
                   }
                 my @Response = $prob->responseIds($partid);                  my @Response = $prob->responseIds($partid);
                 my @ResponseType = $prob->responseType($partid);                  my @ResponseType = $prob->responseType($partid);
                 for (my $i=0;$i<=$#Response;$i++) {                  for (my $i=0;$i<=$#Response;$i++) {
Line 789  sub prepare_excel_output { Line 939  sub prepare_excel_output {
                 }                  }
             }              }
         }          }
         # Fill in the remaining rows with the students data          # Prepend current student's user information to all rows  
         for (my $row = $student_row+1;$row<$max_row;$row++) {          for (my $row = $student_row;$row<$max_row;$row++) {
             my $cols = 0;              my $cols = 0;
             foreach my $field (@StudentColumns) {              foreach my $field (@StudentColumns) {
                 $worksheet->write($row,$cols++,                  if ($show_named) {
                                   $student->{$field});                      my $value = $student->{$field};
                       if ($field eq 'comments') {
                           $value = &Apache::lonmsgdisplay::retrieve_instructor_comments
                                    ($student->{'username'},$student->{'domain'});
                       }
                       $worksheet->write($row,$cols++,$value);
                   } else {
                       $worksheet->write($row,$cols++,
                                         &mt('Anonymized'));
                   }
             }              }
         }          }
         &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,          &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,'last student');
                                                  'last student');  
     }      }
     &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);      &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
     #      #
Line 828  sub compile_response_data { Line 986  sub compile_response_data {
     #      #
     my $submission =       my $submission = 
         &HTML::Entities::decode          &HTML::Entities::decode
         (&Apache::lonnet::unescape($response->{'Submission'}));          (&unescape($response->{'Submission'}));
     if (!$prob->is_task()) {      if (!$prob->is_task()) {
  return () if (! defined($submission) || $submission eq '');   return () if (! defined($submission) || $submission eq '');
     }      }
Line 843  sub compile_response_data { Line 1001  sub compile_response_data {
     if ($resptype =~ /^(option|match|rank)$/) {      if ($resptype =~ /^(option|match|rank)$/) {
         my %submission =           my %submission = 
             map {               map { 
                 my ($foil,$value) = split('=',&Apache::lonnet::unescape($_));                  my ($foil,$value) = split('=',&unescape($_));
                 ($foil,$value);                  ($foil,$value);
             } split('&',$response->{'Submission'});              } split('&',$response->{'Submission'});
         my %correct;          my %correct;
         if (exists($response->{'Correct'})) {          if (exists($response->{'Correct'})) {
             %correct =               %correct = 
                 map {                   map { 
                     my ($foil,$value)=split('=',&Apache::lonnet::unescape($_));                      my ($foil,$value)=split('=',&unescape($_));
                     ($foil,$value);                      ($foil,$value);
                 } split('&',$response->{'Correct'});                  } split('&',$response->{'Correct'});
         }          }
Line 904  sub excel_format_item { Line 1062  sub excel_format_item {
 #########################################################  #########################################################
 #########################################################  #########################################################
 sub prepare_csv_output {  sub prepare_csv_output {
     my ($r,$problems,$students) = @_;      my ($r,$problems,$students,$anoncounter,$show_named) = @_;
     my $c = $r->connection();      my $c = $r->connection();
     #      #
     $r->print('<h2>'.      $r->print('<p class="LC_info">'.
               &mt('Generating CSV report of student responses').'</h2>');                &mt('Generating CSV report of student responses').'</p>');
     #      #
     # Progress window      # Progress window
     my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin      my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,scalar(@$students));
         ($r,'CSV File Compilation Status',  
          'CSV File Compilation Progress',   
          scalar(@$students),'inline',undef,'Statistics','stats_status');  
           
     $r->rflush();      $r->rflush();
     #      #
Line 925  sub prepare_csv_output { Line 1080  sub prepare_csv_output {
             time.'_'.rand(1000000000).'.csv';              time.'_'.rand(1000000000).'.csv';
     unless ($outputfile = Apache::File->new('>/home/httpd'.$filename)) {      unless ($outputfile = Apache::File->new('>/home/httpd'.$filename)) {
         $r->log_error("Couldn't open $filename for output $!");          $r->log_error("Couldn't open $filename for output $!");
         $r->print("Problems occured in writing the csv file.  ".          $r->print(
                   "This error has been logged.  ".              '<p class="LC_error">'
                   "Please alert your LON-CAPA administrator.");             .&mt('Problems occurred in writing the CSV file.')
              .' '.&mt('This error has been logged.')
              .' '.&mt('Please alert your LON-CAPA administrator.')
              .'</p>'
           );
         $outputfile = undef;          $outputfile = undef;
     }      }
     #      #
     # Compute the number of columns per response      # Compute the number of columns per response
     my @extra_resp_headers = &get_extra_response_headers();      my @extra_resp_headers = &get_extra_response_headers($show_named);
     #      #
     # Create the table header      # Create the table header
     my @student_columns = ('username','domain','id','section');      my @student_columns = &get_student_columns($show_named);
       my $student_column_count = scalar(@student_columns);
     #      #
     my %headers;      my %headers;
     push(@{$headers{'student'}},@student_columns);      push(@{$headers{'student'}},@student_columns);
Line 947  sub prepare_csv_output { Line 1107  sub prepare_csv_output {
     # we put the headers into the %headers hash      # we put the headers into the %headers hash
     my %problem_analysis;      my %problem_analysis;
     my %start_col;      my %start_col;
     my $max_column = scalar(@student_columns);      my $max_column = $student_column_count;
     foreach my $prob (@$problems) {      foreach my $prob (@$problems) {
           my $symb = $prob->symb();
         my %analysis = &Apache::lonstathelpers::get_problem_data($prob->src);          my %analysis = &Apache::lonstathelpers::get_problem_data($prob->src);
         $problem_analysis{$prob->src}=\%analysis;          $problem_analysis{$prob->src}=\%analysis;
         $headers{'problem'}->[$max_column] = $prob->compTitle;          $headers{'problem'}->[$max_column] = $prob->compTitle;
         foreach my $partid (@{$prob->parts}) {          foreach my $partid (@{$prob->parts}) {
               if (($prob->is_anonsurvey($partid)) || ($anoncounter->{$symb."\0".$partid})) {
                   next if ($show_named);
               } else {
                   next unless ($show_named);
               }
             $headers{'part'}->[$max_column] = $prob->part_display($partid);              $headers{'part'}->[$max_column] = $prob->part_display($partid);
             my $responses = [$prob->responseIds($partid)];              my $responses = [$prob->responseIds($partid)];
             my $resptypes = [$prob->responseType($partid)];              my $resptypes = [$prob->responseType($partid)];
Line 986  sub prepare_csv_output { Line 1152  sub prepare_csv_output {
         last if ($c->aborted());          last if ($c->aborted());
         my @rows;          my @rows;
         foreach my $prob (@$problems) {          foreach my $prob (@$problems) {
               my $symb = $prob->symb;
             foreach my $partid (@{$prob->parts}) {              foreach my $partid (@{$prob->parts}) {
                   if (($prob->is_anonsurvey($partid)) || ($anoncounter->{$symb."\0".$partid})) {
                       next if ($show_named); 
                   } else {
                       next unless ($show_named);
                   }
                 my @responses = $prob->responseIds($partid);                  my @responses = $prob->responseIds($partid);
                 my @response_type = $prob->responseType($partid);                  my @response_type = $prob->responseType($partid);
                 for (my $i=0;$i<=$#responses;$i++) {                  for (my $i=0;$i<=$#responses;$i++) {
Line 1024  sub prepare_csv_output { Line 1196  sub prepare_csv_output {
             }              }
         }          }
         foreach my $row (@rows) {          foreach my $row (@rows) {
             print $outputfile '"'.join('","',              my $student_row_data = '';
                                        map { $student->{$_}; }              if ($show_named) {
                                        @student_columns).'"';                  foreach my $field (@student_columns) {
             for (my $i=scalar(@student_columns);$i<$max_column;$i++) {                      my $value = $student->{$field};
                       if ($field eq 'comments') {
                           $value = &Apache::lonmsgdisplay::retrieve_instructor_comments
                                    ($student->{'username'},$student->{'domain'});
                       }
                       $student_row_data .= '"'.&Apache::loncommon::csv_translate($value).'",';
                   }
                   $student_row_data =~ s/,$//;
               } else {
                   $student_row_data = '"'.&mt('Anonymized').'"';
               }
               print $outputfile $student_row_data;
               for (my $i=$student_column_count;$i<$max_column;$i++) {
                 my $value = &Apache::loncommon::csv_translate($row->[$i]);                  my $value = &Apache::loncommon::csv_translate($row->[$i]);
                 $value ||='';                  $value ||='';
                 print $outputfile ',"'.$value.'"';                  print $outputfile ',"'.$value.'"';
Line 1035  sub prepare_csv_output { Line 1219  sub prepare_csv_output {
             print $outputfile $/;              print $outputfile $/;
         }          }
         undef(@rows);          undef(@rows);
         &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,          &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,'last student');
                                                  'last student');  
     }      }
     close($outputfile);      close($outputfile);
     #      #
     # Close the progress window      # Close the progress window
     &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);      &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
     #      #
     # 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();
     return;      return;
 }  }
Line 1073  sub CreateInterface { Line 1256  sub CreateInterface {
     foreach ('HTML','Excel','CSV') {      foreach ('HTML','Excel','CSV') {
         $output_selector .= '    <option value="'.lc($_).'"';          $output_selector .= '    <option value="'.lc($_).'"';
         if ($env{'form.output'} eq lc($_)) {          if ($env{'form.output'} eq lc($_)) {
             $output_selector .= ' selected ';              $output_selector .= ' selected="selected"';
         }          }
         $output_selector .='>'.&mt($_).'</option>'.$/;          $output_selector .='>'.&mt($_).'</option>'.$/;
     }       } 
Line 1081  sub CreateInterface { Line 1264  sub CreateInterface {
     ##      ##
     ## Environment variable initialization      ## Environment variable initialization
     my $Str = '';      my $Str = '';
     $Str .= &Apache::lonhtmlcommon::breadcrumbs('Student Submission Reports');      $Str .= '<br />';
     $Str .= '<p>';      $Str .= &Apache::loncommon::start_data_table();
     $Str .= '<table cellspacing="5">'."\n";      $Str .= &Apache::loncommon::start_data_table_header_row();
     $Str .= '<tr>';  
     $Str .= '<th>'.&mt('Sections').'</th>';      $Str .= '<th>'.&mt('Sections').'</th>';
     $Str .= '<th>'.&mt('Groups').'</th>';      $Str .= '<th>'.&mt('Groups').'</th>';
     $Str .= '<th>'.&mt('Enrollment Status').'</th>';      $Str .= '<th>'.&mt('Student Data').&Apache::loncommon::help_open_topic("Chart_Student_Data").'</th>';
     $Str .= '<th>'.&mt('Output as [_1]',$output_selector).'</th>';      $Str .= '<th>'.&mt('Access Status').'</th>';
     $Str .= '</tr>'."\n";      $Str .= '<th>'.&mt('Options').'</th>';
       $Str .= '<th>'.&mt('Output Format').'</th>';
       $Str .= &Apache::loncommon::end_data_table_header_row();
     #      #
     $Str .= '<tr><td align="center">'."\n";      $Str .= &Apache::loncommon::start_data_table_row();
       $Str .= '<td align="center">'."\n";
     $Str .= &Apache::lonstatistics::SectionSelect('Section','multiple',5);      $Str .= &Apache::lonstatistics::SectionSelect('Section','multiple',5);
     $Str .= '</td>';      $Str .= '</td>';
     #      #
Line 1099  sub CreateInterface { Line 1284  sub CreateInterface {
     $Str .= &Apache::lonstatistics::GroupSelect('Group','multiple',5);      $Str .= &Apache::lonstatistics::GroupSelect('Group','multiple',5);
     $Str .= '</td>';      $Str .= '</td>';
     #      #
       $Str .= '<td align="center">'."\n";
       $Str .= &Apache::lonstatistics::StudentDataSelect('StudentData','multiple', 5,undef);
       $Str .= '</td>';
       #
     $Str .= '<td align="center">';      $Str .= '<td align="center">';
     $Str .= &Apache::lonhtmlcommon::StatusOptions(undef,undef,5);      $Str .= &Apache::lonhtmlcommon::StatusOptions(undef,undef,5);
     $Str .= '</td>';      $Str .= '</td>';
Line 1106  sub CreateInterface { Line 1295  sub CreateInterface {
     # Render problem checkbox      # Render problem checkbox
     my $prob_checkbox = '<input type="checkbox" name="renderprob" ';      my $prob_checkbox = '<input type="checkbox" name="renderprob" ';
     if (exists($env{'form.renderprob'}) && $env{'form.renderprob'} eq 'true') {      if (exists($env{'form.renderprob'}) && $env{'form.renderprob'} eq 'true') {
         $prob_checkbox .= 'checked ';          $prob_checkbox .= 'checked="checked" ';
     }      }
     $prob_checkbox .= 'value="true" />';      $prob_checkbox .= 'value="true" />';
     #      #
     # Compute correct answers checkbox      # Compute correct answers checkbox
     my $ans_checkbox = '<input type="checkbox" name="correctans" ';      my $ans_checkbox = '<input type="checkbox" name="correctans" ';
     if (exists($env{'form.correctans'}) && $env{'form.correctans'} eq 'true') {      if (exists($env{'form.correctans'}) && $env{'form.correctans'} eq 'true') {
         $ans_checkbox .= 'checked ';          $ans_checkbox .= 'checked="checked" ';
     }      }
     $ans_checkbox .= 'value="true" />';      $ans_checkbox .= 'value="true" />';
     #      #
Line 1121  sub CreateInterface { Line 1310  sub CreateInterface {
     my $all_sub_checkbox = '<input type="checkbox" name="all_sub" ';      my $all_sub_checkbox = '<input type="checkbox" name="all_sub" ';
     if (exists($env{'form.all_sub'}) &&       if (exists($env{'form.all_sub'}) && 
         $env{'form.all_sub'} eq 'true') {          $env{'form.all_sub'} eq 'true') {
         $all_sub_checkbox .= 'checked ';          $all_sub_checkbox .= 'checked="checked" ';
     }      }
     $all_sub_checkbox.= 'value="true" />';      $all_sub_checkbox.= 'value="true" />';
     #      #
Line 1129  sub CreateInterface { Line 1318  sub CreateInterface {
     my $prob_status_checkbox = '<input type="checkbox" name="prob_status" ';      my $prob_status_checkbox = '<input type="checkbox" name="prob_status" ';
     if (exists($env{'form.prob_status'}) &&       if (exists($env{'form.prob_status'}) && 
         $env{'form.prob_status'} eq 'true') {          $env{'form.prob_status'} eq 'true') {
         $prob_status_checkbox .= 'checked ';          $prob_status_checkbox .= 'checked="checked" ';
     }      }
     $prob_status_checkbox .= 'value="true" />';      $prob_status_checkbox .= 'value="true" />';
     #      #
     $Str .= '<td align="right" valign="top">'.      $Str .=
         '<label><b>'.          '<td valign="top">'
         &mt('Show problem [_1]',$prob_checkbox).'</b></label><br />'.         .'<label>'
         '<label><b>'.         .$prob_checkbox.&mt('Show problem')
         &mt('Show correct answers [_1]',$ans_checkbox).'</b></label><br />'.         .'</label><br />'
         '<label><b>'.         .'<label>'
         &mt('Show all submissions [_1]',$all_sub_checkbox).         .' '.$ans_checkbox.&mt('Show correct answers')
         '</b></label><br />'.         .'</label><br />'
         '<label><b>'.         .'<label>'
         &mt('Show problem grading [_1]',$prob_status_checkbox).         .$all_sub_checkbox.&mt('Show all submissions')
         '</b></label><br />'.         .'</label><br />'
         '</td>';         .'<label>'
     #         .$prob_status_checkbox.&mt('Show problem grading')
     $Str .= '</tr>'."\n";         .'</label>'
     $Str .= '</table>'."\n";         .'</td>';
     #      #
     $Str .= '<p><nobr>'.&mt('Status: [_1]',      $Str .= '<td align="center" valign="top">'.$output_selector.'</td>';
                          '<input type="text" '.      #
                          'name="stats_status" size="60" value="" />').      $Str .= &Apache::loncommon::end_data_table_row();
             '</nobr>'.'</p>';          $Str .= &Apache::loncommon::end_data_table();
     ##      #
     return $Str;      return $Str;
 }  }
   
   sub get_student_columns {
       my ($show_named) = @_; 
       my @student_columns;
       if ($show_named) {
           @student_columns = @Apache::lonstatistics::SelectedStudentData;
           if (grep(/^all$/,@student_columns)) {
               @student_columns = qw(fullname username domain id section status groups comments);
           }
       } else {
           @student_columns = ('username');
       }
       return @student_columns;
   } 
   
 1;  1;
   
 __END__  __END__

Removed from v.1.44  
changed lines
  Added in v.1.68.2.1


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.