From 828e6468fe0650d45d858d3024398d780e08e006 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Baranx=20=28bar=29?= Date: Wed, 3 Nov 2021 10:49:37 +0000 Subject: [PATCH] [FIX] calendar: use given attendee states at event creation When an event is created from an external calendar account such as Google or Outlook, attendee info such as email and state may be given, and should be taken into account. For example, if the current user who is syncing his calendar is not the organizer of the event, his attendee state should be set to 'needsAction' and not automatically set to 'accepted'. opw-2489815 closes odoo/odoo#81636 X-original-commit: eb1adbd6af4b01a8b3b5b16dbf2d6c32eec852e6 Signed-off-by: Arnaud Joset --- addons/calendar/models/calendar_attendee.py | 4 +++- addons/calendar/models/calendar_event.py | 6 +++++- addons/calendar/tests/test_attendees.py | 22 +++++++++++++++++++++ 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/addons/calendar/models/calendar_attendee.py b/addons/calendar/models/calendar_attendee.py index 19148fd2ba6..dca29b1693e 100644 --- a/addons/calendar/models/calendar_attendee.py +++ b/addons/calendar/models/calendar_attendee.py @@ -57,7 +57,9 @@ class Attendee(models.Model): @api.model_create_multi def create(self, vals_list): for values in vals_list: - if not values.get('state') and values.get('partner_id') == self.env.user.partner_id.id: + # by default, if no state is given for the attendee corresponding to the current user + # that means he's the event organizer so we can set his state to "accepted" + if 'state' not in values and values.get('partner_id') == self.env.user.partner_id.id: values['state'] = 'accepted' if not values.get("email") and values.get("common_name"): common_nameval = values.get("common_name").split(':') diff --git a/addons/calendar/models/calendar_event.py b/addons/calendar/models/calendar_event.py index bb6230b7738..07ccd0ba0d1 100644 --- a/addons/calendar/models/calendar_event.py +++ b/addons/calendar/models/calendar_event.py @@ -389,10 +389,14 @@ class Meeting(models.Model): activity_vals['user_id'] = user_id values['activity_ids'] = [(0, 0, activity_vals)] + # Add commands to create attendees from partners (if present) if no attendee command + # is already given (coming from Google event for example). # Automatically add the current partner when creating an event if there is none (happens when we quickcreate an event) default_partners_ids = defaults.get('partner_ids') or ([(4, self.env.user.partner_id.id)]) vals_list = [ - dict(vals, attendee_ids=self._attendees_values(vals.get('partner_ids', default_partners_ids))) if not vals.get('attendee_ids') else vals + dict(vals, attendee_ids=self._attendees_values(vals.get('partner_ids', default_partners_ids))) + if not vals.get('attendee_ids') + else vals for vals in vals_list ] recurrence_fields = self._get_recurrent_fields() diff --git a/addons/calendar/tests/test_attendees.py b/addons/calendar/tests/test_attendees.py index 8abba50f986..48a9ef0ca2f 100644 --- a/addons/calendar/tests/test_attendees.py +++ b/addons/calendar/tests/test_attendees.py @@ -36,6 +36,28 @@ class TestEventNotifications(TransactionCase): self.assertEqual(event.attendee_ids.partner_id, self.partner, "It should be linked to the partner") self.assertIn(self.partner, event.message_follower_ids.partner_id, "He should be follower of the event") + def test_attendee_added_create_with_specific_states(self): + """ + When an event is created from an external calendar account (such as Google) which is not linked to an + Odoo account, attendee info such as email and state are given at sync. + In this case, attendee_ids should be created accordingly. + """ + organizer_partner = self.env['res.partner'].create({'name': "orga", "email": "orga@google.com"}) + event = self.env['calendar.event'].with_user(self.user).create({ + 'name': "Doom's day", + 'start': datetime(2019, 10, 25, 8, 0), + 'stop': datetime(2019, 10, 27, 18, 0), + 'attendee_ids': [ + (0, 0, {'partner_id': self.partner.id, 'state': 'needsAction'}), + (0, 0, {'partner_id': organizer_partner.id, 'state': 'accepted'}) + ], + 'partner_ids': [(4, self.partner.id), (4, organizer_partner.id)], + }) + attendees_info = [(a.email, a.state) for a in event.attendee_ids] + self.assertEqual(len(event.attendee_ids), 2) + self.assertIn((self.partner.email, "needsAction"), attendees_info) + self.assertIn((organizer_partner.email, "accepted"), attendees_info) + def test_attendee_added_multi(self): event = self.env['calendar.event'].create({ 'name': "Doom's day",