diff --git a/facho/model/__init__.py b/facho/model/__init__.py
index 13d7c13..33cd824 100644
--- a/facho/model/__init__.py
+++ b/facho/model/__init__.py
@@ -1,3 +1,4 @@
+from .fields import Field
class ModelMeta(type):
def __new__(cls, name, bases, ns):
@@ -19,7 +20,15 @@ class ModelBase(object, metaclass=ModelMeta):
obj._fields = {}
obj._text = ""
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
def __setitem__(self, key, val):
@@ -32,10 +41,12 @@ class ModelBase(object, metaclass=ModelMeta):
pass
def __default_set__(self, value):
- return str(value)
+ return 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):
self.__before_xml__()
@@ -63,7 +74,6 @@ class ModelBase(object, metaclass=ModelMeta):
for name, value in self._fields.items():
if hasattr(value, 'to_xml'):
- print(self._fields)
content += value.to_xml()
elif isinstance(value, str):
content += value
diff --git a/facho/model/fields/__init__.py b/facho/model/fields/__init__.py
index 77d3bef..4e35a11 100644
--- a/facho/model/fields/__init__.py
+++ b/facho/model/fields/__init__.py
@@ -3,5 +3,6 @@ from .many2one import Many2One
from .model import Model
from .function import Function
from .virtual import Virtual
+from .field import Field
-__all__ = [Attribute, Many2One, Model, Virtual]
+__all__ = [Attribute, Many2One, Model, Virtual, Field]
diff --git a/facho/model/fields/attribute.py b/facho/model/fields/attribute.py
index e8fd7a0..e89268a 100644
--- a/facho/model/fields/attribute.py
+++ b/facho/model/fields/attribute.py
@@ -4,6 +4,7 @@ class Attribute(Field):
def __init__(self, tag, default=None):
self.tag = tag
self.value = default
+ self.default = default
def __get__(self, inst, cls):
if inst is None:
diff --git a/facho/model/fields/function.py b/facho/model/fields/function.py
index 2294041..20ba6e9 100644
--- a/facho/model/fields/function.py
+++ b/facho/model/fields/function.py
@@ -14,6 +14,7 @@ class Function(Field):
# si se indica `field` se adiciona
# como campo del modelo, esto es
# que se serializa a xml
+ self.field.name = self.name
inst._fields[self.name] = self.field
if self.getter is not None:
diff --git a/facho/model/fields/many2one.py b/facho/model/fields/many2one.py
index 0ead219..d75e03b 100644
--- a/facho/model/fields/many2one.py
+++ b/facho/model/fields/many2one.py
@@ -1,11 +1,12 @@
from .field import 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.setter = setter
self.namespace = namespace
self.field_name = name
+ self.default = default
def __get__(self, inst, cls):
if inst is None:
diff --git a/tests/test_model.py b/tests/test_model.py
index b42b473..c965649 100644
--- a/tests/test_model.py
+++ b/tests/test_model.py
@@ -314,3 +314,44 @@ def test_field_virtual():
person.age = 55
assert person.age == 55
assert "" == 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.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.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 'ole' == person.to_xml()
+