Browse Source

Acelera pesquisa do relatório

pull/2955/head
João Rodrigues 6 years ago
parent
commit
58f8bf2fb7
  1. 47
      sapl/base/forms.py
  2. 153
      sapl/base/views.py
  3. 14
      sapl/templates/base/RelatorioMateriasPorTramitacao_filter.html

47
sapl/base/forms.py

@ -18,27 +18,25 @@ from django.utils.translation import string_concat
from django.utils.translation import ugettext_lazy as _
import django_filters
from sapl.audiencia.models import AudienciaPublica, TipoAudienciaPublica
from sapl.audiencia.models import AudienciaPublica, TipoAudienciaPublica
from sapl.audiencia.models import AudienciaPublica
from sapl.base.models import Autor, TipoAutor
from sapl.comissoes.models import Reuniao, Comissao
from sapl.comissoes.models import Reuniao, Comissao
from sapl.crispy_layout_mixin import (SaplFormLayout, form_actions, to_column,
to_row)
from sapl.crispy_layout_mixin import SaplFormHelper
from sapl.materia.models import (MateriaLegislativa, UnidadeTramitacao, StatusTramitacao,
DocumentoAcessorio, TipoMateriaLegislativa)
from sapl.norma.models import (NormaJuridica, NormaEstatisticas)
from sapl.parlamentares.models import SessaoLegislativa, Partido
from sapl.comissoes.models import Reuniao
from sapl.crispy_layout_mixin import (form_actions, to_column, to_row,
SaplFormHelper, SaplFormLayout)
from sapl.materia.models import (DocumentoAcessorio, MateriaEmTramitacao,
MateriaLegislativa, UnidadeTramitacao,
StatusTramitacao)
from sapl.norma.models import NormaJuridica
from sapl.parlamentares.models import Partido, SessaoLegislativa
from sapl.protocoloadm.models import DocumentoAdministrativo
from sapl.sessao.models import SessaoPlenaria
from sapl.settings import MAX_IMAGE_UPLOAD_SIZE
from sapl.utils import (RANGE_ANOS, YES_NO_CHOICES,
ChoiceWithoutValidationField, ImageThumbnailFileInput,
RangeWidgetOverride, autor_label, autor_modal,
models_with_gr_for_model, qs_override_django_filter,
from sapl.utils import (autor_label, autor_modal, ChoiceWithoutValidationField,
choice_anos_com_normas, choice_anos_com_materias,
FilterOverridesMetaMixin, FileFieldCheckMixin)
FilterOverridesMetaMixin, FileFieldCheckMixin,
ImageThumbnailFileInput, models_with_gr_for_model,
qs_override_django_filter, RangeWidgetOverride,
RANGE_ANOS, YES_NO_CHOICES)
from .models import AppConfig, CasaLegislativa
@ -1087,7 +1085,7 @@ class RelatorioAudienciaFilterSet(django_filters.FilterSet):
class RelatorioMateriasTramitacaoFilterSet(django_filters.FilterSet):
ano = django_filters.ChoiceFilter(required=True,
materia__ano = django_filters.ChoiceFilter(required=True,
label='Ano da Matéria',
choices=choice_anos_com_materias)
@ -1102,21 +1100,24 @@ class RelatorioMateriasTramitacaoFilterSet(django_filters.FilterSet):
@property
def qs(self):
parent = super(RelatorioMateriasTramitacaoFilterSet, self).qs
return parent.distinct().order_by('-ano', 'tipo', '-numero')
return parent.distinct().order_by(
'-materia__ano', 'materia__tipo', '-materia__numero'
)
class Meta:
model = MateriaLegislativa
fields = ['ano', 'tipo', 'tramitacao__unidade_tramitacao_destino',
model = MateriaEmTramitacao
fields = ['materia__ano', 'materia__tipo',
'tramitacao__unidade_tramitacao_destino',
'tramitacao__status']
def __init__(self, *args, **kwargs):
super(RelatorioMateriasTramitacaoFilterSet, self).__init__(
*args, **kwargs)
self.filters['tipo'].label = 'Tipo de Matéria'
self.filters['materia__tipo'].label = 'Tipo de Matéria'
row1 = to_row([('ano', 12)])
row2 = to_row([('tipo', 12)])
row1 = to_row([('materia__ano', 12)])
row2 = to_row([('materia__tipo', 12)])
row3 = to_row([('tramitacao__unidade_tramitacao_destino', 12)])
row4 = to_row([('tramitacao__status', 12)])

153
sapl/base/views.py

@ -32,23 +32,26 @@ from haystack.query import SearchQuerySet
from sapl import settings
from sapl.audiencia.models import AudienciaPublica, TipoAudienciaPublica
from sapl.base.forms import AutorForm, AutorFormForAdmin, TipoAutorForm
from sapl.base.models import Autor, TipoAutor
from sapl.comissoes.models import Reuniao, Comissao
from sapl.base.forms import AutorForm, AutorFormForAdmin, TipoAutorForm
from sapl.comissoes.models import Comissao, Reuniao
from sapl.crud.base import CrudAux, make_pagination
from sapl.materia.models import (Autoria, MateriaLegislativa, Proposicao, Anexada,
TipoMateriaLegislativa, StatusTramitacao, UnidadeTramitacao,
DocumentoAcessorio, TipoDocumento, Tramitacao)
from sapl.norma.models import (NormaJuridica, TipoNormaJuridica, NormaEstatisticas)
from sapl.parlamentares.models import Parlamentar, Legislatura, Mandato, Filiacao, SessaoLegislativa
from sapl.protocoloadm.models import (Protocolo, TipoDocumentoAdministrativo,
from sapl.materia.models import (Anexada, Autoria, DocumentoAcessorio,
MateriaEmTramitacao, MateriaLegislativa, Proposicao,
StatusTramitacao, TipoDocumento,
TipoMateriaLegislativa, UnidadeTramitacao, Tramitacao)
from sapl.norma.models import NormaJuridica, TipoNormaJuridica
from sapl.parlamentares.models import (Filiacao, Legislatura, Mandato, Parlamentar,
SessaoLegislativa)
from sapl.protocoloadm.models import (Anexado, DocumentoAdministrativo, Protocolo,
StatusTramitacaoAdministrativo,
DocumentoAdministrativo, Anexado)
from sapl.sessao.models import (PresencaOrdemDia, SessaoPlenaria,
SessaoPlenariaPresenca, Bancada, TipoSessaoPlenaria)
from sapl.utils import (parlamentares_ativos, gerar_hash_arquivo, SEPARADOR_HASH_PROPOSICAO,
show_results_filter_set, mail_service_configured,
intervalos_tem_intersecao, remover_acentos)
TipoDocumentoAdministrativo)
from sapl.sessao.models import (Bancada, PresencaOrdemDia, SessaoPlenaria,
SessaoPlenariaPresenca, TipoSessaoPlenaria)
from sapl.utils import (gerar_hash_arquivo, intervalos_tem_intersecao,
mail_service_configured, parlamentares_ativos,
SEPARADOR_HASH_PROPOSICAO, show_results_filter_set)
from .forms import (AlterarSenhaForm, CasaLegislativaForm,
ConfiguracoesAppForm, RelatorioAtasFilterSet,
RelatorioAudienciaFilterSet,
@ -68,26 +71,6 @@ from .forms import (AlterarSenhaForm, CasaLegislativaForm,
from .models import AppConfig, CasaLegislativa
def filtra_url_materias_em_tramitacao(data, qs, campo_url, local_ou_status):
id_materias = []
filtro_url = data[campo_url]
if local_ou_status == 'local':
for item in qs:
f = item.tramitacao_set.order_by('-id').first()
if f:
if f.unidade_tramitacao_destino_id == int(filtro_url):
id_materias.append(item.id)
elif local_ou_status == 'status':
for item in qs:
f = item.tramitacao_set.order_by('-id').first()
if f:
if f.status_id == int(filtro_url):
id_materias.append(item.id)
return qs.filter(em_tramitacao=True, id__in=id_materias)
def get_casalegislativa():
return CasaLegislativa.objects.first()
@ -711,7 +694,7 @@ class RelatorioAudienciaView(FilterView):
class RelatorioMateriasTramitacaoView(FilterView):
model = MateriaLegislativa
model = MateriaEmTramitacao
filterset_class = RelatorioMateriasTramitacaoFilterSet
template_name = 'base/RelatorioMateriasPorTramitacao_filter.html'
@ -725,35 +708,68 @@ class RelatorioMateriasTramitacaoView(FilterView):
if data['data']:
qs = data['queryset']
if data['data']['tramitacao__unidade_tramitacao_destino']:
qs = filtra_url_materias_em_tramitacao(
data['data'], qs, 'tramitacao__unidade_tramitacao_destino', 'local')
if data['data']['tramitacao__status']:
qs = filtra_url_materias_em_tramitacao(
data['data'], qs, 'tramitacao__status', 'status')
if data['data']['tipo']:
ultimas_tramitacoes = Tramitacao.objects.filter(
materia__ano=data['data']['ano'],
materia__tipo=data['data']['tipo']
).values(
'materia__ano', 'materia__numero'
).annotate(id=Max('id'))
ano_materia = data['data']['materia__ano']
tipo_materia = data['data']['materia__tipo']
unidade_tramitacao_destino = data['data']['tramitacao__unidade_tramitacao_destino']
status_tramitacao = data['data']['tramitacao__status']
if tipo_materia:
if unidade_tramitacao_destino:
if status_tramitacao:
qs = qs.filter(
materia__ano=ano_materia,
materia__tipo=tipo_materia,
tramitacao__unidade_tramitacao_destino=unidade_tramitacao_destino,
tramitacao__status=status_tramitacao
)
else:
qs = qs.filter(
materia__ano=ano_materia,
materia__tipo=tipo_materia,
tramitacao__unidade_tramitacao_destino=unidade_tramitacao_destino
)
else:
if status_tramitacao:
qs = qs.filter(
materia__ano=ano_materia,
materia__tipo=tipo_materia,
tramitacao__status=status_tramitacao
)
else:
ultimas_tramitacoes = Tramitacao.objects.filter(
materia__ano=data['data']['ano']
).values(
'materia__ano', 'materia__numero'
).annotate(id=Max('id'))
ultimas_tramitacoes_ids = [i['id'] for i in ultimas_tramitacoes]
qs = qs.filter(tramitacao__id__in=ultimas_tramitacoes_ids)
qs = qs.filter(
materia__ano=ano_materia,
materia__tipo=tipo_materia
)
else:
if unidade_tramitacao_destino:
if status_tramitacao:
qs = qs.filter(
materia__ano=ano_materia,
tramitacao__unidade_tramitacao_destino=unidade_tramitacao_destino,
tramitacao__status=status_tramitacao
)
else:
qs = qs.filter(
materia__ano=ano_materia,
tramitacao__unidade_tramitacao_destino=unidade_tramitacao_destino,
)
else:
if status_tramitacao:
qs = qs.filter(
materia__ano=ano_materia,
tramitacao__status=status_tramitacao
)
else:
qs = qs.filter(
materia__ano=ano_materia,
)
data['queryset'] = qs
qtdes = { tipo:0 for tipo in TipoMateriaLegislativa.objects.all()}
qtdes = { tipo:0 for tipo in TipoMateriaLegislativa.objects.all() }
for i in qs:
qtdes[i.tipo] += 1
qtdes[i.materia.tipo] += 1
# remove as entradas de valor igual a zero
qtdes = {k:v for k,v in qtdes.items() if v > 0}
self.total_resultados_tipos = qtdes
@ -762,27 +778,30 @@ class RelatorioMateriasTramitacaoView(FilterView):
def get_queryset(self):
qs = super().get_queryset()
qs = qs.select_related('tipo').filter(
em_tramitacao=True).exclude(
qs = qs.select_related('materia__tipo').filter(
materia__em_tramitacao=True
).exclude(
tramitacao__status__indicador='F'
).order_by('-ano', '-numero')
).order_by('-materia__ano', '-materia__numero')
return qs
def get_context_data(self, **kwargs):
context = super(RelatorioMateriasTramitacaoView,
self).get_context_data(**kwargs)
context = super(
RelatorioMateriasTramitacaoView, self
).get_context_data(**kwargs)
context['title'] = _('Matérias em Tramitação')
if not self.filterset.form.is_valid():
return context
qr = self.request.GET.copy()
context['qtdes'] = self.total_resultados_tipos
context['ano'] = (self.request.GET['ano'])
context['ano'] = (self.request.GET['materia__ano'])
if self.request.GET['tipo']:
tipo = self.request.GET['tipo']
if self.request.GET['materia__tipo']:
tipo = self.request.GET['materia__tipo']
context['tipo'] = (
str(TipoMateriaLegislativa.objects.get(id=tipo))
)

14
sapl/templates/base/RelatorioMateriasPorTramitacao_filter.html

@ -44,13 +44,15 @@
</tr>
</thead>
<tbody>
{% for materia in object_list %}
{% for materia_em_tramitacao in object_list %}
<tr>
<td><a href="{% url 'sapl.materia:materialegislativa_detail' materia.pk %}">
{{materia.tipo.descricao}} {{materia.numero}}/{{materia.ano}}
</a></td>
<td>{{materia.tramitacao_set.last.unidade_tramitacao_destino}}</td>
<td>{{materia.tramitacao_set.last.status}}</td>
<td>
<a href="{% url 'sapl.materia:materialegislativa_detail' materia_em_tramitacao.materia.pk %}">
{{ materia_em_tramitacao.materia.tipo.descricao }} {{ materia_em_tramitacao.materia.numero }}/{{ materia_em_tramitacao.materia.ano }}
</a>
</td>
<td>{{ materia_em_tramitacao.materia.tramitacao_set.last.unidade_tramitacao_destino }}</td>
<td>{{ materia_em_tramitacao.materia.tramitacao_set.last.status }}</td>
</tr>
{% endfor %}
</tbody>

Loading…
Cancel
Save