File:  [LON-CAPA] / loncom / interface / lonquickgrades.pm
Revision 1.4: download - view: text, annotated - select for diffs
Tue Nov 19 21:11:25 2002 UTC (21 years, 6 months ago) by bowersj2
Branches: MAIN
CVS tags: HEAD
Now with Extra Color, and not in a table, either. It's still not quite right
though, but we can work on it.

    1: # The LearningOnline Network with CAPA
    2: # Quick Student Grades Display
    3: #
    4: # $Id:
    5: #
    6: # Copyright Michigan State University Board of Trustees
    7: #
    8: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
    9: #
   10: # LON-CAPA is free software; you can redistribute it and/or modify
   11: # it under the terms of the GNU General Public License as published by
   12: # the Free Software Foundation; either version 2 of the License, or
   13: # (at your option) any later version.
   14: #
   15: # LON-CAPA is distributed in the hope that it will be useful,
   16: # but WITHOUT ANY WARRANTY; without even the implied warranty of
   17: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   18: # GNU General Public License for more details.
   19: #
   20: # You should have received a copy of the GNU General Public License
   21: # along with LON-CAPA; if not, write to the Free Software
   22: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   23: #
   24: # /home/httpd/html/adm/gpl.txt
   25: #
   26: # http://www.lon-capa.org/
   27: #
   28: # Created Nov. 14, 2002 by Jeremy Bowers
   29: 
   30: package Apache::lonquickgrades;
   31: 
   32: use strict;
   33: use Apache::Constants qw(:common :http);
   34: 
   35: sub handler {
   36:     my $r = shift;
   37: 
   38:     &Apache::loncommon::get_unprocessed_cgi($ENV{QUERY_STRING});
   39: 
   40:     # Handle header-only request
   41:     if ($r->header_only) {
   42:         if ($ENV{'browser.mathml'}) {
   43:             $r->content_type('text/xml');
   44:         } else {
   45:             $r->content_type('text/html');
   46:         }
   47:         $r->send_http_header;
   48:         return OK;
   49:     }
   50: 
   51:     # Send header, don't cache this page
   52:     if ($ENV{'browser.mathml'}) {
   53:         $r->content_type('text/xml');
   54:     } else {
   55:         $r->content_type('text/html');
   56:     }
   57:     &Apache::loncommon::no_cache($r);
   58:     $r->send_http_header;
   59: 
   60:     # Create the nav map
   61:     my $navmap = Apache::lonnavmaps::navmap->new(
   62:                         $ENV{"request.course.fn"}.".db",
   63:                         $ENV{"request.course.fn"}."_parms.db", 1, 0);
   64: 
   65:     # Keep this hash in sync with %statusIconMap in lonnavmaps; they
   66:     # should match color/icon
   67:     my $res = $navmap->firstResource(); # temp resource to access constants
   68: 
   69:     my $green = "#AAFFAA";
   70:     my $red = "#FFAAAA";
   71:     my $yellow = "#FFFFAA";
   72:     my $orange = "#FFBB88";
   73:     my $neutral = "";
   74:     my %statusColorMap = 
   75:         ( $res->NETWORK_FAILURE    => $neutral,
   76:           $res->NOTHING_SET        => $neutral,
   77:           $res->CORRECT            => $green,
   78:           $res->EXCUSED            => $green,
   79:           $res->PAST_DUE_NO_ANSWER => $orange,
   80:           $res->PAST_DUE_ANSWER_LATER => $orange,
   81:           $res->ANSWER_OPEN        => $orange,
   82:           $res->OPEN_LATER         => $neutral,
   83:           $res->TRIES_LEFT         => $neutral,
   84:           $res->INCORRECT          => $orange,
   85:           $res->OPEN               => $yellow,
   86:           $res->ATTEMPTED          => $yellow );
   87:     
   88:     if (!defined($navmap)) {
   89:         my $requrl = $r->uri;
   90:         $ENV{'user.error.msg'} = "$requrl:bre:0:0:Course not initialized";
   91:         return HTTP_NOT_ACCEPTABLE;
   92:     }
   93:  
   94:     # Header
   95:     $r->print(&Apache::loncommon::bodytag('Quick Score Display','',
   96:                                           ''));
   97: 
   98:     $navmap->init();
   99: 
  100:     # End navmap using boilerplate
  101: 
  102:     my $iterator = $navmap->getIterator(undef, undef, undef, 1);
  103:     my $depth = 1;
  104:     $iterator->next(); # ignore first BEGIN_MAP
  105:     my $curRes = $iterator->next();
  106:     my $totalParts = 0;
  107:     my $totalRight = 0;
  108:     my $totalCurrentlyPossible = 0;
  109:     
  110:     $r->print("<div width=\"50%\">\n"); # use this to format the col
  111:    
  112:     while ( $depth > 0 ) {
  113:         if ($curRes == $iterator->BEGIN_MAP()) {$depth++;}
  114:         if ($curRes == $iterator->END_MAP()) { $depth--; }
  115: 
  116:         if (ref($curRes) && $curRes->is_problem()) {
  117:             my $title = $curRes->compTitle();
  118:             my $stack = $iterator->getStack();
  119:             my $src = Apache::lonnavmaps::getLinkForResource($stack);
  120:             my $srcHasQuestion = $src =~ /\?/;
  121:             my $link = $src.
  122:                 ($srcHasQuestion?'&':'?') .
  123:                 'symb='.&Apache::lonnet::escape($curRes->symb()).
  124:                 '"';
  125:             my $parts = $curRes->parts();
  126:             my $multipart = scalar(@{$parts}) > 1;
  127: 
  128:             for my $part (@{$parts}) {
  129:                 if ($multipart && $part eq '0') { next; }
  130:                 $totalParts++;
  131: 
  132:                 my $status = $curRes->status($part);
  133:                 my $color = $statusColorMap{$status};
  134:                 if ($color eq $green) { # I'm being bad here... ;-)
  135:                     $totalRight++; $totalCurrentlyPossible++;
  136:                 }
  137:                 if ($color eq $yellow || $color eq $orange) {
  138:                     $totalCurrentlyPossible++;
  139:                 }
  140: 
  141:                 $r->print("<div style=\"background-color: $color\" width=\"100%\">" .
  142:                           "<nobr><a href=\"$link\">$title" . 
  143:                           ($multipart ? ', ' . $part : '') . '</a></nobr></div>'
  144:                           ."\n");
  145: 
  146:                 if (!($totalParts % 20)) { $r->rflush(); }
  147:             }
  148:         }
  149: 
  150:         $curRes = $iterator->next();
  151:     }
  152: 
  153:     $r->print("<br><hr>\n");
  154:     $r->print("<div width=\"100%\" align=\"right\">");
  155:     $r->print("Total Parts Correct: <b>$totalRight</b><br>");
  156:     $r->print("Number Of Parts Possibly Correct: <b>$totalCurrentlyPossible</b><br>");
  157:     $r->print("Total Parts In Course: <b>$totalParts</b></div></div>\n\n");
  158: 
  159:     $r->print("</body></html>");
  160: 
  161:     $navmap->untieHashes();
  162: 
  163:     return OK;
  164: }
  165: 
  166: 1;

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>