From 0cc3b3e6d3c5f63b96bcd673c8e076b050b653b5 Mon Sep 17 00:00:00 2001 From: Zelong Lin Date: Tue, 7 Mar 2023 09:19:03 +0000 Subject: [PATCH] [FIX] mail: portal user access error on init MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit closes odoo/odoo#114568 X-original-commit: bccdf65192140308d4661482a9dcb431cba8126a Signed-off-by: Sébastien Theys (seb) --- addons/mail/models/mail_channel.py | 2 +- addons/mail/models/mail_channel_member.py | 2 +- addons/mail/models/res_partner.py | 2 +- .../mail/tests/test_mail_channel_as_guest.py | 45 ++++++++++++++++++- 4 files changed, 47 insertions(+), 4 deletions(-) diff --git a/addons/mail/models/mail_channel.py b/addons/mail/models/mail_channel.py index ad29c900621..7d858e0b9eb 100644 --- a/addons/mail/models/mail_channel.py +++ b/addons/mail/models/mail_channel.py @@ -764,7 +764,7 @@ class Channel(models.Model): [('guest_id', '=', current_guest.id) if current_guest else expression.FALSE_LEAF], ]) all_needed_members = self.env['mail.channel.member'].search(expression.AND([[('channel_id', 'in', self.ids)], all_needed_members_domain]), order='id') - all_needed_members.partner_id.mail_partner_format() # prefetch in batch + all_needed_members.partner_id.sudo().mail_partner_format() # prefetch in batch members_by_channel = defaultdict(lambda: self.env['mail.channel.member']) invited_members_by_channel = defaultdict(lambda: self.env['mail.channel.member']) member_of_current_user_by_channel = defaultdict(lambda: self.env['mail.channel.member']) diff --git a/addons/mail/models/mail_channel_member.py b/addons/mail/models/mail_channel_member.py index fd4e147b7bf..121aa7c38d2 100644 --- a/addons/mail/models/mail_channel_member.py +++ b/addons/mail/models/mail_channel_member.py @@ -151,7 +151,7 @@ class ChannelMember(models.Model): if member.partner_id: persona = {'partner': member._get_partner_data(fields=fields.get('persona', {}).get('partner'))} if member.guest_id: - persona = {'guest': member.guest_id._guest_format(fields=fields.get('persona', {}).get('guest')).get(member.guest_id)} + persona = {'guest': member.guest_id.sudo()._guest_format(fields=fields.get('persona', {}).get('guest')).get(member.guest_id)} data['persona'] = persona members_formatted_data[member] = data return members_formatted_data diff --git a/addons/mail/models/res_partner.py b/addons/mail/models/res_partner.py index 6edb1893dac..e90fafaaee1 100644 --- a/addons/mail/models/res_partner.py +++ b/addons/mail/models/res_partner.py @@ -234,7 +234,7 @@ class Partner(models.Model): "id": main_user.id, "isInternalUser": not main_user.share, } if main_user else [('clear',)] - if 'guest' in self.env.context: + if 'guest' in self.env.context or not self.env.user._is_internal(): data.pop('email', None) partners_format[partner] = data return partners_format diff --git a/addons/mail/tests/test_mail_channel_as_guest.py b/addons/mail/tests/test_mail_channel_as_guest.py index 2f242e8fdc1..bc4c72acdee 100644 --- a/addons/mail/tests/test_mail_channel_as_guest.py +++ b/addons/mail/tests/test_mail_channel_as_guest.py @@ -3,7 +3,7 @@ import odoo from odoo.tests import HttpCase - +from odoo.addons.mail.tests.common import mail_new_test_user @odoo.tests.tagged('-at_install', 'post_install') class TestMailPublicPage(HttpCase): @@ -12,7 +12,30 @@ class TestMailPublicPage(HttpCase): def setUp(self): super().setUp() + portal_user = mail_new_test_user( + self.env, + name='Portal Bowser', + login='portal_bowser', + email='portal_bowser@example.com', + groups='base.group_portal', + ) + internal_user = mail_new_test_user( + self.env, + name='Internal Luigi', + login='internal_luigi', + email='internal_luigi@example.com', + groups='base.group_user', + ) + guest = self.env['mail.guest'].create({'name': 'Guest Mario'}) + self.channel = self.env['mail.channel'].browse(self.env['mail.channel'].channel_create(group_id=None, name='Test channel')['id']) + self.channel.add_members(portal_user.partner_id.ids) + self.channel.add_members(internal_user.partner_id.ids) + self.channel.add_members(guest_ids=[guest.id]) + + self.group = self.env['mail.channel'].browse(self.env['mail.channel'].create_group(partners_to=(internal_user + portal_user).partner_id.ids, name="Test group")['id']) + self.group.add_members(guest_ids=[guest.id]) + self.tour = "mail/static/tests/tours/discuss_public_tour.js" def _open_channel_page_as_user(self, login): @@ -21,16 +44,36 @@ class TestMailPublicPage(HttpCase): # the channel, so we need to run it again to test different parts of the code. self.start_tour(self.channel.invitation_url, self.tour, login=login) + def _open_group_page_as_user(self, login): + self.start_tour(self.group.invitation_url, self.tour, login=login) + # Second run of the tour as the first call has side effects, like creating user settings or adding members to + # the channel, so we need to run it again to test different parts of the code. + self.start_tour(self.group.invitation_url, self.tour, login=login) + def test_mail_channel_public_page_as_admin(self): self._open_channel_page_as_user('admin') + def test_mail_group_public_page_as_admin(self): + self._open_group_page_as_user('admin') + def test_mail_channel_public_page_as_guest(self): self.start_tour(self.channel.invitation_url, "mail/static/tests/tours/mail_channel_as_guest_tour.js") guest = self.env['mail.guest'].search([('channel_ids', 'in', self.channel.id)], limit=1, order='id desc') self.start_tour(self.channel.invitation_url, self.tour, cookies={guest._cookie_name: f"{guest.id}{guest._cookie_separator}{guest.access_token}"}) + def test_mail_group_public_page_as_guest(self): + self.start_tour(self.group.invitation_url, "mail/static/tests/tours/mail_channel_as_guest_tour.js") + guest = self.env['mail.guest'].search([('channel_ids', 'in', self.channel.id)], limit=1, order='id desc') + self.start_tour(self.group.invitation_url, self.tour, cookies={guest._cookie_name: f"{guest.id}{guest._cookie_separator}{guest.access_token}"}) + def test_mail_channel_public_page_as_internal(self): self._open_channel_page_as_user('demo') + def test_mail_group_public_page_as_internal(self): + self._open_group_page_as_user('demo') + def test_mail_channel_public_page_as_portal(self): self._open_channel_page_as_user('portal') + + def test_mail_group_public_page_as_portal(self): + self._open_group_page_as_user('portal')