Browse Source

geracao de pdf relatorio de materias em tramitacao

pull/2895/head
ricardocanela 7 years ago
parent
commit
9d7d4213aa
  1. 26
      sapl/base/forms.py
  2. 39
      sapl/base/views.py
  3. 24
      sapl/relatorios/views.py
  4. 105
      sapl/templates/relatorios/relatorio_materias_em_tramitacao.html

26
sapl/base/forms.py

@ -1,8 +1,9 @@
import logging import logging
import os import os
from crispy_forms.bootstrap import FieldWithButtons, InlineRadios, StrictButton
from crispy_forms.layout import HTML, Button, Div, Field, Fieldset, Layout, Row from crispy_forms.bootstrap import FieldWithButtons, InlineRadios, StrictButton, FormActions
from crispy_forms.layout import HTML, Button, Div, Field, Fieldset, Layout, Row, Submit
from django import forms from django import forms
from django.conf import settings from django.conf import settings
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
@ -38,7 +39,7 @@ from sapl.utils import (RANGE_ANOS, YES_NO_CHOICES,
RangeWidgetOverride, autor_label, autor_modal, RangeWidgetOverride, autor_label, autor_modal,
models_with_gr_for_model, qs_override_django_filter, models_with_gr_for_model, qs_override_django_filter,
choice_anos_com_normas, choice_anos_com_materias, choice_anos_com_normas, choice_anos_com_materias,
FilterOverridesMetaMixin, FileFieldCheckMixin) FilterOverridesMetaMixin, FileFieldCheckMixin, AnoNumeroOrderingFilter)
from .models import AppConfig, CasaLegislativa from .models import AppConfig, CasaLegislativa
@ -1099,6 +1100,8 @@ class RelatorioMateriasTramitacaoilterSet(django_filters.FilterSet):
queryset=StatusTramitacao.objects.all(), queryset=StatusTramitacao.objects.all(),
label=_('Status Atual')) label=_('Status Atual'))
o = AnoNumeroOrderingFilter(help_text='')
@property @property
def qs(self): def qs(self):
parent = super(RelatorioMateriasTramitacaoilterSet, self).qs parent = super(RelatorioMateriasTramitacaoilterSet, self).qs
@ -1120,12 +1123,27 @@ class RelatorioMateriasTramitacaoilterSet(django_filters.FilterSet):
row3 = to_row([('tramitacao__unidade_tramitacao_destino', 12)]) row3 = to_row([('tramitacao__unidade_tramitacao_destino', 12)])
row4 = to_row([('tramitacao__status', 12)]) row4 = to_row([('tramitacao__status', 12)])
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(_('Pesquisa de Matéria em Tramitação'), Fieldset(_('Pesquisa de Matéria em Tramitação'),
row1, row2, row3, row4, row1, row2, row3, row4,
form_actions(label='Pesquisar')) buttons,)
) )

39
sapl/base/views.py

@ -29,6 +29,8 @@ from django_filters.views import FilterView
from haystack.views import SearchView from haystack.views import SearchView
from haystack.query import SearchQuerySet from haystack.query import SearchQuerySet
from sapl.relatorios.views import relatorio_materia_em_tramitacao
from sapl import settings from sapl import settings
from sapl.audiencia.models import AudienciaPublica, TipoAudienciaPublica from sapl.audiencia.models import AudienciaPublica, TipoAudienciaPublica
from sapl.base.forms import AutorForm, AutorFormForAdmin, TipoAutorForm from sapl.base.forms import AutorForm, AutorFormForAdmin, TipoAutorForm
@ -760,6 +762,43 @@ class RelatorioMateriasTramitacaoView(FilterView):
return context return context
def get(self, request, *args, **kwargs):
super(RelatorioMateriasTramitacaoView, self).get(request)
# Se a pesquisa estiver quebrando com a paginação
# Olhe esta função abaixo
# Provavelmente você criou um novo campo no Form/FilterSet
# Então a ordem da URL está diferente
data = self.filterset.data
if data and data.get('tipo') is not None:
url = "&" + str(self.request.environ['QUERY_STRING'])
if url.startswith("&page"):
ponto_comeco = url.find('tipo=') - 1
url = url[ponto_comeco:]
else:
url = ''
self.filterset.form.fields['o'].label = _('Ordenação')
# é usada essa verificação anônima para quando os documentos administrativos
# estão no modo ostensivo, mas podem existir documentos administrativos
# restritos
if request.user.is_anonymous():
length = self.object_list.filter(restrito=False).count()
else:
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,
filter_url=url,
numero_res=length
)
context['show_results'] = show_results_filter_set(
self.request.GET.copy())
if is_relatorio:
return relatorio_materia_em_tramitacao(request, context)
else:
return self.render_to_response(context)
class RelatorioMateriasPorAnoAutorTipoView(FilterView): class RelatorioMateriasPorAnoAutorTipoView(FilterView):
model = MateriaLegislativa model = MateriaLegislativa

24
sapl/relatorios/views.py

@ -1367,6 +1367,30 @@ def relatorio_doc_administrativos(request, context):
return response return response
def relatorio_materia_em_tramitacao(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}
#import ipdb; ipdb.set_trace();
html_template = render_to_string('relatorios/relatorio_materias_em_tramitacao.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
def relatorio_sessao_plenaria_pdf(request, pk): def relatorio_sessao_plenaria_pdf(request, pk):
base_url=request.build_absolute_uri() base_url=request.build_absolute_uri()
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)

105
sapl/templates/relatorios/relatorio_materias_em_tramitacao.html

@ -0,0 +1,105 @@
{% 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>
<h2>Matérias em Tramitação</h2>
{% if object_list|length %}
<table class="table table-bordered table-hover">
<thead class="thead-default" >
<tr class="active"><th colspan="2" class="text-center">QUADRO GERAL</th></tr>
<tr class="active">
<th>Tipo Matéria</th>
<th>Quantidade</th>
</tr>
</thead>
<tbody>
{% for key, value in qtdes.items %}
<tr>
<td>{{key.sigla}} - {{key}}</td>
<td>{{value}}</td>
</tr>
{% endfor %}
</tbody>
</table>
</br>
</br>
{% for materia in object_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>Matéria:</strong> {{materia.tipo.descricao}} {{materia.numero}}/{{materia.ano}}
</br>
<strong>Local Atual:</strong>&nbsp;<a> {{materia.tramitacao_set.last.unidade_tramitacao_destino}} </a>
</br>
<strong>Status:</strong>&nbsp;<a> {{materia.tramitacao_set.last.status}} </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