diff --git a/sapl/base/urls.py b/sapl/base/urls.py index 5081934e6..1cf489885 100644 --- a/sapl/base/urls.py +++ b/sapl/base/urls.py @@ -32,11 +32,14 @@ from .views import (AlterarSenha, AppConfigCrud, CasaLegislativaCrud, ListarInconsistenciasView, ListarProtocolosDuplicadosView, ListarProtocolosComMateriasView, ListarMatProtocoloInexistenteView, + ListarParlamentaresDuplicadosView, + ListarFiliacoesSemDataFiliacaoView, + ListarMandatoSemDataInicioView, ListarParlMandatosIntersecaoView, + ListarParlFiliacoesIntersecaoView, ListarAutoresDuplicadosView, ListarBancadaComissaoAutorExternoView, - ListarLegislaturaInfindavelView, - ListarMandatoSemDataInicioView) + ListarLegislaturaInfindavelView) app_name = AppConfig.name @@ -165,12 +168,21 @@ urlpatterns = [ url(r'^sistema/inconsistencias/materias_protocolo_inexistente$', ListarMatProtocoloInexistenteView.as_view(), name='lista_materias_protocolo_inexistente'), + url(r'^sistema/inconsistencias/filiacoes_sem_data_filiacao$', + ListarFiliacoesSemDataFiliacaoView.as_view(), + name='lista_filiacoes_sem_data_filiacao'), url(r'^sistema/inconsistencias/mandato_sem_data_inicio', ListarMandatoSemDataInicioView.as_view(), name='lista_mandato_sem_data_inicio'), + url(r'^sistema/inconsistencias/parlamentares_duplicados$', + ListarParlamentaresDuplicadosView.as_view(), + name='lista_parlamentares_duplicados'), url(r'^sistema/inconsistencias/parlamentares_mandatos_intersecao$', ListarParlMandatosIntersecaoView.as_view(), name='lista_parlamentares_mandatos_intersecao'), + url(r'^sistema/inconsistencias/parlamentares_filiacoes_intersecao$', + ListarParlFiliacoesIntersecaoView.as_view(), + name='lista_parlamentares_filiacoes_intersecao'), url(r'^sistema/inconsistencias/autores_duplicados$', ListarAutoresDuplicadosView.as_view(), name='lista_autores_duplicados'), diff --git a/sapl/base/views.py b/sapl/base/views.py index 172ad2ad1..4e24b35b1 100644 --- a/sapl/base/views.py +++ b/sapl/base/views.py @@ -40,7 +40,7 @@ from sapl.crud.base import CrudAux, make_pagination from sapl.materia.models import (Autoria, MateriaLegislativa, Proposicao, TipoMateriaLegislativa, StatusTramitacao, UnidadeTramitacao) from sapl.norma.models import (NormaJuridica, NormaEstatisticas) -from sapl.parlamentares.models import Parlamentar, Legislatura, Mandato +from sapl.parlamentares.models import Parlamentar, Legislatura, Mandato, Filiacao from sapl.protocoloadm.models import Protocolo from sapl.sessao.models import (PresencaOrdemDia, SessaoPlenaria, SessaoPlenariaPresenca, Bancada) @@ -976,18 +976,36 @@ class ListarInconsistenciasView(PermissionRequiredMixin, ListView): len(materias_protocolo_inexistente()) ) ) + tabela.append( + ('filiacoes_sem_data_filiacao', + 'Filiações sem data filiação', + len(filiacoes_sem_data_filiacao()) + ) + ) tabela.append( ('mandato_sem_data_inicio', 'Mandatos sem data inicial', len(mandato_sem_data_inicio()) ) ) + tabela.append( + ('parlamentares_duplicados', + 'Parlamentares duplicados', + len(parlamentares_duplicados()) + ) + ) tabela.append( ('parlamentares_mandatos_intersecao', - 'Parlamentares com mandatos com interseção', + 'Parlamentares com mandatos em interseção', len(parlamentares_mandatos_intersecao()) ) ) + tabela.append( + ('parlamentares_filiacoes_intersecao', + 'Parlamentares com filiações em interseção', + len(parlamentares_filiacoes_intersecao()) + ) + ) tabela.append( ('autores_duplicados', 'Autores duplicados', @@ -1034,7 +1052,7 @@ class ListarLegislaturaInfindavelView(PermissionRequiredMixin, ListView): page_obj.number, paginator.num_pages) context[ 'NO_ENTRIES_MSG' - ] = 'Nenhuma encontrada.' + ] = 'Nenhuma encontrado.' return context @@ -1089,7 +1107,9 @@ class ListarBancadaComissaoAutorExternoView(PermissionRequiredMixin, ListView): def autores_duplicados(): - return [autor.values() for autor in Autor.objects.values('nome', 'tipo__descricao').annotate(count=Count('nome')).filter(count__gt=1)] + return [autor.values() for autor in Autor.objects.values( + 'nome', 'tipo__descricao').order_by( + "nome").annotate(count=Count('nome')).filter(count__gt=1)] class ListarAutoresDuplicadosView(PermissionRequiredMixin, ListView): @@ -1115,10 +1135,56 @@ class ListarAutoresDuplicadosView(PermissionRequiredMixin, ListView): return context +def parlamentares_filiacoes_intersecao(): + intersecoes = [] + + for parlamentar in Parlamentar.objects.all().order_by('nome_parlamentar'): + filiacoes = parlamentar.filiacao_set.all() + combinacoes = itertools.combinations(filiacoes, 2) + + for c in combinacoes: + data_filiacao1 = c[0].data + data_desfiliacao1 = c[0].data_desfiliacao if c[0].data_desfiliacao else timezone.now().date() + + data_filiacao2 = c[1].data + data_desfiliacao2 = c[1].data_desfiliacao if c[1].data_desfiliacao else timezone.now().date() + + if data_filiacao1 and data_filiacao2: + exists = intervalos_tem_intersecao( + data_filiacao1, data_desfiliacao1, + data_filiacao2, data_desfiliacao2) + if exists: + intersecoes.append((parlamentar, c[0], c[1])) + return intersecoes + + +class ListarParlFiliacoesIntersecaoView(PermissionRequiredMixin, ListView): + model = get_user_model() + template_name = 'base/parlamentares_filiacoes_intersecao.html' + context_object_name = 'parlamentares_filiacoes_intersecao' + permission_required = ('base.list_appconfig',) + paginate_by = 10 + + def get_queryset(self): + return parlamentares_filiacoes_intersecao() + + def get_context_data(self, **kwargs): + context = super( + ListarParlFiliacoesIntersecaoView, self).get_context_data(**kwargs) + paginator = context['paginator'] + page_obj = context['page_obj'] + context['page_range'] = make_pagination( + page_obj.number, paginator.num_pages) + context[ + 'NO_ENTRIES_MSG' + ] = 'Nenhum encontrado.' + return context + + def parlamentares_mandatos_intersecao(): intersecoes = [] - for parlamentar in Parlamentar.objects.all().order_by('nome_completo'): + for parlamentar in Parlamentar.objects.all().order_by('nome_parlamentar'): mandatos = parlamentar.mandato_set.all() combinacoes = itertools.combinations(mandatos, 2) @@ -1164,6 +1230,35 @@ class ListarParlMandatosIntersecaoView(PermissionRequiredMixin, ListView): return context +def parlamentares_duplicados(): + return [parlamentar.values() for parlamentar in Parlamentar.objects.values( + 'nome_parlamentar').order_by('nome_parlamentar').annotate(count=Count( + 'nome_parlamentar')).filter(count__gt=1)] + + +class ListarParlamentaresDuplicadosView(PermissionRequiredMixin, ListView): + model = get_user_model() + template_name = 'base/parlamentares_duplicados.html' + context_object_name = 'parlamentares_duplicados' + permission_required = ('base.list_appconfig',) + paginate_by = 10 + + def get_queryset(self): + return parlamentares_duplicados() + + def get_context_data(self, **kwargs): + context = super( + ListarParlamentaresDuplicadosView, self).get_context_data(**kwargs) + paginator = context['paginator'] + page_obj = context['page_obj'] + context['page_range'] = make_pagination( + page_obj.number, paginator.num_pages) + context[ + 'NO_ENTRIES_MSG' + ] = 'Nenhum encontrado.' + return context + + def mandato_sem_data_inicio(): return Mandato.objects.filter(data_inicio_mandato__isnull=True).order_by('parlamentar') @@ -1188,7 +1283,35 @@ class ListarMandatoSemDataInicioView(PermissionRequiredMixin, ListView): page_obj.number, paginator.num_pages) context[ 'NO_ENTRIES_MSG' - ] = 'Nenhum encontrada.' + ] = 'Nenhum encontrado.' + return context + + +def filiacoes_sem_data_filiacao(): + return Filiacao.objects.filter(data__isnull=True).order_by('parlamentar') + + +class ListarFiliacoesSemDataFiliacaoView(PermissionRequiredMixin, ListView): + model = get_user_model() + template_name = 'base/filiacoes_sem_data_filiacao.html' + context_object_name = 'filiacoes_sem_data_filiacao' + permission_required = ('base.list_appconfig',) + paginate_by = 10 + + def get_queryset(self): + return filiacoes_sem_data_filiacao() + + def get_context_data(self, **kwargs): + context = super( + ListarFiliacoesSemDataFiliacaoView, self + ).get_context_data(**kwargs) + paginator = context['paginator'] + page_obj = context['page_obj'] + context['page_range'] = make_pagination( + page_obj.number, paginator.num_pages) + context[ + 'NO_ENTRIES_MSG' + ] = 'Nenhuma encontrado.' return context @@ -1223,7 +1346,7 @@ class ListarMatProtocoloInexistenteView(PermissionRequiredMixin, ListView): page_obj.number, paginator.num_pages) context[ 'NO_ENTRIES_MSG' - ] = 'Nenhuma encontrada.' + ] = 'Nenhuma encontrado.' return context diff --git a/sapl/templates/base/autores_duplicados.html b/sapl/templates/base/autores_duplicados.html index 57068375b..a7861aecd 100644 --- a/sapl/templates/base/autores_duplicados.html +++ b/sapl/templates/base/autores_duplicados.html @@ -3,6 +3,7 @@ {% block base_content %}

