|
|
@ -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,8 +2705,11 @@ 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) |
|
|
|