--- loncom/interface/Attic/lonspreadsheet.pm 2002/10/07 19:11:39 1.116
+++ loncom/interface/Attic/lonspreadsheet.pm 2002/10/24 15:30:25 1.126
@@ -1,5 +1,5 @@
#
-# $Id: lonspreadsheet.pm,v 1.116 2002/10/07 19:11:39 matthew Exp $
+# $Id: lonspreadsheet.pm,v 1.126 2002/10/24 15:30:25 matthew Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -61,6 +61,7 @@ use Apache::Constants qw(:common :http);
use GDBM_File;
use HTML::TokeParser;
use Apache::lonhtmlcommon;
+use Apache::loncoursedata;
#
# Caches for coursewide information
#
@@ -116,76 +117,22 @@ 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 = '';
-$coursefilename = '';
-
-# symb
-
-$usymb = '';
-
-# error messages
-$errormsg = '';
-
+##
+## mask - used to reside in the safe space.
+##
sub mask {
my ($lower,$upper)=@_;
-
- $lower=~/([A-Za-z]|\*)(\d+|\*)/;
- my $la=$1;
- my $ld=$2;
-
- $upper=~/([A-Za-z]|\*)(\d+|\*)/;
- my $ua=$1;
- my $ud=$2;
+ #
+ my ($la,$ld) = ($lower=~/([A-Za-z]|\*)(\d+|\*)/);
+ my ($ua,$ud) = ($upper=~/([A-Za-z]|\*)(\d+|\*)/);
+ #
my $alpha='';
my $num='';
-
+ #
if (($la eq '*') || ($ua eq '*')) {
$alpha='[A-Za-z]';
} else {
+
if (($la=~/[A-Z]/) && ($ua=~/[A-Z]/) ||
($la=~/[a-z]/) && ($ua=~/[a-z]/)) {
$alpha='['.$la.'-'.$ua.']';
@@ -193,7 +140,6 @@ sub mask {
$alpha='['.$la.'-Za-'.$ua.']';
}
}
-
if (($ld eq '*') || ($ud eq '*')) {
$num='\d+';
} else {
@@ -213,7 +159,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];
@@ -237,8 +185,8 @@ sub mask {
}
$num.=')';
} else {
- if ($lda[$#lda]!=$uda[$#uda]) {
- $num.='['.$lda[$#lda].'-'.$uda[$#uda].']';
+ if ($lda[-1]!=$uda[-1]) {
+ $num.='['.$lda[-1].'-'.$uda[-1].']';
}
}
}
@@ -246,6 +194,79 @@ 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 @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)
@@ -918,45 +939,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]=&format_rowlabel($sheet->{'rowlabel'}->{$usy});
+ if (! $csv) {
+ $cols[0].='
'.
'';
}
- $cols[0].='';
} else {
$cols[0]='Export';
}
@@ -964,18 +1000,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]=&format_rowlabel($sheet->{'rowlabel'}->{$sheet->{'f'}->{'A'.$n}});
} else {
$cols[0]='Export';
}
@@ -983,77 +1020,83 @@ 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;
+ my ($rowlabel) = @_;
+ if (! ref($rowlabel)) {
+ my %tmp = @_;
+ $rowlabel = \%tmp;
+ }
+ $sheet->{'rowlabel'}=$rowlabel;
}
# ------------------------------------------------------- Calculate spreadsheet
sub calcsheet {
- my $safeeval=shift;
- return $safeeval->reval('&calc();');
+ 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.'"}');
+ 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
# =============================================================================
@@ -1063,7 +1106,7 @@ sub exportdata {
# --------------------------------------------- Produce output row n from sheet
sub rown {
- my ($safeeval,$n,$sheetdata)=@_;
+ my ($sheet,$n)=@_;
my $defaultbg;
my $rowdata='';
my $dataflag=0;
@@ -1078,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=$sheetdata->{'sheettype'};
+ 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')) &&
@@ -1137,17 +1185,17 @@ sub rown {
# ------------------------------------------------------------- Print out sheet
sub outsheet {
- my ($r,$safeeval,$sheetdata)=@_;
+ my ($r,$sheet)=@_;
my $maxred = 26; # The maximum number of cells to show as
# red (uneditable)
# To make student sheets uneditable could we
# set $maxred = 52?
#
my $realm='Course'; # 'assessment', 'user', or 'course' sheet
- if ($sheetdata->{'sheettype'} eq 'assesscalc') {
+ if ($sheet->{'sheettype'} eq 'assesscalc') {
$maxred=1;
$realm='Assessment';
- } elsif ($sheetdata->{'sheettype'} eq 'studentcalc') {
+ } elsif ($sheet->{'sheettype'} eq 'studentcalc') {
$maxred=26;
$realm='User';
}
@@ -1176,35 +1224,34 @@ sub outsheet {
}
$tabledata.="$_";
}
- $tabledata.=''.&rown($safeeval,'-',$sheetdata).
- &rown($safeeval,0,$sheetdata);
+ $tabledata.=''.&rown($sheet,'-').
+ &rown($sheet,0);
}
$r->print($tabledata);
#
# Prepare to output rows
my $row;
- my $maxrow=$sheetdata->{'maxrow'};
#
my @sortby=();
my @sortidx=();
- for ($row=1;$row<=$maxrow;$row++) {
- push (@sortby, $safeeval->reval('$f{"A'.$row.'"}'));
+ for ($row=1;$row<=$sheet->{'maxrow'};$row++) {
+ push (@sortby, $sheet->{'safe'}->reval('$f{"A'.$row.'"}'));
push (@sortidx, $row-1);
}
@sortidx=sort { lc($sortby[$a]) cmp lc($sortby[$b]); } @sortidx;
#
# Determine the type of child spreadsheets
my $what='Student';
- if ($sheetdata->{'sheettype'} eq 'assesscalc') {
+ if ($sheet->{'sheettype'} eq 'assesscalc') {
$what='Item';
- } elsif ($sheetdata->{'sheettype'} eq 'studentcalc') {
+ } elsif ($sheet->{'sheettype'} eq 'studentcalc') {
$what='Assessment';
}
#
# Loop through the rows and output them one at a time
my $n=0;
- for ($row=0;$row<$maxrow;$row++) {
- my $thisrow=&rown($safeeval,$sortidx[$row]+1,$sheetdata);
+ for ($row=0;$row<$sheet->{'maxrow'};$row++) {
+ my $thisrow=&rown($sheet,$sortidx[$row]+1);
if ($thisrow) {
if (($n/25==int($n/25)) && (!$ENV{'form.showcsv'})) {
$r->print("\n
\n");
@@ -1227,11 +1274,12 @@ sub outsheet {
# ----------------------------------------------- Read list of available sheets
#
sub othersheets {
- my ($safeeval,$stype,$sheetdata)=@_;
+ my ($sheet,$stype)=@_;
+ $stype = $sheet->{'sheettype'} if (! defined($stype));
#
- my $cnum = $sheetdata->{'cnum'};
- my $cdom = $sheetdata->{'cdom'};
- my $chome = $sheetdata->{'chome'};
+ my $cnum = $sheet->{'cnum'};
+ my $cdom = $sheet->{'cdom'};
+ my $chome = $sheet->{'chome'};
#
my @alternatives=();
my %results=&Apache::lonnet::dump($stype.'_spreadsheets',$cdom,$cnum);
@@ -1275,12 +1323,12 @@ sub parse_sheet {
# -------------------------------------- Read spreadsheet formulas for a course
#
sub readsheet {
- my ($safeeval,$sheetdata,$fn)=@_;
+ my ($sheet,$fn)=@_;
#
- my $stype = $sheetdata->{'sheettype'};
- my $cnum = $sheetdata->{'cnum'};
- my $cdom = $sheetdata->{'cdom'};
- my $chome = $sheetdata->{'chome'};
+ my $stype = $sheet->{'sheettype'};
+ my $cnum = $sheet->{'cnum'};
+ my $cdom = $sheet->{'cdom'};
+ my $chome = $sheet->{'chome'};
#
if (! defined($fn)) {
# There is no filename. Look for defaults in course and global, cache
@@ -1301,11 +1349,13 @@ sub readsheet {
}
}
# $fn now has a value
- $sheetdata->{'filename'} = $fn;
+ $sheet->{'filename'} = $fn;
# see if sheet is cached
my $fstring='';
if ($fstring=$spreadsheets{$cnum.'_'.$cdom.'_'.$stype.'_'.$fn}) {
- &setformulas($safeeval,split(/\_\_\_\;\_\_\_/,$fstring));
+ my %tmp = split(/___;___/,$fstring);
+ $sheet->{'f'} = \%tmp;
+ &setformulas($sheet);
} else {
# Not cached, need to read
my %f=();
@@ -1340,48 +1390,58 @@ sub readsheet {
}
# Cache and set
$spreadsheets{$cnum.'_'.$cdom.'_'.$stype.'_'.$fn}=join('___;___',%f);
- &setformulas($safeeval,%f);
+ $sheet->{'f'}=\%f;
+ &setformulas($sheet);
}
}
# -------------------------------------------------------- Make new spreadsheet
sub makenewsheet {
my ($uname,$udom,$stype,$usymb)=@_;
- my %sheetdata=();
- $sheetdata{'uname'} = $uname;
- $sheetdata{'udom'} = $udom;
- $sheetdata{'sheettype'} = $stype;
- $sheetdata{'usymb'} = $usymb;
- $sheetdata{'cid'} = $ENV{'request.course.id'};
- $sheetdata{'csec'} = $Section{$uname.':'.$udom};
- $sheetdata{'coursefilename'} = $ENV{'request.course.fn'};
- $sheetdata{'cnum'} = $ENV{'course.'.$ENV{'request.course.id'}.'.num'};
- $sheetdata{'cdom'} = $ENV{'course.'.$ENV{'request.course.id'}.'.domain'};
- $sheetdata{'chome'} = $ENV{'course.'.$ENV{'request.course.id'}.'.home'};
- $sheetdata{'uhome'} = &Apache::lonnet::homeserver($uname,$udom);
-
- my $safeeval=initsheet($stype);
+ my $sheet={};
+ $sheet->{'uname'} = $uname;
+ $sheet->{'udom'} = $udom;
+ $sheet->{'sheettype'} = $stype;
+ $sheet->{'usymb'} = $usymb;
+ $sheet->{'cid'} = $ENV{'request.course.id'};
+ $sheet->{'csec'} = $Section{$uname.':'.$udom};
+ $sheet->{'coursefilename'} = $ENV{'request.course.fn'};
+ $sheet->{'cnum'} = $ENV{'course.'.$ENV{'request.course.id'}.'.num'};
+ $sheet->{'cdom'} = $ENV{'course.'.$ENV{'request.course.id'}.'.domain'};
+ $sheet->{'chome'} = $ENV{'course.'.$ENV{'request.course.id'}.'.home'};
+ $sheet->{'uhome'} = &Apache::lonnet::homeserver($uname,$udom);
+ #
+ #
+ $sheet->{'f'} = {};
+ $sheet->{'constants'} = {};
+ $sheet->{'othersheets'} = [];
+ $sheet->{'rowlabel'} = {};
+ #
#
- # Place all the %sheetdata items into the safe space
+ $sheet->{'safe'}=&initsheet($sheet->{'sheettype'});
+ #
+ # Place all the %$sheet items into the safe space except the safe space
+ # itself
my $initstring = '';
- foreach (keys(%sheetdata)) {
- $initstring.= qq{\$$_="$sheetdata{$_}";};
+ foreach (qw/uname udom sheettype usymb cid csec coursefilename
+ cnum cdom chome uhome/) {
+ $initstring.= qq{\$$_="$sheet->{$_}";};
}
- $safeeval->reval($initstring);
- return $safeeval,\%sheetdata;
+ $sheet->{'safe'}->reval($initstring);
+ return $sheet;
}
# ------------------------------------------------------------ Save spreadsheet
sub writesheet {
- my ($safeeval,$makedef,$sheetdata)=@_;
- my $cid=$sheetdata->{'cid'};
+ my ($sheet,$makedef)=@_;
+ my $cid=$sheet->{'cid'};
if (&Apache::lonnet::allowed('opa',$cid)) {
- my %f=&getformulas($safeeval);
- my $stype= $sheetdata->{'sheettype'};
- my $cnum = $sheetdata->{'cnum'};
- my $cdom = $sheetdata->{'cdom'};
- my $chome= $sheetdata->{'chome'};
- my $fn = $sheetdata->{'filename'};
+ my %f=&getformulas($sheet);
+ my $stype= $sheet->{'sheettype'};
+ my $cnum = $sheet->{'cnum'};
+ my $cdom = $sheet->{'cdom'};
+ my $chome= $sheet->{'chome'};
+ my $fn = $sheet->{'filename'};
# Cache new sheet
$spreadsheets{$cnum.'_'.$cdom.'_'.$stype.'_'.$fn}=join('___;___',%f);
# Write sheet
@@ -1424,24 +1484,24 @@ sub writesheet {
# "Modified workcopy" - interactive only
#
sub tmpwrite {
- my ($safeeval,$sheetdata) = @_;
+ my ($sheet) = @_;
my $fn=$ENV{'user.name'}.'_'.
- $ENV{'user.domain'}.'_spreadsheet_'.$sheetdata->{'usymb'}.'_'.
- $sheetdata->{'filename'};
+ $ENV{'user.domain'}.'_spreadsheet_'.$sheet->{'usymb'}.'_'.
+ $sheet->{'filename'};
$fn=~s/\W/\_/g;
$fn=$tmpdir.$fn.'.tmp';
my $fh;
if ($fh=Apache::File->new('>'.$fn)) {
- print $fh join("\n",&getformulas($safeeval));
+ print $fh join("\n",&getformulas($sheet));
}
}
# ---------------------------------------------------------- Read the temp copy
sub tmpread {
- my ($safeeval,$sheetdata,$nfield,$nform)=@_;
+ my ($sheet,$nfield,$nform)=@_;
my $fn=$ENV{'user.name'}.'_'.
- $ENV{'user.domain'}.'_spreadsheet_'.$sheetdata->{'usymb'}.'_'.
- $sheetdata->{'filename'};
+ $ENV{'user.domain'}.'_spreadsheet_'.$sheet->{'usymb'}.'_'.
+ $sheet->{'filename'};
$fn=~s/\W/\_/g;
$fn=$tmpdir.$fn.'.tmp';
my $fh;
@@ -1477,7 +1537,8 @@ sub tmpread {
} else {
if ($nfield) { $fo{$nfield}=$nform; }
}
- &setformulas($safeeval,%fo);
+ $sheet->{'f'}=\%fo;
+ &setformulas($sheet);
}
##################################################
@@ -1489,7 +1550,7 @@ sub tmpread {
Determine the value of a parameter.
-Inputs: $what, the parameter needed, $safeeval, the safe space
+Inputs: $what, the parameter needed, $sheet, the safe space
Returns: The value of a parameter, or '' if none.
@@ -1505,14 +1566,14 @@ this user and course.
##################################################
##################################################
sub parmval {
- my ($what,$safeeval,$sheetdata)=@_;
- my $symb = $sheetdata->{'usymb'};
+ my ($what,$sheet)=@_;
+ my $symb = $sheet->{'usymb'};
unless ($symb) { return ''; }
#
- my $cid = $sheetdata->{'cid'};
- my $csec = $sheetdata->{'csec'};
- my $uname = $sheetdata->{'uname'};
- my $udom = $sheetdata->{'udom'};
+ my $cid = $sheet->{'cid'};
+ my $csec = $sheet->{'csec'};
+ my $uname = $sheet->{'uname'};
+ my $udom = $sheet->{'udom'};
my $result='';
#
my ($mapname,$id,$fn)=split(/\_\_\_/,$symb);
@@ -1555,94 +1616,86 @@ sub parmval {
return &Apache::lonnet::metadata($fn,$rwhat.'.default');
}
+sub format_rowlabel {
+ my $rowlabel = shift;
+ my ($type,$labeldata) = split(':',$rowlabel,2);
+ my $result = '';
+ if ($type eq 'symb') {
+ my ($symb,$uname,$udom,$title) = split(':',$labeldata);
+ $symb = &Apache::lonnet::unescape($symb);
+ if ($ENV{'form.showcsv'}) {
+ $result = $title;
+ } else {
+ $result = ''.$title.'';
+ }
+ } elsif ($type eq 'student') {
+ my ($sname,$sdom,$fullname,$section,$id) = split(':',$labeldata);
+ if ($ENV{'form.showcsv'}) {
+ $result = '"'.
+ join('","',($sname,$sdom,$fullname,$section,$id).'"');
+ } else {
+ $result ='';
+ $result.=$section.' '.$id." ".$fullname.'';
+ }
+ } elsif ($type eq 'parameter') {
+ if ($ENV{'form.showcsv'}) {
+ $result = $labeldata =~ s/
//g;
+ } else {
+ $result = $labeldata;
+ }
+ } else {
+ &Apache::lonnet::logthis("lonspreadsheet:bogus rowlabel type: $type");
+ }
+ return $result;
+}
+
# ---------------------------------------------- Update rows for course listing
sub updateclasssheet {
- my ($safeeval,$sheetdata) = @_;
- my $cnum =$sheetdata->{'cnum'};
- my $cdom =$sheetdata->{'cdom'};
- my $cid =$sheetdata->{'cid'};
- my $chome =$sheetdata->{'chome'};
+ my ($sheet) = @_;
+ my $cnum =$sheet->{'cnum'};
+ my $cdom =$sheet->{'cdom'};
+ my $cid =$sheet->{'cid'};
+ my $chome =$sheet->{'chome'};
#
%Section = ();
#
# Read class list and row labels
- my %classlist;
- my @tmp = &Apache::lonnet::dump('classlist',$cdom,$cnum);
- if ($tmp[0] !~ /^error/) {
- %classlist = @tmp;
- } else {
- return 'Could not access course data';
- }
- undef @tmp;
+ my $classlist = &Apache::loncoursedata::get_classlist();
+ if (! defined($classlist)) {
+ return 'Could not access course classlist';
+ }
#
my %currentlist=();
- my $now=time;
- foreach my $student (keys(%classlist)) {
- my ($end,$start)=split(/\:/,$classlist{$student});
- my $active=1;
- $active = 0 if (($end) && ($now>$end));
- $active = 1 if ($ENV{'form.Status'} eq 'Any');
- $active = !$active if ($ENV{'form.Status'} eq 'Expired');
- if ($active) {
- my $rowlabel='';
- my ($studentName,$studentDomain)=split(/\:/,$student);
- my $studentSection=&Apache::lonnet::usection($studentDomain,
- $studentName,$cid);
- $Section{$studentName.':'.$studentDomain} = $studentSection;
-# if ($studentSection==-1) {
-# unless ($ENV{'form.showcsv'}) {
-# $rowlabel='Data not available: '.
-# $studentName.'';
-# } else {
-# $rowlabel='ERROR","'.$studentName.
-# '","Data not available","","","';
-# }
-# } else {
- my %reply=&Apache::lonnet::idrget($studentDomain,$studentName);
- my %studentInformation=&Apache::lonnet::get
- ('environment',
- ['lastname','generation','firstname','middlename','id'],
- $studentDomain,$studentName);
- if (! $ENV{'form.showcsv'}) {
- $rowlabel=''.
- $studentSection.' ';
- foreach ('id','firstname','middlename',
- 'lastname','generation'){
- $rowlabel.=$studentInformation{$_}." ";
- }
- $rowlabel.='';
- } else {
- $rowlabel= '"'.join('","',
- ($studentSection,
- $studentInformation{'id'},
- $studentInformation{'firstname'},
- $studentInformation{'middlename'},
- $studentInformation{'lastname'},
- $studentInformation{'generation'})
- ).'"';
- }
- # }
- $currentlist{$student}=$rowlabel;
- } # end of if ($active)
- } # end of foreach my $student (keys(%classlist))
+ foreach my $student (keys(%$classlist)) {
+ my ($studentDomain,$studentName,$end,$start,$id,$studentSection,
+ $fullname,$status) = @{$classlist->{$student}};
+ if ($ENV{'form.Status'} eq $status || $ENV{'form.Status'} eq 'Any') {
+ $currentlist{$student}=join(':',('student',$studentName,
+ $studentDomain,$fullname,
+ $studentSection,$id));
+ }
+ }
#
# Find discrepancies between the course row table and this
#
- my %f=&getformulas($safeeval);
+ my %f=&getformulas($sheet);
my $changed=0;
#
- my $maxrow=0;
+ $sheet->{'maxrow'}=0;
my %existing=();
#
# Now obsolete rows
foreach (keys(%f)) {
if ($_=~/^A(\d+)/) {
- $maxrow=($1>$maxrow)?$1:$maxrow;
+ if ($1 > $sheet->{'maxrow'}) {
+ $sheet->{'maxrow'}= $1;
+ }
$existing{$f{$_}}=1;
unless ((defined($currentlist{$f{$_}})) || (!$1) ||
- ($f{$_}=~/^(\~\~\~|\-\-\-)/)) {
+ ($f{$_}=~/^(~~~|---)/)) {
$f{$_}='!!! Obsolete';
$changed=1;
}
@@ -1653,27 +1706,29 @@ sub updateclasssheet {
foreach (sort keys(%currentlist)) {
unless ($existing{$_}) {
$changed=1;
- $maxrow++;
- $f{'A'.$maxrow}=$_;
+ $sheet->{'maxrow'}++;
+ $f{'A'.$sheet->{'maxrow'}}=$_;
}
}
- if ($changed) { &setformulas($safeeval,%f); }
+ if ($changed) {
+ $sheet->{'f'} = \%f;
+ &setformulas($sheet,%f);
+ }
#
- $sheetdata->{'maxrow'} = $maxrow;
- &setrowlabels($safeeval,%currentlist);
+ &setrowlabels($sheet,\%currentlist);
}
# ----------------------------------- Update rows for student and assess sheets
sub updatestudentassesssheet {
- my ($safeeval,$sheetdata) = @_;
+ my ($sheet) = @_;
my %bighash;
- my $stype=$sheetdata->{'sheettype'};
- my $uname=$sheetdata->{'uname'};
- my $udom =$sheetdata->{'udom'};
- my %current=();
+ my $stype=$sheet->{'sheettype'};
+ my $uname=$sheet->{'uname'};
+ my $udom =$sheet->{'udom'};
+ $sheet->{'rowlabel'} = {};
if ($updatedata
{$ENV{'request.course.fn'}.'_'.$stype.'_'.$uname.'_'.$udom}) {
- %current=split(/\_\_\_\;\_\_\_/,
+ %{$sheet->{'rowlabel'}}=split(/___;___/,
$updatedata{$ENV{'request.course.fn'}.
'_'.$stype.'_'.$uname.'_'.$udom});
} else {
@@ -1684,28 +1739,28 @@ sub updatestudentassesssheet {
return 'Could not access course data';
}
# Get all assessments
+ #
+ # allkeys is used in the assessment sheets to provide labels
+ # for the parameters.
my %allkeys=('timestamp' =>
- 'Timestamp of Last Transaction
timestamp',
+ 'parameter:Timestamp of Last Transaction
timestamp',
'subnumber' =>
- 'Number of Submissions
subnumber',
+ 'parameter:Number of Submissions
subnumber',
'tutornumber' =>
- 'Number of Tutor Responses
tutornumber',
+ 'parameter:Number of Tutor Responses
tutornumber',
'totalpoints' =>
- 'Total Points Granted
totalpoints');
+ 'parameter:Total Points Granted
totalpoints');
my $adduserstr='';
if (($uname ne $ENV{'user.name'}) || ($udom ne $ENV{'user.domain'})){
$adduserstr='&uname='.$uname.'&udom='.$udom;
}
- my %allassess =
- ('_feedback' =>'Feedback',
- '_evaluation' =>'Evaluation',
- '_tutoring' =>'Tutoring',
- '_discussion' =>'Discussion'
- );
+ #
+ # allassess holds the descriptions of all assessments
+ my %allassess;
+ foreach ('Feedback','Evaluation','Tutoring','Discussion') {
+ my $symb = '_'.lc($_);
+ $allassess{$symb} = join(':',('symb',$symb,$uname,$udom,$_));
+ }
while (($_,undef) = each(%bighash)) {
next if ($_!~/^src\_(\d+)\.(\d+)$/);
my $mapid=$1;
@@ -1716,9 +1771,8 @@ sub updatestudentassesssheet {
my $symb=
&Apache::lonnet::declutter($bighash{'map_id_'.$mapid}).
'___'.$resid.'___'.&Apache::lonnet::declutter($srcf);
- $allassess{$symb}=
- ''.
- $bighash{'title_'.$id}.'';
+ $allassess{$symb}='symb:'.&Apache::lonnet::escape($symb).':'
+ .$uname.':'.$udom.':'.$bighash{'title_'.$id};
next if ($stype ne 'assesscalc');
foreach my $key (split(/\,/,
&Apache::lonnet::metadata($srcf,'keys')
@@ -1731,7 +1785,7 @@ sub updatestudentassesssheet {
&Apache::lonnet::metadata($srcf,$key.'.name');
}
$display.='
'.$key;
- $allkeys{$key}=$display;
+ $allkeys{$key}='parameter:'.$display;
} # end of foreach
}
} # end of foreach (keys(%bighash))
@@ -1741,63 +1795,66 @@ sub updatestudentassesssheet {
# %allassess has a list of all resource displays by symb
#
if ($stype eq 'assesscalc') {
- %current=%allkeys;
+ $sheet->{'rowlabel'} = \%allkeys;
} elsif ($stype eq 'studentcalc') {
- %current=%allassess;
+ $sheet->{'rowlabel'} = \%allassess;
}
$updatedata{$ENV{'request.course.fn'}.'_'.$stype.'_'.$uname.'_'.$udom}=
- join('___;___',%current);
+ join('___;___',%{$sheet->{'rowlabel'}});
# Get current from cache
}
# Find discrepancies between the course row table and this
#
- my %f=&getformulas($safeeval);
+ my %f=&getformulas($sheet);
my $changed=0;
- my $maxrow=0;
+ $sheet->{'maxrow'} = 0;
my %existing=();
# Now obsolete rows
foreach (keys(%f)) {
next if ($_!~/^A(\d+)/);
- $maxrow=($1>$maxrow)?$1:$maxrow;
- my ($usy,$ufn)=split(/\_\_\&\&\&\_\_/,$f{$_});
+ if ($1 > $sheet->{'maxrow'}) {
+ $sheet->{'maxrow'} = $1;
+ }
+ my ($usy,$ufn)=split(/__&&&\__/,$f{$_});
$existing{$usy}=1;
- unless ((defined($current{$usy})) || (!$1) ||
- ($f{$_}=~/^(\~\~\~|\-\-\-)/)){
+ unless ((exists($sheet->{'rowlabel'}->{$usy}) &&
+ (defined($sheet->{'rowlabel'}->{$usy})) || (!$1) ||
+ ($f{$_}=~/^(~~~|---)/))){
$f{$_}='!!! Obsolete';
$changed=1;
} elsif ($ufn) {
- $current{$usy}
- =~s/assesscalc\?usymb\=/assesscalc\?ufn\=$ufn\&usymb\=/;
+ $sheet->{'rowlabel'}->{$usy}
+ =~s/assesscalc\?usymb\=/assesscalc\?ufn\=$ufn\&usymb\=/;
}
}
# New and unknown keys
- foreach (keys(%current)) {
+ foreach (keys(%{$sheet->{'rowlabel'}})) {
unless ($existing{$_}) {
$changed=1;
- $maxrow++;
- $f{'A'.$maxrow}=$_;
+ $sheet->{'maxrow'}++;
+ $f{'A'.$sheet->{'maxrow'}}=$_;
}
}
- if ($changed) { &setformulas($safeeval,%f); }
- $sheetdata->{'maxrow'} = $maxrow;
- &setrowlabels($safeeval,%current);
+ if ($changed) {
+ $sheet->{'f'} = \%f;
+ &setformulas($sheet);
+ }
#
- undef %current;
undef %existing;
}
# ------------------------------------------------ Load data for one assessment
sub loadstudent {
- my ($safeeval,$sheetdata)=@_;
+ my ($sheet)=@_;
my %c=();
- my %f=&getformulas($safeeval);
- $cachedassess=$sheetdata->{'uname'}.':'.$sheetdata->{'udom'};
+ my %f=&getformulas($sheet);
+ $cachedassess=$sheet->{'uname'}.':'.$sheet->{'udom'};
# Get ALL the student preformance data
- my @tmp = &Apache::lonnet::dump($sheetdata->{'cid'},
- $sheetdata->{'udom'},
- $sheetdata->{'uname'},
+ my @tmp = &Apache::lonnet::dump($sheet->{'cid'},
+ $sheet->{'udom'},
+ $sheet->{'uname'},
undef);
if ($tmp[0] !~ /^error:/) {
%cachedstores = @tmp;
@@ -1810,8 +1867,8 @@ sub loadstudent {
my $row=$1;
next if (($f{$_}=~/^[\!\~\-]/) || ($row==0));
my ($usy,$ufn)=split(/__&&&\__/,$f{$_});
- @assessdata=&exportsheet($sheetdata->{'uname'},
- $sheetdata->{'udom'},
+ @assessdata=&exportsheet($sheet->{'uname'},
+ $sheet->{'udom'},
'assesscalc',$usy,$ufn);
my $index=0;
foreach ('A','B','C','D','E','F','G','H','I','J','K','L','M',
@@ -1832,16 +1889,17 @@ sub loadstudent {
}
$cachedassess='';
undef %cachedstores;
- &setformulas($safeeval,%f);
- &setconstants($safeeval,%c);
+ $sheet->{'f'} = \%f;
+ &setformulas($sheet);
+ &setconstants($sheet,\%c);
}
# --------------------------------------------------- Load data for one student
#
sub loadcourse {
- my ($safeeval,$sheetdata,$r)=@_;
+ my ($sheet,$r)=@_;
my %c=();
- my %f=&getformulas($safeeval);
+ my %f=&getformulas($sheet);
my $total=0;
foreach (keys(%f)) {
if ($_=~/^A(\d+)/) {
@@ -1892,8 +1950,9 @@ ENDPOP
}
}
}
- &setformulas($safeeval,%f);
- &setconstants($safeeval,%c);
+ $sheet->{'f'}=\%f;
+ &setformulas($sheet);
+ &setconstants($sheet,\%c);
$r->print('');
$r->rflush();
}
@@ -1901,16 +1960,16 @@ ENDPOP
# ------------------------------------------------ Load data for one assessment
#
sub loadassessment {
- my ($safeeval,$sheetdata)=@_;
+ my ($sheet)=@_;
- my $uhome = $sheetdata->{'uhome'};
- my $uname = $sheetdata->{'uname'};
- my $udom = $sheetdata->{'udom'};
- my $symb = $sheetdata->{'usymb'};
- my $cid = $sheetdata->{'cid'};
- my $cnum = $sheetdata->{'cnum'};
- my $cdom = $sheetdata->{'cdom'};
- my $chome = $sheetdata->{'chome'};
+ my $uhome = $sheet->{'uhome'};
+ my $uname = $sheet->{'uname'};
+ my $udom = $sheet->{'udom'};
+ my $symb = $sheet->{'usymb'};
+ my $cid = $sheet->{'cid'};
+ my $cnum = $sheet->{'cnum'};
+ my $cdom = $sheet->{'cdom'};
+ my $chome = $sheet->{'chome'};
my $namespace;
unless ($namespace=$cid) { return ''; }
@@ -1995,29 +2054,29 @@ sub loadassessment {
#
my %c=();
if (tie(%parmhash,'GDBM_File',
- $sheetdata->{'coursefilename'}.'_parms.db',&GDBM_READER(),0640)) {
- my %f=&getformulas($safeeval);
- foreach (keys(%f)) {
- next if ($_!~/^A/);
- next if ($f{$_}=~/^[\!\~\-]/);
- if ($f{$_}=~/^parameter/) {
- if ($thisassess{$f{$_}}) {
- my $val=&parmval($f{$_},$safeeval,$sheetdata);
- $c{$_}=$val;
- $c{$f{$_}}=$val;
+ $sheet->{'coursefilename'}.'_parms.db',&GDBM_READER(),0640)) {
+ my %f=&getformulas($sheet);
+ foreach my $cell (keys(%f)) {
+ next if ($cell !~ /^A/);
+ next if ($f{$cell} =~/^[\!\~\-]/);
+ if ($f{$cell}=~/^parameter/) {
+ if (defined($thisassess{$f{$cell}})) {
+ my $val = &parmval($f{$cell},$sheet);
+ $c{$cell} = $val;
+ $c{$f{$cell}} = $val;
}
} else {
- my $key=$f{$_};
+ my $key=$f{$cell};
my $ckey=$key;
$key=~s/^stores\_/resource\./;
$key=~s/\_/\./g;
- $c{$_}=$returnhash{$key};
+ $c{$cell}=$returnhash{$key};
$c{$ckey}=$returnhash{$key};
}
}
untie(%parmhash);
}
- &setconstants($safeeval,%c);
+ &setconstants($sheet,\%c);
}
# --------------------------------------------------------- Various form fields
@@ -2050,12 +2109,12 @@ sub selectbox {
#
sub updatesheet {
- my ($safeeval,$sheetdata)=@_;
- my $stype=$sheetdata->{'sheettype'};
+ my ($sheet)=@_;
+ my $stype=$sheet->{'sheettype'};
if ($stype eq 'classcalc') {
- return &updateclasssheet($safeeval,$sheetdata);
+ return &updateclasssheet($sheet);
} else {
- return &updatestudentassesssheet($safeeval,$sheetdata);
+ return &updatestudentassesssheet($sheet);
}
}
@@ -2065,14 +2124,14 @@ sub updatesheet {
#
sub loadrows {
- my ($safeeval,$sheetdata,$r)=@_;
- my $stype=$sheetdata->{'sheettype'};
+ my ($sheet,$r)=@_;
+ my $stype=$sheet->{'sheettype'};
if ($stype eq 'classcalc') {
- &loadcourse($safeeval,$sheetdata,$r);
+ &loadcourse($sheet,$r);
} elsif ($stype eq 'studentcalc') {
- &loadstudent($safeeval,$sheetdata);
+ &loadstudent($sheet);
} else {
- &loadassessment($safeeval,$sheetdata);
+ &loadassessment($sheet);
}
}
@@ -2090,7 +2149,7 @@ sub forcedrecalc {
if ($ENV{'form.forcerecalc'}) { return 1; }
unless ($time) { return 1; }
if ($stype eq 'assesscalc') {
- my $map=(split(/\_\_\_/,$usymb))[0];
+ my $map=(split(/___/,$usymb))[0];
if (&checkthis('::assesscalc:',$time) ||
&checkthis('::assesscalc:'.$map,$time) ||
&checkthis('::assesscalc:'.$usymb,$time) ||
@@ -2109,14 +2168,10 @@ sub forcedrecalc {
}
# ============================================================== Export handler
-#
-# Non-interactive call from with program
-#
-
sub exportsheet {
my ($uname,$udom,$stype,$usymb,$fn)=@_;
my @exportarr=();
- if (($usymb=~/^\_(\w+)/) && (!$fn)) {
+ if (defined($usymb) && ($usymb=~/^\_(\w+)/) && (!$fn)) {
$fn='default_'.$1;
}
#
@@ -2125,8 +2180,8 @@ sub exportsheet {
my $key=$uname.':'.$udom.':'.$stype.':'.$usymb;
my $found='';
if ($oldsheets{$key}) {
- foreach (split(/\_\_\_\&\_\_\_/,$oldsheets{$key})) {
- my ($name,$value)=split(/\_\_\_\=\_\_\_/,$_);
+ foreach (split(/___&\___/,$oldsheets{$key})) {
+ my ($name,$value)=split(/___=___/,$_);
if ($name eq $fn) {
$found=$value;
}
@@ -2135,8 +2190,8 @@ sub exportsheet {
unless ($found) {
&cachedssheets($uname,$udom,&Apache::lonnet::homeserver($uname,$udom));
if ($oldsheets{$key}) {
- foreach (split(/\_\_\_\&\_\_\_/,$oldsheets{$key})) {
- my ($name,$value)=split(/\_\_\_\=\_\_\_/,$_);
+ foreach (split(/___&\___/,$oldsheets{$key})) {
+ my ($name,$value)=split(/___=___/,$_);
if ($name eq $fn) {
$found=$value;
}
@@ -2155,72 +2210,65 @@ sub exportsheet {
#
# Return what was cached
#
- @exportarr=split(/\_\_\_\;\_\_\_/,$found);
- } else {
- #
- # Not cached
- #
- my ($thissheet,$sheetdata)=&makenewsheet($uname,$udom,$stype,$usymb);
- &readsheet($thissheet,$sheetdata,$fn);
- &updatesheet($thissheet,$sheetdata);
- &loadrows($thissheet,$sheetdata);
- &calcsheet($thissheet);
- @exportarr=&exportdata($thissheet);
- #
- # Store now
- #
- my $cid=$ENV{'request.course.id'};
- my $current='';
- if ($stype eq 'studentcalc') {
- $current=&Apache::lonnet::reply('get:'.
- $ENV{'course.'.$cid.'.domain'}.':'.
- $ENV{'course.'.$cid.'.num'}.
- ':nohist_calculatedsheets:'.
- &Apache::lonnet::escape($key),
- $ENV{'course.'.$cid.'.home'});
- } else {
- $current=&Apache::lonnet::reply('get:'.$sheetdata->{'udom'}.':'.
- $sheetdata->{'uname'}.
- ':nohist_calculatedsheets_'.
- $ENV{'request.course.id'}.':'.
- &Apache::lonnet::escape($key),
- $sheetdata->{'uhome'});
- }
- my %currentlystored=();
- unless ($current=~/^error\:/) {
- foreach (split(/___&\___/,&Apache::lonnet::unescape($current))) {
- my ($name,$value)=split(/___=___/,$_);
- $currentlystored{$name}=$value;
- }
- }
- $currentlystored{$fn}=join('___;___',@exportarr);
- #
- my $newstore='';
- foreach (keys(%currentlystored)) {
- if ($newstore) { $newstore.='___&___'; }
- $newstore.=$_.'___=___'.$currentlystored{$_};
- }
- my $now=time;
- if ($stype eq 'studentcalc') {
- &Apache::lonnet::reply('put:'.
- $ENV{'course.'.$cid.'.domain'}.':'.
- $ENV{'course.'.$cid.'.num'}.
- ':nohist_calculatedsheets:'.
- &Apache::lonnet::escape($key).'='.
- &Apache::lonnet::escape($newstore).'&'.
- &Apache::lonnet::escape($key).'.time='.$now,
- $ENV{'course.'.$cid.'.home'});
- } else {
- &Apache::lonnet::reply('put:'.
- $sheetdata->{'udom'}.':'.
- $sheetdata->{'uname'}.
- ':nohist_calculatedsheets_'.
- $ENV{'request.course.id'}.':'.
- &Apache::lonnet::escape($key).'='.
- &Apache::lonnet::escape($newstore).'&'.
- &Apache::lonnet::escape($key).'.time='.$now,
- $sheetdata->{'uhome'});
- }
+ @exportarr=split(/___;___/,$found);
+ return @exportarr;
+ }
+ #
+ # Not cached
+ #
+ my ($sheet)=&makenewsheet($uname,$udom,$stype,$usymb);
+ &readsheet($sheet,$fn);
+ &updatesheet($sheet);
+ &loadrows($sheet);
+ &calcsheet($sheet);
+ @exportarr=&exportdata($sheet);
+ #
+ # Store now
+ #
+ my $cid=$ENV{'request.course.id'};
+ my $current='';
+ if ($stype eq 'studentcalc') {
+ $current=&Apache::lonnet::reply('get:'.
+ $ENV{'course.'.$cid.'.domain'}.':'.
+ $ENV{'course.'.$cid.'.num'}.
+ ':nohist_calculatedsheets:'.
+ &Apache::lonnet::escape($key),
+ $ENV{'course.'.$cid.'.home'});
+ } else {
+ $current=&Apache::lonnet::reply('get:'.$sheet->{'udom'}.':'.
+ $sheet->{'uname'}.
+ ':nohist_calculatedsheets_'.
+ $ENV{'request.course.id'}.':'.
+ &Apache::lonnet::escape($key),
+ $sheet->{'uhome'});
+ }
+ my %currentlystored=();
+ unless ($current=~/^error\:/) {
+ foreach (split(/___&\___/,&Apache::lonnet::unescape($current))) {
+ my ($name,$value)=split(/___=___/,$_);
+ $currentlystored{$name}=$value;
+ }
+ }
+ $currentlystored{$fn}=join('___;___',@exportarr);
+ #
+ my $newstore='';
+ foreach (keys(%currentlystored)) {
+ if ($newstore) { $newstore.='___&___'; }
+ $newstore.=$_.'___=___'.$currentlystored{$_};
+ }
+ my $now=time;
+ if ($stype eq 'studentcalc') {
+ &Apache::lonnet::put('nohist_calculatedsheets',
+ { $key => $newstore,
+ $key.time => $now },
+ $ENV{'course.'.$cid.'.domain'},
+ $ENV{'course.'.$cid.'.num'})
+ } else {
+ &Apache::lonnet::put('nohist_calculatedsheets_'.$sheet->{'cid'},
+ { $key => $newstore,
+ $key.time => $now },
+ $sheet->{'udom'},
+ $sheet->{'uname'})
}
return @exportarr;
}
@@ -2304,6 +2352,9 @@ sub cachedssheets {
sub handler {
my $r=shift;
+ if (! exists($ENV{'form.Status'})) {
+ $ENV{'form.Status'} = 'Active';
+ }
# Check this server
my $loaderror=&Apache::lonnet::overloaderror($r);
if ($loaderror) { return $loaderror; }
@@ -2408,7 +2459,7 @@ ENDSCRIPT
}
# Read new sheet or modified worksheet
$r->uri=~/\/(\w+)$/;
- my ($sheet,$sheetdata)=&makenewsheet($aname,$adom,$1,$ENV{'form.usymb'});
+ my ($sheet)=&makenewsheet($aname,$adom,$1,$ENV{'form.usymb'});
#
# If a new formula had been entered, go from work copy
if ($ENV{'form.unewfield'}) {
@@ -2416,20 +2467,19 @@ ENDSCRIPT
$ENV{'form.unewformula'}=~s/\'/\"/g;
$r->print('
New formula: '.$ENV{'form.unewfield'}.'='. $ENV{'form.unewformula'}.'
'); - $sheetdata->{'filename'} = $ENV{'form.ufn'}; - &tmpread($sheet,$sheetdata, - $ENV{'form.unewfield'},$ENV{'form.unewformula'}); + $sheet->{'filename'} = $ENV{'form.ufn'}; + &tmpread($sheet,$ENV{'form.unewfield'},$ENV{'form.unewformula'}); } elsif ($ENV{'form.saveas'}) { - $sheetdata->{'filename'} = $ENV{'form.ufn'}; - &tmpread($sheet,$sheetdata); + $sheet->{'filename'} = $ENV{'form.ufn'}; + &tmpread($sheet); } else { - &readsheet($sheet,$sheetdata,$ENV{'form.ufn'}); + &readsheet($sheet,$ENV{'form.ufn'}); } # Print out user information - unless ($sheetdata->{'sheettype'} eq 'classcalc') { - $r->print('
User: '.$sheetdata->{'uname'}.
- '
Domain: '.$sheetdata->{'udom'});
- $r->print('
Section/Group: '.$sheetdata->{'csec'});
+ if ($sheet->{'sheettype'} ne 'classcalc') {
+ $r->print('
User: '.$sheet->{'uname'}.
+ '
Domain: '.$sheet->{'udom'});
+ $r->print('
Section/Group: '.$sheet->{'csec'});
if ($ENV{'form.usymb'}) {
$r->print('
Assessment: '.
$ENV{'form.usymb'}.'');
@@ -2437,10 +2487,10 @@ ENDSCRIPT
}
#
# Check user permissions
- if (($sheetdata->{'sheettype'} eq 'classcalc' ) ||
- ($sheetdata->{'uname'} ne $ENV{'user.name'} ) ||
- ($sheetdata->{'udom'} ne $ENV{'user.domain'})) {
- unless (&Apache::lonnet::allowed('vgr',$sheetdata->{'cid'})) {
+ if (($sheet->{'sheettype'} eq 'classcalc' ) ||
+ ($sheet->{'uname'} ne $ENV{'user.name'} ) ||
+ ($sheet->{'udom'} ne $ENV{'user.domain'})) {
+ unless (&Apache::lonnet::allowed('vgr',$sheet->{'cid'})) {
$r->print('