mirror of
https://github.com/EGroupware/egroupware.git
synced 2025-02-04 04:19:41 +01:00
Add filter to calendar_so::get_recurrence_exceptions() method
This commit is contained in:
parent
83b53cadbe
commit
14e7c0cd87
@ -1513,4 +1513,122 @@ class calendar_boupdate extends calendar_bo
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* classifies an incoming event from the eGW point-of-view
|
||||||
|
*
|
||||||
|
* exceptions: unlike other calendar apps eGW does not create an event exception
|
||||||
|
* if just the participant state changes - therefore we have to distinguish between
|
||||||
|
* real exceptions and status only exceptions
|
||||||
|
*
|
||||||
|
* @param array $event the event to check
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
* type =>
|
||||||
|
* SINGLE a single event
|
||||||
|
* SERIES-MASTER the series master
|
||||||
|
* SERIES-EXCEPTION event is a real exception
|
||||||
|
* SERIES-EXCEPTION-STATUS event is a status only exception
|
||||||
|
* SERIES-EXCEPTION-PROPAGATE event was a status only exception in the past and is now a real exception
|
||||||
|
* stored_event => if event already exists in the database array with event data or false
|
||||||
|
* master_event => for event type SERIES-EXCEPTION, SERIES-EXCEPTION-STATUS or SERIES-EXCEPTION-PROPAGATE
|
||||||
|
* the corresponding series master event array
|
||||||
|
* NOTE: this param is false if event is of type SERIES-MASTER
|
||||||
|
*/
|
||||||
|
function get_event_info($event)
|
||||||
|
{
|
||||||
|
$type = 'SINGLE'; // default
|
||||||
|
$return_master = false; //default
|
||||||
|
|
||||||
|
if ($event['recur_type'] != MCAL_RECUR_NONE)
|
||||||
|
{
|
||||||
|
$type = 'SERIES-MASTER';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// SINGLE, SERIES-EXCEPTION OR SERIES-EXCEPTON-STATUS
|
||||||
|
if (empty($event['uid']) && $event['id'] > 0 && ($stored_event = $this->read($event['id'])))
|
||||||
|
{
|
||||||
|
$event['uid'] = $stored_event['uid']; // restore the UID if it was not delivered
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($event['uid'])
|
||||||
|
&& $event['recurrence']
|
||||||
|
&& ($master_event = $this->read($event['uid']))
|
||||||
|
&& isset($master_event['recur_type'])
|
||||||
|
&& $master_event['recur_type'] != MCAL_RECUR_NONE)
|
||||||
|
{
|
||||||
|
// SERIES-EXCEPTION OR SERIES-EXCEPTON-STATUS
|
||||||
|
$return_master = true; // we have a valid master and can return it
|
||||||
|
|
||||||
|
if (isset($event['id']) && $master_event['id'] != $event['id'])
|
||||||
|
{
|
||||||
|
$type = 'SERIES-EXCEPTION'; // this is an existing exception
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$type = 'SERIES-EXCEPTION-STATUS'; // default if we cannot find a proof for a fundamental change
|
||||||
|
// the recurrence_event is the master event with start and end adjusted to the recurrence
|
||||||
|
$recurrence_event = $master_event;
|
||||||
|
$recurrence_event['start'] = $event['recurrence'];
|
||||||
|
$recurrence_event['end'] = $event['recurrence'] + ($master_event['end'] - $master_event['start']);
|
||||||
|
// check for changed data
|
||||||
|
foreach (array('start','end','uid','title','location',
|
||||||
|
'priority','public','special','non_blocking') as $key)
|
||||||
|
{
|
||||||
|
if (!empty($event[$key]) && $recurrence_event[$key] != $event[$key])
|
||||||
|
{
|
||||||
|
if (isset($event['id']))
|
||||||
|
{
|
||||||
|
$type = 'SERIES-EXCEPTION-PROPAGATE';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$type = 'SERIES-EXCEPTION'; // this is a new exception
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// the event id here is always the id of the master event
|
||||||
|
// unset it to prevent confusion of stored event and master event
|
||||||
|
unset($event['id']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// SINGLE
|
||||||
|
$type = 'SINGLE';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// read existing event
|
||||||
|
if (isset($event['id']))
|
||||||
|
{
|
||||||
|
$stored_event = $this->read($event['id']);
|
||||||
|
}
|
||||||
|
|
||||||
|
// check ACL
|
||||||
|
if ($return_master)
|
||||||
|
{
|
||||||
|
$acl_edit = $this->check_perms(EGW_ACL_EDIT, $master_event['id']);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (is_array($stored_event))
|
||||||
|
{
|
||||||
|
$acl_edit = $this->check_perms(EGW_ACL_EDIT, $stored_event['id']);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$acl_edit = true; // new event
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'type' => $type,
|
||||||
|
'acl_edit' => $acl_edit,
|
||||||
|
'stored_event' => is_array($stored_event) ? $stored_event : false,
|
||||||
|
'master_event' => $return_master ? $master_event : false,
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
@ -942,6 +942,7 @@ class calendar_ical extends calendar_boupdate
|
|||||||
$event['participants'][$uid] = $event['participant_types']['r'][substr($uid,1)] = $status;
|
$event['participants'][$uid] = $event['participant_types']['r'][substr($uid,1)] = $status;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
$event['tzid'] = $storedEvent['tzid'];
|
||||||
// avoid that iCal changes the organizer, which is not allowed
|
// avoid that iCal changes the organizer, which is not allowed
|
||||||
$event['owner'] = $event_info['stored_event']['owner'];
|
$event['owner'] = $event_info['stored_event']['owner'];
|
||||||
}
|
}
|
||||||
@ -1727,6 +1728,7 @@ class calendar_ical extends calendar_boupdate
|
|||||||
break;
|
break;
|
||||||
case 'RRULE':
|
case 'RRULE':
|
||||||
$recurence = $attributes['value'];
|
$recurence = $attributes['value'];
|
||||||
|
$vcardData['recur_interval'] = 1;
|
||||||
$type = preg_match('/FREQ=([^;: ]+)/i',$recurence,$matches) ? $matches[1] : $recurence[0];
|
$type = preg_match('/FREQ=([^;: ]+)/i',$recurence,$matches) ? $matches[1] : $recurence[0];
|
||||||
// vCard 2.0 values for all types
|
// vCard 2.0 values for all types
|
||||||
if (preg_match('/UNTIL=([0-9TZ]+)/',$recurence,$matches))
|
if (preg_match('/UNTIL=([0-9TZ]+)/',$recurence,$matches))
|
||||||
@ -1739,8 +1741,7 @@ class calendar_ical extends calendar_boupdate
|
|||||||
}
|
}
|
||||||
if (preg_match('/INTERVAL=([0-9]+)/',$recurence,$matches))
|
if (preg_match('/INTERVAL=([0-9]+)/',$recurence,$matches))
|
||||||
{
|
{
|
||||||
// 1 is invalid,, egw uses 0 for interval
|
$vcardData['recur_interval'] = (int) $matches[1] ? (int) $matches[1] : 1;
|
||||||
$vcardData['recur_interval'] = (int) $matches[1] != 0 ? (int) $matches[1] : 0;
|
|
||||||
}
|
}
|
||||||
$vcardData['recur_data'] = 0;
|
$vcardData['recur_data'] = 0;
|
||||||
switch($type)
|
switch($type)
|
||||||
@ -2402,122 +2403,4 @@ class calendar_ical extends calendar_boupdate
|
|||||||
$this->set_status($old_event, $userid, $status, $recur_date, true, false);
|
$this->set_status($old_event, $userid, $status, $recur_date, true, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* classifies an incoming event from the eGW point-of-view
|
|
||||||
*
|
|
||||||
* exceptions: unlike other calendar apps eGW does not create an event exception
|
|
||||||
* if just the participant state changes - therefore we have to distinguish between
|
|
||||||
* real exceptions and status only exceptions
|
|
||||||
*
|
|
||||||
* @param array $event the event to check
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
* type =>
|
|
||||||
* SINGLE a single event
|
|
||||||
* SERIES-MASTER the series master
|
|
||||||
* SERIES-EXCEPTION event is a real exception
|
|
||||||
* SERIES-EXCEPTION-STATUS event is a status only exception
|
|
||||||
* SERIES-EXCEPTION-PROPAGATE event was a status only exception in the past and is now a real exception
|
|
||||||
* stored_event => if event already exists in the database array with event data or false
|
|
||||||
* master_event => for event type SERIES-EXCEPTION, SERIES-EXCEPTION-STATUS or SERIES-EXCEPTION-PROPAGATE
|
|
||||||
* the corresponding series master event array
|
|
||||||
* NOTE: this param is false if event is of type SERIES-MASTER
|
|
||||||
*/
|
|
||||||
private function get_event_info($event)
|
|
||||||
{
|
|
||||||
$type = 'SINGLE'; // default
|
|
||||||
$return_master = false; //default
|
|
||||||
|
|
||||||
if ($event['recur_type'] != MCAL_RECUR_NONE)
|
|
||||||
{
|
|
||||||
$type = 'SERIES-MASTER';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// SINGLE, SERIES-EXCEPTION OR SERIES-EXCEPTON-STATUS
|
|
||||||
if (empty($event['uid']) && $event['id'] > 0 && ($stored_event = $this->read($event['id'])))
|
|
||||||
{
|
|
||||||
$event['uid'] = $stored_event['uid']; // restore the UID if it was not delivered
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isset($event['uid'])
|
|
||||||
&& $event['recurrence']
|
|
||||||
&& ($master_event = $this->read($event['uid']))
|
|
||||||
&& isset($master_event['recur_type'])
|
|
||||||
&& $master_event['recur_type'] != MCAL_RECUR_NONE)
|
|
||||||
{
|
|
||||||
// SERIES-EXCEPTION OR SERIES-EXCEPTON-STATUS
|
|
||||||
$return_master = true; // we have a valid master and can return it
|
|
||||||
|
|
||||||
if (isset($event['id']) && $master_event['id'] != $event['id'])
|
|
||||||
{
|
|
||||||
$type = 'SERIES-EXCEPTION'; // this is an existing exception
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$type = 'SERIES-EXCEPTION-STATUS'; // default if we cannot find a proof for a fundamental change
|
|
||||||
// the recurrence_event is the master event with start and end adjusted to the recurrence
|
|
||||||
$recurrence_event = $master_event;
|
|
||||||
$recurrence_event['start'] = $event['recurrence'];
|
|
||||||
$recurrence_event['end'] = $event['recurrence'] + ($master_event['end'] - $master_event['start']);
|
|
||||||
// check for changed data
|
|
||||||
foreach (array('start','end','uid','title','location',
|
|
||||||
'priority','public','special','non_blocking') as $key)
|
|
||||||
{
|
|
||||||
if (!empty($event[$key]) && $recurrence_event[$key] != $event[$key])
|
|
||||||
{
|
|
||||||
if (isset($event['id']))
|
|
||||||
{
|
|
||||||
$type = 'SERIES-EXCEPTION-PROPAGATE';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$type = 'SERIES-EXCEPTION'; // this is a new exception
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// the event id here is always the id of the master event
|
|
||||||
// unset it to prevent confusion of stored event and master event
|
|
||||||
unset($event['id']);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// SINGLE
|
|
||||||
$type = 'SINGLE';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// read existing event
|
|
||||||
if (isset($event['id']))
|
|
||||||
{
|
|
||||||
$stored_event = $this->read($event['id']);
|
|
||||||
}
|
|
||||||
|
|
||||||
// check ACL
|
|
||||||
if ($return_master)
|
|
||||||
{
|
|
||||||
$acl_edit = $this->check_perms(EGW_ACL_EDIT, $master_event['id']);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (is_array($stored_event))
|
|
||||||
{
|
|
||||||
$acl_edit = $this->check_perms(EGW_ACL_EDIT, $stored_event['id']);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$acl_edit = true; // new event
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return array(
|
|
||||||
'type' => $type,
|
|
||||||
'acl_edit' => $acl_edit,
|
|
||||||
'stored_event' => is_array($stored_event) ? $stored_event : false,
|
|
||||||
'master_event' => $return_master ? $master_event : false,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
@ -1489,16 +1489,18 @@ ORDER BY cal_user_type, cal_usre_id
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the exception days of a given recurring event caused by
|
* Gets the exception days of a given recurring event caused by
|
||||||
* irregular participant stati
|
* irregular participant stati or timezone transitions
|
||||||
*
|
*
|
||||||
* @param array $event Recurring Event.
|
* @param array $event Recurring Event.
|
||||||
* @param string tz_id=null timezone for exports (null for event's timezone)
|
* @param string tz_id=null timezone for exports (null for event's timezone)
|
||||||
* @param int $start=0 if != 0: startdate of the search/list (servertime)
|
* @param int $start=0 if != 0: startdate of the search/list (servertime)
|
||||||
* @param int $end=0 if != 0: enddate of the search/list (servertime)
|
* @param int $end=0 if != 0: enddate of the search/list (servertime)
|
||||||
|
* @param string $filter='all' string filter-name: all (not rejected), accepted, unknown, tentative,
|
||||||
|
* rejected, tz_transitions (return only by timezone transition affected entries)
|
||||||
*
|
*
|
||||||
* @return array Array of exception days (false for non-recurring events).
|
* @return array Array of exception days (false for non-recurring events).
|
||||||
*/
|
*/
|
||||||
function get_recurrence_exceptions(&$event, $tz_id=null, $start=0, $end=0)
|
function get_recurrence_exceptions(&$event, $tz_id=null, $start=0, $end=0, $filter='all')
|
||||||
{
|
{
|
||||||
$cal_id = (int) $event['id'];
|
$cal_id = (int) $event['id'];
|
||||||
if (!$cal_id || $event['recur_type'] == MCAL_RECUR_NONE) return false;
|
if (!$cal_id || $event['recur_type'] == MCAL_RECUR_NONE) return false;
|
||||||
@ -1538,8 +1540,35 @@ ORDER BY cal_user_type, cal_usre_id
|
|||||||
$time = new egw_time($recur_date, egw_time::$server_timezone);
|
$time = new egw_time($recur_date, egw_time::$server_timezone);
|
||||||
$time->setTimezone(self::$tz_cache[$tz_id]);
|
$time->setTimezone(self::$tz_cache[$tz_id]);
|
||||||
$recur_start = $time->format('His');
|
$recur_start = $time->format('His');
|
||||||
|
//error_log(__FILE__.'['.__LINE__.'] '.__METHOD__.
|
||||||
|
// "() first=$first_start <> current=$recur_start");
|
||||||
}
|
}
|
||||||
if ($recur_status != $recurrences[0]
|
if ($attendee['type'] = 'u' &&
|
||||||
|
$attendee['id'] == $GLOBALS['egw_info']['user']['account_id'])
|
||||||
|
{
|
||||||
|
// handle filter for current user
|
||||||
|
switch ($filter)
|
||||||
|
{
|
||||||
|
case 'unknown':
|
||||||
|
if ($recur_status != 'U') continue;
|
||||||
|
break;
|
||||||
|
case 'accepted':
|
||||||
|
if ($recur_status != 'A') continue;
|
||||||
|
break;
|
||||||
|
case 'tentative':
|
||||||
|
if ($recur_status != 'T') continue;
|
||||||
|
break;
|
||||||
|
case 'rejected':
|
||||||
|
if ($recur_status != 'R') continue;
|
||||||
|
break;
|
||||||
|
case 'default':
|
||||||
|
if ($recur_status == 'R') continue;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// All entries
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (($filter != 'tz_transitions' && $recur_status != $recurrences[0])
|
||||||
|| !empty($tz_id) && $first_start != $recur_start)
|
|| !empty($tz_id) && $first_start != $recur_start)
|
||||||
{
|
{
|
||||||
// Every distinct status or starttime results in an exception
|
// Every distinct status or starttime results in an exception
|
||||||
|
Loading…
Reference in New Issue
Block a user