Diff for /loncom/interface/lonstatistics.pm between versions 1.137 and 1.148.2.3

version 1.137, 2006/08/18 15:15:38 version 1.148.2.3, 2010/01/11 04:11:52
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 76  use Apache::lonpercentage; Line 64  use Apache::lonpercentage;
 use Apache::lonstudentsubmissions();  use Apache::lonstudentsubmissions();
 use Apache::lonsurveyreports();  use Apache::lonsurveyreports();
 use Apache::longradinganalysis();  use Apache::longradinganalysis();
 use lib '/home/httpd/lib/perl/';  
 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 113  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 162  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 313  sub PrepareClasslist { Line 199  sub PrepareClasslist {
     if ($env{'request.course.sec'} !~ /^\s*$/) {      if ($env{'request.course.sec'} !~ /^\s*$/) {
         @Sections = ($env{'request.course.sec'});          @Sections = ($env{'request.course.sec'});
     } else {      } else {
         @Sections = sort {$a cmp $b} keys(%Sections);          @Sections = sort {
       if ($a == $a && $b == $b ) { return $a <=> $b; }
       return $a cmp $b;
    } keys(%Sections);
   
         unshift(@Sections,'all'); # Put 'all' at the front of the list          unshift(@Sections,'all'); # Put 'all' at the front of the list
     }      }
     # Sort the groups      # Sort the groups
Line 371  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 401  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 427  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 459  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 485  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 510  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 527  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 615  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 644  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 675  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 704  sub selected_sequences_with_assessments Line 458  sub selected_sequences_with_assessments
     #      #
     my @sequences = $navmap->retrieveResources(undef,      my @sequences = $navmap->retrieveResources(undef,
                                                sub { shift->is_map(); },1,0,1);                                                 sub { shift->is_map(); },1,0,1);
       my $toplevelseq = $navmap->getById('0.0');
       if (!grep(/^\Q$toplevelseq\E$/,@sequences)) {
           unshift(@sequences,$toplevelseq);
       }
   
     my @sequences_with_assessments;      my @sequences_with_assessments;
     for my $sequence ($navmap->getById('0.0'), @sequences) {      foreach my $sequence (@sequences) {
  if ($navmap->hasResource($sequence,sub { shift->is_problem(); },0,1)){   if ($navmap->hasResource($sequence,sub { shift->is_problem(); },0,1)){
             push(@sequences_with_assessments,$sequence);              push(@sequences_with_assessments,$sequence);
         }          }
Line 728  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 766  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 799  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 839  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 858  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 898  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 917  sub GroupSelect { Line 604  sub GroupSelect {
 }  }
   
   
 ##################################################  
 ##################################################  
 sub DisplayClasslist {  sub DisplayClasslist {
     my ($r)=@_;      my ($r)=@_;
     &Apache::lonhtmlcommon::add_breadcrumb      &Apache::lonhtmlcommon::add_breadcrumb
Line 957  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 1004  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 1024  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 1033  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 1043  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.'),           ]});
                  },      unless(&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.'),                      
 #                 },              {url => '/adm/statistics?reportSelected=survey_reports',
                    # 'percentage'  => 'Correct-problems Plot',   permission => 'F',
                    # 'activitylog' => 'Activity Log',               icon => 'docs.png',
                    );   linktext => ('Survey Reports'),
     #               linktitle => ('Prepare reports on survey results.')},
     # Create the menu           ]});
     my $Str;  
     $Str .= '<h2>'.&mt('Please select a report to generate').'</h2>';  
     foreach my $reportdata (@reports) {  
         $Str .='    <h3><a href="/adm/statistics?reportSelected='.  
             $reportdata->{'internal_name'}.'" >'.  
             $reportdata->{'name'}."</a></h3>\n";  
         $Str .= '    '.('&nbsp;'x8).$reportdata->{'short_description'}.  
             "\n";  
     }      }
     $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 1138  sub handler { Line 820  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 1173  ENDSTYLE Line 877  ENDSTYLE
     #      #
         if (! &Apache::lonmysql::verify_sql_connection()) {          if (! &Apache::lonmysql::verify_sql_connection()) {
             my $serveradmin = $r->dir_config('lonAdmEMail');              my $serveradmin = $r->dir_config('lonAdmEMail');
             $r->print('<h2><font color="Red">'.              $r->print('<h2 class="LC_error">'.
                       &mt('Unable to connect to database!').                        &mt('Unable to connect to database!').
                       '</font></h2>');                        '</h2>');
             $r->print('<p>'.              $r->print('<p>'
                       &mt('Please notify the server administrator ').                       .&mt('Please notify the server administrator [_1]',
                       '<b>'.$serveradmin.'</b></p>');                           ,'<b>'.$serveradmin.'</b>')
                        .'</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 1222  ENDSTYLE Line 927  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);              if ($gcicustom) {
                   $r->print(&mt('Only aggregate performance data are available for Concept Tests.'));
               } else {
                   &Apache::lonstudentsubmissions::BuildStudentSubmissionsPage($r,$c);
               }
         } elsif($GoToPage eq 'survey_reports') {          } elsif($GoToPage eq 'survey_reports') {
             &Apache::lonhtmlcommon::add_breadcrumb              &Apache::lonhtmlcommon::add_breadcrumb
                 ({href=>                  ({href=>
Line 1242  ENDSTYLE Line 951  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 1260  ENDSTYLE Line 973  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.137  
changed lines
  Added in v.1.148.2.3


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