Created
August 1, 2012 10:47
-
-
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From 8f6a707b4019db72e0785bdd2f9d1e753c95aa05 Mon Sep 17 00:00:00 2001 | |
From: Mark Johnson <[email protected]> | |
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 = ' '; | |
+ $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 | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From 29fa8660af5a56674b707220836fa3269a2eb9d3 Mon Sep 17 00:00:00 2001 | |
From: Mark Johnson <[email protected]> | |
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 = ' '; | |
- $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 = ' '; | |
+ $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