diff options
| author | jbm-odoo <jbm@odoo.com> | 2020-04-21 13:08:35 +0000 |
|---|---|---|
| committer | jbm-odoo <jbm@odoo.com> | 2020-08-05 13:47:42 +0000 |
| commit | 9dc3057e8eb82d9237457167641585655f249c3e (patch) | |
| tree | 11975a957335d9dd3ce7f2dc0844fa8b5e7acff3 /addons/calendar/models | |
| parent | 78ef2ec8134b09d9732849a11ff8d9e1ac886bb5 (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.py | 9 | ||||
| -rw-r--r-- | addons/calendar/models/calendar_recurrence.py | 19 |
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) |
