2016-09-12 11 views
0

У моего приложения есть подписка на календарь office365 под названием ConferenceRoom. Поэтому, когда событие создано/модифицировано/удалено, сервер office365 отправит уведомление моему приложению о том, что произошло что-то из этих трех.Как узнать, какое событие повторяющегося события было удалено?

В календаре я создаю повторяющееся событие standup meeting на каждый понедельник (через браузер). После этого мое приложение получает уведомление с ChangeType: Created и вот Повторяющаяся часть мероприятия, что уведомление по:

Recurrence: 
{ Pattern: 
    { Type: 'Weekly', 
     Interval: 1, 
     Month: 0, 
     DayOfMonth: 0, 
     DaysOfWeek: [Object], 
     FirstDayOfWeek: 'Sunday', 
     Index: 'First' }, 
    Range: 
    { Type: 'NoEnd', 
     StartDate: '2016-09-12', 
     EndDate: '0001-01-01', 
     RecurrenceTimeZone: 'FLE Standard Time', 
     NumberOfOccurrences: 0 } }, 

И все данные этого события (идентификатор получил от уведомления):

{ '@odata.context': 'https://outlook.office.com/api/v2.0/$metadata#Users(\'2ce6a929-0b04-40fb-9c73-d812370e0d46%40ea38f869-d755-40c7-9c95-e6277325b7ae\')/Events/$entity', 
    '@odata.id': 'https://outlook.office.com/api/v2.0/Users(\'[email protected]77325b7ae\')/Events(\'AAMkADg5YzZmNTViLWM3NjEtNGI4Mi04Yjg4LTkyOWQ4NjFjM2QzOABGAAAAAAATT-M8JoV8TI5B1BhmG2N_BwBi3Yqq_sjMSYdHHux_aUXFAAAAAAFZAABi3Yqq_sjMSYdHHux_aUXFAAAMNRbUAAA=\')', 
    '@odata.etag': 'W/"Yt2KqvrIzEmHRx7sfmlFxQAADDdF3g=="', 
    Id: 'AAMkADg5YzZmNTViLWM3NjEtNGI4Mi04Yjg4LTkyOWQ4NjFjM2QzOABGAAAAAAATT-M8JoV8TI5B1BhmG2N_BwBi3Yqq_sjMSYdHHux_aUXFAAAAAAFZAABi3Yqq_sjMSYdHHux_aUXFAAAMNRbUAAA=', 
    CreatedDateTime: '2016-09-13T03:55:43.5305953-02:00', 
    LastModifiedDateTime: '2016-09-13T03:55:43.5476101-02:00', 
    ChangeKey: 'Yt2KqvrIzEmHRx7sfmlFxQAADDdF3g==', 
    Categories: [], 
    OriginalStartTimeZone: 'FLE Standard Time', 
    OriginalEndTimeZone: 'FLE Standard Time', 
    ResponseStatus: { Response: 'Organizer', Time: '0001-01-01T00:00:00Z' }, 
    iCalUId: '040000008200E00074C5B7101A82E00800000000F9B6FC76830DD2010000000000000000100000005D7D5B0B8D1EA84E86C8AEE4014697CA', 
    ReminderMinutesBeforeStart: 15, 
    IsReminderOn: true, 
    HasAttachments: false, 
    Subject: 'standup meeting', 
    Body: 
    { ContentType: 'HTML', 
    Content: '<html>\r\n<head>\r\n<meta http-equiv="Content-Type" content="text/html; charset=utf-8">\r\n<meta content="text/html; charset=us-ascii">\r\n<style type="text/css" style="display:none">\r\n<!--\r\np\r\n\t{margin-top:0;\r\n\tmargin-bottom:0}\r\n-->\r\n</style>\r\n</head>\r\n<body dir="ltr">\r\n<div id="divtagdefaultwrapper" style="font-size:12pt; color:#000000; background-color:#FFFFFF; font-family:Calibri,Arial,Helvetica,sans-serif">\r\n<p><br>\r\n</p>\r\n</div>\r\n</body>\r\n</html>\r\n' }, 
    BodyPreview: '', 
    Importance: 'Normal', 
    Sensitivity: 'Normal', 
    Start: 
    { DateTime: '2016-09-12T03:00:00.0000000', 
    TimeZone: 'Etc/GMT+2' }, 
    End: 
    { DateTime: '2016-09-12T03:30:00.0000000', 
    TimeZone: 'Etc/GMT+2' }, 
    Location: { DisplayName: '', Address: {}, Coordinates: {} }, 
    IsAllDay: false, 
    IsCancelled: false, 
    IsOrganizer: true, 
    Recurrence: 
    { Pattern: 
     { Type: 'Weekly', 
     Interval: 1, 
     Month: 0, 
     DayOfMonth: 0, 
     DaysOfWeek: [ 'Monday' ], 
     FirstDayOfWeek: 'Sunday', 
     Index: 'First' }, 
    Range: 
     { Type: 'NoEnd', 
     StartDate: '2016-09-12', 
     EndDate: '0001-01-01', 
     RecurrenceTimeZone: 'FLE Standard Time', 
     NumberOfOccurrences: 0 } }, 
    ResponseRequested: false, 
    SeriesMasterId: null, 
    ShowAs: 'Busy', 
    Type: 'SeriesMaster', 
    Attendees: [], 
    Organizer: 
    { EmailAddress: 
     { Name: 'John Smith', 
     Address: '[email protected]' } }, 
    WebLink: 'https://outlook.office365.com/owa/?ItemID=AAMkADg5YzZmNTViLWM3NjEtNGI4Mi04Yjg4LTkyOWQ4NjFjM2QzOABGAAAAAAATT%2FM8JoV8TI5B1BhmG2N%2BBwBi3Yqq%2BsjMSYdHHux%2BaUXFAAAAAAFZAABi3Yqq%2BsjMSYdHHux%2BaUXFAAAMNRbUAAA%3D&exvsurl=1&viewModel=ICalendarItemDetailsViewModelFactory', 
    '[email protected]': 'https://outlook.office.com/api/v2.0/Users(\'[email protected]77325b7ae\')/Calendars(\'AAMkADg5YzZmNTViLWM3NjEtNGI4Mi04Yjg4LTkyOWQ4NjFjM2QzOABGAAAAAAATT-M8JoV8TI5B1BhmG2N_BwBi3Yqq_sjMSYdHHux_aUXFAAAAAAEGAABi3Yqq_sjMSYdHHux_aUXFAAAAAA0jAAA=\')/$ref', 
    '[email protected]': 'https://outlook.office.com/api/v2.0/Users(\'[email protected]77325b7ae\')/Calendars(\'AAMkADg5YzZmNTViLWM3NjEtNGI4Mi04Yjg4LTkyOWQ4NjFjM2QzOABGAAAAAAATT-M8JoV8TI5B1BhmG2N_BwBi3Yqq_sjMSYdHHux_aUXFAAAAAAEGAABi3Yqq_sjMSYdHHux_aUXFAAAAAA0jAAA=\')' } 

Это вполне нормально. Проблема возникает, когда я удаляю одно событие этого события в календаре. Мое приложение получает уведомление с ChangeType: Updated, и тело этого уведомления почти такое же, как и при создании события. Нет информации о том, в какой день это событие было отменено.

Данные события, когда EVENTID получил от ChangeType: Updated уведомления:

{ '@odata.context': 'https://outlook.office.com/api/v2.0/$metadata#Users(\'2ce6a929-0b04-40fb-9c73-d812370e0d46%40ea38f869-d755-40c7-9c95-e6277325b7ae\')/Events/$entity', 
    '@odata.id': 'https://outlook.office.com/api/v2.0/Users(\'[email protected]77325b7ae\')/Events(\'AAMkADg5YzZmNTViLWM3NjEtNGI4Mi04Yjg4LTkyOWQ4NjFjM2QzOABGAAAAAAATT-M8JoV8TI5B1BhmG2N_BwBi3Yqq_sjMSYdHHux_aUXFAAAAAAFZAABi3Yqq_sjMSYdHHux_aUXFAAAMNRbUAAA=\')', 
    '@odata.etag': 'W/"Yt2KqvrIzEmHRx7sfmlFxQAADDdF3w=="', 
    Id: 'AAMkADg5YzZmNTViLWM3NjEtNGI4Mi04Yjg4LTkyOWQ4NjFjM2QzOABGAAAAAAATT-M8JoV8TI5B1BhmG2N_BwBi3Yqq_sjMSYdHHux_aUXFAAAAAAFZAABi3Yqq_sjMSYdHHux_aUXFAAAMNRbUAAA=', 
    CreatedDateTime: '2016-09-13T03:55:43.5305953-02:00', 
    LastModifiedDateTime: '2016-09-13T03:57:48.2229052-02:00', 
    ChangeKey: 'Yt2KqvrIzEmHRx7sfmlFxQAADDdF3w==', 
    Categories: [], 
    OriginalStartTimeZone: 'FLE Standard Time', 
    OriginalEndTimeZone: 'FLE Standard Time', 
    ResponseStatus: { Response: 'Organizer', Time: '0001-01-01T00:00:00Z' }, 
    iCalUId: '040000008200E00074C5B7101A82E00800000000F9B6FC76830DD2010000000000000000100000005D7D5B0B8D1EA84E86C8AEE4014697CA', 
    ReminderMinutesBeforeStart: 15, 
    IsReminderOn: true, 
    HasAttachments: false, 
    Subject: 'standup meeting', 
    Body: 
    { ContentType: 'HTML', 
    Content: '<html>\r\n<head>\r\n<meta http-equiv="Content-Type" content="text/html; charset=utf-8">\r\n<meta content="text/html; charset=us-ascii">\r\n<style type="text/css" style="display:none">\r\n<!--\r\np\r\n\t{margin-top:0;\r\n\tmargin-bottom:0}\r\n-->\r\n</style>\r\n</head>\r\n<body dir="ltr">\r\n<div id="divtagdefaultwrapper" style="font-size:12pt; color:#000000; background-color:#FFFFFF; font-family:Calibri,Arial,Helvetica,sans-serif">\r\n<p><br>\r\n</p>\r\n</div>\r\n</body>\r\n</html>\r\n' }, 
    BodyPreview: '', 
    Importance: 'Normal', 
    Sensitivity: 'Normal', 
    Start: 
    { DateTime: '2016-09-12T03:00:00.0000000', 
    TimeZone: 'Etc/GMT+2' }, 
    End: 
    { DateTime: '2016-09-12T03:30:00.0000000', 
    TimeZone: 'Etc/GMT+2' }, 
    Location: { DisplayName: '', Address: {}, Coordinates: {} }, 
    IsAllDay: false, 
    IsCancelled: false, 
    IsOrganizer: true, 
    Recurrence: 
    { Pattern: 
     { Type: 'Weekly', 
     Interval: 1, 
     Month: 0, 
     DayOfMonth: 0, 
     DaysOfWeek: [ 'Monday' ], 
     FirstDayOfWeek: 'Sunday', 
     Index: 'First' }, 
    Range: 
     { Type: 'NoEnd', 
     StartDate: '2016-09-12', 
     EndDate: '0001-01-01', 
     RecurrenceTimeZone: 'FLE Standard Time', 
     NumberOfOccurrences: 0 } }, 
    ResponseRequested: false, 
    SeriesMasterId: null, 
    ShowAs: 'Busy', 
    Type: 'SeriesMaster', 
    Attendees: [], 
    Organizer: 
    { EmailAddress: 
     { Name: 'John Smith', 
     Address: '[email protected]' } }, 
    WebLink: 'https://outlook.office365.com/owa/?ItemID=AAMkADg5YzZmNTViLWM3NjEtNGI4Mi04Yjg4LTkyOWQ4NjFjM2QzOABGAAAAAAATT%2FM8JoV8TI5B1BhmG2N%2BBwBi3Yqq%2BsjMSYdHHux%2BaUXFAAAAAAFZAABi3Yqq%2BsjMSYdHHux%2BaUXFAAAMNRbUAAA%3D&exvsurl=1&viewModel=ICalendarItemDetailsViewModelFactory', 
    '[email protected]': 'https://outlook.office.com/api/v2.0/Users(\'[email protected]77325b7ae\')/Calendars(\'AAMkADg5YzZmNTViLWM3NjEtNGI4Mi04Yjg4LTkyOWQ4NjFjM2QzOABGAAAAAAATT-M8JoV8TI5B1BhmG2N_BwBi3Yqq_sjMSYdHHux_aUXFAAAAAAEGAABi3Yqq_sjMSYdHHux_aUXFAAAAAA0jAAA=\')/$ref', 
    '[email protected]': 'https://outlook.office.com/api/v2.0/Users(\'[email protected]77325b7ae\')/Calendars(\'AAMkADg5YzZmNTViLWM3NjEtNGI4Mi04Yjg4LTkyOWQ4NjFjM2QzOABGAAAAAAATT-M8JoV8TI5B1BhmG2N_BwBi3Yqq_sjMSYdHHux_aUXFAAAAAAEGAABi3Yqq_sjMSYdHHux_aUXFAAAAAA0jAAA=\')' } 

Вот изображение, чтобы выяснить, что я точно сделал в календаре: enter image description here

Можете ли вы сказать мне, как знать, появление этого события было удалено?

Это, кажется, тупик, поэтому любая помощь будет оценена по достоинству.

Просто FYI: повторяющееся событие имеет только один EVENTID и удаление одного вхождения повторяющегося события не отправлять уведомление с ChangeType: DELETED

+0

Вы можете добавить точный результат 'ChangeType: Updated', что вы получаете, когда вы удалите одно вхождение? – jehna1

+0

@ jehna1 Добавлены данные о событиях после создания и после обновления. – lehtu

+0

Я знаю, что это было какое-то время, но помогает ли вам этот ответ? http://stackoverflow.com/questions/30484910/modifying-single-occurrence-from-recurring-series-is-not-reflected-in-the-data-r/30508731#30508731 –

ответ

1

К сожалению, API в настоящее время не позволяет вам знать, появление было удалено. Когда вы удаляете одно вхождение, оно, однако, запускает обновление на SeriesMaster. Когда это обновление поступит, вам нужно будет рассчитать, когда все встречи должны произойти, а затем получить все вхождения. После итерации через вхождения вы можете определить, какое событие было удалено из вашего более раннего расчета. Поскольку ваша встреча повторяется еженедельно навсегда, вы захотите ограничить свой таймер, от которого вы запрашиваете вхождения.

При использовании Python я настоятельно рекомендую пакет dateutil, который поставляется с удобным классом rrule: https://dateutil.readthedocs.io/en/stable/rrule.html

+0

Итак, вы имеете в виду, что у меня есть для получения всех событий в эти даты, когда я предполагаю, что повторяющееся событие должно произойти, а затем совпадать, если это событие существует в эти дни? – lehtu

+0

Я думаю, что понял, и это правильно, но чтобы убедиться, что здесь следующие шаги: 1. Получив обновление повторяющейся встречи (SeriesMaster), вычислите все ожидаемые события, посмотрев на SeriesMaster [ рецидивы "]. 2. Собственно получить все вхождения, выполнив запрос GET в/me/events/{event_id}/экземпляры? StartDateTime = {start_datetime} & endDateTime = {end_datetime} 3.Сравните список, возвращенный в 2, в список, который вы вычислили в 1. Любые отсутствующие вхождения из вашего второго списка - это события, которые были удалены. – MercuryMan