plugins/calendar plugins/libcalendaring
Thomas Brüderli
bruederli at kolabsys.com
Mon Feb 2 13:13:05 CET 2015
plugins/calendar/calendar.php | 7 ++
plugins/calendar/drivers/calendar_driver.php | 55 +++++++++++++++++++++
plugins/calendar/drivers/kolab/kolab_calendar.php | 8 +--
plugins/calendar/drivers/kolab/kolab_driver.php | 24 ++++++++-
plugins/libcalendaring/lib/libcalendaring_itip.php | 23 +++++---
plugins/libcalendaring/localization/en_US.inc | 1
6 files changed, 104 insertions(+), 14 deletions(-)
New commits:
commit b4bcf723e5fd1dbddd06f4861aa4ba43ec2cfc5b
Author: Thomas Bruederli <bruederli at kolabsys.com>
Date: Mon Feb 2 13:12:56 2015 +0100
Display recurrence information from iTip invitations (#4446)
diff --git a/plugins/calendar/calendar.php b/plugins/calendar/calendar.php
index 64dc2ce..98bdac4 100644
--- a/plugins/calendar/calendar.php
+++ b/plugins/calendar/calendar.php
@@ -1227,6 +1227,13 @@ class calendar extends rcube_plugin
$event['_part'] = $mime_id;
$events[] = $this->_client_event($event, true);
+
+ // add recurring instances
+ if (!empty($event['recurrence'])) {
+ foreach ($this->driver->get_recurring_events($event, $event['start']) as $recurring) {
+ $events[] = $this->_client_event($recurring, true);
+ }
+ }
}
return $events;
diff --git a/plugins/calendar/drivers/calendar_driver.php b/plugins/calendar/drivers/calendar_driver.php
index 4ec53c4..24e7a2e 100644
--- a/plugins/calendar/drivers/calendar_driver.php
+++ b/plugins/calendar/drivers/calendar_driver.php
@@ -432,6 +432,61 @@ abstract class calendar_driver
}
/**
+ * Create instances of a recurring event
+ *
+ * @param array Hash array with event properties
+ * @param object DateTime Start date of the recurrence window
+ * @param object DateTime End date of the recurrence window
+ * @return array List of recurring event instances
+ */
+ public function get_recurring_events($event, $start, $end = null)
+ {
+ $events = array();
+
+ if ($event['recurrence']) {
+ // include library class
+ require_once(dirname(__FILE__) . '/../lib/calendar_recurrence.php');
+
+ $rcmail = rcmail::get_instance();
+ $recurrence = new calendar_recurrence($rcmail->plugins->get_plugin('calendar'), $event);
+
+ // determine a reasonable end date if none given
+ if (!$end) {
+ switch ($event['recurrence']['FREQ']) {
+ case 'YEARLY': $intvl = 'P100Y'; break;
+ case 'MONTHLY': $intvl = 'P20Y'; break;
+ default: $intvl = 'P10Y'; break;
+ }
+
+ $end = clone $event['start'];
+ $end->add(new DateInterval($intvl));
+ }
+
+ $i = 0;
+ while ($next_event = $recurrence->next_instance()) {
+ $next_event['uid'] = $event['uid'] . '-' . ++$i;
+ // add to output if in range
+ if (($next_event['start'] <= $end && $next_event['end'] >= $start)) {
+ $next_event['id'] = $next_event['uid'];
+ $next_event['recurrence_id'] = $event['uid'];
+ $next_event['_instance'] = $i;
+ $events[] = $next_event;
+ }
+ else if ($next_event['start'] > $end) { // stop loop if out of range
+ break;
+ }
+
+ // avoid endless recursion loops
+ if ($i > 1000) {
+ break;
+ }
+ }
+ }
+
+ return $events;
+ }
+
+ /**
* Provide a list of revisions for the given event
*
* @param array $event Hash array with event properties:
diff --git a/plugins/calendar/drivers/kolab/kolab_calendar.php b/plugins/calendar/drivers/kolab/kolab_calendar.php
index 850a12f..d10126a 100644
--- a/plugins/calendar/drivers/kolab/kolab_calendar.php
+++ b/plugins/calendar/drivers/kolab/kolab_calendar.php
@@ -196,7 +196,7 @@ class kolab_calendar extends kolab_storage_folder_api
$this->events[$master_id] = $this->_to_rcube_event($record);
if (($master = $this->events[$master_id]) && $master['recurrence']) {
- $this->_get_recurring_events($record, $master['start'], null, $id);
+ $this->get_recurring_events($record, $master['start'], null, $id);
}
}
@@ -323,7 +323,7 @@ class kolab_calendar extends kolab_storage_folder_api
// resolve recurring events
if ($record['recurrence'] && $virtual == 1) {
- $events = array_merge($events, $this->_get_recurring_events($record, $start, $end));
+ $events = array_merge($events, $this->get_recurring_events($record, $start, $end));
}
}
@@ -455,7 +455,7 @@ class kolab_calendar extends kolab_storage_folder_api
// refresh local cache with recurring instances
if ($exception_id) {
- $this->_get_recurring_events($object, $event['start'], $event['end'], $exception_id);
+ $this->get_recurring_events($object, $event['start'], $event['end'], $exception_id);
}
}
@@ -538,7 +538,7 @@ class kolab_calendar extends kolab_storage_folder_api
* @param string ID of a specific recurring event instance
* @return array List of recurring event instances
*/
- public function _get_recurring_events($event, $start, $end = null, $event_id = null)
+ public function get_recurring_events($event, $start, $end = null, $event_id = null)
{
$object = $event['_formatobj'];
if (!$object) {
diff --git a/plugins/calendar/drivers/kolab/kolab_driver.php b/plugins/calendar/drivers/kolab/kolab_driver.php
index 8a48405..b53ffbf 100644
--- a/plugins/calendar/drivers/kolab/kolab_driver.php
+++ b/plugins/calendar/drivers/kolab/kolab_driver.php
@@ -704,7 +704,7 @@ class kolab_driver extends calendar_driver
// removing the first instance => just move to next occurence
if ($master['id'] == $event['id']) {
- $recurring = reset($storage->_get_recurring_events($event, $event['start'], null, $event['id'].'-1'));
+ $recurring = reset($storage->get_recurring_events($event, $event['start'], null, $event['id'].'-1'));
// no future instances found: delete the master event (bug #1677)
if (!$recurring['start']) {
@@ -1246,6 +1246,28 @@ class kolab_driver extends calendar_driver
}
/**
+ * Create instances of a recurring event
+ *
+ * @param array Hash array with event properties
+ * @param object DateTime Start date of the recurrence window
+ * @param object DateTime End date of the recurrence window
+ * @return array List of recurring event instances
+ */
+ public function get_recurring_events($event, $start, $end = null)
+ {
+ // load the given event data into a libkolabxml container
+ if (!$event['_formatobj']) {
+ $event_xml = new kolab_format_event();
+ $event_xml->set($event);
+ $event['_formatobj'] = $event_xml;
+ }
+
+ $this->_read_calendars();
+ $storage = reset($this->calendars);
+ return $storage->get_recurring_events($event, $start, $end);
+ }
+
+ /**
* Fetch free/busy information from a person within the given range
*/
public function get_freebusy_list($email, $start, $end)
diff --git a/plugins/libcalendaring/lib/libcalendaring_itip.php b/plugins/libcalendaring/lib/libcalendaring_itip.php
index 0685337..3eead6f 100644
--- a/plugins/libcalendaring/lib/libcalendaring_itip.php
+++ b/plugins/libcalendaring/lib/libcalendaring_itip.php
@@ -125,7 +125,8 @@ class libcalendaring_itip
'name' => $bodytext,
'vars' => array(
'title' => $event['title'],
- 'date' => $this->lib->event_date_text($event, true),
+ 'date' => $this->lib->event_date_text($event, true) .
+ (empty($event['recurrence']) ? '' : sprintf("\n%s: %s", $this->gettext('recurring'), $this->lib->recurrence_text($event['recurrence']))),
'attendees' => join(",\n ", $attendees_list),
'sender' => $this->sender['name'],
'organizer' => $this->sender['name'],
@@ -697,27 +698,31 @@ class libcalendaring_itip
$table->add('ititle', $title);
$table->add('title', Q($event['title']));
if ($event['start'] && $event['end']) {
- $table->add('label', $this->plugin->gettext('date'), $this->domain);
+ $table->add('label', $this->gettext('date'));
$table->add('date', Q($this->lib->event_date_text($event)));
}
else if ($event['due'] && $event['_type'] == 'task') {
- $table->add('label', $this->plugin->gettext('date'), $this->domain);
+ $table->add('label', $this->gettext('date'));
$table->add('date', Q($this->lib->event_date_text($event)));
}
+ if (!empty($event['recurrence'])) {
+ $table->add('label', $this->gettext('recurring'));
+ $table->add('recurrence', $this->lib->recurrence_text($event['recurrence']));
+ }
if ($event['location']) {
- $table->add('label', $this->plugin->gettext('location'), $this->domain);
+ $table->add('label', $this->gettext('location'));
$table->add('location', Q($event['location']));
}
if ($event['sensitivity'] && $event['sensitivity'] != 'public') {
- $table->add('label', $this->plugin->gettext('sensitivity'), $this->domain);
- $table->add('sensitivity', ucfirst($this->plugin->gettext($event['sensitivity'], $this->domain)) . '!');
+ $table->add('label', $this->gettext('sensitivity'));
+ $table->add('sensitivity', ucfirst($this->gettext($event['sensitivity'])) . '!');
}
if ($event['status'] == 'COMPLETED' || $event['status'] == 'CANCELLED') {
- $table->add('label', $this->plugin->gettext('status'), $this->domain);
- $table->add('status', $this->plugin->gettext('status-' . strtolower($event['status']), $this->domain));
+ $table->add('label', $this->gettext('status'));
+ $table->add('status', $this->gettext('status-' . strtolower($event['status'])));
}
if ($event['comment']) {
- $table->add('label', $this->plugin->gettext('comment'), $this->domain);
+ $table->add('label', $this->gettext('comment'));
$table->add('location', Q($event['comment']));
}
diff --git a/plugins/libcalendaring/localization/en_US.inc b/plugins/libcalendaring/localization/en_US.inc
index 2542c47..3e49838 100644
--- a/plugins/libcalendaring/localization/en_US.inc
+++ b/plugins/libcalendaring/localization/en_US.inc
@@ -46,6 +46,7 @@ $labels['repeatinweek'] = 'Repeat in a week';
$labels['showmore'] = 'Show more...';
// recurrence related labels
+$labels['recurring'] = 'Repeats';
$labels['frequency'] = 'Repeat';
$labels['never'] = 'never';
$labels['daily'] = 'daily';
More information about the commits
mailing list