diff --git a/addons/website_slides/models/slide_slide.py b/addons/website_slides/models/slide_slide.py index add1f83bbe5..a74d134205a 100644 --- a/addons/website_slides/models/slide_slide.py +++ b/addons/website_slides/models/slide_slide.py @@ -659,6 +659,7 @@ class Slide(models.Model): if slide.is_published and not slide.is_category: slide._post_publication() + slide.channel_id.channel_partner_ids._recompute_completion() return slides def write(self, values): @@ -686,8 +687,8 @@ class Slide(models.Model): }) if 'is_published' in values or 'active' in values: - # if the slide is published/unpublished, recompute the completion for the partners - self.slide_partner_ids._recompute_completion() + # recompute the completion for all partners of the channel + self.channel_id.channel_partner_ids._recompute_completion() return res @@ -702,7 +703,10 @@ class Slide(models.Model): def unlink(self): for category in self.filtered(lambda slide: slide.is_category): category.channel_id._move_category_slides(category, False) - return super().unlink() + channel_partner_ids = self.channel_id.channel_partner_ids + res = super(Slide, self).unlink() + channel_partner_ids._recompute_completion() + return res def toggle_active(self): # archiving/unarchiving a channel does it on its slides, too diff --git a/addons/website_slides/tests/test_statistics.py b/addons/website_slides/tests/test_statistics.py index 7e847156214..ab136671bf2 100644 --- a/addons/website_slides/tests/test_statistics.py +++ b/addons/website_slides/tests/test_statistics.py @@ -64,8 +64,13 @@ class TestChannelStatistics(common.SlidesCase): channel_publisher._action_add_members(self.user_emp.partner_id) channel_emp = self.channel.with_user(self.user_emp) + members = self.env['slide.channel.partner'].search([('channel_id', '=', self.channel.id)]) + member_emp = members.filtered(lambda m: m.partner_id == self.user_emp.partner_id) + member_publisher = members.filtered(lambda m: m.partner_id == self.user_officer.partner_id) + slides_emp = (self.slide | self.slide_2).with_user(self.user_emp) slides_emp.action_set_viewed() + self.assertEqual(member_emp.completion, 0) self.assertEqual(channel_emp.completion, 0) slides_emp.action_mark_completed() @@ -76,18 +81,80 @@ class TestChannelStatistics(common.SlidesCase): self.assertFalse(channel_emp.completed) self.slide_3.with_user(self.user_emp)._action_mark_completed() + self.assertEqual(member_emp.completion, 100) self.assertEqual(channel_emp.completion, 100) self.assertTrue(channel_emp.completed) + # The following tests should not update the completion for users that has already completed the course + self.slide_3.is_published = False + self.assertEqual(member_emp.completion, 100) self.assertEqual(channel_emp.completion, 100) self.assertTrue(channel_emp.completed) self.slide_3.is_published = True self.slide_3.active = False + self.assertEqual(member_emp.completion, 100) self.assertEqual(channel_emp.completion, 100) self.assertTrue(channel_emp.completed) + # Should update completion when slide is marked as completed + + self.assertEqual(member_publisher.completion, 0) + self.assertEqual(channel_publisher.completion, 0) + self.slide.with_user(self.user_officer).action_mark_completed() + self.assertEqual(member_publisher.completion, 50) + self.assertEqual(channel_publisher.completion, 50) + + # Should update completion when slide is (un)archived + self.slide_3.active = True + self.assertEqual(member_emp.completion, 100) + self.assertEqual(channel_emp.completion, 100) + self.assertEqual(member_publisher.completion, 33) + self.assertEqual(channel_publisher.completion, 33) + + # Should update completion when a new published slide is created + self.slide_4 = self.slide_3.copy({'is_published': True}) + self.assertEqual(member_emp.completion, 100) + self.assertEqual(channel_emp.completion, 100) + self.assertEqual(member_publisher.completion, 25) + self.assertEqual(channel_publisher.completion, 25) + + # Should update completion when slide is (un)published + self.slide_4.is_published = False + self.assertEqual(member_emp.completion, 100) + self.assertEqual(channel_emp.completion, 100) + self.assertEqual(member_publisher.completion, 33) + self.assertEqual(channel_publisher.completion, 33) + + self.slide_4.is_published = True + self.assertEqual(member_emp.completion, 100) + self.assertEqual(channel_emp.completion, 100) + self.assertEqual(member_publisher.completion, 25) + self.assertEqual(channel_publisher.completion, 25) + + # Should update completion when a slide is unlinked + self.slide_4.with_user(self.user_manager).unlink() + self.assertEqual(member_emp.completion, 100) + self.assertEqual(channel_emp.completion, 100) + self.assertEqual(member_publisher.completion, 33) + self.assertEqual(channel_publisher.completion, 33) + + # Should update completion when slide is marked as uncompleted + slide_emp = self.slide.with_user(self.user_emp) + slide_emp.action_mark_uncompleted() + self.assertEqual(member_emp.completion, 100) + self.assertEqual(channel_emp.completion, 100) + self.assertTrue(channel_emp.completed) + self.assertFalse(slide_emp.user_membership_id.completed) + self.slide.invalidate_model(['user_has_completed']) + slide_publisher = self.slide.with_user(self.user_officer) + slide_publisher.action_mark_uncompleted() + self.assertEqual(member_publisher.completion, 0) + self.assertEqual(channel_publisher.completion, 0) + self.assertFalse(channel_publisher.completed) + self.assertFalse(slide_emp.user_membership_id.completed) + @mute_logger('odoo.models') def test_channel_user_statistics_complete_check_member(self): slides = (self.slide | self.slide_2)