--- loncom/interface/Attic/lonspreadsheet.pm 2001/03/17 16:52:30 1.45 +++ loncom/interface/Attic/lonspreadsheet.pm 2001/03/20 20:11:27 1.47 @@ -4,7 +4,8 @@ # 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,12/19,12/30, # 01/01/01,02/01,03/01,19/01,20/01,22/01, -# 03/05,03/08,03/10,03/12,03/13,03/15,03/17 Gerd Kortemeyer +# 03/05,03/08,03/10,03/12,03/13,03/15,03/17, +# 03/19,03/20 Gerd Kortemeyer package Apache::lonspreadsheet; @@ -22,6 +23,8 @@ use HTML::TokeParser; # my %oldsheets; +my %loadedcaches; +my %expiredates; # # Cache for stores of an individual user @@ -1485,6 +1488,34 @@ sub loadrows { } } +# ======================================================= Forced recalculation? + +sub checkthis { + my ($keyname,$time)=@_; + return ($time<$expiredates{$keyname}); +} +sub forcedrecalc { + my ($uname,$udom,$stype,$usymb)=@_; + my $key=$uname.':'.$udom.':'.$stype.':'.$usymb; + my $time=$oldsheets{$key.'.time'}; + unless ($time) { return 1; } + if ($stype eq 'assesscalc') { + my $map=(split(/\_\_\_/,$usymb))[0]; + if (&checkthis('::assesscalc:',$time) || + &checkthis('::assesscalc:'.$map,$time) || + &checkthis('::assesscalc:'.$usymb,$time) || + &checkthis($uname.':'.$udom.':assesscalc:',$time)) { + return 1; + } + } else { + if (&checkthis('::studentcalc:',$time) || + &checkthis($uname.':'.$udom.':studencalc:',$time)) { + return 1; + } + } + return 0; +} + # ============================================================== Export handler # # Non-interactive call from with program @@ -1496,6 +1527,7 @@ sub exportsheet { # # Check if cached # + my $key=$uname.':'.$udom.':'.$stype.':'.$usymb; my $found=''; @@ -1508,6 +1540,26 @@ sub exportsheet { } split(/\_\_\_\&\_\_\_/,$oldsheets{$key}); } + unless ($found) { + &cachedssheets($uname,$udom,&Apache::lonnet::homeserver($uname,$udom)); + if ($oldsheets{$key}) { + map { + my ($name,$value)=split(/\_\_\_\=\_\_\_/,$_); + if ($name eq $fn) { + $found=$value; + } + } split(/\_\_\_\&\_\_\_/,$oldsheets{$key}); + } + } +# +# Check if still valid +# + if ($found) { + if (&forcedrecalc($uname,$udom,$stype,$usymb)) { + $found=''; + } + } + if ($found) { # # Return what was cached @@ -1517,7 +1569,8 @@ sub exportsheet { } else { # # Not cached -# +# + my $thissheet=&makenewsheet($uname,$udom,$stype,$usymb); &readsheet($thissheet,$fn); &updatesheet($thissheet); @@ -1528,12 +1581,24 @@ sub exportsheet { # Store now # my $cid=$ENV{'request.course.id'}; - my $current=&Apache::lonnet::reply('get:'. + 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:'. + &getudom($thissheet).':'. + &getuname($thissheet). + ':nohist_calculatedsheets_'. + $ENV{'request.course.id'}.':'. + &Apache::lonnet::escape($key), + &getuhome($thissheet)); + + } my %currentlystored=(); unless ($current=~/^error\:/) { map { @@ -1548,30 +1613,43 @@ sub exportsheet { if ($newstore) { $newstore.='___&___'; } $newstore.=$_.'___=___'.$currentlystored{$_}; } keys %currentlystored; - &Apache::lonnet::reply('put:'. + 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($newstore).'&'. + &Apache::lonnet::escape($key).'.time='.$now, $ENV{'course.'.$cid.'.home'}); + } else { + &Apache::lonnet::reply('put:'. + &getudom($thissheet).':'. + &getuname($thissheet). + ':nohist_calculatedsheets_'. + $ENV{'request.course.id'}.':'. + &Apache::lonnet::escape($key).'='. + &Apache::lonnet::escape($newstore).'&'. + &Apache::lonnet::escape($key).'.time='.$now, + &getuhome($thissheet)); + } } return @exportarr; } # ===================================================== Calculated sheets cache # -# Load all previously cached spreadsheets for this course +# Load previously cached student spreadsheets for this course # -sub cachedsheets { +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'}); - undef %oldsheets; unless ($reply=~/^error\:/) { map { my ($name,$value)=split(/\=/,$_); @@ -1581,6 +1659,35 @@ sub cachedsheets { } } +# ===================================================== Calculated sheets cache +# +# Load previously cached assessment spreadsheets for this student +# + +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\:/) { + map { + my ($name,$value)=split(/\=/,$_); + $oldsheets{&Apache::lonnet::unescape($name)} + =&Apache::lonnet::unescape($value); + } split(/\&/,$reply); + } + $loadedcaches{$sname.'_'.$sdom}=1; + } +} + +# ===================================================== Calculated sheets cache +# +# Load previously cached assessment spreadsheets for this student +# + # ================================================================ Main handler # # Interactive call to screen @@ -1749,9 +1856,21 @@ ENDSCRIPT $r->print(&hiddenfield('ufn',&getfilename($asheet))); -# ----------------------------------------------------------- Get cached sheets +# --------------------------------------------------------------- Cached sheets - &cachedsheets(); + undef %oldsheets; + undef %loadedcaches; + + if (&gettype($asheet) eq 'classcalc') { + $r->print("Loading previously calculated student sheets ...
\n"); + $r->rflush(); + &cachedcsheets(); + } elsif (&gettype($asheet) eq 'studentcalc') { + $r->print("Loading previously calculated assessment sheets ...
\n"); + $r->rflush(); + &cachedssheets(&getuname($asheet),&getudom($asheet), + &getuhome($asheet)); + } # ----------------------------------------------------- Update sheet, load rows