Browse Source

Refatora num matérias por tipo (#3121)

* Refatora num matérias por tipo

* Adaptação p/ caso que utiliza MateriaEmTramitacao

* Update sapl/utils.py

Co-Authored-By: Edward <9326037+edwardoliveira@users.noreply.github.com>

* Update sapl/utils.py

Co-Authored-By: Edward <9326037+edwardoliveira@users.noreply.github.com>

* Update utils.py

Co-authored-by: João Rodrigues <cont.joaorodrigues@gmail.com>
Co-authored-by: Edward <9326037+edwardoliveira@users.noreply.github.com>
pull/3163/head
Edward 5 years ago
committed by João Rodrigues
parent
commit
6b40220758
  1. 2
      requirements/requirements.txt
  2. 29
      sapl/base/views.py
  3. 28
      sapl/utils.py

2
requirements/requirements.txt

@ -34,7 +34,7 @@ celery-haystack==0.10
redis>=2.10.5,<2.11 redis>=2.10.5,<2.11
django-celery-results==1.0.4 django-celery-results==1.0.4
Whoosh==2.7.4 Whoosh==2.7.4
more-itertools==8.2.0
pysolr==3.6.0 pysolr==3.6.0

29
sapl/base/views.py

@ -58,9 +58,10 @@ from sapl.protocoloadm.models import (Protocolo, TipoDocumentoAdministrativo,
DocumentoAdministrativo, Anexado) DocumentoAdministrativo, Anexado)
from sapl.sessao.models import (PresencaOrdemDia, SessaoPlenaria, OrdemDia, from sapl.sessao.models import (PresencaOrdemDia, SessaoPlenaria, OrdemDia,
SessaoPlenariaPresenca, TipoSessaoPlenaria) SessaoPlenariaPresenca, TipoSessaoPlenaria)
from sapl.utils import (parlamentares_ativos, gerar_hash_arquivo, SEPARADOR_HASH_PROPOSICAO, from sapl.utils import (gerar_hash_arquivo, intervalos_tem_intersecao,
show_results_filter_set, mail_service_configured, mail_service_configured, parlamentares_ativos,
intervalos_tem_intersecao, remover_acentos) SEPARADOR_HASH_PROPOSICAO, show_results_filter_set, num_materias_por_tipo)
from .forms import (AlterarSenhaForm, CasaLegislativaForm, from .forms import (AlterarSenhaForm, CasaLegislativaForm,
ConfiguracoesAppForm, RelatorioAtasFilterSet, ConfiguracoesAppForm, RelatorioAtasFilterSet,
RelatorioAudienciaFilterSet, RelatorioAudienciaFilterSet,
@ -822,13 +823,7 @@ class RelatorioMateriasTramitacaoView(RelatorioMixin, FilterView):
data['queryset'] = qs data['queryset'] = qs
qtdes = { tipo:0 for tipo in TipoMateriaLegislativa.objects.all() } self.total_resultados_tipos = num_materias_por_tipo(qs, "materia__tipo")
for i in qs:
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
return data return data
@ -955,13 +950,8 @@ class RelatorioMateriasPorAnoAutorTipoView(RelatorioMixin, FilterView):
context['title'] = _('Matérias por Ano, Autor e Tipo') context['title'] = _('Matérias por Ano, Autor e Tipo')
if not self.filterset.form.is_valid(): if not self.filterset.form.is_valid():
return context return context
qtdes = {}
for tipo in TipoMateriaLegislativa.objects.all():
qs = context['object_list'] qs = context['object_list']
qtde = len(qs.filter(tipo_id=tipo.id)) context['qtdes'] = num_materias_por_tipo(qs)
if qtde > 0:
qtdes[tipo] = qtde
context['qtdes'] = qtdes
qr = self.request.GET.copy() qr = self.request.GET.copy()
context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else '' context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else ''
@ -997,13 +987,8 @@ class RelatorioMateriasPorAutorView(RelatorioMixin, FilterView):
if not self.filterset.form.is_valid(): if not self.filterset.form.is_valid():
return context return context
qtdes = {}
for tipo in TipoMateriaLegislativa.objects.all():
qs = context['object_list'] qs = context['object_list']
qtde = len(qs.filter(tipo_id=tipo.id)) context['qtdes'] = num_materias_por_tipo(qs)
if qtde > 0:
qtdes[tipo] = qtde
context['qtdes'] = qtdes
qr = self.request.GET.copy() qr = self.request.GET.copy()
context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else '' context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else ''

28
sapl/utils.py

@ -1,3 +1,5 @@
from itertools import groupby
import django_filters import django_filters
import hashlib import hashlib
import logging import logging
@ -44,6 +46,32 @@ from sapl.settings import MAX_DOC_UPLOAD_SIZE
SEPARADOR_HASH_PROPOSICAO = 'K' SEPARADOR_HASH_PROPOSICAO = 'K'
def num_materias_por_tipo(qs, attr_tipo='tipo'):
"""
:argument um QuerySet em MateriaLegislativa
:return um dict com o mapeamento {tipo: <quantidade de materias>},
se não existir o matéria para o tipo informado então não
haverá entrada no dicionário.
"""
qtdes = {}
if attr_tipo == 'tipo':
def sort_function(m): return m.tipo
else:
def sort_function(m): return m.materia.tipo
# select_related eh importante por questoes de desempenho, pois caso
# contrario ele realizara uma consulta ao banco para cada iteracao,
# na key do groupby (uma alternativa é só usar tipo_id, na chave).
qs2 = qs.select_related(attr_tipo).order_by(attr_tipo+'_id')
for key, values in groupby(qs2, key=sort_function):
# poderia usar qtdes[key] = len(list(values)) aqui, mas
# desse modo economiza memória RAM
qtdes[key] = sum(1 for x in values)
return qtdes
def validar_arquivo(arquivo, nome_campo): def validar_arquivo(arquivo, nome_campo):
if len(arquivo.name) > 200: if len(arquivo.name) > 200:
raise ValidationError( raise ValidationError(

Loading…
Cancel
Save