From abdf22c9dc71c35b56cb61aad5ceaaac6c683a2b Mon Sep 17 00:00:00 2001 From: Arnaud Joset Date: Fri, 17 Mar 2023 10:39:54 +0000 Subject: [PATCH] [FIX] google_calendar: keep partner order according to email order Before this commit, when an event was synced with internal and external users, the corresponding partners were merged like this: 1) partner corresponding to internal users 2) regular partner If the list of emails provided by google was in another order: regular partners then internal, there were an issue: ``` emails = [a.get('email') for a in google_attendees] # sorted by google, external then internal for example partners = self._get_sync_partner(emails) # always internal then external partners for attendee in zip(emails, partners, google_attendees): # we are associating the external email with internal partner # the external attendee is skipped because we take the user partner ``` This commit makes sure to return the partner is the order of the mails in _get_sync_partner. closes odoo/odoo#118355 X-original-commit: ae442c20878277da93feb8761f5ed556c0c735b2 Signed-off-by: Kevin Baptiste Signed-off-by: Arnaud Joset --- addons/google_calendar/models/google_sync.py | 6 ++- .../tests/test_sync_google2odoo.py | 42 +++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/addons/google_calendar/models/google_sync.py b/addons/google_calendar/models/google_sync.py index 2cfd5be4c82..da97e3151a3 100644 --- a/addons/google_calendar/models/google_sync.py +++ b/addons/google_calendar/models/google_sync.py @@ -298,7 +298,11 @@ class GoogleSync(models.AbstractModel): email not in [partner.email_normalized for partner in partners]] if remaining: partners += self.env['mail.thread']._mail_find_partner_from_emails(remaining, records=self, force_create=True, extra_domain=[('type', '!=', 'private')]) - return partners + unsorted_partners = self.env['res.partner'].browse([p.id for p in partners]) + # partners needs to be sorted according to the emails order provided by google + k = {value: idx for idx, value in enumerate(emails)} + result = unsorted_partners.sorted(key=lambda p: k.get(p.email_normalized, -1)) + return result @api.model def _odoo_values(self, google_event: GoogleEvent, default_reminders=()): diff --git a/addons/google_calendar/tests/test_sync_google2odoo.py b/addons/google_calendar/tests/test_sync_google2odoo.py index a0e2bd681cd..20a61a3a99f 100644 --- a/addons/google_calendar/tests/test_sync_google2odoo.py +++ b/addons/google_calendar/tests/test_sync_google2odoo.py @@ -1369,3 +1369,45 @@ class TestSyncGoogle2Odoo(TestSyncGoogle): self.assertEqual(event.partner_ids[0], event.attendee_ids[0].partner_id) self.assertEqual('accepted', event.attendee_ids[0].state) self.assertGoogleAPINotCalled() + + @patch_api + def test_partner_order(self): + self.private_partner.email = "internal_user@odoo.com" + self.private_partner.type = "contact" + user = self.env['res.users'].create({ + 'name': 'Test user Calendar', + 'login': self.private_partner.email, + 'partner_id': self.private_partner.id, + 'type': 'contact' + }) + values = { + 'id': 'oj44nep1ldf8a3ll02uip0c9aa', + 'description': 'Small mini desc', + 'organizer': {'email': 'internal_user@odoo.com'}, + 'summary': 'Pricing new update', + 'visibility': 'public', + 'attendees': [{ + 'displayName': 'Mitchell Admin', + 'email': self.public_partner.email, + 'responseStatus': 'needsAction' + }, { + 'displayName': 'Attendee', + 'email': self.private_partner.email, + 'responseStatus': 'needsAction', + 'self': True, + }, ], + 'reminders': {'useDefault': True}, + 'start': { + 'dateTime': '2020-01-13T16:55:00+01:00', + 'timeZone': 'Europe/Brussels' + }, + 'end': { + 'dateTime': '2020-01-13T19:55:00+01:00', + 'timeZone': 'Europe/Brussels' + }, + } + + self.env['calendar.event'].with_user(user)._sync_google2odoo(GoogleEvent([values])) + event = self.env['calendar.event'].search([('google_id', '=', values.get('id'))]) + self.assertEqual(2, len(event.partner_ids), "Two attendees and two partners should be associated to the event") + self.assertGoogleAPINotCalled()