version 1.142, 2002/11/19 19:20:50
|
version 1.161, 2003/01/13 14:58:28
|
Line 62 use Safe;
|
Line 62 use Safe;
|
use Safe::Hole; |
use Safe::Hole; |
use Opcode; |
use Opcode; |
use GDBM_File; |
use GDBM_File; |
|
use HTML::Entities(); |
use HTML::TokeParser; |
use HTML::TokeParser; |
use Spreadsheet::WriteExcel; |
use Spreadsheet::WriteExcel; |
|
|
Line 960 ENDDEFS
|
Line 961 ENDDEFS
|
sub templaterow { |
sub templaterow { |
my $sheet = shift; |
my $sheet = shift; |
my @cols=(); |
my @cols=(); |
my $rowlabel = 'Template'; |
my $rowlabel = 'Template</td><td> '; |
foreach ('A','B','C','D','E','F','G','H','I','J','K','L','M', |
foreach ('A','B','C','D','E','F','G','H','I','J','K','L','M', |
'N','O','P','Q','R','S','T','U','V','W','X','Y','Z', |
'N','O','P','Q','R','S','T','U','V','W','X','Y','Z', |
'a','b','c','d','e','f','g','h','i','j','k','l','m', |
'a','b','c','d','e','f','g','h','i','j','k','l','m', |
'n','o','p','q','r','s','t','u','v','w','x','y','z') { |
'n','o','p','q','r','s','t','u','v','w','x','y','z') { |
my $fm=$sheet->{'f'}->{'template_'.$_}; |
|
$fm=~s/[\'\"]/\&\#34;/g; |
|
push(@cols,{ name => 'template_'.$_, |
push(@cols,{ name => 'template_'.$_, |
formula => $fm, |
formula => $sheet->{'f'}->{'template_'.$_}, |
value => $fm }); |
value => $sheet->{'f'}->{'template_'.$_} }); |
} |
} |
return ($rowlabel,@cols); |
return ($rowlabel,@cols); |
} |
} |
Line 982 sub outrowassess {
|
Line 981 sub outrowassess {
|
if ($n) { |
if ($n) { |
my ($usy,$ufn)=split(/__&&&\__/,$sheet->{'f'}->{'A'.$n}); |
my ($usy,$ufn)=split(/__&&&\__/,$sheet->{'f'}->{'A'.$n}); |
if (exists($sheet->{'rowlabel'}->{$usy})) { |
if (exists($sheet->{'rowlabel'}->{$usy})) { |
$rowlabel = $sheet->{'rowlabel'}->{$usy}; |
# This is dumb, but we need the information when we output |
|
# the html version of the studentcalc spreadsheet for the |
|
# links to the assesscalc sheets. |
|
$rowlabel = $sheet->{'rowlabel'}->{$usy}.':'. |
|
&Apache::lonnet::escape($ufn); |
} else { |
} else { |
$rowlabel = ''; |
$rowlabel = ''; |
} |
} |
|
} elsif ($ENV{'request.role'} =~ /^st\./) { |
|
$rowlabel = 'Summary</td><td>0'; |
} else { |
} else { |
$rowlabel = 'Export'; |
$rowlabel = 'Export</td><td>0'; |
} |
} |
foreach ('A','B','C','D','E','F','G','H','I','J','K','L','M', |
foreach ('A','B','C','D','E','F','G','H','I','J','K','L','M', |
'N','O','P','Q','R','S','T','U','V','W','X','Y','Z', |
'N','O','P','Q','R','S','T','U','V','W','X','Y','Z', |
'a','b','c','d','e','f','g','h','i','j','k','l','m', |
'a','b','c','d','e','f','g','h','i','j','k','l','m', |
'n','o','p','q','r','s','t','u','v','w','x','y','z') { |
'n','o','p','q','r','s','t','u','v','w','x','y','z') { |
my $fm=$sheet->{'f'}->{$_.$n}; |
|
$fm=~s/[\'\"]/\&\#34;/g; |
|
push(@cols,{ name => $_.$n, |
push(@cols,{ name => $_.$n, |
formula => $fm, |
formula => $sheet->{'f'}->{$_.$n}, |
value => $sheet->{'values'}->{$_.$n}}); |
value => $sheet->{'values'}->{$_.$n}}); |
} |
} |
return ($rowlabel,@cols); |
return ($rowlabel,@cols); |
Line 1010 sub outrow {
|
Line 1013 sub outrow {
|
$rowlabel = $sheet->{'rowlabel'}->{$sheet->{'f'}->{'A'.$n}}; |
$rowlabel = $sheet->{'rowlabel'}->{$sheet->{'f'}->{'A'.$n}}; |
} else { |
} else { |
if ($sheet->{'sheettype'} eq 'classcalc') { |
if ($sheet->{'sheettype'} eq 'classcalc') { |
$rowlabel = 'Summary'; |
$rowlabel = 'Summary</td><td>0'; |
} else { |
} else { |
$rowlabel = 'Export'; |
$rowlabel = 'Export</td><td>0'; |
} |
} |
} |
} |
foreach ('A','B','C','D','E','F','G','H','I','J','K','L','M', |
foreach ('A','B','C','D','E','F','G','H','I','J','K','L','M', |
'N','O','P','Q','R','S','T','U','V','W','X','Y','Z', |
'N','O','P','Q','R','S','T','U','V','W','X','Y','Z', |
'a','b','c','d','e','f','g','h','i','j','k','l','m', |
'a','b','c','d','e','f','g','h','i','j','k','l','m', |
'n','o','p','q','r','s','t','u','v','w','x','y','z') { |
'n','o','p','q','r','s','t','u','v','w','x','y','z') { |
my $fm=$sheet->{'f'}->{$_.$n}; |
|
$fm=~s/[\'\"]/\&\#34;/g; |
|
push(@cols,{ name => $_.$n, |
push(@cols,{ name => $_.$n, |
formula => $fm, |
formula => $sheet->{'f'}->{$_.$n}, |
value => $sheet->{'values'}->{$_.$n}}); |
value => $sheet->{'values'}->{$_.$n}}); |
} |
} |
return ($rowlabel,@cols); |
return ($rowlabel,@cols); |
Line 1149 sub exportdata {
|
Line 1150 sub exportdata {
|
|
|
|
|
sub update_student_sheet{ |
sub update_student_sheet{ |
my ($sheet,$c) = @_; |
my ($sheet,$r,$c) = @_; |
# Load in the studentcalc sheet |
# Load in the studentcalc sheet |
&readsheet($sheet,'default_studentcalc'); |
&readsheet($sheet,'default_studentcalc'); |
# Determine the structure (contained assessments, etc) of the sheet |
# Determine the structure (contained assessments, etc) of the sheet |
Line 1157 sub update_student_sheet{
|
Line 1158 sub update_student_sheet{
|
# Load in the cached sheets for this student |
# Load in the cached sheets for this student |
&cachedssheets($sheet); |
&cachedssheets($sheet); |
# Load in the (possibly cached) data from the assessment sheets |
# Load in the (possibly cached) data from the assessment sheets |
&loadstudent($sheet,$c); |
&loadstudent($sheet,$r,$c); |
# Compute the sheet |
# Compute the sheet |
&calcsheet($sheet); |
&calcsheet($sheet); |
} |
} |
Line 1189 sub sort_indicies {
|
Line 1190 sub sort_indicies {
|
my @sortidx=(); |
my @sortidx=(); |
# |
# |
if ($sheet->{'sheettype'} eq 'classcalc') { |
if ($sheet->{'sheettype'} eq 'classcalc') { |
my @sortby=(); |
my @sortby=(undef); |
# Skip row 0 |
# Skip row 0 |
for (my $row=1;$row<=$sheet->{'maxrow'};$row++) { |
for (my $row=1;$row<=$sheet->{'maxrow'};$row++) { |
my (undef,$sname,$sdom,$fullname,$section,$id) = |
my (undef,$sname,$sdom,$fullname,$section,$id) = |
Line 1199 sub sort_indicies {
|
Line 1200 sub sort_indicies {
|
} |
} |
@sortidx = sort { $sortby[$a] cmp $sortby[$b]; } @sortidx; |
@sortidx = sort { $sortby[$a] cmp $sortby[$b]; } @sortidx; |
} elsif ($sheet->{'sheettype'} eq 'studentcalc') { |
} elsif ($sheet->{'sheettype'} eq 'studentcalc') { |
my @sortby=(); |
my @sortby1=(undef); |
|
my @sortby2=(undef); |
# Skip row 0 |
# Skip row 0 |
&Apache::lonnet::logthis('starting sort for studentcalc'); |
|
for (my $row=1;$row<=$sheet->{'maxrow'};$row++) { |
for (my $row=1;$row<=$sheet->{'maxrow'};$row++) { |
my (undef,$symb,$uname,$udom,$mapid,$resid,$title) = |
my ($key,undef) = split(/__&&&\__/,$sheet->{'f'}->{'A'.$row}); |
split(':',$sheet->{'rowlabel'}->{$sheet->{'f'}->{'A'.$row}}); |
my $rowlabel = $sheet->{'rowlabel'}->{$key}; |
$symb = &Apache::lonnet::unescape($symb); |
my (undef,$symb,$mapid,$resid,$title,$ufn) = |
|
split(':',$rowlabel); |
|
$ufn = &Apache::lonnet::unescape($ufn); |
|
$symb = &Apache::lonnet::unescape($symb); |
|
$title = &Apache::lonnet::unescape($title); |
my ($sequence) = ($symb =~ /\/([^\/]*\.sequence)/); |
my ($sequence) = ($symb =~ /\/([^\/]*\.sequence)/); |
if ($sequence eq '') { |
if ($sequence eq '') { |
$sequence = $symb; |
$sequence = $symb; |
} |
} |
push (@sortby, $sequence); |
push (@sortby1, $sequence); |
|
push (@sortby2, $title); |
push (@sortidx, $row); |
push (@sortidx, $row); |
} |
} |
@sortidx = sort { $sortby[$a] cmp $sortby[$b]; } @sortidx; |
@sortidx = sort { $sortby1[$a] cmp $sortby1[$b] || |
|
$sortby2[$a] cmp $sortby2[$b] } @sortidx; |
} else { |
} else { |
my @sortby=(); |
my @sortby=(undef); |
# Skip row 0 |
# Skip row 0 |
for (my $row=1;$row<=$sheet->{'maxrow'};$row++) { |
for (my $row=1;$row<=$sheet->{'maxrow'};$row++) { |
push (@sortby, $sheet->{'safe'}->reval('$f{"A'.$row.'"}')); |
push (@sortby, $sheet->{'safe'}->reval('$f{"A'.$row.'"}')); |
Line 1251 sub html_editable_cell {
|
Line 1258 sub html_editable_cell {
|
if ($formula ne '') { |
if ($formula ne '') { |
$value = '<i>undefined value</i>'; |
$value = '<i>undefined value</i>'; |
} |
} |
} |
} elsif ($value =~ /^\s*$/ ) { |
if ($value =~ /^\s*$/ ) { |
|
$value = '<font color="'.$bgcolor.'">#</font>'; |
$value = '<font color="'.$bgcolor.'">#</font>'; |
|
} else { |
|
$value = &HTML::Entities::encode($value) if ($value !~/ /); |
} |
} |
|
# Make the formula safe for outputting |
|
$formula =~ s/\'/\"/g; |
|
# The formula will be parsed by the browser *twice* before being |
|
# displayed to the user for editing. |
|
$formula = &HTML::Entities::encode(&HTML::Entities::encode($formula)); |
|
# Escape newlines so they make it into the edit window |
$formula =~ s/\n/\\n/gs; |
$formula =~ s/\n/\\n/gs; |
$result .= '<a href="javascript:celledit(\''. |
# Glue everything together |
$name.'\',\''.$formula.'\');">'.$value.'</a>'; |
$result .= "<a href=\"javascript:celledit(\'". |
|
$name."','".$formula."');\">".$value."</a>"; |
return $result; |
return $result; |
} |
} |
|
|
sub html_uneditable_cell { |
sub html_uneditable_cell { |
my ($cell,$bgcolor) = @_; |
my ($cell,$bgcolor) = @_; |
my $value = (defined($cell) ? $cell->{'value'} : ''); |
my $value = (defined($cell) ? $cell->{'value'} : ''); |
|
$value = &HTML::Entities::encode($value) if ($value !~/ /); |
return ' '.$value.' '; |
return ' '.$value.' '; |
} |
} |
|
|
sub outsheet_html { |
sub outsheet_html { |
my ($sheet,$r) = @_; |
my ($sheet,$r) = @_; |
my ($num_uneditable,$realm,$row_type); |
my ($num_uneditable,$realm,$row_type); |
|
my $requester_is_student = ($ENV{'request.role'} =~ /^st\./); |
if ($sheet->{'sheettype'} eq 'assesscalc') { |
if ($sheet->{'sheettype'} eq 'assesscalc') { |
$num_uneditable = 1; |
$num_uneditable = 1; |
$realm = 'Assessment'; |
$realm = 'Assessment'; |
Line 1292 sub outsheet_html {
|
Line 1309 sub outsheet_html {
|
my $tabledata =<<"END"; |
my $tabledata =<<"END"; |
<table border="2"> |
<table border="2"> |
<tr> |
<tr> |
<th colspan="1" rowspan="2"><font size="+2">$realm</font></th> |
<th colspan="2" rowspan="2"><font size="+2">$realm</font></th> |
<td bgcolor="#FFDDDD" colspan="$num_uneditable"> |
<td bgcolor="#FFDDDD" colspan="$num_uneditable"> |
<b><font size="+1">Import</font></b></td> |
<b><font size="+1">Import</font></b></td> |
<td colspan="$num_left"> |
<td colspan="$num_left"> |
Line 1314 END
|
Line 1331 END
|
#################################### |
#################################### |
# Print out template row |
# Print out template row |
#################################### |
#################################### |
my ($rowlabel,@rowdata) = &get_row($sheet,'-'); |
my ($num_cols_output,$row_html,$rowlabel,@rowdata); |
my $row_html = '<tr><td>'.&format_html_rowlabel($rowlabel).'</td>'; |
|
my $num_cols_output = 0; |
if (! $requester_is_student) { |
foreach my $cell (@rowdata) { |
($rowlabel,@rowdata) = &get_row($sheet,'-'); |
if ($num_cols_output++ < $num_uneditable) { |
$row_html = '<tr><td>'.&format_html_rowlabel($sheet,$rowlabel).'</td>'; |
$row_html .= '<td bgcolor="#FFDDDD">'; |
$num_cols_output = 0; |
$row_html .= &html_uneditable_cell($cell,'#FFDDDD'); |
foreach my $cell (@rowdata) { |
} else { |
if ($requester_is_student || |
$row_html .= '<td bgcolor="#EOFFDD">'; |
$num_cols_output++ < $num_uneditable) { |
$row_html .= &html_editable_cell($cell,'#E0FFDD'); |
$row_html .= '<td bgcolor="#FFDDDD">'; |
|
$row_html .= &html_uneditable_cell($cell,'#FFDDDD'); |
|
} else { |
|
$row_html .= '<td bgcolor="#EOFFDD">'; |
|
$row_html .= &html_editable_cell($cell,'#E0FFDD'); |
|
} |
|
$row_html .= '</td>'; |
} |
} |
$row_html .= '</td>'; |
$row_html.= "</tr>\n"; |
|
$r->print($row_html); |
} |
} |
$row_html.= "</tr>\n"; |
|
$r->print($row_html); |
|
#################################### |
#################################### |
# Print out summary/export row |
# Print out summary/export row |
#################################### |
#################################### |
my ($rowlabel,@rowdata) = &get_row($sheet,'0'); |
($rowlabel,@rowdata) = &get_row($sheet,'0'); |
$row_html = '<tr><td>'.&format_html_rowlabel($rowlabel).'</td>'; |
$row_html = '<tr><td>'.&format_html_rowlabel($sheet,$rowlabel).'</td>'; |
$num_cols_output = 0; |
$num_cols_output = 0; |
foreach my $cell (@rowdata) { |
foreach my $cell (@rowdata) { |
if ($num_cols_output++ < 26) { |
if ($num_cols_output++ < 26 && ! $requester_is_student) { |
$row_html .= '<td bgcolor="#CCCCFF">'; |
$row_html .= '<td bgcolor="#CCCCFF">'; |
$row_html .= &html_editable_cell($cell,'#CCCCFF'); |
$row_html .= &html_editable_cell($cell,'#CCCCFF'); |
} else { |
} else { |
$row_html .= '<td bgcolor="#DDCCFF">'; |
$row_html .= '<td bgcolor="#DDCCFF">'; |
$row_html .= &html_uneditable_cell(undef,'#CCCCFF'); |
$row_html .= &html_uneditable_cell($cell,'#CCCCFF'); |
} |
} |
$row_html .= '</td>'; |
$row_html .= '</td>'; |
} |
} |
Line 1361 END
|
Line 1383 END
|
next if (($sheet->{'sheettype'} eq 'assesscalc') && |
next if (($sheet->{'sheettype'} eq 'assesscalc') && |
(! $ENV{'form.showall'}) && |
(! $ENV{'form.showall'}) && |
($rowdata[0]->{'value'} =~ /^\s*$/)); |
($rowdata[0]->{'value'} =~ /^\s*$/)); |
if ($sheet->{'sheettype'} =~ /^(studentcalc|classcalc)$/) { |
if (! $ENV{'form.showall'} && |
|
$sheet->{'sheettype'} =~ /^(studentcalc|classcalc)$/) { |
my $row_is_empty = 1; |
my $row_is_empty = 1; |
foreach my $cell (@rowdata) { |
foreach my $cell (@rowdata) { |
if ($cell->{'value'} !~ /^\s*$/) { |
if ($cell->{'value'} !~ /^\s*$/) { |
Line 1369 END
|
Line 1392 END
|
last; |
last; |
} |
} |
} |
} |
next if $row_is_empty; |
next if ($row_is_empty); |
} |
} |
# |
# |
my $defaultbg='#E0FF'; |
my $defaultbg='#E0FF'; |
Line 1378 END
|
Line 1401 END
|
'</font></b></td>'; |
'</font></b></td>'; |
# |
# |
if ($sheet->{'sheettype'} eq 'classcalc') { |
if ($sheet->{'sheettype'} eq 'classcalc') { |
$row_html.='<td>'.&format_html_rowlabel($rowlabel).'</td>'; |
$row_html.='<td>'.&format_html_rowlabel($sheet,$rowlabel).'</td>'; |
# Output links for each student? |
# Output links for each student? |
# Nope, that is already done for us in format_html_rowlabel (for now) |
# Nope, that is already done for us in format_html_rowlabel |
|
# (for now) |
} elsif ($sheet->{'sheettype'} eq 'studentcalc') { |
} elsif ($sheet->{'sheettype'} eq 'studentcalc') { |
$row_html.='<td>'.&format_html_rowlabel($rowlabel); |
my $ufn = (split(/:/,$rowlabel))[5]; |
|
$row_html.='<td>'.&format_html_rowlabel($sheet,$rowlabel); |
$row_html.= '<br>'. |
$row_html.= '<br>'. |
'<select name="sel_'.$rownum.'" '. |
'<select name="sel_'.$rownum.'" '. |
'onChange="changesheet('.$rownum.')">'. |
'onChange="changesheet('.$rownum.')">'. |
'<option name="default">Default</option>'; |
'<option name="default">Default</option>'; |
|
|
foreach (@{$sheet->{'othersheets'}}) { |
foreach (@{$sheet->{'othersheets'}}) { |
$row_html.='<option name="'.$_.'"'; |
$row_html.='<option name="'.$_.'"'; |
#if ($ufn eq $_) { |
if ($ufn eq $_) { |
# $row_html.=' selected'; |
$row_html.=' selected'; |
#} |
} |
$row_html.='>'.$_.'</option>'; |
$row_html.='>'.$_.'</option>'; |
} |
} |
$row_html.='</select></td>'; |
$row_html.='</select></td>'; |
} elsif ($sheet->{'sheettype'} eq 'assesscalc') { |
} elsif ($sheet->{'sheettype'} eq 'assesscalc') { |
$row_html.='<td>'.&format_html_rowlabel($rowlabel).'</td>'; |
$row_html.='<td>'.&format_html_rowlabel($sheet,$rowlabel).'</td>'; |
} |
} |
# |
# |
my $shown_cells = 0; |
my $shown_cells = 0; |
Line 1414 END
|
Line 1440 END
|
$bgcolor='#FFDDDD' if ($shown_cells < $num_uneditable); |
$bgcolor='#FFDDDD' if ($shown_cells < $num_uneditable); |
# |
# |
$row_html.='<td bgcolor='.$bgcolor.'>'; |
$row_html.='<td bgcolor='.$bgcolor.'>'; |
if ($shown_cells < $num_uneditable) { |
if ($requester_is_student || $shown_cells < $num_uneditable) { |
$row_html .= &html_uneditable_cell($cell,$bgcolor); |
$row_html .= &html_uneditable_cell($cell,$bgcolor); |
} else { |
} else { |
$row_html .= &html_editable_cell($cell,$bgcolor); |
$row_html .= &html_editable_cell($cell,$bgcolor); |
Line 1466 sub outsheet_csv {
|
Line 1492 sub outsheet_csv {
|
foreach my $rownum (@Rows) { |
foreach my $rownum (@Rows) { |
my ($rowlabel,@rowdata) = &get_row($sheet,$rownum); |
my ($rowlabel,@rowdata) = &get_row($sheet,$rownum); |
next if ($rowlabel =~ /^\s*$/); |
next if ($rowlabel =~ /^\s*$/); |
push (@Values,&format_csv_rowlabel($rowlabel)); |
push (@Values,&format_csv_rowlabel($sheet,$rowlabel)); |
foreach my $cell (@rowdata) { |
foreach my $cell (@rowdata) { |
push (@Values,'"'.$cell->{'value'}.'"'); |
push (@Values,'"'.$cell->{'value'}.'"'); |
} |
} |
Line 1527 A link to the spreadsheet will be availa
|
Line 1553 A link to the spreadsheet will be availa
|
END |
END |
$r->rflush(); |
$r->rflush(); |
my $starttime = time; |
my $starttime = time; |
foreach (keys(%f)) { |
foreach my $rownum (&sort_indicies($sheet)) { |
next if ($_!~/^A(\d+)/ || $1 == 0 || ($f{$_}=~/^[!~-]/)); |
|
$count++; |
$count++; |
my ($sname,$sdom) = split(':',$f{$_}); |
my ($sname,$sdom) = split(':',$f{'A'.$rownum}); |
my $student_excel_worksheet=$workbook->addworksheet($sname.'@'.$sdom); |
my $student_excel_worksheet=$workbook->addworksheet($sname.'@'.$sdom); |
# Create a new spreadsheet |
# Create a new spreadsheet |
my $studentsheet = &makenewsheet($sname,$sdom,'studentcalc',undef); |
my $studentsheet = &makenewsheet($sname,$sdom,'studentcalc',undef); |
# Read in the spreadsheet definition |
# Read in the spreadsheet definition |
&update_student_sheet($studentsheet,$c); |
&update_student_sheet($studentsheet,$r,$c); |
# Stuff the sheet into excel |
# Stuff the sheet into excel |
&export_sheet_as_excel($studentsheet,$student_excel_worksheet); |
&export_sheet_as_excel($studentsheet,$student_excel_worksheet); |
my $totaltime = int((time - $starttime) / $count * $sheet->{'maxrow'}); |
my $totaltime = int((time - $starttime) / $count * $sheet->{'maxrow'}); |
Line 1636 sub export_sheet_as_excel {
|
Line 1661 sub export_sheet_as_excel {
|
# Write the summary/export row # |
# Write the summary/export row # |
#################################### |
#################################### |
my ($rowlabel,@rowdata) = &get_row($sheet,'0'); |
my ($rowlabel,@rowdata) = &get_row($sheet,'0'); |
my $label = &format_excel_rowlabel($rowlabel); |
my $label = &format_excel_rowlabel($sheet,$rowlabel); |
$cols_output = 0; |
$cols_output = 0; |
$worksheet->write($rows_output,$cols_output++,$label); |
$worksheet->write($rows_output,$cols_output++,$label); |
foreach my $cell (@rowdata) { |
foreach my $cell (@rowdata) { |
Line 1651 sub export_sheet_as_excel {
|
Line 1676 sub export_sheet_as_excel {
|
# Loop through the rows and output them one at a time |
# Loop through the rows and output them one at a time |
foreach my $rownum (@Rows) { |
foreach my $rownum (@Rows) { |
my ($rowlabel,@rowdata) = &get_row($sheet,$rownum); |
my ($rowlabel,@rowdata) = &get_row($sheet,$rownum); |
next if ($rowlabel =~ /^\s*$/); |
next if ($rowlabel =~ /^[\s]*$/); |
$cols_output = 0; |
$cols_output = 0; |
my $label = &format_excel_rowlabel($rowlabel); |
my $label = &format_excel_rowlabel($sheet,$rowlabel); |
|
if ( ! $ENV{'form.showall'} && |
|
$sheet->{'sheettype'} =~ /^(studentcalc|classcalc)$/) { |
|
my $row_is_empty = 1; |
|
foreach my $cell (@rowdata) { |
|
if ($cell->{'value'} !~ /^\s*$/) { |
|
$row_is_empty = 0; |
|
last; |
|
} |
|
} |
|
next if ($row_is_empty); |
|
} |
$worksheet->write($rows_output,$cols_output++,$label); |
$worksheet->write($rows_output,$cols_output++,$label); |
if (ref($label)) { |
if (ref($label)) { |
$cols_output = (scalar(@$label)); |
$cols_output = (scalar(@$label)); |
Line 1680 sub outsheet_xml {
|
Line 1716 sub outsheet_xml {
|
## Outsheet - calls other outsheet_* functions |
## Outsheet - calls other outsheet_* functions |
## |
## |
sub outsheet { |
sub outsheet { |
my ($r,$sheet)=@_; |
my ($sheet,$r)=@_; |
if (! exists($ENV{'form.output'})) { |
if (! exists($ENV{'form.output'})) { |
$ENV{'form.output'} = 'HTML'; |
$ENV{'form.output'} = 'HTML'; |
} |
} |
Line 1805 sub readsheet {
|
Line 1841 sub readsheet {
|
} |
} |
%f=%{&parse_sheet(\$sheetxml)}; |
%f=%{&parse_sheet(\$sheetxml)}; |
} else { |
} else { |
my $sheet=''; |
|
my %tmphash = &Apache::lonnet::dump($fn,$cdom,$cnum); |
my %tmphash = &Apache::lonnet::dump($fn,$cdom,$cnum); |
my ($tmp) = keys(%tmphash); |
my ($tmp) = keys(%tmphash); |
unless ($tmp =~ /^(con_lost|error|no_such_host)/i) { |
if ($tmp !~ /^(con_lost|error|no_such_host)/i) { |
foreach (keys(%tmphash)) { |
foreach (keys(%tmphash)) { |
$f{$_}=$tmphash{$_}; |
$f{$_}=$tmphash{$_}; |
} |
} |
|
} else { |
|
# Unable to grab the specified spreadsheet, |
|
# so we get the default ones instead. |
|
$fn = 'default_'.$stype; |
|
$sheet->{'filename'} = $fn; |
|
my $dfn = $fn; |
|
$dfn =~ s/\_/\./g; |
|
my $sheetxml; |
|
if (my $fh=Apache::File->new($includedir.'/'.$dfn)) { |
|
$sheetxml = join('',<$fh>); |
|
} else { |
|
$sheetxml='<field row="0" col="A">'. |
|
'"Unable to load spreadsheet"</field>'; |
|
} |
|
%f=%{&parse_sheet(\$sheetxml)}; |
} |
} |
} |
} |
# Cache and set |
# Cache and set |
Line 1885 sub writesheet {
|
Line 1935 sub writesheet {
|
$cdom,$cnum); |
$cdom,$cnum); |
if ($reply eq 'ok') { |
if ($reply eq 'ok') { |
if ($makedef) { |
if ($makedef) { |
return &Apache::lonnet::put('environment', |
$reply = &Apache::lonnet::put('environment', |
{'spreadsheet_default_'.$stype => $fn }, |
{'spreadsheet_default_'.$stype => $fn }, |
$cdom,$cnum); |
$cdom,$cnum); |
|
if ($reply eq 'ok' && |
|
($sheet->{'sheettype'} eq 'studentcalc' || |
|
$sheet->{'sheettype'} eq 'assesscalc')) { |
|
# Expire the spreadsheets of the other students. |
|
&Apache::lonnet::expirespread('','','studentcalc',''); |
|
} |
|
return $reply; |
} |
} |
return $reply; |
return $reply; |
} |
} |
Line 1910 sub tmpwrite {
|
Line 1967 sub tmpwrite {
|
$fn=$tmpdir.$fn.'.tmp'; |
$fn=$tmpdir.$fn.'.tmp'; |
my $fh; |
my $fh; |
if ($fh=Apache::File->new('>'.$fn)) { |
if ($fh=Apache::File->new('>'.$fn)) { |
print $fh join("\n",&getformulas($sheet)); |
my %f = &getformulas($sheet); |
|
while( my ($cell,$formula) = each(%f)) { |
|
print $fh &Apache::lonnet::escape($cell)."=".&Apache::lonnet::escape($formula)."\n"; |
|
} |
} |
} |
} |
} |
|
|
Line 1926 sub tmpread {
|
Line 1986 sub tmpread {
|
my %fo=(); |
my %fo=(); |
my $countrows=0; |
my $countrows=0; |
if ($fh=Apache::File->new($fn)) { |
if ($fh=Apache::File->new($fn)) { |
my $name; |
while (<$fh>) { |
while ($name=<$fh>) { |
chomp; |
chomp($name); |
my ($cell,$formula) = split(/=/); |
my $value=<$fh>; |
$cell = &Apache::lonnet::unescape($cell); |
chomp($value); |
$formula = &Apache::lonnet::unescape($formula); |
$fo{$name}=$value; |
$fo{$cell} = $formula; |
if ($name=~/^A(\d+)$/) { |
} |
if ($1>$countrows) { |
} |
$countrows=$1; |
# chomp($value); |
} |
# $fo{$name}=$value; |
} |
# if ($name=~/^A(\d+)$/) { |
} |
# if ($1>$countrows) { |
} |
# $countrows=$1; |
|
# } |
|
# } |
|
# } |
|
# } |
if ($nform eq 'changesheet') { |
if ($nform eq 'changesheet') { |
$fo{'A'.$nfield}=(split(/__&&&\__/,$fo{'A'.$nfield}))[0]; |
$fo{'A'.$nfield}=(split(/__&&&\__/,$fo{'A'.$nfield}))[0]; |
unless ($ENV{'form.sel_'.$nfield} eq 'Default') { |
unless ($ENV{'form.sel_'.$nfield} eq 'Default') { |
$fo{'A'.$nfield}.='__&&&__'.$ENV{'form.sel_'.$nfield}; |
$fo{'A'.$nfield}.='__&&&__'.$ENV{'form.sel_'.$nfield}; |
} |
} |
} elsif ($nfield eq 'insertrow') { |
# } elsif ($nfield eq 'insertrow') { |
$countrows++; |
# $countrows++; |
my $newrow=substr('000000'.$countrows,-7); |
# my $newrow=substr('000000'.$countrows,-7); |
if ($nform eq 'top') { |
# if ($nform eq 'top') { |
$fo{'A'.$countrows}='--- '.$newrow; |
# $fo{'A'.$countrows}='--- '.$newrow; |
} else { |
# } else { |
$fo{'A'.$countrows}='~~~ '.$newrow; |
# $fo{'A'.$countrows}='~~~ '.$newrow; |
} |
# } |
} else { |
} else { |
if ($nfield) { $fo{$nfield}=$nform; } |
if ($nfield) { $fo{$nfield}=$nform; } |
} |
} |
Line 2039 sub parmval {
|
Line 2103 sub parmval {
|
## Row label formatting routines ## |
## Row label formatting routines ## |
################################################################## |
################################################################## |
sub format_html_rowlabel { |
sub format_html_rowlabel { |
|
my $sheet = shift; |
my $rowlabel = shift; |
my $rowlabel = shift; |
return '' if ($rowlabel eq ''); |
return '' if ($rowlabel eq ''); |
my ($type,$labeldata) = split(':',$rowlabel,2); |
my ($type,$labeldata) = split(':',$rowlabel,2); |
my $result = ''; |
my $result = ''; |
if ($type eq 'symb') { |
if ($type eq 'symb') { |
my ($symb,$uname,$udom,$mapid,$resid,$title) = split(':',$labeldata); |
my ($symb,$mapid,$resid,$title,$ufn) = split(':',$labeldata); |
$symb = &Apache::lonnet::unescape($symb); |
$ufn = 'default' if (!defined($ufn) || $ufn eq ''); |
|
$ufn = &Apache::lonnet::unescape($ufn); |
|
$symb = &Apache::lonnet::unescape($symb); |
|
$title = &Apache::lonnet::unescape($title); |
$result = '<a href="/adm/assesscalc?usymb='.$symb. |
$result = '<a href="/adm/assesscalc?usymb='.$symb. |
'&uname='.$uname.'&udom='.$udom. |
'&uname='.$sheet->{'uname'}.'&udom='.$sheet->{'udom'}. |
'&mapid='.$mapid.'&resid='.$resid.'">'.$title.'</a>'; |
'&ufn='.$ufn. |
|
'&mapid='.$mapid.'&resid='.$resid.'">'.$title.'</a>'; |
} elsif ($type eq 'student') { |
} elsif ($type eq 'student') { |
my ($sname,$sdom,$fullname,$section,$id) = split(':',$labeldata); |
my ($sname,$sdom,$fullname,$section,$id) = split(':',$labeldata); |
|
if ($fullname =~ /^\s*$/) { |
|
$fullname = $sname.'@'.$sdom; |
|
} |
$result ='<a href="/adm/studentcalc?uname='.$sname. |
$result ='<a href="/adm/studentcalc?uname='.$sname. |
'&udom='.$sdom.'">'; |
'&udom='.$sdom.'">'; |
$result.=$section.' '.$id." ".$fullname.'</a>'; |
$result.=$section.' '.$id." ".$fullname.'</a>'; |
Line 2063 sub format_html_rowlabel {
|
Line 2135 sub format_html_rowlabel {
|
} |
} |
|
|
sub format_csv_rowlabel { |
sub format_csv_rowlabel { |
|
my $sheet = shift; |
my $rowlabel = shift; |
my $rowlabel = shift; |
return '' if ($rowlabel eq ''); |
return '' if ($rowlabel eq ''); |
my ($type,$labeldata) = split(':',$rowlabel,2); |
my ($type,$labeldata) = split(':',$rowlabel,2); |
my $result = ''; |
my $result = ''; |
if ($type eq 'symb') { |
if ($type eq 'symb') { |
my ($symb,$uname,$udom,$mapid,$resid,$title) = split(':',$labeldata); |
my ($symb,$mapid,$resid,$title,$ufn) = split(':',$labeldata); |
$symb = &Apache::lonnet::unescape($symb); |
$ufn = &Apache::lonnet::unescape($ufn); |
|
$symb = &Apache::lonnet::unescape($symb); |
|
$title = &Apache::lonnet::unescape($title); |
$result = $title; |
$result = $title; |
} elsif ($type eq 'student') { |
} elsif ($type eq 'student') { |
my ($sname,$sdom,$fullname,$section,$id) = split(':',$labeldata); |
my ($sname,$sdom,$fullname,$section,$id) = split(':',$labeldata); |
Line 2084 sub format_csv_rowlabel {
|
Line 2159 sub format_csv_rowlabel {
|
} |
} |
|
|
sub format_excel_rowlabel { |
sub format_excel_rowlabel { |
|
my $sheet = shift; |
my $rowlabel = shift; |
my $rowlabel = shift; |
return '' if ($rowlabel eq ''); |
return '' if ($rowlabel eq ''); |
my ($type,$labeldata) = split(':',$rowlabel,2); |
my ($type,$labeldata) = split(':',$rowlabel,2); |
my $result = ''; |
my $result = ''; |
if ($type eq 'symb') { |
if ($type eq 'symb') { |
my ($symb,$uname,$udom,$mapid,$resid,$title) = split(':',$labeldata); |
my ($symb,$mapid,$resid,$title,$ufn) = split(':',$labeldata); |
$symb = &Apache::lonnet::unescape($symb); |
$ufn = &Apache::lonnet::unescape($ufn); |
|
$symb = &Apache::lonnet::unescape($symb); |
|
$title = &Apache::lonnet::unescape($title); |
$result = $title; |
$result = $title; |
} elsif ($type eq 'student') { |
} elsif ($type eq 'student') { |
my ($sname,$sdom,$fullname,$section,$id) = split(':',$labeldata); |
my ($sname,$sdom,$fullname,$section,$id) = split(':',$labeldata); |
Line 2198 sub get_student_rowlabels {
|
Line 2276 sub get_student_rowlabels {
|
return 'Could not access course data'; |
return 'Could not access course data'; |
} |
} |
# |
# |
my %assesslist; |
my %assesslist = (); |
foreach ('Feedback','Evaluation','Tutoring','Discussion') { |
foreach ('Feedback','Evaluation','Tutoring','Discussion') { |
my $symb = '_'.lc($_); |
my $symb = '_'.lc($_); |
$assesslist{$symb} = join(':',('symb',$symb,$uname,$udom,0,0,$_)); |
$assesslist{$symb} = join(':',('symb',$symb,0,0, |
|
&Apache::lonnet::escape($_))); |
} |
} |
# |
# |
while (my ($key,$srcf) = each(%course_db)) { |
while (my ($key,$srcf) = each(%course_db)) { |
Line 2213 sub get_student_rowlabels {
|
Line 2292 sub get_student_rowlabels {
|
my $symb= |
my $symb= |
&Apache::lonnet::declutter($course_db{'map_id_'.$mapid}). |
&Apache::lonnet::declutter($course_db{'map_id_'.$mapid}). |
'___'.$resid.'___'.&Apache::lonnet::declutter($srcf); |
'___'.$resid.'___'.&Apache::lonnet::declutter($srcf); |
$assesslist{$symb}='symb:'.&Apache::lonnet::escape($symb).':' |
$assesslist{$symb} ='symb:'.&Apache::lonnet::escape($symb).':' |
.$uname.':'.$udom.':'.$mapid.':'.$resid.':'. |
.$mapid.':'.$resid.':'. |
$course_db{'title_'.$id}; |
&Apache::lonnet::escape($course_db{'title_'.$id}); |
} |
} |
} |
} |
untie(%course_db); |
untie(%course_db); |
Line 2303 sub updatestudentassesssheet {
|
Line 2382 sub updatestudentassesssheet {
|
$sheet->{'maxrow'} = 0; |
$sheet->{'maxrow'} = 0; |
my %existing=(); |
my %existing=(); |
# Now obsolete rows |
# Now obsolete rows |
while (my ($cell, $formula) = each (%f)) { |
foreach my $cell (keys(%f)) { |
|
my $formula = $f{$cell}; |
next if ($cell !~ /^A(\d+)/); |
next if ($cell !~ /^A(\d+)/); |
$sheet->{'maxrow'} = $1 if ($1 > $sheet->{'maxrow'}); |
$sheet->{'maxrow'} = $1 if ($1 > $sheet->{'maxrow'}); |
my ($usy,$ufn)=split(/__&&&\__/,$formula); |
my ($usy,$ufn)=split(/__&&&\__/,$formula); |
Line 2311 sub updatestudentassesssheet {
|
Line 2391 sub updatestudentassesssheet {
|
unless ((exists($sheet->{'rowlabel'}->{$usy}) && |
unless ((exists($sheet->{'rowlabel'}->{$usy}) && |
(defined($sheet->{'rowlabel'}->{$usy})) || (!$1) || |
(defined($sheet->{'rowlabel'}->{$usy})) || (!$1) || |
($formula =~ /^(~~~|---)/) )) { |
($formula =~ /^(~~~|---)/) )) { |
$f{$_}='!!! Obsolete'; |
$f{$cell}='!!! Obsolete'; |
$changed=1; |
$changed=1; |
} elsif ($ufn) { |
|
# I do not think this works any more |
|
$sheet->{'rowlabel'}->{$usy} |
|
=~s/assesscalc\?usymb\=/assesscalc\?ufn\=$ufn&\usymb\=/; |
|
} |
} |
} |
} |
# New and unknown keys |
# New and unknown keys |
Line 2351 sub loadstudent{
|
Line 2427 sub loadstudent{
|
undef @tmp; |
undef @tmp; |
# |
# |
my @assessdata=(); |
my @assessdata=(); |
while (my ($cell,$value) = each (%formulas)) { |
foreach my $cell (keys(%formulas)) { |
|
my $value = $formulas{$cell}; |
if(defined($c) && ($c->aborted())) { |
if(defined($c) && ($c->aborted())) { |
last; |
last; |
} |
} |
Line 2363 sub loadstudent{
|
Line 2440 sub loadstudent{
|
$sheet->{'udom'}, |
$sheet->{'udom'}, |
'assesscalc',$usy,$ufn,$r); |
'assesscalc',$usy,$ufn,$r); |
my $index=0; |
my $index=0; |
foreach ('A','B','C','D','E','F','G','H','I','J','K','L','M', |
foreach my $col ('A','B','C','D','E','F','G','H','I','J','K','L','M', |
'N','O','P','Q','R','S','T','U','V','W','X','Y','Z') { |
'N','O','P','Q','R','S','T','U','V','W','X','Y','Z') { |
if (defined($assessdata[$index])) { |
if (defined($assessdata[$index])) { |
my $col=$_; |
|
if ($assessdata[$index]=~/\D/) { |
if ($assessdata[$index]=~/\D/) { |
$constants{$col.$row}="'".$assessdata[$index]."'"; |
$constants{$col.$row}="'".$assessdata[$index]."'"; |
} else { |
} else { |
$constants{$col.$row}=$assessdata[$index]; |
$constants{$col.$row}=$assessdata[$index]; |
} |
} |
unless ($col eq 'A') { |
$formulas{$col.$row}='import' if ($col ne 'A'); |
$formulas{$col.$row}='import'; |
|
} |
|
} |
} |
$index++; |
$index++; |
} |
} |
Line 2489 sub loadassessment {
|
Line 2563 sub loadassessment {
|
# restore individual |
# restore individual |
# |
# |
%returnhash = &Apache::lonnet::restore($symb,$namespace,$udom,$uname); |
%returnhash = &Apache::lonnet::restore($symb,$namespace,$udom,$uname); |
for (my $version=1;$version<=$returnhash{'version'};$version++) { |
|
foreach (split(/\:/,$returnhash{$version.':keys'})) { |
|
$returnhash{$_}=$returnhash{$version.':'.$_}; |
|
} |
|
} |
|
} |
} |
# |
# |
# returnhash now has all stores for this resource |
# returnhash now has all stores for this resource |
Line 2637 sub loadrows {
|
Line 2706 sub loadrows {
|
|
|
sub checkthis { |
sub checkthis { |
my ($keyname,$time)=@_; |
my ($keyname,$time)=@_; |
return ($time<$expiredates{$keyname}); |
if (! exists($expiredates{$keyname})) { |
|
return 0; |
|
} else { |
|
return ($time<$expiredates{$keyname}); |
|
} |
} |
} |
|
|
sub forcedrecalc { |
sub forcedrecalc { |
Line 2655 sub forcedrecalc {
|
Line 2728 sub forcedrecalc {
|
&checkthis($uname.':'.$udom.':assesscalc:'.$map,$time) || |
&checkthis($uname.':'.$udom.':assesscalc:'.$map,$time) || |
&checkthis($uname.':'.$udom.':assesscalc:'.$usymb,$time)) { |
&checkthis($uname.':'.$udom.':assesscalc:'.$usymb,$time)) { |
return 1; |
return 1; |
} |
} |
} else { |
} else { |
if (&checkthis('::studentcalc:',$time) || |
if (&checkthis('::studentcalc:',$time) || |
&checkthis($uname.':'.$udom.':studentcalc:',$time)) { |
&checkthis($uname.':'.$udom.':studentcalc:',$time)) { |
Line 2671 sub forcedrecalc {
|
Line 2744 sub forcedrecalc {
|
# |
# |
sub exportsheet { |
sub exportsheet { |
my ($sheet,$uname,$udom,$stype,$usymb,$fn,$r)=@_; |
my ($sheet,$uname,$udom,$stype,$usymb,$fn,$r)=@_; |
|
my $flag = 0; |
$uname = $uname || $sheet->{'uname'}; |
$uname = $uname || $sheet->{'uname'}; |
$udom = $udom || $sheet->{'udom'}; |
$udom = $udom || $sheet->{'udom'}; |
$stype = $stype || $sheet->{'sheettype'}; |
$stype = $stype || $sheet->{'sheettype'}; |
my @exportarr=(); |
my @exportarr=(); |
|
# This handles the assessment sheets for '_feedback', etc |
if (defined($usymb) && ($usymb=~/^\_(\w+)/) && |
if (defined($usymb) && ($usymb=~/^\_(\w+)/) && |
(!defined($fn) || $fn eq '')) { |
(!defined($fn) || $fn eq '')) { |
$fn='default_'.$1; |
$fn='default_'.$1; |
Line 2739 sub exportsheet {
|
Line 2814 sub exportsheet {
|
[$key], |
[$key], |
$sheet->{'cdom'},$sheet->{'cnum'}); |
$sheet->{'cdom'},$sheet->{'cnum'}); |
if ($tmp[0]!~/^error/) { |
if ($tmp[0]!~/^error/) { |
%currentlystored = @tmp; |
# We only got one key, so we will access it directly. |
|
foreach (split('___&___',$tmp[1])) { |
|
my ($key,$value) = split('___=___',$_); |
|
$key = '' if (! defined($key)); |
|
$currentlystored{$key} = $value; |
|
} |
} |
} |
} else { |
} else { |
my @tmp = &Apache::lonnet::get('nohist_calculatedsheets_'. |
my @tmp = &Apache::lonnet::get('nohist_calculatedsheets_'. |
$sheet->{'cid'},[$key], |
$sheet->{'cid'},[$key], |
$sheet->{'udom'},$sheet->{'uname'}); |
$sheet->{'udom'},$sheet->{'uname'}); |
if ($tmp[0]!~/^error/) { |
if ($tmp[0]!~/^error/) { |
%currentlystored = @tmp; |
# We only got one key, so we will access it directly. |
|
foreach (split('___&___',$tmp[1])) { |
|
my ($key,$value) = split('___=___',$_); |
|
$key = '' if (! defined($key)); |
|
$currentlystored{$key} = $value; |
|
} |
} |
} |
} |
} |
# |
# |
Line 2765 sub exportsheet {
|
Line 2850 sub exportsheet {
|
# |
# |
# Store away the new value |
# Store away the new value |
# |
# |
|
my $timekey = $key.'.time'; |
if ($stype eq 'studentcalc') { |
if ($stype eq 'studentcalc') { |
&Apache::lonnet::put('nohist_calculatedsheets', |
my $result = &Apache::lonnet::put('nohist_calculatedsheets', |
{ $key => $newstore, |
{ $key => $newstore, |
$key.time => $now }, |
$timekey => $now }, |
$sheet->{'cdom'},$sheet->{'cnum'}); |
$sheet->{'cdom'}, |
} else { |
$sheet->{'cnum'}); |
&Apache::lonnet::put('nohist_calculatedsheets_'.$sheet->{'cid'}, |
} else { |
{ $key => $newstore, |
my $result = &Apache::lonnet::put('nohist_calculatedsheets_'.$sheet->{'cid'}, |
$key.time => $now }, |
{ $key => $newstore, |
$sheet->{'udom'}, |
$timekey => $now }, |
$sheet->{'uname'}) |
$sheet->{'udom'}, |
|
$sheet->{'uname'}); |
} |
} |
return @exportarr; |
return @exportarr; |
} |
} |
Line 2823 sub cachedssheets {
|
Line 2910 sub cachedssheets {
|
$uname = $uname || $sheet->{'uname'}; |
$uname = $uname || $sheet->{'uname'}; |
$udom = $udom || $sheet->{'udom'}; |
$udom = $udom || $sheet->{'udom'}; |
if (! $loadedcaches{$uname.'_'.$udom}) { |
if (! $loadedcaches{$uname.'_'.$udom}) { |
my @tmp = &Apache::lonnet::dump('nohist_calculatedsheets', |
my @tmp = &Apache::lonnet::dump('nohist_calculatedsheets_'. |
|
$ENV{'request.course.id'}, |
$sheet->{'udom'}, |
$sheet->{'udom'}, |
$sheet->{'uname'}); |
$sheet->{'uname'}); |
if ($tmp[0] !~ /^error/) { |
if ($tmp[0] !~ /^error/) { |
Line 2908 sub handler {
|
Line 2996 sub handler {
|
delete $ENV{'form.unewformula'} if (exists($ENV{'form.unewformula'})); |
delete $ENV{'form.unewformula'} if (exists($ENV{'form.unewformula'})); |
} |
} |
# |
# |
# Clean up symb and spreadsheet filename |
# Look for special assessment spreadsheets - '_feedback', etc. |
# |
# |
if (($ENV{'form.usymb'}=~/^\_(\w+)/) && (!$ENV{'form.ufn'})) { |
if (($ENV{'form.usymb'}=~/^\_(\w+)/) && (!$ENV{'form.ufn'} || |
|
$ENV{'form.ufn'} eq '' || |
|
$ENV{'form.ufn'} eq 'default')) { |
$ENV{'form.ufn'}='default_'.$1; |
$ENV{'form.ufn'}='default_'.$1; |
} |
} |
|
if (!$ENV{'form.ufn'} || $ENV{'form.ufn'} eq 'default') { |
|
$ENV{'form.ufn'}='course_default_'.$sheettype; |
|
} |
# |
# |
# Interactive loading of specific sheet? |
# Interactive loading of specific sheet? |
# |
# |
Line 2954 sub handler {
|
Line 3047 sub handler {
|
|
|
function celledit(cellname,cellformula) { |
function celledit(cellname,cellformula) { |
var edit_text = ''; |
var edit_text = ''; |
|
// cellformula may contain less-than and greater-than symbols, so |
|
// we need to escape them? |
edit_text +='<html><head><title>Cell Edit Window</title></head><body>'; |
edit_text +='<html><head><title>Cell Edit Window</title></head><body>'; |
edit_text += '<form name="editwinform">'; |
edit_text += '<form name="editwinform">'; |
edit_text += '<center><h3>Cell '+cellname+'</h3>'; |
edit_text += '<center><h3>Cell '+cellname+'</h3>'; |
Line 3046 ENDSCRIPT
|
Line 3141 ENDSCRIPT
|
# If a new formula had been entered, go from work copy |
# If a new formula had been entered, go from work copy |
if ($ENV{'form.unewfield'}) { |
if ($ENV{'form.unewfield'}) { |
$r->print('<h2>Modified Workcopy</h2>'); |
$r->print('<h2>Modified Workcopy</h2>'); |
$ENV{'form.unewformula'}=~s/\'/\"/g; |
#$ENV{'form.unewformula'}=~s/\'/\"/g; |
$r->print('<p>New formula: '.$ENV{'form.unewfield'}.'='. |
$r->print('<p>Cell '.$ENV{'form.unewfield'}.' = <pre>'); |
$ENV{'form.unewformula'}.'<p>'); |
$r->print(&HTML::Entities::encode($ENV{'form.unewformula'}). |
|
'</pre></p>'); |
$sheet->{'filename'} = $ENV{'form.ufn'}; |
$sheet->{'filename'} = $ENV{'form.ufn'}; |
&tmpread($sheet,$ENV{'form.unewfield'},$ENV{'form.unewformula'}); |
&tmpread($sheet,$ENV{'form.unewfield'},$ENV{'form.unewformula'}); |
} elsif ($ENV{'form.saveas'}) { |
} elsif ($ENV{'form.saveas'}) { |
Line 3177 ENDSCRIPT
|
Line 3273 ENDSCRIPT
|
} |
} |
$r->print('>'); |
$r->print('>'); |
# |
# |
# CSV format checkbox (classcalc sheets only) |
# output format select box |
$r->print(' Output as <select name="output" size="1" onClick="submit()">'. |
$r->print(' Output as <select name="output" size="1" onChange="submit()">'. |
"\n"); |
"\n"); |
foreach my $mode (qw/HTML CSV Excel/) { |
foreach my $mode (qw/HTML CSV Excel/) { |
$r->print('<option value="'.$mode.'"'); |
$r->print('<option value="'.$mode.'"'); |
Line 3187 ENDSCRIPT
|
Line 3283 ENDSCRIPT
|
} |
} |
$r->print('>'.$mode.'</option>'."\n"); |
$r->print('>'.$mode.'</option>'."\n"); |
} |
} |
if ($sheet->{'sheettype'} eq 'classcalc') { |
# |
$r->print('<option value="recursive excel"'); |
# Mulit-sheet excel takes too long and does not work at all for large |
if ($ENV{'form.output'} eq 'recursive excel') { |
# classes. Future inclusion of this option may be possible with the |
$r->print(' selected '); |
# Spreadsheet::WriteExcel::Big and speed improvements. |
} |
# |
$r->print(">Multi-Sheet Excel</option>\n"); |
# if ($sheet->{'sheettype'} eq 'classcalc') { |
} |
# $r->print('<option value="recursive excel"'); |
|
# if ($ENV{'form.output'} eq 'recursive excel') { |
|
# $r->print(' selected '); |
|
# } |
|
# $r->print(">Multi-Sheet Excel</option>\n"); |
|
# } |
$r->print("</select>\n"); |
$r->print("</select>\n"); |
# |
# |
if ($sheet->{'sheettype'} eq 'classcalc') { |
if ($sheet->{'sheettype'} eq 'classcalc') { |
Line 3211 ENDSCRIPT
|
Line 3312 ENDSCRIPT
|
#value='Insert Row Bottom'><br> |
#value='Insert Row Bottom'><br> |
#ENDINSERTBUTTONS |
#ENDINSERTBUTTONS |
# Print out sheet |
# Print out sheet |
&outsheet($r,$sheet); |
&outsheet($sheet,$r); |
$r->print('</form></body></html>'); |
$r->print('</form></body></html>'); |
# Done |
# Done |
return OK; |
return OK; |
Line 3219 ENDSCRIPT
|
Line 3320 ENDSCRIPT
|
|
|
1; |
1; |
__END__ |
__END__ |
|
|
|
|