plugins/calendar

Thomas Brüderli bruederli at kolabsys.com
Tue Mar 10 15:24:22 CET 2015


 plugins/calendar/calendar.php                                |   38 +++++------
 plugins/calendar/drivers/calendar_driver.php                 |   27 ++++---
 plugins/calendar/drivers/database/database_driver.php        |   27 ++++---
 plugins/calendar/drivers/kolab/kolab_driver.php              |   35 +++++-----
 plugins/calendar/drivers/kolab/kolab_invitation_calendar.php |    2 
 plugins/calendar/lib/calendar_ui.php                         |    2 
 6 files changed, 72 insertions(+), 59 deletions(-)

New commits:
commit 76f50f2d2bda86c6e11f59f1524af2a92d05202f
Author: Thomas Bruederli <bruederli at kolabsys.com>
Date:   Tue Mar 10 15:23:52 2015 +0100

    Code cleanup: define filters for calendar listing as bitmask instead of individual arguments

diff --git a/plugins/calendar/calendar.php b/plugins/calendar/calendar.php
index 3a35e1e..da28114 100644
--- a/plugins/calendar/calendar.php
+++ b/plugins/calendar/calendar.php
@@ -263,7 +263,7 @@ class calendar extends rcube_plugin
   public function get_default_calendar($writeable = false, $confidential = false)
   {
     $default_id = $this->rc->config->get('calendar_default_calendar');
-    $calendars = $this->driver->list_calendars(false, true);
+    $calendars = $this->driver->list_calendars(calendar_driver::FILTER_PERSONAL);
     $calendar = $calendars[$default_id] ?: null;
     if (!$calendar || $confidential || ($writeable && $calendar['readonly'])) {
       foreach ($calendars as $cal) {
@@ -512,7 +512,7 @@ class calendar extends rcube_plugin
       // default calendar selection
       $field_id = 'rcmfd_default_calendar';
       $select_cal = new html_select(array('name' => '_default_calendar', 'id' => $field_id, 'is_escaped' => true));
-      foreach ((array)$this->driver->list_calendars(false, true) as $id => $prop) {
+      foreach ((array)$this->driver->list_calendars(calendar_driver::FILTER_PERSONAL) as $id => $prop) {
         $select_cal->add($prop['name'], strval($id));
         if ($prop['default'])
           $default_calendar = $id;
@@ -902,7 +902,7 @@ class calendar extends rcube_plugin
         
         // search for event if only UID is given
         if (!isset($event['calendar']) && $event['uid']) {
-          if (!($event = $this->driver->get_event($event, true))) {
+          if (!($event = $this->driver->get_event($event, calendar_driver::FILTER_WRITEABLE))) {
             break;
           }
           $undo_time = 0;
@@ -1174,7 +1174,7 @@ class calendar extends rcube_plugin
     if ($success !== true) {
       // send update notification on the main event
       if ($event['_savemode'] == 'future' && $event['_notify'] && $old['attendees'] && $old['recurrence_id']) {
-        $master = $this->driver->get_event(array('id' => $old['recurrence_id'], 'calendar' => $old['calendar']));
+        $master = $this->driver->get_event(array('id' => $old['recurrence_id'], 'calendar' => $old['calendar']), 0, true);
         unset($master['_instance'], $master['recurrence_date']);
 
         $sent = $this->notify_attendees($master, null, $action, $event['_comment']);
@@ -1200,12 +1200,12 @@ class calendar extends rcube_plugin
       // send notification for the main event when savemode is 'all'
       if ($action != 'remove' && $_savemode == 'all' && ($event['recurrence_id'] || $old['recurrence_id'] || ($old && $old['id'] != $event['id']))) {
         $event['id'] = $event['recurrence_id'] ?: ($old['recurrence_id'] ?: $old['id']);
-        $event = $this->driver->get_event($event);
+        $event = $this->driver->get_event($event, 0, true);
         unset($event['_instance'], $event['recurrence_date']);
       }
       else {
         // make sure we have the complete record
-        $event = $action == 'remove' ? $old : $this->driver->get_event($event);
+        $event = $action == 'remove' ? $old : $this->driver->get_event($event, 0, true);
       }
 
       $event['_savemode'] = $_savemode;
@@ -1325,7 +1325,7 @@ class calendar extends rcube_plugin
 
     $counts = array();
 
-    foreach ($this->driver->list_calendars(true) as $cal) {
+    foreach ($this->driver->list_calendars(calendar_driver::FILTER_ACTIVE) as $cal) {
       $events = $this->driver->load_events(
         rcube_utils::get_input_value('start', rcube_utils::INPUT_GPC),
         rcube_utils::get_input_value('end', rcube_utils::INPUT_GPC),
@@ -1578,9 +1578,9 @@ class calendar extends rcube_plugin
       $filename = $calendars[$calid]['name'] ? $calendars[$calid]['name'] : $calid;
       $filename = asciiwords(html_entity_decode($filename));  // to 7bit ascii
       if (!empty($event_id)) {
-        if ($event = $this->driver->get_event(array('calendar' => $calid, 'id' => $event_id))) {
+        if ($event = $this->driver->get_event(array('calendar' => $calid, 'id' => $event_id), 0, true)) {
           if ($event['recurrence_id']) {
-            $event = $this->driver->get_event(array('calendar' => $calid, 'id' => $event['recurrence_id']));
+            $event = $this->driver->get_event(array('calendar' => $calid, 'id' => $event['recurrence_id']), 0, true);
           }
           $events = array($event);
           $filename = asciiwords($event['title']);
@@ -1815,7 +1815,7 @@ class calendar extends rcube_plugin
     $date  = $_REQUEST['_date'] ?: 'now';
     $dev   = $_REQUEST['_dev'] ?: 30;
     $cats  = array_keys($this->driver->list_categories());
-    $cals  = $this->driver->list_calendars(true);
+    $cals  = $this->driver->list_calendars(calendar_driver::FILTER_ACTIVE);
     $count = 0;
 
     while ($count++ < $num) {
@@ -2447,14 +2447,14 @@ class calendar extends rcube_plugin
 
     // find local copy of the referenced event
     $this->load_driver();
-    $existing = $this->driver->get_event($data, true, false, true);
+    $existing = $this->driver->get_event($data, calendar_driver::FILTER_WRITEABLE | calendar_driver::FILTER_PERSONAL);
 
     $itip = $this->load_itip();
     $response = $itip->get_itip_status($data, $existing);
 
     // get a list of writeable calendars to save new events to
     if (!$existing && !$data['nosave'] && $response['action'] == 'rsvp' || $response['action'] == 'import') {
-      $calendars = $this->driver->list_calendars(false, true);
+      $calendars = $this->driver->list_calendars(calendar_driver::FILTER_PERSONAL);
       $calendar_select = new html_select(array('name' => 'calendar', 'id' => 'itip-saveto', 'is_escaped' => true));
       $calendar_select->add('--', '');
       $numcals = 0;
@@ -2484,7 +2484,7 @@ class calendar extends rcube_plugin
       $day_end = new Datetime(gmdate('Y-m-d 23:59', $data['date']), $this->lib->timezone);
 
       // get events on that day from the user's personal calendars
-      $calendars = $this->driver->list_calendars(false, true);
+      $calendars = $this->driver->list_calendars(calendar_driver::FILTER_PERSONAL);
       $events = $this->driver->load_events($day_start->format('U'), $day_end->format('U'), null, array_keys($calendars));
       usort($events, function($a, $b) { return $a['start'] > $b['start'] ? 1 : -1; });
 
@@ -2522,7 +2522,7 @@ class calendar extends rcube_plugin
     $savemode = rcube_utils::get_input_value('_savemode', rcube_utils::INPUT_POST);
 
     // search for event if only UID is given
-    if ($event = $this->driver->get_event(array('uid' => $uid, '_instance' => $instance), true)) {
+    if ($event = $this->driver->get_event(array('uid' => $uid, '_instance' => $instance), calendar_driver::FILTER_WRITEABLE)) {
       $event['_savemode'] = $savemode;
       $success = $this->driver->remove_event($event, true);
     }
@@ -2789,7 +2789,7 @@ class calendar extends rcube_plugin
       // find writeable calendar to store event
       $cal_id = !empty($_REQUEST['_folder']) ? rcube_utils::get_input_value('_folder', rcube_utils::INPUT_POST) : null;
       $dontsave = ($_REQUEST['_folder'] === '' && $event['_method'] == 'REQUEST');
-      $calendars = $this->driver->list_calendars(false, true);
+      $calendars = $this->driver->list_calendars(calendar_driver::FILTER_PERSONAL);
       $calendar = $calendars[$cal_id];
 
       // select default calendar except user explicitly selected 'none'
@@ -2841,8 +2841,8 @@ class calendar extends rcube_plugin
       
       // save to calendar
       if ($calendar && !$calendar['readonly']) {
-          // check for existing event with the same UID
-        $existing = $this->driver->get_event($event, true, false, true);
+        // check for existing event with the same UID
+        $existing = $this->driver->get_event($event, calendar_driver::FILTER_WRITEABLE | calendar_driver::FILTER_PERSONAL);
 
         if ($existing) {
           // forward savemode for correct updates of recurring events
@@ -3102,7 +3102,7 @@ class calendar extends rcube_plugin
     if (!empty($events)) {
       // find writeable calendar to store event
       $cal_id = !empty($_REQUEST['_calendar']) ? rcube_utils::get_input_value('_calendar', rcube_utils::INPUT_POST) : null;
-      $calendars = $this->driver->list_calendars(false, true);
+      $calendars = $this->driver->list_calendars(calendar_driver::FILTER_PERSONAL);
 
       foreach ($events as $event) {
         // save to calendar
@@ -3110,7 +3110,7 @@ class calendar extends rcube_plugin
         if ($calendar && !$calendar['readonly'] && $event['_type'] == 'event') {
           $event['calendar'] = $calendar['id'];
 
-          if (!$this->driver->get_event($event['uid'], true, false)) {
+          if (!$this->driver->get_event($event['uid'], calendar_driver::FILTER_WRITEABLE)) {
             $success += (bool)$this->driver->new_event($event);
           }
           else {
diff --git a/plugins/calendar/drivers/calendar_driver.php b/plugins/calendar/drivers/calendar_driver.php
index 1cd6956..959bddf 100644
--- a/plugins/calendar/drivers/calendar_driver.php
+++ b/plugins/calendar/drivers/calendar_driver.php
@@ -94,6 +94,12 @@
  */
 abstract class calendar_driver
 {
+  const FILTER_ALL           = 0;
+  const FILTER_WRITEABLE     = 1;
+  const FILTER_ACTIVE        = 2;
+  const FILTER_PERSONAL      = 4;
+  const FILTER_PRIVATE       = 8;
+  const FILTER_CONFIDENTIAL  = 16;
   const BIRTHDAY_CALENDAR_ID = '__bdays__';
 
   // features supported by backend
@@ -118,12 +124,11 @@ abstract class calendar_driver
   /**
    * Get a list of available calendars from this source
    *
-   * @param bool $active   Return only active calendars
-   * @param bool $personal Return only personal calendars
-   *
+   * @param integer Bitmask defining filter criterias.
+   *          See FILTER_* constants for possible values.
    * @return array List of calendars
    */
-  abstract function list_calendars($active = false, $personal = false);
+  abstract function list_calendars($filter = 0);
 
   /**
    * Create a new calendar assigned to the current user
@@ -269,15 +274,17 @@ abstract class calendar_driver
    * Return data of a single event
    *
    * @param mixed  UID string or hash array with event properties:
-   *        id: Event identifier
-   *  calendar: Calendar identifier (optional)
-   * @param boolean If true, only writeable calendars shall be searched
-   * @param boolean If true, only active calendars shall be searched
-   * @param boolean If true, only personal calendars shall be searched
+   *         id: Event identifier
+   *        uid: Event UID
+   *  _instance: Instance identifier in combination with uid (optional)
+   *   calendar: Calendar identifier (optional)
+   * @param integer Bitmask defining the scope to search events in.
+   *          See FILTER_* constants for possible values.
+   * @param boolean If true, recurrence exceptions shall be added
    *
    * @return array Event object as hash array
    */
-  abstract function get_event($event, $writeable = false, $active = false, $personal = false);
+  abstract function get_event($event, $scope = 0, $full = false);
 
   /**
    * Get events from source.
diff --git a/plugins/calendar/drivers/database/database_driver.php b/plugins/calendar/drivers/database/database_driver.php
index 402e0c3..10eae03 100644
--- a/plugins/calendar/drivers/database/database_driver.php
+++ b/plugins/calendar/drivers/database/database_driver.php
@@ -99,12 +99,11 @@ class database_driver extends calendar_driver
   /**
    * Get a list of available calendars from this source
    *
-   * @param bool $active   Return only active calendars
-   * @param bool $personal Return only personal calendars
+   * @param integer Bitmask defining filter criterias
    *
    * @return array List of calendars
    */
-  public function list_calendars($active = false, $personal = false)
+  public function list_calendars($filter = 0)
   {
     // attempt to create a default calendar for this user
     if (empty($this->calendars)) {
@@ -115,7 +114,7 @@ class database_driver extends calendar_driver
     $calendars = $this->calendars;
 
     // filter active calendars
-    if ($active) {
+    if ($filter & self::FILTER_ACTIVE) {
       foreach ($calendars as $idx => $cal) {
         if (!$cal['active']) {
           unset($calendars[$idx]);
@@ -963,12 +962,11 @@ class database_driver extends calendar_driver
   /**
    * Return data of a specific event
    * @param mixed  Hash array with event properties or event UID
-   * @param boolean Only search in writeable calendars (ignored)
-   * @param boolean Only search in active calendars
-   * @param boolean Only search in personal calendars (ignored)
+   * @param integer Bitmask defining the scope to search events in
+   * @param boolean If true, recurrence exceptions shall be added
    * @return array Hash array with event properties
    */
-  public function get_event($event, $writeable = false, $active = false, $personal = false)
+  public function get_event($event, $scope = 0, $full = false)
   {
     $id  = is_array($event) ? ($event['id'] ?: $event['uid']) : $event;
     $cal = is_array($event) ? $event['calendar'] : null;
@@ -987,7 +985,7 @@ class database_driver extends calendar_driver
       return $this->get_birthday_event($id);
     }
 
-    if ($active) {
+    if ($scope & self::FILTER_ACTIVE) {
       $calendars = $this->calendars;
       foreach ($calendars as $idx => $cal) {
         if (!$cal['active']) {
@@ -1012,8 +1010,15 @@ class database_driver extends calendar_driver
       ),
       $id);
 
-    if ($result && ($event = $this->rc->db->fetch_assoc($result)) && $event['event_id']) {
-      $this->cache[$id] = $this->_read_postprocess($event);
+    if ($result && ($sql_arr = $this->rc->db->fetch_assoc($result)) && $sql_arr['event_id']) {
+      $event = $this->_read_postprocess($sql_arr);
+
+      // also load recurrence exceptions
+      if (!empty($event['recurrence']) && $full) {
+        $event['recurrence']['EXCEPTIONS'] = array_values($this->_load_exceptions($event));
+      }
+
+      $this->cache[$id] = $event;
       return $this->cache[$id];
     }
 
diff --git a/plugins/calendar/drivers/kolab/kolab_driver.php b/plugins/calendar/drivers/kolab/kolab_driver.php
index f494e39..7cbeec7 100644
--- a/plugins/calendar/drivers/kolab/kolab_driver.php
+++ b/plugins/calendar/drivers/kolab/kolab_driver.php
@@ -114,13 +114,12 @@ class kolab_driver extends calendar_driver
   /**
    * Get a list of available calendars from this source
    *
-   * @param bool $active   Return only active calendars
-   * @param bool $personal Return only personal calendars
+   * @param integer $filter Bitmask defining filter criterias
    * @param object $tree   Reference to hierarchical folder tree object
    *
    * @return array List of calendars
    */
-  public function list_calendars($active = false, $personal = false, &$tree = null)
+  public function list_calendars($filter = 0, &$tree = null)
   {
     // attempt to create a default calendar for this user
     if (!$this->has_writeable) {
@@ -131,7 +130,7 @@ class kolab_driver extends calendar_driver
     }
 
     $delim = $this->rc->get_storage()->get_hierarchy_delimiter();
-    $folders = $this->filter_calendars(false, $active, $personal);
+    $folders = $this->filter_calendars($filter);
     $calendars = array();
 
     // include virtual folders for a full folder tree
@@ -225,7 +224,7 @@ class kolab_driver extends calendar_driver
       foreach (array(self::INVITATIONS_CALENDAR_PENDING, self::INVITATIONS_CALENDAR_DECLINED) as $id) {
         $cal = new kolab_invitation_calendar($id, $this->cal);
         $this->calendars[$cal->id] = $cal;
-        if (!$active || $cal->is_active()) {
+        if (!($filter & self::FILTER_ACTIVE) || $cal->is_active()) {
           $calendars[$id] = array(
             'id'       => $cal->id,
             'name'     => $cal->get_name(),
@@ -258,7 +257,7 @@ class kolab_driver extends calendar_driver
     if ($this->rc->config->get('calendar_contact_birthdays', false)) {
       $id = self::BIRTHDAY_CALENDAR_ID;
       $prefs = $this->rc->config->get('kolab_calendars', array());  // read local prefs
-      if (!$active || $prefs[$id]['active']) {
+      if (!($filter & self::FILTER_ACTIVE) || $prefs[$id]['active']) {
         $calendars[$id] = array(
           'id'         => $id,
           'name'       => $this->cal->gettext('birthdays'),
@@ -281,19 +280,21 @@ class kolab_driver extends calendar_driver
   /**
    * Get list of calendars according to specified filters
    *
-   * @param bool $writeable Return only writeable calendars
-   * @param bool $active   Return only active calendars
-   * @param bool $personal Return only personal calendars
+   * @param integer Bitmask defining restrictions. See FILTER_* constants for possible values.
    *
    * @return array List of calendars
    */
-  protected function filter_calendars($writeable = false, $active = false, $personal = false)
+  protected function filter_calendars($filter)
   {
     $calendars = array();
 
     $plugin = $this->rc->plugins->exec_hook('calendar_list_filter', array(
-      'list' => $this->calendars, 'calendars' => $calendars,
-      'writeable' => $writeable, 'active' => $active, 'personal' => $personal,
+      'list'      => $this->calendars,
+      'calendars' => $calendars,
+      'filter'    => $filter,
+      'writeable' => ($filter & self::FILTER_WRITEABLE),
+      'active'    => ($filter & self::FILTER_ACTIVE),
+      'personal'  => ($filter & self::FILTER_PERSONAL),
     ));
 
     if ($plugin['abort']) {
@@ -304,13 +305,13 @@ class kolab_driver extends calendar_driver
       if (!$cal->ready) {
         continue;
       }
-      if ($writeable && $cal->readonly) {
+      if (($filter & self::FILTER_WRITEABLE) && $cal->readonly) {
         continue;
       }
-      if ($active && !$cal->is_active()) {
+      if (($filter & self::FILTER_ACTIVE) && !$cal->is_active()) {
         continue;
       }
-      if ($personal && $cal->get_namespace() != 'personal') {
+      if (($filter & self::FILTER_PERSONAL) && $cal->get_namespace() != 'personal') {
         continue;
       }
       $calendars[$cal->id] = $cal;
@@ -531,7 +532,7 @@ class kolab_driver extends calendar_driver
    * @see calendar_driver::get_event()
    * @return array Hash array with event properties, false if not found
    */
-  public function get_event($event, $writeable = false, $active = false, $personal = false)
+  public function get_event($event, $scope = 0, $full = false)
   {
     if (is_array($event)) {
       $id = $event['id'] ?: $event['uid'];
@@ -558,7 +559,7 @@ class kolab_driver extends calendar_driver
     }
     // iterate over all calendar folders and search for the event ID
     else {
-      foreach ($this->filter_calendars($writeable, $active, $personal) as $calendar) {
+      foreach ($this->filter_calendars($scope) as $calendar) {
         if ($result = $calendar->get_event($id)) {
           return self::to_rcube_event($result);
         }
diff --git a/plugins/calendar/drivers/kolab/kolab_invitation_calendar.php b/plugins/calendar/drivers/kolab/kolab_invitation_calendar.php
index d63a77d..0d4c987 100644
--- a/plugins/calendar/drivers/kolab/kolab_invitation_calendar.php
+++ b/plugins/calendar/drivers/kolab/kolab_invitation_calendar.php
@@ -177,7 +177,7 @@ class kolab_invitation_calendar
   public function get_event($id)
   {
     // redirect call to kolab_driver::get_event()
-    $event = $this->cal->driver->get_event($id, true);
+    $event = $this->cal->driver->get_event($id, calendar_driver::FILTER_WRITEABLE);
 
     if (is_array($event)) {
       // add pointer to original calendar folder
diff --git a/plugins/calendar/lib/calendar_ui.php b/plugins/calendar/lib/calendar_ui.php
index 33ff37a..00b74cd 100644
--- a/plugins/calendar/lib/calendar_ui.php
+++ b/plugins/calendar/lib/calendar_ui.php
@@ -206,7 +206,7 @@ class calendar_ui
     $html = '';
     $jsenv = array();
     $tree = true;
-    $calendars = $this->cal->driver->list_calendars(false, false, $tree);
+    $calendars = $this->cal->driver->list_calendars(0, $tree);
 
     // walk folder tree
     if (is_object($tree)) {




More information about the commits mailing list