From bebfa9b52c4aa066896b48293db76bb8ccf96955 Mon Sep 17 00:00:00 2001 From: william Date: Thu, 27 Oct 2022 10:32:31 +0000 Subject: [PATCH] [FIX] base,core: order of self.env.companies MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Using a `frozenset` leads to non deterministic issues. Because when nothing is set in the context key `allowed_company_ids`, `self.env.companies` will fallback on `self['res.company'].browse(user_company_ids)` Since the browsing is done on a non ordered set, the recordset doesn't follow the `_order` set on the model, by definition. This has the effect of not being deterministic when iterating on `self.env.companies`. For instance https://runbot.odoo.com/runbot/build/20539598 closes odoo/odoo#104538 X-original-commit: bfee55b14c918c44ebbb2563d5dc0e102edf396e Signed-off-by: Rémy Voet Signed-off-by: William André (wan) --- odoo/addons/base/models/res_users.py | 2 +- odoo/api.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/odoo/addons/base/models/res_users.py b/odoo/addons/base/models/res_users.py index 58bea3bb662..573f6227fb6 100644 --- a/odoo/addons/base/models/res_users.py +++ b/odoo/addons/base/models/res_users.py @@ -701,7 +701,7 @@ class Users(models.Model): def _get_company_ids(self): # 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) + return self.env['res.company'].search(domain)._ids @api.model def action_get(self): diff --git a/odoo/api.py b/odoo/api.py index e6c3f174305..6f0bd85ce04 100644 --- a/odoo/api.py +++ b/odoo/api.py @@ -622,7 +622,7 @@ class Environment(Mapping): 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): + if set(company_ids) - set(user_company_ids): raise AccessError(_("Access to unauthorized or invalid companies.")) return self['res.company'].browse(company_ids[0]) return self.user.company_id.with_env(self) @@ -652,7 +652,7 @@ class Environment(Mapping): user_company_ids = self.user._get_company_ids() if company_ids: if not self.su: - if any(cid not in user_company_ids for cid in company_ids): + if set(company_ids) - set(user_company_ids): raise AccessError(_("Access to unauthorized or invalid companies.")) return self['res.company'].browse(company_ids) # By setting the default companies to all user companies instead of the main one