Browse Source

Complementa identificação de inconsistências (#2826)

* Identificar anexados e anexadas cíclicas

* Adicionar ordenação

* Adicionar testes
pull/2761/head
João Rodrigues 6 years ago
committed by Cesar Carvalho
parent
commit
c7bd8ca3d0
  1. 219
      sapl/base/tests/test_view_base.py
  2. 23
      sapl/base/urls.py
  3. 124
      sapl/base/views.py
  4. 35
      sapl/templates/base/anexadas_ciclicas.html
  5. 36
      sapl/templates/base/anexados_ciclicos.html

219
sapl/base/tests/test_view_base.py

@ -1,14 +1,17 @@
import pytest import pytest
from model_mommy import mommy from model_mommy import mommy
import datetime
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from model_mommy import mommy
from sapl.base.models import Autor, TipoAutor from sapl.base.models import Autor, TipoAutor
from sapl.comissoes.models import Comissao, TipoComissao from sapl.comissoes.models import Comissao, TipoComissao
from sapl.sessao.models import Bancada 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, from sapl.materia.models import (TipoMateriaLegislativa, RegimeTramitacao,
MateriaLegislativa) MateriaLegislativa, Anexada)
from sapl.parlamentares.models import (Parlamentar, Partido, Filiacao, from sapl.parlamentares.models import (Parlamentar, Partido, Filiacao,
Legislatura, Mandato) Legislatura, Mandato)
@ -18,7 +21,7 @@ from sapl.base.views import (protocolos_duplicados, protocolos_com_materias,
parlamentares_mandatos_intersecao, parlamentares_mandatos_intersecao,
parlamentares_filiacoes_intersecao, parlamentares_filiacoes_intersecao,
autores_duplicados, autores_duplicados,
bancada_comissao_autor_externo) bancada_comissao_autor_externo, anexados_ciclicos)
@pytest.mark.django_db(transaction=False) @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') 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) @pytest.mark.django_db(transaction=False)
def test_incluir_casa_legislativa_errors(admin_client): def test_incluir_casa_legislativa_errors(admin_client):

23
sapl/base/urls.py

@ -31,17 +31,13 @@ from .views import (AlterarSenha, AppConfigCrud, CasaLegislativaCrud,
EstatisticasAcessoNormas, EstatisticasAcessoNormas,
RelatoriosListView, RelatoriosListView,
ListarInconsistenciasView, ListarProtocolosDuplicadosView, ListarInconsistenciasView, ListarProtocolosDuplicadosView,
ListarProtocolosComMateriasView, ListarProtocolosComMateriasView, ListarMatProtocoloInexistenteView,
ListarMatProtocoloInexistenteView,
ListarParlamentaresDuplicadosView, ListarParlamentaresDuplicadosView,
ListarFiliacoesSemDataFiliacaoView, ListarFiliacoesSemDataFiliacaoView, ListarMandatoSemDataInicioView,
ListarMandatoSemDataInicioView, ListarParlMandatosIntersecaoView, ListarParlFiliacoesIntersecaoView,
ListarParlMandatosIntersecaoView, ListarAutoresDuplicadosView, ListarBancadaComissaoAutorExternoView,
ListarParlFiliacoesIntersecaoView, ListarLegislaturaInfindavelView, ListarAnexadasCiclicasView,
ListarAutoresDuplicadosView, ListarAnexadosCiclicosView, pesquisa_textual,
ListarBancadaComissaoAutorExternoView,
ListarLegislaturaInfindavelView,
pesquisa_textual,
RelatorioHistoricoTramitacaoAdmView) RelatorioHistoricoTramitacaoAdmView)
@ -198,6 +194,13 @@ urlpatterns = [
url(r'^sistema/inconsistencias/legislatura_infindavel$', url(r'^sistema/inconsistencias/legislatura_infindavel$',
ListarLegislaturaInfindavelView.as_view(), ListarLegislaturaInfindavelView.as_view(),
name='lista_legislatura_infindavel'), 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', url(r'^sistema/pesquisa-textual',
pesquisa_textual, pesquisa_textual,
name='pesquisa_textual'), name='pesquisa_textual'),

