From 6bdcb1ad8bd2f9c35280f919c6769c7ee9e7cde5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89dipo=20Maciel?= Date: Wed, 5 Nov 2014 17:43:48 -0200 Subject: [PATCH] Adds new mode of reading municipio - BEFORE - Cliente and Emitente expected municipio codes - NOW - Cliente and Emitente expects municipio names to get its codes - Fixes PEP8 in utils/__init__.py --- pynfe/processamento/serializacao.py | 19 +++++------- pynfe/utils/__init__.py | 62 +++++++++++++++++++++---------------- 2 files changed, 44 insertions(+), 37 deletions(-) diff --git a/pynfe/processamento/serializacao.py b/pynfe/processamento/serializacao.py index e3f3c87..f4c889b 100644 --- a/pynfe/processamento/serializacao.py +++ b/pynfe/processamento/serializacao.py @@ -35,7 +35,6 @@ class Serializacao(object): def exportar(self, destino, **kwargs): """Gera o(s) arquivo(s) de exportacao a partir da Nofa Fiscal eletronica ou lista delas.""" - raise NotImplementedError def importar(self, origem): @@ -87,10 +86,9 @@ class SerializacaoXML(Serializacao): etree.SubElement(endereco, 'nro').text = emitente.endereco_numero etree.SubElement(endereco, 'xCpl').text = emitente.endereco_complemento etree.SubElement(endereco, 'xBairro').text = emitente.endereco_bairro - etree.SubElement(endereco, 'cMun').text = emitente.endereco_municipio - etree.SubElement(endereco, 'xMun').text = obter_municipio_por_codigo( - emitente.endereco_municipio, emitente.endereco_uf, - ) + etree.SubElement(endereco, 'cMun').text = obter_codigo_por_municipio( + emitente.endereco_municipio, emitente.endereco_uf) + etree.SubElement(endereco, 'xMun').text = emitente.endereco_municipio etree.SubElement(endereco, 'UF').text = emitente.endereco_uf etree.SubElement(endereco, 'CEP').text = so_numeros(emitente.endereco_cep) etree.SubElement(endereco, 'cPais').text = emitente.endereco_pais @@ -116,10 +114,9 @@ class SerializacaoXML(Serializacao): etree.SubElement(endereco, 'nro').text = cliente.endereco_numero etree.SubElement(endereco, 'xCpl').text = cliente.endereco_complemento etree.SubElement(endereco, 'xBairro').text = cliente.endereco_bairro - etree.SubElement(endereco, 'cMun').text = cliente.endereco_municipio - etree.SubElement(endereco, 'xMun').text = obter_municipio_por_codigo( - cliente.endereco_municipio, cliente.endereco_uf, - ) + etree.SubElement(endereco, 'cMun').text = obter_codigo_por_municipio( + cliente.endereco_municipio, cliente.endereco_uf) + etree.SubElement(endereco, 'xMun').text = cliente.endereco_municipio etree.SubElement(endereco, 'UF').text = cliente.endereco_uf etree.SubElement(endereco, 'CEP').text = so_numeros(cliente.endereco_cep) etree.SubElement(endereco, 'cPais').text = cliente.endereco_pais @@ -501,7 +498,7 @@ class SerializacaoPipes(Serializacao): self._ambiente, nota_fiscal.finalidade_emissao, nota_fiscal.processo_emissao, - '%s %s' % (self._nome_aplicacao, + '%s %s' % (self._nome_aplicacao, nota_fiscal.versao_processo_emissao), '', # dhCont - Data e Hora da entrada em contingência '', # xJust - Justificativa da entrada em contingência @@ -556,7 +553,7 @@ class SerializacaoPipes(Serializacao): except TypeError as err: enum_args = '\n'.join( map( - lambda x: str(x[0]) + ' ' + str(x[1]), + lambda x: str(x[0]) + ' ' + str(x[1]), enumerate(serial_data) ) ) diff --git a/pynfe/utils/__init__.py b/pynfe/utils/__init__.py index ac62812..af163d0 100644 --- a/pynfe/utils/__init__.py +++ b/pynfe/utils/__init__.py @@ -5,25 +5,25 @@ import codecs import unicodedata try: - from lxml import etree + from lxml import etree except ImportError: - try: - # Python 2.5 - cElementTree - import xml.etree.cElementTree as etree - except ImportError: try: - # Python 2.5 - ElementTree - import xml.etree.ElementTree as etree + # Python 2.5 - cElementTree + import xml.etree.cElementTree as etree except ImportError: - try: - # Instalacao normal do cElementTree - import cElementTree as etree - except ImportError: try: - # Instalacao normal do ElementTree - import elementtree.ElementTree as etree + # Python 2.5 - ElementTree + import xml.etree.ElementTree as etree except ImportError: - raise Exception('Falhou ao importar lxml/ElementTree') + try: + # Instalacao normal do cElementTree + import cElementTree as etree + except ImportError: + try: + # Instalacao normal do ElementTree + import elementtree.ElementTree as etree + except ImportError: + raise Exception('Falhou ao importar lxml/ElementTree') try: from cStringIO import StringIO @@ -34,10 +34,12 @@ import flags # from geraldo.utils import memoize + # @memoize def so_numeros(texto): """Retorna o texto informado mas somente os numeros""" - return ''.join(filter(lambda c: ord(c) in range(48,58), texto)) + return ''.join(filter(lambda c: ord(c) in range(48, 58), texto)) + # @memoize def obter_pais_por_codigo(codigo): @@ -45,7 +47,8 @@ def obter_pais_por_codigo(codigo): if codigo == '1058': return 'Brasil' -CAMINHO_DATA = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'data') +CAMINHO_DATA = os.path.join(os.path.dirname( + os.path.abspath(__file__)), '..', 'data') CAMINHO_MUNICIPIOS = os.path.join(CAMINHO_DATA, 'MunIBGE') CARACTERS_ACENTUADOS = { ord(u'á'): u'a', @@ -62,12 +65,14 @@ CARACTERS_ACENTUADOS = { ord(u'ç'): u'c', } + # @memoize def normalizar_municipio(municipio): - if not isinstance(municipio, unicode): + if not isinstance(municipio, unicode): municipio = municipio.decode('utf-8') - - return municipio.lower().translate(CARACTERS_ACENTUADOS).upper() + + return municipio.lower().translate(CARACTERS_ACENTUADOS).upper() + # @memoize def carregar_arquivo_municipios(uf, reverso=False): @@ -83,13 +88,13 @@ def carregar_arquivo_municipios(uf, reverso=False): fp = codecs.open(caminho_arquivo, "r", "utf-8-sig") linhas = list(fp.readlines()) fp.close() - + municipios_dict = {} - for linha in linhas: + for linha in linhas: codigo, municipio = linha.split('\t') codigo = codigo.strip() - municipio = municipio.strip() + municipio = municipio.strip() if not reverso: municipios_dict[codigo] = municipio @@ -98,23 +103,25 @@ def carregar_arquivo_municipios(uf, reverso=False): return municipios_dict + # @memoize def obter_codigo_por_municipio(municipio, uf): # TODO: fazer UF ser opcional municipios = carregar_arquivo_municipios(uf, True) - return municipios[normalizar_municipio(municipio)] + return municipios[normalizar_municipio(municipio)] + # @memoize def obter_municipio_por_codigo(codigo, uf, normalizado=False): # TODO: fazer UF ser opcional municipios = carregar_arquivo_municipios(uf) - - municipio = municipios[unicode(codigo)] + municipio = municipios.get(unicode(codigo)) if normalizado: return normalizar_municipio(municipio) return municipio + # @memoize def obter_municipio_e_codigo(municipio_ou_codigo, uf): try: @@ -126,16 +133,19 @@ def obter_municipio_e_codigo(municipio_ou_codigo, uf): return cod_municipio, municipio + # @memoize def extrair_tag(root): return root.tag.split('}')[-1] + def formatar_decimal(dec): - if dec*100 - int(dec*100): + if dec * 100 - int(dec * 100): return str(dec) else: return "%.2f" % dec + def safe_str(str_): if not isinstance(str_, unicode): if isinstance(str_, str):