diff --git a/grade/edit/tree/category.php b/grade/edit/tree/category.php index deb397bec3a..f715df7af61 100644 --- a/grade/edit/tree/category.php +++ b/grade/edit/tree/category.php @@ -237,7 +237,9 @@ if ($mform->is_cancelled()) { $grade_item->outcomeid = null; + // This means we want to rescale overridden grades as well. if (!empty($data->grade_item_rescalegrades) && $data->grade_item_rescalegrades == 'yes') { + $grade_item->markasoverriddenwhengraded = false; $grade_item->rescale_grades_keep_percentage($grade_item_copy->grademin, $grade_item_copy->grademax, $grade_item->grademin, $grade_item->grademax, 'gradebook'); } diff --git a/grade/tests/behat/grade_regrade_do_not_override.feature b/grade/tests/behat/grade_regrade_do_not_override.feature new file mode 100644 index 00000000000..a0f963051cc --- /dev/null +++ b/grade/tests/behat/grade_regrade_do_not_override.feature @@ -0,0 +1,77 @@ +@core @core_grades +Feature: Regrading grades does not unnecessarily mark some as overriden + In order to regrade a grade item + As an admin + I need to keep the overridden status of all grades + + Background: + Given the following "courses" exist: + | fullname | shortname | category | format | + | Course 1 | C1 | 0 | topics | + And the following "users" exist: + | username | firstname | lastname | email | idnumber | + | student1 | Student | 1 | student1@example.com | s1 | + | student2 | Student | 2 | student2@example.com | s2 | + And the following "course enrolments" exist: + | user | course | role | + | student1 | C1 | student | + | student2 | C1 | student | + And the following "activities" exist: + | activity | course | idnumber | name | intro | + | assign | C1 | assign1 | Assignment 1 | Assignment 1 intro | + And I log in as "admin" + And I navigate to "Grades > Grade category settings" in site administration + And I set the field "Available aggregation types" to "Weighted mean of grades" + And I press "Save changes" + And I am on "Course 1" course homepage + And I follow "Assignment 1" + And I navigate to "View all submissions" in current page administration + And I click on "Grade" "link" in the "Student 1" "table_row" + And I set the field "Grade out of 100" to "80" + And I press "Save and show next" + And I press "OK" + And I set the field "Grade out of 100" to "60" + And I press "Save changes" + And I am on "Course 1" course homepage + And I navigate to "View > Grader report" in the course gradebook + And the following should exist in the "gradereport-grader-table" table: + | | | | + | First name / Surname | Assignment 1 | Course total | + | Student 1 | 80.00 | 80.00 | + | Student 2 | 60.00 | 60.00 | + And I turn editing mode on + And I give the grade "80.00" to the user "Student 2" for the grade item "Course total" + And I press "Save changes" + And I navigate to "View > Grader report" in the course gradebook + And I navigate to "Setup > Gradebook setup" in the course gradebook + And I click on "Edit" "link" in the ".coursecategory" "css_element" + And I click on "Edit settings" "link" in the ".coursecategory" "css_element" + And I set the field "Aggregation" to "Weighted mean of grades" + And I set the field "Rescale overridden grades" to "Yes" + And I set the field "Maximum grade" to "200" + And I press "Save changes" + + @javascript + Scenario: Confirm regrading did not overwrite overridden status + Given I navigate to "View > Grader report" in the course gradebook + Then "td.overridden" "css_element" should not exist in the "Student 1" "table_row" + And "td.overridden" "css_element" should exist in the "Student 2" "table_row" + + @javascript + Scenario: Confirm overridden course total does not get regraded when activity grade is changed + Given I am on "Course 1" course homepage + And I follow "Assignment 1" + And I navigate to "View all submissions" in current page administration + And I click on "Grade" "link" in the "Student 1" "table_row" + And I set the field "Grade out of 100" to "90" + And I press "Save and show next" + And I press "OK" + And I set the field "Grade out of 100" to "70" + And I press "Save changes" + When I am on "Course 1" course homepage + And I navigate to "View > Grader report" in the course gradebook + Then the following should exist in the "gradereport-grader-table" table: + | | | | + | First name / Surname | Assignment 1 | Course total | + | Student 1 | 90.00 | 180.00 | + | Student 2 | 70.00 | 160.00 | diff --git a/lib/grade/grade_item.php b/lib/grade/grade_item.php index 9400b83a78e..c8bc0d7c6db 100644 --- a/lib/grade/grade_item.php +++ b/lib/grade/grade_item.php @@ -257,6 +257,11 @@ class grade_item extends grade_object { */ public $dependson_cache = null; + /** + * @var bool If we regrade this item should we mark it as overridden? + */ + public $markasoverriddenwhengraded = true; + /** * Constructor. Optionally (and by default) attempts to fetch corresponding row from the database * @@ -1830,7 +1835,7 @@ class grade_item extends grade_object { // changed grade? if ($finalgrade !== false) { - if ($this->is_overridable_item()) { + if ($this->is_overridable_item() && $this->markasoverriddenwhengraded) { $grade->overridden = time(); }