version 1.55, 2001/07/20 02:05:33
|
version 1.66, 2001/10/16 09:53:50
|
Line 6
|
Line 6
|
# 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,03/12,03/13,03/15,03/17, |
# 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, |
# 03/19,03/20,03/21,03/27,04/05,04/09, |
# 07/09,07/14 Gerd Kortemeyer |
# 07/09,07/14,07/21,09/01,09/10,9/11,9/12,9/13,9/14,9/17,10/16 Gerd Kortemeyer |
|
|
package Apache::lonspreadsheet; |
package Apache::lonspreadsheet; |
|
|
Line 87 undef %c;
|
Line 87 undef %c;
|
undef %rl; |
undef %rl; |
undef @os; |
undef @os; |
|
|
undef $nfield; |
|
undef $nsheet; |
|
|
|
$maxrow=0; |
$maxrow=0; |
$sheettype=''; |
$sheettype=''; |
|
|
Line 311 sub SUMMIN {
|
Line 308 sub SUMMIN {
|
return $sum; |
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 { |
sub sett { |
%t=(); |
%t=(); |
my $pattern=''; |
my $pattern=''; |
Line 332 sub sett {
|
Line 365 sub sett {
|
$t{$lb}=~s/\#/$trow/g; |
$t{$lb}=~s/\#/$trow/g; |
$t{$lb}=~s/\.\.+/\,/g; |
$t{$lb}=~s/\.\.+/\,/g; |
$t{$lb}=~s/(^|[^\"\'])([A-Za-z]\d+)/$1\$v\{\'$2\'\}/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; |
} keys %f; |
Line 350 sub sett {
|
Line 383 sub sett {
|
$t{$_}=$f{$_}; |
$t{$_}=$f{$_}; |
$t{$_}=~s/\.\.+/\,/g; |
$t{$_}=~s/\.\.+/\,/g; |
$t{$_}=~s/(^|[^\"\'])([A-Za-z]\d+)/$1\$v\{\'$2\'\}/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; |
} keys %f; |
$t{'A0'}=$f{'A0'}; |
$t{'A0'}=$f{'A0'}; |
$t{'A0'}=~s/\.\.+/\,/g; |
$t{'A0'}=~s/\.\.+/\,/g; |
$t{'A0'}=~s/(^|[^\"\'])([A-Za-z]\d+)/$1\$v\{\'$2\'\}/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 { |
sub calc { |
Line 404 sub outrowassess {
|
Line 437 sub outrowassess {
|
my @cols=(); |
my @cols=(); |
if ($n) { |
if ($n) { |
my ($usy,$ufn)=split(/\_\_\&\&\&\_\_/,$f{'A'.$n}); |
my ($usy,$ufn)=split(/\_\_\&\&\&\_\_/,$f{'A'.$n}); |
$cols[0]=$rl{$f{'A'.$n}}.'<br>'. |
$cols[0]=$rl{$usy}.'<br>'. |
'<select name="sel_'.$n.'" onChange="changesheet('.$n. |
'<select name="sel_'.$n.'" onChange="changesheet('.$n. |
')"><option name="default">Default</option>'; |
')"><option name="default">Default</option>'; |
map { |
map { |
Line 532 sub getmaxrow {
|
Line 565 sub getmaxrow {
|
my $safeeval=shift; |
my $safeeval=shift; |
return $safeeval->reval('$maxrow'); |
return $safeeval->reval('$maxrow'); |
} |
} |
# -------------------------------------------- Store which sheet needs changing |
|
|
|
sub changesheet { |
|
my ($safeeval,$nfield,$nsheet)=@_; |
|
$safeeval->reval('$nfield='.$nfield.'; $nsheet='.$nsheet.';'); |
|
} |
|
|
|
# ---------------------------------------------------------------- Set filename |
# ---------------------------------------------------------------- Set filename |
|
|
Line 643 sub rown {
|
Line 670 sub rown {
|
my ($safeeval,$n)=@_; |
my ($safeeval,$n)=@_; |
my $defaultbg; |
my $defaultbg; |
my $rowdata=''; |
my $rowdata=''; |
|
my $dataflag=0; |
unless ($n eq '-') { |
unless ($n eq '-') { |
$defaultbg=((($n-1)/5)==int(($n-1)/5))?'#E0E0':'#FFFF'; |
$defaultbg=((($n-1)/5)==int(($n-1)/5))?'#E0E0':'#FFFF'; |
} else { |
} else { |
$defaultbg='#E0FF'; |
$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>"; |
$rowdata.="\n<tr><td><b><font size=+1>$n</font></b></td>"; |
my $showf=0; |
my $showf=0; |
my $proc; |
my $proc; |
my $maxred; |
my $maxred; |
if (&gettype($safeeval) eq 'studentcalc') { |
my $sheettype=&gettype($safeeval); |
|
if ($sheettype eq 'studentcalc') { |
$proc='&outrowassess'; |
$proc='&outrowassess'; |
$maxred=26; |
$maxred=26; |
} else { |
} else { |
$proc='&outrow'; |
$proc='&outrow'; |
} |
} |
if (&gettype($safeeval) eq 'assesscalc') { |
if ($sheettype eq 'assesscalc') { |
$maxred=1; |
$maxred=1; |
} else { |
} else { |
$maxred=26; |
$maxred=26; |
} |
} |
if ($n eq '-') { $proc='&templaterow'; $n=-1; } |
if ($n eq '-') { $proc='&templaterow'; $n=-1; $dataflag=1; } |
map { |
map { |
my $bgcolor=$defaultbg.((($showf-1)/5==int(($showf-1)/5))?'99':'DD'); |
my $bgcolor=$defaultbg.((($showf-1)/5==int(($showf-1)/5))?'99':'DD'); |
my ($fm,$vl)=split(/\_\_\_eq\_\_\_/,$_); |
my ($fm,$vl)=split(/\_\_\_eq\_\_\_/,$_); |
|
if ((($vl ne '') || ($vl eq '0')) && |
|
(($showf==1) || ($sheettype ne 'studentcalc'))) { $dataflag=1; } |
if ($showf==0) { $vl=$_; } |
if ($showf==0) { $vl=$_; } |
if ($showf<=$maxred) { $bgcolor='#FFDDDD'; } |
if ($showf<=$maxred) { $bgcolor='#FFDDDD'; } |
if (($n==0) && ($showf<=26)) { $bgcolor='#CCCCFF'; } |
if (($n==0) && ($showf<=26)) { $bgcolor='#CCCCFF'; } |
Line 699 sub rown {
|
Line 713 sub rown {
|
} |
} |
$showf++; |
$showf++; |
} $safeeval->reval($proc.'('.$n.')'); |
} $safeeval->reval($proc.'('.$n.')'); |
return $rowdata.'</tr>'; |
if ($ENV{'form.showall'} || ($dataflag)) { |
|
return $rowdata.'</tr>'; |
|
} else { |
|
return ''; |
|
} |
} |
} |
|
|
# ------------------------------------------------------------- Print out sheet |
# ------------------------------------------------------------- Print out sheet |
Line 742 sub outsheet {
|
Line 760 sub outsheet {
|
$tabledata.='</tr>'; |
$tabledata.='</tr>'; |
my $row; |
my $row; |
my $maxrow=&getmaxrow($safeeval); |
my $maxrow=&getmaxrow($safeeval); |
$tabledata.=&rown($safeeval,'-'); |
$tabledata.=&rown($safeeval,'-').&rown($safeeval,0); |
$r->print($tabledata); |
$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>'); |
$r->print('</table>'); |
} |
} |
Line 893 sub writesheet {
|
Line 944 sub writesheet {
|
# ----------------------------------------------------------------- Write sheet |
# ----------------------------------------------------------------- Write sheet |
my $sheetdata=''; |
my $sheetdata=''; |
map { |
map { |
|
unless ($f{$_} eq 'import') { |
$sheetdata.=&Apache::lonnet::escape($_).'='. |
$sheetdata.=&Apache::lonnet::escape($_).'='. |
&Apache::lonnet::escape($f{$_}).'&'; |
&Apache::lonnet::escape($f{$_}).'&'; |
|
} |
} keys %f; |
} keys %f; |
$sheetdata=~s/\&$//; |
$sheetdata=~s/\&$//; |
my $reply=&Apache::lonnet::reply('put:'.$cdom.':'.$cnum.':'.$fn.':'. |
my $reply=&Apache::lonnet::reply('put:'.$cdom.':'.$cnum.':'.$fn.':'. |
Line 962 sub tmpread {
|
Line 1015 sub tmpread {
|
} |
} |
} |
} |
if ($nform eq 'changesheet') { |
if ($nform eq 'changesheet') { |
|
$fo{'A'.$nfield}=(split(/\_\_\&\&\&\_\_/,$fo{'A'.$nfield}))[0]; |
unless ($ENV{'form.sel_'.$nfield} eq 'Default') { |
unless ($ENV{'form.sel_'.$nfield} eq 'Default') { |
&changesheet($safeeval,$nfield,$ENV{'form.sel_'.$nfield}); |
$fo{'A'.$nfield}.='__&&&__'.$ENV{'form.sel_'.$nfield}; |
} |
} |
} else { |
} else { |
if ($nfield) { $fo{$nfield}=$nform; } |
if ($nfield) { $fo{$nfield}=$nform; } |
Line 1193 sub updatestudentassesssheet {
|
Line 1247 sub updatestudentassesssheet {
|
$display.= |
$display.= |
&Apache::lonnet::metadata($srcf,$key.'.name'); |
&Apache::lonnet::metadata($srcf,$key.'.name'); |
} |
} |
|
$key=~s/\W/\_/g; |
$display.='<br>'.$key; |
$display.='<br>'.$key; |
$allkeys{$key}=$display; |
$allkeys{$key}=$display; |
} |
} |
Line 1235 sub updatestudentassesssheet {
|
Line 1290 sub updatestudentassesssheet {
|
map { |
map { |
if ($_=~/^A(\d+)/) { |
if ($_=~/^A(\d+)/) { |
$maxrow=($1>$maxrow)?$1:$maxrow; |
$maxrow=($1>$maxrow)?$1:$maxrow; |
$existing{$f{$_}}=1; |
my ($usy,$ufn)=split(/\_\_\&\&\&\_\_/,$f{$_}); |
unless ((defined($current{$f{$_}})) || (!$1)) { |
$existing{$usy}=1; |
|
unless ((defined($current{$usy})) || (!$1)) { |
$f{$_}='!!! Obsolete'; |
$f{$_}='!!! Obsolete'; |
$changed=1; |
$changed=1; |
|
} elsif ($ufn) { |
|
$current{$usy} |
|
=~s/assesscalc\?usymb\=/assesscalc\?ufn\=$ufn\&usymb\=/; |
} |
} |
} |
} |
} keys %f; |
} keys %f; |
Line 1479 sub loadassessment {
|
Line 1538 sub loadassessment {
|
# ----------------- now courseopt, useropt initialized for this user and course |
# ----------------- now courseopt, useropt initialized for this user and course |
# (used by parmval) |
# (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=(); |
my %c=(); |
|
|
if (tie(%parmhash,'GDBM_File', |
if (tie(%parmhash,'GDBM_File', |
Line 1488 sub loadassessment {
|
Line 1559 sub loadassessment {
|
if ($_=~/^A/) { |
if ($_=~/^A/) { |
unless ($f{$_}=~/^\!/) { |
unless ($f{$_}=~/^\!/) { |
if ($f{$_}=~/^parameter/) { |
if ($f{$_}=~/^parameter/) { |
|
if ($thisassess{$f{$_}}) { |
my $val=&parmval($f{$_},$safeeval); |
my $val=&parmval($f{$_},$safeeval); |
$c{$_}=$val; |
$c{$_}=$val; |
$c{$f{$_}}=$val; |
$c{$f{$_}}=$val; |
|
} |
} else { |
} else { |
my $key=$f{$_}; |
my $key=$f{$_}; |
my $ckey=$key; |
my $ckey=$key; |
|
$ckey=~s/\W/\_/g; |
$key=~s/^stores\_/resource\./; |
$key=~s/^stores\_/resource\./; |
$key=~s/\_/\./; |
$key=~s/\_/\./; |
$c{$_}=$returnhash{$key}; |
$c{$_}=$returnhash{$key}; |
Line 1939 ENDSCRIPT
|
Line 2013 ENDSCRIPT
|
# ---------------------------------------------------------------- Course title |
# ---------------------------------------------------------------- Course title |
|
|
$r->print('<h1>'. |
$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 |
# ---------------------------------------------------- See if user can see this |
|
|
Line 1953 ENDSCRIPT
|
Line 2028 ENDSCRIPT
|
} |
} |
} |
} |
|
|
# ---------------------------------------------------- See if something to save |
|
|
|
if (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'})) { |
|
my $fname=''; |
|
if ($ENV{'form.saveas'} && ($fname=$ENV{'form.newfn'})) { |
|
$fname=~s/\W/\_/g; |
|
if ($fname eq 'default') { $fname='course_default'; } |
|
$fname.='_'.&gettype($asheet); |
|
&setfilename($asheet,$fname); |
|
$ENV{'form.ufn'}=$fname; |
|
$r->print('<p>Saving spreadsheet: '. |
|
&writesheet($asheet,$ENV{'form.makedefufn'}).'<p>'); |
|
} |
|
} |
|
|
|
# ------------------------------------------------ Write the modified worksheet |
|
|
|
$r->print('<b>Current sheet:</b> '.&getfilename($asheet).'<p>'); |
|
|
|
&tmpwrite($asheet); |
|
|
|
# ---------------------------------------------------------- Additional options |
# ---------------------------------------------------------- Additional options |
|
|
$r->print( |
$r->print( |
Line 2062 ENDSCRIPT
|
Line 2116 ENDSCRIPT
|
my $calcoutput=&calcsheet($asheet); |
my $calcoutput=&calcsheet($asheet); |
$r->print('<h3><font color=red>'.$calcoutput.'</h3></font>'); |
$r->print('<h3><font color=red>'.$calcoutput.'</h3></font>'); |
|
|
|
# ---------------------------------------------------- See if something to save |
|
|
|
if (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'})) { |
|
my $fname=''; |
|
if ($ENV{'form.saveas'} && ($fname=$ENV{'form.newfn'})) { |
|
$fname=~s/\W/\_/g; |
|
if ($fname eq 'default') { $fname='course_default'; } |
|
$fname.='_'.&gettype($asheet); |
|
&setfilename($asheet,$fname); |
|
$ENV{'form.ufn'}=$fname; |
|
$r->print('<p>Saving spreadsheet: '. |
|
&writesheet($asheet,$ENV{'form.makedefufn'}).'<p>'); |
|
} |
|
} |
|
|
|
# ------------------------------------------------ Write the modified worksheet |
|
|
|
$r->print('<b>Current sheet:</b> '.&getfilename($asheet).'<p>'); |
|
|
|
&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); |
&outsheet($r,$asheet); |
$r->print('</form></body></html>'); |
$r->print('</form></body></html>'); |
|
|