diff --git a/pytrustnfe/Strings.py b/pytrustnfe/Strings.py
index 9fcf6a9..d035fdb 100644
--- a/pytrustnfe/Strings.py
+++ b/pytrustnfe/Strings.py
@@ -1,3 +1,4 @@
+#coding=utf-8
'''
Created on Jun 17, 2015
diff --git a/pytrustnfe/servicos/Comunicacao.py b/pytrustnfe/servicos/Comunicacao.py
index a918525..0b891ae 100644
--- a/pytrustnfe/servicos/Comunicacao.py
+++ b/pytrustnfe/servicos/Comunicacao.py
@@ -10,10 +10,6 @@ from uuid import uuid4
from pytrustnfe.HttpClient import HttpClient
from pytrustnfe.Certificado import converte_pfx_pem
-import logging
-logging.basicConfig(level=logging.INFO)
-logging.getLogger('suds.client').setLevel(logging.DEBUG)
-logging.getLogger('suds.transport').setLevel(logging.DEBUG)
from pytrustnfe.Strings import CONSULTA_CADASTRO_COMPLETA
diff --git a/pytrustnfe/test/test_assinatura.py b/pytrustnfe/test/test_assinatura.py
index 4d2fad9..9642c63 100644
--- a/pytrustnfe/test/test_assinatura.py
+++ b/pytrustnfe/test/test_assinatura.py
@@ -30,7 +30,6 @@ class test_assinatura(unittest.TestCase):
caminho = os.path.dirname(__file__)
def test_assinar_xml_arquivo_invalido(self):
- print self.caminho
assinatura = Assinatura(os.path.join(self.caminho, 'teste_nao_existe.pfx'), '123456')
self.assertRaises(Exception, assinatura.assina_xml, XML_ASSINAR)
diff --git a/pytrustnfe/test/test_xml_serializacao.py b/pytrustnfe/test/test_xml_serializacao.py
index 8bc2e2c..f2e946f 100644
--- a/pytrustnfe/test/test_xml_serializacao.py
+++ b/pytrustnfe/test/test_xml_serializacao.py
@@ -1,13 +1,40 @@
-#coding=utf-8
+# coding=utf-8
import unittest
from lxml.etree import Element, ElementTree
-from pytrustnfe.xml.DynamicXml import DynamicXml, gerar_xml
+from pytrustnfe.xml.DynamicXml import DynamicXml
+
+XML_TESTE = ''\
+ '1'\
+ '1'\
+ ''\
+ ''\
+ ''\
+ '32'\
+ '0001'\
+ 'Venda de mercadorias'\
+ ''\
+ ''\
+ ''\
+ ''
+
+XML_LIST = ''\
+ ''\
+ '1'\
+ '21-06-2015'\
+ '123.00'\
+ ''\
+ ''\
+ '2'\
+ '21-07-2015'\
+ '123.00'\
+ ''\
+ ''
class test_xml_serializacao(unittest.TestCase):
-
- def test_serializacao(self):
+
+ def test_serializacao(self):
t = DynamicXml("enviNFe")
t(versao="3.10")
t.idLote = "1"
@@ -16,14 +43,21 @@ class test_xml_serializacao(unittest.TestCase):
t.NFe.infNFe.ide.cUF = "32"
t.NFe.infNFe.ide.cNF = "0001"
t.NFe.infNFe.ide.natOp = "Venda de mercadorias"
-
- print("Iniciando a geração do xml")
- print str(t)
- root = Element(str(t))
- gerar_xml(root, t)
- print(dir(t))
-
- tree = ElementTree(root)
- tree.write("/home/danimar/Desktop/nfe.xml")
-
-
\ No newline at end of file
+
+ xml = t.render()
+ self.assertEqual(xml, XML_TESTE, "Geração de xml com problemas")
+
+ def test_list_serializacao(self):
+ t = DynamicXml("cobr")
+ t.dup[0](item="1")
+ t.dup[0].nDup = '1'
+ t.dup[0].dVenc = '21-06-2015'
+ t.dup[0].vDup = '123.00'
+ t.dup[1](item="2")
+ t.dup[1].nDup = '2'
+ t.dup[1].dVenc = '21-07-2015'
+ t.dup[1].vDup = '123.00'
+
+ xml = t.render()
+ self.assertEqual(xml, XML_LIST,
+ "Xml com lista de valores sendo gerado incorretamnte")
diff --git a/pytrustnfe/xml/DynamicXml.py b/pytrustnfe/xml/DynamicXml.py
index a24effb..33141e8 100644
--- a/pytrustnfe/xml/DynamicXml.py
+++ b/pytrustnfe/xml/DynamicXml.py
@@ -1,3 +1,4 @@
+#coding=utf-8
'''
Created on Jun 17, 2015
@@ -5,6 +6,7 @@ Created on Jun 17, 2015
'''
import xml.etree.ElementTree as ET
+from lxml.etree import Element, ElementTree, tostring
from collections import OrderedDict
class DynamicXml(object):
@@ -16,15 +18,16 @@ class DynamicXml(object):
return object.__getattribute__(self,name)
def __setattr__(self, obj, val):
- if(obj=="value" or obj=="atributos"):
+ if(obj=="value" or obj=="atributos" or obj=="_indice"):
object.__setattr__(self,obj, val)
else:
- object.__setattr__(self,obj, DynamicXml(val))
+ self._indice = self._indice + 1
+ object.__setattr__(self,obj, DynamicXml(val, self._indice))
- def __init__(self, value):
+ def __init__(self, value, indice=0):
self.value = value
- self.atributos={}
- object.__setattr__(self, '__dict__', OrderedDict())
+ self.atributos={}
+ self._indice = indice
def __str__(self):
return str(self.value)
@@ -37,31 +40,34 @@ class DynamicXml(object):
return self.value
def __getitem__(self, i):
- print(self.value)
- if(i >= len(self.value)):
+ if not isinstance(self.value, list):
+ self.value = []
+ if(i+1 > len(self.value)):
self.value.append(DynamicXml(None))
return self.value[i]
-
-def gerar_xml(xml, objeto):
- for attr, value in objeto.__dict__.items():
- if(attr!="value" and attr!="atributos"):
- if(type(value()) == type([])):
- for item in value():
- print(item)
- gerar_xml(xml, item)
- else:
- sub = ET.SubElement(xml,attr)
- if(str(value)!="None"):
- sub.text = str(value)
- gerar_xml(sub, value)
- elif(attr=="atributos"):
- for atr, val in value.items():
- xml.set(atr.replace("__", ":"), str(val))
-
-
-
-
-
-
+ def render(self, pretty_print=False):
+ root = Element(self.value)
+ self._gerar_xml(root, self)
+ return tostring(root, pretty_print=pretty_print)
+
+ def _gerar_xml(self, xml, objeto):
+ items = sorted(
+ objeto.__dict__.items(),
+ key=lambda x: x[1]._indice if isinstance(x[1], DynamicXml) else 0
+ )
+ for attr, value in items:
+ if(attr!="value" and attr!="atributos" and attr!="_indice"):
+ if isinstance(value(), list):
+ for item in value():
+ sub = ET.SubElement(xml, attr)
+ self._gerar_xml(sub, item)
+ else:
+ sub = ET.SubElement(xml, attr)
+ if(str(value)!="None"):
+ sub.text = str(value)
+ self._gerar_xml(sub, value)
+ elif(attr=="atributos"):
+ for atr, val in value.items():
+ xml.set(atr.replace("__", ":"), str(val))