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.
This commit is contained in:
Adrian Greeve 2015-07-03 11:43:57 +08:00
parent e5eefbbf01
commit 316c560cc5
3 changed files with 81 additions and 7 deletions

View File

@ -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);

View File

@ -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);
}
}
}
}

View File

@ -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);
}
}