diff --git a/grade/edit/tree/category.php b/grade/edit/tree/category.php index 81915da0447..a0cbf5f3b1b 100644 --- a/grade/edit/tree/category.php +++ b/grade/edit/tree/category.php @@ -58,7 +58,13 @@ if ($id) { // set parent $category->parentcategory = $grade_category->parent; $grade_item = $grade_category->load_grade_item(); - foreach ($grade_item as $key => $value) { + // nomalize coef values if needed + if ($parent_category = $grade_category->get_parent_category()) { + if ($parent_category->aggregation == GRADE_AGGREGATE_SUM or $parent_category->aggregation == GRADE_AGGREGATE_WEIGHTED_MEAN2) { + $grade_item->aggregationcoef = $grade_item->aggregationcoef == 0 ? 0 : 1; + } + } + foreach ($grade_item->get_record_data() as $key => $value) { $category->{"grade_item_$key"} = $value; } diff --git a/grade/edit/tree/item.php b/grade/edit/tree/item.php index ef0bf354543..cacf6aa6857 100644 --- a/grade/edit/tree/item.php +++ b/grade/edit/tree/item.php @@ -96,8 +96,8 @@ $item->plusfactor = format_float($item->plusfactor, 4); if (empty($parent_category)) { $item->aggregationcoef = 0; -} else if ($parent_category->aggregation == GRADE_AGGREGATE_SUM) { - $item->aggregationcoef = $item->aggregationcoef > 0 ? 1 : 0; +} else if ($parent_category->aggregation == GRADE_AGGREGATE_SUM or $parent_category->aggregation == GRADE_AGGREGATE_WEIGHTED_MEAN2) { + $item->aggregationcoef = $item->aggregationcoef == 0 ? 0 : 1; } else { $item->aggregationcoef = format_float($item->aggregationcoef, 4); } diff --git a/grade/edit/tree/lib.php b/grade/edit/tree/lib.php index 2ff1dca05b4..fc201092187 100755 --- a/grade/edit/tree/lib.php +++ b/grade/edit/tree/lib.php @@ -566,7 +566,7 @@ class grade_edit_tree_column_aggregation extends grade_edit_tree_column_category } $script = "window.location='index.php?id={$params['id']}&category={$category->id}&aggregationtype='+this.value+'&sesskey=" . sesskey()."';"; - $aggregation = choose_from_menu($options, 'aggregation_'.$category->id, $category->aggregation, get_string('choose'), $script, 0, true); + $aggregation = choose_from_menu($options, 'aggregation_'.$category->id, $category->aggregation, null, $script, 0, true); if ($this->forced) { $aggregation = $options[$category->aggregation]; diff --git a/grade/edit/tree/outcomeitem_form.php b/grade/edit/tree/outcomeitem_form.php index 3fbb0dbb8a1..0cbea5b05e4 100644 --- a/grade/edit/tree/outcomeitem_form.php +++ b/grade/edit/tree/outcomeitem_form.php @@ -102,6 +102,9 @@ class edit_outcomeitem_form extends moodleform { if ($cat->aggregation == GRADE_AGGREGATE_WEIGHTED_MEAN) { $coefstring = ($coefstring=='' or $coefstring=='aggregationcoefweight') ? 'aggregationcoefweight' : 'aggregationcoef'; + } else if ($cat->aggregation == GRADE_AGGREGATE_WEIGHTED_MEAN2) { + $coefstring = ($coefstring=='' or $coefstring=='aggregationcoefextrasum') ? 'aggregationcoefextrasum' : 'aggregationcoef'; + } else if ($cat->aggregation == GRADE_AGGREGATE_EXTRACREDIT_MEAN) { $coefstring = ($coefstring=='' or $coefstring=='aggregationcoefextra') ? 'aggregationcoefextra' : 'aggregationcoef'; @@ -201,6 +204,9 @@ class edit_outcomeitem_form extends moodleform { if ($parent_category->aggregation == GRADE_AGGREGATE_WEIGHTED_MEAN) { $aggcoef = 'aggregationcoefweight'; + } else if ($parent_category->aggregation == GRADE_AGGREGATE_WEIGHTED_MEAN2) { + $aggcoef = 'aggregationcoefextrasum'; + } else if ($parent_category->aggregation == GRADE_AGGREGATE_EXTRACREDIT_MEAN) { $aggcoef = 'aggregationcoefextra'; diff --git a/lib/grade/grade_category.php b/lib/grade/grade_category.php index 041be4d49c3..20b03f3a329 100644 --- a/lib/grade/grade_category.php +++ b/lib/grade/grade_category.php @@ -642,19 +642,23 @@ class grade_category extends grade_object { } break; - case GRADE_AGGREGATE_WEIGHTED_MEAN2: // Weighted average of all existing final grades, weight is the range of grade (ususally grademax) + case GRADE_AGGREGATE_WEIGHTED_MEAN2: + // Weighted average of all existing final grades with optional extra credit flag, + // weight is the range of grade (ususally grademax) $weightsum = 0; - $sum = 0; + $sum = null; foreach($grade_values as $itemid=>$grade_value) { $weight = $items[$itemid]->grademax - $items[$itemid]->grademin; if ($weight <= 0) { continue; } - $weightsum += $weight; - $sum += $weight * $grade_value; + if ($items[$itemid]->aggregationcoef == 0) { + $weightsum += $weight; + } + $sum += $weight * $grade_value; } if ($weightsum == 0) { - $agg_grade = null; + $agg_grade = $sum; // only extra credits } else { $agg_grade = $sum / $weightsum; } @@ -662,7 +666,7 @@ class grade_category extends grade_object { case GRADE_AGGREGATE_EXTRACREDIT_MEAN: // special average $num = 0; - $sum = 0; + $sum = null; foreach($grade_values as $itemid=>$grade_value) { if ($items[$itemid]->aggregationcoef == 0) { $num += 1; @@ -806,6 +810,7 @@ class grade_category extends grade_object { */ function is_aggregationcoef_used() { return ($this->aggregation == GRADE_AGGREGATE_WEIGHTED_MEAN + or $this->aggregation == GRADE_AGGREGATE_WEIGHTED_MEAN2 or $this->aggregation == GRADE_AGGREGATE_EXTRACREDIT_MEAN or $this->aggregation == GRADE_AGGREGATE_SUM); @@ -847,6 +852,8 @@ class grade_category extends grade_object { // No parent category is overriding this category's aggregation, return its string if ($this->aggregation == GRADE_AGGREGATE_WEIGHTED_MEAN) { $this->coefstring = 'aggregationcoefweight'; + } else if ($this->aggregation == GRADE_AGGREGATE_WEIGHTED_MEAN2) { + $this->coefstring = 'aggregationcoefextrasum'; } else if ($this->aggregation == GRADE_AGGREGATE_EXTRACREDIT_MEAN) { $this->coefstring = 'aggregationcoefextra'; } else if ($this->aggregation == GRADE_AGGREGATE_SUM) {