Skip to content

Commit bccdf65

Browse files
committed
[FIX] mail: portal user access error on init
closes odoo#114478 X-original-commit: 012dae6 Signed-off-by: Sébastien Theys (seb) <seb@odoo.com>
1 parent e46d685 commit bccdf65

File tree

4 files changed

+47
-4
lines changed

4 files changed

+47
-4
lines changed

addons/mail/models/mail_channel.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -748,7 +748,7 @@ def channel_info(self):
748748
[('guest_id', '=', current_guest.id) if current_guest else expression.FALSE_LEAF],
749749
])
750750
all_needed_members = self.env['mail.channel.member'].search(expression.AND([[('channel_id', 'in', self.ids)], all_needed_members_domain]), order='id')
751-
all_needed_members.partner_id.mail_partner_format() # prefetch in batch
751+
all_needed_members.partner_id.sudo().mail_partner_format() # prefetch in batch
752752
members_by_channel = defaultdict(lambda: self.env['mail.channel.member'])
753753
invited_members_by_channel = defaultdict(lambda: self.env['mail.channel.member'])
754754
member_of_current_user_by_channel = defaultdict(lambda: self.env['mail.channel.member'])

addons/mail/models/mail_channel_member.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ def _mail_channel_member_format(self, fields=None):
151151
if member.partner_id:
152152
persona = {'partner': member._get_partner_data(fields=fields.get('persona', {}).get('partner'))}
153153
if member.guest_id:
154-
persona = {'guest': member.guest_id._guest_format(fields=fields.get('persona', {}).get('guest')).get(member.guest_id)}
154+
persona = {'guest': member.guest_id.sudo()._guest_format(fields=fields.get('persona', {}).get('guest')).get(member.guest_id)}
155155
data['persona'] = persona
156156
members_formatted_data[member] = data
157157
return members_formatted_data

addons/mail/models/res_partner.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ def mail_partner_format(self, fields=None):
129129
"id": main_user.id,
130130
"isInternalUser": not main_user.share,
131131
} if main_user else [('clear',)]
132-
if 'guest' in self.env.context:
132+
if 'guest' in self.env.context or not self.env.user._is_internal():
133133
data.pop('email', None)
134134
partners_format[partner] = data
135135
return partners_format

addons/mail/tests/test_mail_channel_as_guest.py

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
import odoo
55
from odoo.tests import HttpCase
6-
6+
from odoo.addons.mail.tests.common import mail_new_test_user
77

88
@odoo.tests.tagged('-at_install', 'post_install')
99
class TestMailPublicPage(HttpCase):
@@ -12,7 +12,30 @@ class TestMailPublicPage(HttpCase):
1212

1313
def setUp(self):
1414
super().setUp()
15+
portal_user = mail_new_test_user(
16+
self.env,
17+
name='Portal Bowser',
18+
login='portal_bowser',
19+
email='portal_bowser@example.com',
20+
groups='base.group_portal',
21+
)
22+
internal_user = mail_new_test_user(
23+
self.env,
24+
name='Internal Luigi',
25+
login='internal_luigi',
26+
email='internal_luigi@example.com',
27+
groups='base.group_user',
28+
)
29+
guest = self.env['mail.guest'].create({'name': 'Guest Mario'})
30+
1531
self.channel = self.env['mail.channel'].browse(self.env['mail.channel'].channel_create(group_id=None, name='Test channel')['id'])
32+
self.channel.add_members(portal_user.partner_id.ids)
33+
self.channel.add_members(internal_user.partner_id.ids)
34+
self.channel.add_members(guest_ids=[guest.id])
35+
36+
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'])
37+
self.group.add_members(guest_ids=[guest.id])
38+
1639
self.tour = "mail/static/tests/tours/discuss_public_tour.js"
1740

1841
def _open_channel_page_as_user(self, login):
@@ -21,16 +44,36 @@ def _open_channel_page_as_user(self, login):
2144
# the channel, so we need to run it again to test different parts of the code.
2245
self.start_tour(self.channel.invitation_url, self.tour, login=login)
2346

47+
def _open_group_page_as_user(self, login):
48+
self.start_tour(self.group.invitation_url, self.tour, login=login)
49+
# Second run of the tour as the first call has side effects, like creating user settings or adding members to
50+
# the channel, so we need to run it again to test different parts of the code.
51+
self.start_tour(self.group.invitation_url, self.tour, login=login)
52+
2453
def test_mail_channel_public_page_as_admin(self):
2554
self._open_channel_page_as_user('admin')
2655

56+
def test_mail_group_public_page_as_admin(self):
57+
self._open_group_page_as_user('admin')
58+
2759
def test_mail_channel_public_page_as_guest(self):
2860
self.start_tour(self.channel.invitation_url, "mail/static/tests/tours/mail_channel_as_guest_tour.js")
2961
guest = self.env['mail.guest'].search([('channel_ids', 'in', self.channel.id)], limit=1, order='id desc')
3062
self.start_tour(self.channel.invitation_url, self.tour, cookies={guest._cookie_name: f"{guest.id}{guest._cookie_separator}{guest.access_token}"})
3163

64+
def test_mail_group_public_page_as_guest(self):
65+
self.start_tour(self.group.invitation_url, "mail/static/tests/tours/mail_channel_as_guest_tour.js")
66+
guest = self.env['mail.guest'].search([('channel_ids', 'in', self.channel.id)], limit=1, order='id desc')
67+
self.start_tour(self.group.invitation_url, self.tour, cookies={guest._cookie_name: f"{guest.id}{guest._cookie_separator}{guest.access_token}"})
68+
3269
def test_mail_channel_public_page_as_internal(self):
3370
self._open_channel_page_as_user('demo')
3471

72+
def test_mail_group_public_page_as_internal(self):
73+
self._open_group_page_as_user('demo')
74+
3575
def test_mail_channel_public_page_as_portal(self):
3676
self._open_channel_page_as_user('portal')
77+
78+
def test_mail_group_public_page_as_portal(self):
79+
self._open_group_page_as_user('portal')

0 commit comments

Comments
 (0)