--- loncom/interface/spreadsheet/Spreadsheet.pm 2003/09/15 20:31:01 1.26 +++ loncom/interface/spreadsheet/Spreadsheet.pm 2004/01/15 21:20:07 1.34 @@ -1,5 +1,5 @@ # -# $Id: Spreadsheet.pm,v 1.26 2003/09/15 20:31:01 matthew Exp $ +# $Id: Spreadsheet.pm,v 1.34 2004/01/15 21:20:07 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -59,6 +59,7 @@ use HTML::Entities(); use HTML::TokeParser; use Spreadsheet::WriteExcel; use Time::HiRes; +use Apache::lonlocal; ## ## Package Variables @@ -159,7 +160,8 @@ sub filename { if ($newfilename !~ /\w/ || $newfilename =~ /^\W*$/) { $newfilename = 'default_'.$self->{'type'}; } - if ($newfilename !~ /^default\.$self->{'type'}$/ ) { + if ($newfilename !~ /^default\.$self->{'type'}$/ && + $newfilename !~ /^\/res\/(.*)spreadsheet$/) { if ($newfilename !~ /_$self->{'type'}$/) { $newfilename =~ s/[\s_]*$//; $newfilename .= '_'.$self->{'type'}; @@ -677,7 +679,7 @@ sub calc { return $lastcalc.': Maximum calculation depth exceeded'; } } - return ''; + return 'okay'; } # ------------------------------------------- End of "Inside of the safe space" @@ -749,6 +751,11 @@ sub mask { if (($la eq '*') || ($ua eq '*')) { $alpha='[A-z]'; } else { + if ($la gt $ua) { + my $tmp = $ua; + $ua = $la; + $la = $ua; + } $alpha=qq/[$la-$ua]/; } if ($ld ne '*' && $ud ne '*') { @@ -1133,9 +1140,49 @@ sub calcsheet { # $self->logthis($self->get_errorlog()); %{$self->{'values'}} = %{$self->{'safe'}->varglob('sheet_values')}; # $self->logthis($self->get_errorlog()); + if ($result ne 'okay') { + $self->set_calcerror($result); + } return $result; } +sub set_badcalc { + my $self = shift(); + $self->{'badcalc'} =1; + return; +} + +sub badcalc { + my $self = shift; + if (exists($self->{'badcalc'}) && $self->{'badcalc'}) { + return 1; + } else { + return 0; + } +} + +sub set_calcerror { + my $self = shift; + if (@_) { + $self->set_badcalc(); + if (exists($self->{'calcerror'})) { + $self->{'calcerror'}.="\n".$_[0]; + } else { + $self->{'calcerror'}.=$_[0]; + } + } +} + +sub calcerror { + my $self = shift; + if ($self->badcalc()) { + if (exists($self->{'calcerror'})) { + return $self->{'calcerror'}; + } + } + return; +} + ########################################################### ## ## Output Helpers @@ -1144,17 +1191,28 @@ sub calcsheet { sub display { my $self = shift; my ($r) = @_; - $self->compute($r); my $outputmode = 'html'; - if ($ENV{'form.output_format'} =~ /^(html|excel|csv)$/) { - $outputmode = $ENV{'form.output_format'}; + foreach ($self->output_options()) { + if ($ENV{'form.output_format'} eq $_->{'value'}) { + $outputmode = $_->{'value'}; + last; + } } if ($outputmode eq 'html') { + $self->compute($r); $self->outsheet_html($r); + } elsif ($outputmode eq 'htmlclasslist') { + # No computation neccessary... This is kludgy + $self->outsheet_htmlclasslist($r); } elsif ($outputmode eq 'excel') { + $self->compute($r); $self->outsheet_excel($r); } elsif ($outputmode eq 'csv') { + $self->compute($r); $self->outsheet_csv($r); + } elsif ($outputmode eq 'xml') { +# $self->compute($r); + $self->outsheet_xml($r); } $self->cleanup(); return; @@ -1163,6 +1221,18 @@ sub display { ############################################ ## HTML output routines ## ############################################ +sub html_report_error { + my $self = shift(); + my $Str = ''; + if ($self->badcalc()) { + $Str = '

'. + &mt('An error occurred while calculating this spreadsheet'). + "

