\n";
+ my $status =
+ "\n
\n\t";
if ($bt_status eq 'pass') {
$status.='
You passed the '.$title.' given on '.
@@ -1050,33 +1064,14 @@ DONEBUTTON
$status.=&add_request_another_attempt_button();
}
}
- $status.='
';
- my $man_count=0;
- my $man_passed=0;
- my $opt_count=0;
- my $opt_passed=0;
+ $status.="\n".'
'."\n";
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'."\n";
$result .= &nested_parse(\$dimension{$dim}{'intro'},[@_]);
my @instances = $instance;
if (&Apache::response::showallfoils()) {
@@ -2226,57 +2227,52 @@ sub end_Dimension {
if (&Apache::lonxml::get_param('Mandatory',$parstack,$safeeval) eq 'N') {
$mandatory='Optional';
}
- my $dim_info="
\n";
+ my $dim_info=
+ "\n
\n\t";
+ my $question = ('sub' x $dimension{$dim}{'depth'}).'question';
+ $question =~ s/^(.)/uc($1)/e;
if ($dim_status eq 'pass') {
- $dim_info.='
Question : you passed this '.$mandatory.' question
';
+ $dim_info.='
'.$question.' : you passed the above '.$mandatory.' question
';
}
if ($dim_status eq 'fail') {
- $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.='
'.$question.' : you did not pass the above '.$mandatory.' question
';
}
- $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\t
"
+ .&question_status_message(\%counts,
+ $dimension{$dim}{'depth'})
+ ."
\n
\n";
foreach my $id (@{$dimension{$dim}{$instance.'.criterias'}},
@{$dimension{$dim}{'criterias'}}) {
my $type = $dimension{$dim}{'criteria.'.$id.'.type'};
if ($type eq 'dimension') {
- $result.=$dimension{$id}{'result'};
- next;
+ if (defined($dimension{$id}{'result'})) {
+ $result.=$dimension{$id}{'result'};
+ next;
+ } else {
+ $dim_info .=
+ &nested_parse(\$dimension{$dim}{'criteria.'.$id},
+ [@_],{'set_dim_id' => $id});
+ }
+ } else {
+ my $criteria =
+ &nested_parse(\$dimension{$dim}{'criteria.'.$id},
+ [@_]);
+ $dim_info .= &layout_web_Criteria($dim,$id,$criteria);
}
- my $criteria =
- &nested_parse(\$dimension{$dim}{'criteria.'.$id},
- [@_]);
- $dim_info .= &layout_web_Criteria($dim,$id,$criteria);
}
+ # puts the results at the end of the dimension
+ $result .= $dim_info;
- my $internal_location=&internal_location($dim);
- $result=~s/\Q$internal_location\E/$dim_info/;
+ # puts the results at the beginning of the dimension
+ # my $internal_location=&internal_location($dim);
+ # $result=~s/\Q$internal_location\E/$dim_info/;
}
}
+ $result .= "\n
\n";
} elsif ($target eq 'webgrade') {
# in case of any side effects that we need
&nested_parse(\$dimension{$dim}{'intro'},[@_]);
@@ -2382,6 +2378,95 @@ sub end_Dimension {
return $result;
}
+sub question_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();
@@ -2443,11 +2528,12 @@ sub grading_history {
$entry.=' comment: "'.$Apache::lonhomework::history{"$t:$scope.comment"}.'"';
}
if ($entry) {
- $result.= "'
- .$mandatory.' Criteria
';
+ '
'."\n\t".'
'
+ .$mandatory.' Criteria
'."\n\t".'
'
+ ."\n";
+ $criteria =~ s/^\s*//s;
+ $criteria =~ s/\s*$//s;
$criteria_info.= $criteria;
- $criteria_info.='
'.$status_display.'
';
+ $criteria_info.="\n\t".''.
+ "\n\t".'
'.$status_display.'
';
if ($comment =~ /\w/) {
- $criteria_info.='';
+ $criteria_info.=
+ "\n\t".
+ '';
}
- $criteria_info.='
';
+ $criteria_info.="\n".'
'."\n";
+
return $criteria_info;
}
@@ -2577,34 +2669,46 @@ sub layout_webgrade_Criteria {
my $link=&link($id);
my $version = &get_version();
my $status = &get_criteria('status',$version,$dim,$id);
- my $result =
- '