[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 <arj@odoo.com>
This commit is contained in:
Rémy Baranx (bar)
2021-12-23 08:44:38 +00:00
committed by Arnaud Joset
parent c011c5464a
commit 828e6468fe
3 changed files with 30 additions and 2 deletions
+3 -1
View File
@@ -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(':')
+5 -1
View File
@@ -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()
+22
View File
@@ -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",