Diff for /loncom/interface/spreadsheet/assesscalc.pm between versions 1.20 and 1.23

version 1.20, 2003/09/09 18:46:28 version 1.23, 2003/09/17 17:32:56
Line 90  use Time::HiRes; Line 90  use Time::HiRes;
 ########################################################  ########################################################
   
 my %Exportrows;  my %Exportrows;
   my %newExportrows;
   
 my $current_name;  my $current_name;
 my $current_domain;  my $current_domain;
Line 99  my %parmhash; Line 100  my %parmhash;
 my %nice_parameter_name;  my %nice_parameter_name;
   
 my %useropt;  my %useropt;
   my %userdata;
 my %courseopt;  my %courseopt;
   
 ########################################################  ########################################################
Line 110  my %courseopt; Line 112  my %courseopt;
   
 =item &clear_package()  =item &clear_package()
   
 Reset all package variables.    Reset all package variables and clean up caches.
   
 =cut  =cut
   
 ########################################################  ########################################################
 ########################################################  ########################################################
 sub clear_package {  sub clear_package {
       if (defined($current_name) &&
           defined($current_domain) &&
           defined($current_course) &&
           $current_course eq $ENV{'request.course.id'} &&
           %newExportrows) {
           &save_cached_export_rows($current_name,$current_domain);
       }
     undef(%Exportrows);      undef(%Exportrows);
       undef(%newExportrows);
     undef($current_name);      undef($current_name);
     undef($current_domain);      undef($current_domain);
     undef($current_course);      undef($current_course);
     undef(%useropt);      undef(%useropt);
       undef(%userdata);
     undef(%courseopt);      undef(%courseopt);
 }  }
   
   sub save_cached_export_rows {
       my ($sname,$sdomain) = @_;
       my $start = Time::HiRes::time;
       my $result = &Apache::lonnet::put
           ('nohist_calculatedsheets_'.$ENV{'request.course.id'},
            $newExportrows{$sname.':'.$sdomain},
            $sdomain,$sname);
       delete($newExportrows{$sname.':'.$sdomain});
   }
   
 sub initialize {  sub initialize {
     &clear_package();      &clear_package();
 }  }
Line 144  sub initialize_package { Line 165  sub initialize_package {
     my ($sname,$sdomain) = @_;      my ($sname,$sdomain) = @_;
     $current_name   = $sname;      $current_name   = $sname;
     $current_domain = $sdomain;      $current_domain = $sdomain;
       undef(%useropt);
       undef(%userdata);
     if ($current_course ne $ENV{'request.course.id'}) {      if ($current_course ne $ENV{'request.course.id'}) {
         $current_course = $ENV{'request.course.id'};          $current_course = $ENV{'request.course.id'};
         undef(%courseopt);          undef(%courseopt);
Line 152  sub initialize_package { Line 175  sub initialize_package {
     &load_parameter_caches();      &load_parameter_caches();
 }  }
   
   
 ########################################################  ########################################################
 ########################################################  ########################################################
   
Line 172  sub load_parameter_caches { Line 196  sub load_parameter_caches {
         $current_course = $ENV{'request.course.id'};          $current_course = $ENV{'request.course.id'};
         undef(%courseopt);          undef(%courseopt);
         if (! defined($current_name) || ! defined($current_domain)) {          if (! defined($current_name) || ! defined($current_domain)) {
             &Apache::lonnet::logthis('bad call to setup_parameter_caches');  
             return;              return;
         }          }
         my $dom = $ENV{'course.'.$ENV{'request.course.id'}.'.domain'};          my $dom = $ENV{'course.'.$ENV{'request.course.id'}.'.domain'};
Line 192  sub load_parameter_caches { Line 215  sub load_parameter_caches {
             }              }
             $useropt{$userprefix.$name}=$value;              $useropt{$userprefix.$name}=$value;
         }          }
           $useropt{'loadtime'} = time;
       }
       if (! %userdata) {
           %userdata = &Apache::loncoursedata::get_current_state($current_name,
                                                                 $current_domain);
           $userdata{'loadtime'} = time;
     }      }
       return;
 }  }
   
 ########################################################  ########################################################
