Branch 'dev/kolab3' - 2 commits - plugins/calendar plugins/libkolab

Thomas Brüderli bruederli at kolabsys.com
Wed May 16 18:39:58 CEST 2012


 plugins/calendar/calendar.php                         |   42 ++++++++++++++-
 plugins/calendar/drivers/database/database_driver.php |   28 +---------
 plugins/calendar/drivers/kolab/kolab_calendar.php     |   12 ++--
 plugins/calendar/drivers/kolab/kolab_driver.php       |    8 +-
 plugins/libkolab/lib/kolab_format_event.php           |   50 ++++++++++++++++++
 5 files changed, 107 insertions(+), 33 deletions(-)

New commits:
commit 839adb2c267ab8f562c7daf87659d9a5e6bece03
Author: Thomas Bruederli <bruederli at kolabsys.com>
Date:   Wed May 16 18:36:03 2012 +0200

    - Adapt event alarms to new storage format
    - Query objects by x-has-alarm tag
    - Re-use code to compute absolute times for alarms

diff --git a/plugins/calendar/calendar.php b/plugins/calendar/calendar.php
index b808323..5f7d1fd 100644
--- a/plugins/calendar/calendar.php
+++ b/plugins/calendar/calendar.php
@@ -1264,7 +1264,47 @@ class calendar extends rcube_plugin
     
     return false;
   }
-  
+
+  /**
+   * Get the next alarm (time & action) for the given event
+   *
+   * @param array Event data
+   * @return array Hash array with alarm time/type or null if no alarms are configured
+   */
+  public static function get_next_alarm($event)
+  {
+      if (!$event['alarms'])
+        return null;
+
+      // TODO: handle multiple alarms (currently not supported)
+      list($trigger, $action) = explode(':', $event['alarms'], 2);
+
+      $notify = self::parse_alaram_value($trigger);
+      if (!empty($notify[1])){  // offset
+        $mult = 1;
+        switch ($notify[1]) {
+          case '-S': $mult =     -1; break;
+          case '+S': $mult =      1; break;
+          case '-M': $mult =    -60; break;
+          case '+M': $mult =     60; break;
+          case '-H': $mult =  -3600; break;
+          case '+H': $mult =   3600; break;
+          case '-D': $mult = -86400; break;
+          case '+D': $mult =  86400; break;
+          case '-W': $mult = -604800; break;
+          case '+W': $mult =  604800; break;
+        }
+        $offset = $notify[0] * $mult;
+        $refdate = $mult > 0 ? $event['end'] : $event['start'];
+        $notify_at = $refdate + $offset;
+      }
+      else {  // absolute timestamp
+        $notify_at = $notify[0];
+      }
+
+      return array('time' => $notify_at, 'action' => $action ? strtoupper($action) : 'DISPLAY');
+  }
+
   /**
    * Convert the internal structured data into a vcalendar rrule 2.0 string
    */
