From d137da183111a22f9865255ac684437cea5dd214 Mon Sep 17 00:00:00 2001 From: Eduardo Edson Batista Cordeiro Alves Date: Thu, 8 Sep 2016 17:45:40 -0300 Subject: [PATCH] =?UTF-8?q?Muda=20query=20do=20relatorio=20de=20presen?= =?UTF-8?q?=C3=A7a?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/base/views.py | 88 ++++++++----------- .../base/RelatorioPresencaSessao_filter.html | 16 ++-- 2 files changed, 43 insertions(+), 61 deletions(-) diff --git a/sapl/base/views.py b/sapl/base/views.py index fb6b89a41..c5b41219f 100644 --- a/sapl/base/views.py +++ b/sapl/base/views.py @@ -2,6 +2,7 @@ from itertools import chain from django.contrib.auth.mixins import PermissionRequiredMixin from django.core.urlresolvers import reverse +from django.db.models import Count, Q from django.http import HttpResponseRedirect from django.utils.translation import ugettext_lazy as _ from django.views.generic.base import TemplateView @@ -35,13 +36,10 @@ class RelatorioPresencaSessaoView(FilterView): def calcular_porcentagem_presenca(self, parlamentares, total_sessao, - total_ordem): - for p in parlamentares.items(): - p[1].update({ - 'porc_sessao': round( - p[1]['qtde_sessao'] * 100 / total_sessao, 1), - 'porc_ordem': round(p[1]['qtde_ordem'] * 100 / total_ordem, 1) - }) + 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): @@ -49,53 +47,37 @@ class RelatorioPresencaSessaoView(FilterView): self).get_context_data(**kwargs) context['title'] = _('Presença dos parlamentares nas sessões') # ===================================================================== - # FIXME: Pensar em melhor forma de verificar se formulário está sendo - # submetido. if 'salvar' in self.request.GET: - qs1 = SessaoPlenariaPresenca.objects.filter( - parlamentar__ativo=True, - sessao_plenaria_id__in=context['object_list']) - qs2 = PresencaOrdemDia.objects.filter( - parlamentar__ativo=True, - sessao_plenaria_id__in=context['object_list']) - q = list(chain(list(qs1)+list(qs2))) - - parlamentares = {} - - total_sessao = SessaoPlenariaPresenca.objects.filter( - sessao_plenaria_id__in=context['object_list']) - total_sessao = len(total_sessao.order_by().values_list( - 'sessao_plenaria_id', flat=True).distinct()) - - total_ordem = PresencaOrdemDia.objects.filter( - sessao_plenaria_id__in=context['object_list']) - total_ordem = len(total_ordem.order_by().values_list( - 'sessao_plenaria_id', flat=True).distinct()) - - for i in q: - pid = i.parlamentar.id - if not pid in parlamentares: - parlamentares[pid] = { - 'nome': i.parlamentar.nome_parlamentar, - 'partido': ( - i.parlamentar.filiacao_set.first().partido.sigla - if i.parlamentar.filiacao_set.first() - else 'Sem Partido'), - 'qtde_ordem': 0, - 'qtde_sessao': 0} - if isinstance(i, SessaoPlenariaPresenca): - parlamentares[pid]['qtde_sessao'] += 1 - elif isinstance(i, PresencaOrdemDia): - parlamentares[pid]['qtde_ordem'] += 1 - - self.calcular_porcentagem_presenca(parlamentares, - total_sessao, - total_ordem) - sorted(parlamentares.items(), key=lambda x: x[1]['nome']) - - context['total_ordem'] = total_ordem - context['total_sessao'] = total_sessao - context['parlamentares'] = parlamentares + where = context['object_list'].query.where + _range = where.children[0].rhs + + 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(**param2)).annotate( + sessao_count=Count( + 'sessaoplenariapresenca__sessao_plenaria__data_inicio', + distinct=True), + ordemdia_count=Count( + 'presencaordemdia__sessao_plenaria__data_inicio', + distinct=True), + sessao_porc=Count(0), + ordemdia_porc=Count(0)) + + total_ordemdia = OrdemDia.objects.order_by( + 'sessao_plenaria').filter(**param0).distinct( + 'sessao_plenaria').count() + + self.calcular_porcentagem_presenca(pls, + context['object_list'].count(), + total_ordemdia) + + context['total_ordemdia'] = total_ordemdia + context['total_sessao'] = context['object_list'].count() + context['parlamentares'] = pls context['periodo'] = (self.request.GET['data_inicio_0'] + ' - ' + self.request.GET['data_inicio_1']) # ===================================================================== diff --git a/sapl/templates/base/RelatorioPresencaSessao_filter.html b/sapl/templates/base/RelatorioPresencaSessao_filter.html index 71377846c..8aeae7aa6 100644 --- a/sapl/templates/base/RelatorioPresencaSessao_filter.html +++ b/sapl/templates/base/RelatorioPresencaSessao_filter.html @@ -19,11 +19,11 @@



PERÍODO: {{periodo}}
- TOTAIS NO PERÍODO - SESSÕES: {{total_sessao}} - ORDENS DO DIA: {{total_ordem}} + TOTAIS NO PERÍODO - SESSÕES: {{total_sessao}} - ORDENS DO DIA: {{total_ordemdia}} - + @@ -35,13 +35,13 @@ - {% for pid, p in parlamentares.items %} + {% for p in parlamentares %} - - - - - + + + + + {% endfor %}
Nome Parlamentar | PartidoNome Parlamentar / Partido Sessão Ordem do Dia
{{p.nome}} | {{p.partido}}{{p.qtde_sessao}}{{p.porc_sessao}}{{p.qtde_ordem}}{{p.porc_ordem}}{{p}} / {{p.filiacao_set.first.partido.sigla|default:"Sem Partido"}}{{p.sessao_count}}{{p.sessao_porc}}{{p.ordemdia_count}}{{p.ordemdia_porc}}