Merge branch 'MDL-58810-master' of git://github.com/junpataleta/moodle

This commit is contained in:
David Monllao 2017-05-08 09:59:32 +08:00
commit ac6b845de7
4 changed files with 46 additions and 8 deletions

View File

@ -24,6 +24,7 @@
namespace core_calendar;
use calendar_event;
use DateInterval;
use DateTime;
use moodle_exception;
@ -223,7 +224,7 @@ class rrule_manager {
/**
* Create events for specified rrule.
*
* @param \calendar_event $passedevent Properties of event to create.
* @param calendar_event $passedevent Properties of event to create.
* @throws moodle_exception
*/
public function create_events($passedevent) {
@ -243,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);
@ -719,7 +723,9 @@ class rrule_manager {
$cloneevent->repeatid = $event->id;
$cloneevent->timestart = $time;
unset($cloneevent->id);
\calendar_event::create($cloneevent, false);
// UUID should only be set on the first instance of the recurring events.
unset($cloneevent->uuid);
calendar_event::create($cloneevent, false);
}
// If COUNT rule is defined and the number of the generated event times is less than the the COUNT rule,

View File

@ -466,11 +466,21 @@ class core_calendar_rrule_manager_testcase extends advanced_testcase {
$records = $DB->get_records('event', array('repeatid' => $this->event->id), 'timestart ASC');
$expecteddate = clone($startdatetime);
$first = true;
foreach ($records as $record) {
$this->assertLessThanOrEqual($until, $record->timestart);
$this->assertEquals($expecteddate->format('Y-m-d H:i:s'), date('Y-m-d H:i:s', $record->timestart));
// Go to next iteration.
$expecteddate->add($interval);
// Check UUID.
if ($first) {
// The first instance of the event contains the UUID.
$this->assertEquals('uuid', $record->uuid);
$first = false;
} else {
// Succeeding instances will not contain the UUID.
$this->assertEmpty($record->uuid);
}
}
}

View File

@ -2872,5 +2872,27 @@ function xmldb_main_upgrade($oldversion) {
upgrade_main_savepoint(true, 2017050300.01);
}
if ($oldversion < 2017050500.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, 2017050500.01);
}
return true;
}

View File

@ -29,7 +29,7 @@
defined('MOODLE_INTERNAL') || die();
$version = 2017050500.00; // YYYYMMDD = weekly release date of this DEV branch.
$version = 2017050500.01; // YYYYMMDD = weekly release date of this DEV branch.
// RR = release increments - 00 in DEV branches.
// .XX = incremental changes.