fields.Function manejan default
FossilOrigin-Name: ec954ac9253429b99095fbcce443a2691f516f603282aec1ee59c4b7cbbd6c4a
This commit is contained in:
		| @@ -24,24 +24,28 @@ class ModelBase(object, metaclass=ModelMeta): | |||||||
|         # forzamos registros de campos al modelo |         # forzamos registros de campos al modelo | ||||||
|         # al instanciar |         # al instanciar | ||||||
|         for (key, v) in type(obj).__dict__.items(): |         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: |                 if hasattr(v, 'default') and v.default is not None: | ||||||
|                     setattr(obj, key, v.default) |                     setattr(obj, key, v.default) | ||||||
|  |  | ||||||
|  |  | ||||||
|         return obj |         return obj | ||||||
|  |  | ||||||
|  |     def _set_attribute(self, field, name, value): | ||||||
|  |         self._xml_attributes[field] = (name, value) | ||||||
|  |  | ||||||
|     def __setitem__(self, key, val): |     def __setitem__(self, key, val): | ||||||
|         self._xml_attributes[key] = val |         self._xml_attributes[key] = val | ||||||
|  |  | ||||||
|     def __getitem__(self, key): |     def __getitem__(self, key): | ||||||
|         return self._xml_attributes[key] |         return self._xml_attributes[key] | ||||||
|  |  | ||||||
|     def __before_xml__(self): |     def _get_field(self, name): | ||||||
|         pass |         return self._fields[name] | ||||||
|  |  | ||||||
|     def __default_set__(self, value): |     def _set_field(self, name, field): | ||||||
|         return value |         field.name = name | ||||||
|  |         self._fields[name] = field | ||||||
|  |  | ||||||
|     def _set_content(self, value): |     def _set_content(self, value): | ||||||
|         default = self.__default_set__(value) |         default = self.__default_set__(value) | ||||||
| @@ -55,6 +59,9 @@ class ModelBase(object, metaclass=ModelMeta): | |||||||
|                 field.__before_xml__() |                 field.__before_xml__() | ||||||
|  |  | ||||||
|     def to_xml(self): |     def to_xml(self): | ||||||
|  |         """ | ||||||
|  |         Genera xml del modelo y sus relaciones | ||||||
|  |         """ | ||||||
|         self._hook_before_xml() |         self._hook_before_xml() | ||||||
|  |  | ||||||
|         tag = self.__name__ |         tag = self.__name__ | ||||||
| @@ -85,5 +92,19 @@ class ModelBase(object, metaclass=ModelMeta): | |||||||
|             return "<%s%s%s>%s</%s%s>" % (ns, tag, attributes, content, ns, tag) |             return "<%s%s%s>%s</%s%s>" % (ns, tag, attributes, content, ns, tag) | ||||||
|  |  | ||||||
| class Model(ModelBase): | class Model(ModelBase): | ||||||
|  |     def __before_xml__(self): | ||||||
|  |         """ | ||||||
|  |         Ejecuta antes de generar el xml, este | ||||||
|  |         metodo sirve para realizar actualizaciones | ||||||
|  |         en los campos en el ultimo momento | ||||||
|  |         """ | ||||||
|         pass |         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 | ||||||
|  |  | ||||||
|  |          | ||||||
|   | |||||||
| @@ -1,8 +1,8 @@ | |||||||
| from .field import Field | from .field import Field | ||||||
|  |  | ||||||
| class Attribute(Field): | class Attribute(Field): | ||||||
|     def __init__(self, tag, default=None): |     def __init__(self, name, default=None): | ||||||
|         self.tag = tag |         self.attribute = name | ||||||
|         self.value = default |         self.value = default | ||||||
|         self.default = default |         self.default = default | ||||||
|  |  | ||||||
| @@ -16,4 +16,4 @@ class Attribute(Field): | |||||||
|     def __set__(self, inst, value): |     def __set__(self, inst, value): | ||||||
|         assert self.name is not None |         assert self.name is not None | ||||||
|         self.value = value |         self.value = value | ||||||
|         inst._xml_attributes[self.name] = (self.tag, value) |         inst._set_attribute(self.name, self.attribute, value) | ||||||
|   | |||||||
| @@ -2,9 +2,14 @@ from .field import Field | |||||||
| from .model import Model | from .model import Model | ||||||
|  |  | ||||||
| class Function(Field): | 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.field = field | ||||||
|         self.getter = getter |         self.getter = getter | ||||||
|  |         self.default = default | ||||||
|  |  | ||||||
|     def __get__(self, inst, cls): |     def __get__(self, inst, cls): | ||||||
|         if inst is None: |         if inst is None: | ||||||
| @@ -14,8 +19,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._set_field(self.name, self.field) | ||||||
|         inst._fields[self.name] = self.field |  | ||||||
|  |  | ||||||
|         if self.getter is not None: |         if self.getter is not None: | ||||||
|             value = self._call(inst, self.getter, self.name, self.field) |             value = self._call(inst, self.getter, self.name, self.field) | ||||||
| @@ -24,3 +28,7 @@ class Function(Field): | |||||||
|                 self.field.__set__(inst, value) |                 self.field.__set__(inst, value) | ||||||
|  |  | ||||||
|         return self.field |         return self.field | ||||||
|  |  | ||||||
|  |     def __set__(self, inst, value): | ||||||
|  |         inst._set_field(self.name, self.field) | ||||||
|  |         self.field.__set__(inst, value) | ||||||
|   | |||||||
| @@ -326,6 +326,15 @@ def test_field_inserted_default_attribute(): | |||||||
|     person = Person() |     person = Person() | ||||||
|     assert '<Person hash="calculate"/>' == person.to_xml() |     assert '<Person hash="calculate"/>' == 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 hash="calculate"/>' == person.to_xml() | ||||||
|  |  | ||||||
| def test_field_inserted_default_many2one(): | def test_field_inserted_default_many2one(): | ||||||
|     class ID(facho.model.Model): |     class ID(facho.model.Model): | ||||||
|         __name__ = 'ID' |         __name__ = 'ID' | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user