[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:
committed by
Arnaud Joset
parent
c011c5464a
commit
828e6468fe
@@ -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(':')
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user