From afcc00be5253d78be0f32ee21f74f05501ce9288 Mon Sep 17 00:00:00 2001 From: Eduardo Calil Date: Thu, 10 Aug 2017 16:23:02 -0300 Subject: [PATCH] =?UTF-8?q?Iniciar=20a=20refatora=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/base/views.py | 58 +++++++++++++++++++++++++------------ sapl/parlamentares/views.py | 27 +---------------- sapl/utils.py | 30 ++++++++++++++++++- 3 files changed, 70 insertions(+), 45 deletions(-) diff --git a/sapl/base/views.py b/sapl/base/views.py index 718774d46..8aa37ecbd 100644 --- a/sapl/base/views.py +++ b/sapl/base/views.py @@ -4,6 +4,7 @@ from django.contrib.auth import get_user_model from django.contrib.auth.mixins import PermissionRequiredMixin from django.contrib.auth.models import Group from django.contrib.auth.tokens import default_token_generator +from django.core.exceptions import ObjectDoesNotExist from django.core.mail import send_mail from django.core.urlresolvers import reverse from django.db.models import Count, Q @@ -21,8 +22,8 @@ from sapl.base.models import Autor, TipoAutor from sapl.crud.base import CrudAux from sapl.materia.models import MateriaLegislativa, TipoMateriaLegislativa from sapl.parlamentares.models import Parlamentar -from sapl.sessao.models import PresencaOrdemDia, SessaoPlenaria -from sapl.utils import sapl_logger +from sapl.sessao.models import PresencaOrdemDia, SessaoPlenaria, SessaoPlenariaPresenca +from sapl.utils import parlamentares_ativos, sapl_logger from .forms import (CasaLegislativaForm, ConfiguracoesAppForm, RelatorioAtasFilterSet, @@ -237,28 +238,49 @@ class RelatorioPresencaSessaoView(FilterView): param1 = {'presencaordemdia__%s' % sufixo: _range} param2 = {'sessaoplenariapresenca__%s' % sufixo: _range} - pls = Parlamentar.objects.filter( - (Q(**param1) | Q(presencaordemdia__isnull=True)) & - (Q(**param2) | Q(sessaoplenariapresenca__isnull=True)) - ).annotate( - sessao_count=Count( - 'sessaoplenariapresenca__sessao_plenaria', - distinct=True), - ordemdia_count=Count( - 'presencaordemdia__sessao_plenaria', - distinct=True), - sessao_porc=Count(0), - ordemdia_porc=Count(0) - ).exclude( - sessao_count=0, - ordemdia_count=0) + # Parlamentares com Mandato no intervalo de tempo (Ativos) + parlamentares_qs = parlamentares_ativos( + _range[0], _range[1]).order_by('nome_parlamentar') + parlamentares_id = [p.id for p in parlamentares_qs] + + # Presenças de cada Parlamentar em Sessões + presenca_sessao = SessaoPlenariaPresenca.objects.filter( + parlamentar_id__in=parlamentares_id, + sessao_plenaria__data_inicio__range=_range).values_list( + 'parlamentar_id').annotate( + sessao_count=Count('id')) + + # Presenças de cada Ordem do Dia + presenca_ordem = PresencaOrdemDia.objects.filter( + parlamentar_id__in=parlamentares_id, + sessao_plenaria__data_inicio__range=_range).values_list( + 'parlamentar_id').annotate( + sessao_count=Count('id')) + + # Completa o dicionario as informacoes parlamentar/sessao/ordem + parlamentares_presencas = [] + for i, p in enumerate(parlamentares_qs): + parlamentares_presencas.append({ + 'parlamentar': p, + 'sessao_count': 0, + 'ordemdia_count': 0, + 'sessao_porc': 0, + 'ordemdia_porc': 0 + }) + try: + parlamentares_presencas[i].update({ + 'sessao_count': presenca_sessao.get(parlamentar_id=p.id)[1], + 'ordemdia_count': presenca_ordem.get(parlamentar_id=p.id)[1] + }) + except ObjectDoesNotExist: + pass total_ordemdia = PresencaOrdemDia.objects.filter( **param0).distinct('sessao_plenaria__id').order_by( 'sessao_plenaria__id').count() self.calcular_porcentagem_presenca( - pls, + parlamentares_presencas, context['object_list'].count(), total_ordemdia) diff --git a/sapl/parlamentares/views.py b/sapl/parlamentares/views.py index 309c8b3cd..d4affb7ff 100644 --- a/sapl/parlamentares/views.py +++ b/sapl/parlamentares/views.py @@ -27,6 +27,7 @@ from .models import (CargoMesa, Coligacao, ComposicaoColigacao, ComposicaoMesa, from sapl.base.models import Autor from sapl.materia.models import Autoria +from sapl.utils import parlamentares_ativos from django.contrib.contenttypes.models import ContentType from django.db.models.aggregates import Count @@ -224,32 +225,6 @@ def json_date_convert(date): year=int(ano)) -def parlamentares_ativos(data_inicio, data_fim=None): - ''' - :param data_inicio: define a data de inicial do período desejado - :param data_fim: define a data final do período desejado - :return: queryset dos parlamentares ativos naquele período - ''' - mandatos_ativos = Mandato.objects.filter(Q( - data_inicio_mandato__lte=data_inicio, - data_fim_mandato__isnull=True) | Q( - data_inicio_mandato__lte=data_inicio, - data_fim_mandato__gte=data_inicio)) - if data_fim: - mandatos_ativos = mandatos_ativos | Mandato.objects.filter( - data_inicio_mandato__gte=data_inicio, - data_inicio_mandato__lte=data_fim) - else: - mandatos_ativos = mandatos_ativos | Mandato.objects.filter( - data_inicio_mandato__gte=data_inicio) - - parlamentares_id = mandatos_ativos.values_list( - 'parlamentar_id', - flat=True).distinct('parlamentar_id') - - return Parlamentar.objects.filter(id__in=parlamentares_id) - - def frente_atualiza_lista_parlamentares(request): ''' :param request: recebe os parâmetros do GET da chamada Ajax diff --git a/sapl/utils.py b/sapl/utils.py index 5336e4c1c..394dfd689 100644 --- a/sapl/utils.py +++ b/sapl/utils.py @@ -15,6 +15,7 @@ from crispy_forms.helper import FormHelper from crispy_forms.layout import HTML, Button from django import forms from django.apps import apps +from django.db.models import Q from django.conf import settings from django.contrib import admin from django.contrib.contenttypes.fields import (GenericForeignKey, GenericRel, @@ -593,4 +594,31 @@ def qs_override_django_filter(self): self._qs = qs - return self._qs \ No newline at end of file + return self._qs + + +def parlamentares_ativos(data_inicio, data_fim=None): + from sapl.parlamentares.models import Mandato, Parlamentar + ''' + :param data_inicio: define a data de inicial do período desejado + :param data_fim: define a data final do período desejado + :return: queryset dos parlamentares ativos naquele período + ''' + mandatos_ativos = Mandato.objects.filter(Q( + data_inicio_mandato__lte=data_inicio, + data_fim_mandato__isnull=True) | Q( + data_inicio_mandato__lte=data_inicio, + data_fim_mandato__gte=data_inicio)) + if data_fim: + mandatos_ativos = mandatos_ativos | Mandato.objects.filter( + data_inicio_mandato__gte=data_inicio, + data_inicio_mandato__lte=data_fim) + else: + mandatos_ativos = mandatos_ativos | Mandato.objects.filter( + data_inicio_mandato__gte=data_inicio) + + parlamentares_id = mandatos_ativos.values_list( + 'parlamentar_id', + flat=True).distinct('parlamentar_id') + + return Parlamentar.objects.filter(id__in=parlamentares_id) \ No newline at end of file