--- loncom/interface/Attic/lonspreadsheet.pm 2001/01/01 19:28:37 1.24 +++ 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; + } + } +# ---------------------------------------------------------- fn now has a value -# ------------------------------------- Read spreadsheet formulas from a course + &setfilename($safeeval,$fn); -sub readsheet { - my ($safeeval,$fn,$r)=@_; - my %f=(); - if (($fn eq '') || ($fn=~/^default\_/)) { +# ------------------------------------------------------ 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 @@ -1051,8 +1157,7 @@ sub rowazclass { &Apache::lonnet::ssi( '/adm/studentcalc',('utarget' => 'export', 'uname' => $tname, - 'udom' => $tdom, - 'usymb' => $f{$_}))); + 'udom' => $tdom))); my $index=0; map { if ($assessdata[$index]) { @@ -1283,8 +1388,7 @@ ENDSCRIPT &tmpread($sheetone,$r->dir_config('lonDaemons').'/tmp/', $ENV{'form.usymb'}); } else { - &readsheet($sheetone,$ENV{'form.ufn'},$r); - $ENV{'form.ufn'}=&getfilename($sheetone); + unless ($ENV{'form.ufn'}) { } if (&gettype($sheetone) eq 'classcalc') { @@ -1320,6 +1424,18 @@ ENDSCRIPT unless ($reroute) { $r->print('
Saving spreadsheet: '.$reply.'
'); } + if ($ENV{'form.makedefufn'}) { + my $reply=&Apache::lonnet::reply('put:'. + $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.':'. + $ENV{'course.'.$ENV{'request.course.id'}.'.num'}. + ':environment:spreadsheet_default_'. + &gettype($sheetone).'='. + &Apache::lonnet::escape($fname), + $ENV{'course.'.$ENV{'request.course.id'}.'.home'}); + unless ($reroute) { + $r->print('
Making default spreadsheet: '.$reply.'
'); + } + } } } # ------------------------------------------------ Write the modified worksheet @@ -1334,7 +1450,8 @@ ENDSCRIPT $fname=~s/\_[^\_]+$//; if ($fname eq 'default') { $fname='course_default'; } $r->print(''. - '
'); + ' (make default: )
'); } $r->print(&hiddenfield('ufn',$ENV{'form.ufn'})); unless (&gettype($sheetone) eq 'classcalc') { @@ -1352,6 +1469,8 @@ ENDSCRIPT &rowaassess($sheetone,$ENV{'form.usymb'}); } elsif (&gettype($sheetone) eq 'studentcalc') { &rowazstudent($sheetone); + } else { + &rowazclass($sheetone); } my $calcoutput=&calcsheet($sheetone); unless ($reroute) {