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",