\n". + '
'.$self->calcerror()."
\n"; + } + return $Str; +} + sub html_export_row { my $self = shift(); my ($color) = @_; @@ -1277,12 +1347,27 @@ sub html_header { my $self = shift; return '' if (! $ENV{'request.role.adv'}); return "\n". - ''."\n". - '\n". + ''."\n". + '\n". "
Output Format
'.&output_selector()."
'.&mt('Output Format').'
'.$self->output_selector()."
\n"; } +## +## Default output types are HTML, Excel, and CSV +sub output_options { + my $self = shift(); + return ({value => 'html', + description => 'HTML'}, + {value => 'excel', + description => 'Excel'}, +# {value => 'xml', +# description => 'XML'}, + {value => 'csv', + description => 'Comma Separated Values'},); +} + sub output_selector { + my $self = shift(); my $output_selector = '\n"; return $output_selector; @@ -1331,9 +1413,9 @@ sub create_excel_spreadsheet { 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. ". + $r->print(&mt("Problems creating new Excel file. ". "This error has been logged. ". - "Please alert your LON-CAPA administrator"); + "Please alert your LON-CAPA administrator")); return undef; } # @@ -1347,11 +1429,25 @@ sub create_excel_spreadsheet { return ($workbook,$filename); } +# +# This routine is just a stub +sub outsheet_htmlclasslist { + my $self = shift; + my ($r) = @_; + $r->print('

'.&mt("This output is not supported").'

'); + $r->rflush(); + return; +} + sub outsheet_excel { my $self = shift; my ($r) = @_; my $connection = $r->connection(); - $r->print("

Preparing Excel Spreadsheet

"); + # + $r->print($self->html_report_error()); + $r->rflush(); + # + $r->print("

".&mt('Preparing Excel Spreadsheet')."

"); # # Create excel worksheet my ($workbook,$filename) = $self->create_excel_spreadsheet($r); @@ -1393,6 +1489,10 @@ sub outsheet_csv { my $self = shift; my ($r) = @_; my $connection = $r->connection(); + # + $r->print($self->html_report_error()); + $r->rflush(); + # my $csvdata = ''; my @Values; # @@ -1403,9 +1503,9 @@ sub outsheet_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. ". + $r->print(&mt("Problems occured in writing the csv file. ". "This error has been logged. ". - "Please alert your LON-CAPA administrator."); + "Please alert your LON-CAPA administrator.")); $r->print("
\n".$csvdata."
\n"); return 0; } @@ -1421,7 +1521,7 @@ sub outsheet_csv { # Close the csv file close($file); $r->print('

'. - 'Your CSV spreadsheet.'."\n"); + ''.&mt('Your CSV spreadsheet.').''."\n"); # return 1; } @@ -1457,17 +1557,20 @@ sub outsheet_xml { ## But not on this day my $Str = ''."\n"; while (my ($cell,$formula) = each(%{$self->{'formulas'}})) { - if ($cell =~ /^template_(\d+)/) { + if ($cell =~ /^template_(\w+)/) { my $col = $1; $Str .= ''."\n"; } else { - my ($row,$col) = ($cell =~ /^([A-z])(\d+)/); + my ($col,$row) = ($cell =~ /^([A-z])(\d+)/); next if (! defined($row) || ! defined($col)); - $Str .= ''.$formula.'' + next if ($row != 0); + $Str .= + ''.$formula.'' ."\n"; } } $Str.=""; + $r->print("
\n\n\n".$Str."\n\n\n
"); return $Str; } @@ -1494,8 +1597,7 @@ sub parse_sheet { $formulas{$cell} = $formula; $sources{$cell} = $source if (defined($source)); $parser->get_text('/field'); - } - if ($token->[1] eq 'template') { + } elsif ($token->[1] eq 'template') { $formulas{'template_'.$token->[2]->{'col'}}= $parser->get_text('/template'); } @@ -1549,7 +1651,7 @@ sub load { # Not cached, need to read if (! defined($filename)) { $formulas = $self->load_system_default_sheet(); - } elsif($self->filename() =~ /^\/res\/.*\.spreadsheet$/) { + } elsif($filename =~ /^\/res\/.*\.spreadsheet$/) { # Load a spreadsheet definition file my $sheetxml=&Apache::lonnet::getfile (&Apache::lonnet::filelocation('',$filename)); @@ -1612,6 +1714,9 @@ sub set_row_numbers { ## sub exportrow { my $self = shift; + if (exists($self->{'badcalc'}) && $self->{'badcalc'}) { + return (); + } my @exportarray; foreach my $column (@UC_Columns) { push(@exportarray,$self->value($column.'0')); @@ -1747,9 +1852,9 @@ sub othersheets { $self->{'cdom'}, $self->{'cnum'}); my ($tmp) = keys(%results); if ($tmp =~ /^(con_lost|error|no_such_host)/i ) { - @alternatives = ('Default'); + @alternatives = (&mt('Default')); } else { - @alternatives = ('Default', sort (keys(%results))); + @alternatives = (&mt('Default'), sort (keys(%results))); } return @alternatives; }