Branch 'roundcubemail-plugins-kolab-format2-horde5' - plugins/calendar
Christoph Wickert
wickert at kolabsys.com
Tue Mar 5 15:21:48 CET 2013
plugins/calendar/drivers/kolab/kolab_calendar.php | 26 ++++++++++++++++++----
plugins/calendar/drivers/kolab/kolab_driver.php | 23 +++++++++++++++----
2 files changed, 40 insertions(+), 9 deletions(-)
New commits:
commit e674448c265df4bd3d10795d615ec12ffb34c258
Author: Thomas Bruederli <bruederli at kolabsys.com>
Date: Wed Jan 9 11:12:19 2013 +0100
Fix recurring event handling when first instance is modified and excluded (#1505)
diff --git a/plugins/calendar/drivers/kolab/kolab_calendar.php b/plugins/calendar/drivers/kolab/kolab_calendar.php
index c4e7f9f..33aa551 100644
--- a/plugins/calendar/drivers/kolab/kolab_calendar.php
+++ b/plugins/calendar/drivers/kolab/kolab_calendar.php
@@ -249,7 +249,21 @@ class kolab_calendar
// list events in requested time window
if ($event['start'] <= $end && $event['end'] >= $start) {
unset($event['_attendees']);
- $events[] = $event;
+ $add = true;
+
+ // skip the first instance of a recurring event if listed in exdate
+ if ($virtual && !empty($event['recurrence']['EXDATE'])) {
+ $event_date = $event['start']->format('Ymd');
+ foreach ($event['recurrence']['EXDATE'] as $exdate) {
+ if ($exdate->format('Ymd') == $event_date) {
+ $add = false;
+ break;
+ }
+ }
+ }
+
+ if ($add)
+ $events[] = $event;
}
// resolve recurring events
@@ -411,9 +425,9 @@ class kolab_calendar
else if ($next_event['start'] > $end) // stop loop if out of range
break;
- // avoid endless recursion loops
- if ($i > 1000)
- break;
+ // avoid endless recursion loops
+ if ($i > 1000)
+ break;
}
return $events;
@@ -460,6 +474,10 @@ class kolab_calendar
if (is_array($record['categories']))
$record['categories'] = $record['categories'][0];
+ // remove empty recurrence array
+ if (empty($record['recurrence']))
+ unset($record['recurrence']);
+
// remove internals
unset($record['_mailbox'], $record['_msguid'], $record['_formatobj'], $record['_attachments']);
diff --git a/plugins/calendar/drivers/kolab/kolab_driver.php b/plugins/calendar/drivers/kolab/kolab_driver.php
index 58c7e8a..a68d96f 100644
--- a/plugins/calendar/drivers/kolab/kolab_driver.php
+++ b/plugins/calendar/drivers/kolab/kolab_driver.php
@@ -389,10 +389,10 @@ class kolab_driver extends calendar_driver
public function remove_event($event, $force = true)
{
$success = false;
- $_savemode = $event['_savemode'];
+ $savemode = $event['_savemode'];
if (($storage = $this->calendars[$event['calendar']]) && ($event = $storage->get_event($event['id']))) {
- $event['_savemode'] = $_savemode;
+ $event['_savemode'] = $savemode;
$savemode = 'all';
$master = $event;
@@ -407,7 +407,7 @@ class kolab_driver extends calendar_driver
switch ($savemode) {
case 'current':
$_SESSION['calendar_restore_event_data'] = $master;
-
+
// removing the first instance => just move to next occurence
if ($master['id'] == $event['id']) {
$limit = clone $event['end'];
@@ -567,13 +567,26 @@ class kolab_driver extends calendar_driver
break;
case 'current':
- // add exception to master event
- $master['recurrence']['EXDATE'][] = $old['start'];
+ // modifying the first instance => just move to next occurence
+ if ($master['id'] == $event['id']) {
+ $limit = clone $old['end'];
+ $limit->add(new DateInterval('P370D'));
+ $recurring = reset($storage->_get_recurring_events($event, $event['start'], $limit, $event['id'].'-1'));
+ $master['start'] = $recurring['start'];
+ $master['end'] = $recurring['end'];
+ if ($master['recurrence']['COUNT'])
+ $master['recurrence']['COUNT']--;
+ }
+ else { // add exception to master event
+ $master['recurrence']['EXDATE'][] = $old['start'];
+ }
+
$storage->update_event($master);
// insert new event for this occurence
$event += $old;
$event['recurrence'] = array();
+ unset($event['recurrence_id']);
$event['uid'] = $this->cal->generate_uid();
$success = $storage->insert_event($event);
break;
More information about the commits
mailing list