--- loncom/homework/bridgetask.pm 2006/11/07 21:31:22 1.196 +++ loncom/homework/bridgetask.pm 2006/11/09 17:50:51 1.197 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # definition of tags that give a structure to a document # -# $Id: bridgetask.pm,v 1.196 2006/11/07 21:31:22 albertel Exp $ +# $Id: bridgetask.pm,v 1.197 2006/11/09 17:50:51 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -1051,32 +1051,15 @@ DONEBUTTON } } $status.=''; - my $man_count=0; - my $man_passed=0; - my $opt_count=0; - my $opt_passed=0; my $dim = $top; - foreach my $id (@{$dimension{$dim}{'criterias'}}) { - my $status = &get_criteria('status',$version,$dim,$id); - if ($dimension{$dim}{'criteria.'.$id.'.mandatory'} - eq 'N') { - $opt_count++; - if ($status eq 'pass') { - $opt_passed++; - } - } else { - $man_count++; - if ($status eq 'pass') { $man_passed++; } - } - } - if ($man_passed eq $man_count) { $man_passed='all'; } - - my $opt_req=&Apache::lonxml::get_param('OptionalRequired', - $parstack,$safeeval); - if ($opt_req !~ /\S/) { $opt_req='0'; } - - $status.="\n
".&mt('You needed to pass all of the [_1] mandatory components and [_2] of the [_3] optional components, of which you passed [_4].',$man_count,$opt_req,$opt_count,$opt_passed)."

\n"; - + my %counts = &get_counts($dim,undef,$parstack, + $safeeval); + $status.="\n

". + &mt('You needed to pass all of the [_1] mandatory components and [_2] of the [_3] optional components, of which you passed [_4].', + $counts{'man'},$counts{'opt_req'}, + $counts{'opt'},$counts{'opt_passed'}). + "

\n"; + foreach my $id (@{$dimension{$dim}{'criterias'}}) { my $type = $dimension{$dim}{'criteria.'.$id.'.type'}; @@ -2098,6 +2081,7 @@ sub start_Dimension { push(@{$dimension{$previous_dim}{'criterias'}},$dim); $dimension{$dim}{'nested'}=$previous_dim; $dimension{$dim}{'depth'} = 1 + $dimension{$previous_dim}{'depth'}; + &Apache::lonxml::debug("adding $dim as criteria to $previous_dim"); } else { $dimension{$top}{'depth'}=0; @@ -2230,40 +2214,20 @@ sub end_Dimension { } my $dim_info="
\n"; my $question = ('sub' x $dimension{$dim}{'depth'}).'question'; - my $ucquestion = $question; - $ucquestion =~ s/^(.)/uc($1)/e; + $question =~ s/^(.)/uc($1)/e; if ($dim_status eq 'pass') { - $dim_info.='

'.$ucquestion.' : you passed this '.$mandatory.' '.$question.'

'; + $dim_info.='

'.$question.' : you passed this '.$mandatory.' question

'; } if ($dim_status eq 'fail') { - $dim_info.='

'.$ucquestion.' : you did not pass this '.$mandatory.' '.$question.'

'; + $dim_info.='

'.$question.' : you did not pass this '.$mandatory.' question

'; } - my $man_count=0; - my $man_passed=0; - my $opt_count=0; - my $opt_passed=0; - foreach my $id ( @{$dimension{$dim}{$instance.'.criterias'}}, - @{$dimension{$dim}{'criterias'}} ) { - my $status = &get_criteria('status',$version,$dim,$id); - if ($dimension{$dim}{'criteria.'.$id.'.mandatory'} - eq 'N') { - $opt_count++; - if ($status eq 'pass') { $opt_passed++; } - } else { - $man_count++; - if ($status eq 'pass') { $man_passed++; } - } - } - if ($man_passed eq $man_count) { $man_passed='all'; } - - my $opt_req=$dimension{$dim}{$instance.'.optionalrequired'}; - if ($opt_req !~ /\S/) { - $opt_req= - &Apache::lonxml::get_param('OptionalRequired', - $parstack,$safeeval); - if ($opt_req !~ /\S/) { $opt_req = 0; } - } - $dim_info.="\n

