Diff for /loncom/interface/lonstatistics.pm between versions 1.54 and 1.59

version 1.54, 2002/11/18 20:39:46 version 1.59, 2003/02/18 20:27:33
Line 35 Line 35
 #  #
 ###  ###
   
 package Apache::lonstatistics;   =pod
   
   =head1 NAME
   
   lonstatistics
   
   =head1 SYNOPSIS
   
   Main handler for statistics and chart.
   
   =head1 PACKAGES USED
   
 use strict;  use strict;
 use Apache::Constants qw(:common :http);  use Apache::Constants qw(:common :http);
Line 48  use Apache::lonproblemanalysis; Line 58  use Apache::lonproblemanalysis;
 use Apache::lonproblemstatistics;  use Apache::lonproblemstatistics;
 use Apache::lonstudentassessment;  use Apache::lonstudentassessment;
 use Apache::lonpercentage;  use Apache::lonpercentage;
 use HTML::TokeParser;  
 use GDBM_File;  use GDBM_File;
   
   =over 4
   
   =cut
   
   package Apache::lonstatistics;
   
   use strict;
   use Apache::Constants qw(:common :http);
   use Apache::lonnet();
   use Apache::lonhomework;
   use Apache::loncommon;
   use Apache::loncoursedata;
   use Apache::lonhtmlcommon;
   use Apache::lonproblemanalysis;
   use Apache::lonproblemstatistics;
   use Apache::lonstudentassessment;
   use Apache::lonpercentage;
   use GDBM_File;
   
   my @FullClasslist;
   my @Students;
   my @Sections;
   my $curr_student;
   my $prev_student;
   my $next_student;
   
   #######################################################
   #######################################################
   
   =pod
   
   =item &clear_classlist_variables()
   
   undef the following 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 $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
   
   =cut
   
   #######################################################
   #######################################################
   sub clear_classlist_variables {
       undef(@FullClasslist);
       undef(@Students);
       undef(@Sections);
       undef($curr_student);
       undef($prev_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 The full classlist
   
   =item @Students The students we are concerned with for this invocation
   
   =item @Sections The sections available in this 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
   
   $curr_student, $prev_student, and $next_student may not be defined, depending
   upon the calling context.
   
   =cut
   
   #######################################################
   #######################################################
   sub PrepareClasslist {
       my $r = shift;
       my %Sections;
       &clear_classlist_variables();
       #
       # Retrieve the classlist
       my $cid  = $ENV{'request.course.id'};
       my $cdom = $ENV{'course.'.$cid.'.domain'};
       my $cnum = $ENV{'course.'.$cid.'.num'};
       my ($classlist,$field_names) = &Apache::loncoursedata::get_classlist($cid,
                                                                     $cdom,$cnum);
       my %valid_section;
       if (exists($ENV{'form.Section'}) && $ENV{'form.Section'} !~ /(all|any)/) {
           if (ref($ENV{'form.Section'})) {
               foreach (@$ENV{'form.section'}) {
                   $valid_section{$_}++;
               }
           } else {
               $valid_section{$_}++;
           }
       }
       #
       # Process the classlist
       while (my ($student,$student_data) = each (%$classlist)) {
           my $studenthash = ();
           for (my $i=0; $i< scalar(@$field_names);$i++) {
               $studenthash->{$field_names->[$i]}=$student_data->[$i];
           }
           push (@FullClasslist,$studenthash);
           #
           # Build up a list of sections
           my $section = $studenthash->{'section'};
           $section = 'no section' if (! defined($section) || $section =~/^\s*/ );
           $Sections{$section}++;
           #
           # Only put in the list those students we are interested in
           if (defined($ENV{'form.Section'}) &&
               $ENV{'form.Section'} !~ /(all|any)/ && 
               ! exists($valid_section{$section})) {
               next;
           }
           push (@Students,$studenthash);
       }
       #
       # Put the consolidated section data in the right place
       @Sections = sort {$a<=>$b} keys(%Sections);
       #
       # Sort the Students
       my $sortby = 'fullname';
       @Students = sort {$a->{$sortby} <=> $b->{$sortby}} @Students;
       # 
       # Now deal with that current student thing....
       if (exists($ENV{'form.StudentAssessmentStudent'})) {
           my ($current_uname,$current_dom) = 
               split(':',$ENV{'form.StudentAssessmentStudent'});
           my $i;
           for ($i = 0; $i<=$#Students; $i++) {
               next if (($Students[$i]->{'username'} ne $current_uname) || 
                        ($Students[$i]->{'domain'}   ne $current_dom));
               last; # If we get here, we have our student.
           }
           if ($i == 0) {
               $prev_student = 'none';
           } else {
               $prev_student = $Students[$i-1];
           }
           if ($i == $#Students) {
               $next_student = 'none';
           } else {
               $next_student = $Students[$i+1];
           }
       }
   }
   
   #######################################################
   #######################################################
   
 sub CheckFormElement {  sub CheckFormElement {
     my ($cache, $ENVName, $cacheName, $default)=@_;      my ($cache, $ENVName, $cacheName, $default)=@_;
Line 74  sub ProcessFormData{ Line 256  sub ProcessFormData{
                                              'reportSelected',                                               'reportSelected',
                                              'StudentAssessmentStudent',                                               'StudentAssessmentStudent',
                                              'ProblemStatisticsSort']);                                               'ProblemStatisticsSort']);
       &CheckFormElement($cache, 'DownloadAll', 'DownloadAll', 'false');
       if ($cache->{'DownloadAll'} ne 'false') {
           # Clean the hell out of that cache!
           # We cannot untie the hash at this scope (stupid libgd :( )
           # So, remove every single key.  What a waste of time....
           # Of course, if you are doing this you are probably resigned
           # to waiting a while.
           &Apache::lonnet::logthis("Cleaning out the cache file");
           while (my ($key,undef)=each(%$cache)) {
               next if ($key eq 'DownloadAll');
               delete($cache->{$key});
           }
       }
     &CheckFormElement($cache, 'Status', 'Status', 'Active');      &CheckFormElement($cache, 'Status', 'Status', 'Active');
     &CheckFormElement($cache, 'postdata', 'reportSelected', 'Class list');      &CheckFormElement($cache, 'postdata', 'reportSelected', 'Class list');
     &CheckFormElement($cache, 'reportSelected', 'reportSelected',       &CheckFormElement($cache, 'reportSelected', 'reportSelected', 
                       'Class list');                        'Class list');
     $cache->{'reportSelected'} =       $cache->{'reportSelected'} = 
         &Apache::lonnet::unescape($cache->{'reportSelected'});          &Apache::lonnet::unescape($cache->{'reportSelected'});
     &CheckFormElement($cache, 'DownloadAll', 'DownloadAll', 'false');  
     &CheckFormElement($cache, 'sort', 'sort', 'fullname');      &CheckFormElement($cache, 'sort', 'sort', 'fullname');
     &CheckFormElement($cache, 'download', 'download', 'false');      &CheckFormElement($cache, 'download', 'download', 'false');
     &CheckFormElement($cache, 'StatisticsMaps',       &CheckFormElement($cache, 'StatisticsMaps', 
Line 314  sub PrepareData { Line 508  sub PrepareData {
         $isRecalculate=1;          $isRecalculate=1;
     }      }
   
     my $isCached = &Apache::loncoursedata::TestCacheData($cacheDB,       my $isCached = &Apache::loncoursedata::TestCacheData($cacheDB,
                                                          $isRecalculate);                                                           $isRecalculate);
     if($isCached < 0) {      if($isCached < 0) {
         return "Unable to tie hash to db file.";          return "Unable to tie hash to db file.";
Line 385  sub PrepareData { Line 579  sub PrepareData {
   
     if($download ne 'false') {      if($download ne 'false') {
         my @who = ($download);          my @who = ($download);
         if(&Apache::loncoursedata::DownloadStudentCourseData(\@who, 'false',           if(&Apache::loncoursedata::DownloadStudentCourseData(\@who, 'false',
                                                              $cacheDB, 'true',                                                                $cacheDB, 'true',
                                                              'false', $courseID,                                                               'false', $courseID,
                                                              $r, $c) ne 'OK') {                                                               $r, $c) ne 'OK') {
             return 'Stop at download individual';              return 'Stop at download individual';
         }          }
     } elsif($downloadAll ne 'false') {      } elsif($downloadAll ne 'false') {
         if(&Apache::loncoursedata::DownloadStudentCourseData(\@allStudents,           if(&Apache::loncoursedata::DownloadStudentCourseData(\@allStudents,
                                                              'false',                                                                'false',
                                                              $cacheDB, 'true',                                                                $cacheDB, 'true',
                                                              'true', $courseID,                                                               'true', $courseID,
                                                              $r, $c) ne 'OK') {                                                               $r, $c) ne 'OK') {
             return 'Stop at download all';              return 'Stop at download all';
Line 412  sub BuildClasslist { Line 606  sub BuildClasslist {
         return '<html><body>Unable to tie database.</body></html>';          return '<html><body>Unable to tie database.</body></html>';
     }      }
   
   #    my $Ptr = '';
   #    $Ptr .= '<table border="0"><tbody>';
   #    $Ptr .= '<tr><td align="right"><b>Select Sections</b>';
   #    $Ptr .= '</td>'."\n";
   #    $Ptr .= '<td align="left">'."\n";
   #    my @sectionsSelected = split(':',$cache{'sectionsSelected'});
   #    my @sections = split(':',$cache{'sectionList'});
   #    $Ptr .= &Apache::lonhtmlcommon::MultipleSectionSelect(\@sections,
   #                                                          \@sectionsSelected,
   #                                                          'Statistics');
   #    $Ptr .= '</td></tr></table><br>';
   #    $r->print($Ptr);
   #    $r->rflush();
   #    my %mySections = ();
   #    foreach (@sections) { $mySections{$_} = 'True'; }
   #    $r->print("<br>$cache{'sectionsSelected'}<br>");
   
     my $Str='';      my $Str='';
     $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";
   
     my $displayString = '<td align="left"><a href="/adm/statistics?';      my $displayString = '<td align="left"><a href="/adm/statistics?';
     $displayString .= 'sort=LINKDATA">DISPLAYDATA&nbsp</a></td>'."\n";      $displayString .= 'sort=LINKDATA">DISPLAYDATA&nbsp</a></td>'."\n";
     $Str .= &Apache::lonhtmlcommon::CreateHeadings(\%cache,       $Str .= &Apache::lonhtmlcommon::CreateHeadings(\%cache,
                                                    $studentInformation,                                                     $studentInformation,
                                                    $headings, $displayString);                                                     $headings, $displayString);
     $Str .= '</tr>'."\n";      $Str .= '</tr>'."\n";
   
     my $alternate=0;      my $alternate=0;
     foreach (@$students) {      foreach (@$students) {
   #        if ($mySections{$cache{$_.':'.'section'}} ne 'True') {next;}
         my ($username, $domain) = split(':', $_);          my ($username, $domain) = split(':', $_);
         if($alternate) {          if($alternate) {
             $Str .= '<tr bgcolor="#ffffe6">';              $Str .= '<tr bgcolor="#ffffe6">';
Line 472  sub CreateMainMenu { Line 684  sub CreateMainMenu {
   
     $Str .= '<table border="0"><tbody><tr>'."\n";      $Str .= '<table border="0"><tbody><tr>'."\n";
     $Str .= '<td></td><td></td>'."\n";      $Str .= '<td></td><td></td>'."\n";
     $Str .= '<td align="center"><b>Analysis Reports:</b></td>'."\n";      $Str .= '<td align="center"><b>Select a Report</b></td>'."\n";
     $Str .= '<td align="center"><b>Student Status:</b></td></tr>'."\n";      $Str .= '<td align="center"><b>Student Status</b></td></tr>'."\n";
     $Str .= '<tr>'."\n";      $Str .= '<tr>'."\n";
     $Str .= '<td align="center"><input type="submit" name="Refresh" ';      $Str .= '<td align="center"><input type="submit" name="Refresh" ';
     $Str .= 'value="Refresh" /></td>'."\n";      $Str .= 'value="Refresh" /></td>'."\n";
Line 511  sub BuildStatistics { Line 723  sub BuildStatistics {
                             'updateTime');                              'updateTime');
     my @headings=('Full Name', 'Section', 'PID', 'Domain', 'User Name',      my @headings=('Full Name', 'Section', 'PID', 'Domain', 'User Name',
                   'Last Updated');                    'Last Updated');
     my $spacing = '   ';       my $spacing = '   ';
   
     my %reports = ('classlist'          => 'Class list',      my %reports = ('classlist'          => 'Class list',
                    'problem_statistics' => 'Problem Statistics',                     'problem_statistics' => 'Problem Statistics',
                    'student_assessment' => 'Student Assessment',                     'student_assessment' => 'Student Assessment',
    'percentage'         => 'Percentage Graphs',     'percentage'         => 'Correct-problems Plot',
 #                   'activitylog'        => 'Activity Log',  #                   'activitylog'        => 'Activity Log',
                    'reportSelected'     => 'Class list');                     'reportSelected'     => 'Class list');
   
Line 527  sub BuildStatistics { Line 739  sub BuildStatistics {
   
     $r->print(&Apache::lonhtmlcommon::Title('Course Statistics and Charts'));      $r->print(&Apache::lonhtmlcommon::Title('Course Statistics and Charts'));
   
     my ($returnValue, $students) = &PrepareData($c, $cacheDB,       my ($returnValue, $students) = &PrepareData($c, $cacheDB,
                                                 \@studentInformation,                                                   \@studentInformation,
                                                 \@headings,$r);                                                  \@headings,$r);
     if($returnValue ne 'OK') {      if($returnValue ne 'OK') {
         $r->print($returnValue."\n".'</body></html>');          $r->print($returnValue."\n".'</body></html>');
         return OK;          return OK;
     }      }
     if(!$c->aborted()) {      if(!$c->aborted()) {
         &Apache::loncoursedata::CheckForResidualDownload($cacheDB,           &Apache::loncoursedata::CheckForResidualDownload($cacheDB,
                                                          'true', 'true',                                                           'true', 'true',
                                                          $courseID,                                                           $courseID,
                                                          $r, $c);                                                           $r, $c);
Line 545  sub BuildStatistics { Line 757  sub BuildStatistics {
     if(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER(),0640)) {      if(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER(),0640)) {
         $GoToPage = $cache{'reportSelected'};          $GoToPage = $cache{'reportSelected'};
         $reports{'reportSelected'} = $cache{'reportSelected'};          $reports{'reportSelected'} = $cache{'reportSelected'};
         if(defined($cache{'reportKey'}) &&           if(defined($cache{'reportKey'}) &&
            !exists($reports{$cache{'reportKey'}}) &&              !exists($reports{$cache{'reportKey'}}) &&
            $cache{'reportKey'} ne 'false') {             $cache{'reportKey'} ne 'false') {
             $reports{$cache{'reportKey'}} = $cache{'reportSelected'};              $reports{$cache{'reportKey'}} = $cache{'reportSelected'};
         }          }
Line 568  sub BuildStatistics { Line 780  sub BuildStatistics {
     if($GoToPage eq 'Activity Log') {      if($GoToPage eq 'Activity Log') {
         &Apache::lonproblemstatistics::Activity();          &Apache::lonproblemstatistics::Activity();
     } elsif($GoToPage eq 'Problem Statistics') {      } elsif($GoToPage eq 'Problem Statistics') {
         &Apache::lonproblemstatistics::BuildProblemStatisticsPage($cacheDB,           &Apache::lonproblemstatistics::BuildProblemStatisticsPage($cacheDB,
                                                                   $students,                                                                     $students,
                                                                   $courseID,                                                                     $courseID,
                                                                   $c,$r);                                                                    $c,$r);
     } elsif($GoToPage eq 'Option Response Analysis') {      } elsif($GoToPage eq 'Option Response Analysis') {
         &Apache::lonproblemanalysis::BuildProblemAnalysisPage($cacheDB, $r);          &Apache::lonproblemanalysis::BuildProblemAnalysisPage($cacheDB, $r);
Line 584  sub BuildStatistics { Line 796  sub BuildStatistics {
                                                           \@studentInformation,                                                            \@studentInformation,
                                                           $r, $c);                                                            $r, $c);
     } elsif($GoToPage eq 'Analyze') {      } elsif($GoToPage eq 'Analyze') {
         &Apache::lonproblemanalysis::BuildAnalyzePage($cacheDB, $students,           &Apache::lonproblemanalysis::BuildAnalyzePage($cacheDB, $students,
                                                       $courseID, $r);                                                        $courseID, $r);
     } elsif($GoToPage eq 'DoDiffGraph' || $GoToPage eq 'PercentWrongGraph') {      } elsif($GoToPage eq 'DoDiffGraph' || $GoToPage eq 'PercentWrongGraph') {
         my $courseDescription = $ENV{'course.'.$courseID.'.description'};          my $courseDescription = $ENV{'course.'.$courseID.'.description'};
Line 596  sub BuildStatistics { Line 808  sub BuildStatistics {
     } elsif($GoToPage eq 'Class list') {      } elsif($GoToPage eq 'Class list') {
         &BuildClasslist($cacheDB, $students, \@studentInformation,          &BuildClasslist($cacheDB, $students, \@studentInformation,
                         \@headings, $r);                          \@headings, $r);
     } elsif($GoToPage eq 'Percentage Graphs') {      } elsif($GoToPage eq 'Correct-problems Plot') {
  &Apache::lonpercentage::BuildPercentageGraph($cacheDB, $students,   &Apache::lonpercentage::BuildPercentageGraph($cacheDB, $students,
      $courseID, $c, $r);       $courseID, $c, $r);
     }      }
Line 625  sub handler { Line 837  sub handler {
     unless(&Apache::lonnet::allowed('vgr',$ENV{'request.course.id'})) {      unless(&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;           return HTTP_NOT_ACCEPTABLE;
     }      }
   
     # Set document type for header only      # Set document type for header only
Line 643  sub handler { Line 855  sub handler {
     unless($ENV{'request.course.fn'}) {      unless($ENV{'request.course.fn'}) {
  my $requrl=$r->uri;   my $requrl=$r->uri;
         $ENV{'user.error.msg'}="$requrl:bre:0:0:Course not initialized";          $ENV{'user.error.msg'}="$requrl:bre:0:0:Course not initialized";
         return HTTP_NOT_ACCEPTABLE;           return HTTP_NOT_ACCEPTABLE;
     }      }
   
     $r->content_type('text/html');      $r->content_type('text/html');
     $r->send_http_header;      $r->send_http_header;
   
       &PrepareClasslist($r);
   
     &BuildStatistics($r);      &BuildStatistics($r);
   
     return OK;      return OK;
 }  }
 1;  1;
   
   =pod
   
   =back
   
   =cut
   
 __END__  __END__
   

Removed from v.1.54  
changed lines
  Added in v.1.59


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