Diff for /loncom/interface/spreadsheet/studentcalc.pm between versions 1.1 and 1.16

version 1.1, 2003/05/16 20:55:11 version 1.16, 2003/08/01 13:33:41
Line 48  package Apache::studentcalc; Line 48  package Apache::studentcalc;
 use strict;  use strict;
 use Apache::Constants qw(:common :http);  use Apache::Constants qw(:common :http);
 use Apache::lonnet;  use Apache::lonnet;
   use Apache::loncommon();
   use Apache::loncoursedata();
 use Apache::lonnavmaps;  use Apache::lonnavmaps;
 use Apache::Spreadsheet;  use Apache::Spreadsheet();
 use Apache::assesscalc;  use Apache::assesscalc();
 use HTML::Entities();  use HTML::Entities();
 use Spreadsheet::WriteExcel;  use Spreadsheet::WriteExcel;
 use Time::HiRes;  use Time::HiRes;
Line 62  my %Exportrows = (); Line 64  my %Exportrows = ();
   
 my $current_course;  my $current_course;
   
   sub initialize {
       &Apache::assesscalc::initialize();
       &initialize_sequence_cache();
   }
   
 sub initialize_package {  sub initialize_package {
     $current_course = $ENV{'request.course.id'};      $current_course = $ENV{'request.course.id'};
     &initialize_sequence_cache();      &initialize_sequence_cache();
     &load_cached_export_rows();      &load_cached_export_rows();
 }  }
   
   sub ensure_correct_sequence_data {
       if ($current_course ne $ENV{'request.course.id'}) {
           &initialize_sequence_cache();
           $current_course = $ENV{'request.course.id'};
       }
       return;
   }
   
 sub initialize_sequence_cache {  sub initialize_sequence_cache {
     #      #
     # Set up the sequences and assessments      # Set up the sequences and assessments
Line 76  sub initialize_sequence_cache { Line 91  sub initialize_sequence_cache {
         &Apache::loncoursedata::get_sequence_assessment_data();          &Apache::loncoursedata::get_sequence_assessment_data();
     if (! defined($top) || ! ref($top)) {      if (! defined($top) || ! ref($top)) {
         # There has been an error, better report it          # There has been an error, better report it
         &Apache::lonnet::logthis('top is undefined');          &Apache::lonnet::logthis('top is undefined (studentcalc.pm)');
         return;          return;
     }      }
     @Sequences = @{$sequences} if (ref($sequences) eq 'ARRAY');      @Sequences = @{$sequences} if (ref($sequences) eq 'ARRAY');
Line 89  sub clear_package { Line 104  sub clear_package {
   
 sub get_title {  sub get_title {
     my $self = shift;      my $self = shift;
     my $title = '';      my @title = ();
     $title .= '<h2>Spreadsheet for '.      #
         $self->{'name'}.'@'.$self->{'domain'}.'</h2>';      # Determine the students name
       my %userenv = &Apache::loncoursedata::GetUserName($self->{'name'},
                                                         $self->{'domain'});
       my $name = join(' ',
                    @userenv{'firstname','middlename','lastname','generation'});
       $name =~ s/\s+$//;
   
       push (@title,$name);
       push (@title,$self->{'coursedesc'});
       push (@title,scalar(localtime(time)));
       return @title;
   }
   
   sub get_html_title {
       my $self = shift;
       my ($name,$desc,$time) = $self->get_title();
       my $title = '<h1>'.$name;
       if ($ENV{'user.name'} ne $self->{'name'} && 
           $ENV{'user.domain'} ne $self->{'domain'}) {
           $title .= &Apache::loncommon::aboutmewrapper
                                       ($self->{'name'}.'@'.$self->{'domain'},
                                        $self->{'name'},$self->{'domain'});
       }
       $title .= "</h1>\n";
       $title .= '<h2>'.$desc."</h2>\n";
       $title .= '<h3>'.$time.'</h3>';
     return $title;      return $title;
 }  }
   
Line 104  sub parent_link { Line 144  sub parent_link {
     return $link;      return $link;
 }  }
   
   sub convenience_links {
       my $self = shift;
       my ($resource) = @_;
       my $symb = &Apache::lonnet::escape($resource->{'symb'});
       my $result = <<"END";
   <a href="/adm/grades?symb=$symb&command=submission" target="LONcatInfo">
       <img src="/adm/lonMisc/subm_button.gif" border=0 />
       </a>
   <a href="/adm/grades?symb=$symb&command=gradingmenu" target="LONcatInfo">
       <img src="/adm/lonMisc/pgrd_button.gif" border=0 />
       </a>
   <a href="/adm/parmset?symb=$symb" target="LONcatInfo">
       <img src="/adm/lonMisc/pprm_button.gif" border=0 />
       </a>
   END
       return $result;
   }
   
 sub outsheet_html {  sub outsheet_html {
     my $self = shift;      my $self = shift;
     my ($r) = @_;      my ($r) = @_;
       my $importcolor = '#FFFFAA';
       my $exportcolor = '#88FF88';
     ####################################      ####################################
     # Get the list of assessment files #      # Get the list of assessment files #
     ####################################      ####################################
     my @AssessFileNames = $self->othersheets('assesscalc');      my @AssessFileNames = $self->othersheets('assesscalc');
       my $editing_is_allowed = &Apache::lonnet::allowed('mgr',
                                                   $ENV{'request.course.id'});
     ####################################      ####################################
     # Determine table structure        #      # Determine table structure        #
     ####################################      ####################################
     my $num_uneditable = 26;      my $num_uneditable = 26;
     my $num_left = 52-$num_uneditable;      my $num_left = 52-$num_uneditable;
     my $tableheader =<<"END";      my $tableheader =<<"END";
   <p>
 <table border="2">  <table border="2">
 <tr>  <tr>
   <th colspan="2" rowspan="2"><font size="+2">Student</font></th>    <th colspan="2" rowspan="2"><font size="+2">Student</font></th>
   <td bgcolor="#FFDDDD" colspan="$num_uneditable">    <td bgcolor="$importcolor" colspan="$num_uneditable">
       <b><font size="+1">Import</font></b></td>        <b><font size="+1">Import</font></b></td>
   <td colspan="$num_left">    <td colspan="$num_left">
       <b><font size="+1">Calculations</font></b></td>        <b><font size="+1">Calculations</font></b></td>
Line 129  END Line 192  END
     my $label_num = 0;      my $label_num = 0;
     foreach (split(//,'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz')){      foreach (split(//,'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz')){
         if ($label_num<$num_uneditable) {           if ($label_num<$num_uneditable) { 
             $tableheader .='<td bgcolor="#FFDDDD">';              $tableheader .='<td bgcolor="'.$importcolor.'">';
         } else {          } else {
             $tableheader .='<td>';              $tableheader .='<td>';
         }          }
Line 137  END Line 200  END
         $label_num++;          $label_num++;
     }      }
     $tableheader .="</tr>\n";      $tableheader .="</tr>\n";
     #      if ($self->blackout()) {
     $r->print($tableheader);          $r->print('<font color="red" size="+2"><p>'.
     #                    'Some computations are not available at this time.<br />'.
     # Print out template row                    'There are problems whose status you are allowed to view.'.
     $r->print('<tr><td>Template</td><td>&nbsp;</td>'.                    '</font></p>'."\n");
       $self->html_template_row($num_uneditable)."</tr>\n");      } else {
     #          $r->print($tableheader);
     # Print out summary/export row          #
     $r->print('<tr><td>Export</td><td>0</td>'.          # Print out template row
       $self->html_export_row()."</tr>\n");          if (exists($ENV{'request.role.adv'}) && $ENV{'request.role.adv'}) {
               $r->print('<tr><td>Template</td><td>&nbsp;</td>'.
                         $self->html_template_row($num_uneditable,
                                                  $importcolor)."</tr>\n");
           }
           #
           # Print out summary/export row
           $r->print('<tr><td>Summary</td><td>0</td>'.
                     $self->html_export_row($exportcolor)."</tr>\n");
       }
     $r->print("</table>\n");      $r->print("</table>\n");
     #      #
     # Prepare to output rows      # Prepare to output rows
     $tableheader =<<"END";      if (exists($ENV{'request.role.adv'}) && $ENV{'request.role.adv'}) {
           $tableheader =<<"END";
   </p><p>
   <table border="2">
   <tr><th>Row</th><th>&nbsp;</th><th>Assessment</th>
   END
       } else {
           $tableheader =<<"END";
   </p><p>
 <table border="2">  <table border="2">
 <tr><th>Row</th><th>Assessment</th>  <tr><th>&nbsp;</th><th>Assessment</th>
 END  END
       }
     foreach (split(//,'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz')){      foreach (split(//,'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz')){
  if ($label_num<$num_uneditable) {    if ($label_num<$num_uneditable) { 
             $tableheader.='<td bgcolor="#FFDDDD">';              $tableheader.='<td bgcolor="#FFDDDD">';
Line 176  END Line 257  END
     next if ($resource->{'type'} ne 'assessment');      next if ($resource->{'type'} ne 'assessment');
     my $rownum = $self->get_row_number_from_key($resource->{'symb'});      my $rownum = $self->get_row_number_from_key($resource->{'symb'});
             my $assess_filename = $self->{'row_source'}->{$rownum};              my $assess_filename = $self->{'row_source'}->{$rownum};
     my $row_output = '<tr><td>'.$rownum.'</td>';              my $row_output = '<tr>';
             $row_output .= '<td>'.              if ($editing_is_allowed) {
                 '<a href="/adm/assesscalc?sname='.$self->{'name'}.                  $row_output .= '<td>'.$rownum.'</td>';
                 '&sdomain='.$self->{'domain'}.                  $row_output .= '<td>'.$self->convenience_links($resource).'</td>';
                 '&filename='.$assess_filename.                  $row_output .= '<td>'.
                 '&usymb='.$resource->{'symb'}.'">'.                      '<a href="/adm/assesscalc?sname='.$self->{'name'}.
                 $resource->{'title'}.'</a>';                      '&sdomain='.$self->{'domain'}.
             $row_output .= &assess_file_selector($rownum,                      '&filename='.$assess_filename.
                                                  $assess_filename,                      '&usymb='.&Apache::lonnet::escape($resource->{'symb'}).
                                                  \@AssessFileNames);                      '">'.$resource->{'title'}.'</a><br />';
             $row_output .= '</td>'.$self->html_row($num_uneditable,$rownum).                  $row_output .= &assess_file_selector($rownum,
                 "</tr>\n";                                                       $assess_filename,
                                                        \@AssessFileNames).
                                                            '</td>';
               } else {
                   $row_output .= '<td><a href="'.$resource->{'src'}.'?symb='.
                       &Apache::lonnet::escape($resource->{'symb'}).
                       '">Go&nbsp;To</a>';
                   $row_output .= '</td><td>'.$resource->{'title'}.'</td>';
               }
               if ($self->blackout() && $self->{'blackout_rows'}->{$rownum}>0) {
                   $row_output .= 
                       '<td colspan="52">Unavailable at this time</td></tr>'."\n";
               } else {
                   $row_output .= $self->html_row($num_uneditable,$rownum,
                                                  $exportcolor,$importcolor).
                       "</tr>\n";
               }
             $r->print($row_output);              $r->print($row_output);
  }   }
  $r->print("</table>\n");   $r->print("</table>\n");
     }      }
       $r->print("</p>\n");
     return;      return;
 }  }
   
Line 208  END Line 306  END
 ########################################################  ########################################################
 sub assess_file_selector {  sub assess_file_selector {
     my ($row,$default,$AssessFiles)=@_;      my ($row,$default,$AssessFiles)=@_;
     return '' if (!defined($AssessFiles) || ! @$AssessFiles);      if (!defined($AssessFiles) || ! @$AssessFiles) {
           return '';
       }
     return '' if (! &Apache::lonnet::allowed('mgr',$ENV{'request.course.id'}));      return '' if (! &Apache::lonnet::allowed('mgr',$ENV{'request.course.id'}));
     my $element_name = 'FileSelect_'.$row;      my $element_name = 'FileSelect_'.$row;
     my $load_dialog = '<select size="1" name="'.$element_name.'" '.      my $load_dialog = '<select size="1" name="'.$element_name.'" '.
Line 248  sub modify_cell { Line 348  sub modify_cell {
     return;      return;
 }  }
   
 sub outsheet_csv {  sub csv_rows {
     my $self = shift;      # writes the meat of the spreadsheet to an excel worksheet.  Called
     my ($r) = @_;      # by Spreadsheet::outsheet_excel;
 }  
 sub outsheet_excel {  
     my $self = shift;  
     my ($r) = @_;  
 }  
 sub outsheet_recursive_excel {  
     my $self = shift;      my $self = shift;
     my ($r) = @_;      my ($filehandle) = @_;
 }       #
       # Write a header row
 sub display {      $self->csv_output_row($filehandle,undef,
     my $self = shift;                            ('Sequence or Folder','Assessment title'));
     my ($r) = @_;      #
     $self->compute();      # Write each assessments row
     $self->outsheet_html($r);      if (scalar(@Sequences)< 1) {
           &initialize_sequence_cache();
       }
       foreach my $Sequence (@Sequences) {
    next if ($Sequence->{'num_assess'} < 1);
    foreach my $resource (@{$Sequence->{'contents'}}) {
       my $rownum = $self->get_row_number_from_key($resource->{'symb'});
               my @assessdata = ($Sequence->{'title'},
                                 $resource->{'title'});
               $self->csv_output_row($filehandle,$rownum,@assessdata);
           }
       }
     return;      return;
 }  }
   
 sub set_row_sources {  sub excel_rows {
       # writes the meat of the spreadsheet to an excel worksheet.  Called
       # by Spreadsheet::outsheet_excel;
     my $self = shift;      my $self = shift;
     while (my ($cell,$value) = each(%{$self->{'formulas'}})) {      my ($worksheet,$cols_output,$rows_output) = @_;
         next if ($cell !~ /^A(\d+)/ && $1 > 0);      #
         my $row = $1;      # Write a header row
         (undef,$value) = split('__&&&__',$value);      $cols_output = 0;
         $value = 'Default' if (! defined($value));      foreach my $value ('Container','Assessment title') {
         $self->{'row_source'}->{$row} = $value;          $worksheet->write($rows_output,$cols_output++,$value);
       }
       $rows_output++;    
       #
       # Write each assessments row
       if (scalar(@Sequences)< 1) {
           &initialize_sequence_cache();
       }
       foreach my $Sequence (@Sequences) {
    next if ($Sequence->{'num_assess'} < 1);
    foreach my $resource (@{$Sequence->{'contents'}}) {
       my $rownum = $self->get_row_number_from_key($resource->{'symb'});
               my @assessdata = ($Sequence->{'title'},
                                 $resource->{'title'});
               $self->excel_output_row($worksheet,$rownum,$rows_output++,
                                       @assessdata);
           }
     }      }
     return;      return;
 }  }
   
   sub outsheet_recursive_excel {
       my $self = shift;
       my ($r) = @_;
   } 
   
 sub compute {  sub compute {
     my $self = shift;      my $self = shift;
     $self->logthis('computing');  
     if (! defined($current_course) ||      if (! defined($current_course) ||
         $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'};
Line 325  sub compute { Line 452  sub compute {
                                                       $assess_filename,                                                        $assess_filename,
                                                       $resource->{'symb'});                                                        $resource->{'symb'});
             my @exportdata = $assessSheet->export_data();              my @exportdata = $assessSheet->export_data();
               if ($assessSheet->blackout()) {
                   $self->blackout(1);
                   $self->{'blackout_rows'}->{$rownum} = 1;
               }
             #              #
             # Be sure not to disturb the formulas in the 'A' column              # Be sure not to disturb the formulas in the 'A' column
             my $data = shift(@exportdata);              my $data = shift(@exportdata);
Line 354  sub compute { Line 485  sub compute {
     $Exportrows{$student}->{'data'} = \@exportarray;      $Exportrows{$student}->{'data'} = \@exportarray;
     # save export row      # save export row
     $self->save_export_data();      $self->save_export_data();
       #
       $self->save() if ($self->need_to_save());
       return;
   }
   
   sub set_row_sources {
       my $self = shift;
       while (my ($cell,$value) = each(%{$self->{'formulas'}})) {
           next if ($cell !~ /^A(\d+)/ && $1 > 0);
           my $row = $1;
           (undef,$value) = split('__&&&__',$value);
           $value = 'Default' if (! defined($value));
           $self->{'row_source'}->{$row} = $value;
       }
     return;      return;
 }  }
   
Line 365  sub set_row_numbers { Line 510  sub set_row_numbers {
         next if ($row == 0);          next if ($row == 0);
         my ($symb,undef) = split('__&&&__',$formula);          my ($symb,undef) = split('__&&&__',$formula);
         $self->{'row_numbers'}->{$symb} = $row;          $self->{'row_numbers'}->{$symb} = $row;
           $self->{'maxrow'} = $1 if ($1 > $self->{'maxrow'});
     }      }
 }  }
   
Line 433  Writes the export data for this student Line 579  Writes the export data for this student
 #############################################  #############################################
 sub save_export_data {  sub save_export_data {
     my $self = shift;      my $self = shift;
       return if ($self->temporary());
     my $student = $self->{'name'}.':'.$self->{'domain'};      my $student = $self->{'name'}.':'.$self->{'domain'};
     return if (! exists($Exportrows{$student}));      return if (! exists($Exportrows{$student}));
     return if (! $self->is_default());      return if (! $self->is_default());
Line 441  sub save_export_data { Line 588  sub save_export_data {
     my $newstore = join('___;___',      my $newstore = join('___;___',
                         @{$Exportrows{$student}->{'data'}});                          @{$Exportrows{$student}->{'data'}});
     $newstore = '___=___'.$newstore;      $newstore = '___=___'.$newstore;
     &Apache::lonnet::put('nohist_calculatedsheets',      my $result= &Apache::lonnet::put('nohist_calculatedsheets',
                          { $key     => $newstore,                           { $key     => $newstore,
                            $timekey => $Exportrows{$student}->{'time'} },                             $timekey => $Exportrows{$student}->{'time'} },
                          $self->{'cdom'},                           $self->{'cdom'},
Line 467  sub export_data { Line 614  sub export_data {
     my $self = shift;      my $self = shift;
     my $student = $self->{'name'}.':'.$self->{'domain'};      my $student = $self->{'name'}.':'.$self->{'domain'};
     if (! exists($Exportrows{$student}) ||      if (! exists($Exportrows{$student}) ||
           ! defined($Exportrows{$student}) ||
           ! exists($Exportrows{$student}->{'data'}) ||
           ! defined($Exportrows{$student}->{'data'}) ||
           ! exists($Exportrows{$student}->{'time'}) ||
           ! defined($Exportrows{$student}->{'time'}) ||
         ! $self->check_expiration_time($Exportrows{$student}->{'time'})) {          ! $self->check_expiration_time($Exportrows{$student}->{'time'})) {
         $self->compute();          $self->compute();
     }      }

Removed from v.1.1  
changed lines
  Added in v.1.16


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