[LON-CAPA-cvs] cvs: loncom /interface lonstatistics.pm

matthew lon-capa-cvs@mail.lon-capa.org
Tue, 18 Feb 2003 20:27:33 -0000


matthew		Tue Feb 18 15:27:33 2003 EDT

  Modified files:              
    /loncom/interface	lonstatistics.pm 
  Log:
  Untested but not borken.
  Added POD documentation.
  Removed 'use HTML::TokeParser'.  May need to re-introduce.
  Added package variables for classlist, &clear_classlist_variables(),
  and &PrepareClasslist().  More changes to these routines are inevitable.
  
  
Index: loncom/interface/lonstatistics.pm
diff -u loncom/interface/lonstatistics.pm:1.58 loncom/interface/lonstatistics.pm:1.59
--- loncom/interface/lonstatistics.pm:1.58	Sun Jan 12 18:45:47 2003
+++ loncom/interface/lonstatistics.pm	Tue Feb 18 15:27:33 2003
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # (Publication Handler
 #
-# $Id: lonstatistics.pm,v 1.58 2003/01/12 23:45:47 minaeibi Exp $
+# $Id: lonstatistics.pm,v 1.59 2003/02/18 20:27:33 matthew Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -35,6 +35,35 @@
 #
 ###
 
+=pod
+
+=head1 NAME
+
+lonstatistics
+
+=head1 SYNOPSIS
+
+Main handler for statistics and chart.
+
+=head1 PACKAGES USED
+
+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;
+
+=over 4
+
+=cut
+
 package Apache::lonstatistics;
 
 use strict;
@@ -48,9 +77,162 @@
 use Apache::lonproblemstatistics;
 use Apache::lonstudentassessment;
 use Apache::lonpercentage;
-use HTML::TokeParser;
 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 {
     my ($cache, $ENVName, $cacheName, $default)=@_;
@@ -679,10 +861,19 @@
     $r->content_type('text/html');
     $r->send_http_header;
 
+    &PrepareClasslist($r);
+
     &BuildStatistics($r);
 
     return OK;
 }
 1;
+
+=pod
+
+=back
+
+=cut
+
 __END__