From 57be5167a933e2b0604a024b8eaae4a2f5e80d14 Mon Sep 17 00:00:00 2001 From: Noe Antoine Date: Mon, 14 Jun 2021 10:25:59 +0000 Subject: [PATCH] [IMP] website_slides: add constraints to make membership unique Before, a partner could be present several times in the list of attendees (slide_channel_partner model). To avoid noise and confusion, a sql constraint is added to the model to make the couple (partner, channel) unique in db. If several exist, we only keep the most advanced one in terms of completion (see UPG script). Same move is done for slide activity tracking (slide_slide_partner model). Certification or completion is considered as more advanced. Demo data is updated as we try to create a membership that already exists due to auto subscription of channel responsible. We also make some channel memberships explicit as some demo data about slide completion exists. --- Links --- Task-2777216 Prepares Task-2508019 (Slides membership refactoring) Also soo UPG PR - odoo/upgrade#2854 Part-of: odoo/odoo#74171 --- .../website_slides/data/slide_user_demo.xml | 27 ++++++++++++++++--- addons/website_slides/models/slide_channel.py | 7 +++++ addons/website_slides/models/slide_slide.py | 7 +++++ 3 files changed, 37 insertions(+), 4 deletions(-) diff --git a/addons/website_slides/data/slide_user_demo.xml b/addons/website_slides/data/slide_user_demo.xml index 80d87842323..cc8b45a6219 100644 --- a/addons/website_slides/data/slide_user_demo.xml +++ b/addons/website_slides/data/slide_user_demo.xml @@ -2,6 +2,15 @@ + + + + + + + + + @@ -78,6 +87,15 @@ + + + + + + + + + @@ -187,6 +205,10 @@ + + + + @@ -199,10 +221,7 @@ 1 - - - - + diff --git a/addons/website_slides/models/slide_channel.py b/addons/website_slides/models/slide_channel.py index fdda9b34b2d..402222f0e8b 100644 --- a/addons/website_slides/models/slide_channel.py +++ b/addons/website_slides/models/slide_channel.py @@ -34,6 +34,13 @@ class ChannelUsersRelation(models.Model): channel_enroll = fields.Selection(related='channel_id.enroll') channel_website_id = fields.Many2one('website', string='Website', related='channel_id.website_id') + _sql_constraints = [ + ('channel_partner_uniq', + 'unique(channel_id, partner_id)', + 'A partner membership to a channel must be unique!' + ), + ] + def _recompute_completion(self): read_group_res = self.env['slide.slide.partner'].sudo().read_group( ['&', '&', ('channel_id', 'in', self.mapped('channel_id').ids), diff --git a/addons/website_slides/models/slide_slide.py b/addons/website_slides/models/slide_slide.py index 74ada83cee0..7386cfc597b 100644 --- a/addons/website_slides/models/slide_slide.py +++ b/addons/website_slides/models/slide_slide.py @@ -36,6 +36,13 @@ class SlidePartnerRelation(models.Model): completed = fields.Boolean('Completed') quiz_attempts_count = fields.Integer('Quiz attempts count', default=0) + _sql_constraints = [ + ('slide_partner_uniq', + 'unique(slide_id, partner_id)', + 'A partner membership to a slide must be unique!' + ) + ] + @api.model_create_multi def create(self, vals_list): res = super().create(vals_list)