MDL-61870 mod_assign: Fix/clean up imported group override duedates

Applying patch supplied from Damyon Wiese to address the root-cause
of this issue in the backup/restore logic.
This commit is contained in:
Zig Tan
2018-08-02 13:09:01 +08:00
committed by Damyon Wiese
parent ae25d0ec2c
commit 3b7ead71a4
3 changed files with 9 additions and 75 deletions
@@ -387,6 +387,12 @@ class restore_assign_activity_structure_step extends restore_activity_structure_
return;
}
// Skip group overrides if we are not restoring groupinfo.
$groupinfo = $this->get_setting_value('groups');
if (!$groupinfo && !is_null($data->groupid)) {
return;
}
$data->assignid = $this->get_new_parentid('assign');
if (!is_null($data->userid)) {
+3
View File
@@ -260,6 +260,9 @@ function assign_update_events($assign, $override = null) {
$conds['userid'] = $override->userid;
} else if (isset($override->groupid)) {
$conds['groupid'] = $override->groupid;
} else {
// This is not a valid override, it may have been left from a bad import or restore.
$conds['groupid'] = $conds['userid'] = 0;
}
}
$oldevents = $DB->get_records('event', $conds, 'id ASC');
-75
View File
@@ -438,78 +438,3 @@ function get_assignments_with_rescaled_null_grades() {
return $assignments;
}
/**
* Determined if the assignment has any duplicate group events generated from
* restoring Course backup without groups, and deletes any records found.
*
* Bug fix data clean up for MDL-61870.
*/
function delete_assignment_duplicate_group_events() {
global $DB;
// Get all Course's assign course modules to check for any duplicate group events to remove.
list($coursesinsql, $coursesinparams) = $DB->get_in_or_equal(array_keys(get_courses()), SQL_PARAMS_NAMED);
$query = "SELECT cm.id AS id,
cm.course AS courseid,
cm.instance AS instanceid
FROM {course_modules} cm
JOIN {modules} m ON m.id = cm.module
WHERE m.name = :modulename
AND (cm.course $coursesinsql)";
$params = ['modulename' => 'assign'];
$params += $coursesinparams;
foreach ($DB->get_records_sql($query, $params) as $cm) {
$selectgroupevents = "courseid = :courseid
AND modulename = :modulename
AND eventtype = :eventtype
AND instance = :instance
AND groupid <> :groupid
AND priority <> :priority";
$paramsgroupevents = [
'courseid' => $cm->courseid,
'modulename' => 'assign',
'eventtype' => 'due',
'instance' => $cm->instanceid,
'groupid' => 0,
'priority' => 0
];
// Retrieve all the Course's assign events associated with group overrides,
// which will be use to look for duplicate records that need to be deleted.
foreach ($DB->get_records_select('event', $selectgroupevents, $paramsgroupevents) as $groupevent) {
// Delete any duplicates that match the details of the current groupevent but the id does not
// match the current groupevent id and course id, groupid is 0, and priority is NULL.
$selectduplicates = "id != :eventid
AND courseid != :courseid
AND groupid = 0
AND userid = :userid
AND repeatid = :repeatid
AND modulename = :modulename
AND type = :type
AND eventtype = :eventtype
AND timestart = :timestart
AND timeduration = :timeduration
AND timesort = :timesort
AND sequence = :sequence
AND priority IS NULL";
$paramsduplicates = [
'eventid' => $groupevent->id,
'courseid' => $groupevent->courseid,
'groupid' => 0,
'userid' => $groupevent->userid,
'repeatid' => $groupevent->repeatid,
'modulename' => $groupevent->modulename,
'type' => $groupevent->type,
'eventtype' => $groupevent->eventtype,
'timestart' => $groupevent->timestart,
'timeduration' => $groupevent->timeduration,
'timesort' => $groupevent->timesort,
'sequence' => $groupevent->sequence
];
$DB->delete_records_select('event', $selectduplicates, $paramsduplicates);
}
}
}