--- loncom/interface/Attic/lonspreadsheet.pm 2000/12/18 17:14:49 1.18
+++ loncom/interface/Attic/lonspreadsheet.pm 2000/12/30 19:59:18 1.21
@@ -2,7 +2,7 @@
# 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 Gerd Kortemeyer
+# 12/08,12/09,12/11,12/12,12/15,12/16,12/18,12/19,12/30 Gerd Kortemeyer
package Apache::lonspreadsheet;
@@ -12,8 +12,8 @@ use Safe::Hole;
use Opcode;
use Apache::lonnet;
use Apache::Constants qw(:common :http);
-use HTML::TokeParser;
use GDBM_File;
+use HTML::TokeParser;
#
# These cache hashes need to be independent of user, resource and course
@@ -267,7 +267,26 @@ sub sett {
$pattern='[A-Z]';
}
map {
- if ($f{$_}) {
+ if ($_=~/template\_(\w)/) {
+ my $col=$1;
+ unless ($col=~/^$pattern/) {
+ map {
+ if ($_=~/A(\d+)/) {
+ my $trow=$1;
+ if ($trow) {
+ my $lb=$col.$trow;
+ $t{$lb}=$f{'template_'.$col};
+ $t{$lb}=~s/\#/$trow/g;
+ $t{$lb}=~s/\.\.+/\,/g;
+ $t{$lb}=~s/(^|[^\"\'])([A-Za-z]\d+)/$1\$v\{\'$2\'\}/g;
+ }
+ }
+ } keys %f;
+ }
+ }
+ } keys %f;
+ map {
+ if (($f{$_}) && ($_!~/template\_/)) {
if ($_=~/^$pattern/) {
unless ($f{$_}=~/^\!/) {
$t{$_}=$c{$_};
@@ -309,6 +328,20 @@ sub calc {
return '';
}
+sub templaterow {
+ my @cols=();
+ $cols[0]='Template';
+ map {
+ my $fm=$f{'template_'.$_};
+ $fm=~s/[\'\"]/\&\#34;/g;
+ $cols[$#cols+1]="'template_$_','$fm'".'___eq___'.$fm;
+ } ('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');
+ return @cols;
+}
+
sub outrowassess {
my $n=shift;
my @cols=();
@@ -332,7 +365,7 @@ sub outrow {
my $n=shift;
my @cols=();
if ($n) {
- $cols[0]=$rl{$f{'A'.$n}}.' stuff';
+ $cols[0]=$rl{$f{'A'.$n}};
} else {
$cols[0]='Export';
}
@@ -461,7 +494,12 @@ sub exportrow {
sub rown {
my ($safeeval,$n)=@_;
- my $defaultbg=((($n-1)/5)==int(($n-1)/5))?'#E0E0':'#FFFF';
+ my $defaultbg;
+ unless ($n eq '-') {
+ $defaultbg=((($n-1)/5)==int(($n-1)/5))?'#E0E0':'#FFFF';
+ } else {
+ $defaultbg='#E0FF';
+ }
my $rowdata="\n
$n | ";
my $showf=0;
my $proc;
@@ -473,6 +511,7 @@ sub rown {
$proc='&outrow';
$maxred=26;
}
+ if ($n eq '-') { $proc='&templaterow'; $n=-1; }
map {
my $bgcolor=$defaultbg.((($showf-1)/5==int(($showf-1)/5))?'99':'DD');
my ($fm,$vl)=split(/\_\_\_eq\_\_\_/,$_);
@@ -533,6 +572,7 @@ sub outsheet {
$tabledata.='
';
my $row;
my $maxrow=&getmaxrow($safeeval);
+ $tabledata.=&rown($safeeval,'-');
for ($row=0;$row<=$maxrow;$row++) {
$tabledata.=&rown($safeeval,$row);
}
@@ -541,43 +581,83 @@ sub outsheet {
-# --------------------------------------- Read spreadsheet formulas from a file
+# ------------------------------------- Read spreadsheet formulas from a course
sub readsheet {
- my ($safeeval,$fn)=@_;
- &setfilename($safeeval,$fn);
- $fn=~/\.(\w+)/;
- &settype($safeeval,$1);
+ my ($safeeval,$fn,$r)=@_;
my %f=();
- unless ($spreadsheets{$fn}) {
- $spreadsheets{$fn}='';
+ if (($fn eq '') || ($fn=~/^default\_/)) {
+ my $sheetxml='';
{
my $fh;
- if ($fh=Apache::File->new($fn)) {
- $spreadsheets{$fn}=join('',<$fh>);
- }
+ if ($fh=Apache::File->new($r->dir_config('lonIncludes').
+ '/default.'.&gettype($safeeval))) {
+ $sheetxml=join('',<$fh>);
+ }
}
+ 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');
+ }
+ }
+ }
+ &setfilename($safeeval,'default_'.&gettype($safeeval));
+ } else {
+ &setfilename($safeeval,$fn);
+ unless ($spreadsheets{$fn}) {
+ $spreadsheets{$fn}='';
+ my $reply=&Apache::lonnet::reply('dump:'.
+ $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.':'.
+ $ENV{'course.'.$ENV{'request.course.id'}.'.num'}.':'.$fn,
+ $ENV{'course.'.$ENV{'request.course.id'}.'.home'});
+ unless ($reply=~/^error\:/) {
+ $spreadsheets{$fn}=$reply;
+ }
+ }
+ map {
+ my ($name,$value)=split(/\=/,$_);
+ $f{&Apache::lonnet::unescape($name)}=
+ &Apache::lonnet::unescape($value);
+ } split(/\&/,$spreadsheets{$fn});
}
- {
- my $parser=HTML::TokeParser->new(\$spreadsheets{$fn});
- 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');
- }
- }
- }
- }
+
&setformulas($safeeval,%f);
}
+# ------------------------------------------------------------ Save spreadsheet
+
+sub writesheet {
+ my $safeeval=shift;
+ if (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'})) {
+ my %f=&getformulas($safeeval);
+ my $sheetdata='';
+ map {
+ $sheetdata.=&Apache::lonnet::escape($_).'='.
+ &Apache::lonnet::escape($f{$_}).'&';
+ } keys %f;
+ $sheetdata=~s/\&$//;
+ my $reply=&Apache::lonnet::reply('put:'.
+ $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.':'.
+ $ENV{'course.'.$ENV{'request.course.id'}.'.num'}.':'.
+ &getfilename($safeeval).':'.
+ $sheetdata,
+ $ENV{'course.'.$ENV{'request.course.id'}.'.home'});
+ }
+}
+
# ----------------------------------------------- Make a temp copy of the sheet
sub tmpwrite {
my ($safeeval,$tmpdir,$symb)=@_;
- my $fn=$uname.'_'.$udom.'_spreadsheet_'.&getfilename($safeeval);
+ my $fn=$uname.'_'.$udom.'_spreadsheet_'.$symb.'_'.&getfilename($safeeval);
$fn=~s/\W/\_/g;
$fn=$tmpdir.$fn.'.tmp';
my $fh;
@@ -590,7 +670,7 @@ sub tmpwrite {
sub tmpread {
my ($safeeval,$tmpdir,$symb,$nfield,$nform)=@_;
- my $fn=$uname.'_'.$udom.'_spreadsheet_'.&getfilename($safeeval);
+ my $fn=$uname.'_'.$udom.'_spreadsheet_'.$symb.'_'.&getfilename($safeeval);
$fn=~s/\W/\_/g;
$fn=$tmpdir.$fn.'.tmp';
my $fh;
@@ -981,7 +1061,8 @@ sub handler {
my ($name, $value) = split(/=/,$_);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
- if (($name eq 'uname') || ($name eq 'udom') || ($name eq 'usymb')) {
+ if (($name eq 'uname') || ($name eq 'udom') ||
+ ($name eq 'usymb') || ($name eq 'ufn')) {
unless ($ENV{'form.'.$name}) {
$ENV{'form.'.$name}=$value;
}
@@ -989,7 +1070,6 @@ sub handler {
} (split(/&/,$ENV{'QUERY_STRING'}));
# ------------------------------------------- Nothing there? Must be login user
-
unless ($ENV{'form.uname'}) {
$uname=$ENV{'user.name'};
$udom=$ENV{'user.domain'};
@@ -1027,6 +1107,8 @@ sub handler {
ENDSCRIPT
$r->print(''.
+ '
'.
+ 'LON-CAPA Spreadsheet
'.
'