From ba908b938cac9605eafbb5b13ec4ac014c95f2a8 Mon Sep 17 00:00:00 2001 From: bit4bit Date: Sat, 26 Jun 2021 23:23:25 +0000 Subject: [PATCH] se refleja el orden de los atributos del modelo en el xml FossilOrigin-Name: 5ff5ebc397a11977916b7008ab4d5104a375290a5c5d0356098b69242378f1f8 --- facho/model/__init__.py | 17 +++++++++++++++-- tests/test_model_invoice.py | 4 +--- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/facho/model/__init__.py b/facho/model/__init__.py index e70b903..57f7489 100644 --- a/facho/model/__init__.py +++ b/facho/model/__init__.py @@ -22,6 +22,7 @@ class ModelBase(object, metaclass=ModelMeta): obj._text = "" obj._namespace_prefix = None obj._on_change_fields = defaultdict(list) + obj._order_fields = [] def on_change_fields_for_function(): # se recorre arbol buscando el primero @@ -38,7 +39,9 @@ class ModelBase(object, metaclass=ModelMeta): # forzamos registros de campos al modelo # al instanciar for (key, v) in type(obj).__dict__.items(): - + if isinstance(v, fields.Field): + obj._order_fields.append(key) + if isinstance(v, fields.Attribute) or isinstance(v, fields.Many2One) or isinstance(v, fields.Function): if hasattr(v, 'default') and v.default is not None: setattr(obj, key, v.default) @@ -98,7 +101,17 @@ class ModelBase(object, metaclass=ModelMeta): content = "" - for value in self._fields.values(): + ordered_fields = {} + for name in self._order_fields: + if name in self._fields: + ordered_fields[name] = True + else: + for key in self._fields.keys(): + if key.startswith(name): + ordered_fields[key] = True + + for name in ordered_fields.keys(): + value = self._fields[name] if hasattr(value, 'to_xml'): content += value.to_xml() elif isinstance(value, str): diff --git a/tests/test_model_invoice.py b/tests/test_model_invoice.py index 6e6b49e..a28df1c 100644 --- a/tests/test_model_invoice.py +++ b/tests/test_model_invoice.py @@ -21,10 +21,8 @@ def test_simple_invoice(): line = invoice.lines.create() line.quantity = form.Quantity(1, '94') + line.price = form.Amount(5_000) subtotal = line.taxtotal.subtotals.create() subtotal.percent = 19.0 - # TODO(bit4bit) el orden de los elementos - # en el xml lo debe determinar la declaracion en los modelos - line.price = form.Amount(5_000) assert '3232000001292019-01-16T10:53:10-05:0010:5310-05:007000853718001994361.019.001IVA5000.0' == invoice.to_xml()