--- loncom/interface/Attic/lonspreadsheet.pm 2002/07/02 21:57:38 1.92 +++ loncom/interface/Attic/lonspreadsheet.pm 2002/07/15 12:26:51 1.97 @@ -1,5 +1,5 @@ # -# $Id: lonspreadsheet.pm,v 1.92 2002/07/02 21:57:38 www Exp $ +# $Id: lonspreadsheet.pm,v 1.97 2002/07/15 12:26:51 www Exp $ # # Copyright Michigan State University Board of Trustees # @@ -106,6 +106,14 @@ my %courseopt; my %useropt; my %parmhash; +# +# Some hashes for stats on timing and performance +# + +my %starttimes; +my %usedtimes; +my %numbertimes; + # Stuff that only the screen handler can know my $includedir; @@ -122,6 +130,7 @@ sub initsheet { $safeeval->permit("sort"); $safeeval->deny(":base_io"); $safehole->wrap(\&Apache::lonnet::EXT,$safeeval,'&EXT'); + $safeeval->share('$@'); my $code=<<'ENDDEFS'; # ---------------------------------------------------- Inside of the safe space @@ -165,6 +174,10 @@ $cfn=''; $usymb=''; +# error messages + +$errormsg=''; + sub mask { my ($lower,$upper)=@_; @@ -770,6 +783,8 @@ sub sett { } else { $pattern='[A-Z]'; } + +# Deal with the template row foreach (keys(%f)) { if ($_=~/template\_(\w)/) { my $col=$1; @@ -796,6 +811,8 @@ sub sett { } } } + +# Deal with the normal cells foreach (keys(%f)) { if (($f{$_}) && ($_!~/template\_/)) { my $matches=($_=~/^$pattern(\d+)/); @@ -811,6 +828,21 @@ sub sett { } } } +# For inserted lines, [B-Z] is also valid + + unless ($sheettype eq 'assesscalc') { + foreach (keys(%f)) { + if ($_=~/[B-Z](\d+)/) { + if ($f{'A'.$1}=~/^[\~\-]/) { + $t{$_}=$f{$_}; + $t{$_}=~s/\.\.+/\,/g; + $t{$_}=~s/(^|[^\"\'])([A-Za-z]\d+)/$1\$v\{\'$2\'\}/g; + $t{$_}=~s/(^|[^\"\'])\[([^\]]+)\]/$1.&expandnamed($2)/ge; + } + } + } + } + # For some reason 'A0' gets special treatment... This seems superfluous # but I imagine it is here for a reason. $t{'A0'}=$f{'A0'}; @@ -820,25 +852,26 @@ sub sett { } sub calc { - %v=(); + undef %v; &sett(); my $notfinished=1; + my $lastcalc=''; my $depth=0; while ($notfinished) { $notfinished=0; foreach (keys(%t)) { my $old=$v{$_}; - $v{$_}=eval($t{$_}); + $v{$_}=eval $t{$_}; if ($@) { - %v=(); - return $@; + undef %v; + return $_.': '.$@; } - if ($v{$_} ne $old) { $notfinished=1; } + if ($v{$_} ne $old) { $notfinished=1; $lastcalc=$_; } } $depth++; if ($depth>100) { - %v=(); - return 'Maximum calculation depth exceeded'; + undef %v; + return $lastcalc.': Maximum calculation depth exceeded'; } } return ''; @@ -956,7 +989,7 @@ sub setrowlabels { sub calcsheet { my $safeeval=shift; - $safeeval->reval('&calc();'); + return $safeeval->reval('&calc();'); } # ------------------------------------------------------------------ Get values @@ -973,6 +1006,13 @@ sub getformulas { return %{$safeeval->varglob('f')}; } +# ----------------------------------------------------- Get value of $f{'A'.$n} + +sub getfa { + my ($safeeval,$n)=@_; + return $safeeval->reval('$f{"A'.$n.'"}'); +} + # -------------------------------------------------------------------- Get type sub gettype { @@ -1111,7 +1151,7 @@ sub rown { } my $showf=0; my $proc; - my $maxred; + my $maxred=1; my $sheettype=&gettype($safeeval); if ($sheettype eq 'studentcalc') { $proc='&outrowassess'; @@ -1124,6 +1164,7 @@ sub rown { } else { $maxred=26; } + if (&getfa($safeeval,$n)=~/^[\~\-]/) { $maxred=1; } if ($n eq '-') { $proc='&templaterow'; $n=-1; $dataflag=1; } foreach ($safeeval->reval($proc.'('.$n.')')) { my $bgcolor=$defaultbg.((($showf-1)/5==int(($showf-1)/5))?'99':'DD'); @@ -1476,7 +1517,11 @@ sub tmpread { my $value=<$fh>; chomp($value); $fo{$name}=$value; - $countrows++; + if ($name=~/^A(\d+)$/) { + if ($1>$countrows) { + $countrows=$1; + } + } } } if ($nform eq 'changesheet') { @@ -1485,10 +1530,12 @@ sub tmpread { $fo{'A'.$nfield}.='__&&&__'.$ENV{'form.sel_'.$nfield}; } } elsif ($nfield eq 'insertrow') { + $countrows++; + my $newrow=substr('000000'.$countrows,-7); if ($nform eq 'top') { - $fo{'A'.$countrows}='AAAAA_'.$countrows; + $fo{'A'.$countrows}='--- '.$newrow; } else { - $fo{'A'.$countrows}='zzzzz_'.$countrows; + $fo{'A'.$countrows}='~~~ '.$newrow; } } else { if ($nfield) { $fo{$nfield}=$nform; } @@ -1659,7 +1706,8 @@ sub updateclasssheet { if ($_=~/^A(\d+)/) { $maxrow=($1>$maxrow)?$1:$maxrow; $existing{$f{$_}}=1; - unless ((defined($currentlist{$f{$_}})) || (!$1)) { + unless ((defined($currentlist{$f{$_}})) || (!$1) || + ($f{$_}=~/^(\~\~\~|\-\-\-)/)) { $f{$_}='!!! Obsolete'; $changed=1; } @@ -1798,8 +1846,9 @@ sub updatestudentassesssheet { $maxrow=($1>$maxrow)?$1:$maxrow; my ($usy,$ufn)=split(/\_\_\&\&\&\_\_/,$f{$_}); $existing{$usy}=1; - unless ((defined($current{$usy})) || (!$1)) { - $f{$_}='!!! Obsolete'; + unless ((defined($current{$usy})) || (!$1) || + ($f{$_}=~/^(\~\~\~|\-\-\-)/)){ + $f{$_}='!!! Obsolete'; $changed=1; } elsif ($ufn) { $current{$usy} @@ -1852,7 +1901,7 @@ sub loadstudent { foreach (keys(%f)) { if ($_=~/^A(\d+)/) { my $row=$1; - unless (($f{$_}=~/^\!/) || ($row==0)) { + unless (($f{$_}=~/^[\!\~\-]/) || ($row==0)) { my ($usy,$ufn)=split(/\_\_\&\&\&\_\_/,$f{$_}); @assessdata=&exportsheet(&getuname($safeeval), &getudom($safeeval), @@ -1891,7 +1940,7 @@ sub loadcourse { my $total=0; foreach (keys(%f)) { if ($_=~/^A(\d+)/) { - unless ($f{$_}=~/^\!/) { $total++; } + unless ($f{$_}=~/^[\!\~\-]/) { $total++; } } } my $now=0; @@ -1911,7 +1960,7 @@ ENDPOP foreach (keys(%f)) { if ($_=~/^A(\d+)/) { my $row=$1; - unless (($f{$_}=~/^\!/) || ($row==0)) { + unless (($f{$_}=~/^[\!\~\-]/) || ($row==0)) { my @studentdata=&exportsheet(split(/\:/,$f{$_}), 'studentcalc'); undef %userrdatas; @@ -2075,7 +2124,7 @@ sub loadassessment { my %f=&getformulas($safeeval); foreach (keys(%f)) { if ($_=~/^A/) { - unless ($f{$_}=~/^\!/) { + unless ($f{$_}=~/^[\!\~\-]/) { if ($f{$_}=~/^parameter/) { if ($thisassess{$f{$_}}) { my $val=&parmval($f{$_},$safeeval);