[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:
committed by
Thibault Delavallée
parent
1bcd34ea6b
commit
57be5167a9
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user