el uso de __default_set__ y __default_get__ facilitan la creacion de un objeto como tipo

FossilOrigin-Name: e7fa7e3a3b312ad6b88a85b508b496308e5bb54b1d51ab5d50f4d4207830f175
This commit is contained in:
bit4bit
2021-07-31 18:31:38 +00:00
parent 69a74c0714
commit ddee0e45c1
5 changed files with 85 additions and 88 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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