Purpose of this commit is to add a first populate implementation in CRM to create leads. Indeed as CRM application may have to handle lots of leads we should ease data creation to test performance in several use cases. Task-2679887 closes odoo/odoo#79150 Signed-off-by: Thibault Delavallee (tde) <tde@openerp.com>
166 lines
7.1 KiB
Python
166 lines
7.1 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from datetime import datetime, timedelta
|
|
|
|
from odoo import models
|
|
from odoo.tools import populate
|
|
from odoo.addons.crm.populate import tools
|
|
|
|
|
|
class CrmLead(models.Model):
|
|
_inherit = 'crm.lead'
|
|
_populate_dependencies = [
|
|
'res.partner', # customer
|
|
]
|
|
_populate_sizes = {
|
|
'small': 5,
|
|
'medium': 150,
|
|
'large': 400
|
|
}
|
|
|
|
def _populate_factories(self):
|
|
partner_ids = self.env.registry.populated_models['res.partner']
|
|
|
|
# phone based on country
|
|
country_be, country_us, country_in = self.env.ref('base.be'), self.env.ref('base.us'), self.env.ref('base.in')
|
|
phones_per_country = {
|
|
country_be.id: [False, '+32456555432', '+32456555675', '+32456555627'],
|
|
country_us.id: [False, '+15555564246', '+15558455343', '+15557129033'],
|
|
country_in.id: [False, '+919755538077', '+917555765232', '+918555199309'],
|
|
False: [False, '', '+3212345678', '003212345678', '12345678'],
|
|
}
|
|
|
|
# example of more complex generator composed of multiple sub generators
|
|
# this define one subgenerator per "country"
|
|
address_factories_groups = [
|
|
[ # Falsy, 2 records
|
|
('street', populate.iterate([False, ''])),
|
|
('street2', populate.iterate([False, ''])),
|
|
('city', populate.iterate([False, ''])),
|
|
('zip', populate.iterate([False, ''])),
|
|
('country_id', populate.iterate([False])),
|
|
], [ # BE, 2 records
|
|
('street', populate.iterate(['Rue des Bourlottes {counter}', 'Rue Pinckaers {counter}'])),
|
|
('city', populate.iterate(['Brussels', 'Ramillies'])),
|
|
('zip', populate.iterate([1020, 1367])),
|
|
('country_id', populate.iterate([self.env.ref('base.be').id])),
|
|
], [ # US, 3 records
|
|
('street', populate.iterate(['Main street', '3th street {counter}', False])),
|
|
('street2', populate.iterate([False, '', 'Behind the tree {counter}'], [90, 5, 5])),
|
|
('city', populate.randomize(['San Fransisco', 'Los Angeles', '', False])),
|
|
('zip', populate.iterate([False, '', '50231'])),
|
|
('country_id', populate.iterate([self.env.ref('base.us').id])),
|
|
], [ # IN, 2 records
|
|
('street', populate.iterate(['Main Street', 'Some Street {counter}'])),
|
|
('city', populate.iterate(['ગાંધીનગર (Gandhinagar)'])),
|
|
('zip', populate.randomize(['382002', '382008'])),
|
|
('country_id', populate.randomize([self.env.ref('base.in').id])),
|
|
], [ # other corner cases, 2 records
|
|
('street', populate.iterate(['万泉寺村', 'საბჭოს სკვერი {counter}'])),
|
|
('city', populate.iterate(['北京市', 'თბილისი'])),
|
|
('zip', populate.iterate([False, 'UF47'])),
|
|
('country_id', populate.randomize([False] + self.env['res.country'].search([]).ids)),
|
|
]
|
|
]
|
|
|
|
address_generators = [
|
|
populate.chain_factories(address_factories, self._name)
|
|
for address_factories in address_factories_groups
|
|
]
|
|
|
|
def _compute_address(iterator, *args):
|
|
r = populate.Random('res.partner+address_generator_selector')
|
|
|
|
for values in iterator:
|
|
if values['partner_id']:
|
|
yield {**values}
|
|
else:
|
|
address_gen = r.choice(address_generators)
|
|
address_values = next(address_gen)
|
|
yield {**values, **address_values}
|
|
|
|
def _compute_contact(iterator, *args):
|
|
r = populate.Random('res.partner+contact_generator_selector')
|
|
|
|
for values in iterator:
|
|
if values['partner_id']:
|
|
yield {**values}
|
|
else:
|
|
fn = r.choice(tools._p_forename_groups)
|
|
mn = r.choices(
|
|
[False] + tools._p_middlename_groups,
|
|
weights=[1] + [1 / (len(tools._p_middlename_groups) or 1)] * len(tools._p_middlename_groups)
|
|
)[0]
|
|
sn = r.choice(tools._p_surname_groups)
|
|
mn_wseparator = f' "{mn}" '
|
|
contact_name = f'{fn}{mn_wseparator}{sn}'
|
|
|
|
country_id = values['country_id']
|
|
if country_id not in phones_per_country.keys():
|
|
country_id = False
|
|
mobile = r.choice(phones_per_country[country_id])
|
|
phone = r.choice(phones_per_country[country_id])
|
|
|
|
yield {**values,
|
|
'contact_name': contact_name,
|
|
'mobile': mobile,
|
|
'phone': phone,
|
|
}
|
|
|
|
def _compute_contact_name(values=None, counter=0, **kwargs):
|
|
""" Generate lead names a bit better than lead_counter because this is Odoo. """
|
|
partner_id = values['partner_id']
|
|
complete = values['__complete']
|
|
|
|
fn = kwargs['random'].choice(tools._p_forename_groups)
|
|
mn = kwargs['random'].choices(
|
|
[False] + tools._p_middlename_groups,
|
|
weights=[1] + [1 / (len(tools._p_middlename_groups) or 1)] * len(tools._p_middlename_groups)
|
|
)[0]
|
|
sn = kwargs['random'].choice(tools._p_surname_groups)
|
|
return '%s%s %s (%s_%s (partner %s))' % (
|
|
fn,
|
|
' "%s"' % mn if mn else '',
|
|
sn,
|
|
int(complete),
|
|
counter,
|
|
partner_id
|
|
)
|
|
|
|
def _compute_date_open(random=None, values=None, **kwargs):
|
|
user_id = values['user_id']
|
|
if user_id:
|
|
delta = random.randint(0, 10)
|
|
return datetime.now() - timedelta(days=delta)
|
|
return False
|
|
|
|
def _compute_name(values=None, counter=0, **kwargs):
|
|
""" Generate lead names a bit better than lead_counter because this is Odoo. """
|
|
complete = values['__complete']
|
|
|
|
fn = kwargs['random'].choice(tools._case_prefix_groups)
|
|
sn = kwargs['random'].choice(tools._case_object_groups)
|
|
return '%s %s (%s_%s)' % (
|
|
fn,
|
|
sn,
|
|
int(complete),
|
|
counter
|
|
)
|
|
|
|
return [
|
|
('partner_id', populate.iterate(
|
|
[False] + partner_ids,
|
|
[2] + [1 / (len(partner_ids) or 1)] * len(partner_ids))
|
|
),
|
|
('_address', _compute_address), # uses partner_id
|
|
('_contact', _compute_contact), # uses partner_id, country_id
|
|
('user_id', populate.iterate(
|
|
[False],
|
|
)
|
|
),
|
|
('date_open', populate.compute(_compute_date_open)), # uses user_id
|
|
('name', populate.compute(_compute_name)),
|
|
('type', populate.iterate(['lead', 'opportunity'], [0.8, 0.2])),
|
|
]
|