Add the possibility to stop/restart the synchronization with Outlook calendar. Change the calendar event popover in the calendar view to display an Archive button if event synced at least once. Add some tests for the new stop/restart feature. (PS: this is essentially the same commit as the one for the google_calendar module except for the JS popover and python tests).
111 lines
4.4 KiB
Python
111 lines
4.4 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
import re
|
|
|
|
from odoo import api, fields, models
|
|
|
|
from odoo.addons.microsoft_calendar.utils.microsoft_calendar import MicrosoftCalendarService
|
|
|
|
|
|
class RecurrenceRule(models.Model):
|
|
_name = 'calendar.recurrence'
|
|
_inherit = ['calendar.recurrence', 'microsoft.calendar.sync']
|
|
|
|
|
|
# Don't sync by default. Sync only when the recurrence is applied
|
|
need_sync_m = fields.Boolean(default=False)
|
|
|
|
microsoft_id = fields.Char('Microsoft Calendar Recurrence Id')
|
|
|
|
def _apply_recurrence(self, specific_values_creation=None, no_send_edit=False):
|
|
events = self.calendar_event_ids
|
|
detached_events = super()._apply_recurrence(specific_values_creation, no_send_edit)
|
|
|
|
microsoft_service = MicrosoftCalendarService(self.env['microsoft.service'])
|
|
|
|
# If a synced event becomes a recurrence, the event needs to be deleted from
|
|
# Microsoft since it's now the recurrence which is synced.
|
|
# Those events are kept in the database and their microsoft_id is updated
|
|
# according to the recurrence microsoft_id, therefore we need to keep an inactive copy
|
|
# of those events with the original microsoft_id. The next sync will then correctly
|
|
# delete those events from Microsoft.
|
|
vals = []
|
|
for event in events.filtered('microsoft_id'):
|
|
if event.active and event.microsoft_id and not event.recurrence_id.microsoft_id:
|
|
vals += [{
|
|
'name': event.name,
|
|
'microsoft_id': event.microsoft_id,
|
|
'start': event.start,
|
|
'stop': event.stop,
|
|
'active': False,
|
|
'need_sync_m': True,
|
|
}]
|
|
event._microsoft_delete(microsoft_service, event.microsoft_id)
|
|
event.microsoft_id = False
|
|
self.env['calendar.event'].create(vals)
|
|
|
|
if not no_send_edit:
|
|
for recurrence in self:
|
|
values = recurrence._microsoft_values(self._get_microsoft_synced_fields())
|
|
if not values:
|
|
continue
|
|
values = values[0]
|
|
if not recurrence.microsoft_id:
|
|
recurrence._microsoft_insert(microsoft_service, values)
|
|
else:
|
|
recurrence._microsoft_patch(microsoft_service, recurrence.microsoft_id, values)
|
|
|
|
self.calendar_event_ids.need_sync_m = False
|
|
return detached_events
|
|
|
|
def _write_events(self, values, dtstart=None):
|
|
# If only some events are updated, sync those events.
|
|
# If all events are updated, sync the recurrence instead.
|
|
values['need_sync_m'] = bool(dtstart)
|
|
if not dtstart:
|
|
self.need_sync_m = True
|
|
return super()._write_events(values, dtstart=dtstart)
|
|
|
|
def _get_microsoft_synced_fields(self):
|
|
return {'rrule'} | self.env['calendar.event']._get_microsoft_synced_fields()
|
|
|
|
@api.model
|
|
def _restart_microsoft_sync(self):
|
|
self.env['calendar.recurrence'].search(self._get_microsoft_sync_domain()).write({
|
|
'need_sync_m': True,
|
|
})
|
|
|
|
def _get_microsoft_sync_domain(self):
|
|
return [('calendar_event_ids.user_id', '=', self.env.user.id)]
|
|
|
|
def _cancel_microsoft(self):
|
|
self.calendar_event_ids._cancel_microsoft()
|
|
self.microsoft_id = False # Set to False to avoid error with unlink from microsoft and avoid to synchronize.
|
|
self.unlink()
|
|
|
|
@api.model
|
|
def _microsoft_to_odoo_values(self, microsoft_recurrence, default_reminders=(), default_values={}):
|
|
recurrence = microsoft_recurrence.get_recurrence()
|
|
|
|
return {
|
|
**recurrence,
|
|
'microsoft_id': microsoft_recurrence.id,
|
|
}
|
|
|
|
def _microsoft_values(self, fields_to_sync):
|
|
events = self.calendar_event_ids.sorted('start')
|
|
events_outliers = self.calendar_event_ids.filtered(lambda e: not e.follow_recurrence)
|
|
normal_event = (events - events_outliers)[:1] or events[:1]
|
|
if not normal_event:
|
|
return {}
|
|
values = [normal_event._microsoft_values(fields_to_sync, initial_values={'type': 'seriesMaster'})]
|
|
|
|
if self.microsoft_id:
|
|
values[0]['id'] = self.microsoft_id
|
|
for event in events_outliers:
|
|
event_value = event._microsoft_values(fields_to_sync)
|
|
values += [event_value]
|
|
|
|
return values
|