\n";
+ my $dim_info=
+ "\n
\n\t";
+ my $ucquestion =
+ my $question =
+ ('sub' x $dimension{$dim}{'depth'}).'question';
+ $ucquestion =~ s/^(.)/uc($1)/e;
if ($dim_status eq 'pass') {
- $dim_info.='
Question : you passed this '.$mandatory.' question ';
+ $dim_info.='
'.$ucquestion.' : you passed the above '.$mandatory.' '.$question.' ';
}
if ($dim_status eq 'fail') {
- $dim_info.='
Question : you did not pass this '.$mandatory.' question ';
+ $dim_info.='
'.$ucquestion.' : you did not pass the above '.$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\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/;
+ }
+ }
+ if ($result !~ /^\s*$/s) {
+ # FIXME? this maybe unneccssary in the future, (CSE101 BT
+ # from Fall 2006 geenrate a div that attempts to hide some
+ # of the output in an odd way, this is a workaround so
+ # those old ones will continue to work. # It puts the
+ # LC_question div to come after any starting closie div
+ # that the dimension produces
+ if ($result =~ m{^\s*}) {
+ $result =~ s{^(\s*)}
+ {$1\n};
+ } else {
+ $result = "\n".'
'.
+ "\n".$result;
}
+ $result .= "\n
\n";
}
} elsif ($target eq 'webgrade') {
# in case of any side effects that we need
@@ -2284,7 +2348,7 @@ sub end_Dimension {
$result.=
&nested_parse(\$dimension{$dim}{'questiontext'},[@_],
{'set_dim_id' => undef,
- 'delayed_dim_results' => 0});
+ 'delayed_dim_results' => 1});
foreach my $id (@{$dimension{$dim}{$instance.'.criterias'}},
@{$dimension{$dim}{'criterias'}} ) {
my $type = $dimension{$dim}{'criteria.'.$id.'.type'};
@@ -2299,7 +2363,11 @@ sub end_Dimension {
[@_]);
$criteria = &layout_webgrade_Criteria($dim,$id,$criteria);
my $internal_location=&internal_location($id);
- $result=~s/\Q$internal_location\E/$criteria/;
+ if ($result =~ m/\Q$internal_location\E/) {
+ $result =~ s/\Q$internal_location\E/$criteria/;
+ } else {
+ $result.=$criteria ;
+ }
}
}
if (&nest()) {
@@ -2382,6 +2450,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 the '.
+ $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 +2600,12 @@ sub grading_history {
$entry.=' comment: "'.$Apache::lonhomework::history{"$t:$scope.comment"}.'"';
}
if ($entry) {
- $result.= "
$grader : $entry ";
+ $result.= "\n\t\t
\n\t\t\t$grader :\n\t\t\t $entry \n\t\t ";
}
}
if ($result) {
- return '
';
+ return "\n\t".'
'."\n";
}
return '';
}
@@ -2518,7 +2676,13 @@ sub start_Criteria {
my $dim = &get_dim_id();
my $id=&get_id($parstack,$safeeval);
if ($target eq 'web' || $target eq 'webgrade') {
- $result .= &internal_location($id);
+ if ($target eq 'webgrade') {
+ &Apache::lonxml::debug(" for $dim $id stashing results into $dim ");
+ $dimension{$dim}{'result'} .= &internal_location($id);
+ } else {
+ &Apache::lonxml::debug(" not stashing $dim $id");
+ #$result .= &internal_location($id);
+ }
}
&Apache::lonxml::debug("Criteria $id with $dim");
if (&Apache::londefdef::is_inside_of($tagstack,'Instance')) {
@@ -2554,15 +2718,21 @@ sub layout_web_Criteria {
my $status_display=$status;
$status_display=~s/^([a-z])/uc($1)/e;
my $criteria_info.=
- '
'
- .$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;
}
@@ -2571,34 +2741,46 @@ sub layout_webgrade_Criteria {
my $link=&link($id);
my $version = &get_version();
my $status = &get_criteria('status',$version,$dim,$id);
- my $result =
- '
'."\n".
- &grading_history($version,$dim,$id);
+ my %lt = ( 'ungraded' => 'Ungraded',
+ 'fail' => 'Fail',
+ 'pass' => 'Pass',
+ 'review' => 'Review',
+ 'comment' => 'Additional Comment for Student',
+ );
+ %lt = &Apache::lonlocal::texthash(%lt);
+ my $comment = &get_criteria('comment',$version,$dim,$id);
+ $comment = &HTML::Entities::encode($comment,'<>"&');
+ my %checked;
+ foreach my $which ('ungraded','fail','pass','review') {
+ if ($status eq $which) { $checked{$which} = 'checked="checked"'; }
+ }
+ if (!%checked) { $checked{'ungraded'} = 'checked="checked"'; }
+ my $buttons;
+ foreach my $which ('ungraded','fail','pass','review') {
+ $buttons .= <
+
+ $lt{$which}
+
+END_BUTTON
+ }
+ $criteria =~ s/^\s*//s;
+ $criteria =~ s/\s*$//s;
+ my $result = <
+
+ $criteria
+
+
+$buttons
+
+
+
+END_CRITERIA
+ $result .= &grading_history($version,$dim,$id);
return $result;
}