MDL-45283 restore: Prevent failure when user course grade exists

When we restore a course, the grade that a user has for the
grade item of the course cannot be created twice. If we try
to create it when it already exists, a database exception is
raised because of index duplication.

The safest way to proceed is certainly to ignore the grade
information from the backup, otherwise we could potentially
overwrite existing information. Though, this only applies
to restore as merge, and it does not affect the update of
the course grade.
This commit is contained in:
Frederic Massart
2014-04-30 12:09:13 +08:00
parent 3f0a5f287a
commit 98fed696dc
+7 -1
View File
@@ -237,7 +237,13 @@ class restore_gradebook_structure_step extends restore_structure_step {
$data->timecreated = $this->apply_date_offset($data->timecreated);
$data->timemodified = $this->apply_date_offset($data->timemodified);
$newitemid = $DB->insert_record('grade_grades', $data);
$gradeexists = $DB->record_exists('grade_grades', array('userid' => $data->userid, 'itemid' => $data->itemid));
if ($gradeexists) {
$message = "User id '{$data->userid}' already has a grade entry for grade item id '{$data->itemid}'";
$this->log($message, backup::LOG_DEBUG);
} else {
$newitemid = $DB->insert_record('grade_grades', $data);
}
} else {
$message = "Mapped user id not found for user id '{$olduserid}', grade item id '{$data->itemid}'";
$this->log($message, backup::LOG_DEBUG);