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