--- loncom/interface/spreadsheet/assesscalc.pm 2003/10/14 18:36:54 1.26
+++ loncom/interface/spreadsheet/assesscalc.pm 2004/02/03 22:19:47 1.31
@@ -1,5 +1,5 @@
#
-# $Id: assesscalc.pm,v 1.26 2003/10/14 18:36:54 www Exp $
+# $Id: assesscalc.pm,v 1.31 2004/02/03 22:19:47 matthew Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -368,7 +368,7 @@ sub parmval {
sub get_html_title {
my $self = shift;
- my ($assess_title,$name,$time) = $self->get_title();
+ my ($assess_title,$name,$time) = $self->get_full_title();
my $title = '
'.$assess_title.'
'.
''.$name.', '.
&Apache::loncommon::aboutmewrapper
@@ -380,17 +380,21 @@ sub get_html_title {
sub get_title {
my $self = shift;
- my @title = ();
if (($self->{'symb'} eq '_feedback') ||
($self->{'symb'} eq '_evaluation') ||
($self->{'symb'} eq '_discussion') ||
($self->{'symb'} eq '_tutoring')) {
my $assess_title = ucfirst($self->{'symb'});
$assess_title =~ s/^_//;
- push(@title,$assess_title);
+ return $assess_title;
} else {
- push(@title,&Apache::lonnet::gettitle($self->{'symb'}));
+ return &Apache::lonnet::gettitle($self->{'symb'});
}
+}
+
+sub get_full_title {
+ my $self = shift;
+ my @title = ($self->get_title());
# Look up the users identifying information
# Get the users information
my %userenv = &Apache::loncoursedata::GetUserName($self->{'name'},
@@ -415,6 +419,10 @@ sub parent_link {
sub outsheet_html {
my $self = shift;
my ($r) = @_;
+ ####################################
+ # Report any calculation errors #
+ ####################################
+ $r->print($self->html_report_error());
###################################
# Determine table structure
###################################
@@ -474,6 +482,11 @@ END
#
my $num_output = 0;
foreach my $rownum (sort {$a <=> $b} ($self->rows())) {
+ if (! $self->parameter_part_is_valid(
+ $self->{'formulas'}->{'A'.$rownum}
+ )) {
+ next;
+ }
if ($num_output++ % 50 == 0) {
$r->print("\n".$tableheader);
}
@@ -518,7 +531,7 @@ sub csv_rows {
# writes the meat of the spreadsheet to an excel worksheet. Called
# by Spreadsheet::outsheet_excel;
my $self = shift;
- my ($filehandle) = @_;
+ my ($connection,$filehandle) = @_;
#
# Write a header row
$self->csv_output_row($filehandle,undef,
@@ -541,12 +554,13 @@ sub excel_rows {
# writes the meat of the spreadsheet to an excel worksheet. Called
# by Spreadsheet::outsheet_excel;
my $self = shift;
- my ($worksheet,$cols_output,$rows_output) = @_;
+ my ($connection,$worksheet,$cols_output,$rows_output) = @_;
+ return if (! ref($worksheet));
#
# Write a header row
$cols_output = 0;
foreach my $value ('Parameter','Description','Value') {
- $worksheet->write($rows_output,$cols_output++,&mt($value));
+ $worksheet->write($rows_output,$cols_output++,$value);
}
$rows_output++;
#
@@ -637,6 +651,52 @@ sub get_problem_state {
return %student_parameters;
}
+sub determine_parts {
+ my $self = shift;
+ if (exists($self->{'Parts'}) && ref($self->{'Parts'}) eq 'HASH') {
+ return;
+ }
+ my (undef,undef,$url) = &Apache::lonnet::decode_symb($self->{'symb'});
+ my $src = &Apache::lonnet::clutter($url);
+ return if (! defined($src));
+ my %Parts;
+ my $metadata = &Apache::lonnet::metadata($src,'packages');
+ foreach (split(',',$metadata)) {
+ my ($part) = (/^part_(.*)$/);
+ if (defined($part) &&
+ ! &Apache::loncommon::check_if_partid_hidden
+ ($part,$self->{'symb'},$self->{'name'},$self->{'domain'})
+ ) {
+ $Parts{$part}++;
+ }
+ }
+ # Make sure part 0 is defined.
+ $Parts{'0'}++;
+ $self->{'Parts'} = \%Parts;
+ return;
+}
+
+sub parameter_part_is_valid {
+ my $self = shift;
+ my ($parameter) = @_;
+ return 1 if ($parameter eq 'timestamp');
+ if (! defined($self->{'Parts'}) ||
+ ! ref ($self->{'Parts'}) ||
+ ref($self->{'Parts'}) ne 'HASH') {
+ return 1;
+ }
+ #
+ my (undef,$part) =
+ ($parameter =~ m/^(resource|stores|parameter)_([^_]+)_.*/);
+ if (exists($self->{'Parts'}) &&
+ exists($self->{'Parts'}->{$part}) &&
+ $self->{'Parts'}->{$part} ) {
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
sub compute {
my $self = shift;
my ($r) = @_;
@@ -688,6 +748,14 @@ sub compute {
$parameters{$parm} = $value;
}
#
+ # Clean out any bad parameters
+ $self->determine_parts();
+ foreach my $param (keys(%parameters)) {
+ if (! $self->parameter_part_is_valid($param)) {
+ delete ($parameters{$param});
+ }
+ }
+ #
# Set up the formulas and parameter values
my %f=$self->formulas();
my %c;
@@ -710,11 +778,13 @@ sub compute {
if ($connection->aborted()) { $self->cleanup(); return; }
#
# Move the parameters into the spreadsheet
- if ($connection->aborted()) { $self->cleanup(); return; }
while (my ($parm,$value) = each(%parameters)) {
my $cell = 'A'.$self->get_row_number_from_key($parm);
$f{$cell} = $parm;
- $value = '"'.$value.'"' if ($value =~/[^0-9.]/);
+ if ($parm =~ /_submission$/ && $value =~ /(\{|\})/) {
+ $value = 'witheld';
+ }
+ $value = 'q{'.$value.'}' if ($value !~/^\s*\d+(\.\d+)?\s*$/);
$c{$parm} = $value;
}
$self->formulas(\%f);
@@ -849,13 +919,20 @@ sub export_data {
$self->compute($r);
}
if ($connection->aborted()) { $self->cleanup(); return; }
- my @Data = @{$Exportrows{$symb}->{$self->{'filename'}}};
- if ($Data[0] =~ /^(.*)___=___/) {
- $self->{'sheetname'} = $1;
- $Data[0] =~ s/^(.*)___=___//;
- }
- for (my $i=0;$i<$#Data;$i++) {
- $Data[$i]="'".$Data[$i]."'" if ($Data[$i]=~/\D/ && defined($Data[$i]));
+ my @Data;
+ if ($self->badcalc()) {
+ @Data = ();
+ } else {
+ @Data = @{$Exportrows{$symb}->{$self->{'filename'}}};
+ if ($Data[0] =~ /^(.*)___=___/) {
+ $self->{'sheetname'} = $1;
+ $Data[0] =~ s/^(.*)___=___//;
+ }
+ for (my $i=0;$i<$#Data;$i++) {
+ if ($Data[$i]=~/\D/ && defined($Data[$i])) {
+ $Data[$i]="'".$Data[$i]."'";
+ }
+ }
}
return @Data;
}
@@ -878,6 +955,11 @@ sub save_export_data {
return if ($self->temporary());
my $student = $self->{'name'}.':'.$self->{'domain'};
my $symb = $self->{'symb'};
+ if ($self->badcalc()){
+ # do not save data away when calculations have not been done properly.
+ delete($Exportrows{$symb});
+ return;
+ }
if (! exists($Exportrows{$symb}) ||
! exists($Exportrows{$symb}->{$self->{'filename'}})) {
return;