From 1d19128f68bbc8578092e8773e5d23766e8ea6ca Mon Sep 17 00:00:00 2001 From: Adrian Greeve Date: Fri, 3 Jul 2015 11:43:57 +0800 Subject: [PATCH] MDL-50757 gradebook: Update fix for pre 2.8 upgrades. Moodle installations that updated before the 2.8 grade push were being flagged for a gradebook freeze. This was resulting in calculated grades being shown as different to how they were displayed before the upgrade. This fix retains the original grade value. --- lib/db/upgrade.php | 2 ++ lib/db/upgradelib.php | 19 ++++++---- lib/tests/upgradelib_test.php | 67 ++++++++++++++++++++++++++++++++++- 3 files changed, 81 insertions(+), 7 deletions(-) diff --git a/lib/db/upgrade.php b/lib/db/upgrade.php index f3f6572777a..5165ab0a94e 100644 --- a/lib/db/upgrade.php +++ b/lib/db/upgrade.php @@ -4061,6 +4061,8 @@ function xmldb_main_upgrade($oldversion) { if ($oldversion < 2014111000.00) { // Coming from 2.7 or older, we need to flag the step minmaxgrade to be ignored. set_config('upgrade_minmaxgradestepignored', 1); + // Coming from 2.7 or older, we need to flag the step for changing calculated grades to be regraded. + set_config('upgrade_calculatedgradeitemsonlyregrade', 1); // Main savepoint reached. upgrade_main_savepoint(true, 2014111000.00); diff --git a/lib/db/upgradelib.php b/lib/db/upgradelib.php index bb0248edd93..2c901e64144 100644 --- a/lib/db/upgradelib.php +++ b/lib/db/upgradelib.php @@ -587,7 +587,10 @@ function upgrade_calculated_grade_items($courseid = null) { $singlecoursesql = "AND ns.id = :courseid"; $params['courseid'] = $courseid; } - $siteminmaxtouse = $CFG->grade_minmaxtouse; + $siteminmaxtouse = 1; + if (isset($CFG->grade_minmaxtouse)) { + $siteminmaxtouse = $CFG->grade_minmaxtouse; + } $courseidsql = "SELECT ns.id FROM ( SELECT c.id, coalesce(" . $DB->sql_compare_text('gs.value') . ", :siteminmax) AS gradevalue @@ -653,11 +656,15 @@ function upgrade_calculated_grade_items($courseid = null) { } } - foreach ($affectedcourses as $courseid) { - // Check to see if the gradebook freeze is already in affect. - $gradebookfreeze = get_config('core', 'gradebook_calculations_freeze_' . $courseid->courseid); - if (!$gradebookfreeze) { - set_config('gradebook_calculations_freeze_' . $courseid->courseid, 20150627); + foreach ($affectedcourses as $affectedcourseid) { + if (isset($CFG->upgrade_calculatedgradeitemsonlyregrade) && !($courseid)) { + $DB->set_field('grade_items', 'needsupdate', 1, array('courseid' => $affectedcourseid->courseid)); + } else { + // Check to see if the gradebook freeze is already in affect. + $gradebookfreeze = get_config('core', 'gradebook_calculations_freeze_' . $affectedcourseid->courseid); + if (!$gradebookfreeze) { + set_config('gradebook_calculations_freeze_' . $affectedcourseid->courseid, 20150627); + } } } } \ No newline at end of file diff --git a/lib/tests/upgradelib_test.php b/lib/tests/upgradelib_test.php index 38090958198..fc060958f8a 100644 --- a/lib/tests/upgradelib_test.php +++ b/lib/tests/upgradelib_test.php @@ -549,7 +549,7 @@ class core_upgradelib_testcase extends advanced_testcase { /** * Test the upgrade function for flagging courses with calculated grade item problems. */ - public function test_upgrade_calculated_grade_items() { + public function test_upgrade_calculated_grade_items_freeze() { global $DB, $CFG; $this->resetAfterTest(); @@ -676,4 +676,69 @@ class core_upgradelib_testcase extends advanced_testcase { $this->assertEquals(20150627, $CFG->{'gradebook_calculations_freeze_' . $course1->id}); $this->assertEquals(20150627, $CFG->{'gradebook_calculations_freeze_' . $course2->id}); } + + function test_upgrade_calculated_grade_items_regrade() { + global $DB, $CFG; + $this->resetAfterTest(); + + // Create a user. + $user = $this->getDataGenerator()->create_user(); + + // Create a course. + $course = $this->getDataGenerator()->create_course(); + + // Enrol the user in the course. + $studentrole = $DB->get_record('role', array('shortname' => 'student')); + $maninstance1 = $DB->get_record('enrol', array('courseid' => $course->id, 'enrol' => 'manual'), '*', MUST_EXIST); + $manual = enrol_get_plugin('manual'); + $manual->enrol_user($maninstance1, $user->id, $studentrole->id); + + set_config('upgrade_calculatedgradeitemsonlyregrade', 1); + + // Creating a category for a grade item. + $gradecategory = new grade_category(); + $gradecategory->fullname = 'calculated grade category'; + $gradecategory->courseid = $course->id; + $gradecategory->insert(); + $gradecategoryid = $gradecategory->id; + + // This is a manual grade item. + $gradeitem = new grade_item(); + $gradeitem->itemname = 'grade item one'; + $gradeitem->itemtype = 'manual'; + $gradeitem->categoryid = $gradecategoryid; + $gradeitem->courseid = $course->id; + $gradeitem->idnumber = 'gi1'; + $gradeitem->insert(); + + // Changing the category into a calculated grade category. + $gradecategoryitem = grade_item::fetch(array('iteminstance' => $gradecategory->id)); + $gradecategoryitem->calculation = '=##gi' . $gradeitem->id . '##/2'; + $gradecategoryitem->grademax = 50; + $gradecategoryitem->grademin = 15; + $gradecategoryitem->update(); + + // Setting a grade for the student. + $grade = $gradeitem->get_grade($user->id, true); + $grade->finalgrade = 50; + $grade->update(); + + grade_regrade_final_grades($course->id); + $grade = grade_grade::fetch(array('itemid' => $gradecategoryitem->id, 'userid' => $user->id)); + $grade->rawgrademax = 100; + $grade->rawgrademin = 0; + $grade->update(); + $this->assertNotEquals($gradecategoryitem->grademax, $grade->rawgrademax); + $this->assertNotEquals($gradecategoryitem->grademin, $grade->rawgrademin); + + // This is the function that we are testing. If we comment out this line, then the test fails because the grade items + // are not flagged for regrading. + upgrade_calculated_grade_items(); + grade_regrade_final_grades($course->id); + + $grade = grade_grade::fetch(array('itemid' => $gradecategoryitem->id, 'userid' => $user->id)); + + $this->assertEquals($gradecategoryitem->grademax, $grade->rawgrademax); + $this->assertEquals($gradecategoryitem->grademin, $grade->rawgrademin); + } }