--- loncom/interface/lonquickgrades.pm 2015/03/13 22:40:35 1.49.6.2
+++ loncom/interface/lonquickgrades.pm 2011/02/07 19:16:34 1.66
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Quick Student Grades Display
#
-# $Id: lonquickgrades.pm,v 1.49.6.2 2015/03/13 22:40:35 raeburn Exp $
+# $Id: lonquickgrades.pm,v 1.66 2011/02/07 19:16:34 www Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -29,7 +29,7 @@
package Apache::lonquickgrades;
use strict;
-use Apache::Constants qw(:common :http REDIRECT);
+use Apache::Constants qw(:common :http);
use POSIX;
use Apache::loncommon;
use Apache::lonlocal;
@@ -57,83 +57,128 @@ sub real_handler {
return OK;
}
- unless (&Apache::lonnet::allowed('mgr')) {
- # Check for critical messages and redirect if present.
- my ($redirect,$url) = &Apache::loncommon::critical_redirect(300);
- if ($redirect) {
- &Apache::loncommon::content_type($r,'text/html');
- $r->header_out(Location => $url);
- return REDIRECT;
- }
-
- # Check if course needs to be re-initialized
- my $loncaparev = $r->dir_config('lonVersion');
- my ($result,@reinit) = &Apache::loncommon::needs_coursereinit($loncaparev);
-
- if ($result eq 'switch') {
- &Apache::loncommon::content_type($r,'text/html');
- $r->send_http_header;
- $r->print(&Apache::loncommon::check_release_result(@reinit));
- return OK;
- } elsif ($result eq 'update') {
- my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
- my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
- my ($furl,$ferr) = &Apache::lonuserstate::readmap("$cdom/$cnum");
- if ($ferr) {
- my $requrl = $r->uri;
- $env{'user.error.msg'}="$requrl:bre:0:0:Course not initialized";
- $env{'user.reinit'} = 1;
- return HTTP_NOT_ACCEPTABLE;
- }
- }
- }
-
# Send header, don't cache this page
&Apache::loncommon::no_cache($r);
$r->send_http_header;
- my $showPoints =
+ my $showPoints =
$env{'course.'.$env{'request.course.id'}.'.grading'} eq 'standard';
- my $notshowSPRSlink =
+ my $notshowSPRSlink =
(($env{'course.'.$env{'request.course.id'}.'.grading'} eq 'external')
|| ($env{'course.'.$env{'request.course.id'}.'.grading'} eq 'externalnototals'));
my $notshowTotals=
$env{'course.'.$env{'request.course.id'}.'.grading'} eq 'externalnototals';
+ my $showCategories=
+ $env{'course.'.$env{'request.course.id'}.'.grading'} eq 'categories';
- # Create the nav map
- my $navmap = Apache::lonnavmaps::navmap->new();
-
- 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
-
- # Header
my $title = "Grading and Statistics";#$showPoints ? "Points Display" : "Completed Problems Display";
my $brcrum = [{href=>"/adm/quickgrades",text => "Points Display"}];
$r->print(&Apache::loncommon::start_page($title,undef,
{'bread_crumbs' => $brcrum})
);
- 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].'
- ,'','')
- .'
');
+ &startGradeScreen($r,'quick');
+
+ $r->rflush();
+
+# my $uname='korte';
+# my $udom='gerd';
+
+ my $uname;
+ my $udom;
+
+ my ($navmap,$totalParts,$totalPossible,$totalRight,$totalAttempted,$topLevelParts,$topLevelRight,$topLevelAttempted)=
+ &getData($showPoints,$uname,$udom);
+
+ if ($showCategories) {
+ &outputCategories($r,$showPoints,$notshowTotals,
+ $navmap,$totalParts,$totalPossible,$totalRight,$totalAttempted,$topLevelParts,$topLevelRight,$topLevelAttempted);
+ } else {
+ &outputTable($r,$showPoints,$notshowTotals,
+ $navmap,$totalParts,$totalPossible,$totalRight,$totalAttempted,$topLevelParts,$topLevelRight,$topLevelAttempted);
+ }
+ &endGradeScreen($r);
+ return OK;
+
+}
+
+sub startGradeScreen {
+ my ($r,$mode)=@_;
+
+ my $showPoints =
+ $env{'course.'.$env{'request.course.id'}.'.grading'} eq 'standard';
+ my $notshowSPRSlink =
+ (($env{'course.'.$env{'request.course.id'}.'.grading'} eq 'external')
+ || ($env{'course.'.$env{'request.course.id'}.'.grading'} eq 'externalnototals')
+ || ($env{'course.'.$env{'request.course.id'}.'.grading'} eq 'categories'));
+ my $notshowTotals=
+ $env{'course.'.$env{'request.course.id'}.'.grading'} eq 'externalnototals';
+ my $showCategories=
+ $env{'course.'.$env{'request.course.id'}.'.grading'} eq 'categories';
+
+ my $allowed_to_view = &Apache::lonnet::allowed('vgr',$env{'request.course.id'});
+ my $allowed_to_edit = &Apache::lonnet::allowed('mgr',$env{'request.course.id'});
+
+ if ($allowed_to_view) {
+ my @notes;
+ push(@notes,&mt('Students do not see total points.')) if ($notshowTotals);
+ push(@notes,&mt('Students do not see link to spreadsheet.')) if ($notshowSPRSlink);
+ push(@notes,&mt('Students will see points based on problem weights.')) if ($showPoints);
+ push(@notes,&mt('Students will see points based on categories.')) if ($showCategories);
+ push(@notes, &Apache::lonhtmlcommon::coursepreflink(&mt('Grade display settings'),'grading'));
+ $r->print(&Apache::loncommon::head_subbox(join(' ',@notes)));
}
- $r->print('
'.&mt('This may take a few moments to display.').'
\n");
+
+ }
+ $r->print(&Apache::loncommon::end_data_table_row()."\n");
+ return ($value,$weight);
+}
+
+#
+# Bottom line with grades
+#
+
+sub bottom_line_category {
+ my ($r,$cangrade)=@_;
+}
+
+#
+# Make one new category
+#
+
+sub make_new_category {
+ my ($r,$cangrade,$ordernum,%categories)=@_;
+ unless ($cangrade) { return %categories; }
+# Generate new ID
+ my $id=time.'_'.$$.'_'.rand(10000);
+# Add new ID to list of all IDs ever created in this course
+ $categories{'all'}.=','.$id;
+ $categories{'all'}=~s/^\,//;
+# Add new ID to ordered list of displayed and evaluated categories
+ $categories{'order'}.=','.$id;
+ $categories{'order'}=~s/^\,//;
+# Move it into desired space
+ if (defined($ordernum)) {
+ %categories=&move_category($id,$cangrade,$ordernum,%categories);
+ }
+ return %categories;
+}
+
+#
+# Move a category to a desired position n the display order
+#
+
+sub move_category {
+ my ($id,$cangrade,$ordernum,%categories)=@_;
+ unless ($cangrade) { return %categories; }
+ my @order=split(/\,/,$categories{'order'});
+# Where is the index currently?
+ my $currentpos=¤t_pos_category($id,%categories);
+ if (defined($currentpos)) {
+ if ($currentpos<$ordernum) {
+# This is moving to a higher index
+# ....X1234....
+# ....1234X....
+ for (my $i=$currentpos;$i<$ordernum;$i++) {
+ $order[$i]=$order[$i+1];
+ }
+ $order[$ordernum]=$id;
+ }
+ if ($currentpos>$ordernum) {
+# This is moving to a lower index
+# ....1234X....
+# ....X1234....
+ for (my $i=$currentpos;$i>$ordernum;$i--) {
+ $order[$i]=$order[$i-1];
+ }
+ $order[$ordernum]=$id;
+ }
+ }
+ $categories{'order'}=join(',',@order);
+ return %categories;
+}
+
+#
+# Find current postion of a category in the order
+#
+
+sub current_pos_category {
+ my ($id,%categories)=@_;
+ my @order=split(/\,/,$categories{'order'});
+ for (my $i=0;$i<=$#order;$i++) {
+ if ($order[$i] eq $id) { return $i; }
+ }
+# not found
+ return undef;
+}
+
+#
+# Set name of a category
+#
+sub set_category_name {
+ my ($canedit,$id,$name,%categories)=@_;
+ unless ($canedit) { return %categories; }
+ $categories{$id.'_name'}=$name;
+ return %categories;
+}
+
+#
+# === end category-related
+#
+#
# Pass this two refs to arrays for the start and end color, and a number
# from 0 to 1 for how much of the latter you want to mix in. It will
# return a string ready to show ("#FFC309");
+
sub mixColors {
my $start = shift;
my $end = shift;