Diff for /loncom/interface/lonstatistics.pm between versions 1.66 and 1.80

version 1.66, 2003/04/18 15:50:55 version 1.80, 2003/08/29 21:11:25
Line 206  upon the calling context. Line 206  upon the calling context.
 #######################################################  #######################################################
 #######################################################  #######################################################
 sub PrepareClasslist {  sub PrepareClasslist {
     my $r = shift;  
     my %Sections;      my %Sections;
     &clear_classlist_variables();      &clear_classlist_variables();
     #      #
Line 230  sub PrepareClasslist { Line 229  sub PrepareClasslist {
         }          }
     }      }
     #      #
       # Deal with instructors with restricted section access
       if ($ENV{'request.course.sec'} !~ /^\s*$/) {
           @SelectedSections = ($ENV{'request.course.sec'});
       }
       #
     # Set up %StudentData      # Set up %StudentData
     @StudentDataOrder = qw/fullname username domain id section status/;      @StudentDataOrder = qw/fullname username domain id section status/;
     foreach my $field (@StudentDataOrder) {      foreach my $field (@StudentDataOrder) {
Line 238  sub PrepareClasslist { Line 242  sub PrepareClasslist {
         $StudentData{$field}->{'width'} =           $StudentData{$field}->{'width'} = 
                                $StudentData{$field}->{'base_width'};                                 $StudentData{$field}->{'base_width'};
     }      }
       #
       # get the status requested
       my $requested_status = 'Active';
       $requested_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 273  sub PrepareClasslist {
         #          #
         # 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 (@SelectedSections) {
             if (($sect eq 'all') || ($section eq $sect)) {              if ( (($sect eq 'all') || 
                     ($section eq $sect)) &&
                    (($studenthash->{'status'} eq $requested_status) || 
                     ($requested_status eq 'Any')) 
                    ){
                 push (@Students,$studenthash);                  push (@Students,$studenthash);
                 last;                  last;
             }              }
Line 274  sub PrepareClasslist { Line 285  sub PrepareClasslist {
     }      }
     #      #
     # Put the consolidated section data in the right place      # Put the consolidated section data in the right place
     @Sections = sort {$a cmp $b} keys(%Sections);      if ($ENV{'request.course.sec'} !~ /^\s*$/) {
     unshift(@Sections,'all'); # Put 'all' at the front of the list          @Sections = ($ENV{'request.course.sec'});
       } else {
           @Sections = sort {$a cmp $b} keys(%Sections);
           unshift(@Sections,'all'); # Put 'all' at the front of the list
       }
     #      #
     # Sort the Students      # Sort the Students
     my $sortby = 'fullname';      my $sortby = 'fullname';
Line 285  sub PrepareClasslist { Line 300  sub PrepareClasslist {
     @Students = @TmpStudents;      @Students = @TmpStudents;
     #       # 
     # Now deal with that current student thing....      # Now deal with that current student thing....
     if (exists($ENV{'form.StudentAssessmentStudent'})) {      $curr_student = undef;
       if (exists($ENV{'form.SelectedStudent'})) {
         my ($current_uname,$current_dom) =           my ($current_uname,$current_dom) = 
             split(':',$ENV{'form.StudentAssessmentStudent'});              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 295  sub PrepareClasslist { Line 311  sub PrepareClasslist {
             $curr_student = $Students[$i];              $curr_student = $Students[$i];
             last; # If we get here, we have our student.              last; # If we get here, we have our student.
         }          }
         if ($i == 0) {          if (defined($curr_student)) {
             $prev_student = 'none';              if ($i == 0) {
         } else {                  $prev_student = undef;
             $prev_student = $Students[$i-1];              } else {
         }                  $prev_student = $Students[$i-1];
         if ($i == $#Students) {              }
             $next_student = 'none';              if ($i == $#Students) {
         } else {                  $next_student = undef;
             $next_student = $Students[$i+1];              } else {
                   $next_student = $Students[$i+1];
               }
         }          }
     }      }
     #      #
Line 314  sub PrepareClasslist { Line 332  sub PrepareClasslist {
             @SelectedStudentData = ($ENV{'form.StudentData'});              @SelectedStudentData = ($ENV{'form.StudentData'});
         }          }
     } else {      } else {
         @SelectedStudentData = ('fullname');          @SelectedStudentData = ('username');
     }      }
     foreach (@SelectedStudentData) {      foreach (@SelectedStudentData) {
         if ($_ eq 'all') {          if ($_ eq 'all') {
Line 326  sub PrepareClasslist { Line 344  sub PrepareClasslist {
     return;      return;
 }  }
   
   
   #######################################################
   #######################################################
   
   =pod
   
   =item get_students
   
   Returns a list of the selected students
   
   =cut
   
   #######################################################
   #######################################################
   sub get_students {
       if (! @Students) {
           &PrepareClasslist()
       }
       return @Students;
   }
   
 #######################################################  #######################################################
 #######################################################  #######################################################
   
Line 341  selected student. Line 380  selected student.
 #######################################################  #######################################################
 #######################################################  #######################################################
 sub current_student {   sub current_student { 
     if (defined($curr_student)) {      return $curr_student;
         return $curr_student;  
     } else {  
         return 'All Students';  
     }  
 }  }
   
 #######################################################  #######################################################
Line 363  in the list of students.  Or something. Line 398  in the list of students.  Or something.
 #######################################################  #######################################################
 #######################################################  #######################################################
 sub previous_student {   sub previous_student { 
     if (defined($prev_student)) {      return $prev_student;
         return $prev_student;  
     } else {  
         return 'No Student Selected';  
     }  
 }  }
   
 #######################################################  #######################################################
Line 385  to be viewed. Line 416  to be viewed.
 #######################################################  #######################################################
 #######################################################  #######################################################
 sub next_student {   sub next_student { 
     if (defined($next_student)) {      return $next_student;
         return $next_student;  
     } else {  
         return 'No Student Selected';  
     }  
 }  }
   
 #######################################################  #######################################################
Line 492  sub PrepareCourseData { Line 519  sub PrepareCourseData {
         my $name_length = length($seq->{'title'});          my $name_length = length($seq->{'title'});
         my $num_parts = $seq->{'num_assess_parts'};          my $num_parts = $seq->{'num_assess_parts'};
         #          #
         # The number of columns needed for the summation text:           # Use 3 digits for each the sum and total, which means 7 total...
         #    " 1/5" = 1+3 columns, " 10/99" = 1+5 columns          my $num_col = $num_parts+7;
         my $sum_length = 1+1+2*(length($num_parts));  
         my $num_col = $num_parts+$sum_length;  
         if ($num_col < $name_length) {          if ($num_col < $name_length) {
             $num_col = $name_length;              $num_col = $name_length;
         }          }
Line 723  sub MapSelect { Line 748  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
 =over 4  =over 4
   
 =item $elementname The name of the HTML form element  =item $elementname The name of the HTML form element
Line 731  of the sections in the course. Line 757  of the sections in the course.
   
 =item $numvisible The number of options to be visible  =item $numvisible The number of options to be visible
   
 =item $selected Array ref to the names of the already selected sections.  
 If undef, $ENV{'form.'.$elementname} is used.    
 If $ENV{'form.'.$elementname} is also empty, none will be selected.  
   
 =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
Line 750  sub SectionSelect { Line 769  sub SectionSelect {
         return;          return;
     }      }
     #      #
       # Make sure we have the data we need to continue
       if (! @Sections) {
           &PrepareClasslist()
       }
       #
     # Build the form element      # Build the form element
     my $Str = "\n";      my $Str = "\n";
     $Str .= '<select name="'.$elementname.'" ';      $Str .= '<select name="'.$elementname.'" ';
Line 773  sub SectionSelect { Line 797  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 .= ">".$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();
       #
       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,
                                                    'last student');
       }
       &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
       $r->rflush();
   }
   
 ##################################################  ##################################################
 ##################################################  ##################################################
 sub DisplayClasslist {  sub DisplayClasslist {
Line 781  sub DisplayClasslist { Line 909  sub DisplayClasslist {
     my @Fields = ('fullname','username','domain','id','section');      my @Fields = ('fullname','username','domain','id','section');
     #      #
     my $Str='';      my $Str='';
       if (! @Students) {
           if ($SelectedSections[0] eq 'all') { 
               if (lc($ENV{'form.Status'}) eq 'any') {
                   $Str .= '<h2>There are no students in the course.</h2>';
               } elsif (lc($ENV{'form.Status'}) eq 'active') {
                   $Str .= '<h2>There are no currently enrolled students in '.
                       'the course.</h2>';
               } elsif (lc($ENV{'form.Status'}) eq 'expired') {
                   $Str .= '<h2>There are no previously enrolled '.
                       'students in the course.</h2>';
               }
           } else { 
               my $sections;
               if (@SelectedSections == 1) {
                   $sections = 'section '.$SelectedSections[0];
               } elsif (@SelectedSections > 2) {
                   $sections = 'sections '.join(', ',@SelectedSections);
                   $sections =~ s/, ([^,])*$/, and $1/;
               } else {
                   $sections = 'sections '.join(' and ',@SelectedSections);
               }
               if (lc($ENV{'form.Status'}) eq 'any') {
                   $Str .= '<h2>There are no students in '.$sections.'.</h2>';
               } elsif (lc($ENV{'form.Status'}) eq 'active') {
                   $Str .= '<h2>There are no currently enrolled students '.
                       'in '.$sections.'.</h2>';
               } elsif (lc($ENV{'form.Status'}) eq 'expired') {
                   $Str .= '<h2>There are no previously enrolled students '.
                       'in '.$sections.'.</h2>';
               }
           }
           $Str.= '<a href="/adm/statistics?reportSelected=student_assessment">'.
               'Return to the chart.</a>';
           $r->print($Str);
           $r->rflush();
           return;
       }
   
       # "Click" is asinine but it is probably not my place to change the world.
       $Str .= '<h2>Click on a students name or username to view their chart</h2>';
     $Str .= '<table border="0"><tr><td bgcolor="#777777">'."\n";      $Str .= '<table border="0"><tr><td bgcolor="#777777">'."\n";
     $Str .= '<table border="0" cellpadding="3"><tr bgcolor="#e6ffff">'."\n";      $Str .= '<table border="0" cellpadding="3"><tr bgcolor="#e6ffff">'."\n";
     foreach my $field (@Fields) {      foreach my $field (@Fields) {
Line 801  sub DisplayClasslist { Line 969  sub DisplayClasslist {
         #          #
         foreach my $field (@Fields) {          foreach my $field (@Fields) {
             $Str .= '<td>';              $Str .= '<td>';
             if ($field eq 'fullname') {              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 .= '&StudentAssessmentStudent=';                  $Str .= '&sort='.&Apache::lonnet::escape($ENV{'form.sort'});
                   $Str .= '&SelectedStudent=';
                 $Str .= &Apache::lonnet::escape($sname).'">';                  $Str .= &Apache::lonnet::escape($sname).'">';
                 $Str .= $student->{$field}.'&nbsp';                  $Str .= $student->{$field}.'&nbsp';
                 $Str .= '</a>';                  $Str .= '</a>';
Line 830  sub CreateMainMenu { Line 999  sub CreateMainMenu {
     #      #
     my $Str = '';      my $Str = '';
     #      #
     $Str .= '<table border="0"><tbody><tr>'."\n";      $Str  = '<input type="hidden" name="reportSelected" value="'.$current.'">';
     $Str .= '<td></td>'."\n";  #    $Str .= '<table border="0"><tbody><tr>'."\n";
     $Str .= '<td align="center"><b>Select a Report</b></td>'."\n";  #    $Str .= '<td align="center"><b>Report:</b></td>'."\n";
     $Str .= '<td align="center"><b>Student Status</b></td></tr>'."\n";  #    $Str .= '<td align="center">';
     $Str .= '<tr>'."\n";  #    $Str .= '<select name="reportSelected" '.
     #  #        'onchange="document.Statistics.submit()">'."\n";
     $Str .= '<td align="center"><input type="submit" name="Refresh" ';  #    foreach (sort(keys(%$reports))) {
     $Str .= 'value="Update Display" /></td>'."\n";  #        $Str .= '<option value="'.$_.'"';
     #  #        if($current eq $_) {
     $Str .= '<td align="center">';  #            $Str .= ' selected';
     $Str .= '<select name="reportSelected" >'."\n";  #        }
     foreach (sort(keys(%$reports))) {  #        $Str .= '>'.$reports->{$_}.'</option>'."\n";
         $Str .= '<option value="'.$_.'"';  #    }
         if($current eq $_) {  #    $Str .= '</select></td>'."\n";
             $Str .= ' selected';  #    #
         }  #    $Str .= '<td>'.('&nbsp;'x30).'</td>';
         $Str .= '>'.$reports->{$_}.'</option>'."\n";  #    $Str .= '<td align="center">'.
     }  #        '<input type="submit" name="ClearCache" value="Clear Caches" />'.
     $Str .= '</select></td>'."\n";  #            "</td>\n";
     #  #    $Str .= '</tr></tbody></table>'."\n";
     $Str .= '<td align="center">';  #    $Str .= '<hr>'."\n";
     $Str .= &Apache::lonhtmlcommon::StatusOptions($status, 'Statistics');  
     $Str .= '</td>'."\n";  
     #  
     $Str .= '</tr></tbody></table>'."\n";  
     $Str .= '<hr>'."\n";  
     #      #
     return $Str;      return $Str;
 }  }
Line 875  sub handler { Line 1039  sub handler {
     if ($loaderror) { return $loaderror; }      if ($loaderror) { return $loaderror; }
     #      #
     # Check for access      # Check for access
     unless(&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";
         return HTTP_NOT_ACCEPTABLE;          if (! &Apache::lonnet::allowed('vgr',
                         $ENV{'request.course.id'}.'/'.$ENV{'request.course.sec'})) {
               $ENV{'user.error.msg'}=
                   $r->uri.":vgr:0:0:Cannot view grades with given role";
               return HTTP_NOT_ACCEPTABLE;
           }
     }      }
     #      #
     # Set document type for header only      # Set document type for header only
Line 900  sub handler { Line 1069  sub handler {
     # Extract form elements from query string      # Extract form elements from query string
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                                             ['sort','reportSelected',                                              ['sort','reportSelected',
                                              'StudentAssessmentStudent']);                                               'SelectedStudent']);
     if (! exists($ENV{'form.reportSelected'})) {      if (! exists($ENV{'form.reportSelected'})) {
         $ENV{'form.reportSelected'} = 'student_assessment';          $ENV{'form.reportSelected'} = 'student_assessment';
     }      }
Line 925  END Line 1094  END
         return;          return;
     }      }
     #      #
       # Clean out the caches
       if (exists($ENV{'form.ClearCache'})) {
           &Apache::loncoursedata::delete_caches($ENV{'requres.course.id'});
       }
       #
     # Set up the statistics and chart environment      # Set up the statistics and chart environment
     &PrepareClasslist($r);      &PrepareClasslist();
     &PrepareCourseData($r);      &PrepareCourseData($r);
     #      #
     # Begin form output      # Begin form output
Line 937  END Line 1111  END
     my %reports = ('classlist'          => 'Class list',      my %reports = ('classlist'          => 'Class list',
                    'problem_statistics' => 'Problem Statistics',                     'problem_statistics' => 'Problem Statistics',
                    'student_assessment' => 'Problem Status Chart',                     'student_assessment' => 'Problem Status Chart',
                    'percentage'         => 'Correct-problems Plot',  #                   'percentage'         => 'Correct-problems Plot',
                    'option_response'    => 'Option Response Analysis',  #                   'option_response'    => 'Option Response Analysis',
 #                   'activitylog'        => 'Activity Log',  #                   'activitylog'        => 'Activity Log',
                    );                     );
     $r->print(&CreateMainMenu($ENV{'form.status'},      $r->print(&CreateMainMenu($ENV{'form.status'},
Line 956  END Line 1130  END
         &Apache::lonstudentassessment::BuildStudentAssessmentPage($r,$c);          &Apache::lonstudentassessment::BuildStudentAssessmentPage($r,$c);
     } elsif($GoToPage eq 'DoDiffGraph' || $GoToPage eq 'PercentWrongGraph') {      } elsif($GoToPage eq 'DoDiffGraph' || $GoToPage eq 'PercentWrongGraph') {
 #        &Apache::lonproblemstatistics::BuildGraphicChart($r,$c);  #        &Apache::lonproblemstatistics::BuildGraphicChart($r,$c);
     } elsif($GoToPage eq 'classlist') {  
         &DisplayClasslist($r);  
     } elsif($GoToPage eq 'Correct-problems Plot') {      } elsif($GoToPage eq 'Correct-problems Plot') {
 # &Apache::lonpercentage::BuildPercentageGraph($r,$c);  # &Apache::lonpercentage::BuildPercentageGraph($r,$c);
     }      }

Removed from v.1.66  
changed lines
  Added in v.1.80


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