--- loncom/interface/lonquickgrades.pm 2003/09/23 22:42:26 1.22.2.2 +++ loncom/interface/lonquickgrades.pm 2008/12/12 18:49:03 1.43.2.2 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Quick Student Grades Display # -# +# $Id: lonquickgrades.pm,v 1.43.2.2 2008/12/12 18:49:03 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -32,6 +32,10 @@ package Apache::lonquickgrades; use strict; use Apache::Constants qw(:common :http); use POSIX; +use Apache::loncommon; +use Apache::lonlocal; +use Apache::lonnet; +use Apache::grades; sub handler { my $r = shift; @@ -44,36 +48,31 @@ sub real_handler { &Apache::loncommon::get_unprocessed_cgi($ENV{QUERY_STRING}); # Handle header-only request + if ($env{'browser.mathml'}) { + &Apache::loncommon::content_type($r,'text/xml'); + } else { + &Apache::loncommon::content_type($r,'text/html'); + } if ($r->header_only) { - if ($ENV{'browser.mathml'}) { - $r->content_type('text/xml'); - } else { - $r->content_type('text/html'); - } - $r->send_http_header; + $r->send_http_header; return OK; } # Send header, don't cache this page - if ($ENV{'browser.mathml'}) { - $r->content_type('text/xml'); - } else { - $r->content_type('text/html'); - } &Apache::loncommon::no_cache($r); $r->send_http_header; my $showPoints = - $ENV{'course.'.$ENV{'request.course.id'}.'.grading'} eq 'standard'; + $env{'course.'.$env{'request.course.id'}.'.grading'} eq 'standard'; + my $notshowSPRSlink = + $env{'course.'.$env{'request.course.id'}.'.grading'} eq 'external'; # Create the nav map - my $navmap = Apache::lonnavmaps::navmap->new( - $ENV{"request.course.fn"}.".db", - $ENV{"request.course.fn"}."_parms.db", 1, 0, 1); + my $navmap = Apache::lonnavmaps::navmap->new(); if (!defined($navmap)) { my $requrl = $r->uri; - $ENV{'user.error.msg'} = "$requrl:bre:0:0:Navamp initialization failed."; + $env{'user.error.msg'} = "$requrl:bre:0:0:Navamp initialization failed."; return HTTP_NOT_ACCEPTABLE; } @@ -82,23 +81,22 @@ sub real_handler { my $res = $navmap->firstResource(); # temp resource to access constants # Header - my $title = $showPoints ? "Quick Points Display" : "Quick Completed Problems Display"; - $r->print(&Apache::loncommon::bodytag($title, '', '')); + my $title = $showPoints ? "Points Display" : "Completed Problems Display"; + $r->print(&Apache::loncommon::start_page($title)); - if (!$showPoints) { - $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 + if (!$showPoints && !$notshowSPRSlink ) { + $r->print('

' + .&mt('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 [_1]a detailed score sheet[_2].' + ,'','') + .'

'); } - $r->print("This may take a few moments to display."); + $r->print('

'.&mt('This may take a few moments to display.').'

