version 1.139, 2002/11/12 22:44:28
|
version 1.140, 2002/11/15 18:19:10
|
Line 53 built-in functions.
|
Line 53 built-in functions.
|
package Apache::lonspreadsheet; |
package Apache::lonspreadsheet; |
|
|
use strict; |
use strict; |
|
use Apache::Constants qw(:common :http); |
|
use Apache::lonnet; |
|
use Apache::lonhtmlcommon; |
|
use Apache::loncoursedata; |
|
use Apache::File(); |
use Safe; |
use Safe; |
use Safe::Hole; |
use Safe::Hole; |
use Opcode; |
use Opcode; |
use Apache::lonnet; |
|
use Apache::Constants qw(:common :http); |
|
use GDBM_File; |
use GDBM_File; |
use HTML::TokeParser; |
use HTML::TokeParser; |
use Apache::lonhtmlcommon; |
|
use Apache::loncoursedata; |
|
use Apache::File(); |
|
use Spreadsheet::WriteExcel; |
use Spreadsheet::WriteExcel; |
|
|
# |
# |
Line 1149 sub exportdata {
|
Line 1149 sub exportdata {
|
|
|
|
|
sub update_student_sheet{ |
sub update_student_sheet{ |
my $sheet = shift; |
my ($sheet,$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 1157 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); |
&loadstudent($sheet,$c); |
# Compute the sheet |
# Compute the sheet |
&calcsheet($sheet); |
&calcsheet($sheet); |
} |
} |
Line 1496 END
|
Line 1496 END
|
# 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); |
&update_student_sheet($studentsheet,$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 2296 sub updatestudentassesssheet {
|
Line 2296 sub updatestudentassesssheet {
|
# ------------------------------------------------ Load data for one assessment |
# ------------------------------------------------ Load data for one assessment |
|
|
sub loadstudent{ |
sub loadstudent{ |
my ($sheet)=@_; |
my ($sheet,$r,$c)=@_; |
my %c=(); |
my %constants=(); |
my %f=&getformulas($sheet); |
my %formulas=&getformulas($sheet); |
$cachedassess=$sheet->{'uname'}.':'.$sheet->{'udom'}; |
$cachedassess=$sheet->{'uname'}.':'.$sheet->{'udom'}; |
# Get ALL the student preformance data |
# Get ALL the student preformance data |
my @tmp = &Apache::lonnet::dump($sheet->{'cid'}, |
my @tmp = &Apache::lonnet::dump($sheet->{'cid'}, |
Line 2311 sub loadstudent{
|
Line 2311 sub loadstudent{
|
undef @tmp; |
undef @tmp; |
# |
# |
my @assessdata=(); |
my @assessdata=(); |
while (my ($cell,$value) = each (%f)) { |
while (my ($cell,$value) = each (%formulas)) { |
|
if(defined($c) && ($c->aborted())) { |
|
last; |
|
} |
next if ($cell !~ /^A(\d+)/); |
next if ($cell !~ /^A(\d+)/); |
my $row=$1; |
my $row=$1; |
next if (($value =~ /^[!~-]/) || ($row==0)); |
next if (($value =~ /^[!~-]/) || ($row==0)); |
my ($usy,$ufn)=split(/__&&&\__/,$value); |
my ($usy,$ufn)=split(/__&&&\__/,$value); |
@assessdata=&exportsheet($sheet,$sheet->{'uname'}, |
@assessdata=&exportsheet($sheet,$sheet->{'uname'}, |
$sheet->{'udom'}, |
$sheet->{'udom'}, |
'assesscalc',$usy,$ufn); |
'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 ('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=$_; |
my $col=$_; |
if ($assessdata[$index]=~/\D/) { |
if ($assessdata[$index]=~/\D/) { |
$c{$col.$row}="'".$assessdata[$index]."'"; |
$constants{$col.$row}="'".$assessdata[$index]."'"; |
} else { |
} else { |
$c{$col.$row}=$assessdata[$index]; |
$constants{$col.$row}=$assessdata[$index]; |
} |
} |
unless ($col eq 'A') { |
unless ($col eq 'A') { |
$f{$col.$row}='import'; |
$formulas{$col.$row}='import'; |
} |
} |
} |
} |
$index++; |
$index++; |
Line 2338 sub loadstudent{
|
Line 2341 sub loadstudent{
|
} |
} |
$cachedassess=''; |
$cachedassess=''; |
undef %cachedstores; |
undef %cachedstores; |
$sheet->{'f'} = \%f; |
$sheet->{'f'} = \%formulas; |
&setformulas($sheet); |
&setformulas($sheet); |
&setconstants($sheet,\%c); |
&setconstants($sheet,\%constants); |
} |
} |
|
|
# --------------------------------------------------- Load data for one student |
# --------------------------------------------------- Load data for one student |
# |
# |
sub loadcourse { |
sub loadcourse { |
my ($sheet,$r)=@_; |
my ($sheet,$r,$c)=@_; |
# |
# |
my %c=(); |
my %constants=(); |
my %f=&getformulas($sheet); |
my %formulas=&getformulas($sheet); |
# |
# |
my $total=0; |
my $total=0; |
foreach (keys(%f)) { |
foreach (keys(%formulas)) { |
if ($_=~/^A(\d+)/) { |
if ($_=~/^A(\d+)/) { |
unless ($f{$_}=~/^[\!\~\-]/) { $total++; } |
unless ($formulas{$_}=~/^[\!\~\-]/) { $total++; } |
} |
} |
} |
} |
my $now=0; |
my $now=0; |
Line 2371 sub loadcourse {
|
Line 2374 sub loadcourse {
|
</script> |
</script> |
ENDPOP |
ENDPOP |
$r->rflush(); |
$r->rflush(); |
foreach (keys(%f)) { |
foreach (keys(%formulas)) { |
|
if(defined($c) && ($c->aborted())) { |
|
last; |
|
} |
next if ($_!~/^A(\d+)/); |
next if ($_!~/^A(\d+)/); |
my $row=$1; |
my $row=$1; |
next if (($f{$_}=~/^[\!\~\-]/) || ($row==0)); |
next if (($formulas{$_}=~/^[\!\~\-]/) || ($row==0)); |
my ($sname,$sdom) = split(':',$f{$_}); |
my ($sname,$sdom) = split(':',$formulas{$_}); |
my @studentdata=&exportsheet($sheet,$sname,$sdom,'studentcalc'); |
my @studentdata=&exportsheet($sheet,$sname,$sdom,'studentcalc', |
|
undef,undef,$r); |
undef %userrdatas; |
undef %userrdatas; |
$now++; |
$now++; |
$r->print('<script>popwin.document.popremain.remaining.value="'. |
$r->print('<script>popwin.document.popremain.remaining.value="'. |
Line 2390 ENDPOP
|
Line 2397 ENDPOP
|
if (defined($studentdata[$index])) { |
if (defined($studentdata[$index])) { |
my $col=$_; |
my $col=$_; |
if ($studentdata[$index]=~/\D/) { |
if ($studentdata[$index]=~/\D/) { |
$c{$col.$row}="'".$studentdata[$index]."'"; |
$constants{$col.$row}="'".$studentdata[$index]."'"; |
} else { |
} else { |
$c{$col.$row}=$studentdata[$index]; |
$constants{$col.$row}=$studentdata[$index]; |
} |
} |
unless ($col eq 'A') { |
unless ($col eq 'A') { |
$f{$col.$row}='import'; |
$formulas{$col.$row}='import'; |
} |
} |
} |
} |
$index++; |
$index++; |
} |
} |
} |
} |
$sheet->{'f'}=\%f; |
$sheet->{'f'}=\%formulas; |
&setformulas($sheet); |
&setformulas($sheet); |
&setconstants($sheet,\%c); |
&setconstants($sheet,\%constants); |
$r->print('<script>popwin.close()</script>'); |
$r->print('<script>popwin.close()</script>'); |
$r->rflush(); |
$r->rflush(); |
} |
} |
Line 2411 ENDPOP
|
Line 2418 ENDPOP
|
# ------------------------------------------------ Load data for one assessment |
# ------------------------------------------------ Load data for one assessment |
# |
# |
sub loadassessment { |
sub loadassessment { |
my ($sheet)=@_; |
my ($sheet,$r,$c)=@_; |
|
|
my $uhome = $sheet->{'uhome'}; |
my $uhome = $sheet->{'uhome'}; |
my $uname = $sheet->{'uname'}; |
my $uname = $sheet->{'uname'}; |
Line 2575 sub updatesheet {
|
Line 2582 sub updatesheet {
|
|
|
sub loadrows { |
sub loadrows { |
my ($sheet,$r)=@_; |
my ($sheet,$r)=@_; |
|
my $c = $r->connection; |
my $stype=$sheet->{'sheettype'}; |
my $stype=$sheet->{'sheettype'}; |
if ($stype eq 'classcalc') { |
if ($stype eq 'classcalc') { |
&loadcourse($sheet,$r); |
&loadcourse($sheet,$r,$c); |
} elsif ($stype eq 'studentcalc') { |
} elsif ($stype eq 'studentcalc') { |
&loadstudent($sheet); |
&loadstudent($sheet,$r,$c); |
} else { |
} else { |
&loadassessment($sheet); |
&loadassessment($sheet,$r,$c); |
} |
} |
} |
} |
|
|
Line 2622 sub forcedrecalc {
|
Line 2630 sub forcedrecalc {
|
# returns the export row for a spreadsheet. |
# returns the export row for a spreadsheet. |
# |
# |
sub exportsheet { |
sub exportsheet { |
my ($sheet,$uname,$udom,$stype,$usymb,$fn)=@_; |
my ($sheet,$uname,$udom,$stype,$usymb,$fn,$r)=@_; |
$uname = $uname || $sheet->{'uname'}; |
$uname = $uname || $sheet->{'uname'}; |
$udom = $udom || $sheet->{'udom'}; |
$udom = $udom || $sheet->{'udom'}; |
$stype = $stype || $sheet->{'sheettype'}; |
$stype = $stype || $sheet->{'sheettype'}; |
Line 2676 sub exportsheet {
|
Line 2684 sub exportsheet {
|
my ($newsheet)=&makenewsheet($uname,$udom,$stype,$usymb); |
my ($newsheet)=&makenewsheet($uname,$udom,$stype,$usymb); |
&readsheet($newsheet,$fn); |
&readsheet($newsheet,$fn); |
&updatesheet($newsheet); |
&updatesheet($newsheet); |
&loadrows($newsheet); |
&loadrows($newsheet,$r); |
&calcsheet($newsheet); |
&calcsheet($newsheet); |
@exportarr=&exportdata($newsheet); |
@exportarr=&exportdata($newsheet); |
## |
## |
Line 2742 sub load_spreadsheet_expirationdates {
|
Line 2750 sub load_spreadsheet_expirationdates {
|
my @tmp = &Apache::lonnet::dump('nohist_expirationdates', |
my @tmp = &Apache::lonnet::dump('nohist_expirationdates', |
$ENV{'course.'.$cid.'.domain'}, |
$ENV{'course.'.$cid.'.domain'}, |
$ENV{'course.'.$cid.'.num'}); |
$ENV{'course.'.$cid.'.num'}); |
if (lc($tmp[0])!~/^error/){ |
if (lc($tmp[0]) !~ /^error/){ |
%expiredates = @tmp; |
%expiredates = @tmp; |
} |
} |
} |
} |
Line 3110 ENDSCRIPT
|
Line 3118 ENDSCRIPT
|
if ($sheet->{'sheettype'} eq 'studentcalc') { |
if ($sheet->{'sheettype'} eq 'studentcalc') { |
$r->print('<p>Show rows with empty A column: '); |
$r->print('<p>Show rows with empty A column: '); |
} else { |
} else { |
$r->print('<p>>Show empty rows: '); |
$r->print('<p>Show empty rows: '); |
} |
} |
# |
# |
$r->print(&hiddenfield('userselhidden','true'). |
$r->print(&hiddenfield('userselhidden','true'). |