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 %}
{% include 'paginacao.html'%} +