Browse Source

Fix #2914 - Cria relatório de normas por autor (#2917)

pull/2944/head
Cesar Augusto de Carvalho 5 years ago
committed by Edward
parent
commit
d6580c077e
  1. 49
      sapl/base/forms.py
  2. 5
      sapl/base/urls.py
  3. 60
      sapl/base/views.py
  4. 96
      sapl/templates/base/RelatorioMateriasPorAutor_filter.html
  5. 76
      sapl/templates/base/RelatorioNormasPorAutor_filter.html
  6. 4
      sapl/templates/base/relatorios_list.html
  7. 2
      sapl/utils.py

49
sapl/base/forms.py

@ -1161,7 +1161,7 @@ class RelatorioMateriasPorAutorFilterSet(django_filters.FilterSet):
@property
def qs(self):
parent = super(RelatorioMateriasPorAutorFilterSet, self).qs
parent = super().qs
return parent.distinct().filter(autoria__primeiro_autor=True)\
.order_by('autoria__autor', '-autoria__primeiro_autor', 'tipo', '-ano', '-numero')
@ -1170,8 +1170,7 @@ class RelatorioMateriasPorAutorFilterSet(django_filters.FilterSet):
fields = ['tipo', 'data_apresentacao']
def __init__(self, *args, **kwargs):
super(RelatorioMateriasPorAutorFilterSet, self).__init__(
*args, **kwargs)
super().__init__(*args, **kwargs)
self.filters['tipo'].label = 'Tipo de Matéria'
@ -1530,3 +1529,47 @@ class RelatorioHistoricoTramitacaoAdmFilterSet(django_filters.FilterSet):
row1, row2, row3,
form_actions(label='Pesquisar'))
)
class RelatorioNormasPorAutorFilterSet(django_filters.FilterSet):
autorianorma__autor = django_filters.CharFilter(widget=forms.HiddenInput())
@property
def qs(self):
parent = super().qs
return parent.distinct().filter(autorianorma__primeiro_autor=True)\
.order_by('autorianorma__autor', '-autorianorma__primeiro_autor', 'tipo', '-ano', '-numero')
class Meta(FilterOverridesMetaMixin):
model = NormaJuridica
fields = ['tipo', 'data']
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.filters['tipo'].label = 'Tipo de Norma'
row1 = to_row(
[('tipo', 12)])
row2 = to_row(
[('data', 12)])
row3 = to_row(
[('autorianorma__autor', 0),
(Button('pesquisar',
'Pesquisar Autor',
css_class='btn btn-primary btn-sm'), 2),
(Button('limpar',
'Limpar Autor',
css_class='btn btn-primary btn-sm'), 10)])
self.form.helper = SaplFormHelper()
self.form.helper.form_method = 'GET'
self.form.helper.layout = Layout(
Fieldset(_('Pesquisar'),
row1, row2,
HTML(autor_label),
HTML(autor_modal),
row3,
form_actions(label='Pesquisar'))
)

5
sapl/base/urls.py

@ -36,7 +36,8 @@ from .views import (AlterarSenha, AppConfigCrud, CasaLegislativaCrud,
ListarAutoresDuplicadosView, ListarBancadaComissaoAutorExternoView,
ListarLegislaturaInfindavelView, ListarAnexadasCiclicasView,
ListarAnexadosCiclicosView, pesquisa_textual,
RelatorioHistoricoTramitacaoAdmView, RelatorioDocumentosAcessoriosView)
RelatorioHistoricoTramitacaoAdmView, RelatorioDocumentosAcessoriosView,
RelatorioNormasPorAutorView)
app_name = AppConfig.name
@ -138,6 +139,8 @@ urlpatterns = [
url(r'^sistema/relatorios/documentos_acessorios$',
RelatorioDocumentosAcessoriosView.as_view(),
name='relatorio_documentos_acessorios'),
url(r'^sistema/relatorios/normas-por-autor$',
RelatorioNormasPorAutorView.as_view(), name='normas_por_autor'),
url(r'^email/validate/(?P<uidb64>[0-9A-Za-z_\-]+)/'
'(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})$',

60
sapl/base/views.py

@ -38,7 +38,7 @@ from sapl.crud.base import CrudAux, make_pagination
from sapl.materia.models import (Autoria, MateriaLegislativa, Proposicao, Anexada,
TipoMateriaLegislativa, StatusTramitacao, UnidadeTramitacao,
DocumentoAcessorio, TipoDocumento)
from sapl.norma.models import (NormaJuridica, NormaEstatisticas)
from sapl.norma.models import (NormaJuridica, TipoNormaJuridica, NormaEstatisticas)
from sapl.parlamentares.models import Parlamentar, Legislatura, Mandato, Filiacao, SessaoLegislativa
from sapl.protocoloadm.models import (Protocolo, TipoDocumentoAdministrativo,
StatusTramitacaoAdministrativo,
@ -62,7 +62,8 @@ from .forms import (AlterarSenhaForm, CasaLegislativaForm,
RelatorioNormasVigenciaFilterSet,
EstatisticasAcessoNormasForm, UsuarioFilterSet,
RelatorioHistoricoTramitacaoAdmFilterSet,
RelatorioDocumentosAcessoriosFilterSet)
RelatorioDocumentosAcessoriosFilterSet,
RelatorioNormasPorAutorFilterSet)
from .models import AppConfig, CasaLegislativa
@ -849,15 +850,12 @@ class RelatorioMateriasPorAutorView(FilterView):
template_name = 'base/RelatorioMateriasPorAutor_filter.html'
def get_filterset_kwargs(self, filterset_class):
super(RelatorioMateriasPorAutorView,
self).get_filterset_kwargs(filterset_class)
super().get_filterset_kwargs(filterset_class)
kwargs = {'data': self.request.GET or None}
return kwargs
def get_context_data(self, **kwargs):
context = super(RelatorioMateriasPorAutorView,
self).get_context_data(**kwargs)
context = super().get_context_data(**kwargs)
context['title'] = _('Matérias por Autor')
if not self.filterset.form.is_valid():
@ -2081,4 +2079,52 @@ class RelatorioHistoricoTramitacaoAdmView(FilterView):
else:
context['tramitacaoadministrativo__unidade_tramitacao_destino'] = ''
return context
class RelatorioNormasPorAutorView(FilterView):
model = NormaJuridica
filterset_class = RelatorioNormasPorAutorFilterSet
template_name = 'base/RelatorioNormasPorAutor_filter.html'
def get_filterset_kwargs(self, filterset_class):
super().get_filterset_kwargs(filterset_class)
kwargs = {'data': self.request.GET or None}
return kwargs
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['title'] = _('Normas por Autor')
if not self.filterset.form.is_valid():
return context
qtdes = {}
for tipo in TipoNormaJuridica.objects.all():
qs = kwargs['object_list']
qtde = len(qs.filter(tipo_id=tipo.id))
if qtde > 0:
qtdes[tipo] = qtde
context['qtdes'] = qtdes
qr = self.request.GET.copy()
context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else ''
context['show_results'] = show_results_filter_set(qr)
if self.request.GET['tipo']:
tipo = int(self.request.GET['tipo'])
context['tipo'] = (
str(TipoNormaJuridica.objects.get(id=tipo)))
else:
context['tipo'] = ''
if self.request.GET['autorianorma__autor']:
autor = int(self.request.GET['autorianorma__autor'])
context['autor'] = (str(Autor.objects.get(id=autor)))
else:
context['autor'] = ''
context['periodo'] = (
self.request.GET['data_0'] +
' - ' + self.request.GET['data_1'])
return context

96
sapl/templates/base/RelatorioMateriasPorAutor_filter.html

@ -16,56 +16,60 @@
&emsp;Autor: {{ autor }}<br />
&emsp;Tipo de matéria: {{ tipo }}<br />
&emsp;Data de apresentação: {{periodo}}<br /><br /><br/>
<table class="table table-bordered table-hover">
<thead class="thead-default" >
<tr class="active"><th colspan="3" class="text-center">QUADRO GERAL</th></tr>
<tr class="active">
<th colspan="2">Tipo Matéria</th>
<th>Quantidade</th>
</tr>
</thead>
<tbody>
{% for key, value in qtdes.items %}
<tr>
<td colspan="2">{{key.sigla}} - {{key}}</td>
<td>{{value}}</td>
{% if object_list %}
<table class="table table-bordered table-hover">
<thead class="thead-default" >
<tr class="active"><th colspan="3" class="text-center">QUADRO GERAL</th></tr>
<tr class="active">
<th colspan="2">Tipo Matéria</th>
<th>Quantidade</th>
</tr>
{% endfor %}
</tbody>
</thead>
<tbody>
{% for key, value in qtdes.items %}
<tr>
<td colspan="2">{{key.sigla}} - {{key}}</td>
<td>{{value}}</td>
</tr>
{% endfor %}
</tbody>
{% for materia in object_list %}
{% ifchanged materia.autoria_set.first.autor %}
{% for materia in object_list %}
{% ifchanged materia.autoria_set.first.autor %}
<thead class="thead-default" >
<tr style="border-left: hidden; border-right: hidden;"><th colspan="3"></th></tr>
<tr class="active"><th colspan="3" class="text-center">Autor: {{ materia.autoria_set.first.autor }}</th></tr>
<tr class="active">
<th width="10%">Matéria</th>
<th>Ementa</th>
<th width="20%">Coautor(es)</th>
</tr>
</thead>
{% endifchanged %}
<tbody>
<tr>
<td><a href="{% url 'sapl.materia:materialegislativa_detail' materia.pk %}">
{{materia.tipo.sigla}} {{materia.numero}}/{{materia.ano}}
</a></td>
<td>{% autoescape off %}{{materia.ementa}}<br>{{materia.observacao}}{% endautoescape %}</td>
<td>
{% if materia.autoria_set.first != materia.autoria_set.last %}
{% for autor in materia.autoria_set.all %}
{% if not autor.primeiro_autor %}
{{ autor.autor }}<br />
{% endif %}
{% endfor %}
{% endif %}
</td>
</tr>
</tbody>
<thead class="thead-default" >
<tr style="border-left: hidden; border-right: hidden;"><th colspan="3"></th></tr>
<tr class="active"><th colspan="3" class="text-center">Autor: {{ materia.autoria_set.first.autor }}</th></tr>
<tr class="active">
<th width="10%">Matéria</th>
<th>Ementa</th>
<th width="20%">Coautor(es)</th>
</tr>
</thead>
{% endifchanged %}
<tbody>
<tr>
<td><a href="{% url 'sapl.materia:materialegislativa_detail' materia.pk %}">
{{materia.tipo.sigla}} {{materia.numero}}/{{materia.ano}}
</a></td>
<td>{% autoescape off %}{{materia.ementa}}<br>{{materia.observacao}}{% endautoescape %}</td>
<td>
{% if materia.autoria_set.first != materia.autoria_set.last %}
{% for autor in materia.autoria_set.all %}
{% if not autor.primeiro_autor %}
{{ autor.autor }}<br />
{% endif %}
{% endfor %}
{% endif %}
</td>
</tr>
</tbody>
{% endfor %}
</table>
{% endfor %}
</table>
{% else %}
<h3>Não foram encontradas matérias com os parâmetros pesquisados.</h3>
{% endif %}
{% endif %}

76
sapl/templates/base/RelatorioNormasPorAutor_filter.html

@ -0,0 +1,76 @@
{% extends "crud/list.html" %}
{% load i18n %}
{% load crispy_forms_tags %}
{% block base_content %}
{% if not show_results %}
{% crispy filter.form %}
{% endif %}
{% if show_results %}
<div class="actions btn-group float-right" role="group">
<a href="{% url 'sapl.base:normas_por_autor' %}" class="btn btn-outline-primary">{% trans 'Fazer nova pesquisa' %}</a>
</div>
<br /><br /><br /><br />
<b>PARÂMETROS DE PESQUISA:<br /></b>
&emsp;Autor: {{ autor }}<br />
&emsp;Tipo de Norma: {{ tipo }}<br />
&emsp;Data: {{periodo}}<br /><br /><br/>
{% if object_list %}
<table class="table table-bordered table-hover">
<thead class="thead-default" >
<tr class="active"><th colspan="3" class="text-center">QUADRO GERAL</th></tr>
<tr class="active">
<th colspan="2">Tipo de Norma</th>
<th>Quantidade</th>
</tr>
</thead>
<tbody>
{% for key, value in qtdes.items %}
<tr>
<td colspan="2">{{key.sigla}} - {{key}}</td>
<td>{{value}}</td>
</tr>
{% endfor %}
</tbody>
{% for norma in object_list %}
{% ifchanged norma.autorianorma_set.first.autor %}
<thead class="thead-default" >
<tr style="border-left: hidden; border-right: hidden;"><th colspan="3"></th></tr>
<tr class="active"><th colspan="3" class="text-center">Autor: {{ norma.autorianorma_set.first.autor }}</th></tr>
<tr class="active">
<th width="10%">Norma</th>
<th>Ementa</th>
<th width="20%">Coautor(es)</th>
</tr>
</thead>
{% endifchanged %}
<tbody>
<tr>
<td><a href="{% url 'sapl.norma:normajuridica_detail' norma.pk %}">
{{norma.tipo.sigla}} {{norma.numero}}/{{norma.ano}}
</a></td>
<td>{% autoescape off %}{{norma.ementa}}<br>{{norma.observacao}}{% endautoescape %}</td>
<td>
{% if norma.autorianorma_set.first != norma.autorianorma_set.last %}
{% for autor in norma.autorianorma_set.all %}
{% if not autor.primeiro_autor %}
{{ autor.autor }}<br />
{% endif %}
{% endfor %}
{% endif %}
</td>
</tr>
</tbody>
{% endfor %}
</table>
{% else %}
<h3>Não foram encontradas normas com os parâmetros pesquisados.</h3>
{% endif %}
{% endif %}
{% endblock base_content %}

4
sapl/templates/base/relatorios_list.html

@ -70,6 +70,10 @@
<td><a href="{% url 'sapl.base:relatorio_documentos_acessorios' %}"> Documentos Acessórios de Matérias Legislativas</a></td>
<td> Documentos Acessórios por tipo, período e tipo da Matéria Legislativa associada.</td>
</tr>
<tr>
<td><a href="{% url 'sapl.base:normas_por_autor' %}"> Normas Por Autor</a></td>
<td> Listagem e totalização de normas por autor, com filtros para tipo e período.</td>
</tr>
</tbody>
</table>
</fieldset>

2
sapl/utils.py

@ -128,7 +128,7 @@ def montar_row_autor(name):
return autor_row
#TODO: Esta função é utilizada?
def montar_helper_autor(self):
autor_row = montar_row_autor('nome')
self.helper = SaplFormHelper()

Loading…
Cancel
Save