--- loncom/interface/lonquickgrades.pm 2002/11/22 20:07:11 1.5 +++ loncom/interface/lonquickgrades.pm 2002/12/06 19:29:28 1.9 @@ -68,6 +68,12 @@ sub real_handler { $ENV{"request.course.fn"}.".db", $ENV{"request.course.fn"}."_parms.db", 1, 0); + if (!defined($navmap)) { + my $requrl = $r->uri; + $ENV{'user.error.msg'} = "$requrl:bre:0:0:Navamp initialization failed."; + return HTTP_NOT_ACCEPTABLE; + } + # Keep this hash in sync with %statusIconMap in lonnavmaps; they # should match color/icon my $res = $navmap->firstResource(); # temp resource to access constants @@ -82,6 +88,12 @@ sub real_handler { $r->print(&Apache::loncommon::bodytag('Quick Score Display','', '')); + $r->print(<This screen shows how many problems (or problem parts) you have completed, and +how many you have not yet done. You can also look at a detailed +score sheet.

+HEADER + $navmap->init(); # End navmap using boilerplate @@ -107,7 +119,7 @@ sub real_handler { if ($curRes == $iterator->BEGIN_MAP()) {$depth++;} if ($curRes == $iterator->END_MAP()) { $depth--; } - if (ref($curRes) && $curRes->is_problem()) + if (ref($curRes) && $curRes->is_problem() && !$curRes->randomout) { # Get number of correct, incorrect parts my $parts = $curRes->parts(); @@ -147,15 +159,18 @@ sub real_handler { } $iterator = $navmap->getIterator(undef, undef, undef, 1); - my $depth = 1; + $depth = 1; $iterator->next(); # ignore first BEGIN_MAP - my $curRes = $iterator->next(); + $curRes = $iterator->next(); - my @start = (255, 255, 0); + my @start = (255, 255, 192); my @end = (0, 192, 0); my $indentString = '     '; + my $unaccountedTotal = $totalParts; + my $unaccountedCorrect = $totalRight; + # Second pass: Print the maps. $r->print(''); $r->print('' . "\n\n"); @@ -176,25 +191,38 @@ sub real_handler { my $correct = $curRes->{DATA}->{CHILD_CORRECT}; my $total = $curRes->{DATA}->{CHILD_PARTS}; - my $ratio; - $ratio = $total==0 ? 1 : $correct / $total; - my $color = mixColors(\@start, \@end, $ratio); - $r->print(""); - $r->print("\n"); + if ($total > 0) { + my $ratio; + $ratio = $correct / $total; + my $color = mixColors(\@start, \@end, $ratio); + $r->print(""); + $r->print("\n"); + } } $curRes = $iterator->next(); } + # If there were any problems at the top level, print an extra "catchall" + if ($unaccountedTotal > 0) { + my $ratio = $unaccountedCorrect / $unaccountedTotal; + my $color = mixColors(\@start, \@end, $ratio); + $r->print(""); + } - $r->print("\n\n\n"); + my $maxHelpLink = Apache::loncommon::help_open_topic("Quick_Grades_Possibly_Correct"); $r->print("\n\n"); @@ -213,15 +241,16 @@ sub mixColors { my $end = shift; my $ratio = shift; + my ($a,$b); my $final = ""; - my $a = $start->[0]; my $b = $end->[0]; + $a = $start->[0]; $b = $end->[0]; my $mix1 = POSIX::floor((1-$ratio)*$a + $ratio*$b); - my $a = $start->[1]; my $b = $end->[1]; + $a = $start->[1]; $b = $end->[1]; my $mix2 = POSIX::floor((1-$ratio)*$a + $ratio*$b); - my $a = $start->[2]; my $b = $end->[2]; + $a = $start->[2]; $b = $end->[2]; my $mix3 = POSIX::floor((1-$ratio)*$a + $ratio*$b); - my $final = sprintf "%2x%2x%2x", $mix1, $mix2, $mix3; + $final = sprintf "%2x%2x%2x", $mix1, $mix2, $mix3; return "#" . $final; }
SequenceCorrect / Total
"); - - for (my $i = 1; $i < $depth; $i++) { $r->print($indentString); } + $unaccountedTotal -= $total; + $unaccountedCorrect -= $correct; - $r->print("$title$correct / $total
"); + + for (my $i = 1; $i < $depth; $i++) { $r->print($indentString); } + + $r->print("$title$correct / $total
"); + $r->print("Problems Not Contained In Sequences"); + $r->print("$unaccountedCorrect / $unaccountedTotal
Total Parts Correct: $totalRight
"); - $r->print("Number Of Parts Possibly Correct: $totalPossible
"); + $r->print("Max Possible To Date $maxHelpLink: $totalPossible
"); $r->print("Total Parts In Course: $totalParts