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. 58
      pytrustnfe/test/test_xml_serializacao.py
  5. 62
      pytrustnfe/xml/DynamicXml.py

1
pytrustnfe/Strings.py

@ -1,3 +1,4 @@
#coding=utf-8
'''
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.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

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

58
pytrustnfe/test/test_xml_serializacao.py

@ -1,8 +1,35 @@
#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 = '<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):
@ -17,13 +44,20 @@ class test_xml_serializacao(unittest.TestCase):
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")
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")

62
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._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))
Loading…
Cancel
Save