se adiciona atributo default a many2one y attribute
FossilOrigin-Name: 9ddb1d1b8bebef24da17cc47d8fc70392f6015bb61866f251992aea518ed3d0f
This commit is contained in:
		| @@ -1,3 +1,4 @@ | |||||||
|  | from .fields import Field | ||||||
|  |  | ||||||
| class ModelMeta(type): | class ModelMeta(type): | ||||||
|     def __new__(cls, name, bases, ns): |     def __new__(cls, name, bases, ns): | ||||||
| @@ -20,6 +21,14 @@ class ModelBase(object, metaclass=ModelMeta): | |||||||
|         obj._text = "" |         obj._text = "" | ||||||
|         obj._namespace_prefix = None |         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 |         return obj | ||||||
|  |  | ||||||
|     def __setitem__(self, key, val): |     def __setitem__(self, key, val): | ||||||
| @@ -32,10 +41,12 @@ class ModelBase(object, metaclass=ModelMeta): | |||||||
|         pass |         pass | ||||||
|  |  | ||||||
|     def __default_set__(self, value): |     def __default_set__(self, value): | ||||||
|         return str(value) |         return value | ||||||
|      |      | ||||||
|     def _set_content(self, 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): |     def _hook_before_xml(self): | ||||||
|         self.__before_xml__() |         self.__before_xml__() | ||||||
| @@ -63,7 +74,6 @@ class ModelBase(object, metaclass=ModelMeta): | |||||||
|  |  | ||||||
|         for name, value in self._fields.items(): |         for name, value in self._fields.items(): | ||||||
|             if hasattr(value, 'to_xml'): |             if hasattr(value, 'to_xml'): | ||||||
|                 print(self._fields) |  | ||||||
|                 content += value.to_xml() |                 content += value.to_xml() | ||||||
|             elif isinstance(value, str): |             elif isinstance(value, str): | ||||||
|                 content += value |                 content += value | ||||||
|   | |||||||
| @@ -3,5 +3,6 @@ from .many2one import Many2One | |||||||
| from .model import Model | from .model import Model | ||||||
| from .function import Function | from .function import Function | ||||||
| from .virtual import Virtual | from .virtual import Virtual | ||||||
|  | from .field import Field | ||||||
|  |  | ||||||
| __all__ = [Attribute, Many2One, Model, Virtual] | __all__ = [Attribute, Many2One, Model, Virtual, Field] | ||||||
|   | |||||||
| @@ -4,6 +4,7 @@ class Attribute(Field): | |||||||
|     def __init__(self, tag, default=None): |     def __init__(self, tag, default=None): | ||||||
|         self.tag = tag |         self.tag = tag | ||||||
|         self.value = default |         self.value = default | ||||||
|  |         self.default = default | ||||||
|  |  | ||||||
|     def __get__(self, inst, cls): |     def __get__(self, inst, cls): | ||||||
|         if inst is None: |         if inst is None: | ||||||
|   | |||||||
| @@ -14,6 +14,7 @@ class Function(Field): | |||||||
|         # si se indica `field` se adiciona |         # si se indica `field` se adiciona | ||||||
|         # como campo del modelo, esto es |         # como campo del modelo, esto es | ||||||
|         # que se serializa a xml |         # que se serializa a xml | ||||||
|  |         self.field.name = self.name | ||||||
|         inst._fields[self.name] = self.field |         inst._fields[self.name] = self.field | ||||||
|  |  | ||||||
|         if self.getter is not None: |         if self.getter is not None: | ||||||
|   | |||||||
| @@ -1,11 +1,12 @@ | |||||||
| from .field import Field | from .field import Field | ||||||
|  |  | ||||||
| class Many2One(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.model = model | ||||||
|         self.setter = setter |         self.setter = setter | ||||||
|         self.namespace = namespace |         self.namespace = namespace | ||||||
|         self.field_name = name |         self.field_name = name | ||||||
|  |         self.default = default | ||||||
|  |  | ||||||
|     def __get__(self, inst, cls): |     def __get__(self, inst, cls): | ||||||
|         if inst is None: |         if inst is None: | ||||||
|   | |||||||
| @@ -314,3 +314,44 @@ def test_field_virtual(): | |||||||
|     person.age = 55 |     person.age = 55 | ||||||
|     assert person.age == 55 |     assert person.age == 55 | ||||||
|     assert "<Person/>" == person.to_xml() |     assert "<Person/>" == 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 hash="calculate"/>' == 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><ID key="oe"/></Person>' == 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 '<Person><ID>ole</ID></Person>' == person.to_xml() | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user