Browse Source

2804 relatorio pdf doc admin (#2816)

* Adiciona opção de relatório

Co-authored-by: Ulysses Lara <ulysses3353@gmail.com>

* Iniciando a geração do pdf

Co-authored-by:  Cantuária <cantuariavc@gmail.com>

* Arrumando formatação do relatorio

Co-authored-by:  Cantuária <cantuariavc@gmail.com>

* Adicionando validação qundo selecionado gerar pdf.
Co-authored-by:  Cantuária <cantuariavc@gmail.com>

* Correção paginação no PDF

Co-authored-by:  Cantuária <cantuariavc@gmail.com>
pull/2766/head
Ulysses Lara 6 years ago
committed by Edward
parent
commit
3fd21384e4
  1. 27
      sapl/protocoloadm/forms.py
  2. 13
      sapl/protocoloadm/views.py
  3. 24
      sapl/relatorios/views.py
  4. 2
      sapl/static/sapl/css/relatorio.css
  5. 39
      sapl/templates/protocoloadm/documentoadministrativo_filter.html
  6. 85
      sapl/templates/relatorios/relatorio_doc_administrativos.html

27
sapl/protocoloadm/forms.py

@ -1,9 +1,9 @@
import logging import logging
from crispy_forms.bootstrap import InlineRadios, Alert from crispy_forms.bootstrap import InlineRadios, Alert, FormActions
from sapl.crispy_layout_mixin import SaplFormHelper from sapl.crispy_layout_mixin import SaplFormHelper
from crispy_forms.layout import HTML, Button, Column, Fieldset, Layout, Div from crispy_forms.layout import HTML, Button, Column, Fieldset, Layout, Div, Submit
from django import forms from django import forms
from django.core.exceptions import (MultipleObjectsReturned, from django.core.exceptions import (MultipleObjectsReturned,
ObjectDoesNotExist, ValidationError) ObjectDoesNotExist, ValidationError)
@ -170,6 +170,7 @@ class DocumentoAdministrativoFilterSet(django_filters.FilterSet):
o = AnoNumeroOrderingFilter(help_text='') o = AnoNumeroOrderingFilter(help_text='')
class Meta(FilterOverridesMetaMixin): class Meta(FilterOverridesMetaMixin):
model = DocumentoAdministrativo model = DocumentoAdministrativo
fields = ['tipo', fields = ['tipo',
@ -207,17 +208,33 @@ class DocumentoAdministrativoFilterSet(django_filters.FilterSet):
row4 = to_row( row4 = to_row(
[ [
('tramitacao', 2), ('tramitacao', 2),
('tramitacaoadministrativo__status', 5), ('tramitacaoadministrativo__status', 4),
('tramitacaoadministrativo__unidade_tramitacao_destino', 5), ('tramitacaoadministrativo__unidade_tramitacao_destino', 6),
]) ])
buttons = FormActions(
*[
HTML('''
<div class="form-check">
<input name="relatorio" type="checkbox" class="form-check-input" id="relatorio">
<label class="form-check-label" for="relatorio">Gerar relatório PDF</label>
</div>
''' )
],
Submit('pesquisar', _('Pesquisar'), css_class='float-right',
onclick='return true;'),
css_class='form-group row justify-content-between'
,
)
self.form.helper = SaplFormHelper() self.form.helper = SaplFormHelper()
self.form.helper.form_method = 'GET' self.form.helper.form_method = 'GET'
self.form.helper.layout = Layout( self.form.helper.layout = Layout(
Fieldset(_('Pesquisar Documento'), Fieldset(_('Pesquisar Documento'),
row1, row2, row1, row2,
row3, row4, row3, row4,
form_actions(label='Pesquisar')) buttons,)
) )

13
sapl/protocoloadm/views.py

@ -36,6 +36,7 @@ from sapl.protocoloadm.models import Protocolo
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) show_results_filter_set, mail_service_configured)
from sapl.relatorios.views import relatorio_doc_administrativos
from .forms import (AcompanhamentoDocumentoForm, AnularProtocoloAdmForm, from .forms import (AcompanhamentoDocumentoForm, AnularProtocoloAdmForm,
DocumentoAcessorioAdministrativoForm, DocumentoAcessorioAdministrativoForm,
@ -901,9 +902,9 @@ class PesquisarDocumentoAdministrativoView(DocumentoAdministrativoMixin,
context = super(PesquisarDocumentoAdministrativoView, context = super(PesquisarDocumentoAdministrativoView,
self).get_context_data(**kwargs) self).get_context_data(**kwargs)
if self.paginate_by:
paginator = context['paginator'] paginator = context['paginator']
page_obj = context['page_obj'] page_obj = context['page_obj']
context['page_range'] = make_pagination( context['page_range'] = make_pagination(
page_obj.number, paginator.num_pages) page_obj.number, paginator.num_pages)
@ -911,7 +912,6 @@ class PesquisarDocumentoAdministrativoView(DocumentoAdministrativoMixin,
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
super(PesquisarDocumentoAdministrativoView, self).get(request) super(PesquisarDocumentoAdministrativoView, self).get(request)
# Se a pesquisa estiver quebrando com a paginação # Se a pesquisa estiver quebrando com a paginação
# Olhe esta função abaixo # Olhe esta função abaixo
# Provavelmente você criou um novo campo no Form/FilterSet # Provavelmente você criou um novo campo no Form/FilterSet
@ -924,9 +924,7 @@ class PesquisarDocumentoAdministrativoView(DocumentoAdministrativoMixin,
url = url[ponto_comeco:] url = url[ponto_comeco:]
else: else:
url = '' url = ''
self.filterset.form.fields['o'].label = _('Ordenação') self.filterset.form.fields['o'].label = _('Ordenação')
# é usada essa verificação anônima para quando os documentos administrativos # é usada essa verificação anônima para quando os documentos administrativos
# estão no modo ostensivo, mas podem existir documentos administrativos # estão no modo ostensivo, mas podem existir documentos administrativos
# restritos # restritos
@ -935,17 +933,20 @@ class PesquisarDocumentoAdministrativoView(DocumentoAdministrativoMixin,
else: else:
length = self.object_list.count() length = self.object_list.count()
is_relatorio = url!='' and request.GET.get('relatorio',None)
self.paginate_by = None if is_relatorio else self.paginate_by
context = self.get_context_data(filter=self.filterset, context = self.get_context_data(filter=self.filterset,
filter_url=url, filter_url=url,
numero_res=length numero_res=length
) )
context['show_results'] = show_results_filter_set( context['show_results'] = show_results_filter_set(
self.request.GET.copy()) self.request.GET.copy())
if is_relatorio:
return relatorio_doc_administrativos(request,context)
else:
return self.render_to_response(context) return self.render_to_response(context)
class AnexadoCrud(MasterDetailCrud): class AnexadoCrud(MasterDetailCrud):
model = Anexado model = Anexado
parent_field = 'documento_principal' parent_field = 'documento_principal'

24
sapl/relatorios/views.py

@ -1326,3 +1326,27 @@ def resumo_ata_pdf(request,pk):
response.write(pdf_file) response.write(pdf_file)
return response return response
def relatorio_doc_administrativos(request, context):
base_url = request.build_absolute_uri()
casa = CasaLegislativa.objects.first()
rodape = ' '.join(get_rodape(casa))
context.update({'data': dt.today().strftime('%d/%m/%Y')})
context.update({'rodape': rodape})
header_context = {"casa": casa, 'logotipo':casa.logotipo, 'MEDIA_URL': MEDIA_URL}
html_template = render_to_string('relatorios/relatorio_doc_administrativos.html', context)
html_header = render_to_string('relatorios/header_ata.html', header_context)
pdf_file = make_pdf(base_url=base_url,main_template=html_template,header_template=html_header)
response = HttpResponse(content_type='application/pdf;')
response['Content-Disposition'] = 'inline; filename=relatorio.pdf'
response['Content-Transfer-Encoding'] = 'binary'
response.write(pdf_file)
return response

2
sapl/static/sapl/css/relatorio.css

@ -16,7 +16,7 @@ h3 {
page-break-after: avoid; page-break-after: avoid;
} }
p { p, a {
font-size: 10pt; font-size: 10pt;
text-align: justify; text-align: justify;
text-justify: inter-word; text-justify: inter-word;

39
sapl/templates/protocoloadm/documentoadministrativo_filter.html

@ -81,3 +81,42 @@
{% block table_content %} {% block table_content %}
{% endblock table_content %} {% endblock table_content %}
{% block extra_js %}
<style>
.select-error {
border-color: red;
-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075);
box-shadow: inset 0 1px 1px rgba(0,0,0,.075);
}
</style>
<script type="text/javascript">
validation = () => {
if (document.getElementById("relatorio").checked && !$("#id_ano").val()){
$("#submit-id-pesquisar").attr("disabled", true);
$("#id_ano").addClass("select-error");
$("#div_id_ano").append('<spam id="error-ano" style="font-size:8pt;color:red">Selecione uma data.</spam>');
}
else{
error = document.getElementById("error-ano")
if (error){
$("#submit-id-pesquisar").attr("disabled", false);
$("#id_ano").removeClass("select-error");
document.getElementById("error-ano").remove();
}
}
}
document.getElementById("relatorio").onchange = validation;
document.getElementById("id_ano").onchange = validation;
validation();
</script>
{% endblock %}

85
sapl/templates/relatorios/relatorio_doc_administrativos.html

@ -0,0 +1,85 @@
{% load i18n %}
{% load common_tags %}
{% load static %}
<head>
<style>
@page{
margin-top: 4.5cm;
size: A4 portrait;
@bottom-right {
content: "Página" counter(page);
height: 3cm;
font-size: 8pt;
}
@bottom-center {
border-top: 1px solid black;
font-size: 8pt;
height: 1cm;
content: "{{rodape|safe}}";
font-style:italic;
}
@bottom-left {
content: "{{data}}";
height: 3cm;
font-size: 8pt;
}
@top-center {
content: string(title);
}
header {
width: 0;
height: 0;
visibility: hidden;
string-set: title content();
}
}
</style>
<link rel="stylesheet" href="{% static '/sapl/css/relatorio.css'%}">
</head>
<body>
<h2>Documentos Administrativos</h2>
{% if documentoadministrativo_list|length %}
<h3>Número de documentos: {{numero_res}}</h3>
{% for d in documentoadministrativo_list %}
<div style="border-top: 1px solid black;margin-bottom:0.3cm">
{% if request.user.is_anonymous and not d.restrito or not request.user.is_anonymous%}
<strong><a href="{% url 'sapl.protocoloadm:documentoadministrativo_detail' d.id %}">{{d.tipo.sigla}} {{d.numero}}/{{d.ano}} - {{d.tipo}}</strong></a></br>
<strong>Interessado:</strong>&nbsp;{{ d.interessado|default_if_none:"Não informado"}}
</br>
<strong>Assunto:</strong>&nbsp;<a>{{ d.assunto|safe}}</a>
</br>
{% if d.protocolo %}
<strong>Protocolo:</strong>&nbsp;<a href="{% url 'sapl.protocoloadm:protocolo_mostrar' d.protocolo.id %}">{{ d.protocolo}}</a></br>
{% endif %}
{% define d.tramitacaoadministrativo_set.last as tram %}
{% if tram.unidade_tramitacao_destino %}
<strong>Localização Atual:</strong> &nbsp;{{tram.unidade_tramitacao_destino}}
</br>
<strong>Status:</strong> {{tram.status}}
</br>
{% endif %}
{% define d.documentoacessorioadministrativo_set.all as acess %}
{% if d.documentoacessorioadministrativo_set.all.exists %}
<strong>Documentos Acessórios:</strong>
<a href="{% url 'sapl.protocoloadm:documentoacessorioadministrativo_list' d.id %}">
{{ d.documentoacessorioadministrativo_set.all.count }}
</a>
</br>
{% endif %}
{% if d.tramitacao and mail_service_configured %}
<a href="{% url 'sapl.protocoloadm:acompanhar_documento' d.id %}">Acompanhar Documento</a>
{% endif %}
{% endif %}
</div>
{% endfor %}
{% else %}
<h3>Nenhum documento encontrado com essas especificações</h3>
{% endif %}
</body>
Loading…
Cancel
Save