[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();