Lista de Autores Duplicados

+
{% if not autores_duplicados %}

{{ NO_ENTRIES_MSG }}

{% else %} @@ -27,4 +28,5 @@ {% endif %}
{% include 'paginacao.html'%} +
{% endblock base_content %} \ No newline at end of file diff --git a/sapl/templates/base/bancada_comissao_autor_externo.html b/sapl/templates/base/bancada_comissao_autor_externo.html index b4471ed1c..9edaf21f7 100644 --- a/sapl/templates/base/bancada_comissao_autor_externo.html +++ b/sapl/templates/base/bancada_comissao_autor_externo.html @@ -3,6 +3,7 @@ {% block base_content %}

Lista de Bancadas e Comissões com Autor Externo

+
{% if not bancada_comissao_autor_externo %}

{{ NO_ENTRIES_MSG }}

{% else %} @@ -31,4 +32,5 @@ {% endif %}
{% include 'paginacao.html'%} +
{% endblock base_content %} \ No newline at end of file diff --git a/sapl/templates/base/filiacoes_sem_data_filiacao.html b/sapl/templates/base/filiacoes_sem_data_filiacao.html new file mode 100644 index 000000000..22d24f972 --- /dev/null +++ b/sapl/templates/base/filiacoes_sem_data_filiacao.html @@ -0,0 +1,32 @@ +{% extends "base.html" %} +{% load common_tags %} +{% block base_content %} +
+

