[FIX] google_calendar: chose internal users when portal and internal users share the same email

Before this commit, when two users shared the same mail, they were ordered by alphabetical order.
This commit makes sure that the internal user is preferred.

closes odoo/odoo#84805

X-original-commit: 992b7a00f8eb567aed730420d0d10fa476fb9dd7
Signed-off-by: Thibault Francois <tfr@odoo.com>
Signed-off-by: Arnaud Joset <arj@odoo.com>
This commit is contained in:
Arnaud Joset
2022-02-17 16:41:56 +00:00
parent 968cd5ff33
commit a67dc7e151
4 changed files with 43 additions and 3 deletions
+1 -1
View File
@@ -132,7 +132,7 @@ class Meeting(models.Model):
if google_event.exists(self.env):
existing_attendees = self.browse(google_event.odoo_id(self.env)).attendee_ids
attendees_by_emails = {tools.email_normalize(a.email): a for a in existing_attendees}
partners = self.env['mail.thread']._mail_find_partner_from_emails(emails, records=self, force_create=True)
partners = self._get_sync_partner(emails)
for attendee in zip(emails, partners, google_attendees):
email = attendee[0]
if email in attendees_by_emails:
@@ -92,7 +92,7 @@ class RecurrenceRule(models.Model):
# We update the attendee status for all events in the recurrence
google_attendees = gevent.attendees or []
emails = [a.get('email') for a in google_attendees]
partners = self.env['mail.thread']._mail_find_partner_from_emails(emails, records=self, force_create=True)
partners = self._get_sync_partner(emails)
existing_attendees = self.calendar_event_ids.attendee_ids
for attendee in zip(emails, partners, google_attendees):
email = attendee[0]
+12 -1
View File
@@ -9,7 +9,7 @@ import pytz
from dateutil.parser import parse
from odoo import api, fields, models, registry, _
from odoo.tools import ormcache_context
from odoo.tools import ormcache_context, email_normalize
from odoo.exceptions import UserError
from odoo.osv import expression
@@ -284,6 +284,17 @@ class GoogleSync(models.AbstractModel):
def _create_from_google(self, gevents, vals_list):
return self.create(vals_list)
@api.model
def _get_sync_partner(self, emails):
normalized_emails = [email_normalize(contact) for contact in emails if email_normalize(contact)]
user_partners = self.env['mail.thread']._mail_search_on_user(normalized_emails, extra_domain=[('share', '=', False)])
partners = [user_partner for user_partner in user_partners]
remaining = [email for email in normalized_emails if
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)
return partners
@api.model
def _odoo_values(self, google_event: GoogleEvent, default_reminders=()):
"""Implements this method to return a dict of Odoo values corresponding
@@ -1047,3 +1047,32 @@ class TestSyncGoogle2Odoo(TestSyncGoogle):
self.assertEqual(mails, ['odoobot@example.com'])
self.assertGoogleAPINotCalled()
def test_several_users_have_the_same_mail(self):
# We want to chose the internal user
user1 = new_test_user(self.env, login='test@example.com', groups='base.group_portal')
user2 = new_test_user(self.env, login='calendar-user2')
user2.partner_id.email = 'test@example.com'
user1.partner_id.name = "A First in alphabet"
user2.partner_id.name = "B Second in alphabet"
values = {
'id': "abcd",
'description': 'coucou',
"updated": self.now,
'organizer': {'email': 'odoobot@example.com', 'self': True},
'summary': False,
'visibility': 'public',
'attendees': [{'email': 'test@example.com', 'responseStatus': 'accepted'}, {'email': 'test2@example.com', 'responseStatus': 'accepted'}],
'reminders': {'useDefault': True},
'start': {
'dateTime': '2020-01-13T16:00:00+01:00',
'timeZone': 'Europe/Brussels'
},
'end': {
'dateTime': '2020-01-13T20:00:00+01:00',
'timeZone': 'Europe/Brussels'
},
}
event = self.env['calendar.event']._sync_google2odoo(GoogleEvent([values]))
new_partner = self.env['res.partner'].search([('email', '=', 'test2@example.com')])
self.assertEqual(event.partner_ids.ids, [user2.partner_id.id, new_partner.id], "The internal user should be chosen")