[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.
This commit is contained in:
william
2021-01-22 08:50:34 +00:00
committed by wan
parent 8488086f94
commit 0fa464e8e3
3 changed files with 35 additions and 23 deletions
+11 -9
View File
@@ -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"
+21 -11
View File
@@ -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)
+3 -3
View File
@@ -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'