[IMP] website_slides: add populate
We make sure to have courses with a huge number of attendees w/r to partners count. Task-3463533 closes odoo/odoo#132374 X-original-commit: abd040a1084d462167d13cb071b4faf8439112f0 Signed-off-by: Florian Charlier (flch) <flch@odoo.com>
This commit is contained in:
@@ -3,4 +3,5 @@
|
||||
|
||||
from . import controllers
|
||||
from . import models
|
||||
from . import populate
|
||||
from . import wizard
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from . import slide_channel
|
||||
from . import slide_channel_partner
|
||||
@@ -0,0 +1,16 @@
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from odoo import models
|
||||
from odoo.tools import populate
|
||||
|
||||
|
||||
class SlideChannel(models.Model):
|
||||
_inherit = 'slide.channel'
|
||||
_populate_sizes = {'small': 2, 'medium': 8, 'large': 20}
|
||||
|
||||
def _populate_factories(self):
|
||||
return [
|
||||
('name', populate.constant('Course_{counter}')),
|
||||
('description', populate.constant('This is course number {counter}')),
|
||||
('website_published', populate.randomize([True, False], weights=[4, 1])),
|
||||
]
|
||||
@@ -0,0 +1,51 @@
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
import random
|
||||
from collections import defaultdict
|
||||
|
||||
from odoo import models
|
||||
from odoo.tools import populate
|
||||
|
||||
|
||||
class SlideChannelPartner(models.Model):
|
||||
_inherit = 'slide.channel.partner'
|
||||
_populate_dependencies = ['res.partner', 'slide.channel']
|
||||
# 50% more than partners, so supports 0 to N courses per partner.
|
||||
_populate_sizes = {'small': 150, 'medium': 3_000, 'large': 150_000}
|
||||
|
||||
def _populate_factories(self):
|
||||
partner_ids = self.env.registry.populated_models['res.partner']
|
||||
partner_not_company_ids = (
|
||||
self.env['res.partner'].search([('id', 'in', partner_ids), ('is_company', '=', False)]).ids
|
||||
)
|
||||
channel_ids_set = set(self.env.registry.populated_models['slide.channel'])
|
||||
attendees_partner_ids = partner_not_company_ids * len(channel_ids_set)
|
||||
random.shuffle(attendees_partner_ids)
|
||||
|
||||
courses_weights = [1 / i for i in range(1, len(channel_ids_set) + 1)] # skewed for perf evals
|
||||
|
||||
def _compute_next_attendee(iterator, *args):
|
||||
partners_channel_ids = defaultdict(set)
|
||||
for values, partner_id in zip(iterator, attendees_partner_ids):
|
||||
remaining_channel_ids = list(channel_ids_set - partners_channel_ids[partner_id])
|
||||
channel_id = random.choices(
|
||||
remaining_channel_ids,
|
||||
weights=courses_weights[:len(remaining_channel_ids)],
|
||||
k=1,
|
||||
)[0]
|
||||
|
||||
partners_channel_ids[partner_id].add(channel_id)
|
||||
|
||||
yield {**values, 'partner_id': partner_id, 'channel_id': channel_id}
|
||||
|
||||
return [
|
||||
('_attendee', _compute_next_attendee),
|
||||
('active', populate.randomize([True, False], weights=[4, 1])),
|
||||
(
|
||||
'member_status',
|
||||
populate.randomize(
|
||||
['invited', 'joined', 'ongoing', 'completed'],
|
||||
weights=[10, 50, 30, 20],
|
||||
),
|
||||
),
|
||||
]
|
||||
Reference in New Issue
Block a user