Browse Source

Gera arquivos PDF e Zip em memória (#3247)

* Gera arquivos PDF e Zip em memória

* Apagando compilado de pdf após ser utilizado em documentos acessórios

* Gera PDFs em memória

* Gera PDFs em memória

Co-authored-by: eribeiro <edwardr@senado.leg.br>
Co-authored-by: ulyssesBML <ulysses3353@gmail.com>
pull/3023/head
Edward 4 years ago
committed by eribeiro
parent
commit
e47da045fb
  1. 57
      sapl/materia/views.py

57
sapl/materia/views.py

@ -15,6 +15,7 @@ from string import ascii_letters, digits
from datetime import datetime
from PyPDF4 import PdfFileReader, PdfFileMerger
import zipfile
from io import BytesIO
from django.conf import settings
from django.contrib import messages
@ -2704,8 +2705,11 @@ class TipoMateriaCrud(CrudAux):
def create_zip_docacessorios(materia):
"""
Creates in memory zip files
"""
logger = logging.getLogger(__name__)
docs = materia.documentoacessorio_set.\
docs = materia.documentoacessorio_set. \
all().values_list('arquivo', flat=True)
if not docs:
return None, None
@ -2715,47 +2719,49 @@ def create_zip_docacessorios(materia):
if not docs_path:
raise FileNotFoundError("Não há arquivos PDF cadastrados em documentos acessorios.")
logger.info("Gerando compilado PDF de documentos acessorios com {} documentos".format(docs_path))
zipfilename = '{}/mat_{}_{}_docacessorios.zip'.format(
get_tempfile_dir(),
materia.pk,
time.mktime(datetime.now().timetuple()))
with zipfile.ZipFile(zipfilename, 'w', zipfile.ZIP_DEFLATED) as zipf:
_zipfile = BytesIO()
try:
with zipfile.ZipFile(_zipfile, 'w', zipfile.ZIP_DEFLATED) as zipf:
for f in docs_path:
zipf.write(f, f.split(os.sep)[-1])
except Exception as e:
logger.error(e)
raise e
external_name = "mat_{}_{}_docacessorios.zip".format(materia.numero, materia.ano)
return external_name, zipfilename
return external_name, _zipfile.getvalue()
def get_zip_docacessorios(request, pk):
logger = logging.getLogger(__name__)
username = 'Usuário anônimo' if request.user.is_anonymous else request.user.username
materia = get_object_or_404(MateriaLegislativa, pk=pk)
data = None
try:
external_name, zipfilename = create_zip_docacessorios(materia)
external_name, data = create_zip_docacessorios(materia)
logger.info("user= {}. Gerou o zip compilado de documento acessorios".format(username))
except FileNotFoundError:
logger.error("user= {}.Não há arquivos cadastrados".format(username))
msg=_('Não há arquivos cadastrados nesses documentos acessórios.')
msg = _('Não há arquivos cadastrados nesses documentos acessórios.')
messages.add_message(request, messages.ERROR, msg)
return redirect(reverse('sapl.materia:documentoacessorio_list',
kwargs={'pk': pk}))
except Exception as e:
logger.error("user={}. Um erro inesperado ocorreu na criação do pdf de documentos acessorios: {}"
.format(username,str(e)))
msg=_('Um erro inesperado ocorreu. Entre em contato com o suporte do SAPL.')
.format(username, str(e)))
msg = _('Um erro inesperado ocorreu. Entre em contato com o suporte do SAPL.')
messages.add_message(request, messages.ERROR, msg)
return redirect(reverse('sapl.materia:documentoacessorio_list',
kwargs={'pk': pk}))
if not zipfilename:
msg=_('Não há nenhum documento acessório cadastrado.')
if not data:
msg = _('Não há nenhum documento acessório cadastrado.')
messages.add_message(request, messages.ERROR, msg)
return redirect(reverse('sapl.materia:documentoacessorio_list',
kwargs={'pk': pk}))
with open(os.path.join(get_tempfile_dir(), zipfilename), 'rb') as f:
data = f.read()
response = HttpResponse(data, content_type='application/zip')
response['Content-Disposition'] = ('attachment; filename="%s"'
% external_name)
@ -2763,6 +2769,9 @@ def get_zip_docacessorios(request, pk):
def create_pdf_docacessorios(materia):
"""
Creates a unified in memory PDF file
"""
logger = logging.getLogger(__name__)
docs = materia.documentoacessorio_set. \
all().values_list('arquivo', flat=True)
@ -2784,11 +2793,13 @@ def create_pdf_docacessorios(materia):
merger = PdfFileMerger()
for f in docs_path:
merger.append(fileobj=f)
merger.write(fileobj=open(merged_pdf, "wb"))
data = BytesIO()
merger.write(data)
merger.close()
external_name = "mat_{}_{}_docacessorios.pdf".format(materia.numero, materia.ano)
return external_name, merged_pdf
return external_name, data.getvalue()
def get_pdf_docacessorios(request, pk):
@ -2796,30 +2807,28 @@ def get_pdf_docacessorios(request, pk):
logger = logging.getLogger(__name__)
username = 'Usuário anônimo' if request.user.is_anonymous else request.user.username
try:
external_name, pdffilename = create_pdf_docacessorios(materia)
external_name, data = create_pdf_docacessorios(materia)
logger.info("user= {}. Gerou o pdf compilado de documento acessorios".format(username))
except FileNotFoundError:
logger.error("user= {}.Não há arquivos cadastrados".format(username))
msg=_('Não há arquivos cadastrados nesses documentos acessórios.')
msg = _('Não há arquivos cadastrados nesses documentos acessórios.')
messages.add_message(request, messages.ERROR, msg)
return redirect(reverse('sapl.materia:documentoacessorio_list',
kwargs={'pk': pk}))
except Exception as e:
logger.error("user= {}.Um erro inesperado ocorreu na criação do pdf de documentos acessorios: {}"
.format(username,str(e)))
msg=_('Um erro inesperado ocorreu. Entre em contato com o suporte do SAPL.')
msg = _('Um erro inesperado ocorreu. Entre em contato com o suporte do SAPL.')
messages.add_message(request, messages.ERROR, msg)
return redirect(reverse('sapl.materia:documentoacessorio_list',
kwargs={'pk': pk}))
if not pdffilename:
msg=_('Não há nenhum documento acessório PDF cadastrado.')
if not data:
msg = _('Não há nenhum documento acessório PDF cadastrado.')
messages.add_message(request, messages.ERROR, msg)
return redirect(reverse('sapl.materia:documentoacessorio_list',
kwargs={'pk': pk}))
with open(os.path.join(get_tempfile_dir(), pdffilename), 'rb') as f:
data = f.read()
response = HttpResponse(data, content_type='application/pdf')
response['Content-Disposition'] = ('attachment; filename="%s"'
% external_name)

Loading…
Cancel
Save