0011078: CalDav calender not working after upgrade from 2013.10
[tine20] / tine20 / Calendar / Model / CalendarFilter.php
1 <?php
2 /**
3  * Tine 2.0
4  * 
5  * @package     Calendar
6  * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
7  * @author      Cornelius Weiss <c.weiss@metaways.de>
8  * @copyright   Copyright (c) 2009-2015 Metaways Infosystems GmbH (http://www.metaways.de)
9  */
10
11 /**
12  * Calendar Container Filter
13  * 
14  * NOTE: In the Calendar app ACL is managed by the GrantFilter
15  *       so we ignore container ACL stuff here!
16  *       
17  * NOTE: An Event might be part of multiple calendars:
18  *  - The originate calender represented by container_id
19  *  - Multiple attendee calender represented by multiple displaycontainer_ids
20  *  So if a user filters for certain calendars, we have to look for originate 
21  *  and display containers. (@see Calendar_Backend_Sql for details of the data model)
22  *  
23  * @package Calendar
24  */
25 class Calendar_Model_CalendarFilter extends Tinebase_Model_Filter_Container
26 {
27     
28     /**
29      * @var array One of these grants must be given
30      */
31     protected $_requiredGrants = NULL;
32     
33     /**
34      * appends sql to given select statement
35      * 
36      * @param  Zend_Db_Select                    $_select
37      * @param  Tinebase_Backend_Sql_Abstract     $_backend
38      * @throws Tinebase_Exception_NotFound
39      */
40     public function appendFilterSql($_select, $_backend)
41     {
42         $this->_options['ignoreAcl'] = TRUE;
43         $this->_resolve();
44         
45         $quotedDisplayContainerIdentifier = $_backend->getAdapter()->quoteIdentifier('attendee.displaycontainer_id');
46         
47         $_select->where($this->_getQuotedFieldName($_backend) . ' IN (?)', empty($this->_containerIds) ? " " : $this->_containerIds);
48         $_select->orWhere($quotedDisplayContainerIdentifier  .  ' IN (?)', empty($this->_containerIds) ? " " : $this->_containerIds);
49     }
50     
51     /**
52      * appends sql to given select statement
53      * 
54      * @param  Zend_Db_Select                    $_select
55      * @param  Tinebase_Backend_Sql_Abstract     $_backend
56      * @throws Tinebase_Exception_NotFound
57      */
58     public function appendFilterSql1($_select, $_backend)
59     {
60         $this->_options['ignoreAcl'] = TRUE;
61         $this->_resolve();
62         
63         $_select->where($this->_getQuotedFieldName($_backend) . ' IN (?)', empty($this->_containerIds) ? " " : $this->_containerIds);
64     }
65     
66     /**
67      * appends sql to given select statement
68      * 
69      * @param  Zend_Db_Select                    $_select
70      * @param  Tinebase_Backend_Sql_Abstract     $_backend
71      * @throws Tinebase_Exception_NotFound
72      */
73     public function appendFilterSql2($_select, $_backend)
74     {
75         $this->_options['ignoreAcl'] = TRUE;
76         $this->_resolve();
77         
78         $quotedDisplayContainerIdentifier = $_backend->getAdapter()->quoteIdentifier('attendee.displaycontainer_id');
79         
80         $_select->where($quotedDisplayContainerIdentifier  .  ' IN (?)', empty($this->_containerIds) ? " " : $this->_containerIds);
81     }
82     
83     public function setRequiredGrants(array $_grants)
84     {
85         $this->_requiredGrants = $_grants;
86     }
87     
88     /**
89      * create a attendee filter of users affected by this filter
90      * 
91      * @return Calendar_Model_AttenderFilter
92      */
93     public function getRelatedAttendeeFilter()
94     {
95         // always set current account
96         $userIds = array(Tinebase_Core::getUser()->getId());
97         
98         // rip users from paths
99         foreach ((array) $this->getValue() as $value) {
100             if (preg_match("/^\/personal\/([0-9a-z_\-]+)/i", $value, $matches)) {
101                 // transform current user 
102                 $userIds[] = $matches[1] == Tinebase_Model_User::CURRENTACCOUNT ? Tinebase_Core::getUser()->getId() : $matches[1];
103             }
104         }
105         
106         // get contact ids
107         $users = Tinebase_User::getInstance()->getMultiple(array_unique($userIds));
108         
109         $attendeeFilterData = array();
110         foreach ($users as $user) {
111             $attendeeFilterData[] = array(
112                 'user_type' => Calendar_Model_Attender::USERTYPE_USER,
113                 'user_id'   => $user->contact_id
114             );
115         }
116         
117         $attenderFilter = new Calendar_Model_AttenderFilter('attender', 'in', $attendeeFilterData);
118         return $attenderFilter;
119     }
120
121     /**
122      * fetch shared containers
123      *
124      * NOTE: this is needed because we don't want external organizers events to be visible if 'shared' node is requested
125      *
126      * @param $currentAccount
127      * @param $appName
128      * @return mixed
129      */
130     protected function _getSharedContainer($currentAccount, $appName)
131     {
132         return Tinebase_Container::getInstance()->getSharedContainer($currentAccount, $appName, array(
133             Tinebase_Model_Grants::GRANT_READ
134         ))->getId();
135     }
136 }