diff --git a/sapl/base/urls.py b/sapl/base/urls.py index 257f76ea7..168703071 100644 --- a/sapl/base/urls.py +++ b/sapl/base/urls.py @@ -28,7 +28,10 @@ from .views import (AlterarSenha, AppConfigCrud, CasaLegislativaCrud, RelatorioNormasVigenciaView, EstatisticasAcessoNormas, RelatoriosListView, - ListarInconsistenciasView, ListarProtocolosDuplicadosView) + ListarInconsistenciasView, ListarProtocolosDuplicadosView, + ListarProtocolosMateriasView, + ListarMatProtocoloInexistenteView, + ListarParlMandatosIntersecaoView) app_name = AppConfig.name @@ -134,12 +137,15 @@ urlpatterns = [ url(r'^sistema/inconsistencias/protocolos_duplicados$', ListarProtocolosDuplicadosView.as_view(), name='lista_protocolos_duplicados'), - url(r'^sistema/inconsistencias/protocolos_com_materias$', - ListarProtocolosComMateriasView.as_view(), - name='lista_protocolos_com_materias'), - url(r'^sistema/inconsistencias/materias_com_protocolo_inexistente$', - ListarMateriasCProtocoloInexistenteV.as_view(), - name='lista_materias_com_protocolo_inexistente'), + url(r'^sistema/inconsistencias/protocolos_materias$', + ListarProtocolosMateriasView.as_view(), + name='lista_protocolos_materias'), + url(r'^sistema/inconsistencias/materias_protocolo_inexistente$', + ListarMatProtocoloInexistenteView.as_view(), + name='lista_materias_protocolo_inexistente'), + url(r'^sistema/inconsistencias/parlamentares_mandatos_intersecao$', + ListarParlMandatosIntersecaoView.as_view(), + name='lista_parlamentares_mandatos_intersecao'), # todos os sublinks de sistema devem vir acima deste url(r'^sistema/$', permission_required('base.view_tabelas_auxiliares') diff --git a/sapl/base/views.py b/sapl/base/views.py index e69cbdf71..2446d8188 100644 --- a/sapl/base/views.py +++ b/sapl/base/views.py @@ -35,11 +35,13 @@ from sapl.crud.base import CrudAux, make_pagination from sapl.materia.models import (Autoria, MateriaLegislativa, TipoMateriaLegislativa, StatusTramitacao, UnidadeTramitacao) from sapl.norma.models import (NormaJuridica, NormaEstatisticas) +from sapl.parlamentares.models import Parlamentar from sapl.protocoloadm.models import Protocolo from sapl.sessao.models import (PresencaOrdemDia, SessaoPlenaria, SessaoPlenariaPresenca) from sapl.utils import (parlamentares_ativos, - show_results_filter_set, mail_service_configured) + show_results_filter_set, mail_service_configured, + intervalos_tem_intersecao) from .forms import (AlterarSenhaForm, CasaLegislativaForm, ConfiguracoesAppForm, RelatorioAtasFilterSet, @@ -930,21 +932,64 @@ class ListarInconsistenciasView(PermissionRequiredMixin, ListView): len(protocolos_duplicados())) ) tabela.append( - ('protocolos_com_materias', + ('protocolos_materias', 'Protocolos que excedem o limite de matérias vinculadas', - len(protocolos_com_materias())) + len(protocolos_materias())) ) tabela.append( - ('materias_com_protocolo_inexistente', + ('materias_protocolo_inexistente', 'Matérias Legislativas com protocolo inexistente', - len(materias_com_protocolo_inexistente()) + len(materias_protocolo_inexistente())) + ) + tabela.append( + ('parlamentares_mandato_intersecao', + 'Parlamentares com mandatos com interseção', + len(parlamentares_mandatos_intersecao())) ) - ) return tabela -def materias_com_protocolo_inexistente(): +def parlamentares_mandatos_intersecao(): + intersecoes = [] + for parlamentar in Parlamentar.objects.all(): + mandatos = parlamentar.mandato_set.all() + length = len(mandatos) + if mandatos and length > 1: + for i in range(0, length-1): + for j in range(i+1, length): + mandato1 = mandatos[i] + mandato2 = mandatos[j] + exists = intervalos_tem_intersecao(mandato1.data_inicio_mandato, mandato1.data_fim_mandato, mandato2.data_inicio_mandato, mandato2.data_fim_mandato) + if exists: + intersecoes.append((parlamentar, mandato1, mandato2)) + return intersecoes + + +class ListarParlMandatosIntersecaoView(PermissionRequiredMixin, ListView): + model = get_user_model() + template_name = 'base/parlamentares_mandato_intersecao.html' + context_object_name = 'parlamentares_mandatos_intersecao' + permission_required = ('base.list_appconfig',) + paginate_by = 10 + + def get_queryset(self): + return parlamentares_mandato_intersecao() + + def get_context_data(self, **kwargs): + context = super( + ListarParlMandatosIntersecaoView, 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' + ] = '--.' + return context + + +def materias_protocolo_inexistente(): materias = [] for materia in MateriaLegislativa.objects.all().order_by('-ano'): if materia.numero_protocolo: @@ -956,19 +1001,20 @@ def materias_com_protocolo_inexistente(): return materias -class ListarMateriasCProtocoloInexistenteV(PermissionRequiredMixin, ListView): +class ListarMatProtocoloInexistenteView(PermissionRequiredMixin, ListView): model = get_user_model() - template_name = 'base/materias_com_protocolo_inexistente.html' - context_object_name = 'materias_com_protocolo_inexistente' + template_name = 'base/materias_protocolo_inexistente.html' + context_object_name = 'materias_protocolo_inexistente' permission_required = ('base.list_appconfig',) paginate_by = 10 def get_queryset(self): - return materias_com_protocolo_inexistente() + return materias_protocolo_inexistente() def get_context_data(self, **kwargs): context = super( - ListarProtocolosComMateriasView, self).get_context_data(**kwargs) + ListarMatProtocoloInexistenteView, self + ).get_context_data(**kwargs) paginator = context['paginator'] page_obj = context['page_obj'] context['page_range'] = make_pagination( @@ -979,7 +1025,7 @@ class ListarMateriasCProtocoloInexistenteV(PermissionRequiredMixin, ListView): return context -def protocolos_com_materias(): +def protocolos_materias(): protocolos = [] for protocolo in Protocolo.objects.all(): materias_protocolo = MateriaLegislativa.objects.filter( @@ -989,19 +1035,19 @@ def protocolos_com_materias(): return protocolos -class ListarProtocolosComMateriasView(PermissionRequiredMixin, ListView): +class ListarProtocolosMateriasView(PermissionRequiredMixin, ListView): model = get_user_model() - template_name = 'base/protocolos_com_materias.html' - context_object_name = 'protocolos_com_materias' + template_name = 'base/protocolos_materias.html' + context_object_name = 'protocolos_materias' permission_required = ('base.list_appconfig',) paginate_by = 10 def get_queryset(self): - return protocolos_com_materias() + return protocolos_materias() def get_context_data(self, **kwargs): context = super( - ListarProtocolosComMateriasView, self).get_context_data(**kwargs) + ListarProtocolosMateriasView, self).get_context_data(**kwargs) paginator = context['paginator'] page_obj = context['page_obj'] context['page_range'] = make_pagination( diff --git a/sapl/templates/base/materias_com_protocolo_inexistente.html b/sapl/templates/base/materias_protocolo_inexistente.html similarity index 90% rename from sapl/templates/base/materias_com_protocolo_inexistente.html rename to sapl/templates/base/materias_protocolo_inexistente.html index 3ef14d3a1..0b2a7c4f8 100644 --- a/sapl/templates/base/materias_com_protocolo_inexistente.html +++ b/sapl/templates/base/materias_protocolo_inexistente.html @@ -5,7 +5,7 @@ {% block base_content %}