From 71233fa2cb8984b65f8e7ac55405fdbc054756a0 Mon Sep 17 00:00:00 2001 From: "Maruan Aguerdouh (magm)" Date: Fri, 2 Jun 2023 10:17:02 +0000 Subject: [PATCH] [FIX] website_slides: do not crash when deleting a slide Steps to reproduce: - Install the elearning module and go to a course not created by you. - Try to delete or add any slide. Note: the bug is not consistent it might happen for some courses and not for others. Issue: We get a traceback error when trying to modify anything about the slides in this course. Solution: Adding the `'channel_id.slide_ids.slide_ids'` dependece to the `_compute_category_id` will make the computation to take into account the changes on the slides. opw-3316697 closes odoo/odoo#128022 X-original-commit: 1d6f8f4c606ddb7f57acd7ef2a9f983d7de84a34 Signed-off-by: Thibault Delavallee (tde) --- addons/website_slides/models/slide_slide.py | 2 +- .../website_slides/tests/test_slide_slide.py | 36 +++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/addons/website_slides/models/slide_slide.py b/addons/website_slides/models/slide_slide.py index 0042d0b5363..bb9b8f3aab5 100644 --- a/addons/website_slides/models/slide_slide.py +++ b/addons/website_slides/models/slide_slide.py @@ -259,7 +259,7 @@ class Slide(models.Model): def _get_placeholder_filename(self, field): return self.channel_id._get_placeholder_filename(field) - @api.depends('channel_id.slide_ids.is_category', 'channel_id.slide_ids.sequence') + @api.depends('channel_id.slide_ids.is_category', 'channel_id.slide_ids.sequence', 'channel_id.slide_ids.slide_ids') def _compute_category_id(self): """ Will take all the slides of the channel for which the index is higher than the index of this category and lower than the index of the next category. diff --git a/addons/website_slides/tests/test_slide_slide.py b/addons/website_slides/tests/test_slide_slide.py index ddadfda9b1a..efc6a6fc463 100644 --- a/addons/website_slides/tests/test_slide_slide.py +++ b/addons/website_slides/tests/test_slide_slide.py @@ -9,6 +9,42 @@ from odoo.tools import mute_logger class TestSlideInternals(slides_common.SlidesCase): + def test_compute_category_completion_time(self): + """ + Check that we properly calculate the completion time of a course without error, after deleting a slide. + """ + self.category2 = self.env['slide.slide'].with_user(self.user_officer).create({ + 'name': 'Cooking Tips For Dieting', + 'channel_id': self.channel.id, + 'is_category': True, + 'is_published': True, + 'sequence': 5, + }) + self.slide_4 = self.env['slide.slide'].with_user(self.user_officer).create({ + 'name': 'Vegan Diet', + 'channel_id': self.channel.id, + 'slide_category': 'document', + 'is_published': True, + 'completion_time': 5.0, + 'sequence': 6, + }) + self.slide_5 = self.env['slide.slide'].with_user(self.user_officer).create({ + 'name': 'Normal Diet', + 'channel_id': self.channel.id, + 'slide_category': 'document', + 'is_published': True, + 'completion_time': 1.5, + 'sequence': 7, + }) + + before_unlink = self.category2.completion_time + self.assertEqual(before_unlink, self.slide_4.completion_time + self.slide_5.completion_time) + + self.channel.slide_ids[6].sudo().unlink() + self.category2._compute_category_completion_time() + + after_unlink = self.category2.completion_time + self.assertEqual(after_unlink, self.slide_4.completion_time) @mute_logger('odoo.sql_db') @users('user_manager')