forked from extern/egroupware
* CalDAV: fixed users participating only in exceptions of a recurring event were also shown in whole series in Thunderbird and iCal
This commit is contained in:
parent
cc049e25d0
commit
a95f08f88c
@ -613,7 +613,7 @@ class calendar_groupdav extends groupdav_handler
|
|||||||
if (isset($expand['start'])) $expand['start'] = $this->vCalendar->_parseDateTime($expand['start']);
|
if (isset($expand['start'])) $expand['start'] = $this->vCalendar->_parseDateTime($expand['start']);
|
||||||
if (isset($expand['end'])) $expand['end'] = $this->vCalendar->_parseDateTime($expand['end']);
|
if (isset($expand['end'])) $expand['end'] = $this->vCalendar->_parseDateTime($expand['end']);
|
||||||
}
|
}
|
||||||
$events =& self::get_series($event['uid'], $this->bo, $expand);
|
$events =& self::get_series($event['uid'], $this->bo, $expand, $user);
|
||||||
}
|
}
|
||||||
elseif(!$this->client_shared_uid_exceptions && $event['reference'])
|
elseif(!$this->client_shared_uid_exceptions && $event['reference'])
|
||||||
{
|
{
|
||||||
@ -630,19 +630,13 @@ class calendar_groupdav extends groupdav_handler
|
|||||||
* @param string $uid UID
|
* @param string $uid UID
|
||||||
* @param calendar_bo $bo=null calendar_bo object to reuse for search call
|
* @param calendar_bo $bo=null calendar_bo object to reuse for search call
|
||||||
* @param boolean|array $expand=false true or array with values for 'start', 'end' to expand recurrences
|
* @param boolean|array $expand=false true or array with values for 'start', 'end' to expand recurrences
|
||||||
|
* @param int $user=null account_id of calendar to display, to remove master, if current user does not participate in
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
private static function &get_series($uid,calendar_bo $bo=null, $expand=false)
|
private static function &get_series($uid,calendar_bo $bo=null, $expand=false, $user=null)
|
||||||
{
|
{
|
||||||
if (is_null($bo)) $bo = new calendar_bopdate();
|
if (is_null($bo)) $bo = new calendar_bopdate();
|
||||||
|
|
||||||
if (!($masterId = array_shift($bo->find_event(array('uid' => $uid), 'master')))
|
|
||||||
|| !($master = $bo->read($masterId, 0, false, 'server')))
|
|
||||||
{
|
|
||||||
return array(); // should never happen
|
|
||||||
}
|
|
||||||
$exceptions =& $master['recur_exception'];
|
|
||||||
|
|
||||||
$params = array(
|
$params = array(
|
||||||
'query' => array('cal_uid' => $uid),
|
'query' => array('cal_uid' => $uid),
|
||||||
'filter' => 'owner', // return all possible entries
|
'filter' => 'owner', // return all possible entries
|
||||||
@ -653,11 +647,31 @@ class calendar_groupdav extends groupdav_handler
|
|||||||
|
|
||||||
$events =& $bo->search($params);
|
$events =& $bo->search($params);
|
||||||
|
|
||||||
|
$master = null;
|
||||||
foreach($events as $k => &$recurrence)
|
foreach($events as $k => &$recurrence)
|
||||||
{
|
{
|
||||||
|
if (!isset($master)) // first event is master
|
||||||
|
{
|
||||||
|
$master = $recurrence;
|
||||||
|
$exceptions =& $master['recur_exception'];
|
||||||
|
unset($events[$k]);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
//error_log(__FILE__.'['.__LINE__.'] '.__METHOD__."($uid)[$k]:" . array2string($recurrence));
|
//error_log(__FILE__.'['.__LINE__.'] '.__METHOD__."($uid)[$k]:" . array2string($recurrence));
|
||||||
if ($recurrence['id'] != $master['id']) // real exception
|
if ($recurrence['id'] != $master['id']) // real exception
|
||||||
{
|
{
|
||||||
|
// user is NOT participating in this exception
|
||||||
|
if ($user && !isset($recurrence['participants'][$user]))
|
||||||
|
{
|
||||||
|
// if he is NOT in master, delete this exception
|
||||||
|
if (!isset($master['participants'][$user]))
|
||||||
|
{
|
||||||
|
unset($events[$k]);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// otherwise mark him in this exception as rejected
|
||||||
|
$recurrence['participants'][$user] = 'R';
|
||||||
|
}
|
||||||
//error_log('real exception: '.array2string($recurrence));
|
//error_log('real exception: '.array2string($recurrence));
|
||||||
// remove from masters recur_exception, as exception is include
|
// remove from masters recur_exception, as exception is include
|
||||||
// at least Lightning "understands" EXDATE as exception from what's included
|
// at least Lightning "understands" EXDATE as exception from what's included
|
||||||
@ -683,7 +697,8 @@ class calendar_groupdav extends groupdav_handler
|
|||||||
$recurrence['recur_type'] = MCAL_RECUR_NONE; // is set, as this is a copy of the master
|
$recurrence['recur_type'] = MCAL_RECUR_NONE; // is set, as this is a copy of the master
|
||||||
// not for included exceptions (Lightning): $master['recur_exception'][] = $recurrence['start'];
|
// not for included exceptions (Lightning): $master['recur_exception'][] = $recurrence['start'];
|
||||||
}
|
}
|
||||||
if (!$expand)
|
// only add master if we are not expanding and current user participates in master (and not just some exceptions)
|
||||||
|
if (!$expand && (!$user || isset($master['participants'][$user])))
|
||||||
{
|
{
|
||||||
$events = array_merge(array($master), $events);
|
$events = array_merge(array($master), $events);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user