".&mt('You passed [_1] of the [_2] mandatory components and [_3] of the [_4] optional components, of which you were required to pass [_5].',$man_passed,$man_count,$opt_passed,$opt_count,$opt_req)."

\n
"; + my %counts = &get_counts($dim,$instance,$parstack, + $safeeval); + + $dim_info.="\n

" + .&question_status_message(\%counts, + $dimension{$dim}{'depth'}) + ."

\n"; foreach my $id (@{$dimension{$dim}{$instance.'.criterias'}}, @{$dimension{$dim}{'criterias'}}) { @@ -2387,6 +2351,95 @@ sub end_Dimension { return $result; } +sub status_message { + my ($counts,$depth) = @_; + my %req = ('man' => 'mandatory', + 'opt' => 'optional',); + my %type = ('cri' => 'criteria', + 'dim' => ('sub'x($depth+1)).'questions',); + my @sections; + foreach my $req ('man','opt') { + foreach my $type ('cri','dim') { + if ($counts->{$req.'_'.$type}) { + push(@sections, + $counts->{$req.'_'.$type.'_passed'}.' of '. + $counts->{$req.'_'.$type}.' '. + $req{$req}.' '.$type{$type}); + } + } + } + + my $status = 'You passed '; + if (@sections == -1) { + } elsif (@sections == 1) { + $status .= $sections[0]; + } elsif (@sections == 2) { + $status .= $sections[0].' and '.$sections[1]; + } else { + my $last = pop(@sections); + $status .= join(', ',@sections).', and '.$last; + } + $status .= '.'; + if ($counts->{'opt'}) { + $status .= ' You were required to pass '.$counts->{'opt_req'}. + ' optional component'.($counts->{'opt_req'} == 1?'':'s'); + } + return $status; +} + +sub get_counts { + my ($dim,$instance,$parstack,$safeeval) = @_; + my %counts; + my @possible = ('man_cri','man_dim', + 'opt_cri','opt_dim', + 'man_cri_passed', 'man_dim_passed', + 'opt_cri_passed', 'opt_dim_passed', + 'man_passed', + 'opt_passed', + 'opt_req'); + foreach my $which (@possible) { $counts{$which} = 0; } + + my $version = &get_version(); + + foreach my $id ( @{$dimension{$dim}{$instance.'.criterias'}}, + @{$dimension{$dim}{'criterias'}} ) { + my $status = &get_criteria('status',$version,$dim,$id); + my $which; + if ($dimension{$dim}{'criteria.'.$id.'.mandatory'} + eq 'N') { + $which = 'opt'; + } else { + $which = 'man'; + } + $counts{$which}++; + if ($status eq 'pass') { $counts{$which.'_passed'}++; } + if ($dimension{$dim}{'criteria.'.$id.'.type'} + eq 'dimension') { + $which .= '_dim'; + } else { + $which .= '_cri'; + } + $counts{$which}++; + if ($status eq 'pass') { $counts{$which.'_passed'}++; } + + + } + if ($counts{'man_dim_passed'} eq $counts{'man_dim'}) { + $counts{'man_dim_passed'}='all'; + } + if ($counts{'man_cri_passed'} eq $counts{'man_cri'}) { + $counts{'man_cri_passed'}='all'; + } + + $counts{'opt_req'}=$dimension{$dim}{$instance.'.optionalrequired'}; + if ($counts{'opt_req'} !~ /\S/) { + $counts{'opt_req'}= &Apache::lonxml::get_param('OptionalRequired', + $parstack,$safeeval); + if ($counts{'opt_req'} !~ /\S/) { $counts{'opt_req'} = 0; } + } + return %counts; +} + sub end_Setup { my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; my $result=&Apache::lonxml::endredirection();