'."\n";
+ $result .= &nested_parse(\$dimension{$dim}{'intro'},[@_]);
+ my @instances = $instance;
+ if (&Apache::response::showallfoils()) {
+ @instances = @{$dimension{$dim}{'instances'}};
}
- my $instance=&get_instance($dim);
- my $version=&get_version();
- if ($target eq 'web') {
- $result .= &nested_parse(\$dimension{$dim}{'intro'},[@_]);
- my @instances = $instance;
- if (&Apache::response::showallfoils()) {
- @instances = @{$dimension{$dim}{'instances'}};
- }
- my $shown_question_text;
- foreach my $instance (@instances) {
- $result .= &nested_parse(\$dimension{$dim}{$instance.'.text'},
- [@_]);
- $result .= &nested_parse(\$dimension{$dim}{'questiontext'},
- [@_],{'set_dim_id' => undef});
- my $task_status =
- $Apache::lonhomework::history{"resource.$version.0.status"};
- if ($task_status ne 'pass' && $task_status ne 'fail') {
-
- foreach my $id (@{$dimension{$dim}{$instance.'.criterias'}},
- @{$dimension{$dim}{'criterias'}}) {
- my $type = $dimension{$dim}{'criteria.'.$id.'.type'};
- &Apache::lonxml::debug("$id is $type");
- if ($type eq 'dimension') {
- $result.=
- &nested_parse(\$dimension{$dim}{'criteria.'.$id},
- [@_],{'set_dim_id' => $id});
- }
- }
- } else {
- my $dim_status=$Apache::lonhomework::history{"resource.$version.0.$dim.status"};
- my $mandatory='Mandatory';
- if (&Apache::lonxml::get_param('Mandatory',$parstack,$safeeval) eq 'N') {
- $mandatory='Optional';
- }
- my $dim_info="
\n";
- if ($dim_status eq 'pass') {
- $dim_info.='
Question : you passed this '.$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.="\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 $internal_location=&internal_location($dim);
- $result=~s/\Q$internal_location\E/$dim_info/;
-
- 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;
- }
- }
- }
- }
- } elsif ($target eq 'webgrade') {
- # in case of any side effects that we need
- &nested_parse(\$dimension{$dim}{'intro'},[@_]);
- &nested_parse(\$dimension{$dim}{$instance.'.text'},[@_]);
- $result.=
- &nested_parse(\$dimension{$dim}{'questiontext'},[@_],
- {'set_dim_id' => undef,
- 'delayed_dim_results' => 1});
- foreach my $id (@{$dimension{$dim}{$instance.'.criterias'}},
- @{$dimension{$dim}{'criterias'}} ) {
- my $type = $dimension{$dim}{'criteria.'.$id.'.type'};
- if ($type eq 'dimension') {
- # dimensional 'criteria' don't get assigned grades
- $result.=
- &nested_parse(\$dimension{$dim}{'criteria.'.$id},
- [@_],{'set_dim_id' => $id});
- next;
- }
-
- my $link=&link($id);
- my $status= &get_criteria('status',$version,$dim,$id);
- $result.='
'."\n";
- $result.=&grading_history($version,$dim,$id);
- $last_link=$link;
- }
- if (&nest()) {
- &Apache::lonxml::debug(" for $dim stashing results into ".$dimension{$dim}{'nested'});
- $dimension{$dimension{$dim}{'nested'}}{'result'}.=$result;
- undef($result);
- }
- } elsif ($target eq 'grade' && $env{'form.webgrade'}) {
- my $optional_passed=0;
- my $mandatory_failed=0;
- my $ungraded=0;
- my $review=0;
-
- $result .= &nested_parse(\$dimension{$dim}{'intro'},[@_]);
+ my $shown_question_text;
+ foreach my $instance (@instances) {
$result .= &nested_parse(\$dimension{$dim}{$instance.'.text'},
[@_]);
$result .= &nested_parse(\$dimension{$dim}{'questiontext'},
[@_],{'set_dim_id' => undef});
-
- foreach my $id (@{$dimension{$dim}{$instance.'.criterias'}},
- @{$dimension{$dim}{'criterias'}}) {
- my $link=&link($id);
-
- my $type = $dimension{$dim}{'criteria.'.$id.'.type'};
- if ($type eq 'criteria') {
- # dimensional 'criteria' don't get assigned grades
- $Apache::lonhomework::results{"resource.$version.0.$dim.$id.status"}=$env{'form.HWVAL_'.$link};
- $Apache::lonhomework::results{"resource.$version.0.$dim.$id.comment"}=$env{'form.HWVAL_comment_'.$link};
- } else {
- $result .=
+ my $task_status =
+ $Apache::lonhomework::history{"resource.$version.0.status"};
+ if ($task_status ne 'pass' && $task_status ne 'fail') {
+
+ foreach my $id (@{$dimension{$dim}{$instance.'.criterias'}},
+ @{$dimension{$dim}{'criterias'}}) {
+ my $type = $dimension{$dim}{'criteria.'.$id.'.type'};
+ &Apache::lonxml::debug("$id is $type");
+ if ($type eq 'dimension') {
+ $result.=
+ &nested_parse(\$dimension{$dim}{'criteria.'.$id},
+ [@_],{'set_dim_id' => $id});
+ }
+ }
+ } else {
+ my $dim_status=$Apache::lonhomework::history{"resource.$version.0.$dim.status"};
+ my $mandatory='Mandatory';
+ if (&Apache::lonxml::get_param('Mandatory',$parstack,$safeeval) eq 'N') {
+ $mandatory='Optional';
+ }
+ 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 the above '.$mandatory.' question
';
+ }
+ if ($dim_status eq 'fail') {
+ $dim_info.='
'.$question.' : you did not pass the above '.$mandatory.' question
';
+ }
+ 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;
+ }
+ my $criteria =
&nested_parse(\$dimension{$dim}{'criteria.'.$id},
- [@_],{'set_dim_id' => $id});
+ [@_]);
+ $dim_info .= &layout_web_Criteria($dim,$id,$criteria);
}
- my $status= &get_criteria('status',$version,$dim,$id);
+ # puts the results at the end of the dimension
+ $result .= $dim_info;
- my $mandatory=($dimension{$dim}{'criteria.'.$id.'.mandatory'} ne 'N');
- if ($status eq 'pass') {
- if (!$mandatory) { $optional_passed++; }
- } elsif ($status eq 'fail') {
- if ($mandatory) { $mandatory_failed++; }
- } elsif ($status eq 'review') {
- $review++;
- } elsif ($status eq 'ungraded') {
- $ungraded++;
- } else {
- $ungraded++;
- }
+ # puts the results at the beginning of the dimension
+ # my $internal_location=&internal_location($dim);
+ # $result=~s/\Q$internal_location\E/$dim_info/;
}
- # FIXME optional required can apply to only
right now...
- 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; }
+ }
+ $result .= "\n \n";
+ } elsif ($target eq 'webgrade') {
+ # in case of any side effects that we need
+ &nested_parse(\$dimension{$dim}{'intro'},[@_]);
+ &nested_parse(\$dimension{$dim}{$instance.'.text'},[@_]);
+ $result.=
+ &nested_parse(\$dimension{$dim}{'questiontext'},[@_],
+ {'set_dim_id' => undef,
+ 'delayed_dim_results' => 1});
+ foreach my $id (@{$dimension{$dim}{$instance.'.criterias'}},
+ @{$dimension{$dim}{'criterias'}} ) {
+ my $type = $dimension{$dim}{'criteria.'.$id.'.type'};
+ if ($type eq 'dimension') {
+ # dimensional 'criteria' don't get assigned grades
+ $result.=
+ &nested_parse(\$dimension{$dim}{'criteria.'.$id},
+ [@_],{'set_dim_id' => $id});
+ next;
+ } else {
+ my $criteria =&nested_parse(\$dimension{$dim}{'criteria.'.$id},
+ [@_]);
+ $criteria = &layout_webgrade_Criteria($dim,$id,$criteria);
+ my $internal_location=&internal_location($id);
+ $result=~s/\Q$internal_location\E/$criteria/;
}
- if ($optional_passed < $opt_req) {
- $mandatory_failed++;
+ }
+ if (&nest()) {
+ &Apache::lonxml::debug(" for $dim stashing results into ".$dimension{$dim}{'nested'});
+ $dimension{$dimension{$dim}{'nested'}}{'result'}.=$result;
+ undef($result);
+ }
+ } elsif ($target eq 'grade' && $env{'form.webgrade'}) {
+ my $optional_passed=0;
+ my $mandatory_failed=0;
+ my $ungraded=0;
+ my $review=0;
+
+ $result .= &nested_parse(\$dimension{$dim}{'intro'},[@_]);
+ $result .= &nested_parse(\$dimension{$dim}{$instance.'.text'},
+ [@_]);
+ $result .= &nested_parse(\$dimension{$dim}{'questiontext'},
+ [@_],{'set_dim_id' => undef});
+
+ foreach my $id (@{$dimension{$dim}{$instance.'.criterias'}},
+ @{$dimension{$dim}{'criterias'}}) {
+ my $link=&link($id);
+
+ my $type = $dimension{$dim}{'criteria.'.$id.'.type'};
+ if ($type eq 'criteria') {
+ # dimensional 'criteria' don't get assigned grades
+ $Apache::lonhomework::results{"resource.$version.0.$dim.$id.status"}=$env{'form.HWVAL_'.$link};
+ $Apache::lonhomework::results{"resource.$version.0.$dim.$id.comment"}=$env{'form.HWVAL_comment_'.$link};
+ } else {
+ $result .=
+ &nested_parse(\$dimension{$dim}{'criteria.'.$id},
+ [@_],{'set_dim_id' => $id});
}
- &Apache::lonxml::debug("all instance ".join(':',@{$dimension{$dim}{$instance.'.criterias'}})." results -> m_f $mandatory_failed o_p $optional_passed u $ungraded r $review");
- if ($review) {
- $Apache::lonhomework::results{"resource.$version.0.$dim.status"}=
- 'review';
- } elsif ($ungraded) {
- $Apache::lonhomework::results{"resource.$version.0.$dim.status"}=
- 'ungraded';
- } elsif ($mandatory_failed) {
- $Apache::lonhomework::results{"resource.$version.0.$dim.status"}=
- 'fail';
+ my $status= &get_criteria('status',$version,$dim,$id);
+
+ my $mandatory=($dimension{$dim}{'criteria.'.$id.'.mandatory'} ne 'N');
+ if ($status eq 'pass') {
+ if (!$mandatory) { $optional_passed++; }
+ } elsif ($status eq 'fail') {
+ if ($mandatory) { $mandatory_failed++; }
+ } elsif ($status eq 'review') {
+ $review++;
+ } elsif ($status eq 'ungraded') {
+ $ungraded++;
} else {
- $Apache::lonhomework::results{"resource.$version.0.$dim.status"}=
- 'pass';
+ $ungraded++;
}
+ }
+
+ 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; }
+ }
+ if ($optional_passed < $opt_req) {
+ $mandatory_failed++;
+ }
+ &Apache::lonxml::debug("all instance ".join(':',@{$dimension{$dim}{$instance.'.criterias'}})." results -> m_f $mandatory_failed o_p $optional_passed u $ungraded r $review");
+ if ($review) {
+ $Apache::lonhomework::results{"resource.$version.0.$dim.status"}=
+ 'review';
+ } elsif ($ungraded) {
+ $Apache::lonhomework::results{"resource.$version.0.$dim.status"}=
+ 'ungraded';
+ } elsif ($mandatory_failed) {
+ $Apache::lonhomework::results{"resource.$version.0.$dim.status"}=
+ 'fail';
} else {
- # any other targets no output
- undef($result);
+ $Apache::lonhomework::results{"resource.$version.0.$dim.status"}=
+ 'pass';
}
- &disable_dimension_parsing();
- pop(@Apache::bridgetask::dimension);
- return $result;
+ } else {
+ # any other targets no output
+ undef($result);
}
+ &disable_dimension_parsing();
+ pop(@Apache::bridgetask::dimension);
+ return $result;
+}
- sub end_Setup {
- my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
- my $result=&Apache::lonxml::endredirection();
- my $dim=&get_id($parstack,$safeeval);
- my $instance=&get_instance($dim);
- my $version=&get_version();
- if ($target eq 'web') {
- @Apache::scripttag::parser_env = @_;
- $result.=&Apache::scripttag::xmlparse($dimension{$dim}{'intro'});
- my @instances = $instance;
- if (&Apache::response::showallfoils()) {
- @instances = @{$dimension{$dim}{'instances'}};
- }
- foreach my $instance (@instances) {
- @Apache::scripttag::parser_env = @_;
- $result.=&Apache::scripttag::xmlparse($dimension{$dim}{$instance.'.text'});
- @Apache::scripttag::parser_env = @_;
- $result.=&Apache::scripttag::xmlparse($dimension{$dim}{'questiontext'});
- }
- } elsif ($target eq 'webgrade'
- || $target eq 'grade' && $env{'form.webgrade'}) {
- # in case of any side effects that we need
- @Apache::scripttag::parser_env = @_;
- &Apache::scripttag::xmlparse($dimension{$dim}{'intro'});
+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();
+ my $dim=&get_id($parstack,$safeeval);
+ my $instance=&get_instance($dim);
+ my $version=&get_version();
+ if ($target eq 'web') {
+ @Apache::scripttag::parser_env = @_;
+ $result.=&Apache::scripttag::xmlparse($dimension{$dim}{'intro'});
+ my @instances = $instance;
+ if (&Apache::response::showallfoils()) {
+ @instances = @{$dimension{$dim}{'instances'}};
+ }
+ foreach my $instance (@instances) {
@Apache::scripttag::parser_env = @_;
- &Apache::scripttag::xmlparse($dimension{$dim}{$instance.'.text'});
+ $result.=&Apache::scripttag::xmlparse($dimension{$dim}{$instance.'.text'});
@Apache::scripttag::parser_env = @_;
- &Apache::scripttag::xmlparse($dimension{$dim}{'questiontext'});
- } else {
- # any other targets no output
- undef($result);
+ $result.=&Apache::scripttag::xmlparse($dimension{$dim}{'questiontext'});
}
- pop(@Apache::bridgetask::dimension);
- return $result;
+ } elsif ($target eq 'webgrade'
+ || $target eq 'grade' && $env{'form.webgrade'}) {
+ # in case of any side effects that we need
+ @Apache::scripttag::parser_env = @_;
+ &Apache::scripttag::xmlparse($dimension{$dim}{'intro'});
+ @Apache::scripttag::parser_env = @_;
+ &Apache::scripttag::xmlparse($dimension{$dim}{$instance.'.text'});
+ @Apache::scripttag::parser_env = @_;
+ &Apache::scripttag::xmlparse($dimension{$dim}{'questiontext'});
+ } else {
+ # any other targets no output
+ undef($result);
}
+ pop(@Apache::bridgetask::dimension);
+ return $result;
}
sub grading_history {
@@ -2381,7 +2500,9 @@ sub grading_history {
return '';
}
my ($result,$grader);
- my $scope="resource.$version.0.$dim.$id";
+ my $scope="resource.$version.0.";
+ $scope .= ($dim ne $top) ? "$dim.$id"
+ : "$id";
foreach my $t (1..$Apache::lonhomework::history{'version'}) {
if (exists($Apache::lonhomework::history{$t.':resource.0.regrader'})) {
my ($gname,$gdom) =
@@ -2398,11 +2519,12 @@ sub grading_history {
$entry.=' comment: "'.$Apache::lonhomework::history{"$t:$scope.comment"}.'"';
}
if ($entry) {
- $result.= "