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. 63
      sapl/materia/views.py

63
sapl/materia/views.py

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

Loading…
Cancel
Save