From 843312c340c93545edd57484516cb4aa0be6b5a3 Mon Sep 17 00:00:00 2001 From: Dmytro Katyukha Date: Sun, 8 Mar 2026 12:47:58 +0200 Subject: [PATCH] [FIX] Added missing `.sudo` or `compute_sudo=True` This PR adds `_compute_sudo=True` to compute methods that access system models like (ir.model, ir.model.fields, ...) to avoid unexpected access errors in user interface. Also, this PR adds `.sudo()` when code accesses (reads) system models for same reasone. --- base_geoengine/models/base.py | 2 +- base_geoengine/models/geo_vector_layer.py | 13 +++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/base_geoengine/models/base.py b/base_geoengine/models/base.py index c99f1cc65..3a392f5db 100644 --- a/base_geoengine/models/base.py +++ b/base_geoengine/models/base.py @@ -69,7 +69,7 @@ def set_field_real_name(self, in_tuple): field_obj = self.env["ir.model.fields"] if not in_tuple: return in_tuple - name = field_obj.browse(in_tuple[0]).name + name = field_obj.sudo().browse(in_tuple[0]).name out = (in_tuple[0], name, in_tuple[1]) return out diff --git a/base_geoengine/models/geo_vector_layer.py b/base_geoengine/models/geo_vector_layer.py index e30c77842..00abb6db0 100644 --- a/base_geoengine/models/geo_vector_layer.py +++ b/base_geoengine/models/geo_vector_layer.py @@ -63,7 +63,10 @@ class GeoVectorLayer(models.Model): ) attribute_field_id_domain = fields.Binary( - compute="_compute_attribute_field_id_domain", readonly=True, store=False + compute="_compute_attribute_field_id_domain", + compute_sudo=True, + readonly=True, + store=False, ) attribute_field_id = fields.Many2one("ir.model.fields", "Attribute field") @@ -73,6 +76,7 @@ class GeoVectorLayer(models.Model): store=True, readonly=False, compute="_compute_model_id", + compute_sudo=True, ) model_name = fields.Char(related="model_id.model", readonly=True) @@ -92,13 +96,14 @@ class GeoVectorLayer(models.Model): "Model view", domain=[("type", "=", "geoengine")], compute="_compute_model_view_id", + compute_sudo=True, readonly=False, ) layer_transparent = fields.Boolean() @api.constrains("geo_field_id", "model_id") def _check_geo_field_id(self): - for rec in self: + for rec in self.sudo(): if rec.model_id: if not rec.geo_field_id.model_id == rec.model_id: raise ValidationError( @@ -110,7 +115,7 @@ def _check_geo_field_id(self): @api.constrains("geo_repr", "attribute_field_id") def _check_geo_repr(self): - for rec in self: + for rec in self.sudo(): if ( rec.attribute_field_id and rec.attribute_field_id.ttype not in NUMBER_ATT @@ -128,7 +133,7 @@ def _check_geo_repr(self): @api.constrains("attribute_field_id", "geo_field_id") def _check_if_attribute_in_geo_field(self): - for rec in self: + for rec in self.sudo(): if rec.attribute_field_id and rec.geo_field_id: if rec.attribute_field_id.model != rec.geo_field_id.model: raise ValidationError(