[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
This commit is contained in:
Noe Antoine
2022-02-28 11:07:38 +00:00
committed by Thibault Delavallée
parent 1bcd34ea6b
commit 57be5167a9
3 changed files with 37 additions and 4 deletions
+23 -4
View File
@@ -2,6 +2,15 @@
<odoo><data noupdate="1">
<!-- CHANNEL 0: Basics of Gardening -->
<!-- ================================================== -->
<!-- Note that admin is already member due to auto subscribe -->
<record id="slide_channel_0_partner_demo" model="slide.channel.partner">
<field name="channel_id" ref="website_slides.slide_channel_demo_0_gard_0"/>
<field name="partner_id" ref="base.partner_demo"/>
</record>
<record id="slide_channel_0_partner_demo_portal" model="slide.channel.partner">
<field name="channel_id" ref="website_slides.slide_channel_demo_0_gard_0"/>
<field name="partner_id" ref="base.partner_demo_portal"/>
</record>
<record id="slide_slide_0_0_partner_admin" model="slide.slide.partner">
<field name="slide_id" ref="website_slides.slide_slide_demo_0_0"/>
<field name="partner_id" ref="base.partner_admin"/>
@@ -78,6 +87,15 @@
<!-- CHANNEL 1: Taking care of Trees -->
<!-- ================================================== -->
<!-- Note that admin is already member due to auto subscribe -->
<record id="slide_channel_1_partner_demo" model="slide.channel.partner">
<field name="channel_id" ref="website_slides.slide_channel_demo_1_gard1"/>
<field name="partner_id" ref="base.partner_demo"/>
</record>
<record id="slide_channel_1_partner_demo_portal" model="slide.channel.partner">
<field name="channel_id" ref="website_slides.slide_channel_demo_1_gard1"/>
<field name="partner_id" ref="base.partner_demo_portal"/>
</record>
<record id="slide_slide_1_0_partner_admin" model="slide.slide.partner">
<field name="slide_id" ref="website_slides.slide_slide_demo_1_0"/>
<field name="partner_id" ref="base.partner_admin"/>
@@ -187,6 +205,10 @@
<!-- CHANNEL 2: Trees, Wood and Garden -->
<!-- ================================================== -->
<record id="slide_channel_2_partner_admin" model="slide.channel.partner">
<field name="channel_id" ref="website_slides.slide_channel_demo_2_gard2"/>
<field name="partner_id" ref="base.partner_admin"/>
</record>
<record id="slide_slide_2_0_partner_admin" model="slide.slide.partner">
<field name="slide_id" ref="website_slides.slide_slide_demo_2_0"/>
<field name="partner_id" ref="base.partner_admin"/>
@@ -199,10 +221,7 @@
<field name="partner_id" ref="base.partner_admin"/>
<field name="vote">1</field>
</record>
<record id="slide_channel_2_partner_demo" model="slide.channel.partner">
<field name="channel_id" ref="website_slides.slide_channel_demo_2_gard2"/>
<field name="partner_id" ref="base.partner_demo"/>
</record>
<!-- note that partner demo is already member of slide_channel_demo_2_gard2 due to auto subscribe -->
<record id="slide_slide_2_0_partner_demo" model="slide.slide.partner">
<field name="slide_id" ref="website_slides.slide_slide_demo_2_0"/>
<field name="partner_id" ref="base.partner_demo"/>
@@ -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),
@@ -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)