--- loncom/interface/spreadsheet/assesscalc.pm 2003/05/29 13:39:38 1.11 +++ loncom/interface/spreadsheet/assesscalc.pm 2003/09/10 18:33:35 1.21 @@ -1,5 +1,5 @@ # -# $Id: assesscalc.pm,v 1.11 2003/05/29 13:39:38 matthew Exp $ +# $Id: assesscalc.pm,v 1.21 2003/09/10 18:33:35 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -44,6 +44,8 @@ assesscalc package Apache::assesscalc; use strict; +use warnings FATAL=>'all'; +no warnings 'uninitialized'; use Apache::Constants qw(:common :http); use Apache::lonnet; use Apache::loncommon; @@ -140,10 +142,13 @@ sub initialize { ######################################################## sub initialize_package { my ($sname,$sdomain) = @_; - $current_course = $ENV{'request.course.id'}; $current_name = $sname; $current_domain = $sdomain; - undef(%courseopt); + undef(%useropt); + if ($current_course ne $ENV{'request.course.id'}) { + $current_course = $ENV{'request.course.id'}; + undef(%courseopt); + } &load_cached_export_rows(); &load_parameter_caches(); } @@ -165,11 +170,9 @@ sub load_parameter_caches { # # Course Parameters Cache if (! %courseopt) { - &Apache::lonnet::logthis("loading course options"); $current_course = $ENV{'request.course.id'}; undef(%courseopt); if (! defined($current_name) || ! defined($current_domain)) { - &Apache::lonnet::logthis('bad call to setup_parameter_caches'); return; } my $dom = $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}; @@ -189,6 +192,7 @@ sub load_parameter_caches { } $useropt{$userprefix.$name}=$value; } + $useropt{'loadtime'} = time; } } @@ -205,11 +209,17 @@ sub load_parameter_caches { ######################################################## sub ensure_current_parameter_caches { my $self = shift; + ## + ## Check for a modified parameters + ## if (! defined($current_course) || $current_course ne $ENV{'request.course.id'} ) { $current_course = $ENV{'request.course.id'}; undef(%courseopt); } + ## + ## Check for new user + ## if (! defined($current_name) || $current_name ne $self->{'name'} || ! defined($current_domain) || $current_domain ne $self->{'domain'}) { $current_domain = $self->{'domain'}; @@ -245,7 +255,7 @@ this user and course. ################################################## sub parmval { my $self = shift; - my ($what,$symb,$uname,$udom,$csec)=@_; + my ($what,$symb,$uname,$udom,$csec,$recurse)=@_; $uname = $self->{'name'} if (! defined($uname)); $udom = $self->{'domain'} if (! defined($udom)); $csec = $self->{'section'} if (! defined($csec)); @@ -254,7 +264,7 @@ sub parmval { my $result=''; # # This should be a - my ($mapname,$id,$fn)=split(/___/,$symb); + my ($mapname,$id,$fn)=&Apache::lonnet::decode_symb($symb); # Cascading lookup scheme my $rwhat=$what; $what =~ s/^parameter\_//; @@ -310,9 +320,12 @@ 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); + my $partgeneral=$self->parmval($newwhat,$symb,$uname,$udom,$csec,1); if (defined($partgeneral)) { return $partgeneral; } } + if ($recurse) { return undef; } + my $pack_def=&Apache::lonnet::packages_tab_default($fn,'resource.'.$what); + if (defined($pack_def)) { return $pack_def; } #nothing defined return ''; } @@ -332,11 +345,11 @@ sub get_html_title { sub get_title { my $self = shift; my @title = (); - if (($self->{'usymb'} eq '_feedback') || - ($self->{'usymb'} eq '_evaluation') || - ($self->{'usymb'} eq '_discussion') || - ($self->{'usymb'} eq '_tutoring')) { - my $assess_title = ucfirst($self->{'usymb'}); + 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); } else { @@ -369,13 +382,15 @@ sub outsheet_html { ################################### # Determine table structure ################################### + my $importcolor = '#FFFFFF'; + my $exportcolor = '#FFFFAA'; my $num_uneditable = 1; my $num_left = 52-$num_uneditable; my $tableheader =<<"END"; - + @@ -383,7 +398,7 @@ END my $label_num = 0; foreach (split(//,'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz')){ if ($label_num<$num_uneditable) { - $tableheader .= ''. - $self->html_template_row($num_uneditable)."\n"); + $self->html_template_row($num_uneditable,$importcolor). + "\n"); # # Print out summary/export row $r->print(''. - $self->html_export_row()."\n"); + $self->html_export_row($exportcolor)."\n"); # # Prepare to output rows $tableheader =<<"END"; @@ -409,7 +425,7 @@ END END foreach (split(//,'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz')){ if ($label_num<$num_uneditable) { - $tableheader.='
Assessment   Calculations
'; + $tableheader .= ''; } else { $tableheader .= ''; } @@ -396,11 +411,12 @@ END # # Print out template row $r->print('
Template 
Export0
'; + $tableheader.=''; } else { $tableheader.=''; } @@ -422,7 +438,7 @@ END $r->print("
\n".$tableheader); } $r->print(''.$rownum.''. - $self->assess_html_row($rownum)."\n"); + $self->assess_html_row($rownum,$importcolor)."\n"); } $r->print("\n"); return; @@ -430,7 +446,7 @@ END sub assess_html_row { my $self = shift(); - my ($row) = @_; + my ($row,$importcolor) = @_; my $parameter_name = $self->{'formulas'}->{'A'.$row}; my @rowdata = $self->get_row($row); my $num_cols_output = 0; @@ -444,7 +460,7 @@ sub assess_html_row { } foreach my $cell (@rowdata) { if ($num_cols_output < 1) { - $row_html .= ''; + $row_html .= ''; $row_html .= &Apache::Spreadsheet::html_uneditable_cell($cell, '#FFDDDD'); } else { @@ -507,9 +523,77 @@ sub excel_rows { return; } +## +## Routines to support assesscalc::compute +## +sub get_parm_names { + my $self = shift; + my @Mandatory_parameters = @_; + my %parameters_and_names; + # + my ($symap,$syid,$srcf)=split(/___/,$self->{'symb'}); + my @Metadata = split(/\,/,&Apache::lonnet::metadata($srcf,'keys')); + foreach my $parm (@Mandatory_parameters,@Metadata) { + next if ($parm !~ /^(resource\.|stores|parameter)_/); + 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; + } + return (%parameters_and_names); +} + +sub get_parameter_values { + my $self = shift(); + my @Parameters; + my ($parameters) = @_; + if (!ref($parameters)) { + @Parameters = @_; + } elsif (ref($parameters) eq 'ARRAY') { + @Parameters = @$parameters; + } elsif (ref($parameters) eq 'HASH') { + @Parameters = keys(%$parameters); + } + # + my %parameters; + # + my $filename = $self->{'coursefilename'}.'_parms.db'; + if (tie(%parmhash,'GDBM_File', + $self->{'coursefilename'}.'_parms.db',&GDBM_READER(),0640)) { + foreach my $parmname (@Parameters) { + my $value = $self->parmval($parmname); + $parameters{$parmname} =$value; + } + untie(%parmhash); + } else { + $self->logthis('unable to tie '.$filename); + } + return %parameters; +} + +sub deal_with_export_row { + my $self = shift(); + my @exportarray = @_; + $Exportrows{$self->{'symb'}}->{'time'} = time; + $Exportrows{$self->{'symb'}}->{$self->{'filename'}} = \@exportarray; + # + # Save the export data + $self->save_export_data(); + return; +} + + sub compute { my $self = shift; - $self->logthis('computing'); + my ($r) = @_; + my $connection = $r->connection(); + if ($connection->aborted()) { $self->cleanup(); return; } +# $self->logthis('computing'); $self->initialize_safe_space(); ######################################### ######################################### @@ -530,35 +614,18 @@ sub compute { my %parameters; # holds underscored parameters by name # # Get the metadata fields and determine their proper names - my ($symap,$syid,$srcf)=split(/___/,$self->{'symb'}); - my @Metadata = split(/\,/,&Apache::lonnet::metadata($srcf,'keys')); - foreach my $parm (@Mandatory_parameters,@Metadata) { - next if ($parm !~ /^(resource\.|stores|parameter)_/); - 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'); - } + 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; } # # Get the values of the metadata fields + if ($connection->aborted()) { $self->cleanup(); return; } $self->ensure_current_parameter_caches(); - my $filename = $self->{'coursefilename'}.'_parms.db'; - if (tie(%parmhash,'GDBM_File', - $self->{'coursefilename'}.'_parms.db',&GDBM_READER(),0640)) { - foreach my $parmname (keys(%parameters)) { - my $value = $self->parmval($parmname); - $parameters{$parmname} =$value; - } - untie(%parmhash); - } else { - $self->logthis('unable to tie '.$filename); - } + if ($connection->aborted()) { $self->cleanup(); return; } + %parameters = $self->get_parameter_values(keys(%parameters)); + if ($connection->aborted()) { $self->cleanup(); return; } # # Clean out unnecessary parameters foreach (keys(%parameters)) { @@ -586,15 +653,20 @@ sub compute { while (my ($parm,$value) = each(%parameters)) { last if ($self->blackout()); next if ($parm !~ /^(parameter_.*)_problemstatus$/); - next if ($parameters{$1.'_answerdate'}blackout(1); } } } + 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; @@ -603,15 +675,14 @@ sub compute { } $self->formulas(\%f); $self->constants(\%c); + if ($connection->aborted()) { $self->cleanup(); return; } $self->calcsheet(); # # Store export row in cache my @exportarray = $self->exportrow(); - $Exportrows{$self->{'symb'}}->{'time'} = time; - $Exportrows{$self->{'symb'}}->{$self->{'filename'}} = \@exportarray; - # - # Save the export data - $self->save_export_data(); + $self->deal_with_export_row(@exportarray); + $self->save() if ($self->need_to_save()); + if ($connection->aborted()) { $self->cleanup(); return; } return; } @@ -680,7 +751,7 @@ These rows are saved in the students dir ######################################################## ######################################################## sub load_cached_export_rows { - %Exportrows = undef; + undef(%Exportrows); my @tmp = &Apache::lonnet::dump('nohist_calculatedsheets_'. $ENV{'request.course.id'}, $current_domain,$current_name,undef); @@ -721,14 +792,19 @@ 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}) || ! $self->check_expiration_time($Exportrows{$symb}->{'time'}) || ! exists($Exportrows{$symb}->{$self->{'filename'}}) || - ! defined($Exportrows{$symb}->{$self->{'filename'}})) { - $self->compute(); + ! defined($Exportrows{$symb}->{$self->{'filename'}}) || + ! ref($Exportrows{$symb}->{$self->{'filename'}}) + ) { + $self->compute($r); } + if ($connection->aborted()) { $self->cleanup(); return; } my @Data = @{$Exportrows{$symb}->{$self->{'filename'}}}; if ($Data[0] =~ /^(.*)___=___/) { $self->{'sheetname'} = $1;