website_slides/populate/slide_channel_partner.py

52 lines
2.1 KiB
Python
Raw Permalink Normal View History

# Part of Odoo. See LICENSE file for full copyright and licensing details.
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):
random = populate.Random('slidechannelpartners')
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],
),
),
]