--- loncom/interface/spreadsheet/assesscalc.pm 2003/10/14 18:36:54 1.26 +++ loncom/interface/spreadsheet/assesscalc.pm 2004/11/02 20:48:02 1.34 @@ -1,5 +1,5 @@ # -# $Id: assesscalc.pm,v 1.26 2003/10/14 18:36:54 www Exp $ +# $Id: assesscalc.pm,v 1.34 2004/11/02 20:48:02 albertel 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,24 +380,25 @@ 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'}, - $self->{'domain'}); - my $name = - join(' ',@userenv{'firstname','middlename','lastname','generation'}); - $name =~ s/\s+$//; + my $name = &Apache::loncommon::plainname($self->{'name'}, + $self->{'domain'}); push (@title,$name); push (@title,&Apache::lonlocal::locallocaltime(time)); return @title; @@ -415,6 +416,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 +479,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 +528,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 +551,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 +648,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 +745,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 +775,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 =~/([^\d\.]|\.\.)/); $c{$parm} = $value; } $self->formulas(\%f); @@ -806,6 +873,10 @@ sub load_cached_export_rows { # We only got one key, so we will access it directly. while (my ($key,$sheetdata) = each(%tmp)) { my ($sname,$sdom,$sheettype,$symb) = split(':',$key); + if (! defined($sname) || $sname eq '' || + ! defined($sdom) || $sdom eq '' ) { + next; + } if ($symb =~ /\.time$/) { $symb =~ s/\.time$//; $Exportrows{$symb}->{'time'} = $sheetdata; @@ -849,13 +920,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 +956,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;