--- loncom/interface/Attic/lonspreadsheet.pm 2002/09/09 17:18:33 1.108
+++ loncom/interface/Attic/lonspreadsheet.pm 2002/10/22 13:29:57 1.122
@@ -1,5 +1,5 @@
#
-# $Id: lonspreadsheet.pm,v 1.108 2002/09/09 17:18:33 matthew Exp $
+# $Id: lonspreadsheet.pm,v 1.122 2002/10/22 13:29:57 matthew Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -26,16 +26,6 @@
# The LearningOnline Network with CAPA
# Spreadsheet/Grades Display Handler
#
-# 11/11,11/15,11/27,12/04,12/05,12/06,12/07,
-# 12/08,12/09,12/11,12/12,12/15,12/16,12/18,12/19,12/30,
-# 01/01/01,02/01,03/01,19/01,20/01,22/01,
-# 03/05,03/08,03/10,03/12,03/13,03/15,03/17,
-# 03/19,03/20,03/21,03/27,04/05,04/09,
-# 07/09,07/14,07/21,09/01,09/10,9/11,9/12,9/13,9/14,9/17,
-# 10/16,10/17,10/20,11/05,11/28,12/27 Gerd Kortemeyer
-# 01/14/02 Matthew
-# 02/04/02 Matthew
-
# POD required stuff:
=head1 NAME
@@ -54,7 +44,6 @@ not the grades of their peers. The spre
offering the ability to use Perl code to manipulate data, as well as many
built-in functions.
-
=head2 Functions available to user of lonspreadsheet
=over 4
@@ -72,6 +61,12 @@ use Apache::Constants qw(:common :http);
use GDBM_File;
use HTML::TokeParser;
use Apache::lonhtmlcommon;
+use Apache::loncoursedata;
+#
+# Caches for coursewide information
+#
+my %Section;
+
#
# Caches for previously calculated spreadsheets
#
@@ -122,60 +117,9 @@ my $tmpdir;
# =============================================================================
# ===================================== Implements an instance of a spreadsheet
-sub initsheet {
- my $safeeval = new Safe(shift);
- my $safehole = new Safe::Hole;
- $safeeval->permit("entereval");
- $safeeval->permit(":base_math");
- $safeeval->permit("sort");
- $safeeval->deny(":base_io");
- $safehole->wrap(\&Apache::lonnet::EXT,$safeeval,'&EXT');
- $safeeval->share('$@');
- my $code=<<'ENDDEFS';
-# ---------------------------------------------------- Inside of the safe space
-
-#
-# f: formulas
-# t: intermediate format (variable references expanded)
-# v: output values
-# c: preloaded constants (A-column)
-# rl: row label
-# os: other spreadsheets (for student spreadsheet only)
-
-undef %sheet_values;
-undef %t;
-undef %f;
-undef %c;
-undef %rowlabel;
-undef @os;
-
-$maxrow = 0;
-$sheettype = '';
-
-# filename/reference of the sheet
-$filename = '';
-
-# user data
-$uname = '';
-$uhome = '';
-$udom = '';
-
-# course data
-
-$csec = '';
-$chome= '';
-$cnum = '';
-$cdom = '';
-$cid = '';
-$cfn = '';
-
-# symb
-
-$usymb = '';
-
-# error messages
-$errormsg = '';
-
+##
+## mask - used to reside in the safe space.
+##
sub mask {
my ($lower,$upper)=@_;
@@ -199,7 +143,6 @@ sub mask {
$alpha='['.$la.'-Za-'.$ua.']';
}
}
-
if (($ld eq '*') || ($ud eq '*')) {
$num='\d+';
} else {
@@ -219,7 +162,9 @@ sub mask {
} else {
my @lda=($ld=~m/\d/g);
my @uda=($ud=~m/\d/g);
- my $i; $j=0; $notdone=1;
+ my $i;
+ my $j=0;
+ my $notdone=1;
for ($i=0;($i<=$#lda)&&($notdone);$i++) {
if ($lda[$i]==$uda[$i]) {
$num.=$lda[$i];
@@ -252,6 +197,81 @@ sub mask {
return '^'.$alpha.$num."\$";
}
+
+
+sub initsheet {
+ my $safeeval = new Safe(shift);
+ my $safehole = new Safe::Hole;
+ $safeeval->permit("entereval");
+ $safeeval->permit(":base_math");
+ $safeeval->permit("sort");
+ $safeeval->deny(":base_io");
+ $safehole->wrap(\&Apache::lonnet::EXT,$safeeval,'&EXT');
+ $safehole->wrap(\&Apache::lonspreadsheet::mask,$safeeval,'&mask');
+ $safeeval->share('$@');
+ my $code=<<'ENDDEFS';
+# ---------------------------------------------------- Inside of the safe space
+
+#
+# f: formulas
+# t: intermediate format (variable references expanded)
+# v: output values
+# c: preloaded constants (A-column)
+# rl: row label
+# os: other spreadsheets (for student spreadsheet only)
+
+undef %sheet_values; # Holds the (computed, final) values for the sheet
+ # This is only written to by &calc, the spreadsheet computation routine.
+ # It is read by many functions
+undef %t; # Holds the values of the spreadsheet temporarily. Set in &sett,
+ # which does the translation of strings like C5 into the value in C5.
+ # Used in &calc - %t holds the values that are actually eval'd.
+undef %f; # Holds the formulas for each cell. This is the users
+ # (spreadsheet authors) data for each cell.
+ # set by &setformulas and returned by &getformulas
+ # &setformulas is called by &readsheet, &tmpread, &updateclasssheet,
+ # &updatestudentassesssheet, &loadstudent, &loadcourse
+ # &getformulas is called by &writesheet, &tmpwrite, &updateclasssheet,
+ # &updatestudentassesssheet, &loadstudent, &loadcourse, &loadassessment,
+undef %c; # Holds the constants for a sheet. In the assessment
+ # sheets, this is the A column. Used in &MINPARM, &MAXPARM, &expandnamed,
+ # &sett, and &setconstants. There is no &getconstants.
+ # &setconstants is called by &loadstudent, &loadcourse, &load assessment,
+undef %rowlabel; # Holds the 'prefix' for each row. Set by &setrowlabels.
+ # &setrowlabels is called by &updateclasssheet, &updatestudentassesssheet,
+undef @os; # Holds the names of other spreadsheets - this is used to specify
+ # the spreadsheets that are available for the assessment sheet.
+ # Set by &setothersheets. &setothersheets is called by &handler. A
+ # related subroutine is &othersheets.
+
+$maxrow = 0;
+$sheettype = '';
+
+# filename/reference of the sheet
+$filename = '';
+
+# user data
+$uname = '';
+$uhome = '';
+$udom = '';
+
+# course data
+
+$csec = '';
+$chome= '';
+$cnum = '';
+$cdom = '';
+$cid = '';
+$coursefilename = '';
+
+# symb
+
+$usymb = '';
+
+# error messages
+$errormsg = '';
+
+
#-------------------------------------------------------
=item UWCALC(hashname,modules,units,date)
@@ -863,7 +883,7 @@ sub sett {
}
# Deal with the normal cells
foreach (keys(%f)) {
- if (($f{$_}) && ($_!~/template\_/)) {
+ if (exists($f{$_}) && ($_!~/template\_/)) {
my $matches=($_=~/^$pattern(\d+)/);
if (($matches) && ($1)) {
unless ($f{$_}=~/^\!/) {
@@ -924,45 +944,60 @@ sub calc {
return '';
}
+# ------------------------------------------- End of "Inside of the safe space"
+ENDDEFS
+ $safeeval->reval($code);
+ return $safeeval;
+}
+
+#
+# This is actually used for the student spreadsheet, not the assessment sheet
+# Do not be fooled by the name!
+#
sub templaterow {
+ my $sheet = shift;
my @cols=();
$cols[0]='Template';
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',
'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') {
- my $fm=$f{'template_'.$_};
+ my $fm=$sheet->{'f'}->{'template_'.$_};
$fm=~s/[\'\"]/\&\#34;/g;
push(@cols,"'template_$_','$fm'".'___eq___'.$fm);
}
return @cols;
}
-#
-# This is actually used for the student spreadsheet, not the assessment sheet
-# Do not be fooled by the name!
-#
+
sub outrowassess {
# $n is the current row number
- my $n=shift;
+ my $sheet = shift;
+ my $n=shift;
+ my $csv = $ENV{'form.showcsv'};
my @cols=();
if ($n) {
- my ($usy,$ufn)=split(/__&&&\__/,$f{'A'.$n});
- if ($rowlabel{$usy}) {
- $cols[0]=$rowlabel{$usy}.' '.
+ my ($usy,$ufn)=split(/__&&&\__/,$sheet->{'f'}->{'A'.$n});
+ if ($sheet->{'rowlabel'}->{$usy}) {
+ $cols[0]=$sheet->{'rowlabel'}->{$usy};
+ if (! $csv) {
+ $cols[0].=' '.
'';
}
- $cols[0].='';
} else {
$cols[0]='Export';
}
@@ -970,18 +1005,19 @@ sub outrowassess {
'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',
'n','o','p','q','r','s','t','u','v','w','x','y','z') {
- my $fm=$f{$_.$n};
+ my $fm=$sheet->{'f'}->{$_.$n};
$fm=~s/[\'\"]/\&\#34;/g;
- push(@cols,"'$_$n','$fm'".'___eq___'.$sheet_values{$_.$n});
+ push(@cols,"'$_$n','$fm'".'___eq___'.$sheet->{'values'}->{$_.$n});
}
return @cols;
}
sub outrow {
+ my $sheet=shift;
my $n=shift;
my @cols=();
if ($n) {
- $cols[0]=$rowlabel{$f{'A'.$n}};
+ $cols[0]=$sheet->{'rowlabel'}->{$sheet->{'f'}->{'A'.$n}};
} else {
$cols[0]='Export';
}
@@ -989,197 +1025,78 @@ sub outrow {
'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',
'n','o','p','q','r','s','t','u','v','w','x','y','z') {
- my $fm=$f{$_.$n};
+ my $fm=$sheet->{'f'}->{$_.$n};
$fm=~s/[\'\"]/\&\#34;/g;
- push(@cols,"'$_$n','$fm'".'___eq___'.$sheet_values{$_.$n});
+ push(@cols,"'$_$n','$fm'".'___eq___'.$sheet->{'values'}->{$_.$n});
}
return @cols;
}
-sub exportrowa {
- my @exportarray=();
- 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') {
- push(@exportarray,$sheet_values{$_.'0'});
- }
- return @exportarray;
-}
-
-# ------------------------------------------- End of "Inside of the safe space"
-ENDDEFS
- $safeeval->reval($code);
- return $safeeval;
-}
-
# ------------------------------------------------ Add or change formula values
-
sub setformulas {
- my ($safeeval,%f)=@_;
- %{$safeeval->varglob('f')}=%f;
+ my ($sheet)=shift;
+ %{$sheet->{'safe'}->varglob('f')}=%{$sheet->{'f'}};
}
# ------------------------------------------------ Add or change formula values
-
sub setconstants {
- my ($safeeval,%c)=@_;
- %{$safeeval->varglob('c')}=%c;
+ my ($sheet)=shift;
+ my ($constants) = @_;
+ if (! ref($constants)) {
+ my %tmp = @_;
+ $constants = \%tmp;
+ }
+ $sheet->{'constants'} = $constants;
+ return %{$sheet->{'safe'}->varglob('c')}=%{$sheet->{'constants'}};
}
# --------------------------------------------- Set names of other spreadsheets
-
sub setothersheets {
- my ($safeeval,@os)=@_;
- @{$safeeval->varglob('os')}=@os;
+ my $sheet = shift;
+ my @othersheets = @_;
+ $sheet->{'othersheets'} = \@othersheets;
+ @{$sheet->{'safe'}->varglob('os')}=@othersheets;
+ return;
}
# ------------------------------------------------ Add or change formula values
-
sub setrowlabels {
- my ($safeeval,%rowlabel)=@_;
- %{$safeeval->varglob('rowlabel')}=%rowlabel;
+ my $sheet=shift;
+ %{$sheet->{'safe'}->varglob('rowlabel')}=%{$sheet->{'rowlabel'}};
}
# ------------------------------------------------------- Calculate spreadsheet
-
sub calcsheet {
- my $safeeval=shift;
- return $safeeval->reval('&calc();');
-}
-
-# ------------------------------------------------------------------ Get values
-
-sub getvalues {
- my $safeeval=shift;
- return $safeeval->reval('%sheet_values');
+ my $sheet=shift;
+ my $result = $sheet->{'safe'}->reval('&calc();');
+ %{$sheet->{'values'}} = %{$sheet->{'safe'}->varglob('sheet_values')};
+ return $result;
}
# ---------------------------------------------------------------- Get formulas
-
sub getformulas {
- my $safeeval=shift;
- return %{$safeeval->varglob('f')};
+ my $sheet = shift;
+ return %{$sheet->{'safe'}->varglob('f')};
}
# ----------------------------------------------------- Get value of $f{'A'.$n}
-
sub getfa {
- my ($safeeval,$n)=@_;
- return $safeeval->reval('$f{"A'.$n.'"}');
-}
-
-# -------------------------------------------------------------------- Get type
-
-sub gettype {
- my $safeeval=shift;
- return $safeeval->reval('$sheettype');
-}
-
-# ------------------------------------------------------------------ Set maxrow
-
-sub setmaxrow {
- my ($safeeval,$row)=@_;
- $safeeval->reval('$maxrow='.$row.';');
-}
-
-# ------------------------------------------------------------------ Get maxrow
-
-sub getmaxrow {
- my $safeeval=shift;
- return $safeeval->reval('$maxrow');
-}
-
-# ---------------------------------------------------------------- Set filename
-
-sub setfilename {
- my ($safeeval,$fn)=@_;
- $safeeval->reval('$filename="'.$fn.'";');
-}
-
-# ---------------------------------------------------------------- Get filename
-
-sub getfilename {
- my $safeeval=shift;
- return $safeeval->reval('$filename');
-}
-
-# --------------------------------------------------------------- Get course ID
-
-sub getcid {
- my $safeeval=shift;
- return $safeeval->reval('$cid');
-}
-
-# --------------------------------------------------------- Get course filename
-
-sub getcfn {
- my $safeeval=shift;
- return $safeeval->reval('$cfn');
-}
-
-# ----------------------------------------------------------- Get course number
-
-sub getcnum {
- my $safeeval=shift;
- return $safeeval->reval('$cnum');
-}
-
-# ------------------------------------------------------------- Get course home
-
-sub getchome {
- my $safeeval=shift;
- return $safeeval->reval('$chome');
-}
-
-# ----------------------------------------------------------- Get course domain
-
-sub getcdom {
- my $safeeval=shift;
- return $safeeval->reval('$cdom');
-}
-
-# ---------------------------------------------------------- Get course section
-
-sub getcsec {
- my $safeeval=shift;
- return $safeeval->reval('$csec');
-}
-
-# --------------------------------------------------------------- Get user name
-
-sub getuname {
- my $safeeval=shift;
- return $safeeval->reval('$uname');
-}
-
-# ------------------------------------------------------------- Get user domain
-
-sub getudom {
- my $safeeval=shift;
- return $safeeval->reval('$udom');
-}
-
-# --------------------------------------------------------------- Get user home
-
-sub getuhome {
- my $safeeval=shift;
- return $safeeval->reval('$uhome');
-}
-
-# -------------------------------------------------------------------- Get symb
-
-sub getusymb {
- my $safeeval=shift;
- return $safeeval->reval('$usymb');
+ my $sheet = shift;
+ my ($n)=@_;
+ return $sheet->{'safe'}->reval('$f{"A'.$n.'"}');
}
# ------------------------------------------------------------- Export of A-row
-
sub exportdata {
- my $safeeval=shift;
- return $safeeval->reval('&exportrowa()');
+ my $sheet=shift;
+ my @exportarray=();
+ 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') {
+ push(@exportarray,$sheet->{'values'}->{$_.'0'});
+ }
+ return @exportarray;
}
-
# ========================================================== End of Spreadsheet
# =============================================================================
@@ -1189,7 +1106,7 @@ sub exportdata {
# --------------------------------------------- Produce output row n from sheet
sub rown {
- my ($safeeval,$n)=@_;
+ my ($sheet,$n)=@_;
my $defaultbg;
my $rowdata='';
my $dataflag=0;
@@ -1204,27 +1121,32 @@ sub rown {
$rowdata.="\n".'"'.$n.'"';
}
my $showf=0;
- my $proc;
+ #
+ # Determine how many pink (uneditable) cells there are in this sheet.
my $maxred=1;
- my $sheettype=&gettype($safeeval);
+ my $sheettype=$sheet->{'sheettype'};
if ($sheettype eq 'studentcalc') {
- $proc='&outrowassess';
$maxred=26;
- } else {
- $proc='&outrow';
- }
- if ($sheettype eq 'assesscalc') {
+ } elsif ($sheettype eq 'assesscalc') {
$maxred=1;
} else {
$maxred=26;
}
- if (&getfa($safeeval,$n)=~/^[\~\-]/) { $maxred=1; }
+ $maxred=1 if (&getfa($sheet,$n)=~/^[\~\-]/);
+ #
+ # Get the proper row
+ my @rowdata;
if ($n eq '-') {
- $proc='&templaterow';
+ @rowdata = &templaterow($sheet);
$n=-1;
$dataflag=1;
+ } elsif ($sheettype eq 'studentcalc') {
+ @rowdata = &outrowassess($sheet,$n);
+ } else {
+ @rowdata = &outrow($sheet,$n);
}
- foreach ($safeeval->reval($proc.'('.$n.')')) {
+ #
+ foreach (@rowdata) {
my $bgcolor=$defaultbg.((($showf-1)/5==int(($showf-1)/5))?'99':'DD');
my ($fm,$vl)=split(/\_\_\_eq\_\_\_/,$_);
if ((($vl ne '') || ($vl eq '0')) &&
@@ -1237,8 +1159,14 @@ sub rown {
if ($vl eq '') {
$vl='#';
}
- $rowdata.='