[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 .= ' ';
$Ptr .= '<input type="submit" name="refresh" ';
- $Ptr .= 'value="Refresh Chart"/></td>'."\n";
+ $Ptr .= 'value="Refresh Chart"/>'."\n";
+ $Ptr .= ' ';
+ $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--