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) ]