--- 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].='<br>'. '<select name="sel_'.$n.'" onChange="changesheet('.$n.')">'. @@ -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]='<b><font size=+1>Export</font></b>'; } @@ -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 = '<a href="/adm/assesscalc?usymb='.$symb. + '&uname='.$uname.'&udom='.$udom.'">'.$title.'</a>'; + } + } 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 ='<a href="/adm/studentcalc?uname='.$sname. + '&udom='.$sdom.'">'; + $result.=$section.' '.$id." ".$fullname.'</a>'; + } + } elsif ($type eq 'parameter') { + if ($ENV{'form.showcsv'}) { + $labeldata =~ s/<br>/ /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='<a href="/adm/studentcalc?uname='.$studentName. - '&udom='.$studentDomain.'">'; - $rowlabel.=$studentSection.' '.$id." ".$fullname; - $rowlabel.='</a>'; - } - $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<br>timestamp', - 'subnumber' => - 'Number of Submissions<br>subnumber', - 'tutornumber' => - 'Number of Tutor Responses<br>tutornumber', - 'totalpoints' => - 'Total Points Granted<br>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' =>'<a href="/adm/assesscalc?usymb=_feedback'. - $adduserstr.'">Feedback</a>', - '_evaluation' =>'<a href="/adm/assesscalc?usymb=_evaluation'. - $adduserstr.'">Evaluation</a>', - '_tutoring' =>'<a href="/adm/assesscalc?usymb=_tutoring'. - $adduserstr.'">Tutoring</a>', - '_discussion' =>'<a href="/adm/assesscalc?usymb=_discussion'. - $adduserstr.'">Discussion</a>' - ); - } 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<br>timestamp', + 'subnumber' => + 'parameter:Number of Submissions<br>subnumber', + 'tutornumber' => + 'parameter:Number of Tutor Responses<br>tutornumber', + 'totalpoints' => + 'parameter:Total Points Granted<br>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}= - '<a href="/adm/assesscalc?usymb='.$symb.$adduserstr.'">'. - $bighash{'title_'.$id}.'</a>'; - } 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.='<br>'.$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('<script>popwin.document.popremain.remaining.value="'. @@ -1947,7 +1943,7 @@ ENDPOP my $index=0; 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') { - if ($studentdata[$index]) { + if (defined($studentdata[$index++])) { my $col=$_; if ($studentdata[$index]=~/\D/) { $c{$col.$row}="'".$studentdata[$index]."'"; @@ -1957,11 +1953,11 @@ ENDPOP unless ($col eq 'A') { $f{$col.$row}='import'; } - $index++; } } } - &setformulas($sheet,\%f); + $sheet->{'f'}=\%f; + &setformulas($sheet); &setconstants($sheet,\%c); $r->print('<script>popwin.close()</script>'); $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 ...<br>\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; }