version 1.11, 2003/05/29 13:39:38
|
version 1.20, 2003/08/01 13:47:26
|
Line 97 sub new {
|
Line 97 sub new {
|
chome => $ENV{'course.'.$ENV{'request.course.id'}.'.home'}, |
chome => $ENV{'course.'.$ENV{'request.course.id'}.'.home'}, |
coursedesc => $ENV{'course.'.$ENV{'request.course.id'}.'.description'}, |
coursedesc => $ENV{'course.'.$ENV{'request.course.id'}.'.description'}, |
coursefilename => $ENV{'request.course.fn'}, |
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 |
# blackout is used to determine if any data needs to be hidden from the |
# student. |
# student. |
Line 142 sub filename {
|
Line 145 sub filename {
|
if (@_) { |
if (@_) { |
my ($newfilename) = @_; |
my ($newfilename) = @_; |
if (! defined($newfilename) || $newfilename eq 'Default' || |
if (! defined($newfilename) || $newfilename eq 'Default' || |
$newfilename !~ /\w/) { |
$newfilename !~ /\w/ || $newfilename eq '') { |
my %tmphash = &Apache::lonnet::get('environment', |
my $key = 'course.'.$self->{'cid'}.'.spreadsheet_default_'. |
['spreadsheet_default_'. |
$self->{'type'}; |
$self->{'type'}], |
if (exists($ENV{$key}) && $ENV{$key} ne '') { |
$self->{'cdom'}, |
$newfilename = $ENV{$key}; |
$self->{'cnum'}); |
} else { |
my ($tmp) = keys(%tmphash); |
$newfilename = 'default_'.$self->{'type'}; |
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'}; |
|
} |
} |
} elsif ($newfilename !~ /^\/res\/.*\.spreadsheet/ && |
} |
$newfilename !~ /^default\.$self->{'type'}$/ ) { |
if ($newfilename !~ /\w/ || $newfilename =~ /^\W*$/) { |
my $regexp = '_'.$self->{'type'}.'$'; |
$newfilename = 'default_'.$self->{'type'}; |
if ($newfilename !~ /$regexp/) { |
} |
|
if ($newfilename !~ /^default\.$self->{'type'}$/ ) { |
|
if ($newfilename !~ /_$self->{'type'}$/) { |
|
$newfilename =~ s/[\s_]*$//; |
$newfilename .= '_'.$self->{'type'}; |
$newfilename .= '_'.$self->{'type'}; |
} |
} |
} |
} |
Line 185 default spreadsheets.......!
|
Line 184 default spreadsheets.......!
|
sub make_default { |
sub make_default { |
my $self = shift(); |
my $self = shift(); |
my $result = &Apache::lonnet::put('environment', |
my $result = &Apache::lonnet::put('environment', |
{'spreadsheet_default_'.$self->{'type'} => $self->filename()}, |
{'spreadsheet_default_'.$self->{'type'} => $self->filename()}, |
$self->{'cdom'},$self->{'cnum'}); |
$self->{'cdom'},$self->{'cnum'}); |
return $result if ($result ne 'ok'); |
return $result if ($result ne 'ok'); |
my $symb = $self->{'symb'}; |
my $symb = $self->{'symb'}; |
Line 218 sub is_default {
|
Line 217 sub is_default {
|
if ($tmp !~ /^(con_lost|error|no_such_host)/i) { |
if ($tmp !~ /^(con_lost|error|no_such_host)/i) { |
$default_filename = $tmphash{'spreadsheet_default_'.$self->{'type'}}; |
$default_filename = $tmphash{'spreadsheet_default_'.$self->{'type'}}; |
} |
} |
|
if ($default_filename =~ /^\s*$/) { |
|
$default_filename = 'default_'.$self->{'type'}; |
|
} |
return 1 if ($self->filename() eq $default_filename); |
return 1 if ($self->filename() eq $default_filename); |
return 0; |
return 0; |
} |
} |
Line 246 sub load_spreadsheet_expirationdates {
|
Line 248 sub load_spreadsheet_expirationdates {
|
sub check_expiration_time { |
sub check_expiration_time { |
my $self = shift; |
my $self = shift; |
my ($time)=@_; |
my ($time)=@_; |
my ($key1,$key2,$key3,$key4); |
my ($key1,$key2,$key3,$key4,$key5); |
|
# Description of keys |
|
# |
|
# key1: all sheets of this type have expired |
|
# key2: all sheets of this type for this student |
|
# key3: all sheets of this type in this map for this student |
|
# key4: this assessment sheet for this student |
|
# key5: this assessment sheet for all students |
$key1 = '::'.$self->{'type'}.':'; |
$key1 = '::'.$self->{'type'}.':'; |
$key2 = $self->{'name'}.':'.$self->{'domain'}.':'.$self->{'type'}.':'; |
$key2 = $self->{'name'}.':'.$self->{'domain'}.':'.$self->{'type'}.':'; |
$key3 = $key2.$self->{'container'} if (defined($self->{'container'})); |
$key3 = $key2.$self->{'container'} if (defined($self->{'container'})); |
$key4 = $key2.$self->{'usymb'} if (defined($self->{'usymb'})); |
$key4 = $key2.$self->{'symb'} if (defined($self->{'symb'})); |
foreach my $key ($key1,$key2,$key3,$key4) { |
$key5 = $key1.$self->{'symb'} if (defined($self->{'symb'})); |
|
my $returnvalue = 1; # default to okay |
|
foreach my $key ($key1,$key2,$key3,$key4,$key5) { |
next if (! defined($key)); |
next if (! defined($key)); |
if (exists($expiredates{$key}) &&$expiredates{$key} > $time) { |
if (exists($expiredates{$key}) && $expiredates{$key} > $time) { |
return 0; |
$returnvalue = 0; # need to recompute |
} |
} |
} |
} |
return 1; |
return $returnvalue; |
} |
} |
|
|
###################################################### |
###################################################### |
Line 783 sub expandnamed {
|
Line 794 sub expandnamed {
|
my @vars=split(/\W+/,$formula); |
my @vars=split(/\W+/,$formula); |
my %values=(); |
my %values=(); |
foreach my $varname ( @vars ) { |
foreach my $varname ( @vars ) { |
if ($varname=~/\D/) { |
if ($varname=~/^(parameter|stores|timestamp)/) { |
$formula=~s/$varname/'$c{\''.$varname.'\'}'/ge; |
$formula=~s/$varname/'$c{\''.$varname.'\'}'/ge; |
$varname=~s/$var/\([\\w:\\- ]\+\)/g; |
$varname=~s/$var/\([\\w:\\- ]\+\)/g; |
foreach (keys(%{$self->{'constants'}})) { |
foreach (keys(%{$self->{'constants'}})) { |
if ($_=~/$varname/) { |
if ($_=~/$varname/) { |
Line 814 sub expandnamed {
|
Line 825 sub expandnamed {
|
# 4. If there is a collision, return 'bad parameter name error' |
# 4. If there is a collision, return 'bad parameter name error' |
my $returnvalue = ''; |
my $returnvalue = ''; |
my @matches = (); |
my @matches = (); |
|
my @values = (); |
$#matches = -1; |
$#matches = -1; |
study $expression; |
study $expression; |
my $parameter; |
while (my($parameter,$value) = each(%{$self->{'constants'}})) { |
foreach $parameter (keys(%{$self->{'constants'}})) { |
next if ($parameter !~ /$expression/); |
push @matches,$parameter if ($parameter =~ /$expression/); |
push(@matches,$parameter); |
|
push(@values,$value); |
} |
} |
if (scalar(@matches) == 0) { |
if (scalar(@matches) == 0) { |
$returnvalue = '""';#'"unmatched parameter: '.$parameter.'"'; |
$returnvalue = '""';#'"unmatched parameter: '.$parameter.'"'; |
} elsif (scalar(@matches) == 1) { |
} elsif (scalar(@matches) == 1) { |
# why do we not do this lookup here, instead of delaying it? |
# why do we not do this lookup here, instead of delaying it? |
$returnvalue = '$c{\''.$matches[0].'\'}'; |
$returnvalue = $values[0]; |
} elsif (scalar(@matches) > 0) { |
} elsif (scalar(@matches) > 0) { |
# more than one match. Look for a concise one |
# more than one match. Look for a concise one |
$returnvalue = "'non-unique parameter name : $expression'"; |
$returnvalue = "'non-unique parameter name : $expression'"; |
foreach (@matches) { |
for (my $i=0; $i<=$#matches;$i++) { |
if (/^$expression$/) { |
if ($matches[$i] =~ /^$expression$/) { |
# why do we not do this lookup here? |
# why do we not do this lookup here? |
$returnvalue = '$c{\''.$_.'\'}'; |
$returnvalue = $values[$i]; |
} |
} |
} |
} |
} else { |
} else { |
# There was a negative number of matches, which indicates |
# There was a negative number of matches, which indicates |
# something is wrong with reality. Better warn the user. |
# something is wrong with reality. Better warn the user. |
$returnvalue = '"bizzare parameter: '.$parameter.'"'; |
$returnvalue = '"bizzare parameter: '.$expression.'"'; |
} |
} |
return $returnvalue; |
return $returnvalue; |
} |
} |
Line 1139 sub display {
|
Line 1152 sub display {
|
############################################ |
############################################ |
sub html_export_row { |
sub html_export_row { |
my $self = shift(); |
my $self = shift(); |
|
my ($color) = @_; |
|
$color = '#CCCCFF' if (! defined($color)); |
my $allowed = &Apache::lonnet::allowed('mgr',$ENV{'request.course.id'}); |
my $allowed = &Apache::lonnet::allowed('mgr',$ENV{'request.course.id'}); |
my $row_html; |
my $row_html; |
my @rowdata = $self->get_row(0); |
my @rowdata = $self->get_row(0); |
foreach my $cell (@rowdata) { |
foreach my $cell (@rowdata) { |
if ($cell->{'name'} =~ /^[A-Z]/) { |
if ($cell->{'name'} =~ /^[A-Z]/) { |
$row_html .= '<td bgcolor="#CCCCFF">'. |
$row_html .= '<td bgcolor="'.$color.'">'. |
&html_editable_cell($cell,'#CCCCFF',$allowed).'</td>'; |
&html_editable_cell($cell,$color,$allowed).'</td>'; |
} else { |
} else { |
$row_html .= '<td bgcolor="#DDCCFF">'. |
$row_html .= '<td bgcolor="#DDCCFF">'. |
&html_editable_cell($cell,'#DDCCFF',$allowed).'</td>'; |
&html_editable_cell($cell,'#DDCCFF',$allowed).'</td>'; |
Line 1157 sub html_export_row {
|
Line 1172 sub html_export_row {
|
sub html_template_row { |
sub html_template_row { |
my $self = shift(); |
my $self = shift(); |
my $allowed = &Apache::lonnet::allowed('mgr',$ENV{'request.course.id'}); |
my $allowed = &Apache::lonnet::allowed('mgr',$ENV{'request.course.id'}); |
my ($num_uneditable) = @_; |
my ($num_uneditable,$importcolor) = @_; |
my $row_html; |
my $row_html; |
my @rowdata = $self->get_template_row(); |
my @rowdata = $self->get_template_row(); |
my $count = 0; |
my $count = 0; |
for (my $i = 0; $i<=$#rowdata; $i++) { |
for (my $i = 0; $i<=$#rowdata; $i++) { |
my $cell = $rowdata[$i]; |
my $cell = $rowdata[$i]; |
if ($i < $num_uneditable) { |
if ($i < $num_uneditable) { |
$row_html .= '<td bgcolor="#FFDDDD">'. |
$row_html .= '<td bgcolor="'.$importcolor.'">'. |
&html_uneditable_cell($cell,'#FFDDDD',$allowed).'</td>'; |
&html_uneditable_cell($cell,'#FFDDDD',$allowed).'</td>'; |
} else { |
} else { |
$row_html .= '<td bgcolor="#EOFFDD">'. |
$row_html .= '<td bgcolor="#EOFFDD">'. |
Line 1196 sub html_editable_cell {
|
Line 1211 sub html_editable_cell {
|
$value = &HTML::Entities::encode($value) if ($value !~/ /); |
$value = &HTML::Entities::encode($value) if ($value !~/ /); |
} |
} |
return $value if (! $allowed); |
return $value if (! $allowed); |
# Make the formula safe for outputting |
# |
$formula =~ s/\'/\"/g; |
|
# The formula will be parsed by the browser twice before being |
# The formula will be parsed by the browser twice before being |
# displayed to the user for editing. |
# displayed to the user for editing. |
$formula = &HTML::Entities::encode(&HTML::Entities::encode($formula)); |
# |
# Escape newlines so they make it into the edit window |
# The encoding string "^A-blah" is placed in []'s inside a regexp, so |
$formula =~ s/\n/\\n/gs; |
# we specify the characters we want left alone by putting a '^' in front. |
|
$formula = &HTML::Entities::encode($formula,"^A-z0-9 !#\$%-;=?~"); |
|
# Escape it again - this time the only encodable character is '&' |
|
$formula =~ s/\&/\&/g; |
# Glue everything together |
# Glue everything together |
$result .= "<a href=\"javascript:celledit(\'". |
$result .= "<a href=\"javascript:celledit(\'". |
$name."','".$formula."');\">".$value."</a>"; |
$name."','".$formula."');\">".$value."</a>"; |
Line 1218 sub html_uneditable_cell {
|
Line 1235 sub html_uneditable_cell {
|
|
|
sub html_row { |
sub html_row { |
my $self = shift(); |
my $self = shift(); |
my ($num_uneditable,$row) = @_; |
my ($num_uneditable,$row,$exportcolor,$importcolor) = @_; |
my $allowed = &Apache::lonnet::allowed('mgr',$ENV{'request.course.id'}); |
my $allowed = &Apache::lonnet::allowed('mgr',$ENV{'request.course.id'}); |
my @rowdata = $self->get_row($row); |
my @rowdata = $self->get_row($row); |
my $num_cols_output = 0; |
my $num_cols_output = 0; |
my $row_html; |
my $row_html; |
|
my $color = $importcolor; |
|
if ($row == 0) { |
|
$color = $exportcolor; |
|
} |
|
$color = '#FFDDDD' if (! defined($color)); |
foreach my $cell (@rowdata) { |
foreach my $cell (@rowdata) { |
if ($num_cols_output++ < $num_uneditable) { |
if ($num_cols_output++ < $num_uneditable) { |
$row_html .= '<td bgcolor="#FFDDDD">'; |
$row_html .= '<td bgcolor="'.$color.'">'; |
$row_html .= &html_uneditable_cell($cell,'#FFDDDD'); |
$row_html .= &html_uneditable_cell($cell,'#FFDDDD'); |
} else { |
} else { |
$row_html .= '<td bgcolor="#EOFFDD">'; |
$row_html .= '<td bgcolor="#EOFFDD">'; |
Line 1473 sub clear_spreadsheet_definition_cache {
|
Line 1495 sub clear_spreadsheet_definition_cache {
|
undef(%spreadsheets); |
undef(%spreadsheets); |
} |
} |
|
|
sub load { |
sub load_system_default_sheet { |
my $self = shift; |
my $self = shift; |
my $includedir = $Apache::lonnet::perlvar{'lonIncludes'}; |
my $includedir = $Apache::lonnet::perlvar{'lonIncludes'}; |
|
# load in the default defined spreadsheet |
|
my $sheetxml=''; |
|
my $fh; |
|
if ($fh=Apache::File->new($includedir.'/default_'.$self->{'type'})) { |
|
$sheetxml=join('',<$fh>); |
|
$fh->close(); |
|
} else { |
|
# $sheetxml='<field row="0" col="A">"Error"</field>'; |
|
$sheetxml='<field row="0" col="A"></field>'; |
|
} |
|
$self->filename('default_'); |
|
my ($formulas,undef) = &parse_sheet(\$sheetxml); |
|
return $formulas; |
|
} |
|
|
|
sub load { |
|
my $self = shift; |
# |
# |
my $stype = $self->{'type'}; |
my $stype = $self->{'type'}; |
my $cnum = $self->{'cnum'}; |
my $cnum = $self->{'cnum'}; |
my $cdom = $self->{'cdom'}; |
my $cdom = $self->{'cdom'}; |
my $chome = $self->{'chome'}; |
my $chome = $self->{'chome'}; |
my $filename = $self->{'filename'}; |
|
# |
# |
|
my $filename = $self->filename(); |
my $cachekey = join('_',($cnum,$cdom,$stype,$filename)); |
my $cachekey = join('_',($cnum,$cdom,$stype,$filename)); |
# |
# |
# see if sheet is cached |
# see if sheet is cached |
Line 1491 sub load {
|
Line 1530 sub load {
|
$formulas = $spreadsheets{$cachekey}->{'formulas'}; |
$formulas = $spreadsheets{$cachekey}->{'formulas'}; |
} else { |
} else { |
# Not cached, need to read |
# Not cached, need to read |
if (! defined($self->filename())) { |
if (! defined($filename)) { |
# load in the default defined spreadsheet |
$formulas = $self->load_system_default_sheet(); |
my $sheetxml=''; |
|
my $fh; |
|
if ($fh=Apache::File->new($includedir.'/default.'.$filename)) { |
|
$sheetxml=join('',<$fh>); |
|
$fh->close(); |
|
} else { |
|
# $sheetxml='<field row="0" col="A">"Error"</field>'; |
|
$sheetxml='<field row="0" col="A"></field>'; |
|
} |
|
($formulas,undef) = &parse_sheet(\$sheetxml); |
|
} elsif($self->filename() =~ /^\/res\/.*\.spreadsheet$/) { |
} elsif($self->filename() =~ /^\/res\/.*\.spreadsheet$/) { |
# Load a spreadsheet definition file |
# Load a spreadsheet definition file |
my $sheetxml=&Apache::lonnet::getfile |
my $sheetxml=&Apache::lonnet::getfile |
Line 1512 sub load {
|
Line 1541 sub load {
|
.$self->filename().'"</field>'; |
.$self->filename().'"</field>'; |
} |
} |
($formulas,undef) = &parse_sheet(\$sheetxml); |
($formulas,undef) = &parse_sheet(\$sheetxml); |
|
# Get just the filename and set the sheets filename |
|
my ($newfilename) = ($filename =~ /\/([^\/]*)\.spreadsheet$/); |
|
if ($self->is_default()) { |
|
$self->filename($newfilename); |
|
$self->make_default(); |
|
} else { |
|
$self->filename($newfilename); |
|
} |
} else { |
} else { |
# Load the spreadsheet definition file from the save file |
# Load the spreadsheet definition file from the save file |
my %tmphash = &Apache::lonnet::dump($self->filename(),$cdom,$cnum); |
my %tmphash = &Apache::lonnet::dump($filename,$cdom,$cnum); |
my ($tmp) = keys(%tmphash); |
my ($tmp) = keys(%tmphash); |
if ($tmp !~ /^(con_lost|error|no_such_host)/i) { |
if ($tmp !~ /^(con_lost|error|no_such_host)/i) { |
while (my ($cell,$formula) = each(%tmphash)) { |
while (my ($cell,$formula) = each(%tmphash)) { |
$formulas->{$cell}=$formula; |
$formulas->{$cell}=$formula; |
} |
} |
} else { |
} else { |
# Unable to grab the specified spreadsheet, |
$formulas = $self->load_system_default_sheet(); |
# so we get the default ones instead. |
|
$filename = 'default.'.$stype; |
|
$self->filename($filename); |
|
my $sheetxml; |
|
if (my $fh=Apache::File->new($includedir.'/'.$filename)) { |
|
$sheetxml = join('',<$fh>); |
|
$fh->close(); |
|
} else { |
|
$sheetxml='<field row="0" col="A">'. |
|
'"Unable to load spreadsheet"</field>'; |
|
} |
|
($formulas,undef) = &parse_sheet(\$sheetxml); |
|
$self->formulas($formulas); |
|
} |
} |
} |
} |
|
$filename=$self->filename(); # filename may have changed |
$cachekey = join('_',($cnum,$cdom,$stype,$filename)); |
$cachekey = join('_',($cnum,$cdom,$stype,$filename)); |
%{$spreadsheets{$cachekey}->{'formulas'}} = %{$formulas}; |
%{$spreadsheets{$cachekey}->{'formulas'}} = %{$formulas}; |
} |
} |
Line 1555 sub set_row_sources {
|
Line 1580 sub set_row_sources {
|
return; |
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. |
## exportrow is *not* used to get the export row from a computed sub-sheet. |
## |
## |
Line 1579 sub save {
|
Line 1614 sub save {
|
my $cnum = $self->{'cnum'}; |
my $cnum = $self->{'cnum'}; |
my $cdom = $self->{'cdom'}; |
my $cdom = $self->{'cdom'}; |
my $chome = $self->{'chome'}; |
my $chome = $self->{'chome'}; |
my $fn = $self->{'filename'}; |
my $filename = $self->{'filename'}; |
|
my $cachekey = join('_',($cnum,$cdom,$stype,$filename)); |
# Cache new sheet |
# Cache new sheet |
$spreadsheets{$cnum.'_'.$cdom.'_'.$stype.'_'.$fn}=join('___;___',%f); |
%{$spreadsheets{$cachekey}->{'formulas'}}=%f; |
# Write sheet |
# Write sheet |
foreach (keys(%f)) { |
foreach (keys(%f)) { |
delete($f{$_}) if ($f{$_} eq 'import'); |
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'); |
return $reply if ($reply ne 'ok'); |
$reply = &Apache::lonnet::put($stype.'_spreadsheets', |
$reply = &Apache::lonnet::put($stype.'_spreadsheets', |
{$fn => $ENV{'user.name'}.'@'.$ENV{'user.domain'}}, |
{$filename => $ENV{'user.name'}.'@'.$ENV{'user.domain'}}, |
$cdom,$cnum); |
$cdom,$cnum); |
return $reply if ($reply ne 'ok'); |
return $reply if ($reply ne 'ok'); |
if ($makedef) { |
if ($makedef) { |
$reply = &Apache::lonnet::put('environment', |
$reply = &Apache::lonnet::put('environment', |
{'spreadsheet_default_'.$stype => $fn }, |
{'spreadsheet_default_'.$stype => $filename }, |
$cdom,$cnum); |
$cdom,$cnum); |
return $reply if ($reply ne 'ok'); |
return $reply if ($reply ne 'ok'); |
} |
} |
if ($self->is_default()) { |
if ($self->is_default()) { |
&Apache::lonnet::expirespread('','',$self->{'type'},''); |
&Apache::lonnet::expirespread('','',$self->{'type'},''); |
|
if ($self->{'type'} eq 'assesscalc') { |
|
&Apache::lonnet::expirespread('','','studentcalc',''); |
|
} |
} |
} |
return $reply; |
return $reply; |
} |
} |
Line 1611 sub save {
|
Line 1650 sub save {
|
sub save_tmp { |
sub save_tmp { |
my $self = shift; |
my $self = shift; |
my $filename=$ENV{'user.name'}.'_'. |
my $filename=$ENV{'user.name'}.'_'. |
$ENV{'user.domain'}.'_spreadsheet_'.$self->{'usymb'}.'_'. |
$ENV{'user.domain'}.'_spreadsheet_'.$self->{'symb'}.'_'. |
$self->{'filename'}; |
$self->{'filename'}; |
$filename=~s/\W/\_/g; |
$filename=~s/\W/\_/g; |
$filename=$Apache::lonnet::tmpdir.$filename.'.tmp'; |
$filename=$Apache::lonnet::tmpdir.$filename.'.tmp'; |
Line 1631 sub save_tmp {
|
Line 1670 sub save_tmp {
|
sub load_tmp { |
sub load_tmp { |
my $self = shift; |
my $self = shift; |
my $filename=$ENV{'user.name'}.'_'. |
my $filename=$ENV{'user.name'}.'_'. |
$ENV{'user.domain'}.'_spreadsheet_'.$self->{'usymb'}.'_'. |
$ENV{'user.domain'}.'_spreadsheet_'.$self->{'symb'}.'_'. |
$self->{'filename'}; |
$self->{'filename'}; |
$filename=~s/\W/\_/g; |
$filename=~s/\W/\_/g; |
$filename=$Apache::lonnet::tmpdir.$filename.'.tmp'; |
$filename=$Apache::lonnet::tmpdir.$filename.'.tmp'; |
Line 1691 sub othersheets {
|
Line 1730 sub othersheets {
|
if ($tmp =~ /^(con_lost|error|no_such_host)/i ) { |
if ($tmp =~ /^(con_lost|error|no_such_host)/i ) { |
@alternatives = ('Default'); |
@alternatives = ('Default'); |
} else { |
} else { |
@alternatives = sort (keys(%results)); |
@alternatives = ('Default', sort (keys(%results))); |
} |
} |
return @alternatives; |
return @alternatives; |
} |
} |
Line 1727 sub get_template_row {
|
Line 1766 sub get_template_row {
|
return @cols; |
return @cols; |
} |
} |
|
|
sub set_row_numbers { |
sub need_to_save { |
my $self = shift; |
my $self = shift; |
my %f=$self->formulas(); |
if ($self->{'new_rows'} && ! $self->temporary()) { |
while (my ($cell,$value) = each(%{$self->{'formulas'}})) { |
return 1; |
next if ($cell !~ /^A(\d+)$/); |
|
next if (! defined($value)); |
|
$self->{'row_numbers'}->{$value} = $1; |
|
} |
} |
|
return 0; |
} |
} |
|
|
sub get_row_number_from_key { |
sub get_row_number_from_key { |
Line 1746 sub get_row_number_from_key {
|
Line 1783 sub get_row_number_from_key {
|
# may not be the key we need to save |
# may not be the key we need to save |
$self->{'maxrow'}++; |
$self->{'maxrow'}++; |
$self->{'row_numbers'}->{$key} = $self->{'maxrow'}; |
$self->{'row_numbers'}->{$key} = $self->{'maxrow'}; |
|
# $self->logthis('added row '.$self->{'row_numbers'}->{$key}. |
|
# ' for '.$key); |
|
$self->{'new_rows'} = 1; |
} |
} |
return $self->{'row_numbers'}->{$key}; |
return $self->{'row_numbers'}->{$key}; |
} |
} |