el uso de __default_set__ y __default_get__ facilitan la creacion de un objeto como tipo
FossilOrigin-Name: e7fa7e3a3b312ad6b88a85b508b496308e5bb54b1d51ab5d50f4d4207830f175
This commit is contained in:
		| @@ -52,6 +52,7 @@ class ModelBase(object, metaclass=ModelMeta): | ||||
|                     obj._on_change_fields[field].append(fun) | ||||
|  | ||||
|  | ||||
|         # post inicializacion del objeto | ||||
|         obj.__setup__() | ||||
|         return obj | ||||
|  | ||||
| @@ -76,17 +77,17 @@ class ModelBase(object, metaclass=ModelMeta): | ||||
|         if default is not None: | ||||
|             self._value = default | ||||
|  | ||||
|     def _hook_before_xml(self): | ||||
|         self.__before_xml__() | ||||
|         for field in self._fields.values(): | ||||
|             if hasattr(field, '__before_xml__'): | ||||
|                 field.__before_xml__() | ||||
|  | ||||
|     def to_xml(self): | ||||
|         """ | ||||
|         Genera xml del modelo y sus relaciones | ||||
|         """ | ||||
|         self._hook_before_xml() | ||||
|         def _hook_before_xml(): | ||||
|             self.__before_xml__() | ||||
|             for field in self._fields.values(): | ||||
|                 if hasattr(field, '__before_xml__'): | ||||
|                     field.__before_xml__() | ||||
|                      | ||||
|         _hook_before_xml() | ||||
|  | ||||
|         tag = self.__name__ | ||||
|         ns = '' | ||||
| @@ -149,6 +150,7 @@ class Model(ModelBase): | ||||
|  | ||||
|     def __default_get__(self, name, value): | ||||
|         """ | ||||
|         Al obtener el valor atraves de una relacion (age = person.age) | ||||
|         Retorno de valor por defecto | ||||
|         """ | ||||
|         return value | ||||
|   | ||||
| @@ -25,8 +25,10 @@ class Many2One(Field): | ||||
|         # se puede obtener directamente un valor indicado por el modelo | ||||
|         if hasattr(value, '__default_get__'): | ||||
|             return value.__default_get__(self.name, value) | ||||
|         else: | ||||
|         elif hasattr(inst, '__default_get__'): | ||||
|             return inst.__default_get__(self.name, value) | ||||
|         else: | ||||
|             return value | ||||
|          | ||||
|     def __set__(self, inst, value): | ||||
|         assert self.name is not None | ||||
|   | ||||
| @@ -13,12 +13,21 @@ class _RelationProxy(): | ||||
|         if (name in self.__dict__): | ||||
|             return self.__dict__[name] | ||||
|  | ||||
|         return getattr(self.__dict__['_obj'], name) | ||||
|         rel = getattr(self.__dict__['_obj'], name) | ||||
|         if hasattr(rel, '__default_get__'): | ||||
|             return rel.__default_get__(name, rel) | ||||
|  | ||||
|         return rel | ||||
|  | ||||
|     def __setattr__(self, attr, value): | ||||
|         # TODO(bit4bit) hacemos proxy al sistema de notificacion de cambios | ||||
|         # algo burdo, se usa __dict__ para saltarnos el __getattr__ y generar un fallo por recursion | ||||
|         response = setattr(self._obj, attr, value) | ||||
|         # algo burdo, se usa __dict__ para saltarnos el __getattr__ y evitar un fallo por recursion | ||||
|         rel = getattr(self.__dict__['_obj'], attr) | ||||
|         if hasattr(rel, '__default_set__'): | ||||
|             response = setattr(self._obj, attr, rel.__default_set__(value)) | ||||
|         else: | ||||
|             response = setattr(self._obj, attr, value) | ||||
|  | ||||
|         for fun in self.__dict__['_inst']._on_change_fields[self.__dict__['_attribute']]: | ||||
|             fun(self.__dict__['_inst'], self.__dict__['_attribute'], value) | ||||
|         return response | ||||
|   | ||||
		Reference in New Issue
	
	Block a user