Lista de Filiações sem Data Filiação

+
+ {% if not filiacoes_sem_data_filiacao %} +

{{ NO_ENTRIES_MSG }}

+ {% else %} + + + + + + + + + {% for filiacao in filiacoes_sem_data_filiacao %} + + + + + {% endfor %} + +
Parlamentar FiliadoPartido
+ {{ filiacao.parlamentar }} + {{ filiacao.partido }}
+ {% endif %} +
+ {% include 'paginacao.html'%} +
+{% endblock base_content %} \ No newline at end of file diff --git a/sapl/templates/base/legislatura_infindavel.html b/sapl/templates/base/legislatura_infindavel.html index b2a772ecc..a44c544e1 100644 --- a/sapl/templates/base/legislatura_infindavel.html +++ b/sapl/templates/base/legislatura_infindavel.html @@ -3,6 +3,7 @@ {% block base_content %}

Lista de Legislaturas sem Data Fim

+
{% if not legislatura_infindavel %}

{{ NO_ENTRIES_MSG }}

{% else %} @@ -27,4 +28,5 @@ {% endif %}
{% include 'paginacao.html'%} +
{% endblock base_content %} \ No newline at end of file diff --git a/sapl/templates/base/lista_inconsistencias.html b/sapl/templates/base/lista_inconsistencias.html index 735dd21d1..121422ade 100644 --- a/sapl/templates/base/lista_inconsistencias.html +++ b/sapl/templates/base/lista_inconsistencias.html @@ -3,6 +3,7 @@ {% block base_content %}

