se adiciona atributo default a many2one y attribute
FossilOrigin-Name: 9ddb1d1b8bebef24da17cc47d8fc70392f6015bb61866f251992aea518ed3d0f
This commit is contained in:
parent
3eacb29afa
commit
a9dde83e81
@ -1,3 +1,4 @@
|
|||||||
|
from .fields import Field
|
||||||
|
|
||||||
class ModelMeta(type):
|
class ModelMeta(type):
|
||||||
def __new__(cls, name, bases, ns):
|
def __new__(cls, name, bases, ns):
|
||||||
@ -19,7 +20,15 @@ class ModelBase(object, metaclass=ModelMeta):
|
|||||||
obj._fields = {}
|
obj._fields = {}
|
||||||
obj._text = ""
|
obj._text = ""
|
||||||
obj._namespace_prefix = None
|
obj._namespace_prefix = None
|
||||||
|
|
||||||
|
# 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 hasattr(v, 'default') and v.default is not None:
|
||||||
|
setattr(obj, key, v.default)
|
||||||
|
|
||||||
|
|
||||||
return obj
|
return obj
|
||||||
|
|
||||||
def __setitem__(self, key, val):
|
def __setitem__(self, key, val):
|
||||||
@ -32,10 +41,12 @@ class ModelBase(object, metaclass=ModelMeta):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
def __default_set__(self, value):
|
def __default_set__(self, value):
|
||||||
return str(value)
|
return value
|
||||||
|
|
||||||
def _set_content(self, value):
|
def _set_content(self, value):
|
||||||
self._text = str(self.__default_set__(value))
|
default = self.__default_set__(value)
|
||||||
|
if default is not None:
|
||||||
|
self._text = str(default)
|
||||||
|
|
||||||
def _hook_before_xml(self):
|
def _hook_before_xml(self):
|
||||||
self.__before_xml__()
|
self.__before_xml__()
|
||||||
@ -63,7 +74,6 @@ class ModelBase(object, metaclass=ModelMeta):
|
|||||||
|
|
||||||
for name, value in self._fields.items():
|
for name, value in self._fields.items():
|
||||||
if hasattr(value, 'to_xml'):
|
if hasattr(value, 'to_xml'):
|
||||||
print(self._fields)
|
|
||||||
content += value.to_xml()
|
content += value.to_xml()
|
||||||
elif isinstance(value, str):
|
elif isinstance(value, str):
|
||||||
content += value
|
content += value
|
||||||
|
@ -3,5 +3,6 @@ from .many2one import Many2One
|
|||||||
from .model import Model
|
from .model import Model
|
||||||
from .function import Function
|
from .function import Function
|
||||||
from .virtual import Virtual
|
from .virtual import Virtual
|
||||||
|
from .field import Field
|
||||||
|
|
||||||
__all__ = [Attribute, Many2One, Model, Virtual]
|
__all__ = [Attribute, Many2One, Model, Virtual, Field]
|
||||||
|
@ -4,6 +4,7 @@ class Attribute(Field):
|
|||||||
def __init__(self, tag, default=None):
|
def __init__(self, tag, default=None):
|
||||||
self.tag = tag
|
self.tag = tag
|
||||||
self.value = default
|
self.value = default
|
||||||
|
self.default = default
|
||||||
|
|
||||||
def __get__(self, inst, cls):
|
def __get__(self, inst, cls):
|
||||||
if inst is None:
|
if inst is None:
|
||||||
|
@ -14,6 +14,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._fields[self.name] = self.field
|
inst._fields[self.name] = self.field
|
||||||
|
|
||||||
if self.getter is not None:
|
if self.getter is not None:
|
||||||
|
@ -1,11 +1,12 @@
|
|||||||
from .field import Field
|
from .field import Field
|
||||||
|
|
||||||
class Many2One(Field):
|
class Many2One(Field):
|
||||||
def __init__(self, model, name=None, setter=None, namespace=None):
|
def __init__(self, model, name=None, setter=None, namespace=None, default=None):
|
||||||
self.model = model
|
self.model = model
|
||||||
self.setter = setter
|
self.setter = setter
|
||||||
self.namespace = namespace
|
self.namespace = namespace
|
||||||
self.field_name = name
|
self.field_name = name
|
||||||
|
self.default = default
|
||||||
|
|
||||||
def __get__(self, inst, cls):
|
def __get__(self, inst, cls):
|
||||||
if inst is None:
|
if inst is None:
|
||||||
|
@ -314,3 +314,44 @@ def test_field_virtual():
|
|||||||
person.age = 55
|
person.age = 55
|
||||||
assert person.age == 55
|
assert person.age == 55
|
||||||
assert "<Person/>" == person.to_xml()
|
assert "<Person/>" == person.to_xml()
|
||||||
|
|
||||||
|
|
||||||
|
def test_field_inserted_default_attribute():
|
||||||
|
class Person(facho.model.Model):
|
||||||
|
__name__ = 'Person'
|
||||||
|
|
||||||
|
hash = fields.Attribute('hash', default='calculate')
|
||||||
|
|
||||||
|
|
||||||
|
person = Person()
|
||||||
|
assert '<Person hash="calculate"/>' == person.to_xml()
|
||||||
|
|
||||||
|
def test_field_inserted_default_many2one():
|
||||||
|
class ID(facho.model.Model):
|
||||||
|
__name__ = 'ID'
|
||||||
|
|
||||||
|
key = fields.Attribute('key')
|
||||||
|
|
||||||
|
def __default_set__(self, value):
|
||||||
|
self.key = value
|
||||||
|
|
||||||
|
class Person(facho.model.Model):
|
||||||
|
__name__ = 'Person'
|
||||||
|
|
||||||
|
id = fields.Many2One(ID, default="oe")
|
||||||
|
|
||||||
|
person = Person()
|
||||||
|
assert '<Person><ID key="oe"/></Person>' == person.to_xml()
|
||||||
|
|
||||||
|
def test_field_inserted_default_nested_many2one():
|
||||||
|
class ID(facho.model.Model):
|
||||||
|
__name__ = 'ID'
|
||||||
|
|
||||||
|
class Person(facho.model.Model):
|
||||||
|
__name__ = 'Person'
|
||||||
|
|
||||||
|
id = fields.Many2One(ID, default="ole")
|
||||||
|
|
||||||
|
person = Person()
|
||||||
|
assert '<Person><ID>ole</ID></Person>' == person.to_xml()
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user