Browse Source

Gera arquivos PDF e Zip em memória

pull/3247/head
eribeiro 5 years ago
parent
commit
f26296ff59
  1. 42
      sapl/materia/views.py

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

Loading…
Cancel
Save