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

stredwic lon-capa-cvs@mail.lon-capa.org
Tue, 02 Jul 2002 21:34:40 -0000


This is a MIME encoded message

--stredwic1025645680
Content-Type: text/plain

stredwic		Tue Jul  2 17:34:40 2002 EDT

  Modified files:              
    /loncom/interface	lonchart.pm 
  Log:
  This commit fixes the display when the chart button is pressed on the 
  keypad.  Now it updates as if a refresh chart is pressed.  Also added
  another button to the form.  Now there are three primary refresh buttons.
  First is Recalculate chart, it doesn't change the settings but does 
  redownload all the data.  Refresh Chart displays a new chart with using the
  same data but based on the current selections.  Reset Selections resets all
  the user selections to default and displays a new chart using the cached 
  data.  Also all the form data is stored.
  
  
--stredwic1025645680
Content-Type: text/plain
Content-Disposition: attachment; filename="stredwic-20020702173440.txt"

Index: loncom/interface/lonchart.pm
diff -u loncom/interface/lonchart.pm:1.50 loncom/interface/lonchart.pm:1.51
--- loncom/interface/lonchart.pm:1.50	Tue Jul  2 11:13:06 2002
+++ loncom/interface/lonchart.pm	Tue Jul  2 17:34:40 2002
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # (Publication Handler
 #
-# $Id: lonchart.pm,v 1.50 2002/07/02 15:13:06 stredwic Exp $
+# $Id: lonchart.pm,v 1.51 2002/07/02 21:34:40 stredwic Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -46,6 +46,10 @@
 #
 ###
 
+=pod
+
+=cut
+
 package Apache::lonchart;
 
 use strict;
@@ -55,15 +59,15 @@
 use HTML::TokeParser;
 use GDBM_File;
 
