--- loncom/interface/spreadsheet/assesscalc.pm 2005/05/15 02:18:12 1.41
+++ loncom/interface/spreadsheet/assesscalc.pm 2005/05/17 20:14:19 1.50
@@ -1,5 +1,5 @@
#
-# $Id: assesscalc.pm,v 1.41 2005/05/15 02:18:12 albertel Exp $
+# $Id: assesscalc.pm,v 1.50 2005/05/17 20:14:19 albertel Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -301,7 +301,7 @@ this user and course.
##################################################
sub parmval {
my $self = shift;
- my ($what,$symb,$uname,$udom,$csec,$recurse)=@_;
+ my ($what,$symb,$uname,$udom,$csec,$recurse,$mapname,$id,$fn)=@_;
$uname = $self->{'name'} if (! defined($uname));
$udom = $self->{'domain'} if (! defined($udom));
$csec = $self->{'section'} if (! defined($csec));
@@ -310,7 +310,9 @@ sub parmval {
my $result='';
#
# This should be a
- my ($mapname,$id,$fn)=&Apache::lonnet::decode_symb($symb);
+ if (!defined($mapname) || !defined($id) || !defined($fn)) {
+ ($mapname,$id,$fn)=&Apache::lonnet::decode_symb($symb);
+ }
# Cascading lookup scheme
my $rwhat=$what;
$what =~ s/^parameter\_//;
@@ -367,7 +369,8 @@ sub parmval {
if ($part eq '') { $part='0'; }
my $newwhat=$rwhat;
$newwhat=~s/\Q$space\E/$part/;
- my $partgeneral=$self->parmval($newwhat,$symb,$uname,$udom,$csec,1);
+ my $partgeneral=$self->parmval($newwhat,$symb,$uname,$udom,$csec,1,
+ $mapname,$id,$fn);
if (defined($partgeneral)) { return $partgeneral; }
}
if ($recurse) { return undef; }
@@ -512,8 +515,8 @@ sub assess_html_row {
my @rowdata = $self->get_row($row);
my $num_cols_output = 0;
my $row_html;
- if (exists($nice_parameter_name{$parameter_name})) {
- my $name = $nice_parameter_name{$parameter_name};
+ my $name=$self->get_parm_name($parameter_name);
+ if ($name ne '') {
$name =~ s/ /\ /g;
$row_html .= '
'.$name.' '.$parameter_name.' | ';
} else {
@@ -548,10 +551,7 @@ sub csv_rows {
# Write each row
foreach my $rownum (sort {$a <=> $b} ($self->rows())) {
my $parameter_name = $self->{'formulas'}->{'A'.$rownum};
- my $description = '';
- if (exists($nice_parameter_name{$parameter_name})) {
- $description = $nice_parameter_name{$parameter_name};
- }
+ my $description = $self->get_parm_name($parameter_name);
$self->csv_output_row($filehandle,$rownum,
$parameter_name,$description);
}
@@ -575,10 +575,7 @@ sub excel_rows {
# Write each row
foreach my $rownum (sort {$a <=> $b} ($self->rows())) {
my $parameter_name = $self->{'formulas'}->{'A'.$rownum};
- my $description = '';
- if (exists($nice_parameter_name{$parameter_name})) {
- $description = $nice_parameter_name{$parameter_name};
- }
+ my $description = $self->get_parm_name($parameter_name);
$self->excel_output_row($worksheet,$rownum,$rows_output++,
$parameter_name,$description);
}
@@ -588,10 +585,10 @@ sub excel_rows {
##
## Routines to support assesscalc::compute
##
-sub get_parm_names {
+sub get_parm {
my $self = shift;
my @Mandatory_parameters = @_;
- my %parameters_and_names;
+ my %parameters;
#
my ($symap,$syid,$srcf) = &Apache::lonnet::decode_symb($self->{'symb'});
my @Metadata = split(/\,/,&Apache::lonnet::metadata($srcf,'keys'));
@@ -600,14 +597,20 @@ sub get_parm_names {
my $cleaned_name = $parm;
$cleaned_name =~ s/^resource\./stores_/;
$cleaned_name =~ s/\./_/g;
- my $display = &Apache::lonnet::metadata($srcf,
- $cleaned_name.'.display');
- if (! $display) {
- $display .= &Apache::lonnet::metadata($srcf,$cleaned_name.'.name');
- }
- $parameters_and_names{$cleaned_name}=$display;
+ $parameters{$cleaned_name}=1;
+ }
+ return (keys(%parameters));
+}
+
+sub get_parm_name {
+ my $self = shift;
+ my $parm = shift;
+ my ($symap,$syid,$srcf) = &Apache::lonnet::decode_symb($self->{'symb'});
+ my $display = &Apache::lonnet::metadata($srcf,$parm.'.display');
+ if (! $display) {
+ $display .= &Apache::lonnet::metadata($srcf,$parm.'.name');
}
- return (%parameters_and_names);
+ return $display;
}
sub get_parameter_values {
@@ -627,8 +630,12 @@ sub get_parameter_values {
my $filename = $self->{'coursefilename'}.'_parms.db';
if (tie(%parmhash,'GDBM_File',
$self->{'coursefilename'}.'_parms.db',&GDBM_READER(),0640)) {
+ my ($mapname,$id,$fn)=&Apache::lonnet::decode_symb($self->{'symb'});
foreach my $parmname (@Parameters) {
- my $value = $self->parmval($parmname);
+ my $value = $self->parmval($parmname,$self->{'symb'},
+ $self->{'name'},$self->{'domain'},
+ $self->{'section'},undef,
+ $mapname,$id,$fn);
$parameters{$parmname} =$value;
}
untie(%parmhash);
@@ -710,8 +717,6 @@ sub parameter_part_is_valid {
sub compute {
my $self = shift;
my ($r) = @_;
- my $connection = $r->connection();
- if ($connection->aborted()) { $self->cleanup(); return; }
$self->initialize_safe_space();
#########################################
#########################################
@@ -732,18 +737,11 @@ sub compute {
my %parameters; # holds underscored parameters by name
#
# Get the metadata fields and determine their proper names
- my %nice_parm_names = $self->get_parm_names(@Mandatory_parameters);
- while (my($cleaned_name,$display) = each(%nice_parm_names)) {
- $parameters{$cleaned_name}++;
- $nice_parameter_name{$cleaned_name} = $display;
- }
+ my @parameters=$self->get_parm(@Mandatory_parameters);
#
# Get the values of the metadata fields
- if ($connection->aborted()) { $self->cleanup(); return; }
$self->ensure_current_caches();
- if ($connection->aborted()) { $self->cleanup(); return; }
- %parameters = $self->get_parameter_values(keys(%parameters));
- if ($connection->aborted()) { $self->cleanup(); return; }
+ %parameters = $self->get_parameter_values(@parameters);
#
# Clean out unnecessary parameters
foreach (keys(%parameters)) {
@@ -751,7 +749,7 @@ sub compute {
}
#
# Get the students performance data
- $self->determine_parts(exists($parameters{'parameter_0_hiddenparts'}));
+ $self->determine_parts(($parameters{'parameter_0_hiddenparts'} ne ''));
my %student_parameters = $self->get_problem_state();
while (my ($parm,$value) = each(%student_parameters)) {
$parm =~ s/^resource\./stores_/;
@@ -780,7 +778,6 @@ sub compute {
}
}
}
- if ($connection->aborted()) { $self->cleanup(); return; }
#
# Move the parameters into the spreadsheet
while (my ($parm,$value) = each(%parameters)) {
@@ -792,16 +789,20 @@ sub compute {
$value = 'q{'.$value.'}' if ($value =~/([^\d\.]|\.\.)/);
$c{$parm} = $value;
}
+ foreach my $cell (grep(/^A/,keys(%f))) {
+ # Clean out any bad formulas
+ next if (exists($c{$f{$cell}}));
+ next if ($cell eq 'A0');
+ delete($f{$cell});
+ }
$self->formulas(\%f);
$self->constants(\%c);
- if ($connection->aborted()) { $self->cleanup(); return; }
$self->calcsheet();
#
# Store export row in cache
my @exportarray = $self->exportrow();
$self->deal_with_export_row(@exportarray);
$self->save() if ($self->need_to_save());
- if ($connection->aborted()) { $self->cleanup(); return; }
return;
}
@@ -837,7 +838,10 @@ sub sett {
while (my ($cell,$formula) = each(%{$self->{'formulas'}})) {
next if ($cell =~ /template_/);
if ($cell =~ /^A/ && $cell ne 'A0') {
- if ($formula !~ /^\!/) {
+ if ($formula !~ /^\!/
+ && exists($self->{'constants'}->{$formula})
+ && $self->{'constants'}->{$formula} ne ''
+ ) {
$Apache::Spreadsheet::sheet_values{$cell}=
eval($self->{'constants'}->{$formula});
}
@@ -918,7 +922,6 @@ spreadsheet only if necessary.
sub export_data {
my $self = shift;
my ($r) = @_;
- my $connection = $r->connection();
my $symb = $self->{'symb'};
if (! exists($env{'request.role.adv'}) || ! $env{'request.role.adv'} ||
! exists($Exportrows{$symb}) || ! defined($Exportrows{$symb}) ||
@@ -929,7 +932,6 @@ sub export_data {
) {
$self->compute($r);
}
- if ($connection->aborted()) { $self->cleanup(); return; }
my @Data;
if ($self->badcalc()) {
@Data = ();