Reset attendee partstat when event is rescheduled by the organizer (#4360)
This commit is contained in:
parent
314501fdb2
commit
bef20a0e8d
2 changed files with 61 additions and 3 deletions
|
@ -1836,6 +1836,7 @@ class calendar extends rcube_plugin
|
||||||
// convert dates into DateTime objects in user's current timezone
|
// convert dates into DateTime objects in user's current timezone
|
||||||
$event['start'] = new DateTime($event['start'], $this->timezone);
|
$event['start'] = new DateTime($event['start'], $this->timezone);
|
||||||
$event['end'] = new DateTime($event['end'], $this->timezone);
|
$event['end'] = new DateTime($event['end'], $this->timezone);
|
||||||
|
$event['allday'] = (bool)$event['allday'];
|
||||||
|
|
||||||
// start/end is all we need for 'move' action (#1480)
|
// start/end is all we need for 'move' action (#1480)
|
||||||
if ($action == 'move') {
|
if ($action == 'move') {
|
||||||
|
@ -2211,7 +2212,7 @@ class calendar extends rcube_plugin
|
||||||
public static function event_diff($a, $b)
|
public static function event_diff($a, $b)
|
||||||
{
|
{
|
||||||
$diff = array();
|
$diff = array();
|
||||||
$ignore = array('changed' => 1, 'attachments' => 1);
|
$ignore = array('changed' => 1, 'attachments' => 1, 'recurrence' => 1, '_notify' => 1, '_owner' => 1);
|
||||||
foreach (array_unique(array_merge(array_keys($a), array_keys($b))) as $key) {
|
foreach (array_unique(array_merge(array_keys($a), array_keys($b))) as $key) {
|
||||||
if (!$ignore[$key] && $a[$key] != $b[$key])
|
if (!$ignore[$key] && $a[$key] != $b[$key])
|
||||||
$diff[] = $key;
|
$diff[] = $key;
|
||||||
|
|
|
@ -883,6 +883,9 @@ class kolab_driver extends calendar_driver
|
||||||
$savemode = $event['_savemode'];
|
$savemode = $event['_savemode'];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// check if update affects scheduling and update attendee status accordingly
|
||||||
|
$reschedule = $this->check_scheduling($event, $old, true);
|
||||||
|
|
||||||
// keep saved exceptions (not submitted by the client)
|
// keep saved exceptions (not submitted by the client)
|
||||||
if ($old['recurrence']['EXDATE'] && !isset($event['recurrence']['EXDATE']))
|
if ($old['recurrence']['EXDATE'] && !isset($event['recurrence']['EXDATE']))
|
||||||
$event['recurrence']['EXDATE'] = $old['recurrence']['EXDATE'];
|
$event['recurrence']['EXDATE'] = $old['recurrence']['EXDATE'];
|
||||||
|
@ -914,7 +917,10 @@ class kolab_driver extends calendar_driver
|
||||||
$event['recurrence'] = array();
|
$event['recurrence'] = array();
|
||||||
$event['thisandfuture'] = $savemode == 'future';
|
$event['thisandfuture'] = $savemode == 'future';
|
||||||
|
|
||||||
// TODO: increment sequence if scheduling is affected
|
// increment sequence of this instance if scheduling is affected
|
||||||
|
if ($reschedule) {
|
||||||
|
$event['sequence'] = $old['sequence'] + 1;
|
||||||
|
}
|
||||||
|
|
||||||
// remove some internal properties which should not be saved
|
// remove some internal properties which should not be saved
|
||||||
unset($event['id'], $event['_savemode'], $event['_fromcalendar'], $event['_identity'], $event['_notify']);
|
unset($event['id'], $event['_savemode'], $event['_fromcalendar'], $event['_identity'], $event['_notify']);
|
||||||
|
@ -991,7 +997,8 @@ class kolab_driver extends calendar_driver
|
||||||
}
|
}
|
||||||
|
|
||||||
// adjust recurrence-id when start changed and therefore the entire recurrence chain changes
|
// adjust recurrence-id when start changed and therefore the entire recurrence chain changes
|
||||||
if (($old_start_date != $new_start_date || $old_start_time != $new_start_time) && is_array($event['recurrence']['EXCEPTIONS']) && !$with_exceptions) {
|
if (($old_start_date != $new_start_date || $old_start_time != $new_start_time) &&
|
||||||
|
is_array($event['recurrence']) && is_array($event['recurrence']['EXCEPTIONS']) && !$with_exceptions) {
|
||||||
$recurrence_id_format = $event['allday'] ? 'Ymd' : 'Ymd\THis';
|
$recurrence_id_format = $event['allday'] ? 'Ymd' : 'Ymd\THis';
|
||||||
foreach ($event['recurrence']['EXCEPTIONS'] as $i => $exception) {
|
foreach ($event['recurrence']['EXCEPTIONS'] as $i => $exception) {
|
||||||
$recurrence_id = is_a($exception['recurrence_date'], 'DateTime') ? $exception['recurrence_date'] :
|
$recurrence_id = is_a($exception['recurrence_date'], 'DateTime') ? $exception['recurrence_date'] :
|
||||||
|
@ -1017,6 +1024,56 @@ class kolab_driver extends calendar_driver
|
||||||
return $success;
|
return $success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine whether the current change affects scheduling and reset attendee status accordingly
|
||||||
|
*/
|
||||||
|
public function check_scheduling(&$event, $old, $update = true)
|
||||||
|
{
|
||||||
|
$reschedule = false;
|
||||||
|
|
||||||
|
// skip this check when importing iCal/iTip events
|
||||||
|
if (isset($event['sequence']) || !empty($event['_method'])) {
|
||||||
|
return $reschedule;
|
||||||
|
}
|
||||||
|
|
||||||
|
// iterate through the list of properties considered 'significant' for scheduling
|
||||||
|
foreach (kolab_format_event::$scheduling_properties as $prop) {
|
||||||
|
$a = $old[$prop];
|
||||||
|
$b = $event[$prop];
|
||||||
|
if ($event['allday'] && ($prop == 'start' || $prop == 'end') && $a instanceof DateTime && $b instanceof DateTime) {
|
||||||
|
$a = $a->format('Y-m-d');
|
||||||
|
$b = $b->format('Y-m-d');
|
||||||
|
}
|
||||||
|
if ($a != $b) {
|
||||||
|
$reschedule = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// reset all attendee status to needs-action (#4360)
|
||||||
|
if ($update && $reschedule && is_array($event['attendees'])) {
|
||||||
|
$is_organizer = false;
|
||||||
|
$emails = $this->cal->get_user_emails();
|
||||||
|
$attendees = $event['attendees'];
|
||||||
|
foreach ($attendees as $i => $attendee) {
|
||||||
|
if ($attendee['role'] == 'ORGANIZER' && $attendee['email'] && in_array(strtolower($attendee['email']), $emails)) {
|
||||||
|
$is_organizer = true;
|
||||||
|
}
|
||||||
|
else if ($attendee['role'] != 'ORGANIZER' && $attendee['role'] != 'NON-PARTICIPANT' && $attendee['status'] != 'DELEGATED') {
|
||||||
|
$attendees[$i]['status'] = 'NEEDS-ACTION';
|
||||||
|
$attendees[$i]['rsvp'] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// update attendees only if I'm the organizer
|
||||||
|
if ($is_organizer || ($event['organizer'] && in_array(strtolower($event['organizer']['email']), $emails))) {
|
||||||
|
$event['attendees'] = $attendees;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $reschedule;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get events from source.
|
* Get events from source.
|
||||||
*
|
*
|
||||||
|
|
Loading…
Add table
Reference in a new issue