diff --git a/addons/website_slides/__init__.py b/addons/website_slides/__init__.py index 88710707227..48dadfaf2b2 100644 --- a/addons/website_slides/__init__.py +++ b/addons/website_slides/__init__.py @@ -3,4 +3,5 @@ from . import controllers from . import models +from . import populate from . import wizard diff --git a/addons/website_slides/populate/__init__.py b/addons/website_slides/populate/__init__.py new file mode 100644 index 00000000000..3252edfdcb9 --- /dev/null +++ b/addons/website_slides/populate/__init__.py @@ -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 diff --git a/addons/website_slides/populate/slide_channel.py b/addons/website_slides/populate/slide_channel.py new file mode 100644 index 00000000000..26ec38c1fcf --- /dev/null +++ b/addons/website_slides/populate/slide_channel.py @@ -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])), + ] diff --git a/addons/website_slides/populate/slide_channel_partner.py b/addons/website_slides/populate/slide_channel_partner.py new file mode 100644 index 00000000000..87f13d3beeb --- /dev/null +++ b/addons/website_slides/populate/slide_channel_partner.py @@ -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], + ), + ), + ]