124
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.base.models import Autor, TipoAutor
from sapl.comissoes.models import Reuniao, Comissao from sapl.comissoes.models import Reuniao, Comissao
from sapl.crud.base import CrudAux, make_pagination 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) TipoMateriaLegislativa, StatusTramitacao, UnidadeTramitacao)
from sapl.norma.models import (NormaJuridica, NormaEstatisticas) from sapl.norma.models import (NormaJuridica, NormaEstatisticas)
from sapl.parlamentares.models import Parlamentar, Legislatura, Mandato, Filiacao, SessaoLegislativa from sapl.parlamentares.models import Parlamentar, Legislatura, Mandato, Filiacao, SessaoLegislativa
from sapl.protocoloadm.models import (Protocolo, TipoDocumentoAdministrativo, from sapl.protocoloadm.models import (Protocolo, TipoDocumentoAdministrativo,
StatusTramitacaoAdministrativo, StatusTramitacaoAdministrativo,
DocumentoAdministrativo) DocumentoAdministrativo, Anexado)
from sapl.sessao.models import (PresencaOrdemDia, SessaoPlenaria, from sapl.sessao.models import (PresencaOrdemDia, SessaoPlenaria,
SessaoPlenariaPresenca, Bancada) SessaoPlenariaPresenca, Bancada)
from sapl.utils import (parlamentares_ativos, gerar_hash_arquivo, SEPARADOR_HASH_PROPOSICAO, from sapl.utils import (parlamentares_ativos, gerar_hash_arquivo, SEPARADOR_HASH_PROPOSICAO,
@ -1088,10 +1088,128 @@ class ListarInconsistenciasView(PermissionRequiredMixin, ListView):
len(legislatura_infindavel()) 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 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(): def legislatura_infindavel():
return Legislatura.objects.filter(data_fim__isnull=True).order_by('-numero') return Legislatura.objects.filter(data_fim__isnull=True).order_by('-numero')

35
sapl/templates/base/anexadas_ciclicas.html

@ -0,0 +1,35 @@
{% extends "base.html" %}
{% load common_tags %}
{% block base_content %}
<fieldset>
<h1>Lista de Matérias Anexadas Cíclicas</h1>
<br/>
{% if not anexadas_ciclicas %}
<p>{{ NO_ENTRIES_MSG }}</p>
{% else %}
<table class="table table-striped table-hover">
<thead>
<tr>
<th>Matéria Fim do Ciclo</th>
<th>Matéria Início do Ciclo</th>
</tr>
</thead>
<tbody>
{% for data, fim, inicio in anexadas_ciclicas %}
<tr>
<td>{{ data }}</td>
<td>
<a href="{% url 'sapl.materia:materialegislativa_detail' fim.pk %}">{{ fim }}</a>
</td>
<td>
<a href="{% url 'sapl.materia:materialegislativa_detail' inicio.pk %}">{{ inicio }}</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endif %}
</fieldset>
{% include 'paginacao.html' %}
<br/>
{% endblock base_content %}

36
sapl/templates/base/anexados_ciclicos.html

@ -0,0 +1,36 @@
{% extends "base.html" %}
{% load common_tags %}
{% block base_content %}
<fieldset>
<h1>Lista de Documentos Anexados Cíclicos</h1>
<br/>
{% if not anexados_ciclicos %}
<p>{{ NO_ENTRIES_MSG }}</p>
{% else %}
<table class="table table-striped table-hover">
<thead>
<tr>
<th>Data Anexação</th>
<th>Documento Fim do Ciclo</th>
<th>Documento Início do Ciclo</th>
</tr>
</thead>
<tbody>
{% for data, fim, inicio in anexados_ciclicos %}
<tr>
<td>{{ data }}</td>
<td>
<a href="{% url 'sapl.protocoloadm:documentoadministrativo_detail' fim.pk %}">{{ fim }}</a>
</td>
<td>
<a href="{% url 'sapl.protocoloadm:documentoadministrativo_detail' inicio.pk %}">{{ inicio }}</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endif %}
</fieldset>
{% include 'paginacao.html' %}
<br/>
{% endblock base_content %}
Loading…
Cancel
Save