version 1.117, 2002/10/16 16:35:42
|
version 1.118, 2002/10/18 13:46:01
|
Line 61 use Apache::Constants qw(:common :http);
|
Line 61 use Apache::Constants qw(:common :http);
|
use GDBM_File; |
use GDBM_File; |
use HTML::TokeParser; |
use HTML::TokeParser; |
use Apache::lonhtmlcommon; |
use Apache::lonhtmlcommon; |
|
use Apache::loncoursedata; |
# |
# |
# Caches for coursewide information |
# Caches for coursewide information |
# |
# |
Line 116 my $tmpdir;
|
Line 117 my $tmpdir;
|
# ============================================================================= |
# ============================================================================= |
# ===================================== Implements an instance of a spreadsheet |
# ===================================== Implements an instance of a spreadsheet |
|
|
sub initsheet { |
## |
my $safeeval = new Safe(shift); |
## mask - used to reside in the safe space. |
my $safehole = new Safe::Hole; |
## |
$safeeval->permit("entereval"); |
|
$safeeval->permit(":base_math"); |
|
$safeeval->permit("sort"); |
|
$safeeval->deny(":base_io"); |
|
$safehole->wrap(\&Apache::lonnet::EXT,$safeeval,'&EXT'); |
|
$safeeval->share('$@'); |
|
my $code=<<'ENDDEFS'; |
|
# ---------------------------------------------------- Inside of the safe space |
|
|
|
# |
|
# f: formulas |
|
# t: intermediate format (variable references expanded) |
|
# v: output values |
|
# c: preloaded constants (A-column) |
|
# rl: row label |
|
# os: other spreadsheets (for student spreadsheet only) |
|
|
|
undef %sheet_values; |
|
undef %t; |
|
undef %f; |
|
undef %c; |
|
undef %rowlabel; |
|
undef @os; |
|
|
|
$maxrow = 0; |
|
$sheettype = ''; |
|
|
|
# filename/reference of the sheet |
|
$filename = ''; |
|
|
|
# user data |
|
$uname = ''; |
|
$uhome = ''; |
|
$udom = ''; |
|
|
|
# course data |
|
|
|
$csec = ''; |
|
$chome= ''; |
|
$cnum = ''; |
|
$cdom = ''; |
|
$cid = ''; |
|
$coursefilename = ''; |
|
|
|
# symb |
|
|
|
$usymb = ''; |
|
|
|
# error messages |
|
$errormsg = ''; |
|
|
|
sub mask { |
sub mask { |
my ($lower,$upper)=@_; |
my ($lower,$upper)=@_; |
|
|
Line 193 sub mask {
|
Line 143 sub mask {
|
$alpha='['.$la.'-Za-'.$ua.']'; |
$alpha='['.$la.'-Za-'.$ua.']'; |
} |
} |
} |
} |
|
|
if (($ld eq '*') || ($ud eq '*')) { |
if (($ld eq '*') || ($ud eq '*')) { |
$num='\d+'; |
$num='\d+'; |
} else { |
} else { |
Line 213 sub mask {
|
Line 162 sub mask {
|
} else { |
} else { |
my @lda=($ld=~m/\d/g); |
my @lda=($ld=~m/\d/g); |
my @uda=($ud=~m/\d/g); |
my @uda=($ud=~m/\d/g); |
my $i; $j=0; $notdone=1; |
my $i; |
|
my $j=0; |
|
my $notdone=1; |
for ($i=0;($i<=$#lda)&&($notdone);$i++) { |
for ($i=0;($i<=$#lda)&&($notdone);$i++) { |
if ($lda[$i]==$uda[$i]) { |
if ($lda[$i]==$uda[$i]) { |
$num.=$lda[$i]; |
$num.=$lda[$i]; |
Line 246 sub mask {
|
Line 197 sub mask {
|
return '^'.$alpha.$num."\$"; |
return '^'.$alpha.$num."\$"; |
} |
} |
|
|
|
|
|
|
|
sub initsheet { |
|
my $safeeval = new Safe(shift); |
|
my $safehole = new Safe::Hole; |
|
$safeeval->permit("entereval"); |
|
$safeeval->permit(":base_math"); |
|
$safeeval->permit("sort"); |
|
$safeeval->deny(":base_io"); |
|
$safehole->wrap(\&Apache::lonnet::EXT,$safeeval,'&EXT'); |
|
$safehole->wrap(\&Apache::lonspreadsheet::mask,$safeeval,'&mask'); |
|
$safehole->wrap(\&Apache::lonspreadsheet::templaterow,$safeeval,'&templaterow'); |
|
$safeeval->share('$@'); |
|
my $code=<<'ENDDEFS'; |
|
# ---------------------------------------------------- Inside of the safe space |
|
|
|
# |
|
# f: formulas |
|
# t: intermediate format (variable references expanded) |
|
# v: output values |
|
# c: preloaded constants (A-column) |
|
# rl: row label |
|
# os: other spreadsheets (for student spreadsheet only) |
|
|
|
undef %sheet_values; |
|
undef %t; |
|
undef %f; |
|
undef %c; |
|
undef %rowlabel; |
|
undef @os; |
|
|
|
$maxrow = 0; |
|
$sheettype = ''; |
|
|
|
# filename/reference of the sheet |
|
$filename = ''; |
|
|
|
# user data |
|
$uname = ''; |
|
$uhome = ''; |
|
$udom = ''; |
|
|
|
# course data |
|
|
|
$csec = ''; |
|
$chome= ''; |
|
$cnum = ''; |
|
$cdom = ''; |
|
$cid = ''; |
|
$coursefilename = ''; |
|
|
|
# symb |
|
|
|
$usymb = ''; |
|
|
|
# error messages |
|
$errormsg = ''; |
|
|
|
|
#------------------------------------------------------- |
#------------------------------------------------------- |
|
|
=item UWCALC(hashname,modules,units,date) |
=item UWCALC(hashname,modules,units,date) |
Line 918 sub calc {
|
Line 928 sub calc {
|
return ''; |
return ''; |
} |
} |
|
|
sub templaterow { |
|
my @cols=(); |
|
$cols[0]='<b><font size=+1>Template</font></b>'; |
|
foreach ('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') { |
|
my $fm=$f{'template_'.$_}; |
|
$fm=~s/[\'\"]/\&\#34;/g; |
|
push(@cols,"'template_$_','$fm'".'___eq___'.$fm); |
|
} |
|
return @cols; |
|
} |
|
|
|
# |
# |
# This is actually used for the student spreadsheet, not the assessment sheet |
# This is actually used for the student spreadsheet, not the assessment sheet |
# Do not be fooled by the name! |
# Do not be fooled by the name! |
Line 999 sub exportrowa {
|
Line 995 sub exportrowa {
|
return @exportarray; |
return @exportarray; |
} |
} |
|
|
|
sub templaterow { |
|
my @cols=(); |
|
$cols[0]='<b><font size=+1>Template</font></b>'; |
|
foreach ('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') { |
|
my $fm=$f{'template_'.$_}; |
|
$fm=~s/[\'\"]/\&\#34;/g; |
|
push(@cols,"'template_$_','$fm'".'___eq___'.$fm); |
|
} |
|
return @cols; |
|
} |
|
|
|
|
# ------------------------------------------- End of "Inside of the safe space" |
# ------------------------------------------- End of "Inside of the safe space" |
ENDDEFS |
ENDDEFS |
$safeeval->reval($code); |
$safeeval->reval($code); |
return $safeeval; |
return $safeeval; |
} |
} |
|
|
|
|
# ------------------------------------------------ Add or change formula values |
# ------------------------------------------------ Add or change formula values |
sub setformulas { |
sub setformulas { |
my ($safeeval,%f)=@_; |
my ($safeeval,%f)=@_; |
Line 1567 sub updateclasssheet {
|
Line 1579 sub updateclasssheet {
|
|
|
# |
# |
# Read class list and row labels |
# Read class list and row labels |
my %classlist; |
my $classlist = &Apache::loncoursedata::get_classlist(); |
my @tmp = &Apache::lonnet::dump('classlist',$cdom,$cnum); |
if (! defined($classlist)) { |
if ($tmp[0] !~ /^error/) { |
return 'Could not access course classlist'; |
%classlist = @tmp; |
} |
} else { |
|
return 'Could not access course data'; |
|
} |
|
undef @tmp; |
|
# |
# |
my %currentlist=(); |
my %currentlist=(); |
my $now=time; |
foreach my $student (keys(%$classlist)) { |
foreach my $student (keys(%classlist)) { |
my ($studentDomain,$studentName,$end,$start,$id,$studentSection, |
my ($end,$start)=split(/\:/,$classlist{$student}); |
$fullname,$status) = @{$classlist->{$student}}; |
my $active=1; |
if ($ENV{'form.Status'} eq $status || $ENV{'form.Status'} eq 'Any') { |
$active = 0 if (($end) && ($now>$end)); |
|
$active = 1 if ($ENV{'form.Status'} eq 'Any'); |
|
$active = !$active if ($ENV{'form.Status'} eq 'Expired'); |
|
if ($active) { |
|
my $rowlabel=''; |
my $rowlabel=''; |
my ($studentName,$studentDomain)=split(/\:/,$student); |
if ($ENV{'form.showcsv'}) { |
my $studentSection=&Apache::lonnet::usection($studentDomain, |
$rowlabel= '"'.join('","',($studentName,$studentDomain, |
$studentName,$cid); |
$fullname,$studentSection,$id).'"'); |
$Section{$studentName.':'.$studentDomain} = $studentSection; |
} else { |
# if ($studentSection==-1) { |
$rowlabel='<a href="/adm/studentcalc?uname='.$studentName. |
# unless ($ENV{'form.showcsv'}) { |
'&udom='.$studentDomain.'">'; |
# $rowlabel='<font color=red>Data not available: '. |
$rowlabel.=$studentSection.' '.$id." ".$fullname; |
# $studentName.'</font>'; |
$rowlabel.='</a>'; |
# } else { |
} |
# $rowlabel='ERROR","'.$studentName. |
|
# '","Data not available","","","'; |
|
# } |
|
# } else { |
|
my %reply=&Apache::lonnet::idrget($studentDomain,$studentName); |
|
my %studentInformation=&Apache::lonnet::get |
|
('environment', |
|
['lastname','generation','firstname','middlename','id'], |
|
$studentDomain,$studentName); |
|
if (! $ENV{'form.showcsv'}) { |
|
$rowlabel='<a href="/adm/studentcalc?uname='.$studentName. |
|
'&udom='.$studentDomain.'">'. |
|
$studentSection.' '; |
|
foreach ('id','firstname','middlename', |
|
'lastname','generation'){ |
|
$rowlabel.=$studentInformation{$_}." "; |
|
} |
|
$rowlabel.='</a>'; |
|
} else { |
|
$rowlabel= '"'.join('","', |
|
($studentSection, |
|
$studentInformation{'id'}, |
|
$studentInformation{'firstname'}, |
|
$studentInformation{'middlename'}, |
|
$studentInformation{'lastname'}, |
|
$studentInformation{'generation'}) |
|
).'"'; |
|
} |
|
# } |
|
$currentlist{$student}=$rowlabel; |
$currentlist{$student}=$rowlabel; |
} # end of if ($active) |
} |
} # end of foreach my $student (keys(%classlist)) |
} |
# |
# |
# Find discrepancies between the course row table and this |
# Find discrepancies between the course row table and this |
# |
# |
Line 2304 sub cachedssheets {
|
Line 2279 sub cachedssheets {
|
sub handler { |
sub handler { |
my $r=shift; |
my $r=shift; |
|
|
|
if (! exists($ENV{'form.Status'})) { |
|
$ENV{'form.Status'} = 'Active'; |
|
} |
# Check this server |
# Check this server |
my $loaderror=&Apache::lonnet::overloaderror($r); |
my $loaderror=&Apache::lonnet::overloaderror($r); |
if ($loaderror) { return $loaderror; } |
if ($loaderror) { return $loaderror; } |