diff --git a/addons/crm/models/res_partner.py b/addons/crm/models/res_partner.py index 2e52405aff9..3582b398f56 100644 --- a/addons/crm/models/res_partner.py +++ b/addons/crm/models/res_partner.py @@ -8,7 +8,11 @@ class Partner(models.Model): _name = 'res.partner' _inherit = 'res.partner' - team_id = fields.Many2one('crm.team', string='Sales Team', ondelete="set null") + team_id = fields.Many2one( + 'crm.team', string='Sales Team', + compute='_compute_team_id', + precompute=True, # avoid queries post-create + ondelete='set null', readonly=False, store=True) opportunity_ids = fields.One2many('crm.lead', 'partner_id', string='Opportunities', domain=[('type', '=', 'opportunity')]) opportunity_count = fields.Integer("Opportunity", compute='_compute_opportunity_count') @@ -34,6 +38,11 @@ class Partner(models.Model): ) return rec + @api.depends('parent_id') + def _compute_team_id(self): + for partner in self.filtered(lambda partner: not partner.team_id and partner.company_type == 'person' and partner.parent_id.team_id): + partner.team_id = partner.parent_id.team_id + def _compute_opportunity_count(self): # retrieve all children partners and prefetch 'parent_id' on them all_partners = self.with_context(active_test=False).search([('id', 'child_of', self.ids)]) diff --git a/addons/crm/tests/__init__.py b/addons/crm/tests/__init__.py index e5d7f8d6aec..22d65ecef45 100644 --- a/addons/crm/tests/__init__.py +++ b/addons/crm/tests/__init__.py @@ -15,3 +15,4 @@ from . import test_crm_lead_smart_calendar from . import test_crm_ui from . import test_crm_pls from . import test_performances +from . import test_res_partner diff --git a/addons/crm/tests/test_res_partner.py b/addons/crm/tests/test_res_partner.py new file mode 100644 index 00000000000..e8b5c295496 --- /dev/null +++ b/addons/crm/tests/test_res_partner.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo.addons.crm.tests.common import TestCrmCommon +from odoo.tests.common import Form +from odoo.tests import tagged, users + + +@tagged('res_partner') +class TestPartner(TestCrmCommon): + + @users('user_sales_leads') + def test_parent_sync_sales_rep(self): + """ Test team_id / user_id sync from parent to children if the contact + is a person. Company children are not updated. """ + contact_company = self.contact_company.with_env(self.env) + contact_company_1 = self.contact_company_1.with_env(self.env) + self.assertFalse(contact_company.team_id) + self.assertFalse(contact_company.user_id) + self.assertFalse(contact_company_1.team_id) + self.assertFalse(contact_company_1.user_id) + + child = self.contact_1.with_env(self.env) + self.assertEqual(child.parent_id, self.contact_company_1) + self.assertFalse(child.team_id) + self.assertFalse(child.user_id) + + # update comppany sales rep info + contact_company.user_id = self.env.uid + contact_company.team_id = self.sales_team_1.id + + # change child parent: shold update sales rep info + child.parent_id = contact_company.id + self.assertEqual(child.user_id, self.env.user) + + # test form tool + partner_form = Form(self.env['res.partner'], 'base.view_partner_form') + partner_form.parent_id = contact_company + partner_form.company_type = 'person' + partner_form.name = 'Hermes Conrad' + self.assertEqual(partner_form.team_id, self.sales_team_1) + self.assertEqual(partner_form.user_id, self.env.user) + partner_form.parent_id = contact_company_1 + self.assertEqual(partner_form.team_id, self.sales_team_1) + self.assertEqual(partner_form.user_id, self.env.user) + + # test form tool + partner_form = Form(self.env['res.partner'], 'base.view_partner_form') + partner_form.company_type = 'company' + partner_form.parent_id = contact_company + partner_form.name = 'Mom Corp' + self.assertFalse(partner_form.team_id) + self.assertFalse(partner_form.user_id) diff --git a/addons/crm/views/res_partner_views.xml b/addons/crm/views/res_partner_views.xml index 187b51a49e2..518f92cf298 100644 --- a/addons/crm/views/res_partner_views.xml +++ b/addons/crm/views/res_partner_views.xml @@ -44,6 +44,9 @@ + + {'default_is_company': True, 'show_vat': True, 'default_user_id': user_id, 'default_team_id': team_id} + diff --git a/odoo/addons/base/models/res_partner.py b/odoo/addons/base/models/res_partner.py index 7cc04e48983..aa7c483e868 100644 --- a/odoo/addons/base/models/res_partner.py +++ b/odoo/addons/base/models/res_partner.py @@ -168,8 +168,12 @@ class Partner(models.Model): "Anywhere else, time values are computed according to the time offset of your web client.") tz_offset = fields.Char(compute='_compute_tz_offset', string='Timezone offset', invisible=True) - user_id = fields.Many2one('res.users', string='Salesperson', - help='The internal user in charge of this contact.') + user_id = fields.Many2one( + 'res.users', string='Salesperson', + compute='_compute_user_id', + precompute=True, # avoid queries post-create + readonly=False, store=True, + help='The internal user in charge of this contact.') vat = fields.Char(string='Tax ID', index=True, help="The Tax Identification Number. Complete it if the contact is subjected to government taxes. Used in some legal statements.") same_vat_partner_id = fields.Many2one('res.partner', string='Partner with same Tax ID', compute='_compute_same_vat_partner_id', store=False) same_company_registry_partner_id = fields.Many2one('res.partner', string='Partner with same Company Registry', compute='_compute_same_vat_partner_id', store=False) @@ -304,6 +308,12 @@ class Partner(models.Model): for partner in self: partner.tz_offset = datetime.datetime.now(pytz.timezone(partner.tz or 'GMT')).strftime('%z') + @api.depends('parent_id') + def _compute_user_id(self): + """ Synchronize sales rep with parent if partner is a person """ + for partner in self.filtered(lambda partner: not partner.user_id and partner.company_type == 'person' and partner.parent_id.user_id): + partner.user_id = partner.parent_id.user_id + @api.depends('user_ids.share', 'user_ids.active') def _compute_partner_share(self): super_partner = self.env['res.users'].browse(SUPERUSER_ID).partner_id diff --git a/odoo/addons/base/tests/test_res_partner.py b/odoo/addons/base/tests/test_res_partner.py index b780a9396a5..a62891e8c40 100644 --- a/odoo/addons/base/tests/test_res_partner.py +++ b/odoo/addons/base/tests/test_res_partner.py @@ -157,3 +157,23 @@ class TestPartner(TransactionCase): self.assertFalse(self.env.ref('base.public_user').active) self.assertFalse(self.env.ref('base.public_partner').active) self.assertTrue(self.env.ref('base.public_partner').is_public) + + def test_onchange_parent_sync_user(self): + company_1 = self.env['res.company'].create({'name': 'company_1'}) + test_user = self.env['res.users'].create({ + 'name': 'This user', + 'login': 'thisu', + 'email': 'this.user@example.com', + 'company_id': company_1.id, + 'company_ids': [company_1.id], + }) + test_parent_partner = self.env['res.partner'].create({ + 'company_type': 'company', + 'name': 'Micheline', + 'user_id': test_user.id, + }) + with Form(self.env['res.partner']) as partner_form: + partner_form.parent_id = test_parent_partner + partner_form.company_type = 'person' + partner_form.name = 'Philip' + self.assertEqual(partner_form.user_id, test_parent_partner.user_id) diff --git a/odoo/addons/base/views/res_partner_views.xml b/odoo/addons/base/views/res_partner_views.xml index d5de1f2937e..99638f989ef 100644 --- a/odoo/addons/base/views/res_partner_views.xml +++ b/odoo/addons/base/views/res_partner_views.xml @@ -84,6 +84,7 @@ +
@@ -94,7 +95,7 @@