--- loncom/interface/Attic/lonspreadsheet.pm 2001/01/01 20:52:10 1.26 +++ loncom/interface/Attic/lonspreadsheet.pm 2001/01/02 12:12:43 1.27 @@ -3,7 +3,7 @@ # # 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 Gerd Kortemeyer +# 01/01/01,02/01 Gerd Kortemeyer package Apache::lonspreadsheet; @@ -18,9 +18,10 @@ use HTML::TokeParser; # # These cache hashes need to be independent of user, resource and course -# (user and course are in the keys) +# (user and course can/should be in the keys) # -use vars qw(%spreadsheets %courserdatas %userrdatas); +use vars qw(%spreadsheets %courserdatas %userrdatas %defaultsheets); + # # These global hashes are dependent on user, course and resource, # and need to be initialized every time when a sheet is calculated @@ -28,9 +29,6 @@ use vars qw(%spreadsheets %courserdatas my %courseopt; my %useropt; my %parmhash; -my $csec; -my $uname; -my $udom; # ============================================================================= # ===================================== Implements an instance of a spreadsheet @@ -61,8 +59,27 @@ sub initsheet { $maxrow=0; $sheettype=''; + +# filename/reference of the sheet + $filename=''; +# user data +$uname=''; +$uhome=''; +$udom=''; + +# course data + +$csec=''; +$chome=''; +$cnum=''; +$cdom=''; + +# symb + +$usymb=''; + sub mask { my ($lower,$upper)=@_; @@ -452,6 +469,7 @@ sub gettype { my $safeeval=shift; return $safeeval->reval('$sheettype'); } + # ------------------------------------------------------------------ Set maxrow sub setmaxrow { @@ -480,6 +498,62 @@ sub getfilename { return $safeeval->reval('$filename'); } +# ----------------------------------------------------------- Get course number + +sub getcnum { + my $safeeval=shift; + return $safeeval->reval('$cnum'); +} + +# ------------------------------------------------------------- Get course home + +sub getchome { + my $safeeval=shift; + return $safeeval->reval('$chome'); +} + +# ----------------------------------------------------------- Get course domain + +sub getcdom { + my $safeeval=shift; + return $safeeval->reval('$cdom'); +} + +# ---------------------------------------------------------- Get course section + +sub getcsec { + my $safeeval=shift; + return $safeeval->reval('$csec'); +} + +# --------------------------------------------------------------- Get user name + +sub getuname { + my $safeeval=shift; + return $safeeval->reval('$uname'); +} + +# ------------------------------------------------------------- Get user domain + +sub getudom { + my $safeeval=shift; + return $safeeval->reval('$udom'); +} + +# --------------------------------------------------------------- Get user home + +sub getuhome { + my $safeeval=shift; + return $safeeval->reval('$uhome'); +} + +# -------------------------------------------------------------------- Get symb + +sub getusymb { + my $safeeval=shift; + return $safeeval->reval('$usymb'); +} + # ------------------------------------------------------------- Export of A-row sub exportrow { @@ -490,7 +564,9 @@ sub exportrow { # ========================================================== End of Spreadsheet # ============================================================================= - +# +# Procedures for screen output +# # --------------------------------------------- Produce output row n from sheet sub rown { @@ -600,14 +676,46 @@ sub outsheet { $r->print(''); } +# +# -------------------------------------- Read spreadsheet formulas for a course +# +sub readsheet { + my ($safeeval,$fn)=@_; + my $stype=&gettype($safeeval); + my $cnum=&getcnum($safeeval); + +# --------- There is no filename. Look for defaults in course and global, cache + + unless($fn) { + unless ($fn=$defaultsheets{$cnum.'_'.$stype}) { + $fn=&Apache::lonnet::reply('get:'. + $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.':'. + $ENV{'course.'.$ENV{'request.course.id'}.'.num'}. + ':environment:spreadsheet_default_'.&gettype($safeeval), + $ENV{'course.'.$ENV{'request.course.id'}.'.home'}); + unless (($fn) && ($fn!~/^error\:/)) { + $fn='default_'.$stype; + } + $defaultsheets{$cnum.'_'.$stype}=$fn; + } + } -# ------------------------------------- Read spreadsheet formulas from a course +# ---------------------------------------------------------- fn now has a value -sub readsheet { - my ($safeeval,$fn,$r)=@_; - my %f=(); - if (($fn eq '') || ($fn=~/^default\_/)) { + &setfilename($safeeval,$fn); + +# ------------------------------------------------------ see if sheet is cached + my $fstring=''; + if ($fstring=$spreadsheets{$cnum.'_'.$stype.'_'.$fn}) { + &setformulas($sheetone,split(/\_\_\_\;\_\_\_/,$fstring)); + } else { + +# ---------------------------------------------------- Not cached, need to read + + my %f=(); + + if ($fn=~/^default\_/) { my $sheetxml=''; { my $fh; @@ -616,9 +724,9 @@ sub readsheet { $sheetxml=join('',<$fh>); } } - my $parser=HTML::TokeParser->new(\$sheetxml); - my $token; - while ($token=$parser->get_token) { + my $parser=HTML::TokeParser->new(\$sheetxml); + my $token; + while ($token=$parser->get_token) { if ($token->[0] eq 'S') { if ($token->[1] eq 'field') { $f{$token->[2]->{'col'}.$token->[2]->{'row'}}= @@ -629,28 +737,26 @@ sub readsheet { $parser->get_text('/template'); } } - } - &setfilename($safeeval,'default_'.&gettype($safeeval)); - } else { - &setfilename($safeeval,$fn); - unless ($spreadsheets{$fn}) { - $spreadsheets{$fn}=''; - my $reply=&Apache::lonnet::reply('dump:'. + } + } else { + my $sheet=''; + my $reply=&Apache::lonnet::reply('dump:'. $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.':'. $ENV{'course.'.$ENV{'request.course.id'}.'.num'}.':'.$fn, $ENV{'course.'.$ENV{'request.course.id'}.'.home'}); unless ($reply=~/^error\:/) { - $spreadsheets{$fn}=$reply; - } + $sheet=$reply; + } + map { + my ($name,$value)=split(/\=/,$_); + $f{&Apache::lonnet::unescape($name)}= + &Apache::lonnet::unescape($value); + } split(/\&/,$sheet); } - map { - my ($name,$value)=split(/\=/,$_); - $f{&Apache::lonnet::unescape($name)}= - &Apache::lonnet::unescape($value); - } split(/\&/,$spreadsheets{$fn}); +# --------------------------------------------------------------- Cache and set + $spreadsheets{$cnum.'_'.$stype.'_'.$fn}=join('___;___',%f); + &setformulas($safeeval,%f); } - - &setformulas($safeeval,%f); } # ------------------------------------------------------------ Save spreadsheet @@ -1283,21 +1389,6 @@ ENDSCRIPT $ENV{'form.usymb'}); } else { unless ($ENV{'form.ufn'}) { - my $reply=&Apache::lonnet::reply('get:'. - $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.':'. - $ENV{'course.'.$ENV{'request.course.id'}.'.num'}. - ':environment:spreadsheet_default_'. - &gettype($sheetone), - $ENV{'course.'.$ENV{'request.course.id'}.'.home'}); - unless (($reply=~/^error\:/) || ($reply eq '')) { - $ENV{'form.ufn'}=$reply; - unless ($reroute) { - $r->print('

Using customized default spreadsheet

'); - } - } - } - &readsheet($sheetone,$ENV{'form.ufn'},$r); - $ENV{'form.ufn'}=&getfilename($sheetone); } if (&gettype($sheetone) eq 'classcalc') {