diff --git a/sapl/base/templatetags/common_tags.py b/sapl/base/templatetags/common_tags.py index a72eb6a54..72dab26ba 100644 --- a/sapl/base/templatetags/common_tags.py +++ b/sapl/base/templatetags/common_tags.py @@ -182,5 +182,10 @@ def urldetail(obj): obj._meta.app_config.name, obj._meta.model_name) @register.filter -def filiacao_epoca_filter(parlamentar, sessao): - return filiacao_data(parlamentar, sessao.data_inicio) +def filiacao_data_filter(parlamentar, data_inicio): + return filiacao_data(parlamentar, data_inicio) + + +@register.filter +def filiacao_intervalo_filter(parlamentar, date_range): + return filiacao_data(parlamentar, date_range[0], date_range[1]) diff --git a/sapl/base/views.py b/sapl/base/views.py index 718774d46..1450bc16b 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, @@ -209,15 +210,6 @@ class RelatorioPresencaSessaoView(FilterView): filterset_class = RelatorioPresencaSessaoFilterSet template_name = 'base/RelatorioPresencaSessao_filter.html' - def calcular_porcentagem_presenca(self, - parlamentares, - total_sessao, - total_ordemdia): - for p in parlamentares: - p.sessao_porc = round(p.sessao_count * 100 / total_sessao, 1) - p.ordemdia_porc = round(p.ordemdia_count * 100 / total_ordemdia, 1) - return parlamentares - def get_context_data(self, **kwargs): context = super(RelatorioPresencaSessaoView, self).get_context_data(**kwargs) @@ -234,37 +226,68 @@ class RelatorioPresencaSessaoView(FilterView): sufixo = 'sessao_plenaria__data_inicio__range' param0 = {'%s' % sufixo: _range} - 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 = parlamentares_qs.values_list( + 'id', flat=True) + + # 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')) total_ordemdia = PresencaOrdemDia.objects.filter( **param0).distinct('sessao_plenaria__id').order_by( 'sessao_plenaria__id').count() - self.calcular_porcentagem_presenca( - pls, - context['object_list'].count(), - total_ordemdia) - + total_sessao = context['object_list'].count() + + # Completa o dicionario as informacoes parlamentar/sessao/ordem + parlamentares_presencas = [] + for i, p in enumerate(parlamentares_qs): + parlamentares_presencas.append({ + 'parlamentar': p, + 'sessao_porc': 0, + 'ordemdia_porc': 0 + }) + try: + sessao_count = presenca_sessao.get(parlamentar_id=p.id)[1] + except ObjectDoesNotExist: + sessao_count = 0 + try: + ordemdia_count = presenca_ordem.get(parlamentar_id=p.id)[1] + except ObjectDoesNotExist: + ordemdia_count = 0 + + parlamentares_presencas[i].update({ + 'sessao_count': sessao_count, + 'ordemdia_count': ordemdia_count + }) + + if total_sessao != 0: + parlamentares_presencas[i].update( + {'sessao_porc': round( + sessao_count * 100 / total_sessao, 2)}) + if total_ordemdia != 0: + parlamentares_presencas[i].update( + {'ordemdia_porc': round( + ordemdia_count * 100 / total_ordemdia, 2)}) + + context['date_range'] = _range context['total_ordemdia'] = total_ordemdia context['total_sessao'] = context['object_list'].count() - context['parlamentares'] = pls + context['parlamentares'] = parlamentares_presencas context['periodo'] = ( self.request.GET['data_inicio_0'] + ' - ' + self.request.GET['data_inicio_1']) diff --git a/sapl/parlamentares/views.py b/sapl/parlamentares/views.py index 00c0c5aef..9af917370 100644 --- a/sapl/parlamentares/views.py +++ b/sapl/parlamentares/views.py @@ -24,6 +24,7 @@ from sapl.crud.base import (RP_CHANGE, RP_DETAIL, RP_LIST, Crud, CrudAux, from sapl.materia.models import Autoria from sapl.materia.models import Proposicao, Relatoria from sapl.parlamentares.apps import AppConfig +from sapl.utils import parlamentares_ativos from .forms import (FiliacaoForm, LegislaturaCreateForm, LegislaturaUpdateForm, MandatoForm, ParlamentarCreateForm, ParlamentarForm, @@ -235,32 +236,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/templates/base/RelatorioPresencaSessao_filter.html b/sapl/templates/base/RelatorioPresencaSessao_filter.html index c9c92328b..ea3b1fca2 100644 --- a/sapl/templates/base/RelatorioPresencaSessao_filter.html +++ b/sapl/templates/base/RelatorioPresencaSessao_filter.html @@ -1,6 +1,7 @@ {% extends "crud/list.html" %} {% load i18n %} {% load crispy_forms_tags %} +{% load common_tags %} {% block base_content %} {% if not filter_url %} @@ -37,7 +38,7 @@ {% for p in parlamentares %} - {{p}} / {{p.filiacao_atual|default:"Sem Partido"}} + {{p.parlamentar}} / {{p.parlamentar|filiacao_intervalo_filter:date_range|default:"Sem Partido"}} {{p.sessao_count}} {{p.sessao_porc}} {{p.ordemdia_count}} diff --git a/sapl/templates/sessao/blocos_resumo/lista_presenca.html b/sapl/templates/sessao/blocos_resumo/lista_presenca.html index 60b487068..56ecf9c17 100644 --- a/sapl/templates/sessao/blocos_resumo/lista_presenca.html +++ b/sapl/templates/sessao/blocos_resumo/lista_presenca.html @@ -4,7 +4,7 @@ Lista de Presença na Sessão
{% for p in presenca_sessao %} -
{{p.nome_parlamentar}} / {{ p|filiacao_epoca_filter:object }}
+
{{p.nome_parlamentar}} / {{ p|filiacao_data_filter:object.data_inicio }}
{% endfor %}
\ No newline at end of file diff --git a/sapl/templates/sessao/blocos_resumo/lista_presenca_ordem_dia.html b/sapl/templates/sessao/blocos_resumo/lista_presenca_ordem_dia.html index 9ddb8fe1f..ea58e160e 100644 --- a/sapl/templates/sessao/blocos_resumo/lista_presenca_ordem_dia.html +++ b/sapl/templates/sessao/blocos_resumo/lista_presenca_ordem_dia.html @@ -4,7 +4,7 @@ Lista de Presença na Ordem do Dia
{% for p in presenca_ordem %} -
{{p.nome_parlamentar}} / {{ p|filiacao_epoca_filter:object }}
+
{{p.nome_parlamentar}} / {{ p|filiacao_data_filter:object.data_inicio }}
{% endfor %}
\ No newline at end of file diff --git a/sapl/utils.py b/sapl/utils.py index 0c0eb1cd3..f707a2c91 100644 --- a/sapl/utils.py +++ b/sapl/utils.py @@ -598,19 +598,48 @@ def qs_override_django_filter(self): return self._qs -def filiacao_data(parlamentar, data): +def filiacao_data(parlamentar, data_inicio, data_fim=None): from sapl.parlamentares.models import Filiacao filiacoes_parlamentar = Filiacao.objects.filter( parlamentar=parlamentar) filiacoes = filiacoes_parlamentar.filter(Q( - data__lte=data, + data__lte=data_inicio, data_desfiliacao__isnull=True) | Q( - data__lte=data, - data_desfiliacao__gte=data)) + data__lte=data_inicio, + data_desfiliacao__gte=data_inicio)) - if filiacoes: - return filiacoes.last().partido.sigla + if data_fim: + filiacoes = filiacoes | filiacoes_parlamentar.filter( + data__gte=data_inicio, + data__lte=data_fim) + + return ' | '.join([f.partido.sigla for f in filiacoes]) + + +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: - return '' \ No newline at end of file + 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