--- loncom/interface/Attic/lonspreadsheet.pm 2002/10/22 18:54:53 1.123
+++ loncom/interface/Attic/lonspreadsheet.pm 2002/10/29 16:04:13 1.130
@@ -1,5 +1,5 @@
#
-# $Id: lonspreadsheet.pm,v 1.123 2002/10/22 18:54:53 matthew Exp $
+# $Id: lonspreadsheet.pm,v 1.130 2002/10/29 16:04:13 matthew Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -122,20 +122,17 @@ my $tmpdir;
##
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.']';
@@ -188,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].']';
}
}
}
@@ -237,8 +234,6 @@ undef %c; # Holds the constants for a sh
# 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
@@ -754,6 +749,7 @@ parametername should be a string such as
sub MINPARM {
my ($expression) = @_;
my $min = undef;
+ study($expression);
foreach $parameter (keys(%c)) {
next if ($parameter !~ /$expression/);
if ((! defined($min)) || ($min > $c{$parameter})) {
@@ -776,6 +772,7 @@ parametername should be a string such as
sub MAXPARM {
my ($expression) = @_;
my $max = undef;
+ study($expression);
foreach $parameter (keys(%c)) {
next if ($parameter !~ /$expression/);
if ((! defined($min)) || ($max < $c{$parameter})) {
@@ -827,12 +824,15 @@ sub expandnamed {
my $returnvalue = '';
my @matches = ();
$#matches = -1;
+ study $expression;
foreach $parameter (keys(%c)) {
push @matches,$parameter if ($parameter =~ /$expression/);
}
- if ($#matches == 0) {
+ if (scalar(@matches) == 0) {
+ $returnvalue = 'unmatched parameter: '.$parameter;
+ } elsif (scalar(@matches) == 1) {
$returnvalue = '$c{\''.$matches[0].'\'}';
- } elsif ($#matches > 0) {
+ } elsif (scalar(@matches) > 0) {
# more than one match. Look for a concise one
$returnvalue = "'non-unique parameter name : $expression'";
foreach (@matches) {
@@ -841,7 +841,9 @@ sub expandnamed {
}
}
} else {
- $returnvalue = "'bad parameter name : $expression'";
+ # There was a negative number of matches, which indicates
+ # something is wrong with reality. Better warn the user.
+ $returnvalue = 'bizzare parameter: '.$parameter;
}
return $returnvalue;
}
@@ -915,6 +917,32 @@ sub sett {
$t{'A0'}=~s/(^|[^\"\'])\[([^\]]+)\]/$1.&expandnamed($2)/ge;
}
+sub calc {
+ undef %sheet_values;
+ &sett();
+ my $notfinished=1;
+ my $lastcalc='';
+ my $depth=0;
+ while ($notfinished) {
+ $notfinished=0;
+ foreach (keys(%t)) {
+ my $old=$sheet_values{$_};
+ $sheet_values{$_}=eval $t{$_};
+ if ($@) {
+ undef %sheet_values;
+ return $_.': '.$@;
+ }
+ if ($sheet_values{$_} ne $old) { $notfinished=1; $lastcalc=$_; }
+ }
+ $depth++;
+ if ($depth>100) {
+ undef %sheet_values;
+ return $lastcalc.': Maximum calculation depth exceeded';
+ }
+ }
+ return '';
+}
+
# ------------------------------------------- End of "Inside of the safe space"
ENDDEFS
$safeeval->reval($code);
@@ -922,8 +950,7 @@ ENDDEFS
}
#
-# This is actually used for the student spreadsheet, not the assessment sheet
-# Do not be fooled by the name!
+#
#
sub templaterow {
my $sheet = shift;
@@ -950,7 +977,7 @@ sub outrowassess {
if ($n) {
my ($usy,$ufn)=split(/__&&&\__/,$sheet->{'f'}->{'A'.$n});
if ($sheet->{'rowlabel'}->{$usy}) {
- $cols[0]=$sheet->{'rowlabel'}->{$usy};
+ $cols[0]=&format_rowlabel($sheet->{'rowlabel'}->{$usy});
if (! $csv) {
$cols[0].=' '.
''.
@@ -988,7 +1015,7 @@ sub outrow {
my $n=shift;
my @cols=();
if ($n) {
- $cols[0]=$sheet->{'rowlabel'}->{$sheet->{'f'}->{'A'.$n}};
+ $cols[0]=&format_rowlabel($sheet->{'rowlabel'}->{$sheet->{'f'}->{'A'.$n}});
} else {
$cols[0]='Export ';
}
@@ -1004,36 +1031,9 @@ sub outrow {
}
# ------------------------------------------------ Add or change formula values
-sub update_values {
- my $sheet = shift;
- %{$sheet->{'safe'}->varglob('sheet_values')}=%{$sheet->{'values'}};
- return undef;
-}
-
-sub setvalues {
- my $sheet=shift;
- my ($values) = @_;
- $values = {} if (! defined($values));
- if (! ref($values)) {
- my %tmp = @_;
- $values = \%tmp;
- }
- $sheet->{'values'} = $values;
- %{$sheet->{'safe'}->varglob('sheet_values')}=%{$sheet->{'values'}};
- return undef;
-}
-
sub setformulas {
- my $sheet=shift;
- my ($formulas) = @_;
- $formulas = {} if (! defined($formulas));
- if (! ref($formulas)) {
- my %tmp = @_;
- $formulas = \%tmp;
- }
- $sheet->{'f'} = $formulas;
+ my ($sheet)=shift;
%{$sheet->{'safe'}->varglob('f')}=%{$sheet->{'f'}};
- return undef;
}
# ------------------------------------------------ Add or change formula values
@@ -1060,44 +1060,20 @@ sub setothersheets {
# ------------------------------------------------ Add or change formula values
sub setrowlabels {
my $sheet=shift;
- %{$sheet->{'safe'}->varglob('rowlabel')}=%{$sheet->{'rowlabel'}};
+ my ($rowlabel) = @_;
+ if (! ref($rowlabel)) {
+ my %tmp = @_;
+ $rowlabel = \%tmp;
+ }
+ $sheet->{'rowlabel'}=$rowlabel;
}
# ------------------------------------------------------- Calculate spreadsheet
sub calcsheet {
my $sheet=shift;
- &setvalues($sheet,undef);
- $sheet->{'safe'}->reval('&sett();');
- my %t = %{$sheet->{'safe'}->varglob('t')};
- my $notfinished=1;
- my $lastcalc='';
- my $depth=0;
- while ($notfinished) {
- $notfinished=0;
- foreach (keys(%t)) {
- my $old=$sheet->{'values'}->{$_};
- $sheet->{'values'}->{$_}=$sheet->{'safe'}->reval($t{$_}.';');
- if ($@) {
- &setvalues($sheet,undef);
- return $_.': '.$@;
- }
- if ($sheet->{'values'}->{$_} ne $old) {
- $notfinished=1;
- $lastcalc=$_;
- }
- }
- if ($notfinished) {
- %{$sheet->{'safe'}->varglob('sheet_values')} =
- %{$sheet->{'values'}};
- }
-
- $depth++;
- if ($depth>100) {
- &setvalues($sheet,undef);
- return $lastcalc.': Maximum calculation depth exceeded';
- }
- }
- return ;
+ my $result = $sheet->{'safe'}->reval('&calc();');
+ %{$sheet->{'values'}} = %{$sheet->{'safe'}->varglob('sheet_values')};
+ return $result;
}
# ---------------------------------------------------------------- Get formulas
@@ -1119,7 +1095,11 @@ sub exportdata {
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'});
+ if (exists($sheet->{'values'}->{$_.'0'})) {
+ push(@exportarray,$sheet->{'values'}->{$_.'0'});
+ } else {
+ push(@exportarray,'');
+ }
}
return @exportarray;
}
@@ -1259,6 +1239,8 @@ sub outsheet {
# Prepare to output rows
my $row;
#
+ # Sort the rows in some manner
+ #
my @sortby=();
my @sortidx=();
for ($row=1;$row<=$sheet->{'maxrow'};$row++) {
@@ -1381,7 +1363,8 @@ sub readsheet {
my $fstring='';
if ($fstring=$spreadsheets{$cnum.'_'.$cdom.'_'.$stype.'_'.$fn}) {
my %tmp = split(/___;___/,$fstring);
- &setformulas($sheet,\%tmp);
+ $sheet->{'f'} = \%tmp;
+ &setformulas($sheet);
} else {
# Not cached, need to read
my %f=();
@@ -1416,7 +1399,8 @@ sub readsheet {
}
# Cache and set
$spreadsheets{$cnum.'_'.$cdom.'_'.$stype.'_'.$fn}=join('___;___',%f);
- &setformulas($sheet,\%f);
+ $sheet->{'f'}=\%f;
+ &setformulas($sheet);
}
}
@@ -1547,7 +1531,7 @@ sub tmpread {
}
}
if ($nform eq 'changesheet') {
- $fo{'A'.$nfield}=(split(/\_\_\&\&\&\_\_/,$fo{'A'.$nfield}))[0];
+ $fo{'A'.$nfield}=(split(/__&&&\__/,$fo{'A'.$nfield}))[0];
unless ($ENV{'form.sel_'.$nfield} eq 'Default') {
$fo{'A'.$nfield}.='__&&&__'.$ENV{'form.sel_'.$nfield};
}
@@ -1562,7 +1546,8 @@ sub tmpread {
} else {
if ($nfield) { $fo{$nfield}=$nform; }
}
- &setformulas($sheet,\%fo);
+ $sheet->{'f'}=\%fo;
+ &setformulas($sheet);
}
##################################################
@@ -1640,6 +1625,40 @@ 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'}) {
+ $labeldata =~ s/ / /g;
+ }
+ $result = $labeldata;
+ } else {
+ &Apache::lonnet::logthis("lonspreadsheet:bogus rowlabel type: $type");
+ }
+ return $result;
+}
+
# ---------------------------------------------- Update rows for course listing
sub updateclasssheet {
my ($sheet) = @_;
@@ -1662,17 +1681,9 @@ sub updateclasssheet {
my ($studentDomain,$studentName,$end,$start,$id,$studentSection,
$fullname,$status) = @{$classlist->{$student}};
if ($ENV{'form.Status'} eq $status || $ENV{'form.Status'} eq 'Any') {
- my $rowlabel='';
- if ($ENV{'form.showcsv'}) {
- $rowlabel= '"'.join('","',($studentName,$studentDomain,
- $fullname,$studentSection,$id).'"');
- } else {
- $rowlabel='';
- $rowlabel.=$studentSection.' '.$id." ".$fullname;
- $rowlabel.=' ';
- }
- $currentlist{$student}=$rowlabel;
+ $currentlist{$student}=join(':',('student',$studentName,
+ $studentDomain,$fullname,
+ $studentSection,$id));
}
}
#
@@ -1700,73 +1711,60 @@ sub updateclasssheet {
}
#
# New and unknown keys
- foreach (sort keys(%currentlist)) {
- unless ($existing{$_}) {
+ foreach my $student (sort keys(%currentlist)) {
+ unless ($existing{$student}) {
$changed=1;
$sheet->{'maxrow'}++;
- $f{'A'.$sheet->{'maxrow'}}=$_;
+ $f{'A'.$sheet->{'maxrow'}}=$student;
}
}
if ($changed) {
- &setformulas($sheet,\%f);
+ $sheet->{'f'} = \%f;
+ &setformulas($sheet,%f);
}
#
- $sheet->{'rowlabel'} = \%currentlist;
- &setrowlabels($sheet);
+ &setrowlabels($sheet,\%currentlist);
}
# ----------------------------------- Update rows for student and assess sheets
sub updatestudentassesssheet {
my ($sheet) = @_;
+ #
my %bighash;
- my $stype=$sheet->{'sheettype'};
- my $uname=$sheet->{'uname'};
- my $udom =$sheet->{'udom'};
+ #
+ my $stype = $sheet->{'sheettype'};
+ my $uname = $sheet->{'uname'};
+ my $udom = $sheet->{'udom'};
$sheet->{'rowlabel'} = {};
- if ($updatedata
- {$ENV{'request.course.fn'}.'_'.$stype.'_'.$uname.'_'.$udom}) {
- %{$sheet->{'rowlabel'}}=split(/___;___/,
- $updatedata{$ENV{'request.course.fn'}.
- '_'.$stype.'_'.$uname.'_'.$udom});
+ my $identifier =$sheet->{'coursefilename'}.'_'.$stype.'_'.$uname.'_'.$udom;
+ if ($updatedata{$identifier}) {
+ %{$sheet->{'rowlabel'}}=split(/___;___/,$updatedata{$identifier});
} else {
# Tie hash
- tie(%bighash,'GDBM_File',$ENV{'request.course.fn'}.'.db',
+ tie(%bighash,'GDBM_File',$sheet->{'coursefilename'}.'.db',
&GDBM_READER(),0640);
if (! tied(%bighash)) {
return 'Could not access course data';
}
# Get all assessments
- my %allkeys=('timestamp' =>
- 'Timestamp of Last Transaction timestamp',
- 'subnumber' =>
- 'Number of Submissions subnumber',
- 'tutornumber' =>
- 'Number of Tutor Responses tutornumber',
- 'totalpoints' =>
- 'Total Points Granted totalpoints');
- my $adduserstr='';
- if (($uname ne $ENV{'user.name'}) || ($udom ne $ENV{'user.domain'})){
- $adduserstr='&uname='.$uname.'&udom='.$udom;
- }
- my %allassess;
- if (! $ENV{'form.showcsv'}) {
- %allassess =
- ('_feedback' =>'Feedback ',
- '_evaluation' =>'Evaluation ',
- '_tutoring' =>'Tutoring ',
- '_discussion' =>'Discussion '
- );
- } else {
- %allassess =
- ('_feedback' => "Feedback",
- '_evaluation' => "Evaluation",
- '_tutoring' => "Tutoring",
- '_discussion' => "Discussion",
- );
+ #
+ # parameter_labels is used in the assessment sheets to provide labels
+ # for the parameters.
+ my %parameter_labels=
+ ('timestamp' =>
+ 'parameter:Timestamp of Last Transaction timestamp',
+ 'subnumber' =>
+ 'parameter:Number of Submissions subnumber',
+ 'tutornumber' =>
+ 'parameter:Number of Tutor Responses tutornumber',
+ 'totalpoints' =>
+ 'parameter:Total Points Granted totalpoints');
+ #
+ # assesslist holds the descriptions of all assessments
+ my %assesslist;
+ foreach ('Feedback','Evaluation','Tutoring','Discussion') {
+ my $symb = '_'.lc($_);
+ $assesslist{$symb} = join(':',('symb',$symb,$uname,$udom,$_));
}
while (($_,undef) = each(%bighash)) {
next if ($_!~/^src\_(\d+)\.(\d+)$/);
@@ -1778,13 +1776,8 @@ sub updatestudentassesssheet {
my $symb=
&Apache::lonnet::declutter($bighash{'map_id_'.$mapid}).
'___'.$resid.'___'.&Apache::lonnet::declutter($srcf);
- if (! $ENV{'form.showcsv'}) {
- $allassess{$symb}=
- ''.
- $bighash{'title_'.$id}.' ';
- } else {
- $allassess{$symb}=$bighash{'title_'.$id};
- }
+ $assesslist{$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')
@@ -1797,22 +1790,24 @@ sub updatestudentassesssheet {
&Apache::lonnet::metadata($srcf,$key.'.name');
}
$display.=' '.$key;
- $allkeys{$key}=$display;
+ $parameter_labels{$key}='parameter:'.$display;
} # end of foreach
}
} # end of foreach (keys(%bighash))
untie(%bighash);
#
- # %allkeys has a list of storage and parameter displays by unikey
- # %allassess has a list of all resource displays by symb
+ # %parameter_labels has a list of storage and parameter displays by
+ # unikey
+ # %assesslist has a list of all resource, by symb
#
if ($stype eq 'assesscalc') {
- $sheet->{'rowlabel'} = \%allkeys;
+ $sheet->{'rowlabel'} = \%parameter_labels;
} elsif ($stype eq 'studentcalc') {
- $sheet->{'rowlabel'} = \%allassess;
+ $sheet->{'rowlabel'} = \%assesslist;
}
- $updatedata{$ENV{'request.course.fn'}.'_'.$stype.'_'.$uname.'_'.$udom}=
- join('___;___',%{$sheet->{'rowlabel'}});
+ $updatedata{$sheet->{'coursefilename'}.'_'.$stype.'_'
+ .$uname.'_'.$udom}=
+ join('___;___',%{$sheet->{'rowlabel'}});
# Get current from cache
}
# Find discrepancies between the course row table and this
@@ -1849,9 +1844,9 @@ sub updatestudentassesssheet {
}
}
if ($changed) {
- &setformulas($sheet,\%f);
+ $sheet->{'f'} = \%f;
+ &setformulas($sheet);
}
- &setrowlabels($sheet);
#
undef %existing;
}
@@ -1879,7 +1874,7 @@ sub loadstudent {
my $row=$1;
next if (($f{$_}=~/^[\!\~\-]/) || ($row==0));
my ($usy,$ufn)=split(/__&&&\__/,$f{$_});
- @assessdata=&exportsheet($sheet->{'uname'},
+ @assessdata=&exportsheet($sheet,$sheet->{'uname'},
$sheet->{'udom'},
'assesscalc',$usy,$ufn);
my $index=0;
@@ -1901,7 +1896,8 @@ sub loadstudent {
}
$cachedassess='';
undef %cachedstores;
- &setformulas($sheet,\%f);
+ $sheet->{'f'} = \%f;
+ &setformulas($sheet);
&setconstants($sheet,\%c);
}
@@ -1935,8 +1931,8 @@ ENDPOP
next if ($_!~/^A(\d+)/);
my $row=$1;
next if (($f{$_}=~/^[\!\~\-]/) || ($row==0));
- my @studentdata=&exportsheet(split(/\:/,$f{$_}),
- 'studentcalc');
+ my ($sname,$sdom) = split(':',$f{$_});
+ my @studentdata=&exportsheet($sheet,$sname,$sdom,'studentcalc');
undef %userrdatas;
$now++;
$r->print('');
$r->rflush();
@@ -2066,21 +2062,21 @@ sub loadassessment {
if (tie(%parmhash,'GDBM_File',
$sheet->{'coursefilename'}.'_parms.db',&GDBM_READER(),0640)) {
my %f=&getformulas($sheet);
- foreach (keys(%f)) {
- next if ($_!~/^A/);
- next if ($f{$_}=~/^[\!\~\-]/);
- if ($f{$_}=~/^parameter/) {
- if ($thisassess{$f{$_}}) {
- my $val=&parmval($f{$_},$sheet);
- $c{$_}=$val;
- $c{$f{$_}}=$val;
+ 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};
}
}
@@ -2178,8 +2174,14 @@ sub forcedrecalc {
}
# ============================================================== Export handler
+# exportsheet
+# returns the export row for a spreadsheet.
+#
sub exportsheet {
- my ($uname,$udom,$stype,$usymb,$fn)=@_;
+ my ($sheet,$uname,$udom,$stype,$usymb,$fn)=@_;
+ $uname = $uname || $sheet->{'uname'};
+ $udom = $udom || $sheet->{'udom'};
+ $stype = $stype || $sheet->{'sheettype'};
my @exportarr=();
if (defined($usymb) && ($usymb=~/^\_(\w+)/) && (!$fn)) {
$fn='default_'.$1;
@@ -2198,7 +2200,7 @@ sub exportsheet {
}
}
unless ($found) {
- &cachedssheets($uname,$udom,&Apache::lonnet::homeserver($uname,$udom));
+ &cachedssheets($sheet,$uname,$udom);
if ($oldsheets{$key}) {
foreach (split(/___&\___/,$oldsheets{$key})) {
my ($name,$value)=split(/___=___/,$_);
@@ -2226,29 +2228,28 @@ sub exportsheet {
#
# Not cached
#
- my ($sheet)=&makenewsheet($uname,$udom,$stype,$usymb);
- &readsheet($sheet,$fn);
- &updatesheet($sheet);
- &loadrows($sheet);
- &calcsheet($sheet);
- @exportarr=&exportdata($sheet);
+ my ($newsheet)=&makenewsheet($uname,$udom,$stype,$usymb);
+ &readsheet($newsheet,$fn);
+ &updatesheet($newsheet);
+ &loadrows($newsheet);
+ &calcsheet($newsheet);
+ @exportarr=&exportdata($newsheet);
#
# Store now
#
- my $cid=$ENV{'request.course.id'};
+ my $cid=$newsheet->{'cid'};
my $current='';
if ($stype eq 'studentcalc') {
- $current=&Apache::lonnet::reply('get:'.
- $ENV{'course.'.$cid.'.domain'}.':'.
- $ENV{'course.'.$cid.'.num'}.
+ $current=&Apache::lonnet::reply('get:'.$sheet->{'cdom'}.':'.
+ $sheet->{'cnum'}.
':nohist_calculatedsheets:'.
&Apache::lonnet::escape($key),
- $ENV{'course.'.$cid.'.home'});
+ $sheet->{'chome'});
} else {
$current=&Apache::lonnet::reply('get:'.$sheet->{'udom'}.':'.
$sheet->{'uname'}.
':nohist_calculatedsheets_'.
- $ENV{'request.course.id'}.':'.
+ $sheet->{'cid'}.':'.
&Apache::lonnet::escape($key),
$sheet->{'uhome'});
}
@@ -2271,8 +2272,7 @@ sub exportsheet {
&Apache::lonnet::put('nohist_calculatedsheets',
{ $key => $newstore,
$key.time => $now },
- $ENV{'course.'.$cid.'.domain'},
- $ENV{'course.'.$cid.'.num'})
+ $sheet->{'cid'},$sheet->{'cnum'});
} else {
&Apache::lonnet::put('nohist_calculatedsheets_'.$sheet->{'cid'},
{ $key => $newstore,
@@ -2290,17 +2290,11 @@ sub exportsheet {
sub expirationdates {
undef %expiredates;
my $cid=$ENV{'request.course.id'};
- my $reply=&Apache::lonnet::reply('dump:'.
- $ENV{'course.'.$cid.'.domain'}.':'.
- $ENV{'course.'.$cid.'.num'}.
- ':nohist_expirationdates',
- $ENV{'course.'.$cid.'.home'});
- unless ($reply=~/^error\:/) {
- foreach (split(/\&/,$reply)) {
- my ($name,$value)=split(/\=/,$_);
- $expiredates{&Apache::lonnet::unescape($name)}
- =&Apache::lonnet::unescape($value);
- }
+ my @tmp = &Apache::lonnet::dump('nohist_expirationdates',
+ $ENV{'course.'.$cid.'.domain'},
+ $ENV{'course.'.$cid.'.num'});
+ if (lc($tmp[0])!~/^error/){
+ %expiredates = @tmp;
}
}
@@ -2311,16 +2305,13 @@ sub expirationdates {
sub cachedcsheets {
my $cid=$ENV{'request.course.id'};
- my $reply=&Apache::lonnet::reply('dump:'.
- $ENV{'course.'.$cid.'.domain'}.':'.
- $ENV{'course.'.$cid.'.num'}.
- ':nohist_calculatedsheets',
- $ENV{'course.'.$cid.'.home'});
- unless ($reply=~/^error\:/) {
- foreach ( split(/\&/,$reply)) {
- my ($name,$value)=split(/\=/,$_);
- $oldsheets{&Apache::lonnet::unescape($name)}
- =&Apache::lonnet::unescape($value);
+ my @tmp = &Apache::lonnet::dump('nohist_calculatedsheets',
+ $ENV{'course.'.$cid.'.domain'},
+ $ENV{'course.'.$cid.'.num'});
+ if ($tmp[0] !~ /^error/) {
+ my %StupidTempHash = @tmp;
+ while (my ($key,$value) = each %StupidTempHash) {
+ $oldsheets{$key} = $value;
}
}
}
@@ -2331,22 +2322,21 @@ sub cachedcsheets {
#
sub cachedssheets {
- my ($sname,$sdom,$shome)=@_;
- unless (($loadedcaches{$sname.'_'.$sdom}) || ($shome eq 'no_host')) {
- my $cid=$ENV{'request.course.id'};
- my $reply=&Apache::lonnet::reply('dump:'.$sdom.':'.$sname.
- ':nohist_calculatedsheets_'.
- $ENV{'request.course.id'},
- $shome);
- unless ($reply=~/^error\:/) {
- foreach ( split(/\&/,$reply)) {
- my ($name,$value)=split(/\=/,$_);
- $oldsheets{&Apache::lonnet::unescape($name)}
- =&Apache::lonnet::unescape($value);
+ my ($sheet,$uname,$udom) = @_;
+ $uname = $uname || $sheet->{'uname'};
+ $udom = $udom || $sheet->{'udom'};
+ if (! $loadedcaches{$sheet->{'uname'}.'_'.$sheet->{'udom'}}) {
+ my @tmp = &Apache::lonnet::dump('nohist_calculatedsheets',
+ $sheet->{'udom'},
+ $sheet->{'uname'});
+ if ($tmp[0] !~ /^error/) {
+ my %StupidTempHash = @tmp;
+ while (my ($key,$value) = each %StupidTempHash) {
+ $oldsheets{$key} = $value;
+ }
+ $loadedcaches{$sheet->{'uname'}.'_'.$sheet->{'udom'}}=1;
}
}
- $loadedcaches{$sname.'_'.$sdom}=1;
- }
}
# ===================================================== Calculated sheets cache
@@ -2561,7 +2551,7 @@ ENDSCRIPT
} elsif ($sheet->{'sheettype'} eq 'studentcalc') {
$r->print("Loading previously calculated assessment sheets ...\n");
$r->rflush();
- &cachedssheets($sheet->{'uname'},$sheet->{'udom'},$sheet->{'uhome'});
+ &cachedssheets($sheet);
}
# Update sheet, load rows
$r->print("Loaded sheet(s), updating rows ... \n");
@@ -2609,7 +2599,7 @@ ENDSCRIPT
} else {
unless ($ENV{'form.userselhidden'}) {
unless
- ($ENV{'course.'.$ENV{'request.course.id'}.'.hideemptyrows'} eq 'yes') {
+ ($ENV{'course.'.$sheet->{'cid'}.'.hideemptyrows'} eq 'yes') {
$r->print(' checked');
$ENV{'form.showall'}=1;
}