Diff for /loncom/interface/Attic/lonspreadsheet.pm between versions 1.164 and 1.167

version 1.164, 2003/01/29 16:26:08 version 1.167, 2003/01/30 21:35:13
Line 487  use GDBM_File; Line 487  use GDBM_File;
 use HTML::Entities();  use HTML::Entities();
 use HTML::TokeParser;  use HTML::TokeParser;
 use Spreadsheet::WriteExcel;  use Spreadsheet::WriteExcel;
   use Time::HiRes;
   
 #  #
 # These global hashes are dependent on user, course and resource,   # These global hashes are dependent on user, course and resource, 
 # and need to be initialized every time when a sheet is calculated  # and need to be initialized every time when a sheet is calculated
Line 535  sub tmpdir { Line 537  sub tmpdir {
 }  }
   
 my %spreadsheets;  my %spreadsheets;
 my %loadedcaches;  #my %loadedcaches;
 my %courserdatas;  my %courserdatas;
 my %userrdatas;  my %userrdatas;
 my %defaultsheets;  my %defaultsheets;
 my %rowlabel_cache;  my %rowlabel_cache;
 my %oldsheets;  #my %oldsheets;
   
 sub complete_recalc {  sub complete_recalc {
     my $self = shift;      my $self = shift;
Line 607  sub cachedssheets { Line 609  sub cachedssheets {
     my ($uname,$udom) = @_;      my ($uname,$udom) = @_;
     $uname = $uname || $self->{'uname'};      $uname = $uname || $self->{'uname'};
     $udom  = $udom  || $self->{'udom'};      $udom  = $udom  || $self->{'udom'};
     if (! $Apache::lonspreadsheet::loadedcaches{$uname.'_'.$udom}) {      if (! exists($Apache::lonspreadsheet::loadedcaches{$uname.'_'.$udom})) {
         my @tmp = &Apache::lonnet::dump('nohist_calculatedsheets_'.          my @tmp = &Apache::lonnet::dump('nohist_calculatedsheets_'.
                                         $ENV{'request.course.id'},                                          $ENV{'request.course.id'},
                                         $self->{'udom'},                                          $self->{'udom'},
Line 756  sub new { Line 758  sub new {
         chome => $ENV{'course.'.$ENV{'request.course.id'}.'.home'},          chome => $ENV{'course.'.$ENV{'request.course.id'}.'.home'},
         coursefilename => $ENV{'request.course.fn'},          coursefilename => $ENV{'request.course.fn'},
         coursedesc => $ENV{'course.'.$ENV{'request.course.id'}.'.description'},          coursedesc => $ENV{'course.'.$ENV{'request.course.id'}.'.description'},
         A_column       => [],          rows       => [],
         template_cells => [],          template_cells => [],
         };          };
     $self->{'uhome'} = &Apache::lonnet::homeserver($uname,$udom);      $self->{'uhome'} = &Apache::lonnet::homeserver($uname,$udom);
Line 1583  sub sett { Line 1585  sub sett {
         $pattern='[A-Z]';          $pattern='[A-Z]';
     }      }
     # Deal with the template row      # Deal with the template row
     foreach ($self->template_cells()) {      foreach my $col ($self->template_cells()) {
         my ($col) = ($_=~/template\_(\w)/);  
         next if ($col=~/^$pattern/);          next if ($col=~/^$pattern/);
         foreach ($self->A_column()) {          foreach my $trow ($self->rows()) {
             my ($trow)=($_!~/A(\d+)/);  
             next if (! $trow);  
             # Get the name of this cell              # Get the name of this cell
             my $lb=$col.$trow;              my $lb=$col.$trow;
             # Grab the template declaration              # Grab the template declaration
Line 1745  sub calcsheet { Line 1744  sub calcsheet {
     $self->sett();      $self->sett();
     my $result =  $self->{'safe'}->reval('&calc();');      my $result =  $self->{'safe'}->reval('&calc();');
     %{$self->{'values'}} = %{$self->{'safe'}->varglob('sheet_values')};      %{$self->{'values'}} = %{$self->{'safe'}->varglob('sheet_values')};
 #    $self->logthis($self->get_errorlog());  
 #    $self->logthis('number of values = '.(keys(%{$self->{'values'}})));  
     return $result;      return $result;
 }  }
   
Line 1787  sub clear_errorlog { Line 1784  sub clear_errorlog {
 #### Spreadsheet content retrieval/setting methods #####  #### Spreadsheet content retrieval/setting methods #####
 ########################################################  ########################################################
 ##  ##
 ## contents:  either set or get the constants.  Cannot do both.  It is just too  ## constants:  either set or get the constants
 ## clunky to swing around big hashes when we may not need to.  ##
 ##  ##
 sub constants {  sub constants {
     my $self=shift;      my $self=shift;
Line 1806  sub constants { Line 1803  sub constants {
 }  }
           
 ##  ##
 ## formulas: either set or get the formulas.  Cannot do both.  It is just too  ## formulas: either set or get the formulas
 ## clunky to swing around big hashes when we may not need to.  ##
 sub formulas {  sub formulas {
     my $self=shift;      my $self=shift;
     my ($formulas) = @_;      my ($formulas) = @_;
Line 1817  sub formulas { Line 1814  sub formulas {
             $formulas = \%tmp;              $formulas = \%tmp;
         }          }
         $self->{'formulas'} = $formulas;          $self->{'formulas'} = $formulas;
         $self->{'A_column'} = [];          $self->{'rows'} = [];
         $self->{'template_cells'} = [];          $self->{'template_cells'} = [];
         return;          return;
     } else {      } else {
Line 1831  sub formulas { Line 1828  sub formulas {
 sub formulas_keys {  sub formulas_keys {
     my $self = shift;      my $self = shift;
     my @keys = keys(%{$self->{'formulas'}});      my @keys = keys(%{$self->{'formulas'}});
 #    $self->logthis('formulas keys has '.@keys.' elements');  
     return keys(%{$self->{'formulas'}});      return keys(%{$self->{'formulas'}});
 }  }
   
Line 1857  sub logthis { Line 1853  sub logthis {
     &Apache::lonnet::logthis($self->{'type'}.':'.      &Apache::lonnet::logthis($self->{'type'}.':'.
                              $self->{'uname'}.':'.$self->{'udom'}.':'.                               $self->{'uname'}.':'.$self->{'udom'}.':'.
                              $message);                               $message);
       return;
 }  }
   
 ##  ##
Line 1899  sub dump_values_to_log { Line 1896  sub dump_values_to_log {
 ##      Helper functions      ##  ##      Helper functions      ##
 ################################  ################################
 ##  ##
 ## rebuild_stats: rebuilds the A_column and template_cells arrays  ## rebuild_stats: rebuilds the rows and template_cells arrays
 ##  ##
 sub rebuild_stats {  sub rebuild_stats {
     my $self = shift;      my $self = shift;
     $self->{'A_column'}=[];      $self->{'rows'}=[];
     $self->{'template_cells'}=[];      $self->{'template_cells'}=[];
     foreach my $cell($self->formulas_keys()) {      foreach my $cell($self->formulas_keys()) {
         push(@{$self->{'A_column'}},$cell) if $cell =~ /^A\d+/;          push(@{$self->{'rows'}},$1) if ($cell =~ /^A(\d+)/ && $1 != 0);
         push(@{$self->{'template_cells'}},$cell) if ($cell =~ /^template_/);          push(@{$self->{'template_cells'}},$1) if ($cell =~ /^template_(\w+)/);
     }      }
     # $self->logthis('rebuilt A_column '.@{$self->{'A_column'}});  
     # $self->logthis('rebuilt tempate_cells '.@{$self->{'template_cells'}});  
     return;      return;
 }  }
   
Line 1924  sub template_cells { Line 1919  sub template_cells {
 }  }
   
 ##  ##
 ## A_column returns a list of the names of cells defined in the A column  ## rows returns a list of the names of cells defined in the A column
 ##  ##
 sub A_column {  sub rows {
     my $self = shift;      my $self = shift;
     $self->rebuild_stats() if (!@{$self->{'A_column'}});      $self->rebuild_stats() if (!@{$self->{'rows'}});
     return @{$self->{'A_column'}};      return @{$self->{'rows'}};
 }  }
   
 ##  ##
Line 1955  sub rowlabels { Line 1950  sub rowlabels {
         $self->{'rowlabel'}=$rowlabel;          $self->{'rowlabel'}=$rowlabel;
         return;          return;
     } else {      } else {
         return %{$self->{'rowlabel'}} if (defined($self->{'rowlabels'}));          return %{$self->{'rowlabel'}} if (defined($self->{'rowlabel'}));
     }      }
 }  }
   
Line 2669  sub readsheet { Line 2664  sub readsheet {
     # $fn now has a value      # $fn now has a value
     $self->{'filename'} = $fn;      $self->{'filename'} = $fn;
     # see if sheet is cached      # see if sheet is cached
     my $fstring='';      if (exists($spreadsheets{$cnum.'_'.$cdom.'_'.$stype.'_'.$fn})) {
     if ($fstring=$spreadsheets{$cnum.'_'.$cdom.'_'.$stype.'_'.$fn}) {          
         my %tmp = split(/___;___/,$fstring);          my %tmp = split(/___;___/,
                           $spreadsheets{$cnum.'_'.$cdom.'_'.$stype.'_'.$fn});
         $self->formulas(\%tmp);          $self->formulas(\%tmp);
 #        $self->logthis('readsheet found cached ');  
 #        $self->dump_formulas_to_log();  
     } else {      } else {
         # Not cached, need to read          # Not cached, need to read
         my %f=();          my %f=();
Line 2725  sub readsheet { Line 2719  sub readsheet {
         # Cache and set          # Cache and set
         $spreadsheets{$cnum.'_'.$cdom.'_'.$stype.'_'.$fn}=join('___;___',%f);            $spreadsheets{$cnum.'_'.$cdom.'_'.$stype.'_'.$fn}=join('___;___',%f);  
         $self->formulas(\%f);          $self->formulas(\%f);
 #        $self->logthis('readsheet loaded ');  
 #        $self->dump_formulas_to_log();  
     }      }
 }  }
   
Line 2950  sub updateclasssheet { Line 2942  sub updateclasssheet {
     my %existing=();      my %existing=();
     #      #
     # Now obsolete rows      # Now obsolete rows
     foreach my $cell ($self->A_column()) {      foreach my $rownum ($self->rows()) {
         $cell =~ /^A(\d+)/;          my $cell = 'A'.$rownum;
         if ($1 > $self->{'maxrow'}) {          if ($rownum > $self->{'maxrow'}) {
             $self->{'maxrow'}= $1;              $self->{'maxrow'}= $rownum;
         }          }
         $existing{$f{$cell}}=1;          $existing{$f{$cell}}=1;
         unless ((defined($currentlist{$f{$cell}})) || (!$1) ||          if (! defined($currentlist{$f{$cell}}) && ($f{$cell}=~/^(~~~|---)/)) {
                 ($f{$cell}=~/^(~~~|---)/)) {  
             $f{$cell}='!!! Obsolete';              $f{$cell}='!!! Obsolete';
             $changed=1;              $changed=1;
         }          }
Line 2988  sub get_student_rowlabels { Line 2979  sub get_student_rowlabels {
     $self->{'rowlabel'} = {};      $self->{'rowlabel'} = {};
     #      #
     my $identifier =$self->{'coursefilename'}.'_'.$stype;      my $identifier =$self->{'coursefilename'}.'_'.$stype;
     if  ($rowlabel_cache{$identifier}) {      if  (exists($rowlabel_cache{$identifier})) {
         %{$self->{'rowlabel'}}=split(/___;___/,$rowlabel_cache{$identifier});          my %tmp = split(/___;___/,$rowlabel_cache{$identifier});
           $self->rowlabels(\%tmp);
     } else {      } else {
         # Get the data and store it in the cache          # Get the data and store it in the cache
         # Tie hash          # Tie hash
Line 3041  sub get_assess_rowlabels { Line 3033  sub get_assess_rowlabels {
     $self->rowlabels({});      $self->rowlabels({});
     my $identifier =$self->{'coursefilename'}.'_'.$stype.'_'.$usymb;      my $identifier =$self->{'coursefilename'}.'_'.$stype.'_'.$usymb;
     #      #
     if  ($rowlabel_cache{$identifier}) {      if (exists($rowlabel_cache{$identifier})) {
         $self->rowlabels(split(/___;___/,$rowlabel_cache{$identifier}));          my %tmp = split('___;___',$rowlabel_cache{$identifier});
           $self->rowlabels(\%tmp);
     } else {      } else {
         # Get the data and store it in the cache          # Get the data and store it in the cache
         # Tie hash          # Tie hash
Line 3086  sub get_assess_rowlabels { Line 3079  sub get_assess_rowlabels {
         untie(%course_db);          untie(%course_db);
         # Store away the results          # Store away the results
         $self->rowlabels(\%parameter_labels);          $self->rowlabels(\%parameter_labels);
         $rowlabel_cache{$identifier}=join('___;___',$self->rowlabels());          $rowlabel_cache{$identifier}=join('___;___',%parameter_labels);
     }      }
           
 }  }
   
 sub updatestudentassesssheet {  sub updatestudentassesssheet {
Line 3104  sub updatestudentassesssheet { Line 3096  sub updatestudentassesssheet {
     $self->{'maxrow'} = 0;      $self->{'maxrow'} = 0;
     my %existing=();      my %existing=();
     # Now obsolete rows      # Now obsolete rows
     foreach my $cell ($self->A_column()) {      foreach my $rownum ($self->rows()) {
           my $cell = 'A'.$rownum;
         my $formula = $f{$cell};          my $formula = $f{$cell};
         my ($n)= ($cell =~ /A(\d+)/);          $self->{'maxrow'} = $rownum if ($rownum > $self->{'maxrow'});
         next if ($n eq '0');  
         $self->{'maxrow'} = $n if ($n > $self->{'maxrow'});  
         my ($usy,$ufn)=split(/__&&&\__/,$formula);          my ($usy,$ufn)=split(/__&&&\__/,$formula);
         $existing{$usy}=1;          $existing{$usy}=1;
         if ( ! exists($self->{'rowlabel'}->{$usy})  ||          if ( ! exists($self->{'rowlabel'}->{$usy})  ||
Line 3116  sub updatestudentassesssheet { Line 3107  sub updatestudentassesssheet {
              ($formula =~ /^(~~~|---)/) ||               ($formula =~ /^(~~~|---)/) ||
              ($formula =~ /^\s*$/)) {               ($formula =~ /^\s*$/)) {
             $f{$cell}='!!! Obsolete';              $f{$cell}='!!! Obsolete';
 #            $self->logthis('obsoleted row '.$n);  
             $changed=1;              $changed=1;
         }          }
     }      }
Line 3150  sub loadstudent{ Line 3140  sub loadstudent{
     undef @tmp;      undef @tmp;
     #       # 
     my @assessdata=();      my @assessdata=();
     foreach my $cell ($self->A_column()) {      foreach my $row ($self->rows()) {
           my $cell = 'A'.$row;
         my $value = $formulas{$cell};          my $value = $formulas{$cell};
         if(defined($c) && ($c->aborted())) {          if(defined($c) && ($c->aborted())) {
             last;              last;
         }          }
         my ($row)=($cell=~/A(\d+)/);          next if ($value =~ /^[!~-]/);
         next if (($value =~ /^[!~-]/) || ($row==0));  
         my ($usy,$ufn)=split(/__&&&\__/,$value);          my ($usy,$ufn)=split(/__&&&\__/,$value);
         @assessdata=$self->exportsheet($self->{'uname'},          @assessdata=$self->exportsheet($self->{'uname'},
                                         $self->{'udom'},                                          $self->{'udom'},
Line 3191  sub loadcourse { Line 3181  sub loadcourse {
     my %formulas=$self->formulas();      my %formulas=$self->formulas();
     #      #
     my $total=0;      my $total=0;
     foreach ($self->A_column()) {      foreach ($self->rows()) {
         $total++ if ($formulas{$_} !~ /^[!~-]/);          $total++ if ($formulas{'A'.$_} !~ /^[!~-]/);
     }      }
     my $now=0;      my $now=0;
     my $since=time;      my $since=time;
Line 3208  sub loadcourse { Line 3198  sub loadcourse {
 </script>  </script>
 ENDPOP  ENDPOP
     $r->rflush();      $r->rflush();
     foreach ($self->A_column()) {      # It would be nice to load in the classlist and assessment info at this 
       # point, before attacking the student spreadsheets.
       foreach my $row ($self->rows()) {
         if(defined($c) && ($c->aborted())) {          if(defined($c) && ($c->aborted())) {
             last;              last;
         }          }
         my ($row)=(/A(\d+)/);          my $cell = 'A'.$row;
         next if (($formulas{$_}=~/^[\!\~\-]/)  || ($row==0));          next if ($formulas{$cell}=~/^[\!\~\-]/);
         my ($sname,$sdom) = split(':',$formulas{$_});          my ($sname,$sdom) = split(':',$formulas{$cell});
         my $started = time;          my $started = time;
         my @studentdata=$self->exportsheet($sname,$sdom,'studentcalc',          my @studentdata=$self->exportsheet($sname,$sdom,'studentcalc',
                                      undef,undef,$r);                                       undef,undef,$r);
Line 3342  sub loadassessment { Line 3334  sub loadassessment {
     if (tie(%parmhash,'GDBM_File',      if (tie(%parmhash,'GDBM_File',
             $self->{'coursefilename'}.'_parms.db',&GDBM_READER(),0640)) {              $self->{'coursefilename'}.'_parms.db',&GDBM_READER(),0640)) {
         my %f=$self->formulas();          my %f=$self->formulas();
         foreach my $cell ($self->A_column())  {          foreach my $row ($self->rows())  {
               my $cell = 'A'.$row;
             my $formula = $self->formula($cell);              my $formula = $self->formula($cell);
             next if ($formula =~/^[\!\~\-]/);              next if ($formula =~/^[\!\~\-]/);
             if ($formula =~ /^parameter/) {              if ($formula =~ /^parameter/) {

Removed from v.1.164  
changed lines
  Added in v.1.167


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