Mercurial > hg > rc1
comparison plugins/calendar/drivers/kolab/kolab_invitation_calendar.php @ 3:f6fe4b6ae66a
calendar plugin nearly as distributed
author | Charlie Root |
---|---|
date | Sat, 13 Jan 2018 08:56:12 -0500 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
2:c828b0fd4a6e | 3:f6fe4b6ae66a |
---|---|
1 <?php | |
2 | |
3 /** | |
4 * Kolab calendar storage class simulating a virtual calendar listing pedning/declined invitations | |
5 * | |
6 * @author Thomas Bruederli <bruederli@kolabsys.com> | |
7 * | |
8 * Copyright (C) 2014-2015, Kolab Systems AG <contact@kolabsys.com> | |
9 * | |
10 * This program is free software: you can redistribute it and/or modify | |
11 * it under the terms of the GNU Affero General Public License as | |
12 * published by the Free Software Foundation, either version 3 of the | |
13 * License, or (at your option) any later version. | |
14 * | |
15 * This program is distributed in the hope that it will be useful, | |
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
18 * GNU Affero General Public License for more details. | |
19 * | |
20 * You should have received a copy of the GNU Affero General Public License | |
21 * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
22 */ | |
23 | |
24 class kolab_invitation_calendar | |
25 { | |
26 public $id = '__invitation__'; | |
27 public $ready = true; | |
28 public $alarms = false; | |
29 public $rights = 'lrsv'; | |
30 public $editable = false; | |
31 public $attachments = false; | |
32 public $subscriptions = false; | |
33 public $partstats = array('unknown'); | |
34 public $categories = array(); | |
35 public $name = 'Invitations'; | |
36 | |
37 | |
38 /** | |
39 * Default constructor | |
40 */ | |
41 public function __construct($id, $calendar) | |
42 { | |
43 $this->cal = $calendar; | |
44 $this->id = $id; | |
45 | |
46 switch ($this->id) { | |
47 case kolab_driver::INVITATIONS_CALENDAR_PENDING: | |
48 $this->partstats = array('NEEDS-ACTION'); | |
49 $this->name = $this->cal->gettext('invitationspending'); | |
50 if (!empty($_REQUEST['_quickview'])) | |
51 $this->partstats[] = 'TENTATIVE'; | |
52 break; | |
53 | |
54 case kolab_driver::INVITATIONS_CALENDAR_DECLINED: | |
55 $this->partstats = array('DECLINED'); | |
56 $this->name = $this->cal->gettext('invitationsdeclined'); | |
57 break; | |
58 } | |
59 | |
60 // user-specific alarms settings win | |
61 $prefs = $this->cal->rc->config->get('kolab_calendars', array()); | |
62 if (isset($prefs[$this->id]['showalarms'])) | |
63 $this->alarms = $prefs[$this->id]['showalarms']; | |
64 } | |
65 | |
66 /** | |
67 * Getter for a nice and human readable name for this calendar | |
68 * | |
69 * @return string Name of this calendar | |
70 */ | |
71 public function get_name() | |
72 { | |
73 return $this->name; | |
74 } | |
75 | |
76 /** | |
77 * Getter for the IMAP folder owner | |
78 * | |
79 * @return string Name of the folder owner | |
80 */ | |
81 public function get_owner() | |
82 { | |
83 return $this->cal->rc->get_user_name(); | |
84 } | |
85 | |
86 /** | |
87 * | |
88 */ | |
89 public function get_title() | |
90 { | |
91 return $this->get_name(); | |
92 } | |
93 | |
94 /** | |
95 * Getter for the name of the namespace to which the IMAP folder belongs | |
96 * | |
97 * @return string Name of the namespace (personal, other, shared) | |
98 */ | |
99 public function get_namespace() | |
100 { | |
101 return 'x-special'; | |
102 } | |
103 | |
104 /** | |
105 * Getter for the top-end calendar folder name (not the entire path) | |
106 * | |
107 * @return string Name of this calendar | |
108 */ | |
109 public function get_foldername() | |
110 { | |
111 return $this->get_name(); | |
112 } | |
113 | |
114 /** | |
115 * Getter for the Cyrus mailbox identifier corresponding to this folder | |
116 * | |
117 * @return string Mailbox ID | |
118 */ | |
119 public function get_mailbox_id() | |
120 { | |
121 // this is a virtual collection and has no concrete mailbox ID | |
122 return null; | |
123 } | |
124 | |
125 /** | |
126 * Return color to display this calendar | |
127 */ | |
128 public function get_color() | |
129 { | |
130 // calendar color is stored in local user prefs | |
131 $prefs = $this->cal->rc->config->get('kolab_calendars', array()); | |
132 | |
133 if (!empty($prefs[$this->id]) && !empty($prefs[$this->id]['color'])) | |
134 return $prefs[$this->id]['color']; | |
135 | |
136 return 'ffffff'; | |
137 } | |
138 | |
139 /** | |
140 * Compose an URL for CalDAV access to this calendar (if configured) | |
141 */ | |
142 public function get_caldav_url() | |
143 { | |
144 return false; | |
145 } | |
146 | |
147 /** | |
148 * Check activation status of this folder | |
149 * | |
150 * @return boolean True if enabled, false if not | |
151 */ | |
152 public function is_active() | |
153 { | |
154 $prefs = $this->cal->rc->config->get('kolab_calendars', array()); // read local prefs | |
155 return (bool)$prefs[$this->id]['active']; | |
156 } | |
157 | |
158 /** | |
159 * Update properties of this calendar folder | |
160 * | |
161 * @see calendar_driver::edit_calendar() | |
162 */ | |
163 public function update(&$prop) | |
164 { | |
165 // don't change anything. | |
166 // let kolab_driver save props in local prefs | |
167 return $prop['id']; | |
168 } | |
169 | |
170 /** | |
171 * Getter for a single event object | |
172 */ | |
173 public function get_event($id) | |
174 { | |
175 // redirect call to kolab_driver::get_event() | |
176 $event = $this->cal->driver->get_event($id, calendar_driver::FILTER_WRITEABLE); | |
177 | |
178 if (is_array($event)) { | |
179 // add pointer to original calendar folder | |
180 $event['_folder_id'] = $event['calendar']; | |
181 $event = $this->_mod_event($event); | |
182 } | |
183 | |
184 return $event; | |
185 } | |
186 | |
187 /** | |
188 * Get attachment body | |
189 * @see calendar_driver::get_attachment_body() | |
190 */ | |
191 public function get_attachment_body($id, $event) | |
192 { | |
193 // find the actual folder this event resides in | |
194 if (!empty($event['_folder_id'])) { | |
195 $cal = $this->cal->driver->get_calendar($event['_folder_id']); | |
196 } | |
197 else { | |
198 $cal = null; | |
199 foreach (kolab_storage::list_folders('', '*', 'event', null) as $foldername) { | |
200 $cal = $this->_get_calendar($foldername); | |
201 if ($cal->ready && $cal->storage && $cal->get_event($event['id'])) { | |
202 break; | |
203 } | |
204 } | |
205 } | |
206 | |
207 if ($cal && $cal->storage) { | |
208 return $cal->get_attachment_body($id, $event); | |
209 } | |
210 | |
211 return false; | |
212 } | |
213 | |
214 /** | |
215 * @param integer Event's new start (unix timestamp) | |
216 * @param integer Event's new end (unix timestamp) | |
217 * @param string Search query (optional) | |
218 * @param boolean Include virtual events (optional) | |
219 * @param array Additional parameters to query storage | |
220 * @return array A list of event records | |
221 */ | |
222 public function list_events($start, $end, $search = null, $virtual = 1, $query = array()) | |
223 { | |
224 // get email addresses of the current user | |
225 $user_emails = $this->cal->get_user_emails(); | |
226 $subquery = array(); | |
227 foreach ($user_emails as $email) { | |
228 foreach ($this->partstats as $partstat) { | |
229 $subquery[] = array('tags', '=', 'x-partstat:' . $email . ':' . strtolower($partstat)); | |
230 } | |
231 } | |
232 | |
233 // aggregate events from all calendar folders | |
234 $events = array(); | |
235 foreach (kolab_storage::list_folders('', '*', 'event', null) as $foldername) { | |
236 $cal = $this->_get_calendar($foldername); | |
237 if ($cal->get_namespace() == 'other') | |
238 continue; | |
239 | |
240 foreach ($cal->list_events($start, $end, $search, 1, $query, array(array($subquery, 'OR'))) as $event) { | |
241 $match = false; | |
242 | |
243 // post-filter events to match out partstats | |
244 if (is_array($event['attendees'])) { | |
245 foreach ($event['attendees'] as $attendee) { | |
246 if (in_array($attendee['email'], $user_emails) && in_array($attendee['status'], $this->partstats)) { | |
247 $match = true; | |
248 break; | |
249 } | |
250 } | |
251 } | |
252 | |
253 if ($match) { | |
254 $events[$event['id'] ?: $event['uid']] = $this->_mod_event($event); | |
255 } | |
256 } | |
257 | |
258 // merge list of event categories (really?) | |
259 $this->categories += $cal->categories; | |
260 } | |
261 | |
262 return $events; | |
263 } | |
264 | |
265 /** | |
266 * | |
267 * @param integer Date range start (unix timestamp) | |
268 * @param integer Date range end (unix timestamp) | |
269 * @return integer Count | |
270 */ | |
271 public function count_events($start, $end = null) | |
272 { | |
273 // get email addresses of the current user | |
274 $user_emails = $this->cal->get_user_emails(); | |
275 $subquery = array(); | |
276 foreach ($user_emails as $email) { | |
277 foreach ($this->partstats as $partstat) { | |
278 $subquery[] = array('tags', '=', 'x-partstat:' . $email . ':' . strtolower($partstat)); | |
279 } | |
280 } | |
281 | |
282 $filter = array( | |
283 array('tags','!=','x-status:cancelled'), | |
284 array($subquery, 'OR') | |
285 ); | |
286 | |
287 // aggregate counts from all calendar folders | |
288 $count = 0; | |
289 foreach (kolab_storage::list_folders('', '*', 'event', null) as $foldername) { | |
290 $cal = $this->_get_calendar($foldername); | |
291 if ($cal->get_namespace() == 'other') | |
292 continue; | |
293 | |
294 $count += $cal->count_events($start, $end, $filter); | |
295 } | |
296 | |
297 return $count; | |
298 } | |
299 | |
300 /** | |
301 * Get calendar object instance (that maybe already initialized) | |
302 */ | |
303 private function _get_calendar($folder_name) | |
304 { | |
305 $id = kolab_storage::folder_id($folder_name, true); | |
306 return $this->cal->driver->get_calendar($id); | |
307 } | |
308 | |
309 /** | |
310 * Helper method to modify some event properties | |
311 */ | |
312 private function _mod_event($event) | |
313 { | |
314 // set classes according to PARTSTAT | |
315 $event = kolab_driver::add_partstat_class($event, $this->partstats); | |
316 | |
317 if (strpos($event['className'], 'fc-invitation-') !== false) { | |
318 $event['calendar'] = $this->id; | |
319 } | |
320 | |
321 return $event; | |
322 } | |
323 | |
324 /** | |
325 * Create a new event record | |
326 * | |
327 * @see calendar_driver::new_event() | |
328 * | |
329 * @return mixed The created record ID on success, False on error | |
330 */ | |
331 public function insert_event($event) | |
332 { | |
333 return false; | |
334 } | |
335 | |
336 /** | |
337 * Update a specific event record | |
338 * | |
339 * @see calendar_driver::new_event() | |
340 * @return boolean True on success, False on error | |
341 */ | |
342 public function update_event($event, $exception_id = null) | |
343 { | |
344 // forward call to the actual storage folder | |
345 if ($event['_folder_id']) { | |
346 $cal = $this->cal->driver->get_calendar($event['_folder_id']); | |
347 if ($cal && $cal->ready) { | |
348 return $cal->update_event($event, $exception_id); | |
349 } | |
350 } | |
351 | |
352 return false; | |
353 } | |
354 | |
355 /** | |
356 * Delete an event record | |
357 * | |
358 * @see calendar_driver::remove_event() | |
359 * @return boolean True on success, False on error | |
360 */ | |
361 public function delete_event($event, $force = true) | |
362 { | |
363 return false; | |
364 } | |
365 | |
366 /** | |
367 * Restore deleted event record | |
368 * | |
369 * @see calendar_driver::undelete_event() | |
370 * @return boolean True on success, False on error | |
371 */ | |
372 public function restore_event($event) | |
373 { | |
374 return false; | |
375 } | |
376 } |