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/3125/head
Edward 5 years ago
committed by GitHub
parent
commit
e66142a2d6
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      requirements/requirements.txt
  2. 34
      sapl/base/views.py
  3. 32
      sapl/utils.py

2
requirements/requirements.txt

@ -27,7 +27,7 @@ unipath==1.1
WeasyPrint==51 WeasyPrint==51
Pillow==6.2.0 Pillow==6.2.0
gunicorn==19.9.0 gunicorn==19.9.0
more-itertools==8.2.0
pysolr==3.6.0 pysolr==3.6.0
pyoai==2.5.0 pyoai==2.5.0

34
sapl/base/views.py

@ -56,9 +56,9 @@ from sapl.protocoloadm.models import (Anexado, DocumentoAdministrativo, Protocol
TipoDocumentoAdministrativo) TipoDocumentoAdministrativo)
from sapl.sessao.models import (Bancada, PresencaOrdemDia, SessaoPlenaria, from sapl.sessao.models import (Bancada, PresencaOrdemDia, SessaoPlenaria,
SessaoPlenariaPresenca, TipoSessaoPlenaria) SessaoPlenariaPresenca, TipoSessaoPlenaria)
from sapl.utils import (gerar_hash_arquivo, intervalos_tem_intersecao, from sapl.utils import (gerar_hash_arquivo, intervalos_tem_intersecao,
mail_service_configured, parlamentares_ativos, mail_service_configured, parlamentares_ativos,
SEPARADOR_HASH_PROPOSICAO, show_results_filter_set) 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,
@ -761,13 +761,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
@ -894,13 +888,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 = {} qs = context['object_list']
for tipo in TipoMateriaLegislativa.objects.all(): context['qtdes'] = num_materias_por_tipo(qs)
qs = context['object_list']
qtde = len(qs.filter(tipo_id=tipo.id))
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 ''
@ -936,13 +925,8 @@ class RelatorioMateriasPorAutorView(RelatorioMixin, FilterView):
if not self.filterset.form.is_valid(): if not self.filterset.form.is_valid():
return context return context
qtdes = {} qs = context['object_list']
for tipo in TipoMateriaLegislativa.objects.all(): context['qtdes'] = num_materias_por_tipo(qs)
qs = context['object_list']
qtde = len(qs.filter(tipo_id=tipo.id))
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 ''
@ -960,8 +944,8 @@ class RelatorioMateriasPorAutorView(RelatorioMixin, FilterView):
else: else:
context['autor'] = '' context['autor'] = ''
context['periodo'] = ( context['periodo'] = (
self.request.GET['data_apresentacao_0'] + self.request.GET['data_apresentacao_0'] +
' - ' + self.request.GET['data_apresentacao_1']) ' - ' + self.request.GET['data_apresentacao_1'])
return context return context

32
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
@ -6,7 +8,7 @@ import os
import re import re
import unicodedata import unicodedata
from crispy_forms.layout import Button, HTML from crispy_forms.layout import Button, HTML
from easy_thumbnails import source_generators from easy_thumbnails import source_generators
from floppyforms import ClearableFileInput from floppyforms import ClearableFileInput
from functools import wraps from functools import wraps
@ -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(
@ -1032,4 +1060,4 @@ class OverwriteStorage(FileSystemStorage):
def get_available_name(self, name, max_length=None): def get_available_name(self, name, max_length=None):
if self.exists(name): if self.exists(name):
os.remove(os.path.join(settings.MEDIA_ROOT, name)) os.remove(os.path.join(settings.MEDIA_ROOT, name))
return name return name

Loading…
Cancel
Save