From a9dde83e81701c3bcf61e865f091edd373c93a8a Mon Sep 17 00:00:00 2001 From: bit4bit Date: Fri, 25 Jun 2021 01:39:02 +0000 Subject: [PATCH] se adiciona atributo default a many2one y attribute FossilOrigin-Name: 9ddb1d1b8bebef24da17cc47d8fc70392f6015bb61866f251992aea518ed3d0f --- facho/model/__init__.py | 18 +++++++++++---- facho/model/fields/__init__.py | 3 ++- facho/model/fields/attribute.py | 1 + facho/model/fields/function.py | 1 + facho/model/fields/many2one.py | 3 ++- tests/test_model.py | 41 +++++++++++++++++++++++++++++++++ 6 files changed, 61 insertions(+), 6 deletions(-) diff --git a/facho/model/__init__.py b/facho/model/__init__.py index 13d7c13..33cd824 100644 --- a/facho/model/__init__.py +++ b/facho/model/__init__.py @@ -1,3 +1,4 @@ +from .fields import Field class ModelMeta(type): def __new__(cls, name, bases, ns): @@ -19,7 +20,15 @@ class ModelBase(object, metaclass=ModelMeta): obj._fields = {} obj._text = "" obj._namespace_prefix = None - + + # 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 hasattr(v, 'default') and v.default is not None: + setattr(obj, key, v.default) + + return obj def __setitem__(self, key, val): @@ -32,10 +41,12 @@ class ModelBase(object, metaclass=ModelMeta): pass def __default_set__(self, value): - return str(value) + return value def _set_content(self, value): - self._text = str(self.__default_set__(value)) + default = self.__default_set__(value) + if default is not None: + self._text = str(default) def _hook_before_xml(self): self.__before_xml__() @@ -63,7 +74,6 @@ class ModelBase(object, metaclass=ModelMeta): for name, value in self._fields.items(): if hasattr(value, 'to_xml'): - print(self._fields) content += value.to_xml() elif isinstance(value, str): content += value diff --git a/facho/model/fields/__init__.py b/facho/model/fields/__init__.py index 77d3bef..4e35a11 100644 --- a/facho/model/fields/__init__.py +++ b/facho/model/fields/__init__.py @@ -3,5 +3,6 @@ from .many2one import Many2One from .model import Model from .function import Function from .virtual import Virtual +from .field import Field -__all__ = [Attribute, Many2One, Model, Virtual] +__all__ = [Attribute, Many2One, Model, Virtual, Field] diff --git a/facho/model/fields/attribute.py b/facho/model/fields/attribute.py index e8fd7a0..e89268a 100644 --- a/facho/model/fields/attribute.py +++ b/facho/model/fields/attribute.py @@ -4,6 +4,7 @@ class Attribute(Field): def __init__(self, tag, default=None): self.tag = tag self.value = default + self.default = default def __get__(self, inst, cls): if inst is None: diff --git a/facho/model/fields/function.py b/facho/model/fields/function.py index 2294041..20ba6e9 100644 --- a/facho/model/fields/function.py +++ b/facho/model/fields/function.py @@ -14,6 +14,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 if self.getter is not None: diff --git a/facho/model/fields/many2one.py b/facho/model/fields/many2one.py index 0ead219..d75e03b 100644 --- a/facho/model/fields/many2one.py +++ b/facho/model/fields/many2one.py @@ -1,11 +1,12 @@ from .field import Field class Many2One(Field): - def __init__(self, model, name=None, setter=None, namespace=None): + def __init__(self, model, name=None, setter=None, namespace=None, default=None): self.model = model self.setter = setter self.namespace = namespace self.field_name = name + self.default = default def __get__(self, inst, cls): if inst is None: diff --git a/tests/test_model.py b/tests/test_model.py index b42b473..c965649 100644 --- a/tests/test_model.py +++ b/tests/test_model.py @@ -314,3 +314,44 @@ def test_field_virtual(): person.age = 55 assert person.age == 55 assert "" == person.to_xml() + + +def test_field_inserted_default_attribute(): + class Person(facho.model.Model): + __name__ = 'Person' + + hash = fields.Attribute('hash', default='calculate') + + + person = Person() + assert '' == person.to_xml() + +def test_field_inserted_default_many2one(): + class ID(facho.model.Model): + __name__ = 'ID' + + key = fields.Attribute('key') + + def __default_set__(self, value): + self.key = value + + class Person(facho.model.Model): + __name__ = 'Person' + + id = fields.Many2One(ID, default="oe") + + person = Person() + assert '' == person.to_xml() + +def test_field_inserted_default_nested_many2one(): + class ID(facho.model.Model): + __name__ = 'ID' + + class Person(facho.model.Model): + __name__ = 'Person' + + id = fields.Many2One(ID, default="ole") + + person = Person() + assert 'ole' == person.to_xml() +