version 1.1, 2003/05/16 20:55:11
|
version 1.11, 2003/05/29 13:39:38
|
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 => '', |
|
# |
|
# blackout is used to determine if any data needs to be hidden from the |
|
# student. |
|
blackout => 0, |
# |
# |
# Data storage |
# Data storage |
formulas => {}, |
formulas => {}, |
Line 137 sub filename {
|
Line 142 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 !~ /\w/) { |
my %tmphash = &Apache::lonnet::get('environment', |
my %tmphash = &Apache::lonnet::get('environment', |
['spreadsheet_default_'. |
['spreadsheet_default_'. |
$self->{'type'}], |
$self->{'type'}], |
Line 147 sub filename {
|
Line 152 sub filename {
|
if ($tmp !~ /^(con_lost|error|no_such_host)/i) { |
if ($tmp !~ /^(con_lost|error|no_such_host)/i) { |
$newfilename=$tmphash{'spreadsheet_default_'.$self->{'type'}}; |
$newfilename=$tmphash{'spreadsheet_default_'.$self->{'type'}}; |
} |
} |
} |
if (! defined($newfilename) || |
if (! defined($newfilename) || |
$newfilename !~ /\w/ || |
$newfilename !~ /\w/ || |
$newfilename =~ /^\W*$/) { |
$newfilename =~ /^\W*$/) { |
$newfilename = 'default.'.$self->{'type'}; |
$newfilename = 'default.'.$self->{'type'}; |
} |
} else { |
} elsif ($newfilename !~ /^\/res\/.*\.spreadsheet/ && |
|
$newfilename !~ /^default\.$self->{'type'}$/ ) { |
my $regexp = '_'.$self->{'type'}.'$'; |
my $regexp = '_'.$self->{'type'}.'$'; |
if ($newfilename !~ /$regexp/) { |
if ($newfilename !~ /$regexp/) { |
$newfilename .= '_'.$self->{'type'}; |
$newfilename .= '_'.$self->{'type'}; |
Line 216 sub is_default {
|
Line 222 sub is_default {
|
return 0; |
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 { |
sub initialize_spreadsheet_package { |
&load_spreadsheet_expirationdates(); |
&load_spreadsheet_expirationdates(); |
&clear_spreadsheet_definition_cache(); |
&clear_spreadsheet_definition_cache(); |
Line 810 sub expandnamed {
|
Line 821 sub expandnamed {
|
push @matches,$parameter if ($parameter =~ /$expression/); |
push @matches,$parameter if ($parameter =~ /$expression/); |
} |
} |
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 = '$c{\''.$matches[0].'\'}'; |
Line 826 sub expandnamed {
|
Line 837 sub expandnamed {
|
} 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: '.$parameter.'"'; |
} |
} |
return $returnvalue; |
return $returnvalue; |
} |
} |
Line 1105 sub calcsheet {
|
Line 1116 sub calcsheet {
|
## Output Helpers |
## Output Helpers |
## |
## |
########################################################### |
########################################################### |
|
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'}; |
|
} |
|
if ($outputmode eq 'html') { |
|
$self->outsheet_html($r); |
|
} elsif ($outputmode eq 'excel') { |
|
$self->outsheet_excel($r); |
|
} elsif ($outputmode eq 'csv') { |
|
$self->outsheet_csv($r); |
|
} |
|
return; |
|
} |
|
|
############################################ |
############################################ |
## HTML output routines ## |
## HTML output routines ## |
############################################ |
############################################ |
Line 1135 sub html_template_row {
|
Line 1164 sub html_template_row {
|
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="#DDCCFF">'. |
$row_html .= '<td bgcolor="#FFDDDD">'. |
&html_editable_cell($cell,'#DDCCFF',$allowed).'</td>'; |
&html_uneditable_cell($cell,'#FFDDDD',$allowed).'</td>'; |
} else { |
} else { |
$row_html .= '<td bgcolor="#EOFFDD">'. |
$row_html .= '<td bgcolor="#EOFFDD">'. |
&html_editable_cell($cell,'#EOFFDD',$allowed).'</td>'; |
&html_editable_cell($cell,'#EOFFDD',$allowed).'</td>'; |
Line 1207 sub html_row {
|
Line 1236 sub html_row {
|
return $row_html; |
return $row_html; |
} |
} |
|
|
|
sub html_header { |
|
my $self = shift; |
|
return '' if (! $ENV{'request.role.adv'}); |
|
return "<table>\n". |
|
'<tr><th align="center">Output Format</th><tr>'."\n". |
|
'<tr><td>'.&output_selector()."</td></tr>\n". |
|
"</table>\n"; |
|
} |
|
|
|
sub output_selector { |
|
my $output_selector = '<select name="output_format" size="3">'."\n"; |
|
my $default = 'html'; |
|
if (exists($ENV{'form.output_format'})) { |
|
$default = $ENV{'form.output_format'} |
|
} else { |
|
$ENV{'form.output_format'} = $default; |
|
} |
|
foreach (['html','HTML'], |
|
['excel','Excel'], |
|
['csv','Comma Seperated Values']) { |
|
my ($name,$description) = @{$_}; |
|
$output_selector.=qq{<option value="$name"}; |
|
if ($name eq $default) { |
|
$output_selector .= ' selected'; |
|
} |
|
$output_selector .= ">$description</option>\n"; |
|
} |
|
$output_selector .= "</select>\n"; |
|
return $output_selector; |
|
} |
|
|
|
################################################ |
|
## Excel output routines ## |
|
################################################ |
|
sub excel_output_row { |
|
my $self = shift; |
|
my ($worksheet,$rownum,$rows_output,@prepend) = @_; |
|
my $cols_output = 0; |
|
# |
|
my @rowdata = $self->get_row($rownum); |
|
foreach my $cell (@prepend,@rowdata) { |
|
my $value = $cell; |
|
$value = $cell->{'value'} if (ref($value)); |
|
$value =~ s/\ / /gi; |
|
$worksheet->write($rows_output,$cols_output++,$value); |
|
} |
|
return; |
|
} |
|
|
sub create_excel_spreadsheet { |
sub create_excel_spreadsheet { |
my $self = shift; |
my $self = shift; |
my ($r) = @_; |
my ($r) = @_; |
Line 1232 sub create_excel_spreadsheet {
|
Line 1310 sub create_excel_spreadsheet {
|
return ($workbook,$filename); |
return ($workbook,$filename); |
} |
} |
|
|
|
sub outsheet_excel { |
|
my $self = shift; |
|
my ($r) = @_; |
|
$r->print("<h2>Preparing Excel Spreadsheet</h2>"); |
|
# |
|
# Create excel worksheet |
|
my ($workbook,$filename) = $self->create_excel_spreadsheet($r); |
|
return if (! defined($workbook)); |
|
# |
|
# Create main worksheet |
|
my $worksheet = $workbook->addworksheet('main'); |
|
my $rows_output = 0; |
|
my $cols_output = 0; |
|
# |
|
# Write excel header |
|
foreach my $value ($self->get_title()) { |
|
$cols_output = 0; |
|
$worksheet->write($rows_output++,$cols_output,$value); |
|
} |
|
$rows_output++; # skip a line |
|
# |
|
# Write summary/export row |
|
$cols_output = 0; |
|
$self->excel_output_row($worksheet,0,$rows_output++,'Summary'); |
|
$rows_output++; # skip a line |
|
# |
|
$self->excel_rows($worksheet,$cols_output,$rows_output); |
|
# |
|
# |
|
# Close the excel file |
|
$workbook->close(); |
|
# |
|
# Write a link to allow them to download it |
|
$r->print('<br />'. |
|
'<a href="'.$filename.'">Your Excel spreadsheet.</a>'."\n"); |
|
return; |
|
} |
|
|
|
################################# |
|
## CSV output routines ## |
|
################################# |
|
sub outsheet_csv { |
|
my $self = shift; |
|
my ($r) = @_; |
|
my $csvdata = ''; |
|
my @Values; |
|
# |
|
# Open the csv file |
|
my $filename = '/prtspool/'. |
|
$ENV{'user.name'}.'_'.$ENV{'user.domain'}.'_'. |
|
time.'_'.rand(1000000000).'.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. ". |
|
"This error has been logged. ". |
|
"Please alert your LON-CAPA administrator."); |
|
$r->print("<pre>\n".$csvdata."</pre>\n"); |
|
return 0; |
|
} |
|
# |
|
# Output the title information |
|
foreach my $value ($self->get_title()) { |
|
print $file "'".&Apache::loncommon::csv_translate($value)."'\n"; |
|
} |
|
# |
|
# Output the body of the spreadsheet |
|
$self->csv_rows($file); |
|
# |
|
# Close the csv file |
|
close($file); |
|
$r->print('<br /><br />'. |
|
'<a href="'.$filename.'">Your CSV spreadsheet.</a>'."\n"); |
|
# |
|
return 1; |
|
} |
|
|
|
sub csv_output_row { |
|
my $self = shift; |
|
my ($filehandle,$rownum,@prepend) = @_; |
|
# |
|
my @rowdata = (); |
|
if (defined($rownum)) { |
|
@rowdata = $self->get_row($rownum); |
|
} |
|
my @output = (); |
|
foreach my $cell (@prepend,@rowdata) { |
|
my $value = $cell; |
|
$value = $cell->{'value'} if (ref($value)); |
|
$value =~ s/\ / /gi; |
|
$value = "'".$value."'"; |
|
push (@output,$value); |
|
} |
|
print $filehandle join(',',@output )."\n"; |
|
return; |
|
} |
|
|
############################################ |
############################################ |
## XML output routines ## |
## XML output routines ## |
############################################ |
############################################ |
Line 1328 sub load {
|
Line 1503 sub load {
|
$sheetxml='<field row="0" col="A"></field>'; |
$sheetxml='<field row="0" col="A"></field>'; |
} |
} |
($formulas,undef) = &parse_sheet(\$sheetxml); |
($formulas,undef) = &parse_sheet(\$sheetxml); |
} elsif($self->filename() =~ /^\/*\.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 |
(&Apache::lonnet::filelocation('',$filename)); |
(&Apache::lonnet::filelocation('',$filename)); |
Line 1396 sub save {
|
Line 1571 sub save {
|
my $self = shift; |
my $self = shift; |
my ($makedef)=@_; |
my ($makedef)=@_; |
my $cid=$self->{'cid'}; |
my $cid=$self->{'cid'}; |
|
# If we are saving it, it must not be temporary |
|
$self->temporary(0); |
if (&Apache::lonnet::allowed('opa',$cid)) { |
if (&Apache::lonnet::allowed('opa',$cid)) { |
my %f=$self->formulas(); |
my %f=$self->formulas(); |
my $stype = $self->{'type'}; |
my $stype = $self->{'type'}; |
Line 1433 sub save {
|
Line 1610 sub save {
|
|
|
sub save_tmp { |
sub save_tmp { |
my $self = shift; |
my $self = shift; |
my $fn=$ENV{'user.name'}.'_'. |
my $filename=$ENV{'user.name'}.'_'. |
$ENV{'user.domain'}.'_spreadsheet_'.$self->{'usymb'}.'_'. |
$ENV{'user.domain'}.'_spreadsheet_'.$self->{'usymb'}.'_'. |
$self->{'filename'}; |
$self->{'filename'}; |
$fn=~s/\W/\_/g; |
$filename=~s/\W/\_/g; |
$fn=$Apache::lonnet::tmpdir.$fn.'.tmp'; |
$filename=$Apache::lonnet::tmpdir.$filename.'.tmp'; |
|
$self->temporary(1); |
my $fh; |
my $fh; |
if ($fh=Apache::File->new('>'.$fn)) { |
if ($fh=Apache::File->new('>'.$filename)) { |
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'); |
Line 1468 sub load_tmp {
|
Line 1646 sub load_tmp {
|
} |
} |
$spreadsheet_file->close(); |
$spreadsheet_file->close(); |
} |
} |
|
# flag the sheet as temporary |
|
$self->temporary(1); |
$self->formulas(\%formulas); |
$self->formulas(\%formulas); |
$self->set_row_sources(); |
$self->set_row_sources(); |
$self->set_row_numbers(); |
$self->set_row_numbers(); |
return; |
return; |
} |
} |
|
|
|
sub temporary { |
|
my $self=shift; |
|
if (@_) { |
|
($self->{'temporary'})= @_; |
|
} |
|
return $self->{'temporary'}; |
|
} |
|
|
sub modify_cell { |
sub modify_cell { |
# studentcalc overrides this |
# studentcalc overrides this |
my $self = shift; |
my $self = shift; |
Line 1500 sub othersheets {
|
Line 1688 sub othersheets {
|
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); |
unless ($tmp =~ /^(con_lost|error|no_such_host)/i ) { |
if ($tmp =~ /^(con_lost|error|no_such_host)/i ) { |
|
@alternatives = ('Default'); |
|
} else { |
@alternatives = sort (keys(%results)); |
@alternatives = sort (keys(%results)); |
} |
} |
return @alternatives; |
return @alternatives; |
} |
} |
|
|
|
sub blackout { |
|
my $self = shift; |
|
$self->{'blackout'} = $_[0] if (@_); |
|
return $self->{'blackout'}; |
|
} |
|
|
sub get_row { |
sub get_row { |
my $self = shift; |
my $self = shift; |
my ($n)=@_; |
my ($n)=@_; |