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