version 1.42, 2001/03/10 22:30:18
|
version 1.51, 2001/03/21 15:38:47
|
Line 4
|
Line 4
|
# 11/11,11/15,11/27,12/04,12/05,12/06,12/07, |
# 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, |
# 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, |
# 01/01/01,02/01,03/01,19/01,20/01,22/01, |
# 03/05,03/08,03/10 Gerd Kortemeyer |
# 03/05,03/08,03/10,03/12,03/13,03/15,03/17, |
|
# 03/19,03/20,03/21 Gerd Kortemeyer |
|
|
package Apache::lonspreadsheet; |
package Apache::lonspreadsheet; |
|
|
Line 18 use GDBM_File;
|
Line 19 use GDBM_File;
|
use HTML::TokeParser; |
use HTML::TokeParser; |
|
|
# |
# |
|
# Caches for previously calculated spreadsheets |
|
# |
|
|
|
my %oldsheets; |
|
my %loadedcaches; |
|
my %expiredates; |
|
|
|
# |
# Cache for stores of an individual user |
# Cache for stores of an individual user |
# |
# |
|
|
Line 1019 sub updateclasssheet {
|
Line 1028 sub updateclasssheet {
|
my $reply=&Apache::lonnet::reply('get:'.$sdom.':'.$sname. |
my $reply=&Apache::lonnet::reply('get:'.$sdom.':'.$sname. |
':environment:firstname&middlename&lastname&generation', |
':environment:firstname&middlename&lastname&generation', |
&Apache::lonnet::homeserver($sname,$sdom)); |
&Apache::lonnet::homeserver($sname,$sdom)); |
$rowlabel=$ssec.' '.$reply{$sname}.'<br>'; |
$rowlabel='<a href="/adm/studentcalc?uname='.$sname. |
|
'&udom='.$sdom.'">'. |
|
$ssec.' '.$reply{$sname}.'<br>'; |
map { |
map { |
$rowlabel.=&Apache::lonnet::unescape($_).' '; |
$rowlabel.=&Apache::lonnet::unescape($_).' '; |
} split(/\&/,$reply); |
} split(/\&/,$reply); |
|
$rowlabel.='</a>'; |
} |
} |
$currentlist{&Apache::lonnet::unescape($name)}=$rowlabel; |
$currentlist{&Apache::lonnet::unescape($name)}=$rowlabel; |
} |
} |
Line 1084 sub updatestudentassesssheet {
|
Line 1096 sub updatestudentassesssheet {
|
my %allkeys=(); |
my %allkeys=(); |
my %allassess=(); |
my %allassess=(); |
|
|
|
my $adduserstr=''; |
|
if ((&getuname($safeeval) ne $ENV{'user.name'}) || |
|
(&getudom($safeeval) ne $ENV{'user.domain'})) { |
|
$adduserstr='&uname='.&getuname($safeeval). |
|
'&udom='.&getudom($safeeval); |
|
} |
|
|
map { |
map { |
if ($_=~/^src\_(\d+)\.(\d+)$/) { |
if ($_=~/^src\_(\d+)\.(\d+)$/) { |
my $mapid=$1; |
my $mapid=$1; |
Line 1096 sub updatestudentassesssheet {
|
Line 1115 sub updatestudentassesssheet {
|
'___'.$resid.'___'. |
'___'.$resid.'___'. |
&Apache::lonnet::declutter($srcf); |
&Apache::lonnet::declutter($srcf); |
$allassess{$symb}= |
$allassess{$symb}= |
'<a href="/adm/assesscalc?usymb='.$symb.'">'.$bighash{'title_'.$id}.'</a>'; |
'<a href="/adm/assesscalc?usymb='.$symb.$adduserstr.'">'. |
|
$bighash{'title_'.$id}.'</a>'; |
if ($stype eq 'assesscalc') { |
if ($stype eq 'assesscalc') { |
map { |
map { |
if (($_=~/^stores\_(.*)/) || ($_=~/^parameter\_(.*)/)) { |
if (($_=~/^stores\_(.*)/) || ($_=~/^parameter\_(.*)/)) { |
Line 1248 sub loadcourse {
|
Line 1268 sub loadcourse {
|
<script> |
<script> |
popwin=open('','popwin','width=400,height=100'); |
popwin=open('','popwin','width=400,height=100'); |
popwin.document.writeln('<html><body bgcolor="#FFFFFF">'+ |
popwin.document.writeln('<html><body bgcolor="#FFFFFF">'+ |
'<h1>Spreadsheet Calculation Progress</h1>'+ |
'<h3>Spreadsheet Calculation Progress</h3>'+ |
'<form name=popremain>'+ |
'<form name=popremain>'+ |
'<input type=text size=35 name=remaining value=Starting></form>'+ |
'<input type=text size=35 name=remaining value=Starting></form>'+ |
'</body></html>'); |
'</body></html>'); |
popwin.document.close(); |
popwin.document.close(); |
popwin.close(); |
|
</script> |
</script> |
ENDPOP |
ENDPOP |
$r->rflush(); |
$r->rflush(); |
Line 1291 ENDPOP
|
Line 1310 ENDPOP
|
} keys %f; |
} keys %f; |
&setformulas($safeeval,%f); |
&setformulas($safeeval,%f); |
&setconstants($safeeval,%c); |
&setconstants($safeeval,%c); |
$r->print('<script>popwin.close</script>'); |
$r->print('<script>popwin.close()</script>'); |
$r->rflush(); |
$r->rflush(); |
} |
} |
|
|
Line 1477 sub loadrows {
|
Line 1496 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) || |
|
&checkthis($uname.':'.$udom.':assesscalc:'.$map,$time) || |
|
&checkthis($uname.':'.$udom.':assesscalc:'.$usymb,$time)) { |
|
return 1; |
|
} |
|
} else { |
|
if (&checkthis('::studentcalc:',$time) || |
|
&checkthis($uname.':'.$udom.':studentcalc:',$time)) { |
|
return 1; |
|
} |
|
} |
|
return 0; |
|
} |
|
|
# ============================================================== Export handler |
# ============================================================== Export handler |
# |
# |
# Non-interactive call from with program |
# Non-interactive call from with program |
# |
# |
|
|
sub exportsheet { |
sub exportsheet { |
|
my ($uname,$udom,$stype,$usymb,$fn)=@_; |
|
my @exportarr=(); |
|
# |
|
# Check if cached |
|
# |
|
|
|
my $key=$uname.':'.$udom.':'.$stype.':'.$usymb; |
|
my $found=''; |
|
|
|
if ($oldsheets{$key}) { |
|
map { |
|
my ($name,$value)=split(/\_\_\_\=\_\_\_/,$_); |
|
if ($name eq $fn) { |
|
$found=$value; |
|
} |
|
} 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=''; |
|
} |
|
} |
|
|
my ($uname,$udom,$stype,$usymb,$fn)=@_; |
if ($found) { |
|
# |
|
# Return what was cached |
|
# |
|
@exportarr=split(/\_\_\_\;\_\_\_/,$found); |
|
|
|
} else { |
|
# |
|
# Not cached |
|
# |
|
|
my $thissheet=&makenewsheet($uname,$udom,$stype,$usymb); |
my $thissheet=&makenewsheet($uname,$udom,$stype,$usymb); |
&readsheet($thissheet,$fn); |
&readsheet($thissheet,$fn); |
&updatesheet($thissheet); |
&updatesheet($thissheet); |
&loadrows($thissheet); |
&loadrows($thissheet); |
&calcsheet($thissheet); |
&calcsheet($thissheet); |
return &exportdata($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:'. |
|
&getudom($thissheet).':'. |
|
&getuname($thissheet). |
|
':nohist_calculatedsheets_'. |
|
$ENV{'request.course.id'}.':'. |
|
&Apache::lonnet::escape($key), |
|
&getuhome($thissheet)); |
|
|
|
} |
|
my %currentlystored=(); |
|
unless ($current=~/^error\:/) { |
|
map { |
|
my ($name,$value)=split(/\_\_\_\=\_\_\_/,$_); |
|
$currentlystored{$name}=$value; |
|
} split(/\_\_\_\&\_\_\_/,&Apache::lonnet::unescape($current)); |
|
} |
|
$currentlystored{$fn}=join('___;___',@exportarr); |
|
|
|
my $newstore=''; |
|
map { |
|
if ($newstore) { $newstore.='___&___'; } |
|
$newstore.=$_.'___=___'.$currentlystored{$_}; |
|
} keys %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:'. |
|
&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; |
|
} |
|
# ============================================================ Expiration Dates |
|
# |
|
# Load previously cached student spreadsheets for this course |
|
# |
|
|
|
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\:/) { |
|
map { |
|
my ($name,$value)=split(/\=/,$_); |
|
$expiredates{&Apache::lonnet::unescape($name)} |
|
=&Apache::lonnet::unescape($value); |
|
} split(/\&/,$reply); |
|
} |
|
} |
|
|
|
# ===================================================== Calculated sheets cache |
|
# |
|
# Load previously cached student spreadsheets for this course |
|
# |
|
|
|
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\:/) { |
|
map { |
|
my ($name,$value)=split(/\=/,$_); |
|
$oldsheets{&Apache::lonnet::unescape($name)} |
|
=&Apache::lonnet::unescape($value); |
|
} split(/\&/,$reply); |
|
} |
} |
} |
|
|
|
# ===================================================== 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 |
# ================================================================ Main handler |
# |
# |
# Interactive call to screen |
# Interactive call to screen |
Line 1661 ENDSCRIPT
|
Line 1887 ENDSCRIPT
|
|
|
$r->print(&hiddenfield('ufn',&getfilename($asheet))); |
$r->print(&hiddenfield('ufn',&getfilename($asheet))); |
|
|
|
# --------------------------------------------------------------- Cached sheets |
|
|
|
&expirationdates(); |
|
|
|
undef %oldsheets; |
|
undef %loadedcaches; |
|
|
|
if (&gettype($asheet) eq 'classcalc') { |
|
$r->print("Loading previously calculated student sheets ...<br>\n"); |
|
$r->rflush(); |
|
&cachedcsheets(); |
|
} elsif (&gettype($asheet) eq 'studentcalc') { |
|
$r->print("Loading previously calculated assessment sheets ...<br>\n"); |
|
$r->rflush(); |
|
&cachedssheets(&getuname($asheet),&getudom($asheet), |
|
&getuhome($asheet)); |
|
} |
|
|
# ----------------------------------------------------- Update sheet, load rows |
# ----------------------------------------------------- Update sheet, load rows |
|
|
$r->print("Loaded sheet, updating rows ...<br>\n"); |
$r->print("Loaded sheet(s), updating rows ...<br>\n"); |
$r->rflush(); |
$r->rflush(); |
|
|
&updatesheet($asheet); |
&updatesheet($asheet); |
Line 1696 ENDSCRIPT
|
Line 1939 ENDSCRIPT
|
|
|
1; |
1; |
__END__ |
__END__ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|