diff --git a/addons/website_slides/models/slide_channel.py b/addons/website_slides/models/slide_channel.py index 34edaa95468..64d50c1edb3 100644 --- a/addons/website_slides/models/slide_channel.py +++ b/addons/website_slides/models/slide_channel.py @@ -412,14 +412,11 @@ class Channel(models.Model): compute='_compute_members_counts') members_completed_count = fields.Integer('# Completed Attendees', compute='_compute_members_counts') members_invited_count = fields.Integer('# Invited Attendees', compute='_compute_members_counts') - # partner_ids and partner_all_ids implemented as compute/search instead of specifying the relation table - # directly, this is done because we want to exclude active=False records on the joining table + # partner_ids is implemented as compute/search instead of specifying the relation table + # directly because we want to exclude active=False records on the joining table partner_ids = fields.Many2many( 'res.partner', string='Attendees', help="Enrolled partners in the course", compute="_compute_partners", search="_search_partner_ids") - partner_all_ids = fields.Many2many( - 'res.partner', string='All Attendees', help="Partners in the course (both enrolled and invited)", - compute="_compute_partners", search="_search_partner_all_ids") # not stored access fields, depending on each user completed = fields.Boolean('Done', compute='_compute_user_statistics', compute_sudo=False) completion = fields.Integer('Completion', compute='_compute_user_statistics', compute_sudo=False) @@ -468,18 +465,15 @@ class Channel(models.Model): @api.depends('channel_partner_all_ids', 'channel_partner_all_ids.member_status', 'channel_partner_all_ids.active') def _compute_partners(self): data = { - (slide_channel, member_status): partner_ids - for slide_channel, member_status, partner_ids in self.env['slide.channel.partner'].sudo()._read_group( - [('channel_id', 'in', self.ids)], - ['channel_id', 'member_status'], + slide_channel: partner_ids + for slide_channel, partner_ids in self.env['slide.channel.partner'].sudo()._read_group( + [('channel_id', 'in', self.ids), ('member_status', '!=', 'invited')], + ['channel_id'], aggregates=['partner_id:array_agg'] ) } - for slide_channel in self: - partner_ids = data.get((slide_channel, 'joined'), []) + data.get((slide_channel, 'ongoing'), []) + data.get((slide_channel, 'completed'), []) - slide_channel.partner_ids = partner_ids - slide_channel.partner_all_ids = partner_ids + data.get((slide_channel, 'invited'), []) + slide_channel.partner_ids = data.get(slide_channel, []) def _search_partner_ids(self, operator, value): if isinstance(value, int) and operator == 'in': @@ -492,16 +486,6 @@ class Channel(models.Model): ) )] - def _search_partner_all_ids(self, operator, value): - if isinstance(value, int) and operator == 'in': - value = [value] - return [( - 'channel_partner_all_ids', '=', self.env['slide.channel.partner']._search( - [('partner_id', operator, value), - ('active', '=', True)], - ) - )] - @api.depends('slide_ids.is_published') def _compute_slide_last_update(self): for record in self: @@ -1244,7 +1228,7 @@ class Channel(models.Model): slide_category = options.get('slide_category') domain = [website.website_domain()] if my: - domain.append([('partner_ids', '=', self.env.user.partner_id.id)]) + domain.append([('is_member', '=', True)]) if search_tags: ChannelTag = self.env['slide.channel.tag'] try: diff --git a/addons/website_slides/tests/test_attendee.py b/addons/website_slides/tests/test_attendee.py index 75857f38c63..3b667e30ada 100644 --- a/addons/website_slides/tests/test_attendee.py +++ b/addons/website_slides/tests/test_attendee.py @@ -169,7 +169,7 @@ class TestAttendee(common.SlidesCase): 'member_status': 'invited' }) - self.assertTrue(user_portal_partner.id in self.channel.partner_all_ids.ids) + self.assertTrue(user_portal_partner in self.channel.channel_partner_all_ids.partner_id) self.assertFalse(user_portal_partner.id in self.channel.partner_ids.ids) # Invited partner can join the course and enroll itself. Sudo is used in controller if invited. self.assertTrue(self.channel.with_user(self.user_portal).is_member_invited) @@ -192,7 +192,7 @@ class TestAttendee(common.SlidesCase): @users('user_officer') def test_partners_and_search_on_slide_channel(self): - ''' Check that partner_ids contains enrolled partners and partner_all_ids contains both invited and enrolled partners''' + ''' Check that partner_ids contains (only) active enrolled partners ''' invited_cp, joined_cp = self.env['slide.channel.partner'].create([{ 'channel_id': self.channel.id, 'partner_id': self.user_portal.partner_id.id, @@ -209,21 +209,25 @@ class TestAttendee(common.SlidesCase): joined_cp_channel_ids = self.env['slide.channel'].search([('partner_ids', '=', joined_cp.partner_id.id)]) self.assertTrue(self.channel in joined_cp_channel_ids) - # Search partner_all_ids on model - invited_cp_channel_ids = self.env['slide.channel'].search([('partner_all_ids', '=', invited_cp.partner_id.id)]) - self.assertTrue(self.channel in invited_cp_channel_ids) - joined_cp_channel_ids = self.env['slide.channel'].search([('partner_all_ids', '=', joined_cp.partner_id.id)]) - self.assertTrue(self.channel in joined_cp_channel_ids) - - # partner_ids should only contain enrolled channel partners partner_ids = self.channel.partner_ids self.assertFalse(invited_cp.partner_id in partner_ids) self.assertTrue(joined_cp.partner_id in partner_ids) - # partner_all_ids also contains invited channel partners. - partner_all_ids = self.channel.partner_all_ids - self.assertTrue(joined_cp.partner_id in partner_all_ids) - self.assertTrue(invited_cp.partner_id in partner_all_ids) + partner_ids = self.channel.partner_ids + self.assertFalse(invited_cp.partner_id in partner_ids) + self.assertTrue(joined_cp.partner_id in partner_ids) + + invited_cp.action_archive() + joined_cp.action_archive() + + partner_ids = self.channel.partner_ids + self.assertFalse(invited_cp.partner_id in partner_ids) + self.assertFalse(joined_cp.partner_id in partner_ids) + + invited_cp_channel_ids = self.env['slide.channel'].search([('partner_ids', '=', invited_cp.partner_id.id)]) + self.assertFalse(self.channel in invited_cp_channel_ids) + joined_cp_channel_ids = self.env['slide.channel'].search([('partner_ids', '=', joined_cp.partner_id.id)]) + self.assertFalse(self.channel in joined_cp_channel_ids) def test_copy_partner_not_course_member(self): """ To check members of the channel after duplication of contact """