diff --git a/plugins/calendar/drivers/database/database_driver.php b/plugins/calendar/drivers/database/database_driver.php
index ba7f1e7..b871d51 100644
--- a/plugins/calendar/drivers/database/database_driver.php
+++ b/plugins/calendar/drivers/database/database_driver.php
@@ -396,31 +396,13 @@ class database_driver extends calendar_driver
    */
   private function _get_notification($event)
   {
-    if ($event['alarms']) {
-      list($trigger, $action) = explode(':', $event['alarms']);
-      $notify = calendar::parse_alaram_value($trigger);
-      if (!empty($notify[1])){  // offset
-        $mult = 1;
-        switch ($notify[1]) {
-          case '-M': $mult =    -60; break;
-          case '+M': $mult =     60; break;
-          case '-H': $mult =  -3600; break;
-          case '+H': $mult =   3600; break;
-          case '-D': $mult = -86400; break;
-          case '+D': $mult =  86400; break;
-        }
-        $offset = $notify[0] * $mult;
-        $refdate = $mult > 0 ? $event['end'] : $event['start'];
-        $notify_at = $refdate + $offset;
-      }
-      else {  // absolute timestamp
-        $notify_at = $notify[0];
-      }
+    if ($event['alarms'] && $event['start'] > time()) {
+      $alarm = calendar::get_next_alarm($event);
 
-      if ($event['start'] > time())
-        return date('Y-m-d H:i:s', $notify_at);
+      if ($alarm['time'] && $alarm['action'] == 'DISPLAY')
+        return date('Y-m-d H:i:s', $alarm['time']);
     }
-    
+
     return null;
   }
 
diff --git a/plugins/calendar/drivers/kolab/kolab_calendar.php b/plugins/calendar/drivers/kolab/kolab_calendar.php
index 6104972..d036658 100644
--- a/plugins/calendar/drivers/kolab/kolab_calendar.php
+++ b/plugins/calendar/drivers/kolab/kolab_calendar.php
@@ -197,16 +197,16 @@ class kolab_calendar
    * @param  integer Event's new start (unix timestamp)
    * @param  integer Event's new end (unix timestamp)
    * @param  string  Search query (optional)
-   * @param  boolean Strip virtual events (optional)
+   * @param  boolean Include virtual events (optional)
+   * @param  array   Additional parameters to query storage
    * @return array A list of event records
    */
-  public function list_events($start, $end, $search = null, $virtual = 1)
+  public function list_events($start, $end, $search = null, $virtual = 1, $query = array())
   {
     // query Kolab storage
-    $query = array(
-      array('dtstart', '<=', $end),
-      array('dtend',   '>=', $start),
-    );
+    $query[] = array('dtstart', '<=', $end);
+    $query[] = array('dtend',   '>=', $start);
+
     foreach ((array)$this->storage->select($query) as $record) {
       $event = $this->_to_rcube_event($record);
       $this->events[$event['id']] = $event;
diff --git a/plugins/calendar/drivers/kolab/kolab_driver.php b/plugins/calendar/drivers/kolab/kolab_driver.php
index 6ce7a84..5d1906b 100644
--- a/plugins/calendar/drivers/kolab/kolab_driver.php
+++ b/plugins/calendar/drivers/kolab/kolab_driver.php
@@ -765,17 +765,19 @@ class kolab_driver extends calendar_driver
     $time = $slot + $interval;
     
     $events = array();
+    $query = array(array('tags', 'LIKE', '% x-has-alarms %'));
     foreach ($this->calendars as $cid => $calendar) {
       // skip calendars with alarms disabled
       if (!$calendar->alarms || ($calendars && !in_array($cid, $calendars)))
         continue;
 
-      foreach ($calendar->list_events($time, $time + 86400 * 365) as $e) {
+      foreach ($calendar->list_events($time, $time + 86400 * 365, null, 1, $query) as $e) {
         // add to list if alarm is set
-        if ($e['_alarm'] && ($notifyat = $e['start'] - $e['_alarm'] * 60) <= $time) {
+        $alarm = calendar::get_next_alarm($e);
+        if ($alarm && $alarm['time'] && $alarm['time'] <= $time && $alarm['action'] == 'DISPLAY') {
           $id = $e['id'];
           $events[$id] = $e;
-          $events[$id]['notifyat'] = $notifyat;
+          $events[$id]['notifyat'] = $alarm['time'];
         }
       }
     }


commit 3f5712a117302e60a7610e99d7c6f4b3a94acb7a
Author: Thomas Bruederli <bruederli at kolabsys.com>
Date:   Wed May 16 18:34:21 2012 +0200

    Save event categories and 'has alarm' information as tags in cache

diff --git a/plugins/libkolab/lib/kolab_format_event.php b/plugins/libkolab/lib/kolab_format_event.php
index c2c0ddf..699cfb8 100644
--- a/plugins/libkolab/lib/kolab_format_event.php
+++ b/plugins/libkolab/lib/kolab_format_event.php
@@ -26,6 +26,8 @@ class kolab_format_event extends kolab_format
 {
     public $CTYPE = 'application/calendar+xml';
 
+    public static $fulltext_cols = array('title', 'description', 'location', 'attendees:name', 'attendees:email');
+
     private $sensitivity_map = array(
         'public'       => kolabformat::ClassPublic,
         'private'      => kolabformat::ClassPrivate,
@@ -469,6 +471,54 @@ class kolab_format_event extends kolab_format
     }
 
     /**
+     * Callback for kolab_storage_cache to get object specific tags to cache
+     *
+     * @return array List of tags to save in cache
+     */
+    public function get_tags()
+    {
+        $tags = array();
+
+        foreach ((array)$this->data['categories'] as $cat) {
+            $tags[] = rcube_utils::normalize_string($cat);
+        }
+
+        if (!empty($this->data['alarms'])) {
+            $tags[] = 'x-has-alarms';
+        }
+
+        return $tags;
+    }
+
+    /**
+     * Callback for kolab_storage_cache to get words to index for fulltext search
+     *
+     * @return array List of words to save in cache
+     */
+    public function get_words()
+    {
+        $data = '';
+        foreach (self::$fulltext_cols as $colname) {
+            list($col, $field) = explode(':', $colname);
+
+            if ($field) {
+                $a = array();
+                foreach ((array)$this->data[$col] as $attr)
+                    $a[] = $attr[$field];
+                $val = join(' ', $a);
+            }
+            else {
+                $val = is_array($this->data[$col]) ? join(' ', $this->data[$col]) : $this->data[$col];
+            }
+
+            if (strlen($val))
+                $data .= $val . ' ';
+        }
+
+        return array_unique(rcube_utils::normalize_string($data, true));
+    }
+
+    /**
      * Load data from old Kolab2 format
      */
     public function fromkolab2($rec)





More information about the commits mailing list