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