Browse Source

Serialização completa

tags/0.1.5
Danimar Ribeiro 11 years ago
parent
commit
d162f6bd60
  1. 1
      pytrustnfe/Strings.py
  2. 4
      pytrustnfe/servicos/Comunicacao.py
  3. 1
      pytrustnfe/test/test_assinatura.py
  4. 64
      pytrustnfe/test/test_xml_serializacao.py
  5. 64
      pytrustnfe/xml/DynamicXml.py

1
pytrustnfe/Strings.py

@ -1,3 +1,4 @@
#coding=utf-8
''' '''
Created on Jun 17, 2015 Created on Jun 17, 2015

4
pytrustnfe/servicos/Comunicacao.py

@ -10,10 +10,6 @@ from uuid import uuid4
from pytrustnfe.HttpClient import HttpClient from pytrustnfe.HttpClient import HttpClient
from pytrustnfe.Certificado import converte_pfx_pem 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 from pytrustnfe.Strings import CONSULTA_CADASTRO_COMPLETA

1
pytrustnfe/test/test_assinatura.py

@ -30,7 +30,6 @@ class test_assinatura(unittest.TestCase):
caminho = os.path.dirname(__file__) caminho = os.path.dirname(__file__)
def test_assinar_xml_arquivo_invalido(self): def test_assinar_xml_arquivo_invalido(self):
print self.caminho
assinatura = Assinatura(os.path.join(self.caminho, 'teste_nao_existe.pfx'), '123456') assinatura = Assinatura(os.path.join(self.caminho, 'teste_nao_existe.pfx'), '123456')
self.assertRaises(Exception, assinatura.assina_xml, XML_ASSINAR) self.assertRaises(Exception, assinatura.assina_xml, XML_ASSINAR)

64
pytrustnfe/test/test_xml_serializacao.py

@ -1,13 +1,40 @@
#coding=utf-8
# coding=utf-8
import unittest import unittest
from lxml.etree import Element, ElementTree from lxml.etree import Element, ElementTree
from pytrustnfe.xml.DynamicXml import DynamicXml, gerar_xml
from pytrustnfe.xml.DynamicXml import DynamicXml
XML_TESTE = '<enviNFe versao="3.10">'\
'<idLote>1</idLote>'\
'<indSinc>1</indSinc>'\
'<NFe>'\
'<infNFe versao="3.10" Id="NFe456465465465465654652123564878">'\
'<ide>'\
'<cUF>32</cUF>'\
'<cNF>0001</cNF>'\
'<natOp>Venda de mercadorias</natOp>'\
'</ide>'\
'</infNFe>'\
'</NFe>'\
'</enviNFe>'
XML_LIST = '<cobr>'\
'<dup item="1">'\
'<nDup>1</nDup>'\
'<dVenc>21-06-2015</dVenc>'\
'<vDup>123.00</vDup>'\
'</dup>'\
'<dup item="2">'\
'<nDup>2</nDup>'\
'<dVenc>21-07-2015</dVenc>'\
'<vDup>123.00</vDup>'\
'</dup>'\
'</cobr>'
class test_xml_serializacao(unittest.TestCase): class test_xml_serializacao(unittest.TestCase):
def test_serializacao(self):
def test_serializacao(self):
t = DynamicXml("enviNFe") t = DynamicXml("enviNFe")
t(versao="3.10") t(versao="3.10")
t.idLote = "1" t.idLote = "1"
@ -16,14 +43,21 @@ class test_xml_serializacao(unittest.TestCase):
t.NFe.infNFe.ide.cUF = "32" t.NFe.infNFe.ide.cUF = "32"
t.NFe.infNFe.ide.cNF = "0001" t.NFe.infNFe.ide.cNF = "0001"
t.NFe.infNFe.ide.natOp = "Venda de mercadorias" 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")
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")

64
pytrustnfe/xml/DynamicXml.py

@ -1,3 +1,4 @@
#coding=utf-8
''' '''
Created on Jun 17, 2015 Created on Jun 17, 2015
@ -5,6 +6,7 @@ Created on Jun 17, 2015
''' '''
import xml.etree.ElementTree as ET import xml.etree.ElementTree as ET
from lxml.etree import Element, ElementTree, tostring
from collections import OrderedDict from collections import OrderedDict
class DynamicXml(object): class DynamicXml(object):
@ -16,15 +18,16 @@ class DynamicXml(object):
return object.__getattribute__(self,name) return object.__getattribute__(self,name)
def __setattr__(self, obj, val): 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) object.__setattr__(self,obj, val)
else: 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.value = value
self.atributos={}
object.__setattr__(self, '__dict__', OrderedDict())
self.atributos={}
self._indice = indice
def __str__(self): def __str__(self):
return str(self.value) return str(self.value)
@ -37,31 +40,34 @@ class DynamicXml(object):
return self.value return self.value
def __getitem__(self, i): 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)) self.value.append(DynamicXml(None))
return self.value[i] 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))
Loading…
Cancel
Save