[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:
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user