-
Notifications
You must be signed in to change notification settings - Fork 143
Description
Olá, constantemente possuo problemas ao gerar notas de modo assíncrono com a seguinte mensagem de erro:
Traceback (most recent call last):
File "/var/www/gti/venv/lib/python3.9/site-packages/celery/app/trace.py", line 450, in trace_task
R = retval = fun(*args, **kwargs)
File "/var/www/gti/venv/lib/python3.9/site-packages/celery/app/trace.py", line 731, in protected_call
return self.run(*args, **kwargs)
File "/var/www/gti/fhserasa/financeiro/util.py", line 997, in gerar_nfse
raise e
File "/var/www/gti/fhserasa/financeiro/util.py", line 991, in gerar_nfse
xml_send = goiania.xml_gerar_nfse(certify, **rps)
File "/var/www/gti/venv/src/pytrustnfe3/pytrustnfe/nfse/goiania/init.py", line 45, in xml_gerar_nfse
return _render(certificado, "GerarNfse", **kwargs)
File "/var/www/gti/venv/src/pytrustnfe3/pytrustnfe/nfse/goiania/init.py", line 15, in _render
xml_send = render_xml(path, f"{method}.xml", False, **kwargs)
File "/var/www/gti/venv/src/pytrustnfe3/pytrustnfe/xml/init.py", line 29, in render_xml
File "/var/www/gti/venv/lib/python3.9/site-packages/jinja2/environment.py", line 997, in get_template
File "/var/www/gti/venv/lib/python3.9/site-packages/jinja2/environment.py", line 958, in _load_template
File "/var/www/gti/venv/lib/python3.9/site-packages/jinja2/loaders.py", line 125, in load
File "/var/www/gti/venv/lib/python3.9/site-packages/jinja2/loaders.py", line 197, in get_source
File "/var/www/gti/venv/lib/python3.9/site-packages/jinja2/utils.py", line 228, in open_if_exists
OSError: [Errno 24] Too many open files: '/var/www/gti/venv/src/pytrustnfe3/pytrustnfe/nfse/goiania/templates/GerarNfse.xml'
Imagino que o erro pode estar na forma que é gerenciado os arquivos nestes trechos nos arquivos pytrustnfe3/pytrustnfe/nfse/goiania/init.py e pytrustnfe3/pytrustnfe/xml/init.py:
pytrustnfe3/pytrustnfe/xml/init.py
def render_xml(path, template_name, remove_empty, **nfe):
nfe = recursively_normalize(nfe)
env = Environment(loader=FileSystemLoader(path))
env.filters["normalize"] = filters.strip_line_feed
env.filters["normalize_str"] = filters.normalize_str
env.filters["format_percent"] = filters.format_percent
env.filters["format_datetime"] = filters.format_datetime
env.filters["format_date"] = filters.format_date
env.filters["comma"] = filters.format_with_comma
template = env.get_template(template_name)
xml = template.render(**nfe).replace("\n", "")
parser = etree.XMLParser(
remove_blank_text=True, remove_comments=True, strip_cdata=False
)
root = etree.fromstring(xml, parser=parser)
for element in root.iter("*"): # remove espaços em branco
if element.text is not None and not element.text.strip():
element.text = None
if remove_empty:
context = etree.iterwalk(root)
for dummy, elem in context:
parent = elem.getparent()
if recursively_empty(elem):
parent.remove(elem)
return root
return etree.tostring(root, encoding=str)
pytrustnfe3/pytrustnfe/nfse/goiania/init.py
def _render(certificado, method, **kwargs):
path = os.path.join(os.path.dirname(__file__), "templates")
xml_send = render_xml(path, f"{method}.xml", False, **kwargs)
signer = Assinatura(certificado.pfx, certificado.password)
xml_send = etree.fromstring(xml_send)
xml_send = signer.assina_xml(xml_send)
return xml_send
def _send(certificado, method, **kwargs):
base_url = "https://nfse.goiania.go.gov.br/ws/nfse.asmx?wsdl"
xml_send = kwargs["xml"]
cert, key = extract_cert_and_key_from_pfx(certificado.pfx, certificado.password)
cert, key = save_cert_key(cert, key)
client = get_authenticated_client(base_url, cert, key)
try:
response = getattr(client.service, method)(xml_send)
except suds.WebFault as e:
return {
"send_xml": str(xml_send),
"received_xml": str(e.fault.faultstring),
"object": None,
}
response, obj = sanitize_response(response)
return {"send_xml": str(xml_send), "received_xml": str(response), "object": obj}
def xml_gerar_nfse(certificado, **kwargs):
""" Retorna o XML montado para ser enviado para o Webservice """
return _render(certificado, "GerarNfse", **kwargs)
Alguem tem ideia de como resolver este problema?