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

75
sapl/protocoloadm/views.py

@ -1,9 +1,13 @@
import os
import time
from datetime import datetime from datetime import datetime
import logging import logging
from io import BytesIO
from random import choice from random import choice
import re import re
from string import ascii_letters, digits from string import ascii_letters, digits
from PyPDF4 import PdfFileMerger
from braces.views import FormValidMessageMixin from braces.views import FormValidMessageMixin
from django.conf import settings from django.conf import settings
from django.contrib import messages from django.contrib import messages
@ -16,7 +20,7 @@ from django.db import transaction
from django.db.models import Max, Q from django.db.models import Max, Q
from django.http import Http404, HttpResponse, JsonResponse from django.http import Http404, HttpResponse, JsonResponse
from django.http.response import HttpResponseRedirect 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.shortcuts import render
from django.urls import reverse from django.urls import reverse
from django.utils import timezone 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, from sapl.utils import (create_barcode, get_base_url, get_client_ip,
get_mime_type_from_file_extension, lista_anexados, get_mime_type_from_file_extension, lista_anexados,
show_results_filter_set, mail_service_configured, from_date_to_datetime_utc, 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, from .forms import (AcompanhamentoDocumentoForm, AnexadoEmLoteFilterSet, AnexadoForm,
AnularProtocoloAdmForm, compara_tramitacoes_doc, AnularProtocoloAdmForm, compara_tramitacoes_doc,
@ -58,7 +62,7 @@ from .forms import (AcompanhamentoDocumentoForm, AnexadoEmLoteFilterSet, Anexado
from .models import (Anexado, AcompanhamentoDocumento, DocumentoAcessorioAdministrativo, from .models import (Anexado, AcompanhamentoDocumento, DocumentoAcessorioAdministrativo,
DocumentoAdministrativo, StatusTramitacaoAdministrativo, DocumentoAdministrativo, StatusTramitacaoAdministrativo,
TipoDocumentoAdministrativo, TramitacaoAdministrativo) TipoDocumentoAdministrativo, TramitacaoAdministrativo)
from ..settings import MEDIA_ROOT
TipoDocumentoAdministrativoCrud = CrudAux.build( TipoDocumentoAdministrativoCrud = CrudAux.build(
TipoDocumentoAdministrativo, '') TipoDocumentoAdministrativo, '')
@ -118,6 +122,71 @@ def doc_texto_integral(request, pk):
raise Http404 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): class AcompanhamentoConfirmarView(TemplateView):
logger = logging.getLogger(__name__) 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