version 1.47, 2001/03/20 20:11:27
|
version 1.71, 2001/10/17 22:09:53
|
Line 5
|
Line 5
|
# 12/08,12/09,12/11,12/12,12/15,12/16,12/18,12/19,12/30, |
# 12/08,12/09,12/11,12/12,12/15,12/16,12/18,12/19,12/30, |
# 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 Gerd Kortemeyer |
# 03/19,03/20,03/21,03/27,04/05,04/09, |
|
# 07/09,07/14,07/21,09/01,09/10,9/11,9/12,9/13,9/14,9/17, |
|
# 10/16,10/17 Gerd Kortemeyer |
|
|
package Apache::lonspreadsheet; |
package Apache::lonspreadsheet; |
|
|
Line 77 sub initsheet {
|
Line 79 sub initsheet {
|
# v: output values |
# v: output values |
# c: preloaded constants (A-column) |
# c: preloaded constants (A-column) |
# rl: row label |
# rl: row label |
|
# os: other spreadsheets (for student spreadsheet only) |
|
|
undef %v; |
undef %v; |
undef %t; |
undef %t; |
undef %f; |
undef %f; |
undef %c; |
undef %c; |
undef %rl; |
undef %rl; |
|
undef @os; |
|
|
$maxrow=0; |
$maxrow=0; |
$sheettype=''; |
$sheettype=''; |
Line 305 sub SUMMIN {
|
Line 309 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 326 sub sett {
|
Line 366 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 344 sub sett {
|
Line 384 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 397 sub outrowassess {
|
Line 437 sub outrowassess {
|
my $n=shift; |
my $n=shift; |
my @cols=(); |
my @cols=(); |
if ($n) { |
if ($n) { |
$cols[0]=$rl{$f{'A'.$n}}; |
my ($usy,$ufn)=split(/\_\_\&\&\&\_\_/,$f{'A'.$n}); |
|
$cols[0]=$rl{$usy}.'<br>'. |
|
'<select name="sel_'.$n.'" onChange="changesheet('.$n. |
|
')"><option name="default">Default</option>'; |
|
map { |
|
$cols[0].='<option name="'.$_.'"'; |
|
if ($ufn eq $_) { |
|
$cols[0].=' selected'; |
|
} |
|
$cols[0].='>'.$_.'</option>'; |
|
} @os; |
|
$cols[0].='</select>'; |
} else { |
} else { |
$cols[0]='<b><font size=+1>Export</font></b>'; |
$cols[0]='<b><font size=+1>Export</font></b>'; |
} |
} |
Line 460 sub setconstants {
|
Line 511 sub setconstants {
|
%{$safeeval->varglob('c')}=%c; |
%{$safeeval->varglob('c')}=%c; |
} |
} |
|
|
|
# --------------------------------------------- Set names of other spreadsheets |
|
|
|
sub setothersheets { |
|
my ($safeeval,@os)=@_; |
|
@{$safeeval->varglob('os')}=@os; |
|
} |
|
|
# ------------------------------------------------ Add or change formula values |
# ------------------------------------------------ Add or change formula values |
|
|
sub setrowlabels { |
sub setrowlabels { |
Line 600 sub exportdata {
|
Line 658 sub exportdata {
|
return $safeeval->reval('&exportrowa()'); |
return $safeeval->reval('&exportrowa()'); |
} |
} |
|
|
|
|
# ========================================================== End of Spreadsheet |
# ========================================================== End of Spreadsheet |
# ============================================================================= |
# ============================================================================= |
|
|
Line 612 sub rown {
|
Line 671 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)) { |
unless ($ENV{'form.showcsv'}) { |
my $what='Student'; |
$rowdata.="\n<tr><td><b><font size=+1>$n</font></b></td>"; |
if (&gettype($safeeval) eq 'assesscalc') { |
} else { |
$what='Item'; |
$rowdata.="\n".'"'.$n.'"'; |
} 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 $showf=0; |
my $proc; |
my $proc; |
my $maxred; |
my $maxred; |
if (&gettype($safeeval) eq 'assesscalc') { |
my $sheettype=&gettype($safeeval); |
|
if ($sheettype eq 'studentcalc') { |
$proc='&outrowassess'; |
$proc='&outrowassess'; |
$maxred=1; |
$maxred=26; |
} else { |
} else { |
$proc='&outrow'; |
$proc='&outrow'; |
|
} |
|
if ($sheettype eq 'assesscalc') { |
|
$maxred=1; |
|
} 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=$_; } |
|
unless ($ENV{'form.showcsv'}) { |
if ($showf<=$maxred) { $bgcolor='#FFDDDD'; } |
if ($showf<=$maxred) { $bgcolor='#FFDDDD'; } |
if (($n==0) && ($showf<=26)) { $bgcolor='#CCCCFF'; } |
if (($n==0) && ($showf<=26)) { $bgcolor='#CCCCFF'; } |
if (($showf>$maxred) || ((!$n) && ($showf>0))) { |
if (($showf>$maxred) || ((!$n) && ($showf>0))) { |
Line 662 sub rown {
|
Line 717 sub rown {
|
} else { |
} else { |
$rowdata.='<td bgcolor='.$bgcolor.'> '.$vl.' </td>'; |
$rowdata.='<td bgcolor='.$bgcolor.'> '.$vl.' </td>'; |
} |
} |
|
} else { |
|
$rowdata.=',"'.$vl.'"'; |
|
} |
$showf++; |
$showf++; |
} $safeeval->reval($proc.'('.$n.')'); |
} $safeeval->reval($proc.'('.$n.')'); |
return $rowdata.'</tr>'; |
if ($ENV{'form.showall'} || ($dataflag)) { |
|
return $rowdata.($ENV{'form.showcsv'}?'':'</tr>'); |
|
} else { |
|
return ''; |
|
} |
} |
} |
|
|
# ------------------------------------------------------------- Print out sheet |
# ------------------------------------------------------------- Print out sheet |
Line 684 sub outsheet {
|
Line 746 sub outsheet {
|
$realm='Course'; |
$realm='Course'; |
} |
} |
my $maxyellow=52-$maxred; |
my $maxyellow=52-$maxred; |
my $tabledata= |
my $tabledata; |
|
unless ($ENV{'form.showcsv'}) { |
|
$tabledata= |
'<table border=2><tr><th colspan=2 rowspan=2><font size=+2>'. |
'<table border=2><tr><th colspan=2 rowspan=2><font size=+2>'. |
$realm.'</font></th>'. |
$realm.'</font></th>'. |
'<td bgcolor=#FFDDDD colspan='.$maxred. |
'<td bgcolor=#FFDDDD colspan='.$maxred. |
Line 704 sub outsheet {
|
Line 768 sub outsheet {
|
'N','O','P','Q','R','S','T','U','V','W','X','Y','Z', |
'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', |
'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'); |
'n','o','p','q','r','s','t','u','v','w','x','y','z'); |
$tabledata.='</tr>'; |
$tabledata.='</tr>'.&rown($safeeval,'-').&rown($safeeval,0); |
|
} else { $tabledata='<pre>'; } |
|
|
|
$r->print($tabledata); |
|
|
my $row; |
my $row; |
my $maxrow=&getmaxrow($safeeval); |
my $maxrow=&getmaxrow($safeeval); |
$tabledata.=&rown($safeeval,'-'); |
|
$r->print($tabledata); |
my @sortby=(); |
for ($row=0;$row<=$maxrow;$row++) { |
my @sortidx=(); |
$r->print(&rown($safeeval,$row)); |
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)) && (!$ENV{'form.showcsv'})) { |
|
$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($ENV{'form.showcsv'}?'</pre>':'</table>'); |
|
} |
|
|
|
# |
|
# ----------------------------------------------- Read list of available sheets |
|
# |
|
|
|
sub othersheets { |
|
my ($safeeval,$stype)=@_; |
|
|
|
my $cnum=&getcnum($safeeval); |
|
my $cdom=&getcdom($safeeval); |
|
my $chome=&getchome($safeeval); |
|
|
|
my @alternatives=(); |
|
my $result=&Apache::lonnet::reply('dump:'.$cdom.':'.$cnum.':'. |
|
$stype.'_spreadsheets',$chome); |
|
if ($result!~/^error\:/) { |
|
map { |
|
$alternatives[$#alternatives+1]= |
|
&Apache::lonnet::unescape((split(/\=/,$_))[0]); |
|
} split(/\&/,$result); |
|
} |
|
return @alternatives; |
} |
} |
|
|
# |
# |
Line 835 sub writesheet {
|
Line 957 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 844 sub writesheet {
|
Line 968 sub writesheet {
|
if ($reply eq 'ok') { |
if ($reply eq 'ok') { |
$reply=&Apache::lonnet::reply('put:'.$cdom.':'.$cnum.':'. |
$reply=&Apache::lonnet::reply('put:'.$cdom.':'.$cnum.':'. |
$stype.'_spreadsheets:'. |
$stype.'_spreadsheets:'. |
&Apache::lonnet::escape($fn).'='.$ENV{'user.name'}, |
&Apache::lonnet::escape($fn).'='.$ENV{'user.name'}.'@'. |
|
$ENV{'user.domain'}, |
$chome); |
$chome); |
if ($reply eq 'ok') { |
if ($reply eq 'ok') { |
if ($makedef) { |
if ($makedef) { |
Line 902 sub tmpread {
|
Line 1027 sub tmpread {
|
$fo{$name}=$value; |
$fo{$name}=$value; |
} |
} |
} |
} |
if ($nfield) { $fo{$nfield}=$nform; } |
if ($nform eq 'changesheet') { |
|
$fo{'A'.$nfield}=(split(/\_\_\&\&\&\_\_/,$fo{'A'.$nfield}))[0]; |
|
unless ($ENV{'form.sel_'.$nfield} eq 'Default') { |
|
$fo{'A'.$nfield}.='__&&&__'.$ENV{'form.sel_'.$nfield}; |
|
} |
|
} else { |
|
if ($nfield) { $fo{$nfield}=$nform; } |
|
} |
&setformulas($safeeval,%fo); |
&setformulas($safeeval,%fo); |
} |
} |
|
|
Line 930 sub parmval {
|
Line 1062 sub parmval {
|
# ----------------------------------------------------- Cascading lookup scheme |
# ----------------------------------------------------- Cascading lookup scheme |
my $rwhat=$what; |
my $rwhat=$what; |
$what=~s/^parameter\_//; |
$what=~s/^parameter\_//; |
$what=~s/\_/\./; |
$what=~s/\_([^\_]+)$/\.$1/; |
|
|
my $symbparm=$symb.'.'.$what; |
my $symbparm=$symb.'.'.$what; |
my $mapparm=$mapname.'___(all).'.$what; |
my $mapparm=$mapname.'___(all).'.$what; |
Line 1021 sub updateclasssheet {
|
Line 1153 sub updateclasssheet {
|
my ($sname,$sdom)=split(/\:/,$name); |
my ($sname,$sdom)=split(/\:/,$name); |
my $ssec=&Apache::lonnet::usection($sdom,$sname,$cid); |
my $ssec=&Apache::lonnet::usection($sdom,$sname,$cid); |
if ($ssec==-1) { |
if ($ssec==-1) { |
|
unless ($ENV{'form.showcsv'}) { |
$rowlabel='<font color=red>Data not available: '.$name. |
$rowlabel='<font color=red>Data not available: '.$name. |
'</font>'; |
'</font>'; |
|
} else { |
|
$rowlabel='ERROR","'.$name. |
|
'","Data not available","","","'; |
|
} |
} else { |
} else { |
my %reply=&Apache::lonnet::idrget($sdom,$sname); |
my %reply=&Apache::lonnet::idrget($sdom,$sname); |
my $reply=&Apache::lonnet::reply('get:'.$sdom.':'.$sname. |
my $reply=&Apache::lonnet::reply('get:'.$sdom.':'.$sname. |
':environment:firstname&middlename&lastname&generation', |
':environment:firstname&middlename&lastname&generation', |
&Apache::lonnet::homeserver($sname,$sdom)); |
&Apache::lonnet::homeserver($sname,$sdom)); |
|
unless ($ENV{'form.showcsv'}) { |
$rowlabel='<a href="/adm/studentcalc?uname='.$sname. |
$rowlabel='<a href="/adm/studentcalc?uname='.$sname. |
'&udom='.$sdom.'">'. |
'&udom='.$sdom.'">'. |
$ssec.' '.$reply{$sname}.'<br>'; |
$ssec.' '.$reply{$sname}.'<br>'; |
Line 1035 sub updateclasssheet {
|
Line 1173 sub updateclasssheet {
|
$rowlabel.=&Apache::lonnet::unescape($_).' '; |
$rowlabel.=&Apache::lonnet::unescape($_).' '; |
} split(/\&/,$reply); |
} split(/\&/,$reply); |
$rowlabel.='</a>'; |
$rowlabel.='</a>'; |
|
} else { |
|
$rowlabel=$ssec.'","'.$reply{$sname}.'"'; |
|
my $ncount=0; |
|
map { |
|
$rowlabel.=',"'.&Apache::lonnet::unescape($_).'"'; |
|
$ncount++; |
|
} split(/\&/,$reply); |
|
unless ($ncount==4) { $rowlabel.=',""'; } |
|
$rowlabel=~s/\"$//; |
|
} |
} |
} |
$currentlist{&Apache::lonnet::unescape($name)}=$rowlabel; |
$currentlist{&Apache::lonnet::unescape($name)}=$rowlabel; |
} |
} |
Line 1093 sub updatestudentassesssheet {
|
Line 1241 sub updatestudentassesssheet {
|
&GDBM_READER,0640)) { |
&GDBM_READER,0640)) { |
# --------------------------------------------------------- Get all assessments |
# --------------------------------------------------------- Get all assessments |
|
|
my %allkeys=(); |
my %allkeys=('timestamp' => |
|
'Timestamp of Last Transaction<br>timestamp'); |
my %allassess=(); |
my %allassess=(); |
|
|
|
my $adduserstr=''; |
|
if ((&getuname($safeeval) ne $ENV{'user.name'}) || |
|
(&getudom($safeeval) ne $ENV{'user.domain'})) { |
|
$adduserstr='&uname='.&getuname($safeeval). |
|
'&udom='.&getudom($safeeval); |
|
} |
|
|
map { |
map { |
if ($_=~/^src\_(\d+)\.(\d+)$/) { |
if ($_=~/^src\_(\d+)\.(\d+)$/) { |
my $mapid=$1; |
my $mapid=$1; |
Line 1108 sub updatestudentassesssheet {
|
Line 1264 sub updatestudentassesssheet {
|
'___'.$resid.'___'. |
'___'.$resid.'___'. |
&Apache::lonnet::declutter($srcf); |
&Apache::lonnet::declutter($srcf); |
$allassess{$symb}= |
$allassess{$symb}= |
'<a href="/adm/assesscalc?usymb='.$symb.'">'.$bighash{'title_'.$id}.'</a>'; |
'<a href="/adm/assesscalc?usymb='.$symb.$adduserstr.'">'. |
|
$bighash{'title_'.$id}.'</a>'; |
if ($stype eq 'assesscalc') { |
if ($stype eq 'assesscalc') { |
map { |
map { |
if (($_=~/^stores\_(.*)/) || ($_=~/^parameter\_(.*)/)) { |
if (($_=~/^stores\_(.*)/) || ($_=~/^parameter\_(.*)/)) { |
Line 1161 sub updatestudentassesssheet {
|
Line 1318 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 1214 sub loadstudent {
|
Line 1375 sub loadstudent {
|
if ($_=~/^A(\d+)/) { |
if ($_=~/^A(\d+)/) { |
my $row=$1; |
my $row=$1; |
unless (($f{$_}=~/^\!/) || ($row==0)) { |
unless (($f{$_}=~/^\!/) || ($row==0)) { |
|
my ($usy,$ufn)=split(/\_\_\&\&\&\_\_/,$f{$_}); |
@assessdata=&exportsheet(&getuname($safeeval), |
@assessdata=&exportsheet(&getuname($safeeval), |
&getudom($safeeval), |
&getudom($safeeval), |
'assesscalc',$f{$_}); |
'assesscalc',$usy,$ufn); |
my $index=0; |
my $index=0; |
map { |
map { |
if ($assessdata[$index]) { |
if ($assessdata[$index]) { |
Line 1260 sub loadcourse {
|
Line 1422 sub loadcourse {
|
<script> |
<script> |
popwin=open('','popwin','width=400,height=100'); |
popwin=open('','popwin','width=400,height=100'); |
popwin.document.writeln('<html><body bgcolor="#FFFFFF">'+ |
popwin.document.writeln('<html><body bgcolor="#FFFFFF">'+ |
'<h1>Spreadsheet Calculation Progress</h1>'+ |
'<h3>Spreadsheet Calculation Progress</h3>'+ |
'<form name=popremain>'+ |
'<form name=popremain>'+ |
'<input type=text size=35 name=remaining value=Starting></form>'+ |
'<input type=text size=35 name=remaining value=Starting></form>'+ |
'</body></html>'); |
'</body></html>'); |
Line 1404 sub loadassessment {
|
Line 1566 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 1413 sub loadassessment {
|
Line 1587 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; |
$key=~s/^stores\_/resource\./; |
$key=~s/^stores\_/resource\./; |
$key=~s/\_/\./; |
$key=~s/\_/\./g; |
$c{$_}=$returnhash{$key}; |
$c{$_}=$returnhash{$key}; |
$c{$ckey}=$returnhash{$key}; |
$c{$ckey}=$returnhash{$key}; |
} |
} |
Line 1498 sub forcedrecalc {
|
Line 1674 sub forcedrecalc {
|
my ($uname,$udom,$stype,$usymb)=@_; |
my ($uname,$udom,$stype,$usymb)=@_; |
my $key=$uname.':'.$udom.':'.$stype.':'.$usymb; |
my $key=$uname.':'.$udom.':'.$stype.':'.$usymb; |
my $time=$oldsheets{$key.'.time'}; |
my $time=$oldsheets{$key.'.time'}; |
|
if ($ENV{'form.forcerecalc'}) { return 1; } |
unless ($time) { return 1; } |
unless ($time) { return 1; } |
if ($stype eq 'assesscalc') { |
if ($stype eq 'assesscalc') { |
my $map=(split(/\_\_\_/,$usymb))[0]; |
my $map=(split(/\_\_\_/,$usymb))[0]; |
if (&checkthis('::assesscalc:',$time) || |
if (&checkthis('::assesscalc:',$time) || |
&checkthis('::assesscalc:'.$map,$time) || |
&checkthis('::assesscalc:'.$map,$time) || |
&checkthis('::assesscalc:'.$usymb,$time) || |
&checkthis('::assesscalc:'.$usymb,$time) || |
&checkthis($uname.':'.$udom.':assesscalc:',$time)) { |
&checkthis($uname.':'.$udom.':assesscalc:',$time) || |
|
&checkthis($uname.':'.$udom.':assesscalc:'.$map,$time) || |
|
&checkthis($uname.':'.$udom.':assesscalc:'.$usymb,$time)) { |
return 1; |
return 1; |
} |
} |
} else { |
} else { |
if (&checkthis('::studentcalc:',$time) || |
if (&checkthis('::studentcalc:',$time) || |
&checkthis($uname.':'.$udom.':studencalc:',$time)) { |
&checkthis($uname.':'.$udom.':studentcalc:',$time)) { |
return 1; |
return 1; |
} |
} |
} |
} |
Line 1637 sub exportsheet {
|
Line 1816 sub exportsheet {
|
} |
} |
return @exportarr; |
return @exportarr; |
} |
} |
|
# ============================================================ Expiration Dates |
|
# |
|
# Load previously cached student spreadsheets for this course |
|
# |
|
|
|
sub expirationdates { |
|
undef %expiredates; |
|
my $cid=$ENV{'request.course.id'}; |
|
my $reply=&Apache::lonnet::reply('dump:'. |
|
$ENV{'course.'.$cid.'.domain'}.':'. |
|
$ENV{'course.'.$cid.'.num'}. |
|
':nohist_expirationdates', |
|
$ENV{'course.'.$cid.'.home'}); |
|
unless ($reply=~/^error\:/) { |
|
map { |
|
my ($name,$value)=split(/\=/,$_); |
|
$expiredates{&Apache::lonnet::unescape($name)} |
|
=&Apache::lonnet::unescape($value); |
|
} split(/\&/,$reply); |
|
} |
|
} |
|
|
# ===================================================== Calculated sheets cache |
# ===================================================== Calculated sheets cache |
# |
# |
Line 1727 $tmpdir=$r->dir_config('lonDaemons').'/t
|
Line 1927 $tmpdir=$r->dir_config('lonDaemons').'/t
|
} |
} |
} (split(/&/,$ENV{'QUERY_STRING'})); |
} (split(/&/,$ENV{'QUERY_STRING'})); |
|
|
|
# -------------------------------------- Interactive loading of specific sheet? |
|
if (($ENV{'form.load'}) && ($ENV{'form.loadthissheet'} ne 'Default')) { |
|
$ENV{'form.ufn'}=$ENV{'form.loadthissheet'}; |
|
} |
# ------------------------------------------- Nothing there? Must be login user |
# ------------------------------------------- Nothing there? Must be login user |
|
|
my $aname; |
my $aname; |
Line 1762 $tmpdir=$r->dir_config('lonDaemons').'/t
|
Line 1966 $tmpdir=$r->dir_config('lonDaemons').'/t
|
} |
} |
} |
} |
|
|
|
function changesheet(cn) { |
|
document.sheet.unewfield.value=cn; |
|
document.sheet.unewformula.value='changesheet'; |
|
document.sheet.submit(); |
|
} |
|
|
</script> |
</script> |
ENDSCRIPT |
ENDSCRIPT |
$r->print('</head><body bgcolor="#FFFFFF">'. |
$r->print('</head><body bgcolor="#FFFFFF">'. |
Line 1778 ENDSCRIPT
|
Line 1988 ENDSCRIPT
|
|
|
$r->rflush(); |
$r->rflush(); |
|
|
|
# ---------------------------------------------------------------- Full recalc? |
|
|
|
|
|
if ($ENV{'form.forcerecalc'}) { |
|
$r->print('<h4>Completely Recalculating Sheet ...</h4>'); |
|
undef %spreadsheets; |
|
undef %courserdatas; |
|
undef %userrdatas; |
|
undef %defaultsheets; |
|
undef %updatedata; |
|
} |
|
|
# ---------------------------------------- Read new sheet or modified worksheet |
# ---------------------------------------- Read new sheet or modified worksheet |
|
|
$r->uri=~/\/(\w+)$/; |
$r->uri=~/\/(\w+)$/; |
Line 1818 ENDSCRIPT
|
Line 2040 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 something to save |
if ((&gettype($asheet) eq 'classcalc') || |
|
(&getuname($asheet) ne $ENV{'user.name'}) || |
if (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'})) { |
(&getudom($asheet) ne $ENV{'user.domain'})) { |
my $fname=''; |
unless (&Apache::lonnet::allowed('vgr',&getcid($asheet))) { |
if ($ENV{'form.saveas'} && ($fname=$ENV{'form.newfn'})) { |
$r->print( |
$fname=~s/\W/\_/g; |
'<h1>Access Permission Denied</h1></form></body></html>'); |
if ($fname eq 'default') { $fname='course_default'; } |
return OK; |
$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 |
# ---------------------------------------------------------- Additional options |
|
|
$r->print('<b>Current sheet:</b> '.&getfilename($asheet).'<p>'); |
$r->print( |
|
'<input type=submit name=forcerecalc value="Completely Recalculate Sheet"><p>' |
&tmpwrite($asheet); |
); |
|
if (&gettype($asheet) eq 'assesscalc') { |
|
$r->print ('<p><font size=+2><a href="/adm/studentcalc?uname='. |
|
&getuname($asheet). |
|
'&udom='.&getudom($asheet). |
|
'">Level up: Student Sheet</a></font><p>'); |
|
} |
|
|
|
if ((&gettype($asheet) eq 'studentcalc') && |
|
(&Apache::lonnet::allowed('vgr',&getcid($asheet)))) { |
|
$r->print ( |
|
'<p><font size=+2><a href="/adm/classcalc">'. |
|
'Level up: Course Sheet</a></font><p>'); |
|
} |
|
|
|
|
# ----------------------------------------------------------------- Save dialog |
# ----------------------------------------------------------------- Save dialog |
|
|
Line 1856 ENDSCRIPT
|
Line 2089 ENDSCRIPT
|
|
|
$r->print(&hiddenfield('ufn',&getfilename($asheet))); |
$r->print(&hiddenfield('ufn',&getfilename($asheet))); |
|
|
|
# ----------------------------------------------------------------- Load dialog |
|
if (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'})) { |
|
$r->print('<p><input type=submit name=load value="Load ...">'. |
|
'<select name="loadthissheet">'. |
|
'<option name="default">Default</option>'); |
|
map { |
|
$r->print('<option name="'.$_.'"'); |
|
if ($ENV{'form.ufn'} eq $_) { |
|
$r->print(' selected'); |
|
} |
|
$r->print('>'.$_.'</option>'); |
|
} &othersheets($asheet,&gettype($asheet)); |
|
$r->print('</select><p>'); |
|
if (&gettype($asheet) eq 'studentcalc') { |
|
&setothersheets($asheet,&othersheets($asheet,'assesscalc')); |
|
} |
|
} |
|
|
# --------------------------------------------------------------- Cached sheets |
# --------------------------------------------------------------- Cached sheets |
|
|
|
&expirationdates(); |
|
|
undef %oldsheets; |
undef %oldsheets; |
undef %loadedcaches; |
undef %loadedcaches; |
|
|
Line 1890 ENDSCRIPT
|
Line 2143 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('>'); |
|
if (&gettype($asheet) eq 'classcalc') { |
|
$r->print( |
|
' Output CSV format: <input type=checkbox name=showcsv onClick="submit()"'); |
|
if ($ENV{'form.showcsv'}) { $r->print(' checked'); } |
|
$r->print('>'); |
|
} |
|
# ------------------------------------------------------------- Print out sheet |
|
|
&outsheet($r,$asheet); |
&outsheet($r,$asheet); |
$r->print('</form></body></html>'); |
$r->print('</form></body></html>'); |
|
|