diff --git a/sapl/base/tests/test_view_base.py b/sapl/base/tests/test_view_base.py index 77880f91d..6655317b3 100644 --- a/sapl/base/tests/test_view_base.py +++ b/sapl/base/tests/test_view_base.py @@ -1,14 +1,17 @@ import pytest from model_mommy import mommy +import datetime from django.core.urlresolvers import reverse from django.utils.translation import ugettext_lazy as _ +from model_mommy import mommy from sapl.base.models import Autor, TipoAutor from sapl.comissoes.models import Comissao, TipoComissao from sapl.sessao.models import Bancada -from sapl.protocoloadm.models import Protocolo +from sapl.protocoloadm.models import (Protocolo, DocumentoAdministrativo, + TipoDocumentoAdministrativo, Anexado) from sapl.materia.models import (TipoMateriaLegislativa, RegimeTramitacao, - MateriaLegislativa) + MateriaLegislativa, Anexada) from sapl.parlamentares.models import (Parlamentar, Partido, Filiacao, Legislatura, Mandato) @@ -18,7 +21,7 @@ from sapl.base.views import (protocolos_duplicados, protocolos_com_materias, parlamentares_mandatos_intersecao, parlamentares_filiacoes_intersecao, autores_duplicados, - bancada_comissao_autor_externo) + bancada_comissao_autor_externo, anexados_ciclicos) @pytest.mark.django_db(transaction=False) @@ -419,6 +422,216 @@ def test_lista_bancada_comissao_autor_externo(): assert lista_bancada_comissao[1][2:4] == ('Comissão', 'comissao') +@pytest.mark.django_db(transaction=False) +def test_lista_anexados_ciclicas(): + ## DocumentoAdministrativo + tipo_documento = mommy.make( + TipoDocumentoAdministrativo, + sigla="TT", + descricao="Tipo_Teste" + ) + + documento_a = mommy.make( + DocumentoAdministrativo, + tipo=tipo_documento, + numero=26, + ano=2019, + data='2019-05-15', + ) + documento_b = mommy.make( + DocumentoAdministrativo, + tipo=tipo_documento, + numero=27, + ano=2019, + data='2019-05-16', + ) + documento_c = mommy.make( + DocumentoAdministrativo, + tipo=tipo_documento, + numero=28, + ano=2019, + data='2019-05-17', + ) + documento_a1 = mommy.make( + DocumentoAdministrativo, + tipo=tipo_documento, + numero=29, + ano=2019, + data='2019-05-18', + ) + documento_b1 = mommy.make( + DocumentoAdministrativo, + tipo=tipo_documento, + numero=30, + ano=2019, + data='2019-05-19', + ) + documento_c1 = mommy.make( + DocumentoAdministrativo, + tipo=tipo_documento, + numero=31, + ano=2019, + data='2019-05-20', + ) + + mommy.make( + Anexado, + documento_principal=documento_a, + documento_anexado=documento_b, + data_anexacao='2019-05-21' + ) + mommy.make( + Anexado, + documento_principal=documento_a, + documento_anexado=documento_c, + data_anexacao='2019-05-22' + ) + mommy.make( + Anexado, + documento_principal=documento_b, + documento_anexado=documento_c, + data_anexacao='2019-05-23' + ) + mommy.make( + Anexado, + documento_principal=documento_a1, + documento_anexado=documento_b1, + data_anexacao='2019-05-24' + ) + mommy.make( + Anexado, + documento_principal=documento_a1, + documento_anexado=documento_c1, + data_anexacao='2019-05-25' + ) + mommy.make( + Anexado, + documento_principal=documento_b1, + documento_anexado=documento_c1, + data_anexacao='2019-05-26' + ) + mommy.make( + Anexado, + documento_principal=documento_c1, + documento_anexado=documento_b1, + data_anexacao='2019-05-27' + ) + + lista_documento_ciclicos = anexados_ciclicos(False) + + ## Matéria + tipo_materia = mommy.make( + TipoMateriaLegislativa, + descricao="Tipo_Teste" + ) + regime_tramitacao = mommy.make( + RegimeTramitacao, + descricao="Regime_Teste" + ) + + materia_a = mommy.make( + MateriaLegislativa, + numero=20, + ano=2018, + data_apresentacao="2018-01-04", + regime_tramitacao=regime_tramitacao, + tipo=tipo_materia + ) + materia_b = mommy.make( + MateriaLegislativa, + numero=21, + ano=2019, + data_apresentacao="2019-05-04", + regime_tramitacao=regime_tramitacao, + tipo=tipo_materia + ) + materia_c = mommy.make( + MateriaLegislativa, + numero=22, + ano=2019, + data_apresentacao="2019-05-05", + regime_tramitacao=regime_tramitacao, + tipo=tipo_materia + ) + materia_a1 = mommy.make( + MateriaLegislativa, + numero=23, + ano=2018, + data_apresentacao="2019-05-06", + regime_tramitacao=regime_tramitacao, + tipo=tipo_materia + ) + materia_b1 = mommy.make( + MateriaLegislativa, + numero=24, + ano=2019, + data_apresentacao="2019-05-07", + regime_tramitacao=regime_tramitacao, + tipo=tipo_materia + ) + materia_c1 = mommy.make( + MateriaLegislativa, + numero=25, + ano=2019, + data_apresentacao="2019-05-08", + regime_tramitacao=regime_tramitacao, + tipo=tipo_materia + ) + + mommy.make( + Anexada, + materia_principal=materia_a, + materia_anexada=materia_b, + data_anexacao='2019-05-11' + ) + mommy.make( + Anexada, + materia_principal=materia_a, + materia_anexada=materia_c, + data_anexacao='2019-05-12' + ) + mommy.make( + Anexada, + materia_principal=materia_b, + materia_anexada=materia_c, + data_anexacao='2019-05-13' + ) + mommy.make( + Anexada, + materia_principal=materia_a1, + materia_anexada=materia_b1, + data_anexacao='2019-05-11' + ) + mommy.make( + Anexada, + materia_principal=materia_a1, + materia_anexada=materia_c1, + data_anexacao='2019-05-12' + ) + mommy.make( + Anexada, + materia_principal=materia_b1, + materia_anexada=materia_c1, + data_anexacao='2019-05-13' + ) + mommy.make( + Anexada, + materia_principal=materia_c1, + materia_anexada=materia_b1, + data_anexacao='2019-05-14' + ) + + lista_materias_ciclicas = anexados_ciclicos(True) + + assert len(lista_materias_ciclicas) == 2 + assert lista_materias_ciclicas[0] == (datetime.date(2019,5,13), materia_b1, materia_c1) + assert lista_materias_ciclicas[1] == (datetime.date(2019,5,14), materia_c1, materia_b1) + + assert len(lista_documento_ciclicos) == 2 + assert lista_documento_ciclicos[0] == (datetime.date(2019,5,26), documento_b1, documento_c1) + assert lista_documento_ciclicos[1] == (datetime.date(2019,5,27), documento_c1, documento_b1) + + @pytest.mark.django_db(transaction=False) def test_incluir_casa_legislativa_errors(admin_client): diff --git a/sapl/base/urls.py b/sapl/base/urls.py index ec48b6acc..eec4e9d3a 100644 --- a/sapl/base/urls.py +++ b/sapl/base/urls.py @@ -31,17 +31,13 @@ from .views import (AlterarSenha, AppConfigCrud, CasaLegislativaCrud, EstatisticasAcessoNormas, RelatoriosListView, ListarInconsistenciasView, ListarProtocolosDuplicadosView, - ListarProtocolosComMateriasView, - ListarMatProtocoloInexistenteView, + ListarProtocolosComMateriasView, ListarMatProtocoloInexistenteView, ListarParlamentaresDuplicadosView, - ListarFiliacoesSemDataFiliacaoView, - ListarMandatoSemDataInicioView, - ListarParlMandatosIntersecaoView, - ListarParlFiliacoesIntersecaoView, - ListarAutoresDuplicadosView, - ListarBancadaComissaoAutorExternoView, - ListarLegislaturaInfindavelView, - pesquisa_textual, + ListarFiliacoesSemDataFiliacaoView, ListarMandatoSemDataInicioView, + ListarParlMandatosIntersecaoView, ListarParlFiliacoesIntersecaoView, + ListarAutoresDuplicadosView, ListarBancadaComissaoAutorExternoView, + ListarLegislaturaInfindavelView, ListarAnexadasCiclicasView, + ListarAnexadosCiclicosView, pesquisa_textual, RelatorioHistoricoTramitacaoAdmView) @@ -198,6 +194,13 @@ urlpatterns = [ url(r'^sistema/inconsistencias/legislatura_infindavel$', ListarLegislaturaInfindavelView.as_view(), name='lista_legislatura_infindavel'), + url(r'sistema/inconsistencias/anexadas_ciclicas$', + ListarAnexadasCiclicasView.as_view(), + name='lista_anexadas_ciclicas'), + url(r'sistema/inconsistencias/anexados_ciclicos$', + ListarAnexadosCiclicosView.as_view(), + name='lista_anexados_ciclicos'), + url(r'^sistema/pesquisa-textual', pesquisa_textual, name='pesquisa_textual'), diff --git a/sapl/base/views.py b/sapl/base/views.py index 22393ea48..185042f1c 100644 --- a/sapl/base/views.py +++ b/sapl/base/views.py @@ -38,13 +38,13 @@ from sapl.base.forms import AutorForm, AutorFormForAdmin, TipoAutorForm from sapl.base.models import Autor, TipoAutor from sapl.comissoes.models import Reuniao, Comissao from sapl.crud.base import CrudAux, make_pagination -from sapl.materia.models import (Autoria, MateriaLegislativa, Proposicao, +from sapl.materia.models import (Autoria, MateriaLegislativa, Proposicao, Anexada, TipoMateriaLegislativa, StatusTramitacao, UnidadeTramitacao) from sapl.norma.models import (NormaJuridica, NormaEstatisticas) from sapl.parlamentares.models import Parlamentar, Legislatura, Mandato, Filiacao, SessaoLegislativa from sapl.protocoloadm.models import (Protocolo, TipoDocumentoAdministrativo, StatusTramitacaoAdministrativo, - DocumentoAdministrativo) + DocumentoAdministrativo, Anexado) from sapl.sessao.models import (PresencaOrdemDia, SessaoPlenaria, SessaoPlenariaPresenca, Bancada) from sapl.utils import (parlamentares_ativos, gerar_hash_arquivo, SEPARADOR_HASH_PROPOSICAO, @@ -1088,10 +1088,128 @@ class ListarInconsistenciasView(PermissionRequiredMixin, ListView): len(legislatura_infindavel()) ) ) - + tabela.append( + ('anexadas_ciclicas', + 'Matérias Anexadas cíclicas', + len(anexados_ciclicos(True)) + ) + ) + tabela.append( + ('anexados_ciclicos', + 'Documentos Anexados cíclicos', + len(anexados_ciclicos(False)) + ) + ) return tabela +def anexados_ciclicos(ofMateriaLegislativa): + ciclicos = [] + + if ofMateriaLegislativa: + principais = Anexada.objects.values( + 'materia_principal' + ).annotate( + count=Count('materia_principal') + ).filter(count__gt=0).order_by('-data_anexacao') + else: + principais = Anexado.objects.values( + 'documento_principal' + ).annotate( + count=Count('documento_principal') + ).filter(count__gt=0).order_by('-data_anexacao') + + for principal in principais: + anexados_total = [] + + if ofMateriaLegislativa: + anexados = Anexada.objects.filter( + materia_principal=principal['materia_principal'] + ).order_by('-data_anexacao') + else: + anexados = Anexado.objects.filter( + documento_principal=principal['documento_principal'] + ).order_by('-data_anexacao') + + anexados_temp = list(anexados) + while anexados_temp: + anexado = anexados_temp.pop() + if ofMateriaLegislativa: + if anexado.materia_anexada not in anexados_total: + if not principal['materia_principal'] == anexado.materia_anexada.pk: + anexados_total.append(anexado.materia_anexada) + anexados_anexado = Anexada.objects.filter( + materia_principal=anexado.materia_anexada + ) + anexados_temp.extend(anexados_anexado) + else: + ciclicos.append((anexado.data_anexacao, anexado.materia_principal, anexado.materia_anexada)) + else: + if anexado.documento_anexado not in anexados_total: + if not principal['documento_principal'] == anexado.documento_anexado.pk: + anexados_total.append(anexado.documento_anexado) + anexados_anexado = Anexado.objects.filter( + documento_principal=anexado.documento_anexado + ) + anexados_temp.extend(anexados_anexado) + else: + ciclicos.append((anexado.data_anexacao, anexado.documento_principal, anexado.documento_anexado)) + + return ciclicos + + +class ListarAnexadosCiclicosView(PermissionRequiredMixin, ListView): + model = get_user_model() + template_name = 'base/anexados_ciclicos.html' + context_object_name = 'anexados_ciclicos' + permission_required = ('base.list_appconfig',) + paginate_by = 10 + + def get_queryset(self): + return anexados_ciclicos(False) + + def get_context_data(self, **kwargs): + context = super( + ListarAnexadosCiclicosView, 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 + + +class ListarAnexadasCiclicasView(PermissionRequiredMixin, ListView): + model = get_user_model() + template_name = 'base/anexadas_ciclicas.html' + context_object_name = 'anexadas_ciclicas' + permission_required = ('base.list_appconfig',) + paginate_by = 10 + + def get_queryset(self): + return anexados_ciclicos(True) + + def get_context_data(self, **kwargs): + context = super( + ListarAnexadasCiclicasView, 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 encontrada.' + + return context + + def legislatura_infindavel(): return Legislatura.objects.filter(data_fim__isnull=True).order_by('-numero') diff --git a/sapl/templates/base/anexadas_ciclicas.html b/sapl/templates/base/anexadas_ciclicas.html new file mode 100644 index 000000000..9008d3428 --- /dev/null +++ b/sapl/templates/base/anexadas_ciclicas.html @@ -0,0 +1,35 @@ +{% extends "base.html" %} +{% load common_tags %} +{% block base_content %} +
+