Line 206  sub load_parameter_caches { Line 236  sub load_parameter_caches {
   
 ########################################################  ########################################################
 ########################################################  ########################################################
 sub ensure_current_parameter_caches {  sub ensure_current_caches {
     my $self = shift;      my $self = shift;
     ##      ##
     ## Check for a modified parameters      ## Check for a modified parameters
Line 215  sub ensure_current_parameter_caches { Line 245  sub ensure_current_parameter_caches {
         $current_course ne $ENV{'request.course.id'} ) {          $current_course ne $ENV{'request.course.id'} ) {
         $current_course = $ENV{'request.course.id'};          $current_course = $ENV{'request.course.id'};
         undef(%courseopt);           undef(%courseopt); 
           undef(%useropt);
           undef(%userdata);
     }      }
     ##      ##
     ## Check for new user      ## Check for new user
Line 224  sub ensure_current_parameter_caches { Line 256  sub ensure_current_parameter_caches {
         $current_domain = $self->{'domain'};          $current_domain = $self->{'domain'};
         $current_name   = $self->{'name'};          $current_name   = $self->{'name'};
         undef(%useropt);          undef(%useropt);
           undef(%userdata);
     }      }
     &load_parameter_caches();      &load_parameter_caches();
 }  }
Line 522  sub excel_rows { Line 555  sub excel_rows {
     return;      return;
 }  }
   
   ##
   ## Routines to support assesscalc::compute
   ##
   sub get_parm_names {
       my $self = shift;
       my @Mandatory_parameters = @_;
       my %parameters_and_names;
       #
       my ($symap,$syid,$srcf) = &Apache::lonnet::decode_symb($self->{'symb'});
       my @Metadata = split(/\,/,&Apache::lonnet::metadata($srcf,'keys'));
       foreach my $parm (@Mandatory_parameters,@Metadata) {
           next if ($parm !~ /^(resource\.|stores|parameter)_/);
           my $cleaned_name = $parm;
           $cleaned_name =~ s/^resource\./stores_/;
           $cleaned_name =~ s/\./_/g;
           my $display = &Apache::lonnet::metadata($srcf,
                                                   $cleaned_name.'.display');
           if (! $display) {
               $display .= &Apache::lonnet::metadata($srcf,$cleaned_name.'.name');
           }
           $parameters_and_names{$cleaned_name}=$display;
       }
       return (%parameters_and_names);
   }
   
   sub get_parameter_values {
       my $self = shift();
       my @Parameters;
       my ($parameters) = @_;
       if (!ref($parameters)) {
           @Parameters = @_;
       } elsif (ref($parameters) eq 'ARRAY') {
           @Parameters = @$parameters;
       } elsif (ref($parameters) eq 'HASH') {
           @Parameters = keys(%$parameters);
       }
       #
       my %parameters;
       #
       my $filename = $self->{'coursefilename'}.'_parms.db';
       if (tie(%parmhash,'GDBM_File',
               $self->{'coursefilename'}.'_parms.db',&GDBM_READER(),0640)) {
           foreach my $parmname (@Parameters) {
               my $value = $self->parmval($parmname);
               $parameters{$parmname} =$value;
           }
           untie(%parmhash);
       } else {
           $self->logthis('unable to tie '.$filename);
       }
       return %parameters;
   }
   
   sub deal_with_export_row {
       my $self = shift();
       my @exportarray = @_;
       $Exportrows{$self->{'symb'}}->{'time'} = time;
       $Exportrows{$self->{'symb'}}->{$self->{'filename'}} = \@exportarray;
       #
       # Save the export data
       $self->save_export_data();
       return;
   }
   
   sub get_problem_state {
       my $self = shift;
       my %student_parameters;
       if (exists($userdata{$self->{'symb'}}) && 
           ref($userdata{$self->{'symb'}}) eq 'HASH') {
           %student_parameters = %{$userdata{$self->{'symb'}}};
       }
       return %student_parameters;
   }
   
 sub compute {  sub compute {
     my $self = shift;      my $self = shift;
     my ($r) = @_;      my ($r) = @_;
     my $connection = $r->connection();      my $connection = $r->connection();
     if ($connection->aborted()) { $self->cleanup(); return; }      if ($connection->aborted()) { $self->cleanup(); return; }
 #    $self->logthis('computing');  
     $self->initialize_safe_space();      $self->initialize_safe_space();
     #########################################      #########################################
     #########################################      #########################################
Line 548  sub compute { Line 654  sub compute {
     my %parameters;   # holds underscored parameters by name      my %parameters;   # holds underscored parameters by name
     #      #
     # Get the metadata fields and determine their proper names      # Get the metadata fields and determine their proper names
     my ($symap,$syid,$srcf)=&Apache::lonnet::decode_symb($self->{'symb'});      my %nice_parm_names = $self->get_parm_names(@Mandatory_parameters);
     my @Metadata = split(/\,/,&Apache::lonnet::metadata($srcf,'keys'));      while (my($cleaned_name,$display) = each(%nice_parm_names)) {
     foreach my $parm (@Mandatory_parameters,@Metadata) {  
         next if ($parm !~ /^(resource\.|stores|parameter)_/);  
         my $cleaned_name = $parm;  
         $cleaned_name =~ s/^resource\./stores_/;  
         $cleaned_name =~ s/\./_/g;  
         my $display = &Apache::lonnet::metadata($srcf,  
                                                 $cleaned_name.'.display');  
         if (! $display) {  
             $display .= &Apache::lonnet::metadata($srcf,$cleaned_name.'.name');  
         }  
         $parameters{$cleaned_name}++;          $parameters{$cleaned_name}++;
         $nice_parameter_name{$cleaned_name} = $display;          $nice_parameter_name{$cleaned_name} = $display;
     }      }
     #      #
     # Get the values of the metadata fields      # Get the values of the metadata fields
     if ($connection->aborted()) { $self->cleanup(); return; }      if ($connection->aborted()) { $self->cleanup(); return; }
     $self->ensure_current_parameter_caches();      $self->ensure_current_caches();
     if ($connection->aborted()) { $self->cleanup(); return; }      if ($connection->aborted()) { $self->cleanup(); return; }
     my $filename = $self->{'coursefilename'}.'_parms.db';      %parameters = $self->get_parameter_values(keys(%parameters));
     if (tie(%parmhash,'GDBM_File',  
             $self->{'coursefilename'}.'_parms.db',&GDBM_READER(),0640)) {  
         foreach my $parmname (keys(%parameters)) {  
             my $value = $self->parmval($parmname);  
             $parameters{$parmname} =$value;  
         }  
         untie(%parmhash);  
     } else {  
         $self->logthis('unable to tie '.$filename);  
     }  
     if ($connection->aborted()) { $self->cleanup(); return; }      if ($connection->aborted()) { $self->cleanup(); return; }
     #      #
     # Clean out unnecessary parameters      # Clean out unnecessary parameters
Line 587  sub compute { Line 673  sub compute {
     }      }
     #      #
     # Get the students performance data      # Get the students performance data
     my %student_parameters =       my %student_parameters = $self->get_problem_state();
         &Apache::loncoursedata::get_current_state($self->{'name'},  
                                                   $self->{'domain'},  
                                                   $self->{'symb'},  
                                                   $self->{'cid'});  
     while (my ($parm,$value) = each(%student_parameters)) {      while (my ($parm,$value) = each(%student_parameters)) {
         $parm =~ s/^resource\./stores_/;          $parm =~ s/^resource\./stores_/;
         $parm =~ s/\./_/g;          $parm =~ s/\./_/g;
Line 607  sub compute { Line 689  sub compute {
         while (my ($parm,$value) = each(%parameters)) {          while (my ($parm,$value) = each(%parameters)) {
             last if ($self->blackout());              last if ($self->blackout());
             next if ($parm !~ /^(parameter_.*)_problemstatus$/);              next if ($parm !~ /^(parameter_.*)_problemstatus$/);
             next if ($parameters{$1.'_answerdate'}<time);              if ($parameters{$1.'_answerdate'} eq '' ||
                   $parameters{$1.'_answerdate'} < time) {
                   next;
               }
             if (lc($value) eq 'no') {              if (lc($value) eq 'no') {
                 # We must blackout this sheet                  # We must blackout this sheet
                 $self->blackout(1);                  $self->blackout(1);
Line 631  sub compute { Line 716  sub compute {
     #      #
     # Store export row in cache      # Store export row in cache
     my @exportarray = $self->exportrow();      my @exportarray = $self->exportrow();
     $Exportrows{$self->{'symb'}}->{'time'} = time;      $self->deal_with_export_row(@exportarray);
     $Exportrows{$self->{'symb'}}->{$self->{'filename'}} = \@exportarray;  
     #  
     # Save the export data  
     $self->save_export_data();  
     $self->save() if ($self->need_to_save());      $self->save() if ($self->need_to_save());
     if ($connection->aborted()) { $self->cleanup(); return; }      if ($connection->aborted()) { $self->cleanup(); return; }
     return;      return;
Line 795  sub save_export_data { Line 876  sub save_export_data {
     }      }
     my $key = join(':',($self->{'name'},$self->{'domain'},'assesscalc',$symb));      my $key = join(':',($self->{'name'},$self->{'domain'},'assesscalc',$symb));
     my $timekey = $key.'.time';      my $timekey = $key.'.time';
     my $newstore= join('___;___',@{$Exportrows{$symb}->{$self->{'filename'}}});      my $newstore= join('___;___',
                          map {s/[^[:print:]]//g;$_;} # strip out unprintable
                                   @{$Exportrows{$symb}->{$self->{'filename'}}});
     $newstore = $self->{'filename'}.'___=___'.$newstore;      $newstore = $self->{'filename'}.'___=___'.$newstore;
     my $result = &Apache::lonnet::put      $newExportrows{$student}->{$key} = $newstore;
         ('nohist_calculatedsheets_'.$ENV{'request.course.id'},      $newExportrows{$student}->{$timekey} = $Exportrows{$symb}->{'time'};
          { $key     => $newstore,  
            $timekey => $Exportrows{$symb}->{'time'} },  
          $self->{'domain'},  
          $self->{'name'});  
   
     return;      return;
 }  }
   

Removed from v.1.20  
changed lines
  Added in v.1.23


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