Browse Source

feat: Adiciona funcionalidade de baixar lista de documentos acessorios de um documento administrativo (#3650)

Co-authored-by: joao <joao@mezzoplanejamento.com.br>
pull/3653/head
joaohortsenado 2 years ago
committed by GitHub
parent
commit
059f5f16aa
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 5
      sapl/protocoloadm/urls.py
  2. 75
      sapl/protocoloadm/views.py
  3. 12
      sapl/templates/protocoloadm/documentoacessorioadministrativo_list.html

5
sapl/protocoloadm/urls.py

@ -27,7 +27,8 @@ from sapl.protocoloadm.views import (AcompanhamentoDocumentoView,
TramitacaoEmLoteAdmView,
apaga_protocolos_view,
VinculoDocAdminMateriaCrud,
VinculoDocAdminMateriaEmLoteView)
VinculoDocAdminMateriaEmLoteView,
get_pdf_docacessorios)
from .apps import AppConfig
@ -51,6 +52,8 @@ urlpatterns_documento_administrativo = [
name='anexado_em_lote'),
url(r'^docadm/(?P<pk>\d+)/vinculo-em-lote', VinculoDocAdminMateriaEmLoteView.as_view(),
name='vinculodocadminmateria_em_lote'),
url(r'^docadm/documentoacessorioadministrativo/pdf/(?P<pk>\d+)$', get_pdf_docacessorios,
name='merge_docacessorios')
]
urlpatterns_protocolo = [

75
sapl/protocoloadm/views.py

@ -1,9 +1,13 @@
import os
import time
from datetime import datetime
import logging
from io import BytesIO
from random import choice
import re
from string import ascii_letters, digits
from PyPDF4 import PdfFileMerger
from braces.views import FormValidMessageMixin
from django.conf import settings
from django.contrib import messages
@ -16,7 +20,7 @@ from django.db import transaction
from django.db.models import Max, Q
from django.http import Http404, HttpResponse, JsonResponse
from django.http.response import HttpResponseRedirect
from django.shortcuts import redirect
from django.shortcuts import redirect, get_object_or_404
from django.shortcuts import render
from django.urls import reverse
from django.utils import timezone
@ -43,7 +47,7 @@ from sapl.relatorios.views import relatorio_doc_administrativos
from sapl.utils import (create_barcode, get_base_url, get_client_ip,
get_mime_type_from_file_extension, lista_anexados,
show_results_filter_set, mail_service_configured, from_date_to_datetime_utc,
google_recaptcha_configured)
google_recaptcha_configured, get_tempfile_dir)
from .forms import (AcompanhamentoDocumentoForm, AnexadoEmLoteFilterSet, AnexadoForm,
AnularProtocoloAdmForm, compara_tramitacoes_doc,
@ -58,7 +62,7 @@ from .forms import (AcompanhamentoDocumentoForm, AnexadoEmLoteFilterSet, Anexado
from .models import (Anexado, AcompanhamentoDocumento, DocumentoAcessorioAdministrativo,
DocumentoAdministrativo, StatusTramitacaoAdministrativo,
TipoDocumentoAdministrativo, TramitacaoAdministrativo)
from ..settings import MEDIA_ROOT
TipoDocumentoAdministrativoCrud = CrudAux.build(
TipoDocumentoAdministrativo, '')
@ -118,6 +122,71 @@ def doc_texto_integral(request, pk):
raise Http404
def get_pdf_docacessorios(request, pk):
documento_administrativo = get_object_or_404(DocumentoAdministrativo, pk=pk)
logger = logging.getLogger(__name__)
username = 'Usuário anônimo' if request.user.is_anonymous else request.user.username
try:
external_name, data = create_pdf_docacessorios(documento_administrativo)
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.')
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.')
messages.add_message(request, messages.ERROR, msg)
return redirect(reverse('sapl.materia:documentoacessorio_list',
kwargs={'pk': pk}))
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}))
response = HttpResponse(data, content_type='application/pdf')
response['Content-Disposition'] = ('attachment; filename="%s"'
% external_name)
return response
def create_pdf_docacessorios(docadministrativo):
"""
Creates a unified in memory PDF file
"""
logger = logging.getLogger(__name__)
docs = docadministrativo.documentoacessorioadministrativo_set. \
all().values_list('arquivo', flat=True)
if not docs:
return None, None
docs_path = [os.path.join(MEDIA_ROOT, i)
for i in docs if i.lower().endswith('pdf')]
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))
merger = PdfFileMerger()
for f in docs_path:
merger.append(fileobj=f)
data = BytesIO()
merger.write(data)
merger.close()
external_name = "docadm_{}_{}_docacessorios.pdf".format(
docadministrativo.numero, docadministrativo.ano)
return external_name, data.getvalue()
class AcompanhamentoConfirmarView(TemplateView):
logger = logging.getLogger(__name__)

12
sapl/templates/protocoloadm/documentoacessorioadministrativo_list.html

@ -0,0 +1,12 @@
{% extends "crud/list.html" %}
{% load i18n %}
{% load common_tags %}
{% block base_content %}
{{ block.super }}
<div style="display:flex;padding-left: 600px;padding-top: 10px;">
<div class="actions btn-group float-right" role="group">
<a href="{% url 'sapl.protocoloadm:merge_docacessorios' root_pk %}" class="btn btn-outline-primary">{% trans 'Baixar documentos como PDF único' %}</a>
</div>
</div>
{% endblock base_content%}
Loading…
Cancel
Save