Diff for /loncom/interface/lonstatistics.pm between versions 1.136 and 1.156.2.8

version 1.136, 2006/05/30 12:46:09 version 1.156.2.8, 2020/11/11 22:27:41
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 Apache::lonquickgrades();
 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 74  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 87  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 200  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 262  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 280  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 294  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 449  sub section_and_enrollment_description { Line 303  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 459  sub section_and_enrollment_description { Line 313  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 485  sub section_or_group_text { Line 339  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 364  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();
     }      }
     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 401  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";
     #      #
     # Deal with 'all'      # Deal with 'all'
     $Str .= '    <option value="all" ';      $Str .= '    <option value="all"';
     foreach (@SelectedStudentData) {      foreach (@SelectedStudentData) {
         if ($_ eq 'all') {          if ($_ eq 'all') {
             $Str .= 'selected ';              $Str .= ' selected="selected"';
             last;              last;
         }          }
     }      }
     $Str .= ">all</option>\n";      $Str .= '>'.&mt('all')."</option>\n";
     #      #
     # Loop through the student data fields      # Loop through the student data fields
     foreach my $item (@StudentDataOrder) {      foreach my $item (@StudentDataOrder) {
         $Str .= '    <option value="'.$item.'" ';          $Str .= '    <option value="'.$item.'"';
         foreach (@SelectedStudentData) {          foreach (@SelectedStudentData) {
             if ($item eq $_ ) {              if ($item eq $_ ) {
                 $Str .= 'selected ';                  $Str .= ' selected="selected"';
                 last;                  last;
             }              }
         }          }
         $Str .= '>'.$item."</option>\n";          $Str .= '>'.&mt($item)."</option>\n";
     }      }
     $Str .= "</select>\n";      $Str .= "</select>\n";
     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 447  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 459  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 488  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 502  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";
     #      #
     # Put in option for 'all'      # Put in option for 'all'
     $form .= '    <option value="all" ';      $form .= '    <option value="all"';
     if ($selected_maps[0] eq 'all') {      if ($selected_maps[0] eq 'all') {
         $form .= 'selected ';          $form .= ' selected="selected"';
     }      }
     $form .= ">all</option>\n";      $form .= '>'.&mt('all').'</option>'."\n";
     #      #
     # Loop through the sequences      # Loop through the sequences
     my @sequences = &selected_sequences_with_assessments('all');      my @sequences = &selected_sequences_with_assessments('all');
Line 786  sub map_select { Line 522  sub map_select {
         $navmap = shift(@sequences);          $navmap = shift(@sequences);
     }      }
     foreach my $seq (@sequences){      foreach my $seq (@sequences){
         $form .= '    <option value="'.$seq->symb.'" ';          $form .= '    <option value="'.$seq->symb.'"';
         foreach (@selected_maps) {          foreach (@selected_maps) {
             if ($seq->symb eq $_) {              if ($seq->symb eq $_) {
                 $form .= 'selected ';                  $form .= ' selected="selected"';
                 last;                  last;
             }              }
         }          }
Line 799  sub map_select { Line 535  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 547  sub SectionSelect {
         &PrepareClasslist()          &PrepareClasslist()
     }      }
     #      #
       # Make sure course's student table is up to date
       if (@Sections) {
           &Apache::loncoursedata::ensure_current_sections();
       }
       #
     # Build the form element      # Build the form element
     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";
     #      #
     # Loop through the sequences      # Loop through the sequences
     foreach my $s (@Sections) {      foreach my $s (@Sections) {
         $Str .= '    <option value="'.$s.'" ';          $Str .= '    <option value="'.$s.'"';
         foreach (&get_selected_sections()) {          foreach (&get_selected_sections()) {
             if ($s eq $_) {              if ($s eq $_) {
                 $Str .= 'selected ';                  $Str .= ' selected="selected"';
                 last;                  last;
             }              }
         }          }
Line 858  sub SectionSelect { Line 575  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 587  sub GroupSelect {
         &PrepareClasslist();          &PrepareClasslist();
     }      }
     #      #
       # Make sure course's groupnames and studentgroups tables
       # are up to date.
       #
       if (@Groups) {
           &Apache::loncoursedata::ensure_current_groups();
           &Apache::loncoursedata::ensure_current_students_groups();
       }
       #
     # Build the form element      # Build the form element
     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";
     #      #
     # Loop through the groups      # Loop through the groups
     foreach my $s (@Groups) {      foreach my $s (@Groups) {
         $Str .= '    <option value="'.$s.'" ';          $Str .= '    <option value="'.$s.'"';
         foreach my $group (&get_selected_groups()) {          foreach my $group (&get_selected_groups()) {
             if ($s eq $group) {              if ($s eq $group) {
                 $Str .= 'selected ';                  $Str .= ' selected="selected"';
                 last;                  last;
             }              }
         }          }
Line 917  sub GroupSelect { Line 618  sub GroupSelect {
 }  }
   
   
 ##################################################  
 ##################################################  
 sub DisplayClasslist {  sub DisplayClasslist {
     my ($r)=@_;      my ($r)=@_;
     &Apache::lonhtmlcommon::add_breadcrumb      &Apache::lonhtmlcommon::add_breadcrumb
Line 927  sub DisplayClasslist { Line 628  sub DisplayClasslist {
     # Output some of the standard interface components      # Output some of the standard interface components
     my $Str;      my $Str;
     $Str .= &Apache::lonhtmlcommon::breadcrumbs('Select One Student');      $Str .= &Apache::lonhtmlcommon::breadcrumbs('Select One Student');
     $Str .= '<p><table cellspacing="5">'."\n";      $Str .= '<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 945  sub DisplayClasslist { Line 646  sub DisplayClasslist {
         '</td>';          '</td>';
           
     $Str .= '</tr>'.$/;      $Str .= '</tr>'.$/;
     $Str .= '</table></p>';      $Str .= '</table>';
     $Str .= '<input type="submit" name="selectstudent" value="'.      $Str .= '<input type="submit" name="selectstudent" value="'.
         &mt('Update Display').'" />';          &mt('Update Display').'" />';
     $r->print($Str);      $r->print($Str);
Line 957  sub DisplayClasslist { Line 658  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&amp;'.
             'selectstudent=1&'.              'selectstudent=1&amp;'.
             '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 .= &escape('student_assessment');                  $Str .= &escape('student_assessment');
                 $Str .= '&sort='.&escape($env{'form.sort'});                  $Str .= '&amp;sort='.&escape($env{'form.sort'});
                 $Str .= '&SelectedStudent=';                  $Str .= '&amp;SelectedStudent=';
                 $Str .= &escape($sname).'">';                  $Str .= &escape($sname).'">';
                 $Str .= $student->{$field}.'&nbsp';                  $Str .= $student->{$field};
                 $Str .= '</a>';                  $Str .= '</a>';
             } elsif ($field eq 'status') {              } elsif ($field eq 'status') {
                 $Str .= &mt($student->{$field});                  $Str .= &mt($student->{$field});
             } else {              } else {
                 $Str .= $student->{$field};                  if ($student->{$field} eq 'none') {
                       $Str .= &mt('none')
                   } else {
                       $Str .= $student->{$field};
                   }
             }              }
             $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 751  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 => 'prob_ana.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 => 'survey_rep.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();
     #      #
     # Check for overloading  
     my $loaderror=&Apache::lonnet::overloaderror($r);  
     if ($loaderror) { return $loaderror; }  
     $loaderror=  
        &Apache::lonnet::overloaderror($r,  
          $env{'course.'.$env{'request.course.id'}.'.home'});  
     if ($loaderror) { return $loaderror; }  
     #  
     # Check for access      # Check for access
     if (! &Apache::lonnet::allowed('vgr',$env{'request.course.id'})) {      if (! &Apache::lonnet::allowed('vgr',$env{'request.course.id'})) {
         $env{'user.error.msg'}=          $env{'user.error.msg'}=
Line 1143  sub handler { Line 832  sub handler {
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                                             ['sort','reportSelected',                                              ['sort','reportSelected',
                                              'SelectedStudent']);                                               'SelectedStudent']);
       my $GoToPage = $env{'form.reportSelected'};
   
     #      #
     # Give the LON-CAPA page header      # Give the LON-CAPA page header
     my $style = <<ENDSTYLE;      my $style = <<ENDSTYLE;
Line 1153  sub handler { Line 844  sub handler {
     td.essay          { border: 1px solid gray; }      td.essay          { border: 1px solid gray; }
 </style>  </style>
 ENDSTYLE  ENDSTYLE
   
       my $head_extra = $style;
       if (($env{'form.reportSelected'} eq 'student_submission_reports') &&
           ($env{'form.renderprob'})) {
           my @Symbs = &Apache::lonstathelpers::get_selected_symbs('problemchoice');
           if (scalar(@Symbs) == 1) {
               $head_extra .= &Apache::loncommon::css_links($Symbs[0]);
           }
       } elsif ($env{'form.reportSelected'} eq 'submissiontime_analysis') {
           my ($navmap,$current_problem) =
               &Apache::lonsubmissiontimeanalysis::get_current_problem();
           if (ref($current_problem) eq 'HASH') {
               my $symb = $current_problem->{'symb'};
               if ($symb) {
                   $head_extra .= &Apache::loncommon::css_links($symb);
               }
           }
       } elsif (($env{'form.reportSelected'} eq 'problem_analysis') &&
                 ($env{'form.show_prob'})) {
           my $problem_types = &Apache::lonproblemanalysis::analyzable_types();
           my ($navmap,$current_problem) =
               &Apache::lonproblemanalysis::get_current_problem($problem_types);
           if (ref($current_problem) eq 'HASH') {
               my $symb = $current_problem->{'symb'};
               my $res = $current_problem->{'resource'};
               if ($symb) {
                   $head_extra .= &Apache::loncommon::css_links($symb);
               }
           }
       }
               
     $r->print(&Apache::loncommon::start_page('Course Statistics and Charts',      $r->print(&Apache::loncommon::start_page('Course Statistics and Charts',
      $style));       $head_extra));
     $r->rflush();      $r->rflush();
     #       # 
     # Either print out a menu for them or send them to a report      # Either print out a menu for them or send them to a report
Line 1165  ENDSTYLE Line 886  ENDSTYLE
                                             text =>'Statistics',                                              text =>'Statistics',
                                             faq=>139,                                              faq=>139,
                                             bug=>'Statistics and Charts'});                                              bug=>'Statistics and Charts'});
     if (! exists($env{'form.reportSelected'}) ||       if ($GoToPage eq '') {
         $env{'form.reportSelected'} eq '') {  
         $r->print(&Apache::lonhtmlcommon::breadcrumbs('Statistics Main Page').          $r->print(&Apache::lonhtmlcommon::breadcrumbs('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('<p class="LC_error">'.
                       &mt('Unable to connect to database!').                        &mt('Unable to connect to database!').
                       '</font></h2>');                        '</p>');
             $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 1190  ENDSTYLE Line 911  ENDSTYLE
         #          #
         # Clean out the caches          # Clean out the caches
         if (exists($env{'form.ClearCache'})) {          if (exists($env{'form.ClearCache'})) {
             &Apache::loncoursedata::delete_caches($env{'requres.course.id'});              &Apache::loncoursedata::delete_caches($env{'request.course.id'});
         }          }
         #          #
         # Begin form output          # Begin form output
         $r->print('<form name="Statistics" ');          $r->print('<form name="Statistics" ');
           if ($GoToPage eq 'student_submission_reports') {
               $r->print('onsubmit="return checkanon();" ');
           }
         $r->print('method="post" action="/adm/statistics">');          $r->print('method="post" action="/adm/statistics">');
         $r->rflush();          $r->rflush();
         #  
         my $GoToPage = $env{'form.reportSelected'};  
         #  
         $r->print('<input type="hidden" name="reportSelected" value="'.          $r->print('<input type="hidden" name="reportSelected" value="'.
                   $GoToPage.'">');                    $GoToPage.'" />');
         if($GoToPage eq 'activitylog') {          if($GoToPage eq 'activitylog') {
 #        &Apache::lonproblemstatistics::Activity();  #        &Apache::lonproblemstatistics::Activity();
         } elsif($GoToPage eq 'problem_statistics') {          } elsif($GoToPage eq 'problem_statistics') {
Line 1260  ENDSTYLE Line 981  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.136  
changed lines
  Added in v.1.156.2.8


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