fields.Function manejan default
FossilOrigin-Name: ec954ac9253429b99095fbcce443a2691f516f603282aec1ee59c4b7cbbd6c4a
This commit is contained in:
		| @@ -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</%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 | ||||
|  | ||||
|          | ||||
|   | ||||
| @@ -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) | ||||
|   | ||||
| @@ -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) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user