Lista de Inconsistências

+
{% for complemento_link, nome, valor in tabela_inconsistencias %} @@ -17,4 +18,5 @@
{% include 'paginacao.html'%} +
{% endblock base_content %} \ No newline at end of file diff --git a/sapl/templates/base/mandato_sem_data_inicio.html b/sapl/templates/base/mandato_sem_data_inicio.html index 110995ad2..09c151d7a 100644 --- a/sapl/templates/base/mandato_sem_data_inicio.html +++ b/sapl/templates/base/mandato_sem_data_inicio.html @@ -3,6 +3,7 @@ {% block base_content %}

Lista de Mandatos sem Data Inicial

+
{% if not mandato_sem_data_inicio %}

{{ NO_ENTRIES_MSG }}

{% else %} @@ -27,4 +28,5 @@ {% endif %}
{% include 'paginacao.html'%} +
{% endblock base_content %} \ No newline at end of file diff --git a/sapl/templates/base/materias_protocolo_inexistente.html b/sapl/templates/base/materias_protocolo_inexistente.html index 40bf34b78..879a6d460 100644 --- a/sapl/templates/base/materias_protocolo_inexistente.html +++ b/sapl/templates/base/materias_protocolo_inexistente.html @@ -3,6 +3,7 @@ {% block base_content %}

Lista de Matérias Legislativas com Protocolo Inexistente

+
{% if not materias_protocolo_inexistente %}

{{ NO_ENTRIES_MSG }}

{% else %} @@ -29,4 +30,5 @@ {% endif %}
{% include 'paginacao.html'%} +
{% endblock base_content %} \ No newline at end of file diff --git a/sapl/templates/base/parlamentares_duplicados.html b/sapl/templates/base/parlamentares_duplicados.html new file mode 100644 index 000000000..2e63a04bc --- /dev/null +++ b/sapl/templates/base/parlamentares_duplicados.html @@ -0,0 +1,32 @@ +{% extends "base.html" %} +{% load common_tags %} +{% block base_content %} +
+

Lista de Parlamentares Duplicados

+
+ {% if not parlamentares_duplicados %} +

{{ NO_ENTRIES_MSG }}

