diff --git a/addons/project/i18n/project.pot b/addons/project/i18n/project.pot index a0e11739b1e..eb372efe260 100644 --- a/addons/project/i18n/project.pot +++ b/addons/project/i18n/project.pot @@ -3172,6 +3172,20 @@ msgid "" "People invited to collaborate on the project will have portal access rights." msgstr "" +#. module: project +#. odoo-python +#: code:addons/project/models/res_partner.py:0 +#, python-format +msgid "Partner company cannot be different from its assigned projects' company" +msgstr "" + +#. module: project +#. odoo-python +#: code:addons/project/models/res_partner.py:0 +#, python-format +msgid "Partner company cannot be different from its assigned tasks' company" +msgstr "" + #. module: project #: model:ir.model.fields,help:project.field_project_project__privacy_visibility #: model:ir.model.fields,help:project.field_project_task__project_privacy_visibility diff --git a/addons/project/models/res_partner.py b/addons/project/models/res_partner.py index 47e52e504f1..5c84963a670 100644 --- a/addons/project/models/res_partner.py +++ b/addons/project/models/res_partner.py @@ -1,19 +1,31 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -from odoo import fields, models +from odoo import api, fields, models, _ +from odoo.exceptions import UserError from odoo.tools import email_normalize class ResPartner(models.Model): """ Inherits partner and adds Tasks information in the partner form """ _inherit = 'res.partner' - _check_company_auto = True - project_ids = fields.One2many('project.project', 'partner_id', string='Projects', check_company=True) - task_ids = fields.One2many('project.task', 'partner_id', string='Tasks', check_company=True) + project_ids = fields.One2many('project.project', 'partner_id', string='Projects') + task_ids = fields.One2many('project.task', 'partner_id', string='Tasks') task_count = fields.Integer(compute='_compute_task_count', string='# Tasks') + @api.constrains('company_id', 'project_ids') + def _ensure_same_company_than_projects(self): + for partner in self: + if partner.company_id and partner.project_ids.company_id and partner.project_ids.company_id != partner.company_id: + raise UserError(_("Partner company cannot be different from its assigned projects' company")) + + @api.constrains('company_id', 'task_ids') + def _ensure_same_company_than_tasks(self): + for partner in self: + if partner.company_id and partner.task_ids.company_id and partner.task_ids.company_id != partner.company_id: + raise UserError(_("Partner company cannot be different from its assigned tasks' company")) + def _compute_task_count(self): # retrieve all children partners and prefetch 'parent_id' on them all_partners = self.with_context(active_test=False).search_fetch( diff --git a/addons/project/tests/test_project_base.py b/addons/project/tests/test_project_base.py index ec4d40e8701..6e8e32a3003 100644 --- a/addons/project/tests/test_project_base.py +++ b/addons/project/tests/test_project_base.py @@ -214,13 +214,16 @@ class TestProjectBase(TestProjectCommon): with self.assertRaises(UserError): # Cannot change the company of a partner if both the project and its partner have a company partner.company_id = company_2 - with self.assertRaises(UserError): - # Cannot set the company of a partner to False if both the project and its partner have a company - partner.company_id = False + partner.company_id = False self.project_pigs.company_id = False self.assertFalse(self.project_pigs.company_id, "The company of the project should have been set to False.") - partner.company_id = False self.project_pigs.company_id = company_1 + self.project_goats.company_id = company_1 + self.project_goats.partner_id = partner + with self.assertRaises(UserError): + # Cannot change the company of a partner that part of multiple projects with different companies + self.project_goats.partner_id.company_id = company_2 + # The project has a company, but the partner has none. The partner can only be set to False/project.company but the project can have any new company. with self.assertRaises(UserError): diff --git a/addons/project_mrp/tests/__init__.py b/addons/project_mrp/tests/__init__.py index 4fa67e8be11..10a4c2bd379 100644 --- a/addons/project_mrp/tests/__init__.py +++ b/addons/project_mrp/tests/__init__.py @@ -2,3 +2,4 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. from . import test_project_profitability +from . import test_project_stock diff --git a/addons/project_mrp/tests/test_project_stock.py b/addons/project_mrp/tests/test_project_stock.py new file mode 100644 index 00000000000..351d0e71ce0 --- /dev/null +++ b/addons/project_mrp/tests/test_project_stock.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo.addons.project.tests.test_project_base import TestProjectCommon + + +class TestProjectStock(TestProjectCommon): + def test_check_company(self): + """ + tests editing relation fields of a partner from a project + """ + self.project_pigs.partner_id = self.env['res.partner'].create({ + 'name': 'Jeff Delaney', + }) + self.env['stock.warehouse'].create({ + 'name': 'Hi mom!', + 'partner_id': self.project_pigs.partner_id.id, + 'code': 'Fireship', + })