diff --git a/odoo/addons/base/models/res_company.py b/odoo/addons/base/models/res_company.py index 83b792c4edc..913db9016f5 100644 --- a/odoo/addons/base/models/res_company.py +++ b/odoo/addons/base/models/res_company.py @@ -57,6 +57,7 @@ class Company(models.Model): return base64.b64encode(stream.getvalue()) name = fields.Char(related='partner_id.name', string='Company Name', required=True, store=True, readonly=False) + active = fields.Boolean(default=True) sequence = fields.Integer(help='Used to order Companies in the company switcher', default=10) parent_id = fields.Many2one('res.company', string='Parent Company', index=True) child_ids = fields.One2many('res.company', 'parent_id', string='Child Companies') diff --git a/odoo/addons/base/models/res_users.py b/odoo/addons/base/models/res_users.py index 678a17e4dd6..04dfdf9daa7 100644 --- a/odoo/addons/base/models/res_users.py +++ b/odoo/addons/base/models/res_users.py @@ -697,9 +697,11 @@ class Users(models.Model): return frozendict(context) - @tools.ormcache('self._uid') + @tools.ormcache('self.id') def _get_company_ids(self): - return frozenset(self.company_ids.ids) + # use search() instead of `self.company_ids` to avoid extra query for `active_test` + domain = [('active', '=', True), ('user_ids', 'in', self.id)] + return frozenset(self.env['res.company'].search(domain).ids) @api.model def action_get(self): diff --git a/odoo/addons/base/tests/test_expression.py b/odoo/addons/base/tests/test_expression.py index abb3c68311a..f0e64eb6cc8 100644 --- a/odoo/addons/base/tests/test_expression.py +++ b/odoo/addons/base/tests/test_expression.py @@ -1339,7 +1339,7 @@ class TestMany2one(TransactionCase): WHERE ("res_partner"."company_id" IN ( SELECT "res_company".id FROM "res_company" - WHERE ("res_company"."name"::text like %s) + WHERE (("res_company"."active" = %s) AND ("res_company"."name"::text like %s)) )) ORDER BY "res_partner"."display_name", "res_partner"."id" ''']): @@ -1353,7 +1353,7 @@ class TestMany2one(TransactionCase): WHERE ("res_partner"."company_id" IN ( SELECT "res_company".id FROM "res_company" - WHERE ("res_company"."name"::text like %s) + WHERE (("res_company"."active" = %s) AND ("res_company"."name"::text like %s)) ORDER BY "res_company"."id" LIMIT 1 )) diff --git a/odoo/api.py b/odoo/api.py index aa275dcf826..76442108e1a 100644 --- a/odoo/api.py +++ b/odoo/api.py @@ -658,9 +658,9 @@ class Environment(Mapping): the targeted company. """ company_ids = self.context.get('allowed_company_ids', []) + user_company_ids = self.user._get_company_ids() if company_ids: if not self.su: - user_company_ids = self.user._get_company_ids() if any(cid not in user_company_ids for cid in company_ids): raise AccessError(_("Access to unauthorized or invalid companies.")) return self['res.company'].browse(company_ids) @@ -674,7 +674,7 @@ class Environment(Mapping): # - when printing a report for several records from several companies # - when accessing to a record from the notification email template # - when loading an binary image on a template - return self.user.company_ids.with_env(self) + return self['res.company'].browse(user_company_ids) @property def lang(self):