From b6219bd1711d2611b347222d85466782a88c2d8d Mon Sep 17 00:00:00 2001 From: bit4bit Date: Fri, 25 Jun 2021 01:56:49 +0000 Subject: [PATCH] fields.Function manejan default FossilOrigin-Name: ec954ac9253429b99095fbcce443a2691f516f603282aec1ee59c4b7cbbd6c4a --- facho/model/__init__.py | 35 ++++++++++++++++++++++++++------- facho/model/fields/attribute.py | 6 +++--- facho/model/fields/function.py | 14 ++++++++++--- tests/test_model.py | 9 +++++++++ 4 files changed, 51 insertions(+), 13 deletions(-) diff --git a/facho/model/__init__.py b/facho/model/__init__.py index 33cd824..51a9345 100644 --- a/facho/model/__init__.py +++ b/facho/model/__init__.py @@ -24,25 +24,29 @@ class ModelBase(object, metaclass=ModelMeta): # forzamos registros de campos al modelo # al instanciar for (key, v) in type(obj).__dict__.items(): - if isinstance(v, fields.Attribute) or isinstance(v, fields.Many2One): + if isinstance(v, fields.Attribute) or isinstance(v, fields.Many2One) or isinstance(v, fields.Function): if hasattr(v, 'default') and v.default is not None: setattr(obj, key, v.default) return obj + def _set_attribute(self, field, name, value): + self._xml_attributes[field] = (name, value) + def __setitem__(self, key, val): self._xml_attributes[key] = val def __getitem__(self, key): return self._xml_attributes[key] - def __before_xml__(self): - pass + def _get_field(self, name): + return self._fields[name] + + def _set_field(self, name, field): + field.name = name + self._fields[name] = field - def __default_set__(self, value): - return value - def _set_content(self, value): default = self.__default_set__(value) if default is not None: @@ -55,6 +59,9 @@ class ModelBase(object, metaclass=ModelMeta): field.__before_xml__() def to_xml(self): + """ + Genera xml del modelo y sus relaciones + """ self._hook_before_xml() tag = self.__name__ @@ -85,5 +92,19 @@ class ModelBase(object, metaclass=ModelMeta): return "<%s%s%s>%s" % (ns, tag, attributes, content, ns, tag) class Model(ModelBase): - pass + def __before_xml__(self): + """ + Ejecuta antes de generar el xml, este + metodo sirve para realizar actualizaciones + en los campos en el ultimo momento + """ + pass + + def __default_set__(self, value): + """ + Al asignar un valor al modelo atraves de una relacion (person.relation = '33') + se puede personalizar como hacer esta asignacion. + """ + return value + diff --git a/facho/model/fields/attribute.py b/facho/model/fields/attribute.py index e89268a..9d8677c 100644 --- a/facho/model/fields/attribute.py +++ b/facho/model/fields/attribute.py @@ -1,8 +1,8 @@ from .field import Field class Attribute(Field): - def __init__(self, tag, default=None): - self.tag = tag + def __init__(self, name, default=None): + self.attribute = name self.value = default self.default = default @@ -16,4 +16,4 @@ class Attribute(Field): def __set__(self, inst, value): assert self.name is not None self.value = value - inst._xml_attributes[self.name] = (self.tag, value) + inst._set_attribute(self.name, self.attribute, value) diff --git a/facho/model/fields/function.py b/facho/model/fields/function.py index 20ba6e9..58388e5 100644 --- a/facho/model/fields/function.py +++ b/facho/model/fields/function.py @@ -2,9 +2,14 @@ from .field import Field from .model import Model class Function(Field): - def __init__(self, field, getter=None): + """ + Permite modificar el modelo cuando se intenta, + obtener el valor de este campo. + """ + def __init__(self, field, getter=None, default=None): self.field = field self.getter = getter + self.default = default def __get__(self, inst, cls): if inst is None: @@ -14,8 +19,7 @@ class Function(Field): # si se indica `field` se adiciona # como campo del modelo, esto es # que se serializa a xml - self.field.name = self.name - inst._fields[self.name] = self.field + inst._set_field(self.name, self.field) if self.getter is not None: value = self._call(inst, self.getter, self.name, self.field) @@ -24,3 +28,7 @@ class Function(Field): self.field.__set__(inst, value) return self.field + + def __set__(self, inst, value): + inst._set_field(self.name, self.field) + self.field.__set__(inst, value) diff --git a/tests/test_model.py b/tests/test_model.py index c965649..1028803 100644 --- a/tests/test_model.py +++ b/tests/test_model.py @@ -326,6 +326,15 @@ def test_field_inserted_default_attribute(): person = Person() assert '' == person.to_xml() +def test_field_function_inserted_default_attribute(): + class Person(facho.model.Model): + __name__ = 'Person' + + hash = fields.Function(fields.Attribute('hash'), default='calculate') + + person = Person() + assert '' == person.to_xml() + def test_field_inserted_default_many2one(): class ID(facho.model.Model): __name__ = 'ID'