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])),
|
|
]
|