version 1.29, 2001/01/02 20:19:34
|
version 1.34, 2001/01/20 01:07:03
|
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 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; |
|
|
# |
# |
# These global hashes are dependent on user, course and resource, |
# These global hashes are dependent on user, course and resource, |
Line 423 ENDDEFS
|
Line 427 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 463 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 785 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 821 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 1157 sub loadstudent {
|
Line 1163 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 1186 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(/\:/,$_); |
|
# my @assessdata=split(/\_\_\_\;\_\_\_/, |
|| ($row>200)) |
# &Apache::lonnet::ssi( |
|
# '/adm/studentcalc',('utarget' => 'export', |
{ |
# 'uname' => $tname, |
my @studentdata=&exportsheet(&getuname($safeeval), |
# 'udom' => $tdom))); |
&getudom($safeeval), |
|
'studentcalc'); |
|
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 1257 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 1280 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 1390 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 1491 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/', |
|
# $ENV{'form.usymb'}); |
|
# |
|
# ----------------------------------------------------- Print user, course, etc |
|
# unless ($reroute) { |
|
# 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); |
|
# } |
|
|
|
|
$r->print('<b>Current sheet:</b> '.&getfilename($asheet).'<p>'); |
|
|
|
&tmpwrite($asheet); |
|
|
|
# ----------------------------------------------------------------- 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',&getfilename($asheet))); |
|
|
|
|
|
# ----------------------------------------------------- Update sheet, load rows |
|
|
&readsheet($asheet,''); |
|
&updatesheet($asheet); |
&updatesheet($asheet); |
&loadrows($asheet); |
&loadrows($asheet); |
|
|
Line 1592 ENDSCRIPT
|
Line 1576 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 { |