--- loncom/interface/Attic/lonspreadsheet.pm 2001/07/21 23:55:31 1.57 +++ loncom/interface/Attic/lonspreadsheet.pm 2001/09/17 22:01:23 1.65 @@ -6,7 +6,7 @@ # 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, # 03/19,03/20,03/21,03/27,04/05,04/09, -# 07/09,07/14,07/21 Gerd Kortemeyer +# 07/09,07/14,07/21,09/01,09/10,9/11,9/12,9/13,9/14,9/17 Gerd Kortemeyer package Apache::lonspreadsheet; @@ -308,6 +308,42 @@ sub SUMMIN { return $sum; } +sub expandnamed { + my $expression=shift; + if ($expression=~/^\&/) { + my ($func,$var,$formula)=($expression=~/^\&(\w+)\(([^\;]+)\;(.*)\)/); + my @vars=split(/\W+/,$formula); + my %values=(); + undef %values; + map { + my $varname=$_; + if ($varname=~/\D/) { + $formula=~s/$varname/'$c{\''.$varname.'\'}'/ge; + $varname=~s/$var/\(\\w\+\)/g; + map { + if ($_=~/$varname/) { + $values{$1}=1; + } + } keys %c; + } + } @vars; + if ($func eq 'EXPANDSUM') { + my $result=''; + map { + my $thissum=$formula; + $thissum=~s/$var/$_/g; + $result.=$thissum.'+'; + } keys %values; + $result=~s/\+$//; + return $result; + } else { + return 0; + } + } else { + return '$c{\''.$expression.'\'}'; + } +} + sub sett { %t=(); my $pattern=''; @@ -329,7 +365,7 @@ sub sett { $t{$lb}=~s/\#/$trow/g; $t{$lb}=~s/\.\.+/\,/g; $t{$lb}=~s/(^|[^\"\'])([A-Za-z]\d+)/$1\$v\{\'$2\'\}/g; - $t{$lb}=~s/(^|[^\"\'])\[(\w+)\]/$1\$c\{\'$2\'\}/g; + $t{$lb}=~s/(^|[^\"\'])\[([^\]]+)\]/$1.&expandnamed($2)/ge; } } } keys %f; @@ -347,14 +383,14 @@ sub sett { $t{$_}=$f{$_}; $t{$_}=~s/\.\.+/\,/g; $t{$_}=~s/(^|[^\"\'])([A-Za-z]\d+)/$1\$v\{\'$2\'\}/g; - $t{$_}=~s/(^|[^\"\'])\[([\w\.]+)\]/$1\$c\{\'$2\'\}/g; + $t{$_}=~s/(^|[^\"\'])\[([^\]]+)\]/$1.&expandnamed($2)/ge; } } } keys %f; $t{'A0'}=$f{'A0'}; $t{'A0'}=~s/\.\.+/\,/g; $t{'A0'}=~s/(^|[^\"\'])([A-Za-z]\d+)/$1\$v\{\'$2\'\}/g; - $t{'A0'}=~s/(^|[^\"\'])\[([\w\.]+)\]/$1\$c\{\'$2\'\}/g; + $t{'A0'}=~s/(^|[^\"\'])\[([^\]]+)\]/$1.&expandnamed($2)/ge; } sub calc { @@ -401,7 +437,7 @@ sub outrowassess { my @cols=(); if ($n) { my ($usy,$ufn)=split(/\_\_\&\&\&\_\_/,$f{'A'.$n}); - $cols[0]=$f{'A'.$n}.'<br>'.$rl{$usy}.'<br>'. + $cols[0]=$rl{$usy}.'<br>'. '<select name="sel_'.$n.'" onChange="changesheet('.$n. ')"><option name="default">Default</option>'; map { @@ -634,47 +670,34 @@ sub rown { my ($safeeval,$n)=@_; my $defaultbg; my $rowdata=''; + my $dataflag=0; unless ($n eq '-') { $defaultbg=((($n-1)/5)==int(($n-1)/5))?'#E0E0':'#FFFF'; } else { $defaultbg='#E0FF'; } - if ((($n-1)/25)==int(($n-1)/25)) { - my $what='Student'; - if (&gettype($safeeval) eq 'assesscalc') { - $what='Item'; - } elsif (&gettype($safeeval) eq 'studentcalc') { - $what='Assessment'; - } - $rowdata.="</table>\n<br><table border=2>". - '<tr><td> <td>'.$what.'</td>'; - map { - $rowdata.='<td>'.$_.'</td>'; - } ('A','B','C','D','E','F','G','H','I','J','K','L','M', - 'N','O','P','Q','R','S','T','U','V','W','X','Y','Z', - 'a','b','c','d','e','f','g','h','i','j','k','l','m', - 'n','o','p','q','r','s','t','u','v','w','x','y','z'); - $rowdata.='</tr>'; - } $rowdata.="\n<tr><td><b><font size=+1>$n</font></b></td>"; my $showf=0; my $proc; my $maxred; - if (&gettype($safeeval) eq 'studentcalc') { + my $sheettype=&gettype($safeeval); + if ($sheettype eq 'studentcalc') { $proc='&outrowassess'; $maxred=26; } else { $proc='&outrow'; } - if (&gettype($safeeval) eq 'assesscalc') { + if ($sheettype eq 'assesscalc') { $maxred=1; } else { $maxred=26; } - if ($n eq '-') { $proc='&templaterow'; $n=-1; } + if ($n eq '-') { $proc='&templaterow'; $n=-1; $dataflag=1; } map { my $bgcolor=$defaultbg.((($showf-1)/5==int(($showf-1)/5))?'99':'DD'); my ($fm,$vl)=split(/\_\_\_eq\_\_\_/,$_); + if ((($vl ne '') || ($vl eq '0')) && + (($showf==1) || ($sheettype ne 'studentcalc'))) { $dataflag=1; } if ($showf==0) { $vl=$_; } if ($showf<=$maxred) { $bgcolor='#FFDDDD'; } if (($n==0) && ($showf<=26)) { $bgcolor='#CCCCFF'; } @@ -690,7 +713,11 @@ sub rown { } $showf++; } $safeeval->reval($proc.'('.$n.')'); - return $rowdata.'</tr>'; + if ($ENV{'form.showall'} || ($dataflag)) { + return $rowdata.'</tr>'; + } else { + return ''; + } } # ------------------------------------------------------------- Print out sheet @@ -733,10 +760,43 @@ sub outsheet { $tabledata.='</tr>'; my $row; my $maxrow=&getmaxrow($safeeval); - $tabledata.=&rown($safeeval,'-'); + $tabledata.=&rown($safeeval,'-').&rown($safeeval,0); $r->print($tabledata); - for ($row=0;$row<=$maxrow;$row++) { - $r->print(&rown($safeeval,$row)); + + my @sortby=(); + my @sortidx=(); + for ($row=1;$row<=$maxrow;$row++) { + $sortby[$row-1]=$safeeval->reval('$f{"A'.$row.'"}'); + $sortidx[$row-1]=$row-1; + } + @sortidx=sort { $sortby[$a] cmp $sortby[$b]; } @sortidx; + + my $what='Student'; + if (&gettype($safeeval) eq 'assesscalc') { + $what='Item'; + } elsif (&gettype($safeeval) eq 'studentcalc') { + $what='Assessment'; + } + + my $n=0; + for ($row=0;$row<$maxrow;$row++) { + my $thisrow=&rown($safeeval,$sortidx[$row]+1); + if ($thisrow) { + if ($n/25==int($n/25)) { + $r->print("</table>\n<br>\n"); + $r->rflush(); + $r->print('<table border=2><tr><td> <td>'.$what.'</td>'); + map { + $r->print('<td>'.$_.'</td>'); + } ('A','B','C','D','E','F','G','H','I','J','K','L','M', + 'N','O','P','Q','R','S','T','U','V','W','X','Y','Z', + 'a','b','c','d','e','f','g','h','i','j','k','l','m', + 'n','o','p','q','r','s','t','u','v','w','x','y','z'); + $r->print('</tr>'); + } + $n++; + $r->print($thisrow); + } } $r->print('</table>'); } @@ -1477,6 +1537,18 @@ sub loadassessment { # ----------------- now courseopt, useropt initialized for this user and course # (used by parmval) +# +# Load keys for this assessment only +# + my %thisassess=(); + my ($symap,$syid,$srcf)=split(/\_\_\_/,$symb); + + map { + $thisassess{$_}=1; + } split(/\,/,&Apache::lonnet::metadata($srcf,'keys')); +# +# Load parameters +# my %c=(); if (tie(%parmhash,'GDBM_File', @@ -1486,9 +1558,11 @@ sub loadassessment { if ($_=~/^A/) { unless ($f{$_}=~/^\!/) { if ($f{$_}=~/^parameter/) { + if ($thisassess{$f{$_}}) { my $val=&parmval($f{$_},$safeeval); $c{$_}=$val; $c{$f{$_}}=$val; + } } else { my $key=$f{$_}; my $ckey=$key; @@ -1937,7 +2011,8 @@ ENDSCRIPT # ---------------------------------------------------------------- Course title $r->print('<h1>'. - $ENV{'course.'.$ENV{'request.course.id'}.'.description'}.'</h1>'); + $ENV{'course.'.$ENV{'request.course.id'}.'.description'}. + '</h1><h3>'.localtime().'</h3>'); # ---------------------------------------------------- See if user can see this @@ -2060,6 +2135,15 @@ ENDSCRIPT &tmpwrite($asheet); + if (&gettype($asheet) eq 'studentcalc') { + $r->print('<br>Show rows with empty A column: '); + } else { + $r->print('<br>Show empty rows: '); + } + $r->print('<input type=checkbox name=showall onClick="submit()"'); + if ($ENV{'form.showall'}) { $r->print(' checked'); } + $r->print('>'); + # ------------------------------------------------------------- Print out sheet &outsheet($r,$asheet);