From 0fa464e8e331feba49acf0fd50ef44794c0cebed Mon Sep 17 00:00:00 2001 From: william Date: Thu, 9 Apr 2020 07:55:10 +0000 Subject: [PATCH] [FIX] base: populate company_id and user do not consume partner * When setting company_id on the res.partner, the parent might have had a different company_id * We should not consume res.partner's when creating res.user's but creating new ones instead. --- odoo/addons/base/populate/res_partner.py | 20 ++++++++------- odoo/addons/base/populate/res_user.py | 32 ++++++++++++++++-------- odoo/addons/test_populate/models.py | 6 ++--- 3 files changed, 35 insertions(+), 23 deletions(-) diff --git a/odoo/addons/base/populate/res_partner.py b/odoo/addons/base/populate/res_partner.py index 723fb25b832..b77ad7036bd 100644 --- a/odoo/addons/base/populate/res_partner.py +++ b/odoo/addons/base/populate/res_partner.py @@ -131,21 +131,23 @@ class Partner(models.Model): def _populate_set_companies(self, records): _logger.info('Setting companies') - r_company = populate.Random('res.partner+company_has_partners') # 50% change to have partners - companies = records.filtered(lambda p: p.is_company and r_company.getrandbits(1)) - partners = records - companies + r_company = populate.Random('res.partner+company_has_partners') r_partner = populate.Random('res.partner+partner_has_company') r_company_pick = populate.Random('res.partner+partner_company_pick=') + + companies = records.filtered(lambda p: p.is_company and r_company.getrandbits(1)) # 50% change to have partners + partners = records.filtered(lambda p: not p.is_company and r_partner.getrandbits(1)) # 50% change to have a company + companies_partners = collections.defaultdict(lambda: self.env['res.partner']) - for count, partner in enumerate(partners): - if bool(r_partner.getrandbits(1)): # 50% change to have a company - companies_partners[r_company_pick.choice(companies)] |= partner + for partner in partners: + companies_partners[r_company_pick.choice(companies)] |= partner # batching company write improves performances a lot (~40% faster for total partner creation). - for count, (company, partners) in enumerate(companies_partners.items()): - if (count + 1) % 100 == 0: - _logger.info('Setting company: %s/%s', count + 1, len(companies)) + for count, (company, partners) in enumerate(companies_partners.items(), start=1): + if count % 100 == 0: + _logger.info('Setting company: %s/%s', count, len(companies)) partners.write({'parent_id': company.id}) + partners._onchange_company_id() class ResPartnerIndustry(models.Model): _inherit = "res.partner.industry" diff --git a/odoo/addons/base/populate/res_user.py b/odoo/addons/base/populate/res_user.py index 7722a437f2a..0e97ad51538 100644 --- a/odoo/addons/base/populate/res_user.py +++ b/odoo/addons/base/populate/res_user.py @@ -11,24 +11,34 @@ _logger = logging.getLogger(__name__) class Users(models.Model): _inherit = "res.users" - _populate_sizes = {"small": 10, "medium": 1000, "large": 10000} + _populate_sizes = { + 'small': 10, + 'medium': 1000, + 'large': 10000, + } _populate_dependencies = ["res.partner"] def _populate_factories(self): - partner_ids = list(self.env.registry.populated_models["res.partner"]) + def generate_partner_id(iterator, *args): + partner_factories = self.env['res.partner']._populate_factories() + partner_generator = populate.chain_factories(partner_factories, self._name) + for dependant_values in partner_generator: + values = next(iterator) + yield {**dependant_values, **values, '__complete': values['__complete']} - def get_partner_id(random=None, **kwargs): - partner_id = random.choice(partner_ids) - partner_ids.remove(partner_id) - return partner_id + def get_company_ids(values, **kwargs): + return [(6, 0, [values['company_id']])] return [ - ("active", populate.cartesian([True, False], [0.9, 0.1])), - ("partner_id", populate.compute(get_partner_id)), - ("login", populate.constant("user_login_{counter}")), + ('active', populate.cartesian([True, False], [0.9, 0.1])), + ('partner_id', generate_partner_id), + ('company_id', populate.randomize(self.env.registry.populated_models['res.company'])), + ('company_ids', populate.compute(get_company_ids)), + ('login', populate.constant('user_login_{counter}')), + ('name', populate.constant('user_{counter}')), ] - def _populate(self, scale): + def _populate(self, size): self = self.with_context(no_reset_password=True) # avoid sending reset password email - return super(Users, self)._populate(scale) + return super(Users, self)._populate(size) diff --git a/odoo/addons/test_populate/models.py b/odoo/addons/test_populate/models.py index 96b8c5565be..804b1d8e579 100644 --- a/odoo/addons/test_populate/models.py +++ b/odoo/addons/test_populate/models.py @@ -36,9 +36,9 @@ class TestPopulateModel(models.Model): ] def generate_dependant(iterator, *args): dependants_generator = populate.chain_factories(dependant_factories, self._name) - for values in dependants_generator: - dependant_values = next(iterator) - yield {**values, **dependant_values, '__complete': values['__complete'] and dependant_values['__complete']} + for dependant_values in dependants_generator: + values = next(iterator) + yield {**dependant_values, **values, '__complete': values['__complete'] and dependant_values['__complete']} def get_name(values=None, counter=0, **kwargs): active = 'active' if values['active'] else 'inactive'