--- loncom/interface/Attic/lonspreadsheet.pm 2002/02/04 10:30:58 1.80
+++ loncom/interface/Attic/lonspreadsheet.pm 2002/04/18 20:21:38 1.87
@@ -1,5 +1,5 @@
#
-# $Id: lonspreadsheet.pm,v 1.80 2002/02/04 10:30:58 matthew Exp $
+# $Id: lonspreadsheet.pm,v 1.87 2002/04/18 20:21:38 matthew Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -122,6 +122,8 @@ sub initsheet {
$safeeval->permit("sort");
$safeeval->deny(":base_io");
$safehole->wrap(\&Apache::lonnet::EXT,$safeeval,'&EXT');
+ $safehole->wrap(\&send_msg, $safeeval,"&send_msg");
+ $safehole->wrap(\&send_crit_msg,$safeeval,"&send_crit_msg");
my $code=<<'ENDDEFS';
# ---------------------------------------------------- Inside of the safe space
@@ -508,6 +510,15 @@ sub HASH {
return $Values[-1];
}
+#-------------------------------------------------------
+
+=item NUM(range)
+
+returns the number of items in the range.
+
+=cut
+
+#-------------------------------------------------------
sub NUM {
my $mask=mask(@_);
my $num= $#{@{grep(/$mask/,keys(%v))}}+1;
@@ -527,6 +538,15 @@ sub BIN {
}
+#-------------------------------------------------------
+
+=item SUM(range)
+
+returns the sum of items in the range.
+
+=cut
+
+#-------------------------------------------------------
sub SUM {
my $mask=mask(@_);
my $sum=0;
@@ -536,6 +556,15 @@ sub SUM {
return $sum;
}
+#-------------------------------------------------------
+
+=item MEAN(range)
+
+compute the average of the items in the range.
+
+=cut
+
+#-------------------------------------------------------
sub MEAN {
my $mask=mask(@_);
my $sum=0; my $num=0;
@@ -550,6 +579,15 @@ sub MEAN {
}
}
+#-------------------------------------------------------
+
+=item STDDEV(range)
+
+compute the standard deviation of the items in the range.
+
+=cut
+
+#-------------------------------------------------------
sub STDDEV {
my $mask=mask(@_);
my $sum=0; my $num=0;
@@ -566,6 +604,15 @@ sub STDDEV {
return sqrt($sum/($num-1));
}
+#-------------------------------------------------------
+
+=item PROD(range)
+
+compute the product of the items in the range.
+
+=cut
+
+#-------------------------------------------------------
sub PROD {
my $mask=mask(@_);
my $prod=1;
@@ -575,6 +622,15 @@ sub PROD {
return $prod;
}
+#-------------------------------------------------------
+
+=item MAX(range)
+
+compute the maximum of the items in the range.
+
+=cut
+
+#-------------------------------------------------------
sub MAX {
my $mask=mask(@_);
my $max='-';
@@ -585,6 +641,15 @@ sub MAX {
return $max;
}
+#-------------------------------------------------------
+
+=item MIN(range)
+
+compute the minimum of the items in the range.
+
+=cut
+
+#-------------------------------------------------------
sub MIN {
my $mask=mask(@_);
my $min='-';
@@ -595,12 +660,22 @@ sub MIN {
return $min;
}
+#-------------------------------------------------------
+
+=item SUMMAX(num,lower,upper)
+
+compute the sum of the largest 'num' items in the range from
+'lower' to 'upper'
+
+=cut
+
+#-------------------------------------------------------
sub SUMMAX {
my ($num,$lower,$upper)=@_;
my $mask=mask($lower,$upper);
my @inside=();
foreach (grep /$mask/,keys(%v)) {
- $inside[$#inside+1]=$v{$_};
+ push (@inside,$v{$_});
}
@inside=sort(@inside);
my $sum=0; my $i;
@@ -610,6 +685,16 @@ sub SUMMAX {
return $sum;
}
+#-------------------------------------------------------
+
+=item SUMMIN(num,lower,upper)
+
+compute the sum of the smallest 'num' items in the range from
+'lower' to 'upper'
+
+=cut
+
+#-------------------------------------------------------
sub SUMMIN {
my ($num,$lower,$upper)=@_;
my $mask=mask($lower,$upper);
@@ -774,7 +859,7 @@ sub outrowassess {
'n','o','p','q','r','s','t','u','v','w','x','y','z') {
my $fm=$f{$_.$n};
$fm=~s/[\'\"]/\&\#34;/g;
- $cols[$#cols+1]="'$_$n','$fm'".'___eq___'.$v{$_.$n};
+ push(@cols,"'$_$n','$fm'".'___eq___'.$v{$_.$n});
}
return @cols;
}
@@ -1133,26 +1218,51 @@ sub outsheet {
#
# ----------------------------------------------- Read list of available sheets
#
-
sub othersheets {
my ($safeeval,$stype)=@_;
-
+ #
my $cnum=&getcnum($safeeval);
my $cdom=&getcdom($safeeval);
my $chome=&getchome($safeeval);
-
+ #
my @alternatives=();
- my $result=&Apache::lonnet::reply('dump:'.$cdom.':'.$cnum.':'.
- $stype.'_spreadsheets',$chome);
- if ($result!~/^error\:/) {
- foreach (split(/\&/,$result)) {
- $alternatives[$#alternatives+1]=
- &Apache::lonnet::unescape((split(/\=/,$_))[0]);
- }
- }
+ my %results=&Apache::lonnet::dump($stype.'_spreadsheets',$cdom,$cnum);
+ my ($tmp) = keys(%results);
+ unless ($tmp =~ /^(con_lost|error|no_such_host)/i) {
+ @alternatives = sort (keys(%results));
+ }
return @alternatives;
}
+
+#
+# -------------------------------------- Parse a spreadsheet
+#
+sub parse_sheet {
+ # $sheetxml is a scalar reference or a scalar
+ my ($sheetxml) = @_;
+ if (! ref($sheetxml)) {
+ my $tmp = $sheetxml;
+ $sheetxml = \$tmp;
+ }
+ my %f;
+ my $parser=HTML::TokeParser->new($sheetxml);
+ my $token;
+ while ($token=$parser->get_token) {
+ if ($token->[0] eq 'S') {
+ if ($token->[1] eq 'field') {
+ $f{$token->[2]->{'col'}.$token->[2]->{'row'}}=
+ $parser->get_text('/field');
+ }
+ if ($token->[1] eq 'template') {
+ $f{'template_'.$token->[2]->{'col'}}=
+ $parser->get_text('/template');
+ }
+ }
+ }
+ return \%f;
+}
+
#
# -------------------------------------- Read spreadsheet formulas for a course
#
@@ -1164,17 +1274,19 @@ sub readsheet {
my $cdom=&getcdom($safeeval);
my $chome=&getchome($safeeval);
-# --------- There is no filename. Look for defaults in course and global, cache
-
- unless($fn) {
+ if (! defined($fn)) {
+ # There is no filename. Look for defaults in course and global, cache
unless ($fn=$defaultsheets{$cnum.'_'.$cdom.'_'.$stype}) {
- $fn=&Apache::lonnet::reply('get:'.$cdom.':'.$cnum.
- ':environment:spreadsheet_default_'.$stype,
- $chome);
- unless (($fn) && ($fn!~/^error\:/)) {
- $fn='default_'.$stype;
- }
- $defaultsheets{$cnum.'_'.$cdom.'_'.$stype}=$fn;
+ my %tmphash = &Apache::lonnet::get('environment',
+ ['spreadsheet_default_'.$stype],
+ $cdom,$cnum);
+ my ($tmp) = keys(%tmphash);
+ if ($tmp =~ /^(con_lost|error|no_such_host)/i) {
+ $fn = 'default_'.$stype;
+ } else {
+ $fn = $tmphash{'spreadsheet_default_'.$stype};
+ }
+ $defaultsheets{$cnum.'_'.$cdom.'_'.$stype}=$fn;
}
}
@@ -1193,44 +1305,34 @@ sub readsheet {
my %f=();
if ($fn=~/^default\_/) {
- my $sheetxml='';
- {
+ my $sheetxml='';
my $fh;
my $dfn=$fn;
$dfn=~s/\_/\./g;
if ($fh=Apache::File->new($includedir.'/'.$dfn)) {
- $sheetxml=join('',<$fh>);
- } else {
+ $sheetxml=join('',<$fh>);
+ } else {
$sheetxml='"Error"';
- }
- }
- my $parser=HTML::TokeParser->new(\$sheetxml);
- my $token;
- while ($token=$parser->get_token) {
- if ($token->[0] eq 'S') {
- if ($token->[1] eq 'field') {
- $f{$token->[2]->{'col'}.$token->[2]->{'row'}}=
- $parser->get_text('/field');
- }
- if ($token->[1] eq 'template') {
- $f{'template_'.$token->[2]->{'col'}}=
- $parser->get_text('/template');
+ }
+ %f=%{&parse_sheet(\$sheetxml)};
+ } elsif($fn=~/\/*\.spreadsheet$/) {
+ my $sheetxml=&Apache::lonnet::getfile
+ (&Apache::lonnet::filelocation('',$fn));
+ if ($sheetxml == -1) {
+ $sheetxml='"Error loading spreadsheet '
+ .$fn.'"';
+ }
+ %f=%{&parse_sheet(\$sheetxml)};
+ } else {
+ my $sheet='';
+ my %tmphash = &Apache::lonnet::dump($fn,$cdom,$cnum);
+ my ($tmp) = keys(%tmphash);
+ unless ($tmp =~ /^(con_lost|error|no_such_host)/i) {
+ foreach (keys(%tmphash)) {
+ $f{$_}=$tmphash{$_};
}
- }
- }
- } else {
- my $sheet='';
- my $reply=&Apache::lonnet::reply('dump:'.$cdom.':'.$cnum.':'.$fn,
- $chome);
- unless ($reply=~/^error\:/) {
- $sheet=$reply;
- }
- foreach (split(/\&/,$sheet)) {
- my ($name,$value)=split(/\=/,$_);
- $f{&Apache::lonnet::unescape($name)}=
- &Apache::lonnet::unescape($value);
- }
- }
+ }
+ }
# --------------------------------------------------------------- Cache and set
$spreadsheets{$cnum.'_'.$cdom.'_'.$stype.'_'.$fn}=join('___;___',%f);
&setformulas($safeeval,%f);
@@ -2319,8 +2421,8 @@ $tmpdir=$r->dir_config('lonDaemons').'/t
function celledit(cn,cf) {
var cnf=prompt(cn,cf);
- if (cnf!=null) {
- document.sheet.unewfield.value=cn;
+ if (cnf!=null) {
+ document.sheet.unewfield.value=cn;
document.sheet.unewformula.value=cnf;
document.sheet.submit();
}
@@ -2548,6 +2650,7 @@ ENDSCRIPT
}
}
$r->print('>');
+
if (&gettype($asheet) eq 'classcalc') {
$r->print(
' Output CSV format: