From ef9fc01c842a6a2e560d02e7b23700e324437ba2 Mon Sep 17 00:00:00 2001 From: ricardocanela Date: Mon, 29 Jul 2019 11:03:00 -0300 Subject: [PATCH] geracao de pdf relatorio de presenca de dos parlamentares em sessoes --- sapl/base/forms.py | 19 +++- sapl/base/views.py | 52 +++++++--- sapl/relatorios/views.py | 25 +++++ .../relatorio_materias_em_tramitacao.html | 13 +-- .../relatorios/relatorio_presenca_sessao.html | 95 +++++++++++++++++++ 5 files changed, 184 insertions(+), 20 deletions(-) create mode 100644 sapl/templates/relatorios/relatorio_presenca_sessao.html diff --git a/sapl/base/forms.py b/sapl/base/forms.py index 07528957a..793f24bb5 100644 --- a/sapl/base/forms.py +++ b/sapl/base/forms.py @@ -908,6 +908,8 @@ class RelatorioNormasVigenciaFilterSet(django_filters.FilterSet): class RelatorioPresencaSessaoFilterSet(django_filters.FilterSet): + o = AnoNumeroOrderingFilter(help_text='') + class Meta(FilterOverridesMetaMixin): model = SessaoPlenaria fields = ['data_inicio', @@ -935,11 +937,26 @@ class RelatorioPresencaSessaoFilterSet(django_filters.FilterSet): ('tipo', 4)]) row3 = to_row([('exibir_ordem_dia', 12)]) + buttons = FormActions( + *[ + HTML(''' +
+ + +
+ ''') + ], + 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.form_method = 'GET' self.form.helper.layout = Layout( Fieldset(_('Presença dos parlamentares nas sessões plenárias'), - row1, row2, row3, form_actions(label='Pesquisar')) + row1, row2, row3, buttons, ) ) @property diff --git a/sapl/base/views.py b/sapl/base/views.py index b033d70a9..90582ee7b 100644 --- a/sapl/base/views.py +++ b/sapl/base/views.py @@ -30,7 +30,7 @@ from haystack.views import SearchView from haystack.query import SearchQuerySet from sapl.relatorios.views import (relatorio_materia_em_tramitacao, relatorio_materia_por_autor, - relatorio_materia_por_ano_autor) + relatorio_materia_por_ano_autor, relatorio_presenca_sessao) from sapl import settings from sapl.audiencia.models import AudienciaPublica, TipoAudienciaPublica @@ -541,6 +541,41 @@ class RelatorioPresencaSessaoView(FilterView): return context + def get(self, request, *args, **kwargs): + super(RelatorioPresencaSessaoView, 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 + length = self.object_list.count() + + is_relatorio = 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_presenca_sessao(request, context) + else: + return self.render_to_response(context) + + class RelatorioHistoricoTramitacaoView(FilterView): model = MateriaLegislativa @@ -781,10 +816,7 @@ class RelatorioMateriasTramitacaoView(FilterView): # é 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() + 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 @@ -901,10 +933,7 @@ class RelatorioMateriasPorAnoAutorTipoView(FilterView): # é 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() + length = self.object_list.count() is_relatorio = request.GET.get('is_relatorio', None) self.paginate_by = None if is_relatorio else self.paginate_by @@ -985,10 +1014,7 @@ class RelatorioMateriasPorAutorView(FilterView): # é 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() + 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 diff --git a/sapl/relatorios/views.py b/sapl/relatorios/views.py index 2dd156b0d..658754159 100755 --- a/sapl/relatorios/views.py +++ b/sapl/relatorios/views.py @@ -1390,6 +1390,7 @@ def relatorio_materia_em_tramitacao(request, context): return response + def relatorio_materia_por_autor(request, context): base_url = request.build_absolute_uri() casa = CasaLegislativa.objects.first() @@ -1412,6 +1413,7 @@ def relatorio_materia_por_autor(request, context): return response + def relatorio_materia_por_ano_autor(request, context): base_url = request.build_absolute_uri() casa = CasaLegislativa.objects.first() @@ -1432,9 +1434,32 @@ def relatorio_materia_por_ano_autor(request, context): response['Content-Transfer-Encoding'] = 'binary' response.write(pdf_file) + return response + + +def relatorio_presenca_sessao(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_presenca_sessao.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): base_url=request.build_absolute_uri() logger = logging.getLogger(__name__) diff --git a/sapl/templates/relatorios/relatorio_materias_em_tramitacao.html b/sapl/templates/relatorios/relatorio_materias_em_tramitacao.html index 312d0d813..314910762 100644 --- a/sapl/templates/relatorios/relatorio_materias_em_tramitacao.html +++ b/sapl/templates/relatorios/relatorio_materias_em_tramitacao.html @@ -40,15 +40,16 @@ } - + +

Matérias em Tramitação

PARÂMETROS DE PESQUISA:
-  Ano: {{ ano }}
-  Tipo de matéria: {{ tipo }}
-  Status atual: {{ tramitacao__status }}
-  Local atual: {{ tramitacao__unidade_tramitacao_destino }}


+ Ano: {{ ano }}
+ Tipo de matéria: {{ tipo }}
+ Status atual: {{ tramitacao__status }}
+ Local atual: {{ tramitacao__unidade_tramitacao_destino }}


{% if object_list|length %} @@ -74,7 +75,7 @@ {% for materia in object_list %}
- {% if request.user.is_anonymous and not d.restrito or not request.user.is_anonymous%} + {% if not request.user.is_anonymous%} Matéria: {{materia.tipo.descricao}} {{materia.numero}}/{{materia.ano}}
Local Atual:  {{materia.tramitacao_set.last.unidade_tramitacao_destino}} diff --git a/sapl/templates/relatorios/relatorio_presenca_sessao.html b/sapl/templates/relatorios/relatorio_presenca_sessao.html new file mode 100644 index 000000000..1897ce6c8 --- /dev/null +++ b/sapl/templates/relatorios/relatorio_presenca_sessao.html @@ -0,0 +1,95 @@ +{% load i18n %} +{% load common_tags %} +{% load static %} + + + + + + + + +

Presença dos parlamentares nas sessões

+ + PARÂMETROS DE PESQUISA:
+ + + {% if show_results %} + + +
+ PERÍODO: {{periodo}}
+ Legislatura: {{legislatura}}
+ Sessão Legislativa: {{sessao_legislativa}}
+ TOTAIS NO PERÍODO - SESSÕES: {{total_sessao}} - ORDENS DO DIA: {{total_ordemdia}} +

+ + + + + + + + + + + + + + + + + + {% for p in parlamentares %} + + + + + + + + + + {% endfor %} + +
Nome Parlamentar / PartidoTitular?Ativo?SessãoOrdem do Dia
(Qtd)( % )(Qtd)( % )
{{p.parlamentar}} / {{p.parlamentar|filiacao_intervalo_filter:date_range|default:"Sem Partido"}}{% if p.titular %} Sim {% else %} Não {% endif %}{% if p.parlamentar.ativo %} Sim {% else %} Não {% endif %}{{p.sessao_count}}{{p.sessao_porc}}{{p.ordemdia_count}}{{p.ordemdia_porc}}
+ {% endif %} + \ No newline at end of file