se adiciona atributo default a many2one y attribute

FossilOrigin-Name: 9ddb1d1b8bebef24da17cc47d8fc70392f6015bb61866f251992aea518ed3d0f
This commit is contained in:
bit4bit 2021-06-25 01:39:02 +00:00
parent 3eacb29afa
commit a9dde83e81
6 changed files with 61 additions and 6 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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