From d761a73ad005b537354271396ba088c3fcfffceb Mon Sep 17 00:00:00 2001 From: Didier Date: Wed, 29 Apr 2020 08:31:44 +0000 Subject: [PATCH] [IMP] website_slides: improve archive management PURPOSE Archiving a course should also archive its content, and unpublish it as it should not be accessible from outside. Improve archive / publish management between a course and its slides. SPECIFICATIONS Show the content of an archived course having archived slides. When slides and course are archived its content should still be displayed. This is done using an active test in context of field. Propagate channel archive to content. Also unpublish archived slides. LINKS Continuity/IMP of task-2170708 Task-2225598 closes odoo/odoo#52233 Signed-off-by: Thibault Delavallee (tde) --- addons/website_slides/models/slide_channel.py | 3 ++- addons/website_slides/models/slide_slide.py | 8 ++++++++ .../website_slides/tests/test_slide_utils.py | 18 ++++++++++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/addons/website_slides/models/slide_channel.py b/addons/website_slides/models/slide_channel.py index 5006320f52a..fc9af7d1812 100644 --- a/addons/website_slides/models/slide_channel.py +++ b/addons/website_slides/models/slide_channel.py @@ -105,7 +105,7 @@ class Channel(models.Model): 'slide.channel.tag', 'slide_channel_tag_rel', 'channel_id', 'tag_id', string='Tags', help='Used to categorize and filter displayed channels/courses') # slides: promote, statistics - slide_ids = fields.One2many('slide.slide', 'channel_id', string="Slides and categories") + slide_ids = fields.One2many('slide.slide', 'channel_id', string="Slides and categories", context={'active_test': False}) slide_content_ids = fields.One2many('slide.slide', string='Slides', compute="_compute_category_and_slide_ids") slide_category_ids = fields.One2many('slide.slide', string='Categories', compute="_compute_category_and_slide_ids") slide_last_update = fields.Date('Last Update', compute='_compute_slide_last_update', store=True) @@ -428,6 +428,7 @@ class Channel(models.Model): to_activate = self.filtered(lambda channel: not channel.active) res = super(Channel, self).toggle_active() if to_archive: + to_archive.is_published = False to_archive.mapped('slide_ids').action_archive() if to_activate: to_activate.with_context(active_test=False).mapped('slide_ids').action_unarchive() diff --git a/addons/website_slides/models/slide_slide.py b/addons/website_slides/models/slide_slide.py index 5c4596db921..13d65b6ad7e 100644 --- a/addons/website_slides/models/slide_slide.py +++ b/addons/website_slides/models/slide_slide.py @@ -466,6 +466,14 @@ class Slide(models.Model): category.channel_id._move_category_slides(category, False) super(Slide, self).unlink() + def toggle_active(self): + # archiving/unarchiving a channel does it on its slides, too + to_archive = self.filtered(lambda slide: slide.active) + res = super(Slide, self).toggle_active() + if to_archive: + to_archive.filtered(lambda slide: not slide.is_category).is_published = False + return res + # --------------------------------------------------------- # Mail/Rating # --------------------------------------------------------- diff --git a/addons/website_slides/tests/test_slide_utils.py b/addons/website_slides/tests/test_slide_utils.py index b4e58b0bbfd..6510b26cbd0 100644 --- a/addons/website_slides/tests/test_slide_utils.py +++ b/addons/website_slides/tests/test_slide_utils.py @@ -23,6 +23,24 @@ class TestSlidesManagement(slides_common.SlidesCase): self.assertEqual(categorized_slides[2]['total_slides'], 0) self.assertEqual(categorized_slides[2]['category'], new_category) + @users('user_manager') + def test_archive(self): + self.assertTrue(self.channel.active) + self.assertTrue(self.channel.is_published) + for slide in self.channel.slide_ids: + self.assertTrue(slide.active, "All slide should be archived when a channel is archived") + self.assertTrue(slide.is_published, "All slide should be unpublished when a channel is archived") + + self.channel.toggle_active() + self.assertFalse(self.channel.active) + self.assertFalse(self.channel.is_published) + + for slide in self.channel.slide_ids: + self.assertFalse(slide.active, "All slides should be archived when a channel is archived") + if not slide.is_category: + self.assertFalse(slide.is_published, "All slides should be unpublished when a channel is archived, except categories") + else: + self.assertTrue(slide.is_published, "All slides should be unpublished when a channel is archived, except categories") class TestSequencing(slides_common.SlidesCase):