-my $jr; 
+#my $jr; 
 # ----- FORMAT PRINT DATA ----------------------------------------------
 
 sub FormatStudentInformation {
-    my ($cache,$name,$studentInformation,$reselected,$spacePadding)=@_;
+    my ($cache,$name,$studentInformation,$spacePadding)=@_;
     my $Str='';
 
     for(my $index=0; $index<(scalar @$studentInformation); $index++) {
-        if(!&ShouldShowColumn($reselected, 'heading', $index)) {
+        if(!&ShouldShowColumn($cache, 'heading'.$index)) {
             next;
         }
 	my $data=$cache->{$name.':'.$studentInformation->[$index]};
@@ -80,7 +84,7 @@
 }
 
 sub FormatStudentData {
-    my ($reselected,$name,$coid,$studentInformation,$spacePadding,$ChartDB)=@_;
+    my ($name,$coid,$studentInformation,$spacePadding,$ChartDB)=@_;
     my ($sname,$sdom) = split(/\:/,$name);
     my $Str;
     my %CacheData;
@@ -91,7 +95,7 @@
     # Handle Student information ------------------------------------------
     # Handle user data
     $Str=&FormatStudentInformation(\%CacheData, $name, $studentInformation, 
-                                   $reselected, $spacePadding);
+                                   $spacePadding);
 
     # Handle errors
     if($CacheData{$name.':error'} =~ /environment/) {
@@ -113,7 +117,7 @@
     my $problemsSolved  = 0;
     my $numberOfParts   = 0;
     foreach my $sequence (split(/\:/,$CacheData{'orderedSequences'})) {
-        if(!&ShouldShowColumn($reselected, 'sequence', $sequence)) {
+        if(!&ShouldShowColumn(\%CacheData, 'sequence'.$sequence)) {
             next;
         }
 
@@ -208,19 +212,21 @@
         $Str .= $spacePadding;
     }
 
-    $Str .= '<font color="#000088">'.$problemsSolved.
-	    ' / '.$totalProblems.'</font><br>';
+    my $outputProblemsSolved = sprintf( "%4d", $problemsSolved );
+    my $outputTotalProblems  = sprintf( "%4d", $totalProblems );
+    $Str .= '<font color="#000088">'.$outputProblemsSolved.
+	    ' / '.$outputTotalProblems.'</font><br>';
 
     untie(%CacheData);
     return $Str;
 }
 
 sub CreateTableHeadings {
-    my ($CacheData,$studentInformation,$headings,$reselected,$spacePadding)=@_;
+    my ($CacheData,$studentInformation,$headings,$spacePadding)=@_;
     my $Str='<pre>';
 
     for(my $index=0; $index<(scalar @$headings); $index++) {
-        if(!&ShouldShowColumn($reselected, 'heading', $index)) {
+        if(!&ShouldShowColumn($CacheData, 'heading'.$index)) {
             next;
         }
 
@@ -235,7 +241,7 @@
     }
 
     foreach my $sequence (split(/\:/,$CacheData->{'orderedSequences'})) {
-        if(!&ShouldShowColumn($reselected, 'sequence', $sequence)) {
+        if(!&ShouldShowColumn($CacheData, 'sequence'.$sequence)) {
             next;
         }
 
@@ -255,7 +261,7 @@
 }
 
 sub CreateColumnSelectionBox {
-    my ($CacheData,$studentInformation,$headings,$reselected,$spacePadding)=@_;
+    my ($CacheData,$studentInformation,$headings,$spacePadding)=@_;
 
     my $missing=0;
     my $notThere='<tr><td align="right"><b>Select column to view:</b>';
@@ -264,7 +270,7 @@
     $notThere .= '<select name="reselect" size="4" multiple="true">'."\n";
 
     for(my $index=0; $index<(scalar @$headings); $index++) {
-        if(&ShouldShowColumn($reselected, 'heading', $index)) {
+        if(&ShouldShowColumn($CacheData, 'heading'.$index)) {
             next;
         }
         $name = $headings->[$index];
@@ -274,7 +280,7 @@
     }
 
     foreach my $sequence (split(/\:/,$CacheData->{'orderedSequences'})) {
-        if(&ShouldShowColumn($reselected, 'sequence', $sequence)) {
+        if(&ShouldShowColumn($CacheData, 'sequence'.$sequence)) {
             next;
         }
         $name = $CacheData->{$sequence.':title'};
@@ -293,13 +299,13 @@
 }
 
 sub CreateColumnSelectors {
-    my ($CacheData,$studentInformation,$headings,$reselected,$spacePadding)=@_;
+    my ($CacheData,$studentInformation,$headings,$spacePadding)=@_;
 
     my $found=0;
     my ($name, $length, $position);
     my $present='<pre>';
     for(my $index=0; $index<(scalar @$headings); $index++) {
-        if(!&ShouldShowColumn($reselected, 'heading', $index)) {
+        if(!&ShouldShowColumn($CacheData, 'heading'.$index)) {
             next;
         }
         $name = $headings->[$index];
@@ -315,7 +321,7 @@
     }
 
     foreach my $sequence (split(/\:/,$CacheData->{'orderedSequences'})) {
-        if(!&ShouldShowColumn($reselected, 'sequence', $sequence)) {
+        if(!&ShouldShowColumn($CacheData, 'sequence'.$sequence)) {
             next;
         }
         $name = $CacheData->{$sequence.':title'};
@@ -341,10 +347,11 @@
 }
 
 sub CreateForm {
+    my ($CacheData)=@_;
     my $OpSel1='';
     my $OpSel2='';
     my $OpSel3='';
-    my $Status = $ENV{'form.status'};
+    my $Status = $CacheData->{'form.status'};
     if ( $Status eq 'Any' ) { $OpSel3='selected'; }
     elsif ($Status eq 'Expired' ) { $OpSel2 = 'selected'; }
     else { $OpSel1 = 'selected'; }
@@ -353,11 +360,14 @@
     $Ptr .= '<table border="0"><tbody>';
     $Ptr .= '<tr><td align="right">';
     $Ptr .= '</td><td align="left">';
-    $Ptr .= '<input type="submit" name="sort" ';
+    $Ptr .= '<input type="submit" name="recalculate" ';
     $Ptr .= 'value="Recalculate Chart"/>'."\n";
     $Ptr .= '&nbsp;&nbsp;&nbsp;';
     $Ptr .= '<input type="submit" name="refresh" ';
-    $Ptr .= 'value="Refresh Chart"/></td>'."\n";
+    $Ptr .= 'value="Refresh Chart"/>'."\n";
+    $Ptr .= '&nbsp;&nbsp;&nbsp;';
+    $Ptr .= '<input type="submit" name="reset" ';
+    $Ptr .= 'value="Reset Selections"/></td>'."\n";
     $Ptr .= '</tr><tr><td align="right">';
     $Ptr .= '<b> Sort by: </b>'."\n";
     $Ptr .= '</td><td align="left">';
@@ -404,7 +414,6 @@
     $Str .= '</pre></h1>';
     $Str .= '<h1>'.$ENV{'course.'.$ENV{'request.course.id'}.'.description'};
     $Str .= '</h1>';
-#    $Str .= '<h3>'.localtime().'</h3>';
 
     return $Str;
 }
@@ -514,6 +523,17 @@
 	    push(@finishResource, $lastResourceID);
 
 	    $currentSequence=$hash{'map_pc_'.$hash{'src_'.$currentResourceID}};
+
+            # Mark sequence as containing problems.  If it doesn't, then
+            # it will be removed when processing for this sequence is
+            # complete.  This allows the problems in a sequence
+            # to be outputed before problems in the subsequences
+            if(!defined($CacheData{'orderedSequences'})) {
+                $CacheData{'orderedSequences'}=$currentSequence;
+            } else {
+                $CacheData{'orderedSequences'}.=':'.$currentSequence;
+            }
+
 	    $lastResourceID=$hash{'map_finish_'.
 				  $hash{'src_'.$currentResourceID}};
 	    $currentResourceID=$hash{'map_start_'.
@@ -575,12 +595,6 @@
 
 	    if(defined($CacheData{$currentSequence.':problems'})) {
 		# Capture sequence information here
-		if(!defined($CacheData{'orderedSequences'})) {
-		    $CacheData{'orderedSequences'}=$currentSequence;
-		} else {
-		    $CacheData{'orderedSequences'}.=':'.$currentSequence;
-		}
-
 		$CacheData{$currentSequence.':title'}=
 		    $hash{'title_'.$currentResourceID};
 
@@ -606,13 +620,16 @@
 		    $CacheData{$currentSequence.':columnWidth'}=
                         (scalar @titleLength);
 		}
-	    }
+	    } else {
+                $CacheData{'orderedSequences'}=~s/$currentSequence//;
+                $CacheData{'orderedSequences'}=~s/::/:/g;
+                $CacheData{'orderedSequences'}=~s/^:|:$//g;
+            }
 
 	    $currentSequence=pop(@sequences);
 	    if($currentSequence eq $topLevelSequenceNumber) {
 		last;
 	    }
-	#else
 	}
 
 	# MOVE!!!
@@ -723,7 +740,7 @@
     }
 
     # Get student's section number
-    my $sec=&ProcessSection($section, $courseID, $ENV{'form.status'});
+    my $sec=&ProcessSection($section, $courseID, $CacheData->{'form.status'});
     if($sec != -1) {
 	$CacheData->{$name.':section'}=$sec;
     } else {
@@ -841,7 +858,7 @@
         my ($end,$start)=split(/\:/,$CacheData->{$_.':date'});
         my $active=1;
         my $now=time;
-        my $Status=$ENV{'form.status'};
+        my $Status=$CacheData->{'form.status'};
         $Status = ($Status) ? $Status : 'Active';
         if((($end) && $now > $end) && (($Status eq 'Active'))) { 
             $active=0; 
@@ -854,7 +871,7 @@
         }
     }
 
-    my $Pos = $ENV{'form.sort'};
+    my $Pos = $CacheData->{'form.sort'};
     my %sortData;
     if($Pos eq 'Last Name') {
 	for(my $index=0; $index<scalar @sorted1Students; $index++) {
@@ -887,13 +904,13 @@
     my %testData;
     my $tieTries=0;
 
-    if ((-e "$ChartDB") && ($ENV{'form.sort'} ne 'Recalculate Chart')) {
+    if ((-e "$ChartDB") && (!defined($ENV{'form.recalculate'}))) {
 	$isCached = 1;
     } else {
 	$isCached = 0;
     }
 
-    while($tieTries < 3) {
+    while($tieTries < 10) {
         my $result=0;
         if($isCached) {
             $result=tie(%testData,'GDBM_File',$ChartDB,&GDBM_READER,0640);
@@ -906,7 +923,7 @@
         $tieTries++;
         sleep 1;
     }
-    if($tieTries >= 3) {
+    if($tieTries >= 10) {
         return -1;
     }
 
@@ -940,27 +957,94 @@
 }
 
 sub ShouldShowColumn {
-    my ($reselected,$type,$value)=@_;
+    my ($cache,$test)=@_;
 
-    if($ENV{'form.sort'} eq 'Recalculate Chart') {
+    if($cache->{'form.reset'} eq 'true') {
         return 1;
     }
 
-    if(defined($ENV{'form.'.$type.$value})) {
+    my $headings=$cache->{'form.headings'};
+    my $sequences=$cache->{'form.sequences'};
+    if($headings eq 'ALLHEADINGS' || $sequences eq 'ALLSEQUENCES' ||
+       $headings=~/$test/ || $sequences=~/$test/) {
         return 1;
     }
 
-    return &CheckForStringInArray($reselected, $type.$value);
+#    my $reselected=$cache->{'form.reselect'};
+#    if($reselected=~/$test/) {
+#        return 1;
+#    }
+
+    return 0;
 }
 
-sub CheckForStringInArray {
-    my ($inputArray,$checkString)=@_;
-    foreach (@$inputArray) {
-        if($_ eq $checkString) {
-            return 1;
+sub ProcessFormData {
+    my ($ChartDB)=@_;
+    my %CacheData;
+
+    if(tie(%CacheData,'GDBM_File',$ChartDB,&GDBM_WRCREAT,0640)) {
+        if(defined($ENV{'form.sort'})) {
+            $CacheData{'form.sort'}=$ENV{'form.sort'};
+        } elsif(!defined($CacheData{'form.sort'})) {
+            $CacheData{'form.sort'}='username';
+        }
+
+        # Ignore $ENV{'form.refresh'}
+        # Ignore $ENV{'form.recalculate'}
+
+        if(defined($ENV{'form.status'})) {
+            $CacheData{'form.status'}=$ENV{'form.status'};
+        } elsif(!defined($CacheData{'form.status'})) {
+            $CacheData{'form.status'}='Active';
+        }
+
+        my @headings=();
+        my @sequences=();
+        my $found=0;
+        foreach (keys(%ENV)) {
+            if(/form\.heading/) {
+                $found++;
+                push(@headings, $_);
+            } elsif(/form\.sequence/) {
+                $found++;
+                push(@sequences, $_);
+            } elsif(/form\./) {
+                $found++;
+            }
+        }
+
+        if($found) {
+            $CacheData{'form.headings'}=join(":::",@headings);
+            $CacheData{'form.sequences'}=join(":::",@sequences);
+        }
+
+        if(defined($ENV{'form.reselect'})) {
+            my @reselected = (ref($ENV{'form.reselect'}) ? 
+                              @{$ENV{'form.reselect'}}
+                              : ($ENV{'form.reselect'}));
+            foreach (@reselected) {
+                if(/heading/) {
+                    $CacheData{'form.headings'}.=":::".$_;
+                } elsif(/sequence/) {
+                    $CacheData{'form.sequences'}.=":::".$_;
+                }
+            }
         }
+
+        if(defined($ENV{'form.reset'})) {
+            $CacheData{'form.reset'}='true';
+            $CacheData{'form.status'}='Active';
+            $CacheData{'form.sort'}='username';
+            $CacheData{'form.headings'}='ALLHEADINGS';
+            $CacheData{'form.sequences'}='ALLSEQUENCES';
+        } else {
+            $CacheData{'form.reset'}='false';
+        }
+
+        untie(%CacheData);
     }
-    return 0;
+
+    return;
 }
 
 # ----- END HELPER FUNCTIONS --------------------------------------------
@@ -980,10 +1064,6 @@
     my $cid=$ENV{'request.course.id'};
     my $ChartDB = "/home/httpd/perl/tmp/$ENV{'user.name'}".
                   "_$ENV{'user.domain'}_$cid\_chart.db";
-    # $ENV{'form.domains'} can be either a scalar or an array reference.
-    # We need an array.
-    my @reselected = (ref($ENV{'form.reselect'}) ? @{$ENV{'form.reselect'}}
-                      : ($ENV{'form.reselect'}));
 
     $isCached=&TestCacheData($ChartDB);
     if($isCached < 0) {
@@ -991,6 +1071,7 @@
         $r->rflush();
         return;
     }
+    &ProcessFormData($ChartDB);
 
     # Download class list information if not using cached data
     my %CacheData;
@@ -1031,24 +1112,21 @@
                                        ' students</h1>'); }
 	if(!$c->aborted()) { $r->rflush(); }
 	if(!$c->aborted()) { $r->print(&CreateLegend()); }
-	if(!$c->aborted()) { $r->print(&CreateForm()); }
+	if(!$c->aborted()) { $r->print(&CreateForm(\%CacheData)); }
 	if(!$c->aborted()) { $r->print(&CreateColumnSelectionBox(
                                                        \%CacheData,
                                                        \@studentInformation, 
 						       \@headings, 
-                                                       \@reselected,
                                                        $spacePadding)); }
 	if(!$c->aborted()) { $r->print(&CreateColumnSelectors(
                                                        \%CacheData,
                                                        \@studentInformation, 
 						       \@headings, 
-                                                       \@reselected,
                                                        $spacePadding)); }
 	if(!$c->aborted()) { $r->print(&CreateTableHeadings(
                                                          \%CacheData,
                                                          \@studentInformation, 
 							 \@headings, 
-                                                         \@reselected,
 							 $spacePadding)); }
 	if(!$c->aborted()) { $r->rflush(); }
 	untie(%CacheData);
@@ -1071,8 +1149,7 @@
             push(@updateStudentList, $_);
             &ExtractStudentData($courseData, $_, $ChartDB);
         }
-        $r->print(&FormatStudentData(\@reselected, $_, $cid, 
-                                     \@studentInformation,
+        $r->print(&FormatStudentData($_, $cid, \@studentInformation,
                                      $spacePadding, $ChartDB));
         $r->rflush();
     }
@@ -1094,7 +1171,7 @@
 
 sub handler {
     my $r=shift;
-    $jr=$r;
+#    $jr=$r;
     unless(&Apache::lonnet::allowed('vgr',$ENV{'request.course.id'})) {
 	$ENV{'user.error.msg'}=
         $r->uri.":vgr:0:0:Cannot view grades for complete course";

--stredwic1025645680--