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.
$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);