--- loncom/interface/spreadsheet/assesscalc.pm 2005/05/15 02:49:07 1.45 +++ loncom/interface/spreadsheet/assesscalc.pm 2006/04/06 20:24:13 1.52 @@ -1,5 +1,5 @@ # -# $Id: assesscalc.pm,v 1.45 2005/05/15 02:49:07 albertel Exp $ +# $Id: assesscalc.pm,v 1.52 2006/04/06 20:24:13 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -290,7 +290,8 @@ Returns: The value of a parameter, or '' This function cascades through the possible levels searching for a value for a parameter. The levels are checked in the following order: -user, course (at section level and course level), map, and lonnet::metadata. +user, course (at group, section level and course level), map, and +lonnet::metadata. This function uses %parmhash, which must be tied prior to calling it. This function also requires %courseopt and %useropt to be initialized for this user and course. @@ -301,11 +302,12 @@ this user and course. ################################################## sub parmval { my $self = shift; - 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)); - $symb = $self->{'symb'} if (! defined($symb)); + my ($what,$symb,$uname,$udom,$csec,$recurse,$mapname,$id,$fn,$cgroup)=@_; + $uname = $self->{'name'} if (! defined($uname)); + $udom = $self->{'domain'} if (! defined($udom)); + $csec = $self->{'section'} if (! defined($csec)); + $cgroup = $self->{'group'} if (! defined($cgroup)); + $symb = $self->{'symb'} if (! defined($symb)); # my $result=''; # @@ -323,6 +325,10 @@ sub parmval { my $courseprefix = $self->{'cid'}; my $usercourseprefix = $uname.'_'.$udom.'_'.$self->{'cid'}; # + my $grplevel=$courseprefix.'.['.$cgroup.'].'.$what; + my $grplevelr=$courseprefix.'.['.$cgroup.'].'.$symbparm; + my $grplevelm=$courseprefix.'.['.$cgroup.'].'.$mapparm; + # my $seclevel = $courseprefix.'.['.$csec.'].'.$what; my $seclevelr = $courseprefix.'.['.$csec.'].'.$symbparm; my $seclevelm = $courseprefix.'.['.$csec.'].'.$mapparm; @@ -334,12 +340,18 @@ sub parmval { my $ucourselevel = $usercourseprefix.'.'.$what; my $ucourselevelr = $usercourseprefix.'.'.$symbparm; my $ucourselevelm = $usercourseprefix.'.'.$mapparm; - # check user + # check user if (defined($uname)) { return $useropt{$ucourselevelr} if (defined($useropt{$ucourselevelr})); return $useropt{$ucourselevelm} if (defined($useropt{$ucourselevelm})); return $useropt{$ucourselevel} if (defined($useropt{$ucourselevel})); } + # check group + if (defined($cgroup)) { + return $courseopt{$grplevelr} if (defined($courseopt{$grplevelr})); + return $courseopt{$grplevelm} if (defined($courseopt{$grplevelm})); + return $courseopt{$grplevel} if (defined($courseopt{$grplevel})); + } # check section if (defined($csec)) { return $courseopt{$seclevelr} if (defined($courseopt{$seclevelr})); @@ -515,8 +527,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 { @@ -551,10 +563,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); } @@ -578,10 +587,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); } @@ -591,10 +597,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')); @@ -603,14 +609,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 (%parameters_and_names); + 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 $display; } sub get_parameter_values { @@ -632,7 +644,10 @@ sub get_parameter_values { $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,$self->{'name'},$self->{'domain'},$self->{'section'},$self->{'symb'},undef,$mapname,$id,$fn); + my $value = $self->parmval($parmname,$self->{'symb'}, + $self->{'name'},$self->{'domain'}, + $self->{'section'},undef, + $mapname,$id,$fn); $parameters{$parmname} =$value; } untie(%parmhash); @@ -700,15 +715,17 @@ sub parameter_part_is_valid { 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; + my ($start,@pieces)=split('_',$parameter); + if ( $start !~ m/^(resource|stores|parameter)$/) { return 0; } + while (@pieces) { + pop(@pieces); + my $testpart=join('_',@pieces); + if (exists($self->{'Parts'}->{$testpart}) && + $self->{'Parts'}->{$testpart} ) { + return 1; + } } + return 0; } sub compute { @@ -734,15 +751,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 $self->ensure_current_caches(); - %parameters = $self->get_parameter_values(keys(%parameters)); + %parameters = $self->get_parameter_values(@parameters); # # Clean out unnecessary parameters foreach (keys(%parameters)) { @@ -790,6 +803,12 @@ 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); $self->calcsheet();