version 1.15, 2003/06/18 19:09:23
|
version 1.21.2.1, 2003/12/05 22:24:20
|
Line 248 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 650 sub calc {
|
Line 659 sub calc {
|
return $lastcalc.': Maximum calculation depth exceeded'; |
return $lastcalc.': Maximum calculation depth exceeded'; |
} |
} |
} |
} |
return ''; |
return 'okay'; |
} |
} |
|
|
# ------------------------------------------- End of "Inside of the safe space" |
# ------------------------------------------- End of "Inside of the safe space" |
Line 785 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 1112 sub calcsheet {
|
Line 1121 sub calcsheet {
|
# $self->logthis($self->get_errorlog()); |
# $self->logthis($self->get_errorlog()); |
%{$self->{'values'}} = %{$self->{'safe'}->varglob('sheet_values')}; |
%{$self->{'values'}} = %{$self->{'safe'}->varglob('sheet_values')}; |
# $self->logthis($self->get_errorlog()); |
# $self->logthis($self->get_errorlog()); |
|
if ($result ne 'okay') { |
|
$self->set_calcerror($result); |
|
} |
return $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 |
## Output Helpers |
Line 1141 sub display {
|
Line 1192 sub display {
|
############################################ |
############################################ |
## HTML output routines ## |
## HTML output routines ## |
############################################ |
############################################ |
|
sub html_report_error { |
|
my $self = shift(); |
|
my $Str = ''; |
|
if ($self->badcalc()) { |
|
$Str = '<h3 style="color:red">'. |
|
'An error occurred while calculating this spreadsheet'. |
|
"</h3>\n". |
|
'<pre>'.$self->calcerror()."</pre>\n"; |
|
} |
|
return $Str; |
|
} |
|
|
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 1161 sub html_export_row {
|
Line 1226 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 1200 sub html_editable_cell {
|
Line 1265 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 !#$%-;=?~'); |
|
# HTML::Entities::encode does not catch everything - we need '\' encoded |
|
$formula =~ s/\\/&\#092/g; |
|
# 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 1222 sub html_uneditable_cell {
|
Line 1291 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 1345 sub outsheet_excel {
|
Line 1419 sub outsheet_excel {
|
# |
# |
# Close the excel file |
# Close the excel file |
$workbook->close(); |
$workbook->close(); |
|
$r->print($self->html_report_error()); |
# |
# |
# Write a link to allow them to download it |
# Write a link to allow them to download it |
$r->print('<br />'. |
$r->print('<br />'. |
Line 1385 sub outsheet_csv {
|
Line 1460 sub outsheet_csv {
|
# |
# |
# Close the csv file |
# Close the csv file |
close($file); |
close($file); |
|
$r->print($self->html_report_error()); |
$r->print('<br /><br />'. |
$r->print('<br /><br />'. |
'<a href="'.$filename.'">Your CSV spreadsheet.</a>'."\n"); |
'<a href="'.$filename.'">Your CSV spreadsheet.</a>'."\n"); |
# |
# |
Line 1618 sub save {
|
Line 1694 sub save {
|
} |
} |
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 1629 sub save {
|
Line 1708 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 1649 sub save_tmp {
|
Line 1728 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'; |