From 8df08c4ecc22859c384a519f2e4bcd892342d808 Mon Sep 17 00:00:00 2001 From: Simone Orsi Date: Tue, 4 Apr 2023 10:52:27 +0200 Subject: [PATCH] server_env: fix inverse method (closes #151) ``odoo.fields.determine`` requires inverse methods to have ``__name__`` attribute. Unfortunately with ``partialmethod`` this attribute is not propagated even by using ``functools.update_wrapper``. In any case, `update_wrapper` would propagate the wrapped func name which is not the same here. Introduced by https://github.com/odoo/odoo/commit/36544651f2049bcf18777091dbf02c9631b33243 --- server_environment/models/server_env_mixin.py | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/server_environment/models/server_env_mixin.py b/server_environment/models/server_env_mixin.py index 9015167..d2c6d44 100644 --- a/server_environment/models/server_env_mixin.py +++ b/server_environment/models/server_env_mixin.py @@ -15,6 +15,27 @@ from ..server_env import serv_config _logger = logging.getLogger(__name__) +class _partialmethod(partialmethod): + """Custom implementation of partialmethod. + + ``odoo.fields.determine`` requires inverse methods to have ``__name__`` attribute. + Unfortunately with ``partialmethod`` this attribute is not propagated + even by using ``functools.update_wrapper``. + + Introduced by https://github.com/odoo/odoo/commit/36544651f2049bcf18777091dbf02c9631b33243 + """ + + def __init__(self, func, *args, **keywords): + self.__name__ = keywords.pop("__name__", None) + super().__init__(func, *args, **keywords) + + def __get__(self, obj, cls=None): + res = super().__get__(obj, cls=cls) + if self.__name__ is not None: + res.__name__ = self.__name__ + return res + + class ServerEnvMixin(models.AbstractModel): """Mixin to add server environment in existing models @@ -332,7 +353,9 @@ class ServerEnvMixin(models.AbstractModel): field.compute = "_compute_server_env" inverse_method_name = "_inverse_server_env_%s" % field.name - inverse_method = partialmethod(type(self)._inverse_server_env, field.name) + inverse_method = _partialmethod( + type(self)._inverse_server_env, field.name, __name__=inverse_method_name + ) setattr(type(self), inverse_method_name, inverse_method) field.inverse = inverse_method_name field.store = False