Diff for /loncom/interface/spreadsheet/assesscalc.pm between versions 1.21 and 1.28

version 1.21, 2003/09/10 18:33:35 version 1.28, 2003/11/11 15:36:28
Line 50  use Apache::Constants qw(:common :http); Line 50  use Apache::Constants qw(:common :http);
 use Apache::lonnet;  use Apache::lonnet;
 use Apache::loncommon;  use Apache::loncommon;
 use Apache::Spreadsheet;  use Apache::Spreadsheet;
   use Apache::loncoursedata();
 use HTML::Entities();  use HTML::Entities();
 use Spreadsheet::WriteExcel;  use Spreadsheet::WriteExcel;
 use GDBM_File;  use GDBM_File;
 use Time::HiRes;  use Time::HiRes;
   use Apache::lonlocal;
   
 @Apache::assesscalc::ISA = ('Apache::Spreadsheet');  @Apache::assesscalc::ISA = ('Apache::Spreadsheet');
   
Line 90  use Time::HiRes; Line 92  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 102  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 114  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();
       &Apache::loncoursedata::clear_internal_caches();
 }  }
   
 ########################################################  ########################################################
Line 145  sub initialize_package { Line 169  sub initialize_package {
     $current_name   = $sname;      $current_name   = $sname;
     $current_domain = $sdomain;      $current_domain = $sdomain;
     undef(%useropt);      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);
     }      }
     &load_cached_export_rows();      &load_cached_export_rows();
     &load_parameter_caches();      &load_parameter_caches();
       &Apache::loncoursedata::clear_internal_caches();
 }  }
   
   
 ########################################################  ########################################################
 ########################################################  ########################################################
   
Line 194  sub load_parameter_caches { Line 221  sub load_parameter_caches {
         }          }
         $useropt{'loadtime'} = time;          $useropt{'loadtime'} = time;
     }      }
       if (! %userdata) {
           %userdata = &Apache::loncoursedata::get_current_state($current_name,
                                                                 $current_domain);
           $userdata{'loadtime'} = time;
       }
       return;
 }  }
   
 ########################################################  ########################################################