'); $r->rflush(); - $navmap->init(); - # End navmap using boilerplate my $iterator = $navmap->getIterator(undef, undef, undef, 1); @@ -119,8 +117,9 @@ HEADER # equally for both cases. my $totalParts = 0; my $totalPossible = 0; my $totalRight = 0; + my $totalAttempted = 0; my $now = time(); - my $topLevelParts = 0; my $topLevelRight = 0; + my $topLevelParts = 0; my $topLevelRight = 0; my $topLevelAttempted = 0; # Pre-run: Count parts correct while ( $depth > 0 ) { @@ -133,26 +132,31 @@ HEADER my $parts = $curRes->parts(); my $partsRight = 0; my $partsCount = 0; + my $partsAttempted = 0; my $stack = $iterator->getStack(); for my $part (@{$parts}) { my $completionStatus = $curRes->getCompletionStatus($part); my $dateStatus = $curRes->getDateStatus($part); + if ($completionStatus == $curRes->EXCUSED()) { next; } if ($showPoints) { - my $score; - # If we're not telling status and the answer date isn't - # passed yet - if (($curRes->problemstatus($part) eq 'no') && + my $score = 0; + # If we're not telling status and the answer date isn't passed yet, + # it's an "attempted" point + if ((($curRes->problemstatus($part) eq 'no') || + ($curRes->problemstatus($part) eq 'no_feedback_ever')) && ($dateStatus != $curRes->ANSWER_OPEN)) { - $score = 0; + my $status = $curRes->simpleStatus($part); + if ($status == $curRes->ATTEMPTED) { + $partsAttempted += $curRes->weight($part); + $totalAttempted += $partsAttempted; + } } else { - $score = $curRes->weight($part) * - $curRes->awarded($part); + $score = &Apache::grades::compute_points($curRes->weight($part), $curRes->awarded($part)); } - $partsRight += $score; $totalRight += $score; $partsCount += $curRes->weight($part); @@ -162,16 +166,22 @@ HEADER } $totalParts += $curRes->weight($part); } else { - my $status = $curRes->status($part); + my $status = $curRes->simpleStatus($part); my $thisright = 0; $partsCount++; - if ($status == $curRes->CORRECT || - $status == $curRes->EXCUSED) { + if ($status == $curRes->CORRECT || + $status == $curRes->PARTIALLY_CORRECT ) { $partsRight++; $totalRight++; $thisright = 1; } + + if ($status == $curRes->ATTEMPTED) { + $partsAttempted++; + $totalAttempted++; + } + my $dateStatus = $curRes->getDateStatus($part); $totalParts++; if ($curRes->opendate($part) < $now) { $totalPossible++; @@ -182,6 +192,7 @@ HEADER if ($depth == 1) { # in top-level only $topLevelParts += $partsCount; $topLevelRight += $partsRight; + $topLevelAttempted += $partsAttempted; } # Crawl down stack and record parts correct and total @@ -190,10 +201,12 @@ HEADER if (!defined($res->{DATA}->{CHILD_PARTS})) { $res->{DATA}->{CHILD_PARTS} = 0; $res->{DATA}->{CHILD_CORRECT} = 0; + $res->{DATA}->{CHILD_ATTEMPTED} = 0; } $res->{DATA}->{CHILD_PARTS} += $partsCount; $res->{DATA}->{CHILD_CORRECT} += $partsRight; + $res->{DATA}->{CHILD_ATTEMPTED} += $partsAttempted; } } } @@ -211,9 +224,15 @@ HEADER my $indentString = '     '; # Second pass: Print the maps. - $r->print(''); - $title = $showPoints ? "Points Scored" : "Done"; - $r->print("" . "\n\n"); + $r->print(&Apache::loncommon::start_data_table() + .&Apache::loncommon::start_data_table_header_row() + .''); + $title = &mt($showPoints ? "Points Scored" : "Done"); + if ($totalAttempted) { + $title .= " / " . &mt("Attempted"); + } + $r->print(""); - $r->print("\n"); + if ($totalAttempted) { + $r->print(''); + } else { + $r->print(''); + } + $r->print(&Apache::loncommon::end_data_table_row()); } } @@ -245,24 +279,28 @@ HEADER if ($topLevelParts > 0) { my $ratio = $topLevelRight / $topLevelParts; my $color = mixColors(\@start, \@end, $ratio); - $r->print(""); + $r->print(&Apache::loncommon::start_data_table_row() + .'" + .&Apache::loncommon::end_data_table_row()); } - my $maxHelpLink = Apache::loncommon::help_open_topic("Quick_Grades_Possibly_Correct"); - - $title = $showPoints ? "Points" : "Parts Done"; + if ($showPoints) { + my $maxHelpLink = Apache::loncommon::help_open_topic("Quick_Grades_Possibly_Correct"); - $r->print("\n\n"); - - - $r->print("
Folder$title / Total
'.&mt('Folder').'$title / ".&mt('Total').'' + .&Apache::loncommon::end_data_table_header_row()); while ($depth > 0) { if ($curRes == $iterator->BEGIN_MAP()) {$depth++;} if ($curRes == $iterator->END_MAP()) { $depth--; } @@ -223,18 +242,33 @@ HEADER my $correct = $curRes->{DATA}->{CHILD_CORRECT}; my $total = $curRes->{DATA}->{CHILD_PARTS}; + my $attempted = $curRes->{DATA}->{CHILD_ATTEMPTED}; if ($total > 0) { my $ratio; $ratio = $correct / $total; my $color = mixColors(\@start, \@end, $ratio); - $r->print("
"); + $r->print(&Apache::loncommon::start_data_table_row() + .''); my $thisIndent = ''; for (my $i = 1; $i < $depth; $i++) { $thisIndent .= $indentString; } $r->print("$thisIndent$title$thisIndent$correct / $total
' + .$thisIndent + .'' + .$correct.' / '.$attempted.' / '.$total + .'' + .$thisIndent + .'' + .$correct.' / '.$total + .'
"); - $r->print("Problems Not Contained In A Folder"); - $r->print("$topLevelRight / $topLevelParts
'); + $r->print(&mt("Problems Not Contained In A Folder").""); + $r->print("$topLevelRight / $topLevelParts
Total $title: $totalRight
"); - $r->print("Max Possible To Date $maxHelpLink: $totalPossible
"); - $title = $showPoints ? "Points" : "Parts"; - $r->print("Total $title In Course: $totalParts
"); + $title = $showPoints ? "Points" : "Parts Done"; + my $totaltitle = $showPoints ? &mt("Awarded Total Points") : &mt("Total Parts Done"); + $r->print(&Apache::loncommon::start_data_table_row() + .''.$totaltitle.': '.$totalRight.'
'); + $r->print(&mt("Max Possible To Date")." $maxHelpLink: $totalPossible
"); + $title = $showPoints ? "Points" : "Parts"; + $r->print(&mt("Total $title In Course").': '.$totalParts.'' + .&Apache::loncommon::end_data_table_row()); + } - $navmap->untieHashes(); + $r->print(&Apache::loncommon::end_data_table() + .&Apache::loncommon::end_page()); return OK; } 500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.