diff --git a/addons/website_slides/models/slide_channel.py b/addons/website_slides/models/slide_channel.py
index 74eed962226..34edaa95468 100644
--- a/addons/website_slides/models/slide_channel.py
+++ b/addons/website_slides/models/slide_channel.py
@@ -427,10 +427,10 @@ class Channel(models.Model):
has_requested_access = fields.Boolean(string='Access Requested', compute='_compute_has_requested_access', compute_sudo=False)
is_member = fields.Boolean(
string='Is Enrolled Attendee', help='Is the attendee actively enrolled.',
- compute='_compute_membership_values', compute_sudo=False)
+ compute='_compute_membership_values', search="_search_is_member")
is_member_invited = fields.Boolean(
string='Is Invited Attendee', help='Is the invitation for this attendee pending.',
- compute='_compute_membership_values', compute_sudo=False)
+ compute='_compute_membership_values', search="_search_is_member_invited")
partner_has_new_content = fields.Boolean(compute='_compute_partner_has_new_content', compute_sudo=False)
# karma generation
karma_gen_channel_rank = fields.Integer(string='Course ranked', default=5)
@@ -533,26 +533,43 @@ class Channel(models.Model):
for channel in self:
channel.has_requested_access = channel.id in requested_cids
- @api.depends('channel_partner_all_ids.partner_id', 'channel_partner_all_ids.member_status')
+ @api.depends('channel_partner_all_ids.partner_id', 'channel_partner_all_ids.member_status', 'channel_partner_all_ids.active')
@api.depends_context('uid')
- @api.model
def _compute_membership_values(self):
if self.env.user._is_public():
self.is_member = False
self.is_member_invited = False
return
-
- channel_partners = self.env['slide.channel.partner'].sudo().search([
- ('channel_id', 'in', self.ids),
- ('partner_id', '=', self.env.user.partner_id.id),
- ])
- active_channel_partners = channel_partners.filtered(
- lambda channel_partner: channel_partner.member_status != 'invited')
- invitation_pending_channels = (channel_partners - active_channel_partners).channel_id
- active_channels = active_channel_partners.channel_id
+ data = {
+ member_status: channel_ids
+ for member_status, channel_ids in self.env['slide.channel.partner'].sudo()._read_group(
+ [('partner_id', '=', self.env.user.partner_id.id), ('channel_id', 'in', self.ids), ('active', '=', True)],
+ ['member_status'], ['channel_id:array_agg']
+ )
+ }
+ active_channels_ids = data.get('joined', []) + data.get('ongoing', []) + data.get('completed', [])
+ invitation_pending_channels_ids = data.get('invited', [])
for channel in self:
- channel.is_member = channel in active_channels
- channel.is_member_invited = channel in invitation_pending_channels
+ channel.is_member = channel.id in active_channels_ids
+ channel.is_member_invited = channel.id in invitation_pending_channels_ids
+
+ def _search_is_member(self, operator, value):
+ if operator not in ['=', '!='] or not isinstance(value, bool):
+ raise NotImplementedError(_('Operation not supported'))
+ check_has_access = operator == '=' and value or operator == '!=' and not value
+ return [('id', 'in' if check_has_access else 'not in', self._search_is_member_channel_ids())]
+
+ def _search_is_member_invited(self, operator, value):
+ if operator not in ['=', '!='] or not isinstance(value, bool):
+ raise NotImplementedError(_('Operation not supported'))
+ check_has_access = operator == '=' and value or operator == '!=' and not value
+ return [('id', 'in' if check_has_access else 'not in', self._search_is_member_channel_ids(invited=True))]
+
+ def _search_is_member_channel_ids(self, invited=False):
+ return self.env['slide.channel.partner'].sudo()._read_group(
+ [('partner_id', '=', self.env.user.partner_id.id), ('member_status', '=' if invited else '!=', 'invited'), ('active', '=', True)],
+ aggregates=['channel_id:array_agg']
+ )[0][0]
@api.depends('slide_ids.is_category')
def _compute_category_and_slide_ids(self):
diff --git a/addons/website_slides/security/website_slides_security.xml b/addons/website_slides/security/website_slides_security.xml
index 9a7066b5980..bb787ab3235 100644
--- a/addons/website_slides/security/website_slides_security.xml
+++ b/addons/website_slides/security/website_slides_security.xml
@@ -49,7 +49,9 @@
('website_published', '=', True),
'|',
('visibility', 'in', ('public', 'connected')),
- ('partner_all_ids', '=', user.partner_id.id),
+ '|',
+ ('is_member_invited', '=', True),
+ ('is_member', '=', True),
]
@@ -142,11 +144,11 @@
'&',
'|',
('channel_id.visibility', 'in', ('public','connected')),
- ('channel_id.partner_all_ids', 'in', user.partner_id.ids),
+ ('channel_id.is_member_invited', '=', True),
'|',
('is_category', '=', True),
('is_preview', '=', True),
- ('channel_id.partner_ids', 'in', user.partner_id.ids),
+ ('channel_id.is_member', '=', True),
]
@@ -238,7 +240,7 @@
Resource: read restricted to channel members and channel responsible
- [('slide_id.channel_id.partner_ids', '=', user.partner_id.id)]
+ [('slide_id.channel_id.is_member', '=', True)]
diff --git a/addons/website_slides_forum/security/website_slides_forum_security.xml b/addons/website_slides_forum/security/website_slides_forum_security.xml
index 9b1dc50fc01..0f4c8595d23 100644
--- a/addons/website_slides_forum/security/website_slides_forum_security.xml
+++ b/addons/website_slides_forum/security/website_slides_forum_security.xml
@@ -14,7 +14,7 @@
('slide_channel_ids.website_published', '=', True),
'|',
('slide_channel_ids.visibility', 'in', ('public','connected')),
- ('slide_channel_ids.partner_ids', 'in', user.partner_id.id)
+ ('slide_channel_ids.is_member', '=', True)
]
@@ -40,7 +40,7 @@
('forum_id.slide_channel_ids.website_published', '=', True),
'|',
('forum_id.slide_channel_ids.visibility', 'in', ('public','connected')),
- ('forum_id.slide_channel_ids.partner_ids', 'in', user.partner_id.id)
+ ('forum_id.slide_channel_ids.is_member', '=', True)
]
@@ -66,7 +66,7 @@
('forum_id.slide_channel_ids.website_published', '=', True),
'|',
('forum_id.slide_channel_ids.visibility', 'in', ('public','connected')),
- ('forum_id.slide_channel_ids.partner_ids', 'in', user.partner_id.id)
+ ('forum_id.slide_channel_ids.is_member', '=', True)
]