version 1.29, 2001/01/02 20:19:34
|
version 1.35, 2001/01/20 12:29:37
|
Line 3
|
Line 3
|
# |
# |
# 11/11,11/15,11/27,12/04,12/05,12/06,12/07, |
# 11/11,11/15,11/27,12/04,12/05,12/06,12/07, |
# 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 Gerd Kortemeyer |
# 01/01/01,02/01,03/01,19/01,20/01 Gerd Kortemeyer |
|
|
package Apache::lonspreadsheet; |
package Apache::lonspreadsheet; |
|
|
Line 20 use HTML::TokeParser;
|
Line 20 use HTML::TokeParser;
|
# These cache hashes need to be independent of user, resource and course |
# These cache hashes need to be independent of user, resource and course |
# (user and course can/should be in the keys) |
# (user and course can/should be in the keys) |
# |
# |
use vars qw(%spreadsheets %courserdatas %userrdatas %defaultsheets); |
|
|
my %spreadsheets; |
|
my %courserdatas; |
|
my %userrdatas; |
|
my %defaultsheets; |
|
my %updatedata; |
|
|
# |
# |
# These global hashes are dependent on user, course and resource, |
# These global hashes are dependent on user, course and resource, |
Line 423 ENDDEFS
|
Line 428 ENDDEFS
|
# ------------------------------------------------ Add or change formula values |
# ------------------------------------------------ Add or change formula values |
|
|
sub setformulas { |
sub setformulas { |
my ($safeeval,@f)=@_; |
my ($safeeval,%f)=@_; |
$safeeval->reval('%f='."('".join("','",@f)."');"); |
%{$safeeval->varglob('f')}=%f; |
} |
} |
|
|
# ------------------------------------------------ Add or change formula values |
# ------------------------------------------------ Add or change formula values |
|
|
sub setconstants { |
sub setconstants { |
my ($safeeval,@c)=@_; |
my ($safeeval,%c)=@_; |
$safeeval->reval('%c='."('".join("','",@c)."');"); |
%{$safeeval->varglob('c')}=%c; |
} |
} |
|
|
# ------------------------------------------------ Add or change formula values |
# ------------------------------------------------ Add or change formula values |
|
|
sub setrowlabels { |
sub setrowlabels { |
my ($safeeval,@rl)=@_; |
my ($safeeval,%rl)=@_; |
$safeeval->reval('%rl='."('".join("','",@rl)."');"); |
%{$safeeval->varglob('rl')}=%rl; |
} |
} |
|
|
# ------------------------------------------------------- Calculate spreadsheet |
# ------------------------------------------------------- Calculate spreadsheet |
Line 459 sub getvalues {
|
Line 464 sub getvalues {
|
|
|
sub getformulas { |
sub getformulas { |
my $safeeval=shift; |
my $safeeval=shift; |
return $safeeval->reval('%f'); |
return %{$safeeval->varglob('f')}; |
} |
} |
|
|
# -------------------------------------------------------------------- Get type |
# -------------------------------------------------------------------- Get type |
Line 781 sub makenewsheet {
|
Line 786 sub makenewsheet {
|
'";$uhome="'.&Apache::lonnet::homeserver($uname,$udom). |
'";$uhome="'.&Apache::lonnet::homeserver($uname,$udom). |
'";$sheettype="'.$stype. |
'";$sheettype="'.$stype. |
'";$usymb="'.$usymb. |
'";$usymb="'.$usymb. |
|
'";$csec="'.&Apache::lonnet::usection($udom,$uname, |
|
$ENV{'request.course.id'}). |
'";$cid="'.$ENV{'request.course.id'}. |
'";$cid="'.$ENV{'request.course.id'}. |
'";$cfn="'.$ENV{'request.course.fn'}. |
'";$cfn="'.$ENV{'request.course.fn'}. |
'";$cnum="'.$ENV{'course.'.$ENV{'request.course.id'}.'.num'}. |
'";$cnum="'.$ENV{'course.'.$ENV{'request.course.id'}.'.num'}. |
Line 815 sub writesheet {
|
Line 822 sub writesheet {
|
$sheetdata,$chome); |
$sheetdata,$chome); |
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'}, |
$chome); |
$chome); |
if ($reply eq 'ok') { |
if ($reply eq 'ok') { |
Line 1054 sub updateclasssheet {
|
Line 1061 sub updateclasssheet {
|
sub updatestudentassesssheet { |
sub updatestudentassesssheet { |
my $safeeval=shift; |
my $safeeval=shift; |
my %bighash; |
my %bighash; |
|
my $stype=&gettype($safeeval); |
|
my %current=(); |
|
unless ($updatedata{$ENV{'request.course.fn'}.'_'.$stype}) { |
# -------------------------------------------------------------------- Tie hash |
# -------------------------------------------------------------------- Tie hash |
if (tie(%bighash,'GDBM_File',$ENV{'request.course.fn'}.'.db', |
if (tie(%bighash,'GDBM_File',$ENV{'request.course.fn'}.'.db', |
&GDBM_READER,0640)) { |
&GDBM_READER,0640)) { |
Line 1062 sub updatestudentassesssheet {
|
Line 1072 sub updatestudentassesssheet {
|
my %allkeys=(); |
my %allkeys=(); |
my %allassess=(); |
my %allassess=(); |
|
|
my $stype=&gettype($safeeval); |
|
|
|
map { |
map { |
if ($_=~/^src\_(\d+)\.(\d+)$/) { |
if ($_=~/^src\_(\d+)\.(\d+)$/) { |
my $mapid=$1; |
my $mapid=$1; |
Line 1100 sub updatestudentassesssheet {
|
Line 1108 sub updatestudentassesssheet {
|
# %allkeys has a list of storage and parameter displays by unikey |
# %allkeys has a list of storage and parameter displays by unikey |
# %allassess has a list of all resource displays by symb |
# %allassess has a list of all resource displays by symb |
# |
# |
# -------------------- Find discrepancies between the course row table and this |
|
# |
|
my %f=&getformulas($safeeval); |
|
my $changed=0; |
|
|
|
my %current=(); |
|
if ($stype eq 'assesscalc') { |
if ($stype eq 'assesscalc') { |
%current=%allkeys; |
%current=%allkeys; |
} elsif ($stype eq 'studentcalc') { |
} elsif ($stype eq 'studentcalc') { |
%current=%allassess; |
%current=%allassess; |
} |
} |
|
$updatedata{$ENV{'request.course.fn'}.'_'.$stype}= |
|
join('___;___',%current); |
|
undef %allkeys; |
|
undef %allassess; |
|
} else { |
|
return 'Could not access course data'; |
|
} |
|
# ------------------------------------------------------ Get current from cache |
|
} else { |
|
%current=split(/\_\_\_\;\_\_\_/, |
|
$updatedata{$ENV{'request.course.fn'}.'_'.$stype}); |
|
} |
|
# -------------------- Find discrepancies between the course row table and this |
|
# |
|
my %f=&getformulas($safeeval); |
|
my $changed=0; |
|
|
my $maxrow=0; |
my $maxrow=0; |
my %existing=(); |
my %existing=(); |
Line 1136 sub updatestudentassesssheet {
|
Line 1155 sub updatestudentassesssheet {
|
$f{'A'.$maxrow}=$_; |
$f{'A'.$maxrow}=$_; |
} |
} |
} keys %current; |
} keys %current; |
|
|
if ($changed) { &setformulas($safeeval,%f); } |
if ($changed) { &setformulas($safeeval,%f); } |
|
|
&setmaxrow($safeeval,$maxrow); |
&setmaxrow($safeeval,$maxrow); |
&setrowlabels($safeeval,%current); |
&setrowlabels($safeeval,%current); |
|
|
} else { |
undef %current; |
return 'Could not access course data'; |
undef %existing; |
} |
|
} |
} |
|
|
# ------------------------------------------------ Load data for one assessment |
# ------------------------------------------------ Load data for one assessment |
Line 1157 sub loadstudent {
|
Line 1175 sub loadstudent {
|
if ($_=~/^A(\d+)/) { |
if ($_=~/^A(\d+)/) { |
my $row=$1; |
my $row=$1; |
unless ($f{$_}=~/^\!/) { |
unless ($f{$_}=~/^\!/) { |
# my @assessdata=split(/\_\_\_\;\_\_\_/, |
my @assessdata=&exportsheet(&getuname($safeeval), |
# &Apache::lonnet::ssi( |
&getudom($safeeval), |
# '/adm/assesscalc',('utarget' => 'export', |
'assesscalc',$f{$_}); |
# 'uname' => $uname, |
|
# 'udom' => $udom, |
|
# 'usymb' => $f{$_}))); |
|
my $index=0; |
my $index=0; |
# map { |
map { |
# if ($assessdata[$index]) { |
if ($assessdata[$index]) { |
# $c{$_.$row}=$assessdata[$index]; |
$c{$_.$row}=$assessdata[$index]; |
# unless ($_ eq 'A') { |
unless ($_ eq 'A') { |
# $f{$_.$row}='import'; |
$f{$_.$row}='import'; |
# } |
} |
# } |
} |
# $index++; |
$index++; |
# } ('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'); |
} |
} |
} |
} |
} keys %f; |
} keys %f; |
Line 1183 sub loadstudent {
|
Line 1198 sub loadstudent {
|
|
|
# --------------------------------------------------- Load data for one student |
# --------------------------------------------------- Load data for one student |
|
|
sub loadclass { |
sub loadcourse { |
my $safeeval=shift; |
my $safeeval=shift; |
my %c=(); |
my %c=(); |
my %f=&getformulas($safeeval); |
my %f=&getformulas($safeeval); |
map { |
map { |
if ($_=~/^A(\d+)/) { |
if ($_=~/^A(\d+)/) { |
my $row=$1; |
my $row=$1; |
unless ($f{$_}=~/^\!/) { |
unless (($f{$_}=~/^\!/) |
my ($tname,$tdom)=split(/\:/,$_); |
|| ($row>200)) |
# my @assessdata=split(/\_\_\_\;\_\_\_/, |
{ |
# &Apache::lonnet::ssi( |
my @studentdata=&exportsheet(&getuname($safeeval), |
# '/adm/studentcalc',('utarget' => 'export', |
&getudom($safeeval), |
# 'uname' => $tname, |
'studentcalc'); |
# 'udom' => $tdom))); |
undef %userrdatas; |
my $index=0; |
my $index=0; |
# map { |
map { |
# if ($assessdata[$index]) { |
if ($studentdata[$index]) { |
# $c{$_.$row}=$assessdata[$index]; |
$c{$_.$row}=$studentdata[$index]; |
# unless ($_ eq 'A') { |
unless ($_ eq 'A') { |
# $f{$_.$row}='import'; |
$f{$_.$row}='import'; |
# } |
} |
# } |
} |
# $index++; |
$index++; |
# } ('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'); |
} |
} |
} |
} |
} keys %f; |
} keys %f; |
Line 1252 sub loadassessment {
|
Line 1267 sub loadassessment {
|
# ----------------------------- returnhash now has all stores for this resource |
# ----------------------------- returnhash now has all stores for this resource |
|
|
# ---------------------------- initialize coursedata and userdata for this user |
# ---------------------------- initialize coursedata and userdata for this user |
%courseopt=(); |
undef %courseopt; |
%useropt=(); |
undef %useropt; |
|
|
my $userprefix=$uname.'_'.$udom.'_'; |
my $userprefix=$uname.'_'.$udom.'_'; |
|
|
unless ($uhome eq 'no_host') { |
unless ($uhome eq 'no_host') { |
# -------------------------------------------------------------- Get coursedata |
# -------------------------------------------------------------- Get coursedata |
unless |
unless |
((time-$courserdatas{$cid.'.last_cache'})<120) { |
((time-$courserdatas{$cid.'.last_cache'})<240) { |
my $reply=&Apache::lonnet::reply('dump:'.$cdom.':'.$cnum. |
my $reply=&Apache::lonnet::reply('dump:'.$cdom.':'.$cnum. |
':resourcedata',$chome); |
':resourcedata',$chome); |
if ($reply!~/^error\:/) { |
if ($reply!~/^error\:/) { |
Line 1275 sub loadassessment {
|
Line 1290 sub loadassessment {
|
} split(/\&/,$courserdatas{$ENV{'request.course.id'}}); |
} split(/\&/,$courserdatas{$ENV{'request.course.id'}}); |
# --------------------------------------------------- Get userdata (if present) |
# --------------------------------------------------- Get userdata (if present) |
unless |
unless |
((time-$userrdatas{$uname.'___'.$udom.'.last_cache'})<120) { |
((time-$userrdatas{$uname.'___'.$udom.'.last_cache'})<240) { |
my $reply= |
my $reply= |
&Apache::lonnet::reply('dump:'.$udom.':'.$uname.':resourcedata',$uhome); |
&Apache::lonnet::reply('dump:'.$udom.':'.$uname.':resourcedata',$uhome); |
if ($reply!~/^error\:/) { |
if ($reply!~/^error\:/) { |
Line 1385 sub exportsheet {
|
Line 1400 sub exportsheet {
|
&updatesheet($thissheet); |
&updatesheet($thissheet); |
&loadrows($thissheet); |
&loadrows($thissheet); |
&calcsheet($thissheet); |
&calcsheet($thissheet); |
return &exportdata($thissheet); |
my @returnthis=&exportdata($thissheet); |
|
undef $thissheet; |
|
return @returnthis; |
} |
} |
|
|
# ================================================================ Main handler |
# ================================================================ Main handler |
Line 1484 ENDSCRIPT
|
Line 1501 ENDSCRIPT
|
|
|
my $asheet=&makenewsheet($aname,$adom,$1,$ENV{'form.usymb'}); |
my $asheet=&makenewsheet($aname,$adom,$1,$ENV{'form.usymb'}); |
|
|
# if ($ENV{'form.unewfield'}) { |
# ------------------------ If a new formula had been entered, go from work copy |
# $r->print('<h2>Modified Workcopy</h2>'); |
|
# $ENV{'form.unewformula'}=~s/\'/\"/g; |
if ($ENV{'form.unewfield'}) { |
# $r->print('<p>New formula: '.$ENV{'form.unewfield'}.'='. |
$r->print('<h2>Modified Workcopy</h2>'); |
# $ENV{'form.unewformula'}.'<p>'); |
$ENV{'form.unewformula'}=~s/\'/\"/g; |
# &setfilename($sheetone,$ENV{'form.ufn'}); |
$r->print('<p>New formula: '.$ENV{'form.unewfield'}.'='. |
# &tmpread($sheetone,$r->dir_config('lonDaemons').'/tmp/', |
$ENV{'form.unewformula'}.'<p>'); |
# $ENV{'form.usymb'}, |
&setfilename($asheet,$ENV{'form.ufn'}); |
# $ENV{'form.unewfield'},$ENV{'form.unewformula'}); |
&tmpread($asheet, |
# } elsif ($ENV{'form.saveas'}) { |
$ENV{'form.unewfield'},$ENV{'form.unewformula'}); |
# &setfilename($sheetone,$ENV{'form.ufn'}); |
|
# &tmpread($sheetone,, |
} elsif ($ENV{'form.saveas'}) { |
# $ENV{'form.usymb'}); |
&setfilename($asheet,$ENV{'form.ufn'}); |
# } else { |
&tmpread($asheet); |
# unless ($ENV{'form.ufn'}) { |
} else { |
# }# |
&readsheet($asheet,$ENV{'form.ufn'}); |
# |
} |
# if (&gettype($sheetone) eq 'classcalc') { |
|
# ---------------------------------- For course view: get courselist and update |
# -------------------------------------------------- Print out user information |
# &updatestudentrows($sheetone); |
|
# } else { |
unless (&gettype($asheet) eq 'classcalc') { |
# ----------------- For assessment and student: See if all import rows uptodate |
$r->print('<p><b>User:</b> '.&getuname($asheet). |
# $csec=&Apache::lonnet::usection($udom,$uname,$ENV{'request.course.id'}); |
'<br><b>Domain:</b> '.&getudom($asheet)); |
# if ($csec eq '-1') { |
if (&getcsec($asheet) eq '-1') { |
# $r->print('<h3><font color=red>'. |
$r->print('<h3><font color=red>'. |
# "User '$uname' at domain '$udom' not a student in this course</font></h3>"); |
'Not a student in this course</font></h3>'); |
# } |
} else { |
# &updaterows($sheetone); |
$r->print('<br><b>Section/Group:</b> '.&getcsec($asheet)); |
# untie(%parmhash); |
} |
# } else { |
} |
# $r->print('<h3><font color=red>'. |
|
# 'Could not initialize import fields (not in a course)</font></h3>'); |
# ---------------------------------------------------------------- Course title |
# } |
|
# } |
$r->print('<h1>'. |
|
$ENV{'course.'.$ENV{'request.course.id'}.'.description'}.'</h1>'); |
|
|
|
|
# ---------------------------------------------------- See if something to save |
# ---------------------------------------------------- See if something to save |
# if (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'})) { |
|
# my $fname=''; |
if (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'})) { |
# if ($ENV{'form.saveas'} && ($fname=$ENV{'form.newfn'})) { |
my $fname=''; |
# $fname=~s/\W/\_/g; |
if ($ENV{'form.saveas'} && ($fname=$ENV{'form.newfn'})) { |
# if ($fname eq 'default') { $fname='course_default'; } |
$fname=~s/\W/\_/g; |
# $fname.='_'.&gettype($sheetone); |
if ($fname eq 'default') { $fname='course_default'; } |
# &setfilename($sheetone,$fname); |
$fname.='_'.&gettype($asheet); |
# $ENV{'form.ufn'}=$fname; |
&setfilename($asheet,$fname); |
# my $reply=&writesheet($sheetone); |
$ENV{'form.ufn'}=$fname; |
# unless ($reroute) { |
$r->print('<p>Saving spreadsheet: '. |
# $r->print('<p>Saving spreadsheet: '.$reply.'<p>'); |
&writesheet($asheet,$ENV{'form.makedefufn'}).'<p>'); |
# } |
} |
# if ($ENV{'form.makedefufn'}) { |
} |
# my $reply=&Apache::lonnet::reply('put:'. |
|
# $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.':'. |
|
# $ENV{'course.'.$ENV{'request.course.id'}.'.num'}. |
|
# ':environment:spreadsheet_default_'. |
|
# &gettype($sheetone).'='. |
|
# &Apache::lonnet::escape($fname), |
|
# $ENV{'course.'.$ENV{'request.course.id'}.'.home'}); |
|
# unless ($reroute) { |
|
# $r->print('<p>Making default spreadsheet: '.$reply.'<p>'); |
|
# } |
|
# } |
|
# } |
|
# } |
|
# ------------------------------------------------ Write the modified worksheet |
# ------------------------------------------------ Write the modified worksheet |
# |
|
# &tmpwrite($sheetone,$r->dir_config('lonDaemons').'/tmp/', |
$r->print('<b>Current sheet:</b> '.&getfilename($asheet).'<p>'); |
# $ENV{'form.usymb'}); |
|
# |
&tmpwrite($asheet); |
# ----------------------------------------------------- Print user, course, etc |
|
# unless ($reroute) { |
# ----------------------------------------------------------------- Save dialog |
# if (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'})) { |
|
# my $fname=$ENV{'form.ufn'}; |
|
# $fname=~s/\_[^\_]+$//; |
|
# if ($fname eq 'default') { $fname='course_default'; } |
|
# $r->print('<input type=submit name=saveas value="Save as ...">'. |
|
# '<input type=text size=20 name=newfn value="'.$fname. |
|
# '"> (make default: <input type=checkbox name="makedefufn">)<p>'); |
|
# } |
|
# $r->print(&hiddenfield('ufn',$ENV{'form.ufn'})); |
|
# unless (&gettype($sheetone) eq 'classcalc') { |
|
# $r->print('<br><b>User:</b> '.$uname.'<br><b>Domain:</b> '.$udom); |
|
# } |
|
# $r->print('<h1>'. |
|
# $ENV{'course.'.$ENV{'request.course.id'}.'.description'}.'</h1>'); |
|
# if ($csec) { |
|
# $r->print('<h3>Group/Section: '.$csec.'</h3>'); |
|
# } |
|
# } |
|
# -------------------------------------------------------- Import and calculate |
|
# |
|
# if (&gettype($sheetone) eq 'assesscalc') { |
|
# &rowaassess($sheetone,$ENV{'form.usymb'}); |
|
# } elsif (&gettype($sheetone) eq 'studentcalc') { |
|
# &rowazstudent($sheetone); |
|
# } else { |
|
# &rowazclass($sheetone); |
|
# } |
|
|
|
|
|
&readsheet($asheet,''); |
if (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'})) { |
|
my $fname=$ENV{'form.ufn'}; |
|
$fname=~s/\_[^\_]+$//; |
|
if ($fname eq 'default') { $fname='course_default'; } |
|
$r->print('<input type=submit name=saveas value="Save as ...">'. |
|
'<input type=text size=20 name=newfn value="'.$fname. |
|
'"> (make default: <input type=checkbox name="makedefufn">)<p>'); |
|
} |
|
|
|
$r->print(&hiddenfield('ufn',&getfilename($asheet))); |
|
|
|
|
|
# ----------------------------------------------------- Update sheet, load rows |
|
|
&updatesheet($asheet); |
&updatesheet($asheet); |
&loadrows($asheet); |
&loadrows($asheet); |
|
|
Line 1592 ENDSCRIPT
|
Line 1586 ENDSCRIPT
|
&outsheet($r,$asheet); |
&outsheet($r,$asheet); |
$r->print('</form></body></html>'); |
$r->print('</form></body></html>'); |
|
|
|
# --------------------------------- We know this leaks, so terminate this child |
|
|
|
$r->child_terminate(); |
|
|
# ------------------------------------------------------------------------ Done |
# ------------------------------------------------------------------------ Done |
} else { |
} else { |