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