--- loncom/interface/Attic/lonspreadsheet.pm 2002/11/12 20:14:51 1.138
+++ loncom/interface/Attic/lonspreadsheet.pm 2002/11/15 18:59:28 1.141
@@ -1,5 +1,5 @@
#
-# $Id: lonspreadsheet.pm,v 1.138 2002/11/12 20:14:51 matthew Exp $
+# $Id: lonspreadsheet.pm,v 1.141 2002/11/15 18:59:28 matthew Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -53,16 +53,16 @@ built-in functions.
package Apache::lonspreadsheet;
use strict;
+use Apache::Constants qw(:common :http);
+use Apache::lonnet;
+use Apache::lonhtmlcommon;
+use Apache::loncoursedata;
+use Apache::File();
use Safe;
use Safe::Hole;
use Opcode;
-use Apache::lonnet;
-use Apache::Constants qw(:common :http);
use GDBM_File;
use HTML::TokeParser;
-use Apache::lonhtmlcommon;
-use Apache::loncoursedata;
-use Apache::File();
use Spreadsheet::WriteExcel;
#
@@ -1086,6 +1086,44 @@ sub geterrorlog {
return ${$sheet->{'safe'}->varglob('errorlog')};
}
+sub gettitle {
+ my $sheet = shift;
+ if ($sheet->{'sheettype'} eq 'classcalc') {
+ return $sheet->{'coursedesc'};
+ } elsif ($sheet->{'sheettype'} eq 'studentcalc') {
+ return 'Grades for '.$sheet->{'uname'}.'@'.$sheet->{'udom'};
+ } elsif ($sheet->{'sheettype'} eq 'assesscalc') {
+ if (($sheet->{'usymb'} eq '_feedback') ||
+ ($sheet->{'usymb'} eq '_evaluation') ||
+ ($sheet->{'usymb'} eq '_discussion') ||
+ ($sheet->{'usymb'} eq '_tutoring')) {
+ my $title = $sheet->{'usymb'};
+ $title =~ s/^_//;
+ $title = ucfirst($title);
+ return $title;
+ }
+ return if (! defined($sheet->{'mapid'}) ||
+ $sheet->{'mapid'} !~ /^\d+$/);
+ my $mapid = $sheet->{'mapid'};
+ return if (! defined($sheet->{'resid'}) ||
+ $sheet->{'resid'} !~ /^\d+$/);
+ my $resid = $sheet->{'resid'};
+ my %course_db;
+ tie(%course_db,'GDBM_File',$sheet->{'coursefilename'}.'.db',
+ &GDBM_READER(),0640);
+ return if (! tied(%course_db));
+ my $key = 'title_'.$mapid.'.'.$resid;
+ my $title = '';
+ if (exists($course_db{$key})) {
+ $title = $course_db{$key};
+ } else {
+ $title = $sheet->{'usymb'};
+ }
+ untie (%course_db);
+ return $title;
+ }
+}
+
# ----------------------------------------------------- Get value of $f{'A'.$n}
sub getfa {
my $sheet = shift;
@@ -1111,7 +1149,7 @@ sub exportdata {
sub update_student_sheet{
- my $sheet = shift;
+ my ($sheet,$c) = @_;
# Load in the studentcalc sheet
&readsheet($sheet,'default_studentcalc');
# Determine the structure (contained assessments, etc) of the sheet
@@ -1119,7 +1157,7 @@ sub update_student_sheet{
# Load in the cached sheets for this student
&cachedssheets($sheet);
# Load in the (possibly cached) data from the assessment sheets
- &loadstudent($sheet);
+ &loadstudent($sheet,$c);
# Compute the sheet
&calcsheet($sheet);
}
@@ -1153,6 +1191,7 @@ sub sort_indicies {
#
my @sortby=();
my @sortidx=();
+ # Skip row 0
for (my $row=1;$row<=$sheet->{'maxrow'};$row++) {
push (@sortby, $sheet->{'safe'}->reval('$f{"A'.$row.'"}'));
push (@sortidx, $row);
@@ -1268,7 +1307,6 @@ END
# Print out summary/export row
####################################
my ($rowlabel,@rowdata) = &get_row($sheet,'0');
- my $rowcount = 0;
$row_html = '
'.&format_html_rowlabel($rowlabel).' | ';
$num_cols_output = 0;
foreach my $cell (@rowdata) {
@@ -1294,6 +1332,19 @@ END
foreach my $rownum (@Rows) {
my ($rowlabel,@rowdata) = &get_row($sheet,$rownum);
next if ($rowlabel =~ /^\s*$/);
+ next if (($sheet->{'sheettype'} eq 'assesscalc') &&
+ (! $ENV{'form.showall'}) &&
+ ($rowdata[0]->{'value'} =~ /^\s*$/));
+ if ($sheet->{'sheettype'} =~ /^(studentcalc|classcalc)$/) {
+ my $row_is_empty = 1;
+ foreach my $cell (@rowdata) {
+ if ($cell->{'value'} !~ /^\s*$/) {
+ $row_is_empty = 0;
+ last;
+ }
+ }
+ next if $row_is_empty;
+ }
#
my $defaultbg='#E0FF';
#
@@ -1458,7 +1509,7 @@ END
# Create a new spreadsheet
my $studentsheet = &makenewsheet($sname,$sdom,'studentcalc',undef);
# Read in the spreadsheet definition
- &update_student_sheet($studentsheet);
+ &update_student_sheet($studentsheet,$c);
# Stuff the sheet into excel
&export_sheet_as_excel($studentsheet,$student_excel_worksheet);
my $totaltime = int((time - $starttime) / $count * $sheet->{'maxrow'});
@@ -1543,25 +1594,46 @@ sub create_excel_spreadsheet {
sub export_sheet_as_excel {
my $sheet = shift;
my $worksheet = shift;
+ #
+ my $rows_output = 0;
+ my $cols_output = 0;
+ ####################################
+ # Write an identifying row #
+ ####################################
+ my @Headerinfo = ($sheet->{'coursedesc'});
+ my $title = &gettitle($sheet);
+ $cols_output = 0;
+ if (defined($title)) {
+ $worksheet->write($rows_output++,$cols_output++,$title);
+ }
+ ####################################
+ # Write the summary/export row #
+ ####################################
+ my ($rowlabel,@rowdata) = &get_row($sheet,'0');
+ my $label = &format_excel_rowlabel($rowlabel);
+ $cols_output = 0;
+ $worksheet->write($rows_output,$cols_output++,$label);
+ foreach my $cell (@rowdata) {
+ $worksheet->write($rows_output,$cols_output++,$cell->{'value'});
+ }
+ $rows_output+= 2; # Skip a row, just for fun
####################################
# Prepare to output rows
####################################
my @Rows = &sort_indicies($sheet);
#
# Loop through the rows and output them one at a time
- my $rows_output=0;
foreach my $rownum (@Rows) {
my ($rowlabel,@rowdata) = &get_row($sheet,$rownum);
next if ($rowlabel =~ /^\s*$/);
- my $cols_output = 0;
+ $cols_output = 0;
my $label = &format_excel_rowlabel($rowlabel);
$worksheet->write($rows_output,$cols_output++,$label);
if (ref($label)) {
$cols_output = (scalar(@$label));
}
foreach my $cell (@rowdata) {
- $worksheet->write($rows_output,$cols_output++,
- $cell->{'value'});
+ $worksheet->write($rows_output,$cols_output++,$cell->{'value'});
}
$rows_output++;
}
@@ -1694,7 +1766,8 @@ sub readsheet {
if ($fh=Apache::File->new($includedir.'/'.$dfn)) {
$sheetxml=join('',<$fh>);
} else {
- $sheetxml='"Error"';
+ # $sheetxml='"Error"';
+ $sheetxml='';
}
%f=%{&parse_sheet(\$sheetxml)};
} elsif($fn=~/\/*\.spreadsheet$/) {
@@ -1730,6 +1803,8 @@ sub makenewsheet {
$sheet->{'udom'} = $udom;
$sheet->{'sheettype'} = $stype;
$sheet->{'usymb'} = $usymb;
+ $sheet->{'mapid'} = $ENV{'form.mapid'};
+ $sheet->{'resid'} = $ENV{'form.resid'};
$sheet->{'cid'} = $ENV{'request.course.id'};
$sheet->{'csec'} = $Section{$uname.':'.$udom};
$sheet->{'coursefilename'} = $ENV{'request.course.fn'};
@@ -1737,7 +1812,7 @@ sub makenewsheet {
$sheet->{'cdom'} = $ENV{'course.'.$ENV{'request.course.id'}.'.domain'};
$sheet->{'chome'} = $ENV{'course.'.$ENV{'request.course.id'}.'.home'};
$sheet->{'coursedesc'} = $ENV{'course.'.$ENV{'request.course.id'}.
- 'description'};
+ '.description'};
$sheet->{'uhome'} = &Apache::lonnet::homeserver($uname,$udom);
#
#
@@ -1943,10 +2018,11 @@ sub format_html_rowlabel {
my ($type,$labeldata) = split(':',$rowlabel,2);
my $result = '';
if ($type eq 'symb') {
- my ($symb,$uname,$udom,$title) = split(':',$labeldata);
+ my ($symb,$uname,$udom,$mapid,$resid,$title) = split(':',$labeldata);
$symb = &Apache::lonnet::unescape($symb);
$result = ''.$title.'';
+ '&uname='.$uname.'&udom='.$udom.
+ '&mapid='.$mapid.'&resid='.$resid.'">'.$title.'';
} elsif ($type eq 'student') {
my ($sname,$sdom,$fullname,$section,$id) = split(':',$labeldata);
$result ='{'f'} = \%f;
+ $sheet->{'f'} = \%formulas;
&setformulas($sheet);
- &setconstants($sheet,\%c);
+ &setconstants($sheet,\%constants);
}
# --------------------------------------------------- Load data for one student
#
sub loadcourse {
- my ($sheet,$r)=@_;
+ my ($sheet,$r,$c)=@_;
#
- my %c=();
- my %f=&getformulas($sheet);
+ my %constants=();
+ my %formulas=&getformulas($sheet);
#
my $total=0;
- foreach (keys(%f)) {
+ foreach (keys(%formulas)) {
if ($_=~/^A(\d+)/) {
- unless ($f{$_}=~/^[\!\~\-]/) { $total++; }
+ unless ($formulas{$_}=~/^[\!\~\-]/) { $total++; }
}
}
my $now=0;
@@ -2307,12 +2388,16 @@ sub loadcourse {
ENDPOP
$r->rflush();
- foreach (keys(%f)) {
+ foreach (keys(%formulas)) {
+ if(defined($c) && ($c->aborted())) {
+ last;
+ }
next if ($_!~/^A(\d+)/);
my $row=$1;
- next if (($f{$_}=~/^[\!\~\-]/) || ($row==0));
- my ($sname,$sdom) = split(':',$f{$_});
- my @studentdata=&exportsheet($sheet,$sname,$sdom,'studentcalc');
+ next if (($formulas{$_}=~/^[\!\~\-]/) || ($row==0));
+ my ($sname,$sdom) = split(':',$formulas{$_});
+ my @studentdata=&exportsheet($sheet,$sname,$sdom,'studentcalc',
+ undef,undef,$r);
undef %userrdatas;
$now++;
$r->print('');
$r->rflush();
}
@@ -2347,7 +2432,7 @@ ENDPOP
# ------------------------------------------------ Load data for one assessment
#
sub loadassessment {
- my ($sheet)=@_;
+ my ($sheet,$r,$c)=@_;
my $uhome = $sheet->{'uhome'};
my $uname = $sheet->{'uname'};
@@ -2511,13 +2596,14 @@ sub updatesheet {
sub loadrows {
my ($sheet,$r)=@_;
+ my $c = $r->connection;
my $stype=$sheet->{'sheettype'};
if ($stype eq 'classcalc') {
- &loadcourse($sheet,$r);
+ &loadcourse($sheet,$r,$c);
} elsif ($stype eq 'studentcalc') {
- &loadstudent($sheet);
+ &loadstudent($sheet,$r,$c);
} else {
- &loadassessment($sheet);
+ &loadassessment($sheet,$r,$c);
}
}
@@ -2558,7 +2644,7 @@ sub forcedrecalc {
# returns the export row for a spreadsheet.
#
sub exportsheet {
- my ($sheet,$uname,$udom,$stype,$usymb,$fn)=@_;
+ my ($sheet,$uname,$udom,$stype,$usymb,$fn,$r)=@_;
$uname = $uname || $sheet->{'uname'};
$udom = $udom || $sheet->{'udom'};
$stype = $stype || $sheet->{'sheettype'};
@@ -2612,7 +2698,7 @@ sub exportsheet {
my ($newsheet)=&makenewsheet($uname,$udom,$stype,$usymb);
&readsheet($newsheet,$fn);
&updatesheet($newsheet);
- &loadrows($newsheet);
+ &loadrows($newsheet,$r);
&calcsheet($newsheet);
@exportarr=&exportdata($newsheet);
##
@@ -2678,7 +2764,7 @@ sub load_spreadsheet_expirationdates {
my @tmp = &Apache::lonnet::dump('nohist_expirationdates',
$ENV{'course.'.$cid.'.domain'},
$ENV{'course.'.$cid.'.num'});
- if (lc($tmp[0])!~/^error/){
+ if (lc($tmp[0]) !~ /^error/){
%expiredates = @tmp;
}
}
@@ -2786,8 +2872,8 @@ sub handler {
#
# Get query string for limited number of parameters
#
- &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
- ['uname','udom','usymb','ufn']);
+ &Apache::loncommon::get_unprocessed_cgi
+ ($ENV{'QUERY_STRING'},['uname','udom','usymb','ufn','mapid','resid']);
#
# Deal with restricted student permissions
#
@@ -2907,6 +2993,30 @@ ENDSCRIPT
# Read new sheet or modified worksheet
my ($sheet)=&makenewsheet($aname,$adom,$sheettype,$ENV{'form.usymb'});
#
+ # Check user permissions
+ if (($sheet->{'sheettype'} eq 'classcalc' ) ||
+ ($sheet->{'uname'} ne $ENV{'user.name'} ) ||
+ ($sheet->{'udom'} ne $ENV{'user.domain'})) {
+ unless (&Apache::lonnet::allowed('vgr',$sheet->{'cid'})) {
+ $r->print('Access Permission Denied
'.
+ '