+ {% else %} + + + + + + + + + {% for parlamentar, quantidade in parlamentares_duplicados %} + + + + + {% endfor %} + +
Nome do ParlamentarQuantidade
+ {{ parlamentar }} + {{ quantidade }}
+ {% endif %} +
+ {% include 'paginacao.html'%} +
+{% endblock base_content %} \ No newline at end of file diff --git a/sapl/templates/base/parlamentares_filiacoes_intersecao.html b/sapl/templates/base/parlamentares_filiacoes_intersecao.html new file mode 100644 index 000000000..b0949e05a --- /dev/null +++ b/sapl/templates/base/parlamentares_filiacoes_intersecao.html @@ -0,0 +1,34 @@ +{% extends "base.html" %} +{% load common_tags %} +{% block base_content %} +
+

Lista de Parlamentares com Filiações com Interseção

+
+ {% if not parlamentares_filiacoes_intersecao %} +

{{ NO_ENTRIES_MSG }}

+ {% else %} + + + + + + + + + + {% for parlamentar, filiacao_a , filiacao_b in parlamentares_filiacoes_intersecao %} + + + + + + {% endfor %} + +
ParlamentarFiliação 1Filiação 2
+ {{ parlamentar }} + {{filiacao_a.data|date:"d/m/Y"}} - {{filiacao_a.data_desfiliacao|date:"d/m/Y"}}{{filiacao_b.data|date:"d/m/Y"}} - {{filiacao_b.data_desfiliacao|date:"d/m/Y"}}
+ {% endif %} +
+ {% include 'paginacao.html'%} +
+{% endblock base_content %} \ No newline at end of file diff --git a/sapl/templates/base/parlamentares_mandatos_intersecao.html b/sapl/templates/base/parlamentares_mandatos_intersecao.html index 8451a9e3e..2d4c915a4 100644 --- a/sapl/templates/base/parlamentares_mandatos_intersecao.html +++ b/sapl/templates/base/parlamentares_mandatos_intersecao.html @@ -2,7 +2,8 @@ {% load common_tags %} {% block base_content %}
-

Lista de Parlamentares com Mandatos com Interseção

+

Lista de Parlamentares com Mandatos em Interseção

+
{% if not parlamentares_mandatos_intersecao %}

{{ NO_ENTRIES_MSG }}

{% else %} @@ -18,7 +19,7 @@ {% for parlamentar, mandato_a, mandato_b in parlamentares_mandatos_intersecao %} - {{ parlamentar }} + {{ parlamentar }} {{ mandato_a.legislatura}}
{{mandato_a.data_inicio_mandato|date:"d/m/Y"}} - {{mandato_a.data_fim_mandato|date:"d/m/Y"}} {{ mandato_b.legislatura }}
{{mandato_b.data_inicio_mandato|date:"d/m/Y"}} - {{mandato_b.data_fim_mandato|date:"d/m/Y"}} @@ -29,4 +30,5 @@ {% endif %}
{% include 'paginacao.html'%} +
{% endblock base_content %} \ No newline at end of file diff --git a/sapl/templates/base/protocolos_com_materias.html b/sapl/templates/base/protocolos_com_materias.html index 29dd84bf9..1e98bad5c 100644 --- a/sapl/templates/base/protocolos_com_materias.html +++ b/sapl/templates/base/protocolos_com_materias.html @@ -3,6 +3,7 @@ {% block base_content %}

Lista de Protocolos que Excedem o Limite de Matérias Vinculadas

+
{% if not protocolos_com_materias %}

{{ NO_ENTRIES_MSG }}

{% else %} @@ -25,4 +26,5 @@ {% endif %}
{% include 'paginacao.html'%} +
{% endblock base_content %} \ No newline at end of file diff --git a/sapl/templates/base/protocolos_duplicados.html b/sapl/templates/base/protocolos_duplicados.html index e5217c908..15056991f 100644 --- a/sapl/templates/base/protocolos_duplicados.html +++ b/sapl/templates/base/protocolos_duplicados.html @@ -3,6 +3,7 @@ {% block base_content %}

Lista de Protocolos Duplicados

+
{% if not protocolos_duplicados %}

{{ NO_ENTRIES_MSG }}

{% else %} @@ -27,4 +28,5 @@ {% endif %}
{% include 'paginacao.html'%} +
{% endblock base_content %} \ No newline at end of file