--- loncom/interface/spreadsheet/Spreadsheet.pm 2003/05/23 21:03:29 1.6 +++ loncom/interface/spreadsheet/Spreadsheet.pm 2003/05/29 18:31:27 1.12 @@ -1,5 +1,5 @@ # -# $Id: Spreadsheet.pm,v 1.6 2003/05/23 21:03:29 matthew Exp $ +# $Id: Spreadsheet.pm,v 1.12 2003/05/29 18:31:27 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -97,7 +97,10 @@ sub new { chome => $ENV{'course.'.$ENV{'request.course.id'}.'.home'}, coursedesc => $ENV{'course.'.$ENV{'request.course.id'}.'.description'}, coursefilename => $ENV{'request.course.fn'}, - temporary => '', + # + # Flags + temporary => 0, # true if this sheet has been modified but not saved + new_rows => 0, # true if this sheet has new rows # # blackout is used to determine if any data needs to be hidden from the # student. @@ -142,7 +145,7 @@ sub filename { if (@_) { my ($newfilename) = @_; if (! defined($newfilename) || $newfilename eq 'Default' || - $newfilename !~ /\w/ || $newfilename =~ /\W/) { + $newfilename !~ /\w/) { my %tmphash = &Apache::lonnet::get('environment', ['spreadsheet_default_'. $self->{'type'}], @@ -152,12 +155,13 @@ sub filename { if ($tmp !~ /^(con_lost|error|no_such_host)/i) { $newfilename=$tmphash{'spreadsheet_default_'.$self->{'type'}}; } - } - if (! defined($newfilename) || - $newfilename !~ /\w/ || - $newfilename =~ /^\W*$/) { - $newfilename = 'default.'.$self->{'type'}; - } else { + if (! defined($newfilename) || + $newfilename !~ /\w/ || + $newfilename =~ /^\W*$/) { + $newfilename = 'default.'.$self->{'type'}; + } + } elsif ($newfilename !~ /^\/res\/.*\.spreadsheet/ && + $newfilename !~ /^default\.$self->{'type'}$/ ) { my $regexp = '_'.$self->{'type'}.'$'; if ($newfilename !~ /$regexp/) { $newfilename .= '_'.$self->{'type'}; @@ -221,6 +225,11 @@ sub is_default { return 0; } +sub initialize { + # This method is here to remind you that it will be overridden by + # the descendents of the spreadsheet class. +} + sub initialize_spreadsheet_package { &load_spreadsheet_expirationdates(); &clear_spreadsheet_definition_cache(); @@ -815,7 +824,7 @@ sub expandnamed { push @matches,$parameter if ($parameter =~ /$expression/); } if (scalar(@matches) == 0) { - $returnvalue = 'unmatched parameter: '.$parameter; + $returnvalue = '""';#'"unmatched parameter: '.$parameter.'"'; } elsif (scalar(@matches) == 1) { # why do we not do this lookup here, instead of delaying it? $returnvalue = '$c{\''.$matches[0].'\'}'; @@ -831,7 +840,7 @@ sub expandnamed { } else { # There was a negative number of matches, which indicates # something is wrong with reality. Better warn the user. - $returnvalue = 'bizzare parameter: '.$parameter; + $returnvalue = '"bizzare parameter: '.$parameter.'"'; } return $returnvalue; } @@ -1158,8 +1167,8 @@ sub html_template_row { for (my $i = 0; $i<=$#rowdata; $i++) { my $cell = $rowdata[$i]; if ($i < $num_uneditable) { - $row_html .= ''. - &html_editable_cell($cell,'#DDCCFF',$allowed).''; + $row_html .= ''. + &html_uneditable_cell($cell,'#FFDDDD',$allowed).''; } else { $row_html .= ''. &html_editable_cell($cell,'#EOFFDD',$allowed).''; @@ -1497,7 +1506,7 @@ sub load { $sheetxml=''; } ($formulas,undef) = &parse_sheet(\$sheetxml); - } elsif($self->filename() =~ /^\/*\.spreadsheet$/) { + } elsif($self->filename() =~ /^\/res\/.*\.spreadsheet$/) { # Load a spreadsheet definition file my $sheetxml=&Apache::lonnet::getfile (&Apache::lonnet::filelocation('',$filename)); @@ -1549,6 +1558,16 @@ sub set_row_sources { return; } +sub set_row_numbers { + my $self = shift; + while (my ($cell,$value) = each(%{$self->{'formulas'}})) { + next if ($cell !~ /^A(\d+)$/); + next if (! defined($value)); + $self->{'row_numbers'}->{$value} = $1; + $self->{'maxrow'} = $1 if ($1 > $self->{'maxrow'}); + } +} + ## ## exportrow is *not* used to get the export row from a computed sub-sheet. ## @@ -1573,22 +1592,23 @@ sub save { my $cnum = $self->{'cnum'}; my $cdom = $self->{'cdom'}; my $chome = $self->{'chome'}; - my $fn = $self->{'filename'}; + my $filename = $self->{'filename'}; + my $cachekey = join('_',($cnum,$cdom,$stype,$filename)); # Cache new sheet - $spreadsheets{$cnum.'_'.$cdom.'_'.$stype.'_'.$fn}=join('___;___',%f); + %{$spreadsheets{$cachekey}}=%f; # Write sheet foreach (keys(%f)) { delete($f{$_}) if ($f{$_} eq 'import'); } - my $reply = &Apache::lonnet::put($fn,\%f,$cdom,$cnum); + my $reply = &Apache::lonnet::put($filename,\%f,$cdom,$cnum); return $reply if ($reply ne 'ok'); $reply = &Apache::lonnet::put($stype.'_spreadsheets', - {$fn => $ENV{'user.name'}.'@'.$ENV{'user.domain'}}, + {$filename => $ENV{'user.name'}.'@'.$ENV{'user.domain'}}, $cdom,$cnum); return $reply if ($reply ne 'ok'); if ($makedef) { $reply = &Apache::lonnet::put('environment', - {'spreadsheet_default_'.$stype => $fn }, + {'spreadsheet_default_'.$stype => $filename }, $cdom,$cnum); return $reply if ($reply ne 'ok'); } @@ -1604,14 +1624,14 @@ sub save { sub save_tmp { my $self = shift; - my $fn=$ENV{'user.name'}.'_'. + my $filename=$ENV{'user.name'}.'_'. $ENV{'user.domain'}.'_spreadsheet_'.$self->{'usymb'}.'_'. $self->{'filename'}; - $fn=~s/\W/\_/g; - $fn=$Apache::lonnet::tmpdir.$fn.'.tmp'; + $filename=~s/\W/\_/g; + $filename=$Apache::lonnet::tmpdir.$filename.'.tmp'; $self->temporary(1); my $fh; - if ($fh=Apache::File->new('>'.$fn)) { + if ($fh=Apache::File->new('>'.$filename)) { my %f = $self->formulas(); while( my ($cell,$formula) = each(%f)) { next if ($formula eq 'import'); @@ -1653,7 +1673,6 @@ sub temporary { if (@_) { ($self->{'temporary'})= @_; } - $self->logthis('temporary = '.$self->{'temporary'}); return $self->{'temporary'}; } @@ -1722,14 +1741,12 @@ sub get_template_row { return @cols; } -sub set_row_numbers { +sub need_to_save { my $self = shift; - my %f=$self->formulas(); - while (my ($cell,$value) = each(%{$self->{'formulas'}})) { - next if ($cell !~ /^A(\d+)$/); - next if (! defined($value)); - $self->{'row_numbers'}->{$value} = $1; + if ($self->{'new_rows'} && ! $self->temporary()) { + return 1; } + return 0; } sub get_row_number_from_key { @@ -1741,6 +1758,7 @@ sub get_row_number_from_key { # may not be the key we need to save $self->{'maxrow'}++; $self->{'row_numbers'}->{$key} = $self->{'maxrow'}; + $self->{'new_rows'} = 1; } return $self->{'row_numbers'}->{$key}; }