version 1.51, 2001/03/21 15:38:47
|
version 1.57, 2001/07/21 23:55:31
|
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,03/21 Gerd Kortemeyer |
# 03/19,03/20,03/21,03/27,04/05,04/09, |
|
# 07/09,07/14,07/21 Gerd Kortemeyer |
|
|
package Apache::lonspreadsheet; |
package Apache::lonspreadsheet; |
|
|
Line 77 sub initsheet {
|
Line 78 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 397 sub outrowassess {
|
Line 400 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]=$f{'A'.$n}.'<br>'.$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 474 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 621 sub exportdata {
|
return $safeeval->reval('&exportrowa()'); |
return $safeeval->reval('&exportrowa()'); |
} |
} |
|
|
|
|
# ========================================================== End of Spreadsheet |
# ========================================================== End of Spreadsheet |
# ============================================================================= |
# ============================================================================= |
|
|
Line 638 sub rown {
|
Line 660 sub rown {
|
my $showf=0; |
my $showf=0; |
my $proc; |
my $proc; |
my $maxred; |
my $maxred; |
if (&gettype($safeeval) eq 'assesscalc') { |
if (&gettype($safeeval) eq 'studentcalc') { |
$proc='&outrowassess'; |
$proc='&outrowassess'; |
$maxred=1; |
$maxred=26; |
} else { |
} else { |
$proc='&outrow'; |
$proc='&outrow'; |
|
} |
|
if (&gettype($safeeval) eq 'assesscalc') { |
|
$maxred=1; |
|
} else { |
$maxred=26; |
$maxred=26; |
} |
} |
if ($n eq '-') { $proc='&templaterow'; $n=-1; } |
if ($n eq '-') { $proc='&templaterow'; $n=-1; } |
Line 716 sub outsheet {
|
Line 742 sub outsheet {
|
} |
} |
|
|
# |
# |
|
# ----------------------------------------------- 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; |
|
} |
|
|
|
# |
# -------------------------------------- Read spreadsheet formulas for a course |
# -------------------------------------- Read spreadsheet formulas for a course |
# |
# |
|
|
Line 835 sub writesheet {
|
Line 884 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 895 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 954 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 1093 sub updatestudentassesssheet {
|
Line 1152 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=''; |
my $adduserstr=''; |
Line 1169 sub updatestudentassesssheet {
|
Line 1229 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 1222 sub loadstudent {
|
Line 1286 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 1506 sub forcedrecalc {
|
Line 1571 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]; |
Line 1758 $tmpdir=$r->dir_config('lonDaemons').'/t
|
Line 1824 $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 1793 $tmpdir=$r->dir_config('lonDaemons').'/t
|
Line 1863 $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 1809 ENDSCRIPT
|
Line 1885 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 1851 ENDSCRIPT
|
Line 1939 ENDSCRIPT
|
$r->print('<h1>'. |
$r->print('<h1>'. |
$ENV{'course.'.$ENV{'request.course.id'}.'.description'}.'</h1>'); |
$ENV{'course.'.$ENV{'request.course.id'}.'.description'}.'</h1>'); |
|
|
|
# ---------------------------------------------------- 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 1887 ENDSCRIPT
|
Line 1985 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(); |
&expirationdates(); |
Line 1923 ENDSCRIPT
|
Line 2039 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); |
|
|
|
# ------------------------------------------------------------- Print out sheet |
|
|
&outsheet($r,$asheet); |
&outsheet($r,$asheet); |
$r->print('</form></body></html>'); |
$r->print('</form></body></html>'); |
|
|