52 lines
2.1 KiB
Python
52 lines
2.1 KiB
Python
|
# 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],
|
||
|
),
|
||
|
),
|
||
|
]
|