Line 207  sub load_parameter_caches { Line 240  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 216  sub ensure_current_parameter_caches { Line 249  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 225  sub ensure_current_parameter_caches { Line 260  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 363  sub get_title { Line 399  sub get_title {
         join(' ',@userenv{'firstname','middlename','lastname','generation'});          join(' ',@userenv{'firstname','middlename','lastname','generation'});
     $name =~ s/\s+$//;      $name =~ s/\s+$//;
     push (@title,$name);      push (@title,$name);
     push (@title,scalar(localtime(time)));      push (@title,&Apache::lonlocal::locallocaltime(time));
     return @title;      return @title;
 }  }
   
Line 372  sub parent_link { Line 408  sub parent_link {
     my $link .= '<p><a href="/adm/studentcalc?'.      my $link .= '<p><a href="/adm/studentcalc?'.
         'sname='.$self->{'name'}.          'sname='.$self->{'name'}.
             '&sdomain='.$self->{'domain'}.'">'.              '&sdomain='.$self->{'domain'}.'">'.
                 'Student level sheet</a></p>'."\n";                  &mt('Student level sheet').'</a></p>'."\n";
     return $link;      return $link;
 }  }
   
Line 386  sub outsheet_html { Line 422  sub outsheet_html {
     my $exportcolor = '#FFFFAA';      my $exportcolor = '#FFFFAA';
     my $num_uneditable = 1;      my $num_uneditable = 1;
     my $num_left = 52-$num_uneditable;      my $num_left = 52-$num_uneditable;
       my %lt=&Apache::lonlocal::texthash(
          'as' => 'Assessment',
          'ca' => 'Calculations',
          );
     my $tableheader =<<"END";      my $tableheader =<<"END";
 <table border="2">  <table border="2">
 <tr>  <tr>
   <th colspan="2" rowspan="2"><font size="+2">Assessment</font></th>    <th colspan="2" rowspan="2"><font size="+2">$lt{'as'}</font></th>
   <td bgcolor="$importcolor" colspan="$num_uneditable">&nbsp;</td>    <td bgcolor="$importcolor" colspan="$num_uneditable">&nbsp;</td>
   <td colspan="$num_left">    <td colspan="$num_left">
       <b><font size="+1">Calculations</font></b></td>        <b><font size="+1">$lt{'ca'}</font></b></td>
 </tr><tr>  </tr><tr>
 END  END
     my $label_num = 0;      my $label_num = 0;
Line 434  END Line 474  END
     #      #
     my $num_output = 0;      my $num_output = 0;
     foreach my $rownum (sort {$a <=> $b} ($self->rows())) {      foreach my $rownum (sort {$a <=> $b} ($self->rows())) {
           if (! $self->parameter_part_is_valid(
                                                $self->{'formulas'}->{'A'.$rownum}
                                                )) {
               next;
           }
  if ($num_output++ % 50 == 0) {   if ($num_output++ % 50 == 0) {
     $r->print("</table>\n".$tableheader);      $r->print("</table>\n".$tableheader);
  }   }
Line 482  sub csv_rows { Line 527  sub csv_rows {
     #      #
     # Write a header row      # Write a header row
     $self->csv_output_row($filehandle,undef,      $self->csv_output_row($filehandle,undef,
                           ('Parameter','Description','Value'));                            (&mt('Parameter'),&mt('Description'),&mt('Value')));
     #      #
     # Write each row      # Write each row
     foreach my $rownum (sort {$a <=> $b} ($self->rows())) {      foreach my $rownum (sort {$a <=> $b} ($self->rows())) {
Line 506  sub excel_rows { Line 551  sub excel_rows {
     # Write a header row      # Write a header row
     $cols_output = 0;      $cols_output = 0;
     foreach my $value ('Parameter','Description','Value') {      foreach my $value ('Parameter','Description','Value') {
         $worksheet->write($rows_output,$cols_output++,$value);          $worksheet->write($rows_output,$cols_output++,&mt($value));
     }      }
     $rows_output++;          $rows_output++;    
     #      #
Line 531  sub get_parm_names { Line 576  sub get_parm_names {
     my @Mandatory_parameters = @_;      my @Mandatory_parameters = @_;
     my %parameters_and_names;      my %parameters_and_names;
     #      #
     my ($symap,$syid,$srcf)=split(/___/,$self->{'symb'});      my ($symap,$syid,$srcf) = &Apache::lonnet::decode_symb($self->{'symb'});
     my @Metadata = split(/\,/,&Apache::lonnet::metadata($srcf,'keys'));      my @Metadata = split(/\,/,&Apache::lonnet::metadata($srcf,'keys'));
     foreach my $parm (@Mandatory_parameters,@Metadata) {      foreach my $parm (@Mandatory_parameters,@Metadata) {
         next if ($parm !~ /^(resource\.|stores|parameter)_/);          next if ($parm !~ /^(resource\.|stores|parameter)_/);
Line 587  sub deal_with_export_row { Line 632  sub deal_with_export_row {
     return;      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 determine_parts {
       my $self = shift;
       if (exists($self->{'Parts'}) && ref($self->{'Parts'}) eq 'HASH') {
           return;
       }
       my (undef,undef,$url) = &Apache::lonnet::decode_symb($self->{'symb'});
       my $src = &Apache::lonnet::clutter($url);
       return if (! defined($src));
       my %Parts;
       my $metadata = &Apache::lonnet::metadata($src,'packages');
       foreach (split(',',$metadata)) {
           my ($part) = (/^part_(.*)$/);
           if (defined($part) && 
               ! &Apache::loncommon::check_if_partid_hidden
                   ($part,$self->{'symb'},$self->{'name'},$self->{'domain'})
               ) {
               $Parts{$part}++;
           }
       }
       # Make sure part 0 is defined.
       $Parts{'0'}++;
       $self->{'Parts'} = \%Parts;
       return;
   }
   
   sub parameter_part_is_valid {
       my $self = shift;
       my ($parameter) = @_;
       return 1 if ($parameter eq 'timestamp');
       if (! defined($self->{'Parts'}) || 
           ! ref ($self->{'Parts'})    ||
           ref($self->{'Parts'}) ne 'HASH') {
           return 1;
       }
       #
       my (undef,$part) = 
           ($parameter =~ m/^(resource|stores|parameter)_([^_]+)_.*/);
       if (exists($self->{'Parts'})          && 
           exists($self->{'Parts'}->{$part}) &&
           $self->{'Parts'}->{$part} ) {
           return 1;
       } else {
           return 0;
       }
   }
   
 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 622  sub compute { Line 721  sub compute {
     #      #
     # 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; }
     %parameters = $self->get_parameter_values(keys(%parameters));      %parameters = $self->get_parameter_values(keys(%parameters));
     if ($connection->aborted()) { $self->cleanup(); return; }      if ($connection->aborted()) { $self->cleanup(); return; }
Line 633  sub compute { Line 732  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;
         $parameters{$parm} = $value;          $parameters{$parm} = $value;
     }      }
     #      #
       # Clean out any bad parameters
       $self->determine_parts();
       foreach my $param (keys(%parameters)) {
           if (! $self->parameter_part_is_valid($param)) {
               delete ($parameters{$param});
           }
       }
       #
     # Set up the formulas and parameter values      # Set up the formulas and parameter values
     my %f=$self->formulas();      my %f=$self->formulas();
     my %c;      my %c;
Line 653  sub compute { Line 756  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$/);
             if ($parameters{$1.'_answerdate'} eq '' ||              if ($parameters{$1.'_answerdate'} ne '' &&
                 $parameters{$1.'_answerdate'} < time) {                  $parameters{$1.'_answerdate'} < time) {
                 next;                  next;
             }              }
Line 666  sub compute { Line 769  sub compute {
     if ($connection->aborted()) { $self->cleanup(); return; }      if ($connection->aborted()) { $self->cleanup(); return; }
     #      #
     # Move the parameters into the spreadsheet      # Move the parameters into the spreadsheet
     if ($connection->aborted()) { $self->cleanup(); return; }  
     while (my ($parm,$value) = each(%parameters)) {      while (my ($parm,$value) = each(%parameters)) {
         my $cell = 'A'.$self->get_row_number_from_key($parm);          my $cell = 'A'.$self->get_row_number_from_key($parm);
         $f{$cell} = $parm;          $f{$cell} = $parm;
Line 840  sub save_export_data { Line 942  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.21  
changed lines
  Added in v.1.28


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