Lista de Matérias Anexadas Cíclicas

+
+ {% if not anexadas_ciclicas %} +

{{ NO_ENTRIES_MSG }}

+ {% else %} + + + + + + + + + {% for data, fim, inicio in anexadas_ciclicas %} + + + + + + {% endfor %} + +
Matéria Fim do CicloMatéria Início do Ciclo
{{ data }} + {{ fim }} + + {{ inicio }} +
+ {% endif %} +
+ {% include 'paginacao.html' %} +
+{% endblock base_content %} \ No newline at end of file diff --git a/sapl/templates/base/anexados_ciclicos.html b/sapl/templates/base/anexados_ciclicos.html new file mode 100644 index 000000000..0e98659d3 --- /dev/null +++ b/sapl/templates/base/anexados_ciclicos.html @@ -0,0 +1,36 @@ +{% extends "base.html" %} +{% load common_tags %} +{% block base_content %} +
+

Lista de Documentos Anexados Cíclicos

+
+ {% if not anexados_ciclicos %} +

{{ NO_ENTRIES_MSG }}

+ {% else %} + + + + + + + + + + {% for data, fim, inicio in anexados_ciclicos %} + + + + + + {% endfor %} + +
Data AnexaçãoDocumento Fim do CicloDocumento Início do Ciclo
{{ data }} + {{ fim }} + + {{ inicio }} +
+ {% endif %} +
+ {% include 'paginacao.html' %} +
+{% endblock base_content %}