[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 <kba@odoo.com>
Signed-off-by: Arnaud Joset <arj@odoo.com>
This commit is contained in:
Arnaud Joset
2023-04-13 05:07:41 +02:00
parent 71a2c5a551
commit abdf22c9dc
2 changed files with 47 additions and 1 deletions
+5 -1
View File
@@ -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=()):
@@ -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()