[LON-CAPA-cvs] cvs: loncom /homework bridgetask.pm
albertel
lon-capa-cvs@mail.lon-capa.org
Thu, 09 Nov 2006 17:50:51 -0000
albertel Thu Nov 9 12:50:51 2006 EDT
Modified files:
/loncom/homework bridgetask.pm
Log:
- update the dimension status message to separate out criteria and sub questsion
- centralize the counting of components and types
Index: loncom/homework/bridgetask.pm
diff -u loncom/homework/bridgetask.pm:1.196 loncom/homework/bridgetask.pm:1.197
--- loncom/homework/bridgetask.pm:1.196 Tue Nov 7 16:31:22 2006
+++ loncom/homework/bridgetask.pm Thu Nov 9 12:50:51 2006
@@ -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 @@
}
}
$status.='</div>';
- 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<div class='LC_$bt_status LC_criteria LC_task_overall_status'>".&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)."</p></div>\n";
-
+ my %counts = &get_counts($dim,undef,$parstack,
+ $safeeval);
+ $status.="\n<div class='LC_$bt_status LC_criteria LC_task_overall_status'><p>".
+ &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'}).
+ "</p></div>\n";
+
foreach my $id (@{$dimension{$dim}{'criterias'}}) {
my $type = $dimension{$dim}{'criteria.'.$id.'.type'};
@@ -2098,6 +2081,7 @@
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 @@
}
my $dim_info="<div class='LC_$dim_status LC_question_grade'>\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.='<h3>'.$ucquestion.' : you passed this '.$mandatory.' '.$question.'</h3>';
+ $dim_info.='<h3>'.$question.' : you passed this '.$mandatory.' question</h3>';
}
if ($dim_status eq 'fail') {
- $dim_info.='<h3>'.$ucquestion.' : you did not pass this '.$mandatory.' '.$question.'</h3>';
- }
- 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++; }
- }
+ $dim_info.='<h3>'.$question.' : you did not pass this '.$mandatory.' question</h3>';
}
- 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<p>".&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)."</p>\n</div>";
+ my %counts = &get_counts($dim,$instance,$parstack,
+ $safeeval);
+
+ $dim_info.="\n<p>"
+ .&question_status_message(\%counts,
+ $dimension{$dim}{'depth'})
+ ."</p>\n</div>";
foreach my $id (@{$dimension{$dim}{$instance.'.criterias'}},
@{$dimension{$dim}{'criterias'}}) {
@@ -2387,6 +2351,95 @@
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();