From a7807914780654ec7cffb77ed7fe7f87da00b511 Mon Sep 17 00:00:00 2001 From: Philip Cali Date: Mon, 28 Nov 2011 09:10:11 -0600 Subject: Weighted mean now has extra credit support --- lib/grade/grade_category.php | 37 ++++++++++++++++++++++++++++++------- 1 files changed, 30 insertions(+), 7 deletions(-) diff --git a/lib/grade/grade_category.php b/lib/grade/grade_category.php index abe6120..f2e2048 100644 --- a/lib/grade/grade_category.php +++ b/lib/grade/grade_category.php @@ -686,14 +686,20 @@ class grade_category extends grade_object { case GRADE_AGGREGATE_WEIGHTED_MEAN: // Weighted average of all existing final grades, weight specified in coef $weightsum = 0; $sum = 0; + $extrasum = 0; foreach ($grade_values as $itemid=>$grade_value) { - if ($items[$itemid]->aggregationcoef <= 0) { + $coef = $items[$itemid]->aggregationcoef; + + if ($coef == 0) { continue; + } else if ($coef < 0) { + $extrasum += ($grade_value / 10); + } else { + $weightsum += $coef; + $sum += $coef * $grade_value; } - $weightsum += $items[$itemid]->aggregationcoef; - $sum += $items[$itemid]->aggregationcoef * $grade_value; } if ($weightsum == 0) { @@ -702,6 +708,8 @@ class grade_category extends grade_object { } else { $agg_grade = $sum / $weightsum; } + + $agg_grade += $extrasum; break; case GRADE_AGGREGATE_WEIGHTED_MEAN2: @@ -790,9 +798,11 @@ class grade_category extends grade_object { //find max grade possible $maxes = array(); + $notweightedmean = $this->aggregation != GRADE_AGGREGATE_WEIGHTED_MEAN; + foreach ($items as $item) { - if ($item->aggregationcoef > 0) { + if (($notweightedmean and $item->aggregationcoef > 0) or $item->aggregationcoef < 0) { // extra credit from this activity - does not affect total continue; } @@ -885,10 +895,16 @@ class grade_category extends grade_object { $dropped = 0; foreach ($grade_values as $itemid=>$value) { + $coef = $items[$itemid]->aggregationcoef; + + $validextra = ( + ($this->aggregation == GRADE_AGGREGATE_WEIGHTED_MEAN and $coef < 0) or + $coef > 0 + ); if ($dropped < $this->droplow) { - if ($extraused and $items[$itemid]->aggregationcoef > 0) { + if ($extraused and $validextra) { // no drop low for extra credits } else { @@ -907,8 +923,14 @@ class grade_category extends grade_object { $kept = 0; foreach ($grade_values as $itemid=>$value) { + $coef = $items[$itemid]->aggregationcoef; + + $validextra = ( + ($this->aggregation == GRADE_AGGREGATE_WEIGHTED_MEAN and $coef < 0) or + $coef > 0 + ); - if ($extraused and $items[$itemid]->aggregationcoef > 0) { + if ($extraused and $validextra) { // we keep all extra credits } else if ($kept < $this->keephigh) { @@ -929,7 +951,8 @@ class grade_category extends grade_object { function is_extracredit_used() { return ($this->aggregation == GRADE_AGGREGATE_WEIGHTED_MEAN2 or $this->aggregation == GRADE_AGGREGATE_EXTRACREDIT_MEAN - or $this->aggregation == GRADE_AGGREGATE_SUM); + or $this->aggregation == GRADE_AGGREGATE_SUM + or $this->aggregation == GRADE_AGGREGATE_WEIGHTED_MEAN); } /** -- 1.7.1 From 92fc3212870cafe9d278000826a9236799848721 Mon Sep 17 00:00:00 2001 From: Philip Cali Date: Mon, 28 Nov 2011 10:04:42 -0600 Subject: UI now supports weighted mean EC --- grade/edit/tree/index.php | 15 ++++++++++++++- grade/edit/tree/lib.php | 9 +++++++++ 2 files changed, 23 insertions(+), 1 deletions(-) diff --git a/grade/edit/tree/index.php b/grade/edit/tree/index.php index 8d88615..e1328f8 100644 --- a/grade/edit/tree/index.php +++ b/grade/edit/tree/index.php @@ -294,7 +294,20 @@ if ($data = data_submitted() and confirm_sesskey()) { $value = clean_param($value, PARAM_BOOL); $grade_item = grade_item::fetch(array('id'=>$aid, 'courseid'=>$courseid)); - $grade_item->aggregationcoef = $value; + + // Weighted Mean special case + $parent = $grade_item->load_parent_category(); + if ($parent->aggregation == GRADE_AGGREGATE_WEIGHTED_MEAN) { + $oldcoef = $grade_item->aggregationcoef; + + if ($oldcoef < 0 and !$value) { + $grade_item->aggregationcoef = 0; + } else { + $grade_item->aggregationcoef = $value ? -1 : $oldcoef; + } + } else { + $grade_item->aggregationcoef = $value; + } $grade_item->update(); grade_regrade_final_grades($courseid); diff --git a/grade/edit/tree/lib.php b/grade/edit/tree/lib.php index 49af487..9e2a09f 100644 --- a/grade/edit/tree/lib.php +++ b/grade/edit/tree/lib.php @@ -366,12 +366,21 @@ class grade_edit_tree { if ((($aggcoef == 'aggregationcoefweight' || $aggcoef == 'aggregationcoef') && $type == 'weight') || ($aggcoef == 'aggregationcoefextraweight' && $type == 'extra')) { + + if ($aggcoef == 'aggregationcoefweight' && $item->aggregationcoef < 0) { + return ''; + } + return ''; } elseif ($aggcoef == 'aggregationcoefextrasum' && $type == 'extra') { $checked = ($item->aggregationcoef > 0) ? 'checked="checked"' : ''; return ' \n"; + } elseif ($aggcoef == 'aggregationcoefweight' && $type == 'extra') { + $checked = ($item->aggregationcoef < 0) ? 'checked="checked"' : ''; + return ' + \n"; } else { return ''; } -- 1.7.1 From 8376b23d40ba22106caedb47f89185976ea7d134 Mon Sep 17 00:00:00 2001 From: Philip Cali Date: Mon, 28 Nov 2011 10:12:25 -0600 Subject: Helper function for determining if item within cat is ec --- lib/grade/grade_category.php | 31 ++++++++++++++++--------------- 1 files changed, 16 insertions(+), 15 deletions(-) diff --git a/lib/grade/grade_category.php b/lib/grade/grade_category.php index f2e2048..a63f8e9 100644 --- a/lib/grade/grade_category.php +++ b/lib/grade/grade_category.php @@ -888,23 +888,16 @@ class grade_category extends grade_object { * @return array Limited grades. */ public function apply_limit_rules(&$grade_values, $items) { - $extraused = $this->is_extracredit_used(); if (!empty($this->droplow)) { asort($grade_values, SORT_NUMERIC); $dropped = 0; foreach ($grade_values as $itemid=>$value) { - $coef = $items[$itemid]->aggregationcoef; - - $validextra = ( - ($this->aggregation == GRADE_AGGREGATE_WEIGHTED_MEAN and $coef < 0) or - $coef > 0 - ); if ($dropped < $this->droplow) { - if ($extraused and $validextra) { + if ($this->is_item_extra_credit($items[$itemid])) { // no drop low for extra credits } else { @@ -923,14 +916,8 @@ class grade_category extends grade_object { $kept = 0; foreach ($grade_values as $itemid=>$value) { - $coef = $items[$itemid]->aggregationcoef; - - $validextra = ( - ($this->aggregation == GRADE_AGGREGATE_WEIGHTED_MEAN and $coef < 0) or - $coef > 0 - ); - if ($extraused and $validextra) { + if ($this->is_item_extra_credit($items[$itemid])) { // we keep all extra credits } else if ($kept < $this->keephigh) { @@ -943,6 +930,20 @@ class grade_category extends grade_object { } } + function is_item_extra_credit($item) { + $extraused = $this->is_extracredit_used(); + + if (!$extraused) + return false; + + $validextra = ( + ($this->aggregation != GRADE_AGGREGATE_WEIGHTED_MEAN && $coef > 0) || + $coef < 0 + ); + + return ($extraused && $validextra); + } + /** * Returns true if category uses extra credit of any kind * -- 1.7.1 From 82eb123deefa04e9404378d2b3ee4db9e0cb2dca Mon Sep 17 00:00:00 2001 From: Philip Cali Date: Mon, 28 Nov 2011 12:32:38 -0600 Subject: Retain original aggcoef is extra credit is checked --- grade/edit/tree/index.php | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) diff --git a/grade/edit/tree/index.php b/grade/edit/tree/index.php index e1328f8..a1820c6 100644 --- a/grade/edit/tree/index.php +++ b/grade/edit/tree/index.php @@ -297,13 +297,15 @@ if ($data = data_submitted() and confirm_sesskey()) { // Weighted Mean special case $parent = $grade_item->load_parent_category(); + if ($parent->aggregation == GRADE_AGGREGATE_WEIGHTED_MEAN) { $oldcoef = $grade_item->aggregationcoef; + // Retain original aggregationcoef if extra credit checked if ($oldcoef < 0 and !$value) { - $grade_item->aggregationcoef = 0; + $grade_item->aggregationcoef = $oldcoef * -1; } else { - $grade_item->aggregationcoef = $value ? -1 : $oldcoef; + $grade_item->aggregationcoef = $value ? abs($oldcoef) * -1 : $oldcoef; } } else { $grade_item->aggregationcoef = $value; -- 1.7.1 From b7afe4b652cdcc22bece069aca995136923a3e52 Mon Sep 17 00:00:00 2001 From: Philip Cali Date: Mon, 28 Nov 2011 12:42:41 -0600 Subject: Condensed conditonal logic around ec checkbox --- grade/edit/tree/lib.php | 9 +++------ 1 files changed, 3 insertions(+), 6 deletions(-) diff --git a/grade/edit/tree/lib.php b/grade/edit/tree/lib.php index 9e2a09f..de7a009 100644 --- a/grade/edit/tree/lib.php +++ b/grade/edit/tree/lib.php @@ -373,12 +373,9 @@ class grade_edit_tree { return ''; - } elseif ($aggcoef == 'aggregationcoefextrasum' && $type == 'extra') { - $checked = ($item->aggregationcoef > 0) ? 'checked="checked"' : ''; - return ' - \n"; - } elseif ($aggcoef == 'aggregationcoefweight' && $type == 'extra') { - $checked = ($item->aggregationcoef < 0) ? 'checked="checked"' : ''; + } elseif (($aggcoef == 'aggregationcoefextrasum' || $aggcoef == 'aggregationcoefweight') && $type == 'extra') { + $valid = ($aggcoef != 'aggregationcoefweight' and $item->aggregationcoef > 0); + $checked = ($valid or $item->aggregationcoef < 0) ? 'checked="checked"' : ''; return ' \n"; } else { -- 1.7.1 From 0b171a823b7e8f467d347d7d6e4d677b8b803190 Mon Sep 17 00:00:00 2001 From: Philip Cali Date: Mon, 28 Nov 2011 12:54:09 -0600 Subject: Small bug in helper function. --- lib/grade/grade_category.php | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/lib/grade/grade_category.php b/lib/grade/grade_category.php index a63f8e9..f9a3adc 100644 --- a/lib/grade/grade_category.php +++ b/lib/grade/grade_category.php @@ -936,6 +936,8 @@ class grade_category extends grade_object { if (!$extraused) return false; + $coef = $item->aggregationcoef; + $validextra = ( ($this->aggregation != GRADE_AGGREGATE_WEIGHTED_MEAN && $coef > 0) || $coef < 0 -- 1.7.1 From df7530cde172953feeec09775ae4ff703a79a2bc Mon Sep 17 00:00:00 2001 From: Philip Cali Date: Mon, 28 Nov 2011 15:19:39 -0600 Subject: Admin option for SWM weighted extra credit --- admin/settings/grades.php | 3 +++ lang/en/grades.php | 2 ++ 2 files changed, 5 insertions(+), 0 deletions(-) diff --git a/admin/settings/grades.php b/admin/settings/grades.php index 0d42537..f74165c 100644 --- a/admin/settings/grades.php +++ b/admin/settings/grades.php @@ -89,6 +89,9 @@ if (has_capability('moodle/grade:manage', $systemcontext) $defaults = array('value'=>GRADE_AGGREGATE_WEIGHTED_MEAN2, 'forced'=>false, 'adv'=>false); $temp->add(new admin_setting_gradecat_combo('grade_aggregation', get_string('aggregation', 'grades'), get_string('aggregation_help', 'grades'), $defaults, $options)); + // SWM Extra Credit handling + $temp->add(new admin_setting_configcheckbox('grade_swm_extra_credit', get_string('swm_ec', 'grades'), get_string('swm_ec_help', 'grades'), '1')); + $temp->add(new admin_setting_configmultiselect('grade_aggregations_visible', get_string('aggregationsvisible', 'grades'), get_string('aggregationsvisiblehelp', 'grades'), $defaultvisible, $options)); diff --git a/lang/en/grades.php b/lang/en/grades.php index 1fc6889..5cb12bb 100644 --- a/lang/en/grades.php +++ b/lang/en/grades.php @@ -606,6 +606,8 @@ $string['submissions'] = 'Submissions'; $string['submittedon'] = 'Submitted: {$a}'; $string['switchtofullview'] = 'Switch to full view'; $string['switchtosimpleview'] = 'Switch to simple view'; +$string['swm_ec'] = 'Weighted SWM ' . $string['aggregationcoefextra']; +$string['swm_ec_help'] = 'By default, '.$string['aggregationcoefextra'].' in '.$string['aggregateweightedmean2'].' grade category is weighted. Unchecked this option to allow extra credit items to simply add points to the aggregated total.'; $string['tabs'] = 'Tabs'; $string['topcategory'] = 'Super category'; $string['total'] = 'Total'; -- 1.7.1 From fa6ec34c59846bd1277e21e8f467f0d08ae5aa64 Mon Sep 17 00:00:00 2001 From: Philip Cali Date: Mon, 28 Nov 2011 15:19:57 -0600 Subject: Application of the setting. --- lib/grade/grade_category.php | 9 +++++++++ 1 files changed, 9 insertions(+), 0 deletions(-) diff --git a/lib/grade/grade_category.php b/lib/grade/grade_category.php index abe6120..67a4a62 100644 --- a/lib/grade/grade_category.php +++ b/lib/grade/grade_category.php @@ -709,6 +709,9 @@ class grade_category extends grade_object { // weight is the range of grade (usually grademax) $weightsum = 0; $sum = null; + $extrasum = 0; + + $weighted_ec = get_config('moodle', 'grade_swm_extra_credit'); foreach ($grade_values as $itemid=>$grade_value) { $weight = $items[$itemid]->grademax - $items[$itemid]->grademin; @@ -719,7 +722,11 @@ class grade_category extends grade_object { if ($items[$itemid]->aggregationcoef == 0) { $weightsum += $weight; + } elseif (empty($weighted_ec)) { + $extrasum += ($grade_value / 10); + continue; } + $sum += $weight * $grade_value; } @@ -729,6 +736,8 @@ class grade_category extends grade_object { } else { $agg_grade = $sum / $weightsum; } + + $agg_grade += $extrasum; break; case GRADE_AGGREGATE_EXTRACREDIT_MEAN: // special average -- 1.7.1 From 772b6ce8e437017cb6ac5443297049b387006416 Mon Sep 17 00:00:00 2001 From: Philip Cali Date: Mon, 5 Dec 2011 11:55:47 -0600 Subject: Modified javascript to allow image popout. --- grade/report/grader/module.js | 33 +++++++++++++++++++++++++++++++-- 1 files changed, 31 insertions(+), 2 deletions(-) diff --git a/grade/report/grader/module.js b/grade/report/grader/module.js index 16f710a..21d5f30 100644 --- a/grade/report/grader/module.js +++ b/grade/report/grader/module.js @@ -50,7 +50,7 @@ M.gradereport_grader = { show : function(e, report) { e.halt(); - var properties = report.get_cell_info(e.target); + var properties = report.get_image_or_cell_info(e.target); if (!properties) { return; } @@ -127,6 +127,12 @@ M.gradereport_grader.classes.report = function(Y, id, cfg, items, users, feedbac if (tr.getAttribute('id').match(/^(fixed_)?user_(\d+)$/)) { // Highlight rows tr.all('th.cell').on('click', this.table_highlight_row, this, tr); + // Popout image + tr.all('th.cell div.userpic img.userpicture').each(function(img) { + if (img.get('className') === "userpicture") { + M.gradereport_grader.tooltip.attach(img, this); + } + }, this); // Display tooltips tr.all('td.cell').each(function(cell){ M.gradereport_grader.tooltip.attach(cell, this); @@ -165,6 +171,29 @@ M.gradereport_grader.classes.report.prototype.users = []; // Array c M.gradereport_grader.classes.report.prototype.feedback = []; // Array containing feedback items M.gradereport_grader.classes.report.prototype.ajaxenabled = false; // True is AJAX is enabled for the report M.gradereport_grader.classes.report.prototype.ajax = null; // An instance of the ajax class or null + +M.gradereport_grader.classes.report.prototype.get_image_or_cell_info = function(arg) { + if (arg instanceof this.Y.Node && arg.get('nodeName').toUpperCase() === 'IMG') { + return this.get_image_info(arg); + } else { + return this.get_cell_info(arg); + } +}; + +M.gradereport_grader.classes.report.prototype.get_image_info = function(img) { + var src = img.getAttribute('src'); + + var userid = img.ancestor('tr').getAttribute('id').split('_')[2]; + + var img_source = ""; + + return { + username: this.users[userid], + itemname: img_source, + cell: img + }; +}; + /** * Highlights a row in the report * @@ -1197,4 +1226,4 @@ for (var i in M.gradereport_grader.classes.textfield.prototype) { if (!M.gradereport_grader.classes.scalefield.prototype[i]) { M.gradereport_grader.classes.scalefield.prototype[i] = M.gradereport_grader.classes.textfield.prototype[i]; } -} \ No newline at end of file +} -- 1.7.1 From 814b0ff7eee9b8590fc68ef644785fb60a68a8c5 Mon Sep 17 00:00:00 2001 From: Philip Cali Date: Mon, 5 Dec 2011 08:50:18 -0600 Subject: Adding Admin option for grade cat total override --- admin/settings/grades.php | 3 +++ lang/en/grades.php | 4 ++++ 2 files changed, 7 insertions(+), 0 deletions(-) diff --git a/admin/settings/grades.php b/admin/settings/grades.php index 0d42537..09818ec 100644 --- a/admin/settings/grades.php +++ b/admin/settings/grades.php @@ -94,6 +94,9 @@ if (has_capability('moodle/grade:manage', $systemcontext) $options = array(0 => get_string('no'), 1 => get_string('yes')); + $temp->add(new admin_setting_configcheckbox('grade_overridecat', get_string('overridecat', 'grades'), + get_string('overridecat_help', 'grades'), 1)); + $defaults = array('value'=>1, 'forced'=>false, 'adv'=>true); $temp->add(new admin_setting_gradecat_combo('grade_aggregateonlygraded', get_string('aggregateonlygraded', 'grades'), get_string('aggregateonlygraded_help', 'grades'), $defaults, $options)); diff --git a/lang/en/grades.php b/lang/en/grades.php index 1fc6889..de2fc6b 100644 --- a/lang/en/grades.php +++ b/lang/en/grades.php @@ -459,6 +459,10 @@ $string['outcomesstandardavailable'] = 'Available standard outcomes'; $string['outcomestandard'] = 'Standard outcome'; $string['outcomestandard_help'] = 'A standard outcome is available site-wide, for all courses.'; $string['overallaverage'] = 'Overall average'; +$string['overridecat'] = 'Allow Grade Override'; +$string['overridecat_help'] = 'This option allows users to override the final +grade in for category totals. Unchecking this option will make category totals +uneditable.'; $string['overridden'] = 'Overridden'; $string['overridden_help'] = 'If ticked, the grade can no longer be changed from within the related activity. -- 1.7.1 From 30a7ff5e894a42a3c81658f713876f6724586110 Mon Sep 17 00:00:00 2001 From: Philip Cali Date: Mon, 5 Dec 2011 09:38:20 -0600 Subject: Overriable support in library. --- lib/grade/grade_grade.php | 2 +- lib/grade/grade_item.php | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/grade/grade_grade.php b/lib/grade/grade_grade.php index 3278e7c..e6b6455 100644 --- a/lib/grade/grade_grade.php +++ b/lib/grade/grade_grade.php @@ -228,7 +228,7 @@ class grade_grade extends grade_object { $grade_item = $this->load_grade_item(); - if ($grade_item->gradetype == GRADE_TYPE_NONE) { + if ($grade_item->gradetype == GRADE_TYPE_NONE or !$grade_item->is_overridable_item()) { return false; } diff --git a/lib/grade/grade_item.php b/lib/grade/grade_item.php index 630e915..12561f6 100644 --- a/lib/grade/grade_item.php +++ b/lib/grade/grade_item.php @@ -919,7 +919,13 @@ class grade_item extends grade_object { * @return boolean */ public function is_overridable_item() { - return !$this->is_outcome_item() and ($this->is_external_item() or $this->is_calculated() or $this->is_course_item() or $this->is_category_item()); + if ($this->is_course_item() or $this->is_category_item()) { + $overridable = (bool) get_config('moodle', 'grade_overridecat'); + } else { + $overridable = true; + } + + return !$this->is_outcome_item() and ($this->is_external_item() or $this->is_calculated() or $overridable); } /** -- 1.7.1 From 7c98ccf7b073e9f9c36c1ddbc40d002e8a24abaa Mon Sep 17 00:00:00 2001 From: Philip Cali Date: Mon, 5 Dec 2011 09:38:34 -0600 Subject: Making use of library support for UI --- grade/report/grader/lib.php | 11 +++++++---- 1 files changed, 7 insertions(+), 4 deletions(-) diff --git a/grade/report/grader/lib.php b/grade/report/grader/lib.php index 8ca6b1e..5cb5262 100644 --- a/grade/report/grader/lib.php +++ b/grade/report/grader/lib.php @@ -903,7 +903,7 @@ class grade_report_grader extends grade_report { // 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); + $itemcell->text .= $this->get_icons($element, $item); } $hidden = ''; @@ -1438,10 +1438,11 @@ class grade_report_grader extends grade_report { * figures out the state of the object and builds then returns a div * with the icons needed for the grader report. * - * @param array $object + * @param object $object + * @param grade_item $item * @return string HTML */ - protected function get_icons($element) { + protected function get_icons($element, $item = null) { global $CFG, $USER, $OUTPUT; if (!$USER->gradeediting[$this->courseid]) { @@ -1451,7 +1452,9 @@ class grade_report_grader extends grade_report { // Init all icons $editicon = ''; - if ($element['type'] != 'categoryitem' && $element['type'] != 'courseitem') { + $overridable = $item ? $item->is_overridable_item() : true; + + if ($element['type'] != 'categoryitem' && $element['type'] != 'courseitem' &&$overridable) { $editicon = $this->gtree->get_edit_icon($element, $this->gpr); } -- 1.7.1 From c19c8ed0f43bd345d7e211f4a9146b4875368547 Mon Sep 17 00:00:00 2001 From: Philip Cali Date: Mon, 5 Dec 2011 10:31:11 -0600 Subject: Unmodified get_icons function. --- grade/report/grader/lib.php | 13 +++++++++---- 1 files changed, 9 insertions(+), 4 deletions(-) diff --git a/grade/report/grader/lib.php b/grade/report/grader/lib.php index 5cb5262..29b10fe 100644 --- a/grade/report/grader/lib.php +++ b/grade/report/grader/lib.php @@ -903,7 +903,7 @@ class grade_report_grader extends grade_report { // 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, $item); + $itemcell->text .= $this->get_icons($element); } $hidden = ''; @@ -1439,10 +1439,9 @@ class grade_report_grader extends grade_report { * with the icons needed for the grader report. * * @param object $object - * @param grade_item $item * @return string HTML */ - protected function get_icons($element, $item = null) { + protected function get_icons($element) { global $CFG, $USER, $OUTPUT; if (!$USER->gradeediting[$this->courseid]) { @@ -1452,7 +1451,13 @@ class grade_report_grader extends grade_report { // Init all icons $editicon = ''; - $overridable = $item ? $item->is_overridable_item() : true; + if ($element['type'] == 'grade') { + $item = $element['object']->grade_item; + + $overridable = $item->is_overridable_item(); + } else { + $overridable = true; + } if ($element['type'] != 'categoryitem' && $element['type'] != 'courseitem' &&$overridable) { $editicon = $this->gtree->get_edit_icon($element, $this->gpr); -- 1.7.1 From f397cac142c84da5e8aa072046f5595b59ddf798 Mon Sep 17 00:00:00 2001 From: Philip Cali Date: Wed, 7 Dec 2011 14:18:25 -0600 Subject: Grade library now supports manual rawgrade --- grade/edit/tree/item_form.php | 5 ----- grade/report/grader/lib.php | 5 +++++ lib/grade/grade_item.php | 14 +++++++++----- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/grade/edit/tree/item_form.php b/grade/edit/tree/item_form.php index 642be6b..412b206 100644 --- a/grade/edit/tree/item_form.php +++ b/grade/edit/tree/item_form.php @@ -281,11 +281,6 @@ class edit_item_form extends moodleform { } } } - - } else { - // all new items are manual, children of course category - $mform->removeElement('plusfactor'); - $mform->removeElement('multfactor'); } // no parent header for course category diff --git a/grade/report/grader/lib.php b/grade/report/grader/lib.php index 8ca6b1e..38a6ad1 100644 --- a/grade/report/grader/lib.php +++ b/grade/report/grader/lib.php @@ -926,6 +926,11 @@ class grade_report_grader extends grade_report { } else if ($USER->gradeediting[$this->courseid]) { + // Editing means user edit manual item raw + if ($item->is_manual_item()) { + $gradeval = $grade->rawgrade; + } + if ($item->scaleid && !empty($scalesarray[$item->scaleid])) { $scale = $scalesarray[$item->scaleid]; $gradeval = (int)$gradeval; // scales use only integers diff --git a/lib/grade/grade_item.php b/lib/grade/grade_item.php index 630e915..0e60942 100644 --- a/lib/grade/grade_item.php +++ b/lib/grade/grade_item.php @@ -655,10 +655,6 @@ class grade_item extends grade_object { return "Could not aggregate final grades for category:".$this->id; // TODO: improve and localize } - } else if ($this->is_manual_item()) { - // manual items track only final grades, no raw grades - return true; - } else if (!$this->is_raw_used()) { // hmm - raw grades are not used- nothing to regrade return true; @@ -935,7 +931,7 @@ class grade_item extends grade_object { * @return boolean */ public function is_raw_used() { - return ($this->is_external_item() and !$this->is_calculated() and !$this->is_outcome_item()); + return ($this->is_manual_item() or $this->is_external_item() and !$this->is_calculated() and !$this->is_outcome_item()); } /** @@ -1438,6 +1434,14 @@ class grade_item extends grade_object { return false; } + // Manual Item raw-grade support + if ($this->is_manual_item()) { + return $this->update_raw_grade( + $userid, $finalgrade, $source, $feedback, $feedbackformat, + $usermodified, null, null, $grade + ); + } + $oldgrade = new stdClass(); $oldgrade->finalgrade = $grade->finalgrade; $oldgrade->overridden = $grade->overridden; -- 1.7.1 From 15ca31dc7eba7deb93220a4b5e5d524debedb0bd Mon Sep 17 00:00:00 2001 From: Philip Cali Date: Wed, 7 Dec 2011 14:25:59 -0600 Subject: Upgrade script for old manual items --- grade/report/grader/db/upgrade.php | 69 ++++++++++++++++++++++++++++++++++++ grade/report/grader/version.php | 3 +- 2 files changed, 71 insertions(+), 1 deletions(-) create mode 100644 grade/report/grader/db/upgrade.php diff --git a/grade/report/grader/db/upgrade.php b/grade/report/grader/db/upgrade.php new file mode 100644 index 0000000..9cdbb4f --- /dev/null +++ b/grade/report/grader/db/upgrade.php @@ -0,0 +1,69 @@ +from($oldversion); +} + +abstract class gradereport_grader_upgrade_state { + var $version; + + abstract function upgrade($db); + + function __invoke($db) { + return $this->upgrade($db); + } +} + +class grader_manual_items extends gradereport_grader_upgrade_state { + var $version = 2011120801; + + function upgrade($db) { + $sql = "UPDATE {grade_grades} gr, {grade_items} gi + SET gr.rawgrade = gr.finalgrade + WHERE gi.id = gr.itemid AND gi.itemtype = 'manual'"; + + return $db->execute($sql); + } +} + +class gradereport_grader_upgrade { + function __construct($upgrades) { + $this->upgrades = $upgrades; + } + + function from($oldversion) { + global $DB; + + // Oldest upgrade first + usort($this->upgrades, function($a, $b) { + $diff = ($a->version < $b->version) ? -1 : 1; + return ($a->version == $b->version) ? 0 : $diff; + }); + + $result = true; + + foreach ($this->upgrades as $upgrade) { + if (!$result) continue; + + if ($oldversion < $upgrade->version and is_callable($upgrade)) { + + try { + $success = $upgrade($DB); + + $result = ($result and $success); + } catch (Exception $e) { + $result = false; + } + + upgrade_plugin_savepoint($result, $upgrade->version, 'gradereport', 'grader'); + } + } + + return $result; + } +} diff --git a/grade/report/grader/version.php b/grade/report/grader/version.php index 14c2e50..bf50771 100644 --- a/grade/report/grader/version.php +++ b/grade/report/grader/version.php @@ -25,6 +25,7 @@ defined('MOODLE_INTERNAL') || die(); -$plugin->version = 2011112900; // The current plugin version (Date: YYYYMMDDXX) +$plugin->version = 2011120801; $plugin->requires = 2011112900; // Requires this Moodle version $plugin->component = 'gradereport_grader'; // Full name of the plugin (used for diagnostics) + -- 1.7.1 From c1bbbf85fcbfeb5417062eecf4184fc6762ff178 Mon Sep 17 00:00:00 2001 From: Philip Cali Date: Tue, 13 Dec 2011 13:15:49 -0600 Subject: Fixed SQL problem on postgreSQL databases. --- grade/report/grader/db/upgrade.php | 17 +++++++++++++---- 1 files changed, 13 insertions(+), 4 deletions(-) diff --git a/grade/report/grader/db/upgrade.php b/grade/report/grader/db/upgrade.php index 9cdbb4f..c4af5cd 100644 --- a/grade/report/grader/db/upgrade.php +++ b/grade/report/grader/db/upgrade.php @@ -23,11 +23,20 @@ class grader_manual_items extends gradereport_grader_upgrade_state { var $version = 2011120801; function upgrade($db) { - $sql = "UPDATE {grade_grades} gr, {grade_items} gi - SET gr.rawgrade = gr.finalgrade - WHERE gi.id = gr.itemid AND gi.itemtype = 'manual'"; + $base_sql = "%s {grade_grades} gr, {grade_items} gi %s " . + "WHERE gi.id = gr.itemid AND gi.itemtype = 'manual'"; - return $db->execute($sql); + $sql = sprintf($base_sql, "SELECT COUNT(*) FROM", ""); + + $count = $db->count_records_sql($sql); + + if (empty($count)) { + return true; + } else { + $sql = sprintf($base_sql, "UPDATE", "SET gr.rawgrade = gr.finalgrade"); + + return $db->execute($sql); + } } } -- 1.7.1 From 9aa6bb0a55d2395828c7ab7b0e0bf8615b2756ae Mon Sep 17 00:00:00 2001 From: Philip Cali Date: Wed, 14 Dec 2011 11:28:06 -0600 Subject: Fixed a bug in weighted category items --- grade/edit/tree/index.php | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-) diff --git a/grade/edit/tree/index.php b/grade/edit/tree/index.php index a1820c6..9917e77 100644 --- a/grade/edit/tree/index.php +++ b/grade/edit/tree/index.php @@ -298,6 +298,11 @@ if ($data = data_submitted() and confirm_sesskey()) { // Weighted Mean special case $parent = $grade_item->load_parent_category(); + // Make sure about category item's parent category + if ($grade_item->itemtype == 'category') { + $parent = $parent->load_parent_category(); + } + if ($parent->aggregation == GRADE_AGGREGATE_WEIGHTED_MEAN) { $oldcoef = $grade_item->aggregationcoef; -- 1.7.1 From 467565c1e09c2a77d62e6d35f97087c87b7b0915 Mon Sep 17 00:00:00 2001 From: Philip Cali Date: Wed, 14 Dec 2011 13:24:42 -0600 Subject: Small bug with 0 weight value --- grade/edit/tree/index.php | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/grade/edit/tree/index.php b/grade/edit/tree/index.php index 9917e77..60ba488 100644 --- a/grade/edit/tree/index.php +++ b/grade/edit/tree/index.php @@ -309,6 +309,8 @@ if ($data = data_submitted() and confirm_sesskey()) { // Retain original aggregationcoef if extra credit checked if ($oldcoef < 0 and !$value) { $grade_item->aggregationcoef = $oldcoef * -1; + } else if ($oldcoef == 0 and $value) { + $grade_item->aggregationcoef = -1; } else { $grade_item->aggregationcoef = $value ? abs($oldcoef) * -1 : $oldcoef; } -- 1.7.1 From e204f67cd4c40bb2943006525882cdd89010e3f3 Mon Sep 17 00:00:00 2001 From: Philip Cali Date: Wed, 14 Dec 2011 13:38:01 -0600 Subject: Standardize grade points better --- lib/grade/grade_category.php | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/lib/grade/grade_category.php b/lib/grade/grade_category.php index f9a3adc..f7b8dfe 100644 --- a/lib/grade/grade_category.php +++ b/lib/grade/grade_category.php @@ -695,7 +695,7 @@ class grade_category extends grade_object { if ($coef == 0) { continue; } else if ($coef < 0) { - $extrasum += ($grade_value / 10); + $extrasum += ($grade_value / (100 / $items[$itemid]->grademax)); } else { $weightsum += $coef; $sum += $coef * $grade_value; -- 1.7.1 From 555bbf71657990c2a31803a6006d6a8746c3eb5e Mon Sep 17 00:00:00 2001 From: Philip Cali Date: Wed, 14 Dec 2011 14:19:57 -0600 Subject: Include parent in weighted check --- lib/grade/grade_category.php | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/lib/grade/grade_category.php b/lib/grade/grade_category.php index f7b8dfe..1f82641 100644 --- a/lib/grade/grade_category.php +++ b/lib/grade/grade_category.php @@ -695,7 +695,7 @@ class grade_category extends grade_object { if ($coef == 0) { continue; } else if ($coef < 0) { - $extrasum += ($grade_value / (100 / $items[$itemid]->grademax)); + $extrasum += ($grade_value / ($this->grade_item->grademax / $items[$itemid]->grademax)); } else { $weightsum += $coef; $sum += $coef * $grade_value; -- 1.7.1 From 2df76db9545b923662052bf2adc81b2dc300c208 Mon Sep 17 00:00:00 2001 From: Robert Russo Date: Wed, 14 Dec 2011 14:35:26 -0600 Subject: Small bugfix in SWM --- lib/grade/grade_category.php | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/lib/grade/grade_category.php b/lib/grade/grade_category.php index 67a4a62..02b52c4 100644 --- a/lib/grade/grade_category.php +++ b/lib/grade/grade_category.php @@ -723,7 +723,7 @@ class grade_category extends grade_object { if ($items[$itemid]->aggregationcoef == 0) { $weightsum += $weight; } elseif (empty($weighted_ec)) { - $extrasum += ($grade_value / 10); + $extrasum += ($grade_value / ($this->grade_item->grademax / $items[$itemid]->grademax)); continue; } -- 1.7.1 From 1b77da21b4c5df62d6da351f617862315945db32 Mon Sep 17 00:00:00 2001 From: Robert Russo Date: Mon, 19 Dec 2011 10:08:20 -0600 Subject: Added hiding of minimum grades feature. --- admin/settings/grades.php | 2 ++ grade/edit/tree/item_form.php | 9 ++++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/admin/settings/grades.php b/admin/settings/grades.php index 0d42537..75dcf01 100644 --- a/admin/settings/grades.php +++ b/admin/settings/grades.php @@ -153,6 +153,8 @@ if (has_capability('moodle/grade:manage', $systemcontext) 'locktime' => get_string('locktime', 'grades'), 'aggregationcoef' => get_string('aggregationcoef', 'grades'), 'parentcategory' => get_string('parentcategory', 'grades')))); + + $temp->add(new admin_setting_configcheckbox('grade_min_hide', get_string('minimum_hide', 'grades'), get_string('minimum_hide_help', 'grades'), '1')); } $ADMIN->add('grades', $temp); diff --git a/grade/edit/tree/item_form.php b/grade/edit/tree/item_form.php index 642be6b..c6d3ad3 100644 --- a/grade/edit/tree/item_form.php +++ b/grade/edit/tree/item_form.php @@ -79,9 +79,12 @@ class edit_item_form extends moodleform { $mform->addHelpButton('grademax', 'grademax', 'grades'); $mform->disabledIf('grademax', 'gradetype', 'noteq', GRADE_TYPE_VALUE); - $mform->addElement('text', 'grademin', get_string('grademin', 'grades')); - $mform->addHelpButton('grademin', 'grademin', 'grades'); - $mform->disabledIf('grademin', 'gradetype', 'noteq', GRADE_TYPE_VALUE); + $grademin_hider = get_config('moodle', 'grade_min_hide'); + if (empty($grademin_hider)) { + $mform->addElement('text', 'grademin', get_string('grademin', 'grades')); + $mform->addHelpButton('grademin', 'grademin', 'grades'); + $mform->disabledIf('grademin', 'gradetype', 'noteq', GRADE_TYPE_VALUE); + } $mform->addElement('text', 'gradepass', get_string('gradepass', 'grades')); $mform->addHelpButton('gradepass', 'gradepass', 'grades'); -- 1.7.1 From 2a4a24673932c1cd553340bded6183477e75064c Mon Sep 17 00:00:00 2001 From: Philip Cali Date: Mon, 19 Dec 2011 10:40:01 -0600 Subject: Matching Moodle defaults --- admin/settings/grades.php | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/admin/settings/grades.php b/admin/settings/grades.php index 75dcf01..269991a 100644 --- a/admin/settings/grades.php +++ b/admin/settings/grades.php @@ -154,7 +154,7 @@ if (has_capability('moodle/grade:manage', $systemcontext) 'aggregationcoef' => get_string('aggregationcoef', 'grades'), 'parentcategory' => get_string('parentcategory', 'grades')))); - $temp->add(new admin_setting_configcheckbox('grade_min_hide', get_string('minimum_hide', 'grades'), get_string('minimum_hide_help', 'grades'), '1')); + $temp->add(new admin_setting_configcheckbox('grade_min_hide', get_string('minimum_hide', 'grades'), get_string('minimum_hide_help', 'grades'), 0)); } $ADMIN->add('grades', $temp); -- 1.7.1 From f21fff5cb788a3bb3832a945a9577145af57b6b7 Mon Sep 17 00:00:00 2001 From: Philip Cali Date: Mon, 19 Dec 2011 10:40:19 -0600 Subject: Changed definition after data instead of definition --- grade/edit/tree/item_form.php | 15 +++++++++------ 1 files changed, 9 insertions(+), 6 deletions(-) diff --git a/grade/edit/tree/item_form.php b/grade/edit/tree/item_form.php index c6d3ad3..8d91e59 100644 --- a/grade/edit/tree/item_form.php +++ b/grade/edit/tree/item_form.php @@ -79,12 +79,9 @@ class edit_item_form extends moodleform { $mform->addHelpButton('grademax', 'grademax', 'grades'); $mform->disabledIf('grademax', 'gradetype', 'noteq', GRADE_TYPE_VALUE); - $grademin_hider = get_config('moodle', 'grade_min_hide'); - if (empty($grademin_hider)) { - $mform->addElement('text', 'grademin', get_string('grademin', 'grades')); - $mform->addHelpButton('grademin', 'grademin', 'grades'); - $mform->disabledIf('grademin', 'gradetype', 'noteq', GRADE_TYPE_VALUE); - } + $mform->addElement('text', 'grademin', get_string('grademin', 'grades')); + $mform->addHelpButton('grademin', 'grademin', 'grades'); + $mform->disabledIf('grademin', 'gradetype', 'noteq', GRADE_TYPE_VALUE); $mform->addElement('text', 'gradepass', get_string('gradepass', 'grades')); $mform->addHelpButton('gradepass', 'gradepass', 'grades'); @@ -295,6 +292,12 @@ class edit_item_form extends moodleform { if (!$mform->elementExists('aggregationcoef') and !$mform->elementExists('parentcategory')) { $mform->removeElement('headerparent'); } + + // Freeze grademin element if option unavailable + $min_is_hidden = (bool) get_config('moodle', 'grade_min_hide'); + if ($min_is_hidden and $mform->elementExists('grademin')) { + $mform->hardFreeze('grademin'); + } } -- 1.7.1 From fa5a48993eb2ed8cc067791d538aca3cc2a01188 Mon Sep 17 00:00:00 2001 From: Philip Cali Date: Mon, 19 Dec 2011 10:46:17 -0600 Subject: Grademin agg checks (forces zero when applicable) --- lib/grade/grade_category.php | 13 +++++++++++++ 1 files changed, 13 insertions(+), 0 deletions(-) diff --git a/lib/grade/grade_category.php b/lib/grade/grade_category.php index abe6120..20b01ff 100644 --- a/lib/grade/grade_category.php +++ b/lib/grade/grade_category.php @@ -571,6 +571,9 @@ class grade_category extends grade_object { return; } + // Used in grade minimizing + $min_is_hidden = (bool) get_config('moodle', 'grade_min_hide'); + // normalize the grades first - all will have value 0...1 // ungraded items are not used in aggregation foreach ($grade_values as $itemid=>$v) { @@ -584,6 +587,12 @@ class grade_category extends grade_object { unset($grade_values[$itemid]); continue; } + + // Force grademin if not applicable + if ($min_is_hidden and $items[$itemid]->gradetype != GRADE_TYPE_SCALE) { + $items[$itemid]->grademin = 0; + } + $grade_values[$itemid] = grade_grade::standardise_score($v, $items[$itemid]->grademin, $items[$itemid]->grademax, 0, 1); } @@ -616,6 +625,10 @@ class grade_category extends grade_object { // do the maths $agg_grade = $this->aggregate_values($grade_values, $items); + if ($min_is_hidden and $this->grade_item->gradetype != GRADE_TYPE_SCALE) { + $this->grade_item->grademin = 0; + } + // recalculate the grade back to requested range $finalgrade = grade_grade::standardise_score($agg_grade, 0, 1, $this->grade_item->grademin, $this->grade_item->grademax); -- 1.7.1 From 8449d60a453834608c56c1cb9db166be2859af1c Mon Sep 17 00:00:00 2001 From: Philip Cali Date: Tue, 20 Dec 2011 09:39:59 -0600 Subject: Moved lang keys in alphabetical order --- lang/en/grades.php | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/lang/en/grades.php b/lang/en/grades.php index 1fc6889..ef62736 100644 --- a/lang/en/grades.php +++ b/lang/en/grades.php @@ -394,6 +394,8 @@ $string['meanselection'] = 'Grades selected for column averages'; $string['meanselection_help'] = 'This setting determines whether cells with no grade should be included when calculating the average (mean) for each category or grade item.'; $string['median'] = 'Median'; $string['min'] = 'Lowest'; +$string['minimum_hide'] = 'Hide ' . $string['grademin'] . '.'; +$string['minimum_hide_help'] = 'By default, ' . $string['grademin'] . ' is used in calculating grades and weights. By hiding this feature, ' . $string['grademin'] . ' will be zero in all value grading scenarios.'; $string['missingscale'] = 'Scale must be selected'; $string['mode'] = 'Mode'; $string['morethanmax'] = 'The grade entered for {$a->itemname} for {$a->username} is more than the maximum allowed'; -- 1.7.1