Diff for /loncom/interface/lonstatistics.pm between versions 1.110 and 1.125

version 1.110, 2004/09/22 15:39:14 version 1.125, 2005/10/04 18:27:32
Line 50  use vars qw( Line 50  use vars qw(
     @FullClasslist       @FullClasslist 
     @Students      @Students
     @Sections       @Sections 
     @SelectedSections  
     %StudentData      %StudentData
     @StudentDataOrder      @StudentDataOrder
     @SelectedStudentData      @SelectedStudentData
     $top_map   
     @Sequences   
     @SelectedMaps  
     @Assessments  
     $enrollment_status);      $enrollment_status);
   
 use Apache::lonnet();  use Apache::lonnet;
 use Apache::lonhomework;  use Apache::lonhomework;
 use Apache::loncommon;  use Apache::loncommon;
 use Apache::loncoursedata;  use Apache::loncoursedata;
Line 128  undef the following package variables: Line 123  undef the following package variables:
   
 =item @Sections  =item @Sections
   
 =item @SelectedSections  
   
 =item %StudentData  =item %StudentData
   
 =item @StudentDataOrder  =item @StudentDataOrder
Line 152  sub clear_classlist_variables { Line 145  sub clear_classlist_variables {
     undef(@FullClasslist);      undef(@FullClasslist);
     undef(@Students);      undef(@Students);
     undef(@Sections);      undef(@Sections);
     undef(@SelectedSections);  
     undef(%StudentData);      undef(%StudentData);
     undef(@SelectedStudentData);      undef(@SelectedStudentData);
     undef($curr_student);      undef($curr_student);
Line 178  the following package variables: Line 170  the following package variables:
   
 =item @Sections  =item @Sections
   
 =item @SelectedSections  
   
 =item %StudentData  =item %StudentData
   
 =item @SelectedStudentData  =item @SelectedStudentData
Line 204  sub PrepareClasslist { Line 194  sub PrepareClasslist {
     &clear_classlist_variables();      &clear_classlist_variables();
     #      #
     # Retrieve the classlist      # Retrieve the classlist
     my $cid  = $ENV{'request.course.id'};      my $cid  = $env{'request.course.id'};
     my $cdom = $ENV{'course.'.$cid.'.domain'};      my $cdom = $env{'course.'.$cid.'.domain'};
     my $cnum = $ENV{'course.'.$cid.'.num'};      my $cnum = $env{'course.'.$cid.'.num'};
     my ($classlist,$field_names) = &Apache::loncoursedata::get_classlist($cid,      my ($classlist,$field_names) = &Apache::loncoursedata::get_classlist($cdom,
                                                                   $cdom,$cnum);   $cnum);
     if (exists($ENV{'form.Section'})) {      my @selected_sections = &get_selected_sections();
         if (ref($ENV{'form.Section'})) {  
             @SelectedSections = @{$ENV{'form.Section'}};  
         } elsif ($ENV{'form.Section'} !~ /^\s*$/) {  
             @SelectedSections = ($ENV{'form.Section'});  
         }  
     }  
     @SelectedSections = ('all') if (! @SelectedSections);  
     foreach (@SelectedSections) {  
         if ($_ eq 'all') {  
             @SelectedSections = ('all');  
         }  
     }  
     #      #
     # Deal with instructors with restricted section access      # Deal with instructors with restricted section access
     if ($ENV{'request.course.sec'} !~ /^\s*$/) {      if ($env{'request.course.sec'} !~ /^\s*$/) {
         @SelectedSections = ($ENV{'request.course.sec'});          @selected_sections = ($env{'request.course.sec'});
     }      }
     #      #
     # Set up %StudentData      # Set up %StudentData
Line 239  sub PrepareClasslist { Line 217  sub PrepareClasslist {
     #      #
     # get the status requested      # get the status requested
     $enrollment_status = 'Active';      $enrollment_status = 'Active';
     $enrollment_status = $ENV{'form.Status'} if (exists($ENV{'form.Status'}));      $enrollment_status = $env{'form.Status'} if (exists($env{'form.Status'}));
     #      #
     # Process the classlist      # Process the classlist
     while (my ($student,$student_data) = each (%$classlist)) {      while (my ($student,$student_data) = each (%$classlist)) {
Line 266  sub PrepareClasslist { Line 244  sub PrepareClasslist {
         $Sections{$section}++;          $Sections{$section}++;
         #          #
         # Only put in the list those students we are interested in          # Only put in the list those students we are interested in
         foreach my $sect (@SelectedSections) {          foreach my $sect (@selected_sections) {
             if ( (($sect eq 'all') ||               if ( (($sect eq 'all') || 
                   ($section eq $sect)) &&                    ($section eq $sect)) &&
                  (($studenthash->{'status'} eq $enrollment_status) ||                    (($studenthash->{'status'} eq $enrollment_status) || 
Line 279  sub PrepareClasslist { Line 257  sub PrepareClasslist {
     }      }
     #      #
     # Put the consolidated section data in the right place      # Put the consolidated section data in the right place
     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 {$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
Line 288  sub PrepareClasslist { Line 266  sub PrepareClasslist {
     #      #
     # Sort the Students      # Sort the Students
     my $sortby = 'fullname';      my $sortby = 'fullname';
     $sortby = $ENV{'form.sort'} if (exists($ENV{'form.sort'}));      $sortby = $env{'form.sort'} if (exists($env{'form.sort'}));
     my @TmpStudents = sort { $a->{$sortby} cmp $b->{$sortby} ||      my @TmpStudents = sort { $a->{$sortby} cmp $b->{$sortby} ||
                              $a->{'fullname'} cmp $b->{'fullname'} } @Students;                               $a->{'fullname'} cmp $b->{'fullname'} } @Students;
     @Students = @TmpStudents;      @Students = @TmpStudents;
     #       # 
     # Now deal with that current student thing....      # Now deal with that current student thing....
     $curr_student = undef;      $curr_student = undef;
     if (exists($ENV{'form.SelectedStudent'})) {      if (exists($env{'form.SelectedStudent'})) {
         my ($current_uname,$current_dom) =           my ($current_uname,$current_dom) = 
             split(':',$ENV{'form.SelectedStudent'});              split(':',$env{'form.SelectedStudent'});
         my $i;          my $i;
         for ($i = 0; $i<=$#Students; $i++) {          for ($i = 0; $i<=$#Students; $i++) {
             next if (($Students[$i]->{'username'} ne $current_uname) ||               next if (($Students[$i]->{'username'} ne $current_uname) || 
Line 319  sub PrepareClasslist { Line 297  sub PrepareClasslist {
         }          }
     }      }
     #      #
     if (exists($ENV{'form.StudentData'})) {      if (exists($env{'form.StudentData'})) {
         if (ref($ENV{'form.StudentData'}) eq 'ARRAY') {   @SelectedStudentData = 
             @SelectedStudentData = @{$ENV{'form.StudentData'}};      &Apache::loncommon::get_env_multiple('form.StudentData');
         } else {  
             @SelectedStudentData = ($ENV{'form.StudentData'});  
         }  
     } else {      } else {
         @SelectedStudentData = ('username');          @SelectedStudentData = ('username');
     }      }
Line 338  sub PrepareClasslist { Line 313  sub PrepareClasslist {
     return;      return;
 }  }
   
   
 #######################################################  #######################################################
 #######################################################  #######################################################
   
 =pod  =pod
   
 =item get_students  =item get_selected_sections
   
 Returns a list of the selected students  Returns an array of the selected sections
   
 =cut  =cut
   
 #######################################################  #######################################################
 #######################################################  #######################################################
 sub get_students {  sub get_selected_sections {
     if (! @Students) {      my @selected_sections = 
         &PrepareClasslist()   &Apache::loncommon::get_env_multiple('form.Section');
       @selected_sections = ('all') if (! @selected_sections);
       foreach (@selected_sections) {
           if ($_ eq 'all') {
               @selected_sections = ('all');
           }
     }      }
     return @Students;      #
 }      # Deal with instructors with restricted section access
       if ($env{'request.course.sec'} !~ /^\s*$/) {
 #######################################################          @selected_sections = ($env{'request.course.sec'});
 #######################################################      }
       return @selected_sections;
 =pod  
   
 =item &current_student()  
   
 Returns a pointer to a hash containing data about the currently  
 selected student.  
   
 =cut  
   
 #######################################################  
 #######################################################  
 sub current_student {   
     return $curr_student;  
 }  }
   
 #######################################################  #######################################################
Line 382  sub current_student { Line 348  sub current_student {
   
 =pod  =pod
   
 =item &previous_student()  =item &section_and_enrollment_description
   
 Returns a pointer to a hash containing data about the student prior  Returns a string describing the currenly selected section(s) and 
 in the list of students.  Or something.    enrollment status.  
   
 =cut  Inputs: mode = 'plaintext' or 'localized'  (defaults to 'localized')
       'plaintext' is used for example in Excel spreadsheets.
 #######################################################  Returns: scalar description string.
 #######################################################  
 sub previous_student {   
     return $prev_student;  
 }  
   
 #######################################################  
 #######################################################  
   
 =pod  
   
 =item &next_student()  
   
 Returns a pointer to a hash containing data about the next student  
 to be viewed.  
   
 =cut  =cut
   
 #######################################################  #######################################################
 #######################################################  #######################################################
 sub next_student {   sub section_and_enrollment_description {
     return $next_student;      my ($mode) = @_;
 }      if (! defined($mode)) { $mode = 'localized'; }
       my @sections = &Apache::lonstatistics::get_selected_sections();
 #######################################################      my $description;
 #######################################################      if ($mode eq 'localized') {
           $description = &mt('Unable to determine section and enrollment');
 =pod      } elsif ($mode eq 'plaintext') {
           $description = 'Unable to determine section and enrollment';
 =item &clear_sequence_variables()      } else {
           $description = 'Bad parameter passed to lonstatistics::section_and_enrollment_description';
 =cut          &Apache::lonnet::logthis($description);
       }
 #######################################################      if (scalar(@sections) == 1 && $sections[0] ne 'all') {
 #######################################################          if ($mode eq 'localized') {
 sub clear_sequence_variables {              $description = &mt('Section [_1]. [_2] enrollment status.',
     undef($top_map);                                 $sections[0],$env{'form.Status'});
     undef(@Sequences);          } elsif ($mode eq 'plaintext') {
     undef(@Assessments);              $description = 'Section '.$sections[0].'. '.
                   $env{'form.Status'}.' enrollment status.';
           }
       } elsif (scalar(@sections) && $sections[0] eq 'all') {
           if ($mode eq 'localized') {
               $description = &mt('All sections. [_1] enrollment status.',
                                  $env{'form.Status'});
           } elsif ($mode eq 'plaintext') {
               $description = 'All sections. '.
                   $env{'form.Status'}.' enrollment status.';
           }
       } elsif (scalar(@sections)) {
           my $lastsection = pop(@sections);
           if ($mode eq 'localized') {
               $description = &mt('Sections [_1] and [_2]. [_3] enrollment status.',
                                  join(', ',@sections),$lastsection,
                                  $env{'form.Status'});
           } elsif ($mode eq 'plaintext') {
               $description = 
                   'Sections '.join(', ',@sections).' and '.$lastsection.'. '.
                   $env{'form.Status'}.' enrollment status.';
           }
       }
       return $description;
 }  }
   
 #######################################################  #######################################################
Line 435  sub clear_sequence_variables { Line 410  sub clear_sequence_variables {
   
 =pod  =pod
   
 =item &SetSelectedMaps($elementname)  =item get_students
   
 Sets the @SelectedMaps array from $ENV{'form.'.$elementname};  Returns a list of the selected students
   
 =cut  =cut
   
 #######################################################  #######################################################
 #######################################################  #######################################################
 sub SetSelectedMaps {  sub get_students {
     my $elementname = shift;      if (! @Students) {
     if (exists($ENV{'form.'.$elementname})) {          &PrepareClasslist()
         if (ref($ENV{'form.'.$elementname})) {  
             @SelectedMaps = @{$ENV{'form.'.$elementname}};  
         } else {  
             @SelectedMaps = ($ENV{'form.'.$elementname});  
         }  
     } else {  
         @SelectedMaps = ('all');  
     }      }
       return @Students;
 }  }
   
   
 #######################################################  #######################################################
 #######################################################  #######################################################
   
 =pod  =pod
   
 =item &Sequences_with_Assess()  =item &current_student()
   
 Returns an array containing the subset of @Sequences which contain  Returns a pointer to a hash containing data about the currently
 assessments.  selected student.
   
 =cut  =cut
   
 #######################################################  #######################################################
 #######################################################  #######################################################
 sub Sequences_with_Assess {  sub current_student { 
     my ($mode) = @_;      return $curr_student;
     $mode = 'selected' if (! defined($mode));  
     my @Sequences_to_Show;  
     foreach my $sequence (@Sequences) {  
         next if ($sequence->{'num_assess'} < 1);  
         if ($mode eq 'all') {  
             push (@Sequences_to_Show,$sequence);  
         } elsif ($mode eq 'selected') {  
             foreach my $map_symb (@SelectedMaps) {  
                 if ($sequence->{'symb'} eq $map_symb || $map_symb eq 'all'){  
                     push (@Sequences_to_Show,$sequence);  
                     last; # Only put it in once  
                 }  
             }  
         }  
   
     }  
     return @Sequences_to_Show;  
 }  }
   
 #######################################################  #######################################################
Line 497  sub Sequences_with_Assess { Line 448  sub Sequences_with_Assess {
   
 =pod  =pod
   
 =item &PrepareCourseData($r)  =item &previous_student()
   
   Returns a pointer to a hash containing data about the student prior
   in the list of students.  Or something.  
   
 =cut  =cut
   
 #######################################################  #######################################################
 #######################################################  #######################################################
 sub PrepareCourseData {  sub previous_student { 
     my ($r) = @_;      return $prev_student;
     &clear_sequence_variables();  
     my ($top,$sequences,$assessments) =   
         &Apache::loncoursedata::get_sequence_assessment_data();  
     if (! defined($top) || ! ref($top)) {  
         # There has been an error, better report it  
         &Apache::lonnet::logthis('top is undefined');  
         return;  
     }  
     $top_map = $top if (ref($top));  
     @Sequences = @{$sequences} if (ref($sequences) eq 'ARRAY');  
     @Assessments = @{$assessments} if (ref($assessments) eq 'ARRAY');  
     return;  
 }  }
   
 #######################################################  #######################################################
Line 524  sub PrepareCourseData { Line 466  sub PrepareCourseData {
   
 =pod  =pod
   
 =item &log_sequence($sequence,$recursive,$padding)  =item &next_student()
   
 Write data about the sequence to a logfile.  If $recursive is not  Returns a pointer to a hash containing data about the next student
 undef the data is written recursively.  $padding is used for recursive  to be viewed.
 calls.  
   
 =cut  =cut
   
 #######################################################  #######################################################
 #######################################################  #######################################################
 sub log_sequence {  sub next_student { 
     my ($seq,$recursive,$padding) = @_;      return $next_student;
     $padding = '' if (! defined($padding));  
     if (ref($seq) ne 'HASH') {  
         &Apache::lonnet::logthis('log_sequence passed bad sequnce');  
         return;  
     }  
     &Apache::lonnet::logthis($padding.'sequence '.$seq->{'title'});  
     while (my($key,$value) = each(%$seq)) {  
         next if ($key eq 'contents');  
         if (ref($value) eq 'ARRAY') {  
             for (my $i=0;$i< scalar(@$value);$i++) {  
                 &Apache::lonnet::logthis($padding.$key.'['.$i.']='.  
                                          $value->[$i]);  
             }  
         } else {  
             &Apache::lonnet::logthis($padding.$key.'='.$value);  
         }  
     }  
     if (defined($recursive)) {  
         &Apache::lonnet::logthis($padding.'-'x20);  
         &Apache::lonnet::logthis($padding.'contains:');  
         foreach my $item (@{$seq->{'contents'}}) {  
             if ($item->{'type'} eq 'container') {  
                 &log_sequence($item,$recursive,$padding.'    ');  
             } else {  
                 &Apache::lonnet::logthis($padding.'title = '.$item->{'title'});  
                 while (my($key,$value) = each(%$item)) {  
                     next if ($key eq 'title');  
                     if (ref($value) eq 'ARRAY') {  
                         for (my $i=0;$i< scalar(@$value);$i++) {  
                             &Apache::lonnet::logthis($padding.$key.'['.$i.']='.  
                                                      $value->[$i]);  
                         }  
                     } else {  
                         &Apache::lonnet::logthis($padding.$key.'='.$value);  
                     }  
                 }  
             }  
         }  
         &Apache::lonnet::logthis($padding.'end contents of '.$seq->{'title'});  
         &Apache::lonnet::logthis($padding.'-'x20);  
     }  
     return;  
 }  }
   
 ##############################################  ##############################################
Line 643  sub StudentDataSelect { Line 542  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 {
       my ($elementname) = @_;
       my @selected_maps = 
    &Apache::loncommon::get_env_multiple('form.'.$elementname);
       @selected_maps = ('all') if (! @selected_maps);
       foreach my $map (@selected_maps) {
           if ($map eq 'all') {
               @selected_maps = ('all');
               last;
           }
       }
       return @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 {
       my ($mode) = @_;
       $mode = 'selected' if (! defined($mode));
       my $navmap = Apache::lonnavmaps::navmap->new();
       if (!defined($navmap)) {
           return ('Can not open Coursemap');
       }
       #
       my @sequences = $navmap->retrieveResources(undef,
                                                  sub { shift->is_map(); },1,0,1);
       my @sequences_with_assessments;
       for my $sequence ($navmap->getById('0.0'), @sequences) {
    if ($navmap->hasResource($sequence,sub { shift->is_problem(); },0,1)){
               push(@sequences_with_assessments,$sequence);
           }
       }
       #
       my @sequences_to_show;
       foreach my $sequence (@sequences_with_assessments) {
           if ($mode eq 'all') {
               push (@sequences_to_show,$sequence);
           } elsif ($mode eq 'selected') {
               foreach my $map_symb (&get_selected_maps('Maps')) {
                   if ($sequence->symb eq $map_symb || $map_symb eq 'all'){
                       push (@sequences_to_show,$sequence);
                       last; # Only put it in once
                   }
               }
           }
   
       }
       return $navmap,@sequences_to_show;
   }
   
 ##############################################  ##############################################
 ##############################################  ##############################################
   
 =pod   =pod 
   
 =item &MapSelect($elementname,$status,$numvisible,$restriction)   =item &map_select($elementname,$status,$numvisible,$restriction) 
   
 Returns html for a selection box allowing the user to choose one (or more)   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.  of the sequences in the course.  The values of the sequences are the symbs.
Line 662  If the top sequence is selected, the val Line 645  If the top sequence is selected, the val
   
 =item $numvisible The number of options to be visible  =item $numvisible The number of options to be visible
   
 =item $restriction Code reference to subroutine which returns true or   
 false.  The code must expect a reference to a sequence data structure.  
   
 =back  =back
   
 =cut  =cut
   
 ##############################################  ##############################################
 ##############################################  ##############################################
 sub MapSelect {  sub map_select {
     my ($elementname,$status,$numvisible,$restriction)=@_;      my ($elementname,$status,$numvisible)=@_;
     if ($numvisible < 1) {      if ($numvisible < 1) {
         return;          return;
     }      }
     #      #
     # Set up array of selected items      # Set up array of selected items
     &SetSelectedMaps($elementname);      my @selected_maps = &get_selected_maps($elementname);
     #  
     # Set up the restriction call  
     if (! defined($restriction)) {  
         $restriction = sub { 1; };  
     }  
     #      #
     # Build the form element      # Build the form element
     my $Str = "\n";      my $form = "\n";
     $Str .= '<select name="'.$elementname.'" ';      $form .= '<select name="'.$elementname.'" ';
     if ($status ne 'single') {      if ($status ne 'single') {
         $Str .= 'multiple="true" ';          $form .= 'multiple="true" ';
     }  
     $Str .= 'size="'.$numvisible.'" >'."\n";  
     #  
     # Deal with 'all'  
     foreach (@SelectedMaps) {  
         if ($_ eq 'all') {  
             @SelectedMaps = ('all');  
             last;  
         }  
     }      }
       $form .= 'size="'.$numvisible.'" >'."\n";
     #      #
     # Put in option for 'all'      # Put in option for 'all'
     $Str .= '    <option value="all" ';      $form .= '    <option value="all" ';
     foreach (@SelectedMaps) {      if ($selected_maps[0] eq 'all') {
         if ($_ eq 'all') {          $form .= 'selected ';
             $Str .= 'selected ';  
             last;  
         }  
     }      }
     $Str .= ">all</option>\n";      $form .= ">all</option>\n";
     #      #
     # Loop through the sequences      # Loop through the sequences
     foreach my $seq (@Sequences) {      my @sequences = &selected_sequences_with_assessments('all');
         next if (! $restriction->($seq));      my $navmap;
         $Str .= '    <option value="'.$seq->{'symb'}.'" ';      if (!ref($sequences[0])) {
         foreach (@SelectedMaps) {          return $sequences[0];
             if ($seq->{'symb'} eq $_) {      } else {
                 $Str .= 'selected ';          $navmap = shift(@sequences);
       }
       foreach my $seq (@sequences){
           $form .= '    <option value="'.$seq->symb.'" ';
           foreach (@selected_maps) {
               if ($seq->symb eq $_) {
                   $form .= 'selected ';
                 last;                  last;
             }              }
         }          }
         $Str .= '>'.$seq->{'title'}."</option>\n";          $form .= '>'.$seq->compTitle."</option>\n";
     }      }
     $Str .= "</select>\n";      $form .= "</select>\n";
     return $Str;      return $form;
 }  }
   
 ##############################################  ##############################################
Line 737  sub MapSelect { Line 707  sub MapSelect {
 Returns html for a selection box allowing the user to choose one (or more)   Returns html for a selection box allowing the user to choose one (or more) 
 of the sections in the course.    of the sections in the course.  
   
 Uses the package variables @Sections and @SelectedSections  Uses the package variables @Sections
 =over 4  =over 4
   
 =item $elementname The name of the HTML form element  =item $elementname The name of the HTML form element
Line 774  sub SectionSelect { Line 744  sub SectionSelect {
     # 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 (@SelectedSections) {          foreach (&get_selected_sections()) {
             if ($s eq $_) {              if ($s eq $_) {
                 $Str .= 'selected ';                  $Str .= 'selected ';
                 last;                  last;
Line 786  sub SectionSelect { Line 756  sub SectionSelect {
     return $Str;      return $Str;
 }  }
   
 #######################################################  
 #######################################################  
   
 =pod  
   
 =item &CreateAndParseOutputSelector()  
   
 Construct a selection list of options for output and parse output selections.  
   
 =cut  
   
 #######################################################  
 #######################################################  
 sub OutputDescriptions {  
     my (@OutputOptions) = @_;  
     my $Str = '';  
     $Str .= "<h2>Output Modes</h2>\n";  
     $Str .= "<dl>\n";  
     foreach my $outputmode (@OutputOptions) {  
  $Str .="    <dt>".$outputmode->{'name'}."</dt>\n";  
  $Str .="        <dd>".$outputmode->{'description'}."</dd>\n";  
     }  
     $Str .= "</dl>\n";  
     return $Str;  
 }  
   
 sub CreateAndParseOutputSelector {  
     my ($elementname,$default,@OutputOptions) = @_;  
     my $output_mode;  
     my $show;  
     my $Str = '';  
     #  
     # Format for output options is 'mode, restrictions';  
     my $selected = $default;  
     if (exists($ENV{'form.'.$elementname})) {  
         if (ref($ENV{'form.'.$elementname} eq 'ARRAY')) {  
             $selected = $ENV{'form.'.$elementname}->[0];  
         } else {  
             $selected = $ENV{'form.'.$elementname};  
         }  
     }  
     #  
     # Set package variables describing output mode  
     $output_mode = 'html';  
     $show        = 'all';  
     foreach my $option (@OutputOptions) {  
         next if ($option->{'value'} ne $selected);  
         $output_mode = $option->{'mode'};  
         $show        = $option->{'show'};  
     }  
     #  
     # Build the form element  
     $Str = qq/<select size="5" name="$elementname">/;  
     foreach my $option (@OutputOptions) {  
         if (exists($option->{'special'}) &&   
             $option->{'special'} =~ /do not show/) {  
             next;  
         }  
         $Str .= "\n".'    <option value="'.$option->{'value'}.'"';  
         $Str .= " selected " if ($option->{'value'} eq $selected);  
         $Str .= ">".&mt($option->{'name'})."<\/option>";  
     }  
     $Str .= "\n</select>";  
     return ($Str,$output_mode,$show);  
 }  
   
 ###############################################  
 ###############################################  
   
 =pod   
   
 =item &Gather_Student_Data()  
   
 Ensures all student data is up to date.  
   
 =cut  
   
 ###############################################  
 ###############################################  
 sub Gather_Student_Data {  
     my ($r) = @_;  
     my $c = $r->connection();  
     #  
     &Apache::loncoursedata::clear_internal_caches();  
     #  
     my @Sequences = &Apache::lonstatistics::Sequences_with_Assess();  
     #  
     my @Students = @Apache::lonstatistics::Students;  
     #  
     # Open the progress window  
     my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin  
         ($r,'Statistics Compilation Status',  
          'Statistics Compilation Progress', scalar(@Students));  
     #  
     while (my $student = shift @Students) {  
         return if ($c->aborted());  
         my ($status,undef) = &Apache::loncoursedata::ensure_current_data  
             ($student->{'username'},$student->{'domain'},  
              $ENV{'request.course.id'});  
         &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,  
                                                  &mt('last student'));  
     }  
     &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);  
     $r->rflush();  
 }  
   
 ###############################################  
 ###############################################  
   
 =pod   
   
 =item &Gather_Full_Student_Data()  
   
 Ensures all student data is up to date.  
   
 =cut  
   
 ###############################################  
 ###############################################  
 sub Gather_Full_Student_Data {  
     my ($r,$formname,$inputname) = @_;  
     my $status_type;  
     if (defined($formname)) {  
         $status_type = 'inline';  
     } else {  
         $status_type = 'popup';  
     }  
     my $c = $r->connection();  
     #  
     &Apache::loncoursedata::clear_internal_caches();  
     #  
     my @Students = @Apache::lonstatistics::Students;  
     #  
     # Open the progress window  
     my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin  
         ($r,&mt('Student Data Compilation Status'),  
          &mt('Student Data Compilation Progress'), scalar(@Students),  
          $status_type,undef,$formname,$inputname);  
     #  
     while (my $student = shift @Students) {  
         return if ($c->aborted());  
         my ($status,undef) = &Apache::loncoursedata::ensure_current_full_data  
             ($student->{'username'},$student->{'domain'},  
              $ENV{'request.course.id'});  
         &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,  
                                                  &mt('last student'));  
     }  
     &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);  
     $r->rflush();  
 }  
   
 ##################################################  ##################################################
 ##################################################  ##################################################
 sub DisplayClasslist {  sub DisplayClasslist {
Line 970  sub DisplayClasslist { Line 789  sub DisplayClasslist {
     my @Fields = ('fullname','username','domain','id','section','status');      my @Fields = ('fullname','username','domain','id','section','status');
     #      #
     $Str = '';      $Str = '';
       my @selected_sections = &get_selected_sections();
     if (! @Students) {      if (! @Students) {
         if ($SelectedSections[0] eq 'all') {           if ($selected_sections[0] eq 'all') { 
             if (lc($ENV{'form.Status'}) eq 'any') {              if (lc($env{'form.Status'}) eq 'any') {
                 $Str .= '<h2>'.                  $Str .= '<h2>'.
                     &mt('There are no students in the course.').                      &mt('There are no students in the course.').
                     '</h2>';                      '</h2>';
             } elsif (lc($ENV{'form.Status'}) eq 'active') {              } elsif (lc($env{'form.Status'}) eq 'active') {
                 $Str .= '<h2>'.                  $Str .= '<h2>'.
                 &mt('There are no currently enrolled students in the course.').                  &mt('There are no currently enrolled students in the course.').
                     '</h2>';                      '</h2>';
             } elsif (lc($ENV{'form.Status'}) eq 'expired') {              } elsif (lc($env{'form.Status'}) eq 'expired') {
                 $Str .= '<h2>'.                  $Str .= '<h2>'.
                     &mt('There are no previously enrolled students in the course.').                      &mt('There are no previously enrolled students in the course.').
                         '</h2>';                          '</h2>';
             }              }
         } else {           } else { 
             my $sections;              my $sections;
             if (lc($ENV{'form.Status'}) eq 'any') {              if (lc($env{'form.Status'}) eq 'any') {
                 $Str .= '<h2>'.                  $Str .= '<h2>'.
                     &mt('There are no students in the selected sections.').                      &mt('There are no students in the selected sections.').
                     '</h2>';                      '</h2>';
             } elsif (lc($ENV{'form.Status'}) eq 'active') {              } elsif (lc($env{'form.Status'}) eq 'active') {
                 $Str .= '<h2>'.                  $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>';                      '</h2>';
             } elsif (lc($ENV{'form.Status'}) eq 'expired') {              } elsif (lc($env{'form.Status'}) eq 'expired') {
                 $Str .= '<h2>'.                  $Str .= '<h2>'.
                     &mt('There are no previously enrolled students in the selected sections.').                      &mt('There are no previously enrolled students in the selected sections.').
                     '</h2>';                      '</h2>';
Line 1036  sub DisplayClasslist { Line 856  sub DisplayClasslist {
             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 .= &Apache::lonnet::escape('student_assessment');
                 $Str .= '&sort='.&Apache::lonnet::escape($ENV{'form.sort'});                  $Str .= '&sort='.&Apache::lonnet::escape($env{'form.sort'});
                 $Str .= '&SelectedStudent=';                  $Str .= '&SelectedStudent=';
                 $Str .= &Apache::lonnet::escape($sname).'">';                  $Str .= &Apache::lonnet::escape($sname).'">';
                 $Str .= $student->{$field}.'&nbsp';                  $Str .= $student->{$field}.'&nbsp';
Line 1081  sub CreateMainMenu { Line 901  sub CreateMainMenu {
                    { internal_name => 'student_submission_reports',                     { internal_name => 'student_submission_reports',
                      name => &mt('Student Submission Reports'),                       name => &mt('Student Submission Reports'),
                      short_description =>                        short_description => 
     &mt('Prepare Excel spreadsheets of student submissions.'),      &mt('Prepare reports of student submissions.'),
                  },                   },
                    { internal_name => 'survey_reports',                     { internal_name => 'survey_reports',
                      name => &mt('Survey Reports'),                       name => &mt('Survey Reports'),
Line 1128  sub handler { Line 948  sub handler {
     if ($loaderror) { return $loaderror; }      if ($loaderror) { return $loaderror; }
     $loaderror=      $loaderror=
        &Apache::lonnet::overloaderror($r,         &Apache::lonnet::overloaderror($r,
          $ENV{'course.'.$ENV{'request.course.id'}.'.home'});           $env{'course.'.$env{'request.course.id'}.'.home'});
     if ($loaderror) { return $loaderror; }      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'}=
             $r->uri.":vgr:0:0:Cannot view grades for complete course";              $r->uri.":vgr:0:0:Cannot view grades for complete course";
         if (! &Apache::lonnet::allowed('vgr',          if (! &Apache::lonnet::allowed('vgr',
                       $ENV{'request.course.id'}.'/'.$ENV{'request.course.sec'})) {                        $env{'request.course.id'}.'/'.$env{'request.course.sec'})) {
             $ENV{'user.error.msg'}=              $env{'user.error.msg'}=
                 $r->uri.":vgr:0:0:Cannot view grades with given role";                  $r->uri.":vgr:0:0:Cannot view grades with given role";
             return HTTP_NOT_ACCEPTABLE;              return HTTP_NOT_ACCEPTABLE;
         }          }
Line 1163  sub handler { Line 983  sub handler {
     td.essay          { border: 1px solid gray; }      td.essay          { border: 1px solid gray; }
 </style>  </style>
 ENDSTYLE  ENDSTYLE
     $r->print('<html><head><title>'.      my $html=&Apache::lonxml::xmlbegin();
       $r->print($html.'<head><title>'.
               &mt('Course Statistics and Charts').                &mt('Course Statistics and Charts').
               '</title>'.$style.                '</title>'.$style.
               "</head>\n".                "</head>\n".
Line 1177  ENDSTYLE Line 998  ENDSTYLE
                                             text =>'Statistics',                                              text =>'Statistics',
                                             faq=>139,                                              faq=>139,
                                             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
                   (undef,&mt('Statistics Main Page')).                    (undef,&mt('Statistics Main Page')).
                   &CreateMainMenu());                    &CreateMainMenu());
Line 1202  ENDSTYLE Line 1023  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{'requres.course.id'});
         }          }
         #          #
         # Begin form output          # Begin form output
Line 1211  ENDSTYLE Line 1032  ENDSTYLE
         $r->print('method="post" action="/adm/statistics">');          $r->print('method="post" action="/adm/statistics">');
         $r->rflush();          $r->rflush();
         #          #
         my $GoToPage = $ENV{'form.reportSelected'};          my $GoToPage = $env{'form.reportSelected'};
         #  
         # Set up the statistics and chart environment  
         &PrepareCourseData($r);  
         #          #
         $r->print('<input type="hidden" name="reportSelected" value="'.          $r->print('<input type="hidden" name="reportSelected" value="'.
                   $GoToPage.'">');                    $GoToPage.'">');

Removed from v.1.110  
changed lines
  Added in v.1.125


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