Diff for /loncom/interface/Attic/lonspreadsheet.pm between versions 1.133 and 1.135

version 1.133, 2002/11/05 15:00:27 version 1.135, 2002/11/07 15:37:02
Line 62  use GDBM_File; Line 62  use GDBM_File;
 use HTML::TokeParser;  use HTML::TokeParser;
 use Apache::lonhtmlcommon;  use Apache::lonhtmlcommon;
 use Apache::loncoursedata;  use Apache::loncoursedata;
   use Apache::File();
   use Spreadsheet::WriteExcel;
 #  #
 # Caches for coursewide information   # Caches for coursewide information 
 #  #
Line 1107  sub exportdata { Line 1109  sub exportdata {
   
 # ========================================================== End of Spreadsheet  # ========================================================== End of Spreadsheet
 # =============================================================================  # =============================================================================
   
 #  #
 # Procedures for screen output  # Procedures for spreadsheet output
 #  #
 # --------------------------------------------- Produce output row n from sheet  # --------------------------------------------- Produce output row n from sheet
   
Line 1143  sub sort_indicies { Line 1144  sub sort_indicies {
     return @sortidx;      return @sortidx;
 }  }
   
 ########################################################################  #############################################################
 ########################################################################  ###                                                       ###
   ###              Spreadsheet Output Routines              ###
   ###                                                       ###
   #############################################################
   
   ############################################
   ##         HTML output routines           ##
   ############################################
 sub html_editable_cell {  sub html_editable_cell {
     my ($cell,$bgcolor) = @_;      my ($cell,$bgcolor) = @_;
     my $result;      my $result;
Line 1177  sub html_uneditable_cell { Line 1184  sub html_uneditable_cell {
     return ' '.$value.' ';      return ' '.$value.' ';
 }  }
   
 ########################################################################  
 ########################################################################  
   
 sub outsheet_html  {  sub outsheet_html  {
     my ($sheet,$r) = @_;      my ($sheet,$r) = @_;
     my ($num_uneditable,$realm,$row_type);      my ($num_uneditable,$realm,$row_type);
Line 1349  END Line 1353  END
     return 1;      return 1;
 }  }
   
   ############################################
   ##         csv output routines            ##
   ############################################
 sub outsheet_csv   {  sub outsheet_csv   {
     my ($sheet,$r) = @_;      my ($sheet,$r) = @_;
     my $csvdata = '';      my $csvdata = '';
Line 1370  sub outsheet_csv   { Line 1377  sub outsheet_csv   {
         @Values = ();          @Values = ();
     }      }
     #      #
     $r->print('<pre>'.$csvdata."\n</pre>");      # Write the CSV data to a file and serve up a link
       #
       my $filename = '/prtspool/'.
           $ENV{'user.name'}.'_'.$ENV{'user.domain'}.'_'.
           time.'_'.rand(1000000000).'.csv';
       my $file;
       unless ($file = Apache::File->new('>'.'/home/httpd'.$filename)) {
           $r->log_error("Couldn't open $filename for output $!");
           $r->print("Problems occured in writing the csv file.  ".
                     "This error has been logged.  ".
                     "Please alert your LON-CAPA administrator.");
           $r->print("<pre>\n".$csvdata."</pre>\n");
           return 0;
       }
       print $file $csvdata;
       close($file);
       $r->print('<br /><br />'.
                 '<a href="'.$filename.'">Your CSV spreadsheet.</a>'."\n");
       #
       return 1;
   }
   
   ############################################
   ##        Excel output routines           ##
   ############################################
   sub outsheet_recursive_excel {
       my ($sheet,$r) = @_;
       return undef if ($sheet->{'sheettype'} ne 'classcalc');
       my ($workbook,$filename) = &create_excel_spreadsheet($sheet,$r);
       return undef if (! defined($workbook));
       #
       # Create main worksheet
       my $main_worksheet = $workbook->addworksheet('main');
       #
       # Figure out who the students are
       my %f=&getformulas($sheet);
       my $count = 0;
       $r->print("<br />\n");
       $r->rflush();
       foreach (keys(%f)) {
    next if ($_!~/^A(\d+)/ || $1 == 0 || ($f{$_}=~/^[!~-]/));
           $count++;
           my ($sname,$sdom) = split(':',$f{$_});
           my $student_excel_worksheet=$workbook->addworksheet($sname.'@'.$sdom);
           # Create a new spreadsheet
           my $studentsheet = &makenewsheet($sname,$sdom,'studentcalc',undef);
           # Read in the spreadsheet definition
           &readsheet($studentsheet,'default_studentcalc');
           # Determine the structure (contained assessments, etc) of the sheet
           &updatesheet($studentsheet);
           # Load in the (possibly cached) data from the assessment sheets        
           &loadrows($studentsheet);
           # Compute the sheet
           &calcsheet($studentsheet);
           &Apache::lonnet::logthis("Sheet value for A0 = ".$sheet->{'values'}->{'A0'});
           # Stuff the sheet into excel
           &export_sheet_as_excel($studentsheet,$student_excel_worksheet);
           if ($count % 5 == 0) {
               $r->print($count.' students completed<br />');
               $r->rflush();
           }
       }
       #
       $r->print('All students spreadsheets completed<br />');
       $r->rflush();
       #
       # &export_sheet_as_excel fills $worksheet with the data from $sheet
       &export_sheet_as_excel($sheet,$main_worksheet);
     #      #
       $workbook->close();
       # Okay, the spreadsheet is taken care of, so give the user a link.
       $r->print('<br /><br />'.
                 '<a href="'.$filename.'">Your Excel spreadsheet.</a>'."\n");
     return 1;      return 1;
 }  }
   
 sub outsheet_excel {  sub outsheet_excel {
     my ($sheet,$r) = @_;      my ($sheet,$r) = @_;
       my ($workbook,$filename) = &create_excel_spreadsheet($sheet,$r);
       return undef if (! defined($workbook));
       my $sheetname;
       if ($sheet->{'sheettype'} eq 'classcalc') {
           $sheetname = 'Main';
       } elsif ($sheet->{'sheettype'} eq 'studentcalc') {
           $sheetname = $sheet->{'uname'}.'@'.$sheet->{'udom'};
       } elsif ($sheet->{'sheettype'} eq 'assesscalc') {
           $sheetname = $sheet->{'uname'}.'@'.$sheet->{'udom'}.' assessment';
       }
       my $worksheet = $workbook->addworksheet($sheetname);
       #
       # &export_sheet_as_excel fills $worksheet with the data from $sheet
       &export_sheet_as_excel($sheet,$worksheet);
       #
       $workbook->close();
       # Okay, the spreadsheet is taken care of, so give the user a link.
       $r->print('<br /><br />'.
                 '<a href="'.$filename.'">Your Excel spreadsheet.</a>'."\n");
       return 1;
   }
   
   sub create_excel_spreadsheet {
       my ($sheet,$r) = @_;
       my $filename = '/prtspool/'.
           $ENV{'user.name'}.'_'.$ENV{'user.domain'}.'_'.
           time.'_'.rand(1000000000).'.xls';
       #&Apache::lonnet::logthis("spreadsheet:filename = ".$filename);
       my $workbook  = Spreadsheet::WriteExcel->new('/home/httpd'.$filename);
       if (! defined($workbook)) {
           $r->log_error("Error creating excel spreadsheet $filename: $!");
           $r->print("Problems creating new Excel file.  ".
                     "This error has been logged.  ".
                     "Please alert your LON-CAPA administrator");
           return undef;
       }
       #
       # The spreadsheet stores temporary data in files, then put them
       # together.  If needed we should be able to disable this (memory only).
       # The temporary directory must be specified before calling 'addworksheet'.
       # File::Temp is used to determine the temporary directory.
       $workbook->set_tempdir('/home/httpd/perl/tmp');
       #
       # Determine the name to give the worksheet
       return ($workbook,$filename);
 }  }
   
   sub export_sheet_as_excel {
       my $sheet = shift;
       my $worksheet = shift;
       ####################################
       # Prepare to output rows
       ####################################
       my @Rows = &sort_indicies($sheet);
       #
       # Loop through the rows and output them one at a time
       my $rows_output=0;
       foreach my $rownum (@Rows) {
           my ($rowlabel,@rowdata) = &get_row($sheet,$rownum);
           my $cols_output = 0;
           my $label = &format_excel_rowlabel($rowlabel);
           $worksheet->write($rows_output,$cols_output++,$label);
           if (ref($label)) {
               $cols_output = (scalar(@$label));
           }
           foreach my $cell (@rowdata) {
               $worksheet->write($rows_output,$cols_output++,
                                 $cell->{'value'});
           }
           $rows_output++;
       }
       return;
   }
   
   ############################################
   ##          XML output routines           ##
   ############################################
 sub outsheet_xml   {  sub outsheet_xml   {
     my ($sheet,$r) = @_;      my ($sheet,$r) = @_;
       ## Someday XML
       ## Will be rendered for the user
       ## But not on this day
 }  }
   
   ##
   ## Outsheet - calls other outsheet_* functions
   ##
 sub outsheet {  sub outsheet {
     my ($r,$sheet)=@_;      my ($r,$sheet)=@_;
     if (exists($ENV{'form.showcsv'})) {      if (! exists($ENV{'form.output'})) {
           $ENV{'form.output'} = 'HTML';
       }
       if (lc($ENV{'form.output'}) eq 'csv') {
         &outsheet_csv($sheet,$r);          &outsheet_csv($sheet,$r);
 #    } elsif (exists($ENV{'form.excel'})) {      } elsif (lc($ENV{'form.output'}) eq 'excel') {
 #        &outsheet_excel($sheet,$r);          &outsheet_excel($sheet,$r);
 #    } elsif (exists($ENV{'form.xml'})) {      } elsif (lc($ENV{'form.output'}) eq 'recursive excel') {
           &outsheet_recursive_excel($sheet,$r);
   #    } elsif (lc($ENV{'form.output'}) eq 'xml' ) {
 #        &outsheet_xml($sheet,$r);  #        &outsheet_xml($sheet,$r);
     } else {      } else {
         &outsheet_html($sheet,$r);          &outsheet_html($sheet,$r);
Line 1533  sub makenewsheet { Line 1697  sub makenewsheet {
     $sheet->{'cnum'}  = $ENV{'course.'.$ENV{'request.course.id'}.'.num'};      $sheet->{'cnum'}  = $ENV{'course.'.$ENV{'request.course.id'}.'.num'};
     $sheet->{'cdom'}  = $ENV{'course.'.$ENV{'request.course.id'}.'.domain'};      $sheet->{'cdom'}  = $ENV{'course.'.$ENV{'request.course.id'}.'.domain'};
     $sheet->{'chome'} = $ENV{'course.'.$ENV{'request.course.id'}.'.home'};      $sheet->{'chome'} = $ENV{'course.'.$ENV{'request.course.id'}.'.home'};
       $sheet->{'coursedesc'} = $ENV{'course.'.$ENV{'request.course.id'}.
                                         'description'};
     $sheet->{'uhome'} = &Apache::lonnet::homeserver($uname,$udom);      $sheet->{'uhome'} = &Apache::lonnet::homeserver($uname,$udom);
     #      #
     #      #
Line 1776  sub format_csv_rowlabel { Line 1942  sub format_csv_rowlabel {
     return '"'.$result.'"';      return '"'.$result.'"';
 }  }
   
 sub format_plain_rowlabel {  sub format_excel_rowlabel {
     my $rowlabel = shift;      my $rowlabel = shift;
     return '' if ($rowlabel eq '');      return '' if ($rowlabel eq '');
     my ($type,$labeldata) = split(':',$rowlabel,2);      my ($type,$labeldata) = split(':',$rowlabel,2);
Line 1787  sub format_plain_rowlabel { Line 1953  sub format_plain_rowlabel {
         $result = $title;          $result = $title;
     } elsif ($type eq 'student') {      } elsif ($type eq 'student') {
         my ($sname,$sdom,$fullname,$section,$id) = split(':',$labeldata);          my ($sname,$sdom,$fullname,$section,$id) = split(':',$labeldata);
             $result = '"'.          $section = '' if (! defined($section));
                 join('","',($sname,$sdom,$fullname,$section,$id).'"');          $id      = '' if (! defined($id));
           my @Data = ($sname,$sdom,$fullname,$section,$id);
           $result = \@Data;
     } elsif ($type eq 'parameter') {      } elsif ($type eq 'parameter') {
         $labeldata =~ s/<br>/ /g;          $labeldata =~ s/<br>/ /g;
         $result = $labeldata;          $result = $labeldata;
Line 1992  sub updatestudentassesssheet { Line 2160  sub updatestudentassesssheet {
   
 # ------------------------------------------------ Load data for one assessment  # ------------------------------------------------ Load data for one assessment
   
 sub loadstudent {  sub loadstudent{
     my ($sheet)=@_;      my ($sheet)=@_;
     my %c=();      my %c=();
     my %f=&getformulas($sheet);      my %f=&getformulas($sheet);
Line 2044  sub loadstudent { Line 2212  sub loadstudent {
 #  #
 sub loadcourse {  sub loadcourse {
     my ($sheet,$r)=@_;      my ($sheet,$r)=@_;
       #
     my %c=();      my %c=();
     my %f=&getformulas($sheet);      my %f=&getformulas($sheet);
       #
     my $total=0;      my $total=0;
     foreach (keys(%f)) {      foreach (keys(%f)) {
  if ($_=~/^A(\d+)/) {   if ($_=~/^A(\d+)/) {
Line 2368  sub exportsheet { Line 2538  sub exportsheet {
     }      }
     #      #
     # Not cached      # Not cached
     #              #
     my ($newsheet)=&makenewsheet($uname,$udom,$stype,$usymb);      my ($newsheet)=&makenewsheet($uname,$udom,$stype,$usymb);
     &readsheet($newsheet,$fn);      &readsheet($newsheet,$fn);
     &updatesheet($newsheet);      &updatesheet($newsheet);
Line 2497  sub cachedssheets { Line 2667  sub cachedssheets {
 sub handler {  sub handler {
     my $r=shift;      my $r=shift;
   
       my ($sheettype) = ($r->uri=~/\/(\w+)$/);
   
     if (! exists($ENV{'form.Status'})) {      if (! exists($ENV{'form.Status'})) {
         $ENV{'form.Status'} = 'Active';          $ENV{'form.Status'} = 'Active';
     }      }
       if ( ! exists($ENV{'form.output'}) || 
                ($sheettype ne 'classcalc' && 
                 lc($ENV{'form.output'}) eq 'recursive excel')) {
           $ENV{'form.output'} = 'HTML';
       }
     # Check this server      # Check this server
     my $loaderror=&Apache::lonnet::overloaderror($r);      my $loaderror=&Apache::lonnet::overloaderror($r);
     if ($loaderror) { return $loaderror; }      if ($loaderror) { return $loaderror; }
Line 2603  ENDSCRIPT Line 2780  ENDSCRIPT
         undef %updatedata;          undef %updatedata;
     }      }
     # Read new sheet or modified worksheet      # Read new sheet or modified worksheet
     $r->uri=~/\/(\w+)$/;      my ($sheet)=&makenewsheet($aname,$adom,$sheettype,$ENV{'form.usymb'});
     my ($sheet)=&makenewsheet($aname,$adom,$1,$ENV{'form.usymb'});  
     #      #
     # If a new formula had been entered, go from work copy      # If a new formula had been entered, go from work copy
     if ($ENV{'form.unewfield'}) {      if ($ENV{'form.unewfield'}) {
Line 2753  ENDSCRIPT Line 2929  ENDSCRIPT
     $r->print('>');      $r->print('>');
     #      #
     # CSV format checkbox (classcalc sheets only)      # CSV format checkbox (classcalc sheets only)
     $r->print(' Output CSV format: <input type="checkbox" '.      $r->print(' Output as <select name="output" size="1" onClick="submit()">'.
               'name="showcsv" onClick="submit()"');                "\n");
     $r->print(' checked') if ($ENV{'form.showcsv'});      foreach my $mode (qw/HTML CSV Excel/) {
     $r->print('>');          $r->print('<option value="'.$mode.'"');
           if ($ENV{'form.output'} eq $mode) {
               $r->print(' selected ');
           } 
           $r->print('>'.$mode.'</option>'."\n");
       }
       if ($sheet->{'sheettype'} eq 'classcalc') {
           $r->print('<option value="recursive excel"');
           if ($ENV{'form.output'} eq 'recursive excel') {
               $r->print(' selected ');
           } 
           $r->print(">Multi-Sheet Excel</option>\n");
       }
       $r->print("</select>\n");
       #
     if ($sheet->{'sheettype'} eq 'classcalc') {      if ($sheet->{'sheettype'} eq 'classcalc') {
         $r->print('&nbsp;Student Status: '.          $r->print('&nbsp;Student Status: '.
                   &Apache::lonhtmlcommon::StatusOptions                    &Apache::lonhtmlcommon::StatusOptions
Line 2764  ENDSCRIPT Line 2954  ENDSCRIPT
     }      }
     #      #
     # Buttons to insert rows      # Buttons to insert rows
     $r->print(<<ENDINSERTBUTTONS);  #    $r->print(<<ENDINSERTBUTTONS);
 <br>  #<br>
 <input type='button' onClick='insertrow("top");'   #<input type='button' onClick='insertrow("top");' 
 value='Insert Row Top'>  #value='Insert Row Top'>
 <input type='button' onClick='insertrow("bottom");'   #<input type='button' onClick='insertrow("bottom");' 
 value='Insert Row Bottom'><br>  #value='Insert Row Bottom'><br>
 ENDINSERTBUTTONS  #ENDINSERTBUTTONS
     # Print out sheet      # Print out sheet
     &outsheet($r,$sheet);      &outsheet($r,$sheet);
     $r->print('</form></body></html>');      $r->print('</form></body></html>');

Removed from v.1.133  
changed lines
  Added in v.1.135


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