MDL-58810 calendar: Fix rrule_manager issues

* Set the correct repeat ID for the recurring event
* Unset UUID for 'child' events of recurring events
This commit is contained in:
Jun Pataleta
2017-05-08 09:48:46 +08:00
parent 787d1a8f53
commit 9fff50ae00
3 changed files with 33 additions and 6 deletions
+10 -5
View File
@@ -244,13 +244,16 @@ class rrule_manager {
// Generate timestamps that obey the rrule.
$eventtimes = $this->generate_recurring_event_times($eventrec);
// Adjust the parent event's timestart, if necessary.
// Update the parent event. Make sure that its repeat ID is the same as its ID.
$calevent = new calendar_event($eventrec);
$updatedata = new stdClass();
$updatedata->repeatid = $event->id;
// Also, adjust the parent event's timestart, if necessary.
if (count($eventtimes) > 0 && !in_array($eventrec->timestart, $eventtimes)) {
$calevent = new calendar_event($eventrec);
$updatedata = (object)['timestart' => $eventtimes[0], 'repeatid' => $eventrec->id];
$calevent->update($updatedata, false);
$eventrec->timestart = $calevent->timestart;
$updatedata->timestart = reset($eventtimes);
}
$calevent->update($updatedata, false);
$eventrec->timestart = $calevent->timestart;
// Create the recurring calendar events.
$this->create_recurring_events($eventrec, $eventtimes);
@@ -720,6 +723,8 @@ class rrule_manager {
$cloneevent->repeatid = $event->id;
$cloneevent->timestart = $time;
unset($cloneevent->id);
// UUID should only be set on the first instance of the recurring events.
unset($cloneevent->uuid);
calendar_event::create($cloneevent, false);
}
+22
View File
@@ -2525,5 +2525,27 @@ function xmldb_main_upgrade($oldversion) {
upgrade_main_savepoint(true, 2016120501.06);
}
if ($oldversion < 2016120503.01) {
// Get the list of parent event IDs.
$sql = "SELECT DISTINCT repeatid
FROM {event}
WHERE repeatid <> 0";
$parentids = array_keys($DB->get_records_sql($sql));
// Check if there are repeating events we need to process.
if (!empty($parentids)) {
// The repeat IDs of parent events should match their own ID.
// So we need to update parent events that have non-matching IDs and repeat IDs.
list($insql, $params) = $DB->get_in_or_equal($parentids);
$updatesql = "UPDATE {event}
SET repeatid = id
WHERE id <> repeatid
AND id $insql";
$DB->execute($updatesql, $params);
}
// Main savepoint reached.
upgrade_main_savepoint(true, 2016120503.01);
}
return true;
}
+1 -1
View File
@@ -29,7 +29,7 @@
defined('MOODLE_INTERNAL') || die();
$version = 2016120503.00; // YYYYMMDD = weekly release date of this DEV branch.
$version = 2016120503.01; // YYYYMMDD = weekly release date of this DEV branch.
// RR = release increments - 00 in DEV branches.
// .XX = incremental changes.