Diff for /loncom/interface/lonstatistics.pm between versions 1.131 and 1.148.2.1

version 1.131, 2006/05/01 16:11:25 version 1.148.2.1, 2010/01/06 18:29:10
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 63  use Apache::loncoursedata; Line 51  use Apache::loncoursedata;
 use Apache::lonhtmlcommon;  use Apache::lonhtmlcommon;
 use Apache::lonmysql;  use Apache::lonmysql;
 use Apache::lonlocal;  use Apache::lonlocal;
   use Apache::longroup;
 use Time::HiRes;  use Time::HiRes;
 #  #
 # Statistics Packages  # Statistics Packages
Line 75  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 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 110  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 159  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 230  sub PrepareClasslist { Line 119  sub PrepareClasslist {
     $enrollment_status = $env{'form.Status'} if (exists($env{'form.Status'}));      $enrollment_status = $env{'form.Status'} if (exists($env{'form.Status'}));
     #      #
     # Get groupmembership      # Get groupmembership
     my (%curr_groups,$classgroups,$studentgroups);      my ($classgroups,$studentgroups);
     my $numgroups = &Apache::loncommon::coursegroups(\%curr_groups,$cdom,$cnum);      my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum);
     if ($numgroups) {      if (%curr_groups) {
         ($classgroups,$studentgroups) =           ($classgroups,$studentgroups) = 
                      &Apache::loncoursedata::get_group_memberships($classlist,      &Apache::loncoursedata::get_group_memberships($classlist,
                                                                    $cdom,$cnum);                                                            $field_names,
     $cdom,$cnum);
     }      }
     my $now = time;      my $now = time;
   
Line 309  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 367  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 397  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 423  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   
 enrollment 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 445  sub section_and_enrollment_description { Line 302  sub section_and_enrollment_description {
     my @groups = &Apache::lonstatistics::get_selected_groups();      my @groups = &Apache::lonstatistics::get_selected_groups();
     my $description;      my $description;
     if ($mode eq 'localized') {      if ($mode eq 'localized') {
         $description = &mt('Unable to determine section, groups and enrollment');          $description = &mt('Unable to determine section, groups and access status');
     } elsif ($mode eq 'plaintext') {      } elsif ($mode eq 'plaintext') {
         $description = 'Unable to determine section, groups and enrollment';          $description = 'Unable to determine section, groups and access status';
     } else {      } else {
         $description = 'Bad parameter passed to lonstatistics::section_and_enrollment_description';          $description = 'Bad parameter passed to lonstatistics::section_and_enrollment_description';
         &Apache::lonnet::logthis($description);          &Apache::lonnet::logthis($description);
Line 455  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] enrollment status.',$env{'form.Status'});          $description .= ' '.&mt($env{'form.Status'}.' access status.');
     } elsif ($mode eq 'plaintext') {      } elsif ($mode eq 'plaintext') {
         $description .= ' '.$env{'form.Status'}.' enrollment 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 481  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 506  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 523  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 611  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 640  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 671  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 700  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 724  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 762  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 795  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 835  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 854  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 894  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 913  sub GroupSelect { Line 604  sub GroupSelect {
 }  }
   
   
 ##################################################  
 ##################################################  
 sub DisplayClasslist {  sub DisplayClasslist {
     my ($r)=@_;      my ($r)=@_;
     &Apache::lonhtmlcommon::add_breadcrumb      &Apache::lonhtmlcommon::add_breadcrumb
Line 922  sub DisplayClasslist { Line 613  sub DisplayClasslist {
     #      #
     # Output some of the standard interface components      # Output some of the standard interface components
     my $Str;      my $Str;
     $Str .= &Apache::lonhtmlcommon::breadcrumbs(undef,'Select One Student');      $Str .= &Apache::lonhtmlcommon::breadcrumbs('Select One Student');
     $Str .= '<p><table cellspacing="5">'."\n";      $Str .= '<p><table cellspacing="5">'."\n";
     $Str .= '<tr>';      $Str .= '<tr>';
     $Str .= '<th align="center"><b>'.&mt('Sections').'</b></th>';      $Str .= '<th align="center"><b>'.&mt('Sections').'</b></th>';
     $Str .= '<th align="center"><b>'.&mt('Groups').'</b></th>';      $Str .= '<th align="center"><b>'.&mt('Groups').'</b></th>';
     $Str .= '<th align="center"><b>'.&mt('Enrollment Status').'</b></th>';      $Str .= '<th align="center"><b>'.&mt('Access Status').'</b></th>';
     $Str .= '</tr>'.$/;      $Str .= '</tr>'.$/;
     $Str .= '<tr>';      $Str .= '<tr>';
     $Str .= '<td>'.      $Str .= '<td>'.
Line 953  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 1000  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>';
             if ($field eq 'fullname' || $field eq 'username') {              if ($field eq 'fullname' || $field eq 'username') {
                 $Str .= '<a href="/adm/statistics?reportSelected=';                  $Str .= '<a href="/adm/statistics?reportSelected=';
                 $Str .= &Apache::lonnet::escape('student_assessment');                  $Str .= &escape('student_assessment');
                 $Str .= '&sort='.&Apache::lonnet::escape($env{'form.sort'});                  $Str .= '&sort='.&escape($env{'form.sort'});
                 $Str .= '&SelectedStudent=';                  $Str .= '&SelectedStudent=';
                 $Str .= &Apache::lonnet::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 1029  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 1039  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.'),           ]},
                  },          {categorytitle => 'Reports',
 #                   { internal_name => 'grading_analysis',           items => [
 #                     name => &mt('Detailed Grading Analysis'),              {url => '/adm/statistics?reportSelected=student_submission_reports',
 #                     short_description =>    permission => 'F',
 #    &mt('Display statistics about who graded who.'),               icon => 'edit-copy.png',
 #                 },               linktext => ('Student Submission Reports'),
 #                   { internal_name => 'student_assessment',               linktitle => ('Prepare reports of student submissions.')},
 #                     name => &mt('Problem Status Chart'),                      
 #                     short_description =>               {url => '/adm/statistics?reportSelected=survey_reports',
 #    &mt('Brief view of each students performance in course.'),   permission => 'F',
 #                 },               icon => 'docs.png',
                    # 'percentage'  => 'Correct-problems Plot',   linktext => ('Survey Reports'),
                    # 'activitylog' => 'Activity Log',               linktitle => ('Prepare reports on survey results.')},
                    );           ]});
     #      
     # Create the menu  return &Apache::lonhtmlcommon::generate_menu(@reports);
     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 $Str;  
 }  }
   
 ##############################################  
 ##############################################  
 sub handler {  sub handler {
     my $r=shift;      my $r=shift;
     my $c = $r->connection();      my $c = $r->connection();
Line 1134  sub handler { Line 817  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 $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 1163  ENDSTYLE Line 865  ENDSTYLE
                                             bug=>'Statistics and Charts'});                                              bug=>'Statistics and Charts'});
     if (! exists($env{'form.reportSelected'}) ||       if (! exists($env{'form.reportSelected'}) || 
         $env{'form.reportSelected'} eq '') {          $env{'form.reportSelected'} eq '') {
         $r->print(&Apache::lonhtmlcommon::breadcrumbs          $r->print(&Apache::lonhtmlcommon::breadcrumbs('Statistics Main Page').
                   (undef,&mt('Statistics Main Page')).  
                   &CreateMainMenu());                    &CreateMainMenu());
     } else {      } else {
     #      #
         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 1239  ENDSTYLE Line 941  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 is 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 1257  ENDSTYLE Line 963  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.131  
changed lines
  Added in v.1.148.2.1


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