Diff for /loncom/interface/lonstatistics.pm between versions 1.140 and 1.148.2.4

version 1.140, 2008/09/16 12:32:18 version 1.148.2.4, 2010/09/11 19:08:19
Line 28 Line 28
 #  #
 ###  ###
   
 =pod  
   
 =head1 NAME  
   
 lonstatistics  
   
 =head1 SYNOPSIS  
   
 Main handler for statistics and chart.  
   
 =over 4  
   
 =cut  
   
 package Apache::lonstatistics;  package Apache::lonstatistics;
   
Line 78  use Apache::lonsurveyreports(); Line 66  use Apache::lonsurveyreports();
 use Apache::longradinganalysis();  use Apache::longradinganalysis();
 use LONCAPA;  use LONCAPA;
   
 #######################################################  
 #######################################################  
   
 =pod  
   
 =item Package Variables  
   
 =item @FullClasslist The full classlist  
   
 =item @Students The students we are concerned with for this invocation  
   
 =item @Sections The sections available in this class  
   
 =item @Groups The groups available in the class  
   
 =item $curr_student The student currently being examined  
   
 =item $prev_student The student previous in the classlist  
   
 =item $next_student The student next in the classlist  
   
 =over  
   
 =cut   
   
 #######################################################  
 #######################################################  
 #  #
 # Classlist variables  # Classlist variables
 #  #
Line 112  my $curr_student; Line 73  my $curr_student;
 my $prev_student;  my $prev_student;
 my $next_student;  my $next_student;
   
 #######################################################  
 #######################################################  
   
 =pod  
   
 =item &clear_classlist_variables()  
   
 undef the following package variables:  
   
 =over  
   
 =item @FullClasslist  
   
 =item @Students  
   
 =item @Sections  
   
 =item @Groups  
   
 =item %StudentData  
   
 =item @StudentDataOrder  
   
 =item @SelectedStudentData  
   
 =item $curr_student  
   
 =item $prev_student  
   
 =item $next_student  
   
 =back  
   
 =cut  
   
 #######################################################  
 #######################################################  
 sub clear_classlist_variables {  sub clear_classlist_variables {
     undef(@FullClasslist);      undef(@FullClasslist);
     undef(@Students);      undef(@Students);
Line 161  sub clear_classlist_variables { Line 86  sub clear_classlist_variables {
     undef($next_student);      undef($next_student);
 }  }
   
 #######################################################  
 #######################################################  
   
 =pod  
   
 =item &PrepareClasslist()  
   
 Build up the classlist information.  The classlist information is kept in  
 the following package variables:  
   
 =over  
   
 =item @FullClasslist  
   
 =item @Students  
   
 =item @Sections  
   
 =item @Groups   
   
 =item %StudentData  
   
 =item @SelectedStudentData  
   
 =item $curr_student  
   
 =item $prev_student  
   
 =item $next_student  
   
 =back  
   
 $curr_student, $prev_student, and $next_student may not be defined, depending  
 upon the calling context.  
   
 =cut  
   
 #######################################################  
 #######################################################  
 sub PrepareClasslist {  sub PrepareClasslist {
     my %Sections;      my %Sections;
     &clear_classlist_variables();      &clear_classlist_variables();
Line 374  sub PrepareClasslist { Line 261  sub PrepareClasslist {
     return;      return;
 }  }
   
 #######################################################  
 #######################################################  
   
 =pod  
   
 =item get_selected_sections  
   
 Returns an array of the selected sections  
   
 =cut  
   
 #######################################################  
 #######################################################  
 sub get_selected_sections {  sub get_selected_sections {
     my @selected_sections =       my @selected_sections = 
  &Apache::loncommon::get_env_multiple('form.Section');   &Apache::loncommon::get_env_multiple('form.Section');
Line 404  sub get_selected_sections { Line 279  sub get_selected_sections {
     return @selected_sections;      return @selected_sections;
 }  }
   
 #######################################################  
 #######################################################  
                                                                                       
 =pod  
                                                                                       
 =item get_selected_groups  
                                                                                       
 Returns an array of the selected groups  
                                                                                       
 =cut  
                                                                                       
 #######################################################  
 #######################################################  
 sub get_selected_groups {  sub get_selected_groups {
     my @selected_groups =      my @selected_groups =
         &Apache::loncommon::get_env_multiple('form.Group');          &Apache::loncommon::get_env_multiple('form.Group');
Line 430  sub get_selected_groups { Line 293  sub get_selected_groups {
     return @selected_groups;      return @selected_groups;
 }  }
                                                                                                                                                                           
 =pod  
   
 =item &section_and_enrollment_description  
   
 Returns a string describing the currently selected section(s), group(s) and   
 access status.    
   
 Inputs: mode = 'plaintext' or 'localized'  (defaults to 'localized')  
     'plaintext' is used for example in Excel spreadsheets.  
 Returns: scalar description string.  
   
 =cut  
   
 #######################################################  
 #######################################################  
 sub section_and_enrollment_description {  sub section_and_enrollment_description {
     my ($mode) = @_;      my ($mode) = @_;
     if (! defined($mode)) { $mode = 'localized'; }      if (! defined($mode)) { $mode = 'localized'; }
Line 462  sub section_and_enrollment_description { Line 312  sub section_and_enrollment_description {
     $description = &section_or_group_text($mode,'section',@sections).      $description = &section_or_group_text($mode,'section',@sections).
  ' '.&section_or_group_text($mode,'group',@groups);   ' '.&section_or_group_text($mode,'group',@groups);
     if ($mode eq 'localized') {      if ($mode eq 'localized') {
         $description .= &mt(' [_1] access status.',$env{'form.Status'});          $description .= ' '.&mt($env{'form.Status'}.' access status.');
     } elsif ($mode eq 'plaintext') {      } elsif ($mode eq 'plaintext') {
         $description .= ' '.$env{'form.Status'}.' access status.';          $description .= ' '.$env{'form.Status'}.' access status.';
     }      }
     return $description;      return $description;
 }  }
   
 #######################################################  
 #######################################################  
   
 sub section_or_group_text {  sub section_or_group_text {
     my ($mode,$type,@items) = @_;      my ($mode,$type,@items) = @_;
Line 488  sub section_or_group_text { Line 338  sub section_or_group_text {
                              );                               );
     if (scalar(@items) == 1 && $items[0] ne 'all') {      if (scalar(@items) == 1 && $items[0] ne 'all') {
         if ($mode eq 'localized') {          if ($mode eq 'localized') {
             $text = &mt('[_1] [_2].',$phrases{$type}{single},$items[0]);              $text = &mt($phrases{$type}{single}.' [_1].',$items[0]);
         } elsif ($mode eq 'plaintext') {          } elsif ($mode eq 'plaintext') {
             $text = $phrases{$type}{single}.' '.$items[0].'.';              $text = $phrases{$type}{single}.' '.$items[0].'.';
   
         }          }
     } elsif (scalar(@items) && $items[0] eq 'all') {      } elsif (scalar(@items) && $items[0] eq 'all') {
         if ($mode eq 'localized') {          if ($mode eq 'localized') {
             $text = &mt('[_1].',$phrases{$type}{all});              $text = &mt($phrases{$type}{all}.'.');
         } elsif ($mode eq 'plaintext') {          } elsif ($mode eq 'plaintext') {
             $text = $phrases{$type}{all}.'.';              $text = $phrases{$type}{all}.'.';
         }          }
     } elsif (scalar(@items)) {      } elsif (scalar(@items)) {
         my $lastitem = pop(@items);          my $lastitem = pop(@items);
         if ($mode eq 'localized') {          if ($mode eq 'localized') {
             $text = &mt('[_1] [_2] and [_3].',$phrases{$type}{plural},              $text = &mt($phrases{$type}{plural}.' [_1] and [_2].',
                         join(', ',@items),$lastitem);                          join(', ',@items),$lastitem);
         } elsif ($mode eq 'plaintext') {          } elsif ($mode eq 'plaintext') {
             $text = $phrases{$type}{plural}.' '.join(', ',@items).' and '.              $text = $phrases{$type}{plural}.' '.join(', ',@items).' and '.
Line 513  sub section_or_group_text { Line 363  sub section_or_group_text {
 }  }
   
   
 =pod  
   
 =item get_students  
   
 Returns a list of the selected students  
   
 =cut  
   
 #######################################################  
 #######################################################  
 sub get_students {  sub get_students {
     if (! @Students) {      if (! @Students) {
         &PrepareClasslist()          &PrepareClasslist()
Line 530  sub get_students { Line 370  sub get_students {
     return @Students;      return @Students;
 }  }
   
 #######################################################  
 #######################################################  
   
 =pod  
   
 =item &current_student()  
   
 Returns a pointer to a hash containing data about the currently  
 selected student.  
   
 =cut  
   
 #######################################################  
 #######################################################  
 sub current_student {   sub current_student { 
     return $curr_student;      return $curr_student;
 }  }
   
 #######################################################  
 #######################################################  
   
 =pod  
   
 =item &previous_student()  
   
 Returns a pointer to a hash containing data about the student prior  
 in the list of students.  Or something.    
   
 =cut  
   
 #######################################################  
 #######################################################  
 sub previous_student {   sub previous_student { 
     return $prev_student;      return $prev_student;
 }  }
   
 #######################################################  
 #######################################################  
   
 =pod  
   
 =item &next_student()  
   
 Returns a pointer to a hash containing data about the next student  
 to be viewed.  
   
 =cut  
   
 #######################################################  
 #######################################################  
 sub next_student {   sub next_student { 
     return $next_student;      return $next_student;
 }  }
   
 ##############################################  
 ##############################################  
   
 =pod   
   
 =item &StudentDataSelect($elementname,$status,$numvisible,$selected)  
   
 Returns html for a selection box allowing the user to choose one (or more)   
 of the fields of student data available (fullname, username, id, section, etc)  
   
 =over 4  
   
 =item $elementname The name of the HTML form element  
   
 =item $status 'multiple' or 'single' selection box  
   
 =item $numvisible The number of options to be visible  
   
 =back  
   
 =cut  
   
 ##############################################  
 ##############################################  
 sub StudentDataSelect {  sub StudentDataSelect {
     my ($elementname,$status,$numvisible)=@_;      my ($elementname,$status,$numvisible)=@_;
     if ($numvisible < 1) {      if ($numvisible < 1) {
Line 618  sub StudentDataSelect { Line 400  sub StudentDataSelect {
     my $Str = "\n";      my $Str = "\n";
     $Str .= '<select name="'.$elementname.'" ';      $Str .= '<select name="'.$elementname.'" ';
     if ($status ne 'single') {      if ($status ne 'single') {
         $Str .= 'multiple="true" ';          $Str .= 'multiple="multiple" ';
     }      }
     $Str .= 'size="'.$numvisible.'" >'."\n";      $Str .= 'size="'.$numvisible.'" >'."\n";
     #      #
Line 647  sub StudentDataSelect { Line 429  sub StudentDataSelect {
     return $Str;      return $Str;
 }  }
   
 #######################################################  
 #######################################################  
   
 =pod  
   
 =item &get_selected_maps($elementname)  
   
 Input: Name of the <select> form element used to specify the maps.  
   
 Returns: Array of symbs of selected maps or the description 'all'.  
    If form.$elementname does not exist, 'all' is returned.  
   
 =cut  
   
 #######################################################  
 #######################################################  
 sub get_selected_maps {  sub get_selected_maps {
     my ($elementname) = @_;      my ($elementname) = @_;
     my @selected_maps =       my @selected_maps = 
Line 678  sub get_selected_maps { Line 446  sub get_selected_maps {
 }  }
   
   
 #######################################################  
 #######################################################  
   
 =pod  
   
 =item &selected_sequences_with_assessments  
   
 Retrieve the sequences which were selected by the user to show.    
   
 Input: $mode: scalar.  Either 'selected' or 'all'.  If not specified,  
     'selected' is used.  
   
 Returns: an array containing a navmap object and navmap resources,   
     or an array containing a scalar with an error message.  
   
 =cut  
   
 #######################################################  
 #######################################################  
 sub selected_sequences_with_assessments {  sub selected_sequences_with_assessments {
     my ($mode) = @_;      my ($mode) = @_;
     $mode = 'selected' if (! defined($mode));      $mode = 'selected' if (! defined($mode));
Line 736  sub selected_sequences_with_assessments Line 487  sub selected_sequences_with_assessments
     return $navmap,@sequences_to_show;      return $navmap,@sequences_to_show;
 }  }
   
 ##############################################  
 ##############################################  
   
 =pod   
   
 =item &map_select($elementname,$status,$numvisible,$restriction)   
   
 Returns html for a selection box allowing the user to choose one (or more)   
 of the sequences in the course.  The values of the sequences are the symbs.  
 If the top sequence is selected, the value 'top' will result.  
   
 =over 4  
   
 =item $elementname The name of the HTML form element  
   
 =item $status 'multiple' or 'single' selection box  
   
 =item $numvisible The number of options to be visible  
   
 =back  
   
 =cut  
   
 ##############################################  
 ##############################################  
 sub map_select {  sub map_select {
     my ($elementname,$status,$numvisible)=@_;      my ($elementname,$status,$numvisible)=@_;
     if ($numvisible < 1) {      if ($numvisible < 1) {
Line 774  sub map_select { Line 501  sub map_select {
     my $form = "\n";      my $form = "\n";
     $form .= '<select name="'.$elementname.'" ';      $form .= '<select name="'.$elementname.'" ';
     if ($status ne 'single') {      if ($status ne 'single') {
         $form .= 'multiple="true" ';          $form .= 'multiple="multiple" ';
     }      }
     $form .= 'size="'.$numvisible.'" >'."\n";      $form .= 'size="'.$numvisible.'" >'."\n";
     #      #
Line 807  sub map_select { Line 534  sub map_select {
     return $form;      return $form;
 }  }
   
 ##############################################  
 ##############################################  
   
 =pod   
   
 =item &SectionSelect($elementname,$status,$numvisible)   
   
 Returns html for a selection box allowing the user to choose one (or more)   
 of the sections in the course.    
   
 Uses the package variables @Sections  
 =over 4  
   
 =item $elementname The name of the HTML form element  
   
 =item $status 'multiple' or 'single' selection box  
   
 =item $numvisible The number of options to be visible  
   
 =back  
   
 =cut  
   
 ##############################################  
 ##############################################  
 sub SectionSelect {  sub SectionSelect {
     my ($elementname,$status,$numvisible)=@_;      my ($elementname,$status,$numvisible)=@_;
     if ($numvisible < 1) {      if ($numvisible < 1) {
Line 847  sub SectionSelect { Line 550  sub SectionSelect {
     my $Str = "\n";      my $Str = "\n";
     $Str .= '<select name="'.$elementname.'" ';      $Str .= '<select name="'.$elementname.'" ';
     if ($status ne 'single') {      if ($status ne 'single') {
         $Str .= 'multiple="true" ';          $Str .= 'multiple="multiple" ';
     }      }
     $Str .= 'size="'.$numvisible.'" >'."\n";      $Str .= 'size="'.$numvisible.'" >'."\n";
     #      #
Line 866  sub SectionSelect { Line 569  sub SectionSelect {
     return $Str;      return $Str;
 }  }
   
 ##############################################  
 ##############################################  
                                                                                       
 =pod  
                                                                                       
 =item &GroupSelect($elementname,$status,$numvisible)  
                                                                                       
 Returns html for a selection box allowing the user to choose one (or more)  
 of the groups in the course.  
                                                                                       
 Uses the package variables @Groups  
 =over 4  
                                                                                       
 =item $elementname The name of the HTML form element  
                                                                                       
 =item $status 'multiple' or 'single' selection box  
                                                                                       
 =item $numvisible The number of options to be visible  
                                                                                       
 =back  
                                                                                       
 =cut  
                                                                                       
 ##############################################  
 ##############################################  
 sub GroupSelect {  sub GroupSelect {
     my ($elementname,$status,$numvisible)=@_;      my ($elementname,$status,$numvisible)=@_;
     if ($numvisible < 1) {      if ($numvisible < 1) {
Line 906  sub GroupSelect { Line 585  sub GroupSelect {
     my $Str = "\n";      my $Str = "\n";
     $Str .= '<select name="'.$elementname.'" ';      $Str .= '<select name="'.$elementname.'" ';
     if ($status ne 'single') {      if ($status ne 'single') {
         $Str .= 'multiple="true" ';          $Str .= 'multiple="multiple" ';
     }      }
     $Str .= 'size="'.$numvisible.'" >'."\n";      $Str .= 'size="'.$numvisible.'" >'."\n";
     #      #
Line 925  sub GroupSelect { Line 604  sub GroupSelect {
 }  }
   
   
 ##################################################  
 ##################################################  
 sub DisplayClasslist {  sub DisplayClasslist {
     my ($r)=@_;      my ($r)=@_;
     &Apache::lonhtmlcommon::add_breadcrumb      &Apache::lonhtmlcommon::add_breadcrumb
Line 965  sub DisplayClasslist { Line 644  sub DisplayClasslist {
     my @selected_sections = &get_selected_sections();      my @selected_sections = &get_selected_sections();
     if (! @Students) {      if (! @Students) {
         if ($selected_sections[0] eq 'all') {           if ($selected_sections[0] eq 'all') { 
             if (lc($env{'form.Status'}) eq 'any') {              if (lc($env{'form.Status'}) eq 'active') {
                 $Str .= '<h2>'.                  $Str .= '<p class="LC_info">'.
                     &mt('There are no students in the course.').  
                     '</h2>';  
             } elsif (lc($env{'form.Status'}) eq 'active') {  
                 $Str .= '<h2>'.  
                 &mt('There are no currently enrolled students in the course.').                  &mt('There are no currently enrolled students in the course.').
                     '</h2>';                      '</p>';
             } elsif (lc($env{'form.Status'}) eq 'expired') {              } elsif (lc($env{'form.Status'}) eq 'expired') {
                 $Str .= '<h2>'.                  $Str .= '<p class="LC_info">'.
                     &mt('There are no previously enrolled students in the course.').                      &mt('There are no previously enrolled students in the course.').
                         '</h2>';                          '</p>';
               } elsif (lc($env{'form.Status'}) eq 'future') {
                   $Str .= '<p class="LC_info">'.
                       &mt('There are no students with future access in the course.').
                           '</p>';
               } else { # 'any' and any others
                  $Str .= '<p class="LC_info">'.
                       &mt('There are no students in the course.').
                       '</p>';
             }              }
         } else {           } else { 
             my $sections;              if (lc($env{'form.Status'}) eq 'active') {
             if (lc($env{'form.Status'}) eq 'any') {                  $Str .= '<p class="LC_info">'.
                 $Str .= '<h2>'.  
                     &mt('There are no students in the selected sections.').  
                     '</h2>';  
             } elsif (lc($env{'form.Status'}) eq 'active') {  
                 $Str .= '<h2>'.  
                     &mt('There are no currently enrolled students in the selected sections.').                      &mt('There are no currently enrolled students in the selected sections.').
                     '</h2>';                      '</p>';
             } elsif (lc($env{'form.Status'}) eq 'expired') {              } elsif (lc($env{'form.Status'}) eq 'expired') {
                 $Str .= '<h2>'.                  $Str .= '<p class="LC_info">'.
                     &mt('There are no previously enrolled students in the selected sections.').                      &mt('There are no previously enrolled students in the selected sections.').
                     '</h2>';                      '</p>';
               } elsif (lc($env{'form.Status'}) eq 'future') {
                   $Str .= '<p class="LC_info">'.
                       &mt('There are no students with future access in the selected sections.').
                           '</p>';
               } else { # 'any' and any others
                   $Str .= '<p class="LC_info">'.
                       &mt('There are no students in the selected sections.').
                       '</p>';
             }              }
         }          }
         $Str.= '<a href="/adm/statistics?reportSelected=student_assessment">'.          $Str.= '<p>'
             &mt('Click here to return to the chart').'</a>';                .'<a href="/adm/statistics?reportSelected=student_assessment">'
                 .&mt('Return to the chart').'</a>'
                 .'</p>';
         $r->print($Str);          $r->print($Str);
         $r->rflush();          $r->rflush();
         return;          return;
     }      }
   
     # "Click" is asinine but it is probably not my place to change the world.      $Str .= '<h2>'.&mt('Select One Student').'</h2>'
     $Str .= '<h2>Click on a students name or username to view their chart</h2>';             .'<p>'.&mt("Click on a student's name or username to view their chart").'</p>'
     $Str .= '<table border="0"><tr><td bgcolor="#777777">'."\n";             .&Apache::loncommon::start_data_table()
     $Str .= '<table border="0" cellpadding="3"><tr bgcolor="#e6ffff">'."\n";             .&Apache::loncommon::start_data_table_header_row();
     foreach my $field (@Fields) {      foreach my $field (@Fields) {
         $Str .= '<th><a href="/adm/statistics?'.          $Str .= '<th><a href="/adm/statistics?'.
             'reportSelected=student_assessment&'.              'reportSelected=student_assessment&'.
Line 1012  sub DisplayClasslist { Line 700  sub DisplayClasslist {
             'sort='.$field.'">'.&mt($field).              'sort='.$field.'">'.&mt($field).
             '</a></th>';              '</a></th>';
     }      }
     $Str .= '</tr>'."\n";      $Str .= &Apache::loncommon::end_data_table_header_row();
     #      #
     my $alternate = 0;  
     foreach my $student (@Students) { # @Students is a package variable      foreach my $student (@Students) { # @Students is a package variable
         my $sname = $student->{'username'}.':'.$student->{'domain'};          my $sname = $student->{'username'}.':'.$student->{'domain'};
         if($alternate) {          $Str .= &Apache::loncommon::start_data_table_row();
             $Str .= '<tr bgcolor="#ffffe6">';  
         } else {  
             $Str .= '<tr bgcolor="#ffffc6">';  
         }  
         $alternate = ($alternate + 1) % 2;  
         #          #
         foreach my $field (@Fields) {          foreach my $field (@Fields) {
             $Str .= '<td>';              $Str .= '<td>';
Line 1032  sub DisplayClasslist { Line 714  sub DisplayClasslist {
                 $Str .= '&sort='.&escape($env{'form.sort'});                  $Str .= '&sort='.&escape($env{'form.sort'});
                 $Str .= '&SelectedStudent=';                  $Str .= '&SelectedStudent=';
                 $Str .= &escape($sname).'">';                  $Str .= &escape($sname).'">';
                 $Str .= $student->{$field}.'&nbsp';                  $Str .= $student->{$field}.'&nbsp;';
                 $Str .= '</a>';                  $Str .= '</a>';
             } elsif ($field eq 'status') {              } elsif ($field eq 'status') {
                 $Str .= &mt($student->{$field});                  $Str .= &mt($student->{$field});
Line 1041  sub DisplayClasslist { Line 723  sub DisplayClasslist {
             }              }
             $Str .= '</td>';              $Str .= '</td>';
         }          }
         $Str .= "</tr>\n";          $Str .= &Apache::loncommon::end_data_table_row();
     }      }
     $Str .= '</table></td></tr></table>'."\n";      $Str .= &Apache::loncommon::end_data_table();
     #      #
     $r->print($Str);      $r->print($Str);
     $r->rflush();      $r->rflush();
Line 1051  sub DisplayClasslist { Line 733  sub DisplayClasslist {
     return;      return;
 }  }
   
 ##############################################  
 ##############################################  
 sub CreateMainMenu {  sub CreateMainMenu {
     #      #
     # Define menu data      # Define menu data
     my @reports = ({ internal_name => 'problem_statistics',      my @reports = (
                      name => &mt('Overall Problem Statistics'),      {categorytitle => 'Statistics and Analyses',
                      short_description =>            items => [
     &mt('Student performance statistics on all problems.'),              {url => '/adm/statistics?reportSelected=problem_statistics',
                  },   permission => 'F',
                    { internal_name => 'problem_analysis',               icon => 'document-open.png',
                      name => &mt('Detailed Problem Analysis'),               linktext => ('Overall Problem Statistics'),
                      short_description =>                linktitle => ('Student performance statistics on all problems.')},
     &mt('Detailed statistics and graphs of student performance on problems.'),         
                  },              {url => '/adm/statistics?reportSelected=problem_analysis',
                    { internal_name => 'submissiontime_analysis',   permission => 'F',
                      name => &mt('Submission Time Plots'),               icon => 'edit-find.png',
                      short_description =>                linktext => ('Detailed Problem Analysis'),
     &mt('Display and analysis of submission times on assessments.'),               linktitle => ('Detailed statistics and graphs of student performance on problems.')},
                  },           ]},
                    { internal_name => 'student_submission_reports',          {categorytitle => 'Plots',
                      name => &mt('Student Submission Reports'),           items => [
                      short_description =>               {url => '/adm/statistics?reportSelected=submissiontime_analysis',
     &mt('Prepare reports of student submissions.'),   permission => 'F',
                  },               icon => 'subtimpl.png',
                    { internal_name => 'survey_reports',               linktext => ('Submission Time Plots'),
                      name => &mt('Survey Reports'),               linktitle => ('Display and analysis of submission times on assessments.')},
                      short_description =>         
     &mt('Prepare reports on survey results.'),              {url => '/adm/statistics?reportSelected=correct_problems_plot',
                  },   permission => 'F',
                    { internal_name => 'correct_problems_plot',               icon => 'coprplot.png',
                      name => &mt('Correct Problems Plot'),               linktext => ('Correct Problems Plot'),
                      short_description =>                linktitle => ('Display a histogram of student performance in the course.')},
     &mt('Display a histogram of student performance in the course.'),           ]});
                  },      if (&Apache::loncommon::needs_gci_custom()) {
 #                   { internal_name => 'grading_analysis',          push(@reports,
 #                     name => &mt('Detailed Grading Analysis'),          {categorytitle => 'Reports',
 #                     short_description =>            items => [
 #    &mt('Display statistics about who graded who.'),              {url => '/adm/statistics?reportSelected=student_submission_reports',
 #                 },                           permission => 'F',
 #                   { internal_name => 'student_assessment',               icon => 'edit-copy.png',
 #                     name => &mt('Problem Status Chart'),               linktext => ('Student Submission Reports'),
 #                     short_description =>                linktitle => ('Prepare reports of student submissions.')},
 #    &mt('Brief view of each students performance in course.'),           ]});
 #                 },      } else {
                    # 'percentage'  => 'Correct-problems Plot',          push(@reports,
                    # 'activitylog' => 'Activity Log',          {categorytitle => 'Reports',
                    );           items => [
     #              {url => '/adm/statistics?reportSelected=student_submission_reports',
     # Create the menu   permission => 'F',
     my $Str;               icon => 'edit-copy.png',
     $Str .= '<h2>'.&mt('Please select a report to generate').'</h2>';               linktext => ('Student Submission Reports'),
     foreach my $reportdata (@reports) {               linktitle => ('Prepare reports of student submissions.')},
         $Str .='    <h3><a href="/adm/statistics?reportSelected='.                      
             $reportdata->{'internal_name'}.'" >'.              {url => '/adm/statistics?reportSelected=survey_reports',
             $reportdata->{'name'}."</a></h3>\n";   permission => 'F',
         $Str .= '    '.('&nbsp;'x8).$reportdata->{'short_description'}.               icon => 'docs.png',
             "\n";   linktext => ('Survey Reports'),
                linktitle => ('Prepare reports on survey results.')},
            ]});
     }      }
     $Str .="</dl>\n";      
     #  return &Apache::lonhtmlcommon::generate_menu(@reports);
     return $Str;   
 }  }
   
 ##############################################  
 ##############################################  
 sub handler {  sub handler {
     my $r=shift;      my $r=shift;
     my $c = $r->connection();      my $c = $r->connection();
Line 1146  sub handler { Line 830  sub handler {
     &Apache::loncommon::content_type($r,'text/html');      &Apache::loncommon::content_type($r,'text/html');
     $r->send_http_header;      $r->send_http_header;
     if ($r->header_only) { return OK; }      if ($r->header_only) { return OK; }
       my $gcicustom = &Apache::loncommon::needs_gci_custom();
       if ($gcicustom) {
           my $now = time;
           my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
           my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
           my $courseopt=&Apache::lonnet::get_courseresdata($cnum,$cdom);
           my $duedate = $courseopt->{$env{'request.course.id'}.'.0.duedate'};
           if ((!$duedate) || ($duedate > $now)) {
               $r->print(&Apache::loncommon::start_page("Course Statistics"));
               $r->print('<h3>'.&mt('Display of statistics').'</h3>');
               if ($duedate > $now) { 
                   $r->print('<p>'.&mt('Aggregate test performance data will be available after the Concept Test end date: [_1].',
                            &Apache::lonlocal::locallocaltime($duedate)).'</p>');
               } else {
                   $r->print('<p>'.
                             &mt('Aggregate test performance data unavailable without definition of an end date for the Concept Test.').'</p>');
               }
               $r->print(&Apache::loncommon::end_page());
               return OK;
           }
       }
   
     #      #
     # Extract form elements from query string      # Extract form elements from query string
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
Line 1190  ENDSTYLE Line 896  ENDSTYLE
                      .'</p>');                       .'</p>');
             $r->print('<p>'.              $r->print('<p>'.
                       &mt('Course Statistics and Charts cannot be '.                        &mt('Course Statistics and Charts cannot be '.
                           'retrieved until the database is restarted.  '.                            'retrieved until the database is restarted. '.
                           'Your data is intact but cannot be displayed '.                            'Your data is intact but cannot be displayed '.
                           'at this time.').'</p>');                            'at this time.').'</p>');
             $r->print(&Apache::loncommon::end_page());              $r->print(&Apache::loncommon::end_page());
Line 1231  ENDSTYLE Line 937  ENDSTYLE
             &Apache::lonsubmissiontimeanalysis::BuildSubmissionTimePage($r,$c);              &Apache::lonsubmissiontimeanalysis::BuildSubmissionTimePage($r,$c);
         } elsif($GoToPage eq 'student_submission_reports') {          } elsif($GoToPage eq 'student_submission_reports') {
             &Apache::lonhtmlcommon::add_breadcrumb              &Apache::lonhtmlcommon::add_breadcrumb
                 ({href=>              ({href=>
                   '/adm/statistics?reportselected=student_submission_reports',                '/adm/statistics?reportselected=student_submission_reports',
                   text=>'Student Submission Reports'});                text=>'Student Submission Reports'});
             &Apache::lonstudentsubmissions::BuildStudentSubmissionsPage($r,$c);              &Apache::lonstudentsubmissions::BuildStudentSubmissionsPage($r,$c);
         } elsif($GoToPage eq 'survey_reports') {          } elsif($GoToPage eq 'survey_reports') {
             &Apache::lonhtmlcommon::add_breadcrumb              &Apache::lonhtmlcommon::add_breadcrumb
Line 1251  ENDSTYLE Line 957  ENDSTYLE
             &Apache::lonhtmlcommon::add_breadcrumb              &Apache::lonhtmlcommon::add_breadcrumb
                 ({href=>'/adm/statistics?reportselected=student_assessment',                  ({href=>'/adm/statistics?reportselected=student_assessment',
                   text=>'Chart'});                    text=>'Chart'});
             &Apache::lonstudentassessment::BuildStudentAssessmentPage($r,$c);              if ($gcicustom) {
                   $r->print(&mt('Only aggregate performance data are available for Concept Tests.'));  
               } else {
                   &Apache::lonstudentassessment::BuildStudentAssessmentPage($r,$c);
               }
         } elsif($GoToPage eq 'grading_analysis') {          } elsif($GoToPage eq 'grading_analysis') {
             &Apache::lonhtmlcommon::add_breadcrumb              &Apache::lonhtmlcommon::add_breadcrumb
                 ({href=>'/adm/statistics?reportselected=grading_anaylsis',                  ({href=>'/adm/statistics?reportselected=grading_anaylsis',
Line 1269  ENDSTYLE Line 979  ENDSTYLE
   
 1;  1;
   
 #######################################################  __END__
 #######################################################  
   
 =pod  =pod
   
   =head1 NAME
   
   lonstatistics
   
   =head1 SYNOPSIS
   
   Main handler for statistics and chart.
   
   This is part of the LearningOnline Network with CAPA project
   described at http://www.lon-capa.org.
   
   
   =head1 PACKAGE VARIABLES
   
   =over
   
   =item @FullClasslist The full classlist
   
   =item @Students The students we are concerned with for this invocation
   
   =item @Sections The sections available in this class
   
   =item @Groups The groups available in the class
   
   =item $curr_student The student currently being examined
   
   =item $prev_student The student previous in the classlist
   
   =item $next_student The student next in the classlist
   
 =back  =back
   
 =cut  =head1 SUBROUTINES
   
 #######################################################  =over
 #######################################################  
   
 __END__  =item &clear_classlist_variables()
   
   undef the following package variables:
   
   =over 4
   
   =item * @FullClasslist
   
   =item * @Students
   
   =item * @Sections
   
   =item * @Groups
   
   =item * %StudentData
   
   =item * @StudentDataOrder
   
   =item * @SelectedStudentData
   
   =item * $curr_student
   
   =item * $prev_student
   
   =item * $next_student
   
   =back
   
   =item &PrepareClasslist()
   
   Build up the classlist information.  The classlist information is kept in
   the following package variables:
   
   =over 4 
   
   =item * @FullClasslist
   
   =item * @Students
   
   =item * @Sections
   
   =item * @Groups 
   
   =item * %StudentData
   
   =item * @SelectedStudentData
   
   =item * $curr_student
   
   =item * $prev_student
   
   =item * $next_student
   
   =back
   
   $curr_student, $prev_student, and $next_student may not be defined, depending
   upon the calling context.
   
   =item get_selected_sections()
   
   Returns an array of the selected sections
   
   =item get_selected_groups()
                                                                                       
   Returns an array of the selected groups
   
   =item &section_and_enrollment_description()
   
   Returns a string describing the currently selected section(s), group(s) and 
   access status.  
   
   Inputs: mode = 'plaintext' or 'localized'  (defaults to 'localized')
       'plaintext' is used for example in Excel spreadsheets.
   Returns: scalar description string.
   
   =item section_or_group_text()
   
   =item get_students()
   
   Returns a list of the selected students
   
   =item &current_student()
   
   Returns a pointer to a hash containing data about the currently
   selected student.
   
   =item &previous_student()
   
   Returns a pointer to a hash containing data about the student prior
   in the list of students.  Or something. 
   
   =item &next_student()
   
   Returns a pointer to a hash containing data about the next student
   to be viewed. 
   
   =item &StudentDataSelect($elementname,$status,$numvisible,$selected)
   
   Returns html for a selection box allowing the user to choose one (or more) 
   of the fields of student data available (fullname, username, id, section, etc)
   
   =over 4
   
   =item * $elementname The name of the HTML form element
   
   =item * $status 'multiple' or 'single' selection box
   
   =item * $numvisible The number of options to be visible
   
   =back
   
   =item &get_selected_maps($elementname)
   
   Input: Name of the <select> form element used to specify the maps.
   
   Returns: Array of symbs of selected maps or the description 'all'.
      If form.$elementname does not exist, 'all' is returned.
   
   =item &selected_sequences_with_assessments()
   
   Retrieve the sequences which were selected by the user to show.  
   
   Input: $mode: scalar.  Either 'selected' or 'all'.  If not specified,
       'selected' is used.
   
   Returns: an array containing a navmap object and navmap resources, 
       or an array containing a scalar with an error message.
   
   =item &map_select($elementname,$status,$numvisible,$restriction) 
   
   Returns html for a selection box allowing the user to choose one (or more) 
   of the sequences in the course.  The values of the sequences are the symbs.
   If the top sequence is selected, the value 'top' will result.
   
   =over 4
   
   =item * $elementname The name of the HTML form element
   
   =item * $status 'multiple' or 'single' selection box
   
   =item * $numvisible The number of options to be visible
   
   =back
   
   =item &SectionSelect($elementname,$status,$numvisible) 
   
   Returns html for a selection box allowing the user to choose one (or more) 
   of the sections in the course.  
   
   Uses the package variables @Sections
   
   =over 4
   
   =item * $elementname The name of the HTML form element
   
   =item * $status 'multiple' or 'single' selection box
   
   =item * $numvisible The number of options to be visible
   
   =back
   
   =item &GroupSelect($elementname,$status,$numvisible)
                                                                                       
   Returns html for a selection box allowing the user to choose one (or more)
   of the groups in the course.
                                                                                       
   Uses the package variables @Groups
   
   =over 4
                                                                                       
   =item * $elementname The name of the HTML form element
                                                                                       
   =item * $status 'multiple' or 'single' selection box
                                                                                       
   =item * $numvisible The number of options to be visible
                                                                                       
   =back
   
   =item CreateMainMenu()
   
   =back
   
   =cut
   

Removed from v.1.140  
changed lines
  Added in v.1.148.2.4


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