Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save marxjohnson/3225750 to your computer and use it in GitHub Desktop.
Save marxjohnson/3225750 to your computer and use it in GitHub Desktop.
Patch for Moodle 2 to remove grade items with grade type "no grade" from grader report (gradebook). Copyright Richard Taunton Sixth Form College, UK. Licenced under GNU GPL.
From 8f6a707b4019db72e0785bdd2f9d1e753c95aa05 Mon Sep 17 00:00:00 2001
From: Mark Johnson <mark.johnson@tauntons.ac.uk>
Date: Wed, 19 Jan 2011 08:24:19 +0000
Subject: [PATCH 15/78] Removed items with gradetype 3 (No Grade) from grader
report
---
grade/report/grader/index.php | 6 +-
grade/report/grader/lib.php | 4 +-
grade/report/grader/locallib.php | 624 ++++++++++++++++++++++++++++++++++++++
3 files changed, 632 insertions(+), 2 deletions(-)
create mode 100644 grade/report/grader/locallib.php
diff --git a/grade/report/grader/index.php b/grade/report/grader/index.php
index ca4c063..0ffe11a 100644
--- a/grade/report/grader/index.php
+++ b/grade/report/grader/index.php
@@ -19,6 +19,8 @@ require_once '../../../config.php';
require_once $CFG->libdir.'/gradelib.php';
require_once $CFG->dirroot.'/grade/lib.php';
require_once $CFG->dirroot.'/grade/report/grader/lib.php';
+// LOCAL: Include locally modified classes
+require_once $CFG->dirroot.'/grade/report/grader/locallib.php';
$courseid = required_param('id', PARAM_INT); // course id
$page = optional_param('page', 0, PARAM_INT); // active page
@@ -110,7 +112,9 @@ print_grade_page_head($COURSE->id, 'report', 'grader', $reportname, false, $butt
//Initialise the grader report object that produces the table
//the class grade_report_grader_ajax was removed as part of MDL-21562
-$report = new grade_report_grader($courseid, $gpr, $context, $page, $sortitemid);
+// $report = new grade_report_grader_local($courseid, $gpr, $context, $page, $sortitemid);
+// LOCAL: use locally modified class to remove columns with grade type No Grade
+$report = new grade_report_grader_local($courseid, $gpr, $context, $page, $sortitemid);
// make sure separate group does not prevent view
if ($report->currentgroup == -2) {
diff --git a/grade/report/grader/lib.php b/grade/report/grader/lib.php
index d171289..f243b26 100644
--- a/grade/report/grader/lib.php
+++ b/grade/report/grader/lib.php
@@ -127,7 +127,9 @@ class grade_report_grader extends grade_report {
}
// Grab the grade_tree for this course
- $this->gtree = new grade_tree($this->courseid, true, $switch, $this->collapsed, $nooutcomes);
+ // $this->gtree = new grade_tree($this->courseid, true, $switch, $this->collapsed, $nooutcomes);
+ // LOCAL: use customised grade tree
+ $this->gtree = new grade_tree_local($this->courseid, true, $switch, $this->collapsed, $nooutcomes);
$this->sortitemid = $sortitemid;
diff --git a/grade/report/grader/locallib.php b/grade/report/grader/locallib.php
new file mode 100644
index 0000000..67bba7c
--- /dev/null
+++ b/grade/report/grader/locallib.php
@@ -0,0 +1,624 @@
+<?php
+
+/**
+ * LOCAL - Overrides constructor and inject_colspans to prevent headers being
+ * too wide when items with No Grade are hidden (see below)
+ */
+class grade_tree_local extends grade_tree {
+
+ public function grade_tree_local($courseid, $fillers=true, $category_grade_last=false,
+ $collapsed=null, $nooutcomes=false) {
+ global $USER, $CFG;
+
+ $this->courseid = $courseid;
+ $this->levels = array();
+ $this->context = get_context_instance(CONTEXT_COURSE, $courseid);
+
+ // get course grade tree
+ $this->top_element = grade_category::fetch_course_tree($courseid, true);
+
+ // collapse the categories if requested
+ if (!empty($collapsed)) {
+ grade_tree::category_collapse($this->top_element, $collapsed);
+ }
+
+ // no otucomes if requested
+ if (!empty($nooutcomes)) {
+ grade_tree::no_outcomes($this->top_element);
+ }
+
+ // move category item to last position in category
+ if ($category_grade_last) {
+ grade_tree::category_grade_last($this->top_element);
+ }
+
+ if ($fillers) {
+ // inject fake categories == fillers
+ grade_tree::inject_fillers($this->top_element, 0);
+ // add colspans to categories and fillers
+ grade_tree_local::inject_colspans($this->top_element);
+ }
+
+ grade_tree::fill_levels($this->levels, $this->top_element, 0);
+
+ }
+ /**
+ * Static recursive helper - add colspan information into categories
+ *
+ * @param array &$element The seed of the recursion
+ *
+ * @return int
+ */
+ public function inject_colspans(&$element) {
+ if (empty($element['children'])) {
+ return 1;
+ }
+ $count = 0;
+ foreach ($element['children'] as $key=>$child) {
+ // Customisation to prevent display of columns with gradetype set to "No Grade"
+ if (!isset($child['object']->gradetype) || $child['object']->gradetype != 3) {
+ $count += grade_tree_local::inject_colspans($element['children'][$key]);
+ }
+ }
+ $element['colspan'] = $count;
+ return $count;
+ }
+
+}
+
+/**
+ * LOCAL - Overrides methods that generate table cells to skip grade items with
+ * grade type set to No Grade.
+ */
+class grade_report_grader_local extends grade_report_grader {
+ /**
+ * Builds and returns the HTML code for the headers.
+ * @return string $headerhtml
+ */
+ /**
+ * Builds and returns the rows that will make up the right part of the grader report
+ * @return array Array of html_table_row objects
+ */
+ public function get_right_rows() {
+ global $CFG, $USER, $OUTPUT, $DB, $PAGE;
+
+ $rows = array();
+ $this->rowcount = 0;
+ $numrows = count($this->gtree->get_levels());
+ $numusers = count($this->users);
+ $gradetabindex = 1;
+ $columnstounset = array();
+ $strgrade = $this->get_lang_string('grade');
+ $strfeedback = $this->get_lang_string("feedback");
+ $arrows = $this->get_sort_arrows();
+
+ $jsarguments = array(
+ 'id' => '#fixed_column',
+ 'cfg' => array('ajaxenabled'=>false),
+ 'items' => array(),
+ 'users' => array(),
+ 'feedback' => array()
+ );
+ $jsscales = array();
+
+ foreach ($this->gtree->get_levels() as $key=>$row) {
+
+ if ($key == 0) {
+ // do not display course grade category
+ // continue;
+ }
+
+ $headingrow = new html_table_row();
+ $headingrow->attributes['class'] = 'heading_name_row';
+
+ foreach ($row as $columnkey => $element) {
+ if (!isset($element['object']->gradetype) || $element['object']->gradetype != GRADE_TYPE_TEXT) {
+ $sortlink = clone($this->baseurl);
+ if (isset($element['object']->id)) {
+ $sortlink->param('sortitemid', $element['object']->id);
+ }
+
+ $eid = $element['eid'];
+ $object = $element['object'];
+ $type = $element['type'];
+ $categorystate = @$element['categorystate'];
+
+ if (!empty($element['colspan'])) {
+ $colspan = $element['colspan'];
+ } else {
+ $colspan = 1;
+ }
+
+ if (!empty($element['depth'])) {
+ $catlevel = 'catlevel'.$element['depth'];
+ } else {
+ $catlevel = '';
+ }
+
+ // Element is a filler
+ if ($type == 'filler' or $type == 'fillerfirst' or $type == 'fillerlast') {
+ $fillercell = new html_table_cell();
+ $fillercell->attributes['class'] = $type . ' ' . $catlevel;
+ $fillercell->colspan = $colspan;
+ $fillercell->text = '&nbsp;';
+ $fillercell->header = true;
+ $fillercell->scope = 'col';
+ $headingrow->cells[] = $fillercell;
+ }
+ // Element is a category
+ else if ($type == 'category') {
+ $categorycell = new html_table_cell();
+ $categorycell->attributes['class'] = 'category ' . $catlevel;
+ $categorycell->colspan = $colspan;
+ $categorycell->text = shorten_text($element['object']->get_name());
+ $categorycell->text .= $this->get_collapsing_icon($element);
+ $categorycell->header = true;
+ $categorycell->scope = 'col';
+
+ // Print icons
+ if ($USER->gradeediting[$this->courseid]) {
+ $categorycell->text .= $this->get_icons($element);
+ }
+
+ $headingrow->cells[] = $categorycell;
+ }
+ // Element is a grade_item
+ else {
+ //$itemmodule = $element['object']->itemmodule;
+ //$iteminstance = $element['object']->iteminstance;
+
+ if ($element['object']->id == $this->sortitemid) {
+ if ($this->sortorder == 'ASC') {
+ $arrow = $this->get_sort_arrow('up', $sortlink);
+ } else {
+ $arrow = $this->get_sort_arrow('down', $sortlink);
+ }
+ } else {
+ $arrow = $this->get_sort_arrow('move', $sortlink);
+ }
+
+ $headerlink = $this->gtree->get_element_header($element, true, $this->get_pref('showactivityicons'), false);
+
+ $itemcell = new html_table_cell();
+ $itemcell->attributes['class'] = $type . ' ' . $catlevel . 'highlightable';
+
+ if ($element['object']->is_hidden()) {
+ $itemcell->attributes['class'] .= ' hidden';
+ }
+
+ $itemcell->colspan = $colspan;
+ $itemcell->text = shorten_text($headerlink) . $arrow;
+ $itemcell->header = true;
+ $itemcell->scope = 'col';
+
+ $headingrow->cells[] = $itemcell;
+ }
+ }
+ }
+ $rows[] = $headingrow;
+ }
+
+ $rows = $this->get_right_icons_row($rows);
+
+ // Preload scale objects for items with a scaleid
+ $scaleslist = array();
+ $tabindices = array();
+
+ foreach ($this->gtree->get_items() as $itemid=>$item) {
+ $scale = null;
+ if (!empty($item->scaleid)) {
+ $scaleslist[] = $item->scaleid;
+ $jsarguments['items'][$itemid] = array('id'=>$itemid, 'name'=>$item->get_name(true), 'type'=>'scale', 'scale'=>$item->scaleid, 'decimals'=>$item->get_decimals());
+ } else {
+ $jsarguments['items'][$itemid] = array('id'=>$itemid, 'name'=>$item->get_name(true), 'type'=>'value', 'scale'=>false, 'decimals'=>$item->get_decimals());
+ }
+ $tabindices[$item->id]['grade'] = $gradetabindex;
+ $tabindices[$item->id]['feedback'] = $gradetabindex + $numusers;
+ $gradetabindex += $numusers * 2;
+ }
+ $scalesarray = array();
+
+ if (!empty($scaleslist)) {
+ $scalesarray = $DB->get_records_list('scale', 'id', $scaleslist);
+ }
+ $jsscales = $scalesarray;
+
+ $rowclasses = array('even', 'odd');
+
+ foreach ($this->users as $userid => $user) {
+
+ if ($this->canviewhidden) {
+ $altered = array();
+ $unknown = array();
+ } else {
+ $hidingaffected = grade_grade::get_hiding_affected($this->grades[$userid], $this->gtree->get_items());
+ $altered = $hidingaffected['altered'];
+ $unknown = $hidingaffected['unknown'];
+ unset($hidingaffected);
+ }
+
+
+ $itemrow = new html_table_row();
+ $itemrow->id = 'user_'.$userid;
+ $itemrow->attributes['class'] = $rowclasses[$this->rowcount % 2];
+
+ $jsarguments['users'][$userid] = fullname($user);
+
+ foreach ($this->gtree->items as $itemid=>$unused) {
+ if ($unused->gradetype != GRADE_TYPE_TEXT) {
+ $item =& $this->gtree->items[$itemid];
+ $grade = $this->grades[$userid][$item->id];
+
+ $itemcell = new html_table_cell();
+
+ $itemcell->id = 'u'.$userid.'i'.$itemid;
+
+ // Get the decimal points preference for this item
+ $decimalpoints = $item->get_decimals();
+
+ if (in_array($itemid, $unknown)) {
+ $gradeval = null;
+ } else if (array_key_exists($itemid, $altered)) {
+ $gradeval = $altered[$itemid];
+ } else {
+ $gradeval = $grade->finalgrade;
+ }
+
+ // MDL-11274
+ // Hide grades in the grader report if the current grader doesn't have 'moodle/grade:viewhidden'
+ if (!$this->canviewhidden and $grade->is_hidden()) {
+ if (!empty($CFG->grade_hiddenasdate) and $grade->get_datesubmitted() and !$item->is_category_item() and !$item->is_course_item()) {
+ // the problem here is that we do not have the time when grade value was modified, 'timemodified' is general modification date for grade_grades records
+ $itemcell->text = html_writer::tag('span', userdate($grade->get_datesubmitted(),get_string('strftimedatetimeshort')), array('class'=>'datesubmitted'));
+ } else {
+ $itemcell->text = '-';
+ }
+ $itemrow->cells[] = $itemcell;
+ continue;
+ }
+
+ // emulate grade element
+ $eid = $this->gtree->get_grade_eid($grade);
+ $element = array('eid'=>$eid, 'object'=>$grade, 'type'=>'grade');
+
+ $itemcell->attributes['class'] .= ' grade';
+ if ($item->is_category_item()) {
+ $itemcell->attributes['class'] .= ' cat';
+ }
+ if ($item->is_course_item()) {
+ $itemcell->attributes['class'] .= ' course';
+ }
+ if ($grade->is_overridden()) {
+ $itemcell->attributes['class'] .= ' overridden';
+ }
+
+ if ($grade->is_excluded()) {
+ // $itemcell->attributes['class'] .= ' excluded';
+ }
+
+ if (!empty($grade->feedback)) {
+ //should we be truncating feedback? ie $short_feedback = shorten_text($feedback, $this->feedback_trunc_length);
+ $jsarguments['feedback'][] = array('user'=>$userid, 'item'=>$itemid, 'content'=>wordwrap(trim(format_string($grade->feedback, $grade->feedbackformat)), 34, '<br/ >'));
+ }
+
+ if ($grade->is_excluded()) {
+ $itemcell->text .= html_writer::tag('span', get_string('excluded', 'grades'), array('class'=>'excludedfloater'));
+ }
+
+ // Do not show any icons if no grade (no record in DB to match)
+ if (!$item->needsupdate and $USER->gradeediting[$this->courseid]) {
+ $itemcell->text .= $this->get_icons($element);
+ }
+
+ $hidden = '';
+ if ($grade->is_hidden()) {
+ $hidden = ' hidden ';
+ }
+
+ $gradepass = ' gradefail ';
+ if ($grade->is_passed($item)) {
+ $gradepass = ' gradepass ';
+ } elseif (is_null($grade->is_passed($item))) {
+ $gradepass = '';
+ }
+
+ // if in editing mode, we need to print either a text box
+ // or a drop down (for scales)
+ // grades in item of type grade category or course are not directly editable
+ if ($item->needsupdate) {
+ $itemcell->text .= html_writer::tag('span', get_string('error'), array('class'=>"gradingerror$hidden"));
+
+ } else if ($USER->gradeediting[$this->courseid]) {
+
+ if ($item->scaleid && !empty($scalesarray[$item->scaleid])) {
+ $scale = $scalesarray[$item->scaleid];
+ $gradeval = (int)$gradeval; // scales use only integers
+ $scales = explode(",", $scale->scale);
+ // reindex because scale is off 1
+
+ // MDL-12104 some previous scales might have taken up part of the array
+ // so this needs to be reset
+ $scaleopt = array();
+ $i = 0;
+ foreach ($scales as $scaleoption) {
+ $i++;
+ $scaleopt[$i] = $scaleoption;
+ }
+
+ if ($this->get_pref('quickgrading') and $grade->is_editable()) {
+ $oldval = empty($gradeval) ? -1 : $gradeval;
+ if (empty($item->outcomeid)) {
+ $nogradestr = $this->get_lang_string('nograde');
+ } else {
+ $nogradestr = $this->get_lang_string('nooutcome', 'grades');
+ }
+ $itemcell->text .= '<input type="hidden" id="oldgrade_'.$userid.'_'.$item->id.'" name="oldgrade_'.$userid.'_'.$item->id.'" value="'.$oldval.'"/>';
+ $attributes = array('tabindex' => $tabindices[$item->id]['grade'], 'id'=>'grade_'.$userid.'_'.$item->id);
+ $itemcell->text .= html_writer::select($scaleopt, 'grade_'.$userid.'_'.$item->id, $gradeval, array(-1=>$nogradestr), $attributes);;
+ } elseif(!empty($scale)) {
+ $scales = explode(",", $scale->scale);
+
+ // invalid grade if gradeval < 1
+ if ($gradeval < 1) {
+ $itemcell->text .= html_writer::tag('span', '-', array('class'=>"gradevalue$hidden$gradepass"));
+ } else {
+ $gradeval = $grade->grade_item->bounded_grade($gradeval); //just in case somebody changes scale
+ $itemcell->text .= html_writer::tag('span', $scales[$gradeval-1], array('class'=>"gradevalue$hidden$gradepass"));
+ }
+ } else {
+ // no such scale, throw error?
+ }
+
+ } else if ($item->gradetype != GRADE_TYPE_TEXT) { // Value type
+ if ($this->get_pref('quickgrading') and $grade->is_editable()) {
+ $value = format_float($gradeval, $decimalpoints);
+ $itemcell->text .= '<input type="hidden" id="oldgrade_'.$userid.'_'.$item->id.'" name="oldgrade_'.$userid.'_'.$item->id.'" value="'.$value.'" />';
+ $itemcell->text .= '<input size="6" tabindex="' . $tabindices[$item->id]['grade']
+ . '" type="text" class="text" title="'. $strgrade .'" name="grade_'
+ .$userid.'_' .$item->id.'" id="grade_'.$userid.'_'.$item->id.'" value="'.$value.'" />';
+ } else {
+ $itemcell->text .= html_writer::tag('span', format_float($gradeval, $decimalpoints), array('class'=>"gradevalue$hidden$gradepass"));
+ }
+ }
+
+
+ // If quickfeedback is on, print an input element
+ if ($this->get_pref('showquickfeedback') and $grade->is_editable()) {
+
+ $itemcell->text .= '<input type="hidden" id="oldfeedback_'.$userid.'_'.$item->id.'" name="oldfeedback_'.$userid.'_'.$item->id.'" value="' . s($grade->feedback) . '" />';
+ $itemcell->text .= '<input class="quickfeedback" tabindex="' . $tabindices[$item->id]['feedback'].'" id="feedback_'.$userid.'_'.$item->id
+ . '" size="6" title="' . $strfeedback . '" type="text" name="feedback_'.$userid.'_'.$item->id.'" value="' . s($grade->feedback) . '" />';
+ }
+
+ } else { // Not editing
+ $gradedisplaytype = $item->get_displaytype();
+
+ if ($item->scaleid && !empty($scalesarray[$item->scaleid])) {
+ $itemcell->attributes['class'] .= ' grade_type_scale';
+ } else if ($item->gradetype != GRADE_TYPE_TEXT) {
+ $itemcell->attributes['class'] .= ' grade_type_text';
+ }
+
+ if ($this->get_pref('enableajax')) {
+ $itemcell->attributes['class'] .= ' clickable';
+ }
+
+ if ($item->needsupdate) {
+ $itemcell->text .= html_writer::tag('span', get_string('error'), array('class'=>"gradingerror$hidden$gradepass"));
+ } else {
+ $itemcell->text .= html_writer::tag('span', grade_format_gradevalue($gradeval, $item, true, $gradedisplaytype, null), array('class'=>"gradevalue$hidden$gradepass"));
+ }
+ }
+
+ if (!empty($this->gradeserror[$item->id][$userid])) {
+ $itemcell->text .= $this->gradeserror[$item->id][$userid];
+ }
+ $itemrow->cells[] = $itemcell;
+ }
+ }
+ $rows[] = $itemrow;
+ }
+
+ if ($this->get_pref('enableajax')) {
+ $jsarguments['cfg']['ajaxenabled'] = true;
+ $jsarguments['cfg']['scales'] = array();
+ foreach ($jsscales as $scale) {
+ $jsarguments['cfg']['scales'][$scale->id] = explode(',',$scale->scale);
+ }
+ $jsarguments['cfg']['feedbacktrunclength'] = $this->feedback_trunc_length;
+
+ //feedbacks are now being stored in $jsarguments['feedback'] in get_right_rows()
+ //$jsarguments['cfg']['feedback'] = $this->feedbacks;
+ }
+ $jsarguments['cfg']['isediting'] = (bool)$USER->gradeediting[$this->courseid];
+ $jsarguments['cfg']['courseid'] = $this->courseid;
+ $jsarguments['cfg']['studentsperpage'] = $this->get_pref('studentsperpage');
+ $jsarguments['cfg']['showquickfeedback'] = (bool)$this->get_pref('showquickfeedback');
+
+ $module = array(
+ 'name' => 'gradereport_grader',
+ 'fullpath' => '/grade/report/grader/module.js',
+ 'requires' => array('base', 'dom', 'event', 'event-mouseenter', 'event-key', 'io', 'json-parse', 'overlay')
+ );
+ $PAGE->requires->js_init_call('M.gradereport_grader.init_report', $jsarguments, false, $module);
+ $PAGE->requires->strings_for_js(array('addfeedback','feedback', 'grade'), 'grades');
+ $PAGE->requires->strings_for_js(array('ajaxchoosescale','ajaxclicktoclose','ajaxerror','ajaxfailedupdate', 'ajaxfieldchanged'), 'gradereport_grader');
+
+ $rows = $this->get_right_range_row($rows);
+ $rows = $this->get_right_avg_row($rows, true);
+ $rows = $this->get_right_avg_row($rows);
+
+ return $rows;
+ }
+
+ /**
+ * Builds and return the row of averages for the right part of the grader report.
+ * @param array $rows Whether to return only group averages or all averages.
+ * @param bool $grouponly Whether to return only group averages or all averages.
+ * @return array Array of rows for the right part of the report
+ */
+ public function get_right_avg_row($rows=array(), $grouponly=false) {
+ global $CFG, $USER, $DB, $OUTPUT;
+
+ if (!$this->canviewhidden) {
+ // totals might be affected by hiding, if user can not see hidden grades the aggregations might be altered
+ // better not show them at all if user can not see all hidden grades
+ return $rows;
+ }
+
+ $showaverages = $this->get_pref('showaverages');
+ $showaveragesgroup = $this->currentgroup && $showaverages;
+
+ $averagesdisplaytype = $this->get_pref('averagesdisplaytype');
+ $averagesdecimalpoints = $this->get_pref('averagesdecimalpoints');
+ $meanselection = $this->get_pref('meanselection');
+ $shownumberofgrades = $this->get_pref('shownumberofgrades');
+
+ $avghtml = '';
+ $avgcssclass = 'avg';
+
+ if ($grouponly) {
+ $straverage = get_string('groupavg', 'grades');
+ $showaverages = $this->currentgroup && $this->get_pref('showaverages');
+ $groupsql = $this->groupsql;
+ $groupwheresql = $this->groupwheresql;
+ $groupwheresqlparams = $this->groupwheresql_params;
+ $avgcssclass = 'groupavg';
+ } else {
+ $straverage = get_string('overallaverage', 'grades');
+ $showaverages = $this->get_pref('showaverages');
+ $groupsql = "";
+ $groupwheresql = "";
+ $groupwheresqlparams = array();
+ }
+
+ if ($shownumberofgrades) {
+ $straverage .= ' (' . get_string('submissions', 'grades') . ') ';
+ }
+
+ $totalcount = $this->get_numusers($grouponly);
+
+ list($usql, $rolesparams) = $DB->get_in_or_equal(explode(',', $this->gradebookroles), SQL_PARAMS_NAMED, 'grbr0');
+
+ if ($showaverages) {
+ $params = array_merge(array('courseid'=>$this->courseid), $rolesparams, $groupwheresqlparams);
+
+ // find sums of all grade items in course
+ $SQL = "SELECT g.itemid, SUM(g.finalgrade) AS sum
+ FROM {grade_items} gi
+ JOIN {grade_grades} g ON g.itemid = gi.id
+ JOIN {user} u ON u.id = g.userid
+ JOIN {role_assignments} ra ON ra.userid = u.id
+ $groupsql
+ WHERE gi.courseid = :courseid
+ AND ra.roleid $usql
+ AND ra.contextid ".get_related_contexts_string($this->context)."
+ AND g.finalgrade IS NOT NULL
+ $groupwheresql
+ GROUP BY g.itemid";
+ $sumarray = array();
+ if ($sums = $DB->get_records_sql($SQL, $params)) {
+ foreach ($sums as $itemid => $csum) {
+ $sumarray[$itemid] = $csum->sum;
+ }
+ }
+
+ // MDL-10875 Empty grades must be evaluated as grademin, NOT always 0
+ // This query returns a count of ungraded grades (NULL finalgrade OR no matching record in grade_grades table)
+ $params = array_merge(array('courseid'=>$this->courseid), $rolesparams, $groupwheresqlparams);
+ $SQL = "SELECT gi.id, COUNT(u.id) AS count
+ FROM {grade_items} gi
+ CROSS JOIN {user} u
+ JOIN {role_assignments} ra ON ra.userid = u.id
+ LEFT OUTER JOIN {grade_grades} g ON (g.itemid = gi.id AND g.userid = u.id AND g.finalgrade IS NOT NULL)
+ $groupsql
+ WHERE gi.courseid = :courseid
+ AND ra.roleid $usql
+ AND ra.contextid ".get_related_contexts_string($this->context)."
+ AND g.id IS NULL
+ $groupwheresql
+ GROUP BY gi.id";
+
+ $ungradedcounts = $DB->get_records_sql($SQL, $params);
+
+ $avgrow = new html_table_row();
+ $avgrow->attributes['class'] = 'avg';
+
+ foreach ($this->gtree->items as $itemid=>$unused) {
+ if ($unused->gradetype != 3) {
+ $item =& $this->gtree->items[$itemid];
+
+ if ($item->needsupdate) {
+ $avgcell = new html_table_cell();
+ $avgcell->text = $OUTPUT->container(get_string('error'), 'gradingerror');
+ $avgrow->cells[] = $avgcell;
+ continue;
+ }
+
+ if (!isset($sumarray[$item->id])) {
+ $sumarray[$item->id] = 0;
+ }
+
+ if (empty($ungradedcounts[$itemid])) {
+ $ungradedcount = 0;
+ } else {
+ $ungradedcount = $ungradedcounts[$itemid]->count;
+ }
+
+ if ($meanselection == GRADE_REPORT_MEAN_GRADED) {
+ $meancount = $totalcount - $ungradedcount;
+ } else { // Bump up the sum by the number of ungraded items * grademin
+ $sumarray[$item->id] += $ungradedcount * $item->grademin;
+ $meancount = $totalcount;
+ }
+
+ $decimalpoints = $item->get_decimals();
+
+ // Determine which display type to use for this average
+ if ($USER->gradeediting[$this->courseid]) {
+ $displaytype = GRADE_DISPLAY_TYPE_REAL;
+
+ } else if ($averagesdisplaytype == GRADE_REPORT_PREFERENCE_INHERIT) { // no ==0 here, please resave the report and user preferences
+ $displaytype = $item->get_displaytype();
+
+ } else {
+ $displaytype = $averagesdisplaytype;
+ }
+
+ // Override grade_item setting if a display preference (not inherit) was set for the averages
+ if ($averagesdecimalpoints == GRADE_REPORT_PREFERENCE_INHERIT) {
+ $decimalpoints = $item->get_decimals();
+
+ } else {
+ $decimalpoints = $averagesdecimalpoints;
+ }
+
+ if (!isset($sumarray[$item->id]) || $meancount == 0) {
+ $avgcell = new html_table_cell();
+ $avgcell->text = '-';
+ $avgrow->cells[] = $avgcell;
+
+ } else {
+ $sum = $sumarray[$item->id];
+ $avgradeval = $sum/$meancount;
+ $gradehtml = grade_format_gradevalue($avgradeval, $item, true, $displaytype, $decimalpoints);
+
+ $numberofgrades = '';
+ if ($shownumberofgrades) {
+ $numberofgrades = " ($meancount)";
+ }
+
+ $avgcell = new html_table_cell();
+ $avgcell->text = $gradehtml.$numberofgrades;
+ $avgrow->cells[] = $avgcell;
+ }
+ }
+ $rows[] = $avgrow;
+ }
+ }
+ return $rows;
+ }
+
+}
+
+?>
--
1.7.10
From 29fa8660af5a56674b707220836fa3269a2eb9d3 Mon Sep 17 00:00:00 2001
From: Mark Johnson <mark.johnson@tauntons.ac.uk>
Date: Thu, 20 Jan 2011 09:19:16 +0000
Subject: [PATCH 17/78] Removed fillers for No Grade gradeitems from grader
report
---
grade/report/grader/locallib.php | 16 +++++++++-------
1 file changed, 9 insertions(+), 7 deletions(-)
diff --git a/grade/report/grader/locallib.php b/grade/report/grader/locallib.php
index 5865ffb..17603d7 100644
--- a/grade/report/grader/locallib.php
+++ b/grade/report/grader/locallib.php
@@ -137,13 +137,15 @@ class grade_report_grader_local extends grade_report_grader {
// Element is a filler
if ($type == 'filler' or $type == 'fillerfirst' or $type == 'fillerlast') {
- $fillercell = new html_table_cell();
- $fillercell->attributes['class'] = $type . ' ' . $catlevel;
- $fillercell->colspan = $colspan;
- $fillercell->text = '&nbsp;';
- $fillercell->header = true;
- $fillercell->scope = 'col';
- $headingrow->cells[] = $fillercell;
+ if($element['children'][0]['object']->gradetype != 3) {
+ $fillercell = new html_table_cell();
+ $fillercell->attributes['class'] = $type . ' ' . $catlevel;
+ $fillercell->colspan = $colspan;
+ $fillercell->text = '&nbsp;';
+ $fillercell->header = true;
+ $fillercell->scope = 'col';
+ $headingrow->cells[] = $fillercell;
+ }
}
// Element is a category
else if ($type == 'category') {
--
1.7.10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment