summaryrefslogtreecommitdiff
path: root/addons/calendar/models
diff options
context:
space:
mode:
authorjbm-odoo <jbm@odoo.com>2020-04-21 13:08:35 +0000
committerjbm-odoo <jbm@odoo.com>2020-08-05 13:47:42 +0000
commit9dc3057e8eb82d9237457167641585655f249c3e (patch)
tree11975a957335d9dd3ce7f2dc0844fa8b5e7acff3 /addons/calendar/models
parent78ef2ec8134b09d9732849a11ff8d9e1ac886bb5 (diff)
[ADD] calendar_microsoft: Synchronize Microsoft calendar with Odoo
TaskID 2223219 closes odoo/odoo#54936 Related: odoo/upgrade#1557 Signed-off-by: Yannick Tivisse (yti) <yti@odoo.com>
Diffstat (limited to 'addons/calendar/models')
-rw-r--r--addons/calendar/models/calendar_event.py9
-rw-r--r--addons/calendar/models/calendar_recurrence.py19
2 files changed, 24 insertions, 4 deletions
diff --git a/addons/calendar/models/calendar_event.py b/addons/calendar/models/calendar_event.py
index e23561ffa0b..874c09c99f0 100644
--- a/addons/calendar/models/calendar_event.py
+++ b/addons/calendar/models/calendar_event.py
@@ -244,6 +244,7 @@ class Meeting(models.Model):
recurrency = fields.Boolean('Recurrent', help="Recurrent Event")
recurrence_id = fields.Many2one(
'calendar.recurrence', string="Recurrence Rule", index=True)
+ follow_recurrence = fields.Boolean(default=False) # Indicates if an event follows the recurrence, i.e. is not an exception
recurrence_update = fields.Selection([
('self_only', "This event"),
('future_events', "This and following events"),
@@ -559,7 +560,7 @@ class Meeting(models.Model):
recurrence_vals += [dict(values, base_event_id=event.id, calendar_event_ids=[(4, event.id)])]
elif future:
to_update |= event.recurrence_id._split_from(event, values)
- self.recurrency = True
+ self.write({'recurrency': True, 'follow_recurrence': True})
to_update |= self.env['calendar.recurrence'].create(recurrence_vals)
return to_update._apply_recurrence()
@@ -630,6 +631,10 @@ class Meeting(models.Model):
if 'partner_ids' in values:
values['attendee_ids'] = self._attendees_values(values['partner_ids'])
+ if (not recurrence_update_setting or recurrence_update_setting == 'self_only' and len(self) == 1) and 'follow_recurrence' not in values:
+ if any({field: values.get(field) for field in self.env['calendar.event']._get_time_fields() if field in values}):
+ values['follow_recurrence'] = False
+
previous_attendees = self.attendee_ids
recurrence_values = {field: values.pop(field) for field in self._get_recurrent_fields() if field in values}
@@ -702,9 +707,11 @@ class Meeting(models.Model):
recurring_vals = [vals for vals in vals_list if vals.get('recurrency')]
other_vals = [vals for vals in vals_list if not vals.get('recurrency')]
events = super().create(other_vals)
+
for vals in recurring_vals:
recurrence_values = {field: vals.pop(field) for field in recurrence_fields if field in vals}
+ vals['follow_recurrence'] = True
event = super().create(vals)
events |= event
if vals.get('recurrency'):
diff --git a/addons/calendar/models/calendar_recurrence.py b/addons/calendar/models/calendar_recurrence.py
index 18c4a20b6f0..6c5edfe839c 100644
--- a/addons/calendar/models/calendar_recurrence.py
+++ b/addons/calendar/models/calendar_recurrence.py
@@ -71,6 +71,7 @@ BYDAY_SELECTION = [
('1', 'First'),
('2', 'Second'),
('3', 'Third'),
+ ('4', 'Fourth'),
('-1', 'Last'),
]
@@ -184,23 +185,35 @@ class RecurrenceRule(models.Model):
ranges_to_create = (event_range for event_range in ranges if event_range not in existing_ranges)
return synced_events, ranges_to_create
- def _apply_recurrence(self):
+ def _apply_recurrence(self, specific_values_creation=None, no_send_edit=False):
"""Create missing events in the recurrence and detach events which no longer
follow the recurrence rules.
:return: detached events
"""
event_vals = []
keep = self.env['calendar.event']
+ if specific_values_creation is None:
+ specific_values_creation = {}
+
for recurrence in self.filtered('base_event_id'):
self.calendar_event_ids |= recurrence.base_event_id
event = recurrence.base_event_id or recurrence._get_first_event(include_outliers=False)
duration = event.stop - event.start
- ranges = set(recurrence._get_ranges(event.start, duration))
+ if specific_values_creation:
+ ranges = set([(x[1], x[2]) for x in specific_values_creation if x[0] == recurrence.id])
+ else:
+ ranges = set(recurrence._get_ranges(event.start, duration))
events_to_keep, ranges = recurrence._reconcile_events(ranges)
keep |= events_to_keep
[base_values] = event.copy_data()
- event_vals += [dict(base_values, start=start, stop=stop, recurrence_id=recurrence.id) for start, stop in ranges]
+ values = []
+ for start, stop in ranges:
+ value = dict(base_values, start=start, stop=stop, recurrence_id=recurrence.id, follow_recurrence=True)
+ if (recurrence.id, start, stop) in specific_values_creation:
+ value.update(specific_values_creation[(recurrence.id, start, stop)])
+ values += [value]
+ event_vals += values
events = self.calendar_event_ids - keep
detached_events = self._detach_events(events)