From 53b5207e3562ac71e36c9bf87de027555cb58b3e Mon Sep 17 00:00:00 2001 From: bit4bit Date: Sat, 26 Jun 2021 20:25:07 +0000 Subject: [PATCH] fields.on_changes no requiere un nombre especifico para su ejecucion FossilOrigin-Name: 55d11605df9d1228737da18bf04b242fff3b08939021488f169ad2b042330d6f --- facho/model/__init__.py | 23 +++++++++++------------ facho/model/fields/field.py | 2 +- tests/test_model.py | 2 +- 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/facho/model/__init__.py b/facho/model/__init__.py index f64bd55..9a45981 100644 --- a/facho/model/__init__.py +++ b/facho/model/__init__.py @@ -23,17 +23,17 @@ class ModelBase(object, metaclass=ModelMeta): obj._namespace_prefix = None obj._on_change_fields = defaultdict(list) - def on_change_fields_for_function(function_name): + def on_change_fields_for_function(): # se recorre arbol buscando el primero for parent_cls in type(obj).__mro__: - parent_meth = getattr(parent_cls, function_name, None) - if not parent_meth: - continue - - on_changes = getattr(parent_meth, 'on_changes', None) - if on_changes: - return on_changes - return [] + for parent_attr in dir(parent_cls): + parent_meth = getattr(parent_cls, parent_attr, None) + if not callable(parent_meth): + continue + on_changes = getattr(parent_meth, 'on_changes', None) + if on_changes: + return (parent_meth, on_changes) + return (None, []) # forzamos registros de campos al modelo # al instanciar @@ -43,10 +43,9 @@ class ModelBase(object, metaclass=ModelMeta): setattr(obj, key, v.default) # register callbacks for changes - function_name = 'on_change_%s' % (key) - on_change_fields = on_change_fields_for_function(function_name) + (fun, on_change_fields) = on_change_fields_for_function() for field in on_change_fields: - obj._on_change_fields[field].append(function_name) + obj._on_change_fields[field].append(fun) return obj diff --git a/facho/model/fields/field.py b/facho/model/fields/field.py index b3b5e2f..c447020 100644 --- a/facho/model/fields/field.py +++ b/facho/model/fields/field.py @@ -47,5 +47,5 @@ class Field: def _changed_field(self, inst, name, value): for fun in inst._on_change_fields[name]: - getattr(inst, fun)(name, value) + fun(inst, name, value) diff --git a/tests/test_model.py b/tests/test_model.py index 4754a3d..34f972b 100644 --- a/tests/test_model.py +++ b/tests/test_model.py @@ -391,7 +391,7 @@ def test_model_on_change_field_attribute(): hash = fields.Attribute('Hash') @fields.on_change(['hash']) - def on_change_react(self, name, value): + def on_react(self, name, value): assert name == 'hash' self.react = "%s+4" % (value)