version 1.63, 2006/02/27 19:36:20
|
version 1.77, 2007/01/23 18:22:47
|
Line 60 use HTML::TokeParser;
|
Line 60 use HTML::TokeParser;
|
use Spreadsheet::WriteExcel; |
use Spreadsheet::WriteExcel; |
use Time::HiRes; |
use Time::HiRes; |
use Apache::lonlocal; |
use Apache::lonlocal; |
|
use lib '/home/httpd/lib/perl/'; |
|
use LONCAPA; |
|
|
|
|
## |
## |
## Package Variables |
## Package Variables |
Line 85 sub new {
|
Line 88 sub new {
|
my $class = ref($this) || $this; |
my $class = ref($this) || $this; |
my ($stype) = ($class =~ /Apache::(.*)$/); |
my ($stype) = ($class =~ /Apache::(.*)$/); |
# |
# |
my ($name,$domain,$filename,$usymb)=@_; |
my ($name,$domain,$filename,$usymb,$section,$groups)=@_; |
if (defined($usymb) && ref($usymb)) { |
if (defined($usymb) && ref($usymb)) { |
$usymb = $usymb->symb; |
$usymb = $usymb->symb; |
} |
} |
Line 95 sub new {
|
Line 98 sub new {
|
if (! defined($domain) || $domain eq '') { |
if (! defined($domain) || $domain eq '') { |
$domain = $env{'user.domain'}; |
$domain = $env{'user.domain'}; |
} |
} |
|
if (! defined($section) || $section eq '') { |
|
$section = &Apache::lonnet::getsection($domain,$name, |
|
$env{'request.course.id'}); |
|
} |
|
if (! defined($groups)) { |
|
|
|
my @usersgroups = &Apache::lonnet::get_users_groups($domain,$name, |
|
$env{'request.course.id'}); |
|
$groups = \@usersgroups; |
|
} |
# |
# |
my $self = { |
my $self = { |
name => $name, |
name => $name, |
domain => $domain, |
domain => $domain, |
|
section => $section, |
|
groups => $groups, |
type => $stype, |
type => $stype, |
symb => $usymb, |
symb => $usymb, |
errorlog => '', |
errorlog => '', |
Line 157 sub filename {
|
Line 172 sub filename {
|
$newfilename = 'default_'.$self->{'type'}; |
$newfilename = 'default_'.$self->{'type'}; |
} |
} |
} |
} |
if ($newfilename !~ /\w/ || $newfilename =~ /^\W*$/) { |
if ($newfilename eq &mt('LON-CAPA Standard')) { |
$newfilename = 'default_'.$self->{'type'}; |
undef($newfilename); |
} |
} else { |
if ($newfilename !~ /^default\.$self->{'type'}$/ && |
if ($newfilename !~ /\w/ || $newfilename =~ /^\W*$/) { |
$newfilename !~ /^\/res\/(.*)spreadsheet$/) { |
$newfilename = 'default_'.$self->{'type'}; |
if ($newfilename !~ /_$self->{'type'}$/) { |
} |
$newfilename =~ s/[\s_]*$//; |
if ($newfilename !~ /^default\.$self->{'type'}$/ && |
$newfilename .= '_'.$self->{'type'}; |
$newfilename !~ /^\/res\/(.*)spreadsheet$/) { |
} |
if ($newfilename !~ /_$self->{'type'}$/) { |
} |
$newfilename =~ s/[\s_]*$//; |
|
$newfilename .= '_'.$self->{'type'}; |
|
} |
|
} |
|
} |
$self->{'filename'} = $newfilename; |
$self->{'filename'} = $newfilename; |
return; |
return; |
} |
} |
Line 656 sub MAXPARM {
|
Line 675 sub MAXPARM {
|
return $max; |
return $max; |
} |
} |
|
|
|
|
|
=pod |
|
|
|
=item PARM(parametername) |
|
|
|
Returns the value of the parameter matching the input parameter name. |
|
parametername should be a string such as 'parameter_1_opendate'. |
|
|
|
=cut |
|
|
|
#------------------------------------------------------- |
|
sub PARM { |
|
return $c{$_[0]}; |
|
} |
|
|
#------------------------------------------------------- |
#------------------------------------------------------- |
|
|
=pod |
=pod |
Line 786 sub expandnamed {
|
Line 820 sub expandnamed {
|
my $self = shift; |
my $self = shift; |
my $expression=shift; |
my $expression=shift; |
if ($expression=~/^\&/) { |
if ($expression=~/^\&/) { |
my ($func,$var,$formula)=($expression=~/^\&(\w+)\(([^\;]+)\;(.*)\)/); |
my ($func,$var,$formula)=($expression=~/^\&(\w+)\(([^\;]+)\;(.*)\)/s); |
my @vars=split(/\W+/,$formula); |
my @vars=split(/\W+/,$formula); |
|
# make the list uniq |
|
@vars = keys(%{{ map { $_ => 1 } @vars }}); |
my %values=(); |
my %values=(); |
foreach my $varname ( @vars ) { |
foreach my $varname ( @vars ) { |
if ($varname=~/^(parameter|stores|timestamp)/) { |
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/) { |
$values{$1}=1; |
$values{$1}=1; |
} |
} |
} |
} |
} |
} |
} |
} |
if ($func eq 'EXPANDSUM') { |
if ($func eq 'EXPANDSUM') { |
Line 808 sub expandnamed {
|
Line 844 sub expandnamed {
|
$result.=$thissum.'+'; |
$result.=$thissum.'+'; |
} |
} |
$result=~s/\+$//; |
$result=~s/\+$//; |
return $result; |
return '('.$result.')'; |
} else { |
} else { |
return 0; |
return 0; |
} |
} |
Line 871 sub sett {
|
Line 907 sub sett {
|
# Replace 'A0' with the value from 'A0' |
# Replace 'A0' with the value from 'A0' |
$t{$cell}=~s/(^|[^\"\'])([A-Za-z]\d+)/$1\$sheet_values\{\'$2\'\}/g; |
$t{$cell}=~s/(^|[^\"\'])([A-Za-z]\d+)/$1\$sheet_values\{\'$2\'\}/g; |
# Replace parameters |
# Replace parameters |
$t{$cell}=~s/(^|[^\"\'])\[([^\]]+)\]/$1.$self->expandnamed($2)/ge; |
$t{$cell}=~s/(^|[^\"\'])\[([^\]]+)\]/$1.$self->expandnamed($2)/sge; |
} |
} |
} |
} |
# |
# |
Line 883 sub sett {
|
Line 919 sub sett {
|
$t{$cell}=$formula; |
$t{$cell}=$formula; |
$t{$cell}=~s/\.\.+/\,/g; |
$t{$cell}=~s/\.\.+/\,/g; |
$t{$cell}=~s/(^|[^\"\'])([A-Za-z]\d+)/$1\$sheet_values\{\'$2\'\}/g; |
$t{$cell}=~s/(^|[^\"\'])([A-Za-z]\d+)/$1\$sheet_values\{\'$2\'\}/g; |
$t{$cell}=~s/(^|[^\"\'])\[([^\]]+)\]/$1.$self->expandnamed($2)/ge; |
$t{$cell}=~s/(^|[^\"\'])\[([^\]]+)\]/$1.$self->expandnamed($2)/sge; |
} elsif ( $col =~ /^[A-Z]$/ ) { |
} elsif ( $col =~ /^[A-Z]$/ ) { |
if ($formula !~ /^\!/ && exists($self->{'constants'}->{$cell}) |
if ($formula !~ /^\!/ && exists($self->{'constants'}->{$cell}) |
&& $self->{'constants'}->{$cell} ne '') { |
&& $self->{'constants'}->{$cell} ne '') { |
Line 894 sub sett {
|
Line 930 sub sett {
|
$t{$cell}=$formula; |
$t{$cell}=$formula; |
$t{$cell}=~s/\.\.+/\,/g; |
$t{$cell}=~s/\.\.+/\,/g; |
$t{$cell}=~s/(^|[^\"\'])([A-Za-z]\d+)/$1\$sheet_values\{\'$2\'\}/g; |
$t{$cell}=~s/(^|[^\"\'])([A-Za-z]\d+)/$1\$sheet_values\{\'$2\'\}/g; |
$t{$cell}=~s/(^|[^\"\'])\[([^\]]+)\]/$1.$self->expandnamed($2)/ge; |
$t{$cell}=~s/(^|[^\"\'])\[([^\]]+)\]/$1.$self->expandnamed($2)/sge; |
} |
} |
} |
} |
%{$self->{'safe'}->varglob('t')}=%t; |
%{$self->{'safe'}->varglob('t')}=%t; |
Line 1271 sub html_template_row {
|
Line 1307 sub html_template_row {
|
$row_html .= '<td bgcolor="'.$importcolor.'">'. |
$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="#E0FFDD">'. |
&html_editable_cell($cell,'#EOFFDD',$allowed, |
&html_editable_cell($cell,'#E0FFDD',$allowed, |
$self->{outputmode} eq 'source').'</td>'; |
$self->{outputmode} eq 'source').'</td>'; |
} |
} |
} |
} |
Line 1348 sub html_row {
|
Line 1384 sub html_row {
|
$row_html .= '<td bgcolor="'.$color.'">'; |
$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="#E0FFDD">'; |
$row_html .= &html_editable_cell($cell,'#E0FFDD',$allowed, |
$row_html .= &html_editable_cell($cell,'#E0FFDD',$allowed, |
$self->{outputmode} eq 'source'); |
$self->{outputmode} eq 'source'); |
} |
} |
Line 1669 sub load {
|
Line 1705 sub load {
|
# Load the spreadsheet definition file from the save file |
# Load the spreadsheet definition file from the save file |
my %tmphash = &Apache::lonnet::dump($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 (%tmphash |
|
&& $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; |
} |
} |
Line 1775 sub save {
|
Line 1812 sub save {
|
&Apache::lonnet::appenv('course.'.$self->{'cid'}.'.spreadsheet_default_'. |
&Apache::lonnet::appenv('course.'.$self->{'cid'}.'.spreadsheet_default_'. |
$self->{'type'} => $self->filename()); |
$self->{'type'} => $self->filename()); |
} |
} |
if ($self->is_default()) { |
if ($self->{'type'} eq 'studentcalc') { |
if ($self->{'type'} eq 'studentcalc') { |
&Apache::lonnet::expirespread('','','studentcalc',''); |
&Apache::lonnet::expirespread('','','studentcalc',''); |
} elsif ($self->{'type'} eq 'assesscalc') { |
} elsif ($self->{'type'} eq 'assesscalc') { |
&Apache::lonnet::expirespread('','','assesscalc',''); |
&Apache::lonnet::expirespread('','','assesscalc',''); |
&Apache::lonnet::expirespread('','','studentcalc',''); |
&Apache::lonnet::expirespread('','','studentcalc',''); |
|
} |
|
} |
} |
return $reply; |
return $reply; |
} |
} |
Line 1803 sub save_tmp {
|
Line 1838 sub save_tmp {
|
my %f = $self->formulas(); |
my %f = $self->formulas(); |
while( my ($cell,$formula) = each(%f)) { |
while( my ($cell,$formula) = each(%f)) { |
next if ($formula eq 'import'); |
next if ($formula eq 'import'); |
print $fh &Apache::lonnet::escape($cell)."=". |
print $fh &escape($cell)."=". |
&Apache::lonnet::escape($formula)."\n"; |
&escape($formula)."\n"; |
} |
} |
$fh->close(); |
$fh->close(); |
} |
} |
Line 1822 sub load_tmp {
|
Line 1857 sub load_tmp {
|
while (<$spreadsheet_file>) { |
while (<$spreadsheet_file>) { |
chomp; |
chomp; |
my ($cell,$formula) = split(/=/); |
my ($cell,$formula) = split(/=/); |
$cell = &Apache::lonnet::unescape($cell); |
$cell = &unescape($cell); |
$formula = &Apache::lonnet::unescape($formula); |
$formula = &unescape($formula); |
$formulas{$cell} = $formula; |
$formulas{$cell} = $formula; |
} |
} |
$spreadsheet_file->close(); |
$spreadsheet_file->close(); |
Line 1866 sub othersheets {
|
Line 1901 sub othersheets {
|
my ($stype) = @_; |
my ($stype) = @_; |
$stype = $self->{'type'} if (! defined($stype) || $stype !~ /calc$/); |
$stype = $self->{'type'} if (! defined($stype) || $stype !~ /calc$/); |
# |
# |
my @alternatives=(); |
my @alternatives=(&mt('Default'), &mt('LON-CAPA Standard')); |
my %results=&Apache::lonnet::dump($stype.'_spreadsheets', |
my %results=&Apache::lonnet::dump($stype.'_spreadsheets', |
$self->{'cdom'}, $self->{'cnum'}); |
$self->{'cdom'}, $self->{'cnum'}); |
my ($tmp) = keys(%results); |
my ($tmp) = keys(%results); |
if ($tmp =~ /^(con_lost|error|no_such_host)/i ) { |
if (%results |
@alternatives = (&mt('Default')); |
&& $tmp !~ /^(con_lost|error|no_such_host)/i ) { |
} else { |
push(@alternatives, sort(keys(%results))); |
@alternatives = (&mt('Default'), sort (keys(%results))); |
|
} |
} |
return @alternatives; |
return @alternatives; |
} |
} |