Browse Source

Fix #1178 refatora presenca parlamentar (#1398)

* Iniciar a refatoração

* Muda a lógica de geração do relatório

* Adiciona filiações partidárias dos parlamentares no intervalo solicitado

* Resolve detalhes após code review
pull/1416/head
Eduardo Calil 8 years ago
committed by Edward
parent
commit
90f29b89b3
  1. 9
      sapl/base/templatetags/common_tags.py
  2. 93
      sapl/base/views.py
  3. 27
      sapl/parlamentares/views.py
  4. 3
      sapl/templates/base/RelatorioPresencaSessao_filter.html
  5. 2
      sapl/templates/sessao/blocos_resumo/lista_presenca.html
  6. 2
      sapl/templates/sessao/blocos_resumo/lista_presenca_ordem_dia.html
  7. 43
      sapl/utils.py

9
sapl/base/templatetags/common_tags.py

@ -182,5 +182,10 @@ def urldetail(obj):
obj._meta.app_config.name, obj._meta.model_name) obj._meta.app_config.name, obj._meta.model_name)
@register.filter @register.filter
def filiacao_epoca_filter(parlamentar, sessao): def filiacao_data_filter(parlamentar, data_inicio):
return filiacao_data(parlamentar, sessao.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])

93
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.mixins import PermissionRequiredMixin
from django.contrib.auth.models import Group from django.contrib.auth.models import Group
from django.contrib.auth.tokens import default_token_generator 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.mail import send_mail
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.db.models import Count, Q 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.crud.base import CrudAux
from sapl.materia.models import MateriaLegislativa, TipoMateriaLegislativa from sapl.materia.models import MateriaLegislativa, TipoMateriaLegislativa
from sapl.parlamentares.models import Parlamentar from sapl.parlamentares.models import Parlamentar
from sapl.sessao.models import PresencaOrdemDia, SessaoPlenaria from sapl.sessao.models import PresencaOrdemDia, SessaoPlenaria, SessaoPlenariaPresenca
from sapl.utils import sapl_logger from sapl.utils import parlamentares_ativos, sapl_logger
from .forms import (CasaLegislativaForm, ConfiguracoesAppForm, from .forms import (CasaLegislativaForm, ConfiguracoesAppForm,
RelatorioAtasFilterSet, RelatorioAtasFilterSet,
@ -209,15 +210,6 @@ class RelatorioPresencaSessaoView(FilterView):
filterset_class = RelatorioPresencaSessaoFilterSet filterset_class = RelatorioPresencaSessaoFilterSet
template_name = 'base/RelatorioPresencaSessao_filter.html' 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): def get_context_data(self, **kwargs):
context = super(RelatorioPresencaSessaoView, context = super(RelatorioPresencaSessaoView,
self).get_context_data(**kwargs) self).get_context_data(**kwargs)
@ -234,37 +226,68 @@ class RelatorioPresencaSessaoView(FilterView):
sufixo = 'sessao_plenaria__data_inicio__range' sufixo = 'sessao_plenaria__data_inicio__range'
param0 = {'%s' % sufixo: _range} param0 = {'%s' % sufixo: _range}
param1 = {'presencaordemdia__%s' % sufixo: _range}
param2 = {'sessaoplenariapresenca__%s' % sufixo: _range} # Parlamentares com Mandato no intervalo de tempo (Ativos)
parlamentares_qs = parlamentares_ativos(
pls = Parlamentar.objects.filter( _range[0], _range[1]).order_by('nome_parlamentar')
(Q(**param1) | Q(presencaordemdia__isnull=True)) & parlamentares_id = parlamentares_qs.values_list(
(Q(**param2) | Q(sessaoplenariapresenca__isnull=True)) 'id', flat=True)
).annotate(
sessao_count=Count( # Presenças de cada Parlamentar em Sessões
'sessaoplenariapresenca__sessao_plenaria', presenca_sessao = SessaoPlenariaPresenca.objects.filter(
distinct=True), parlamentar_id__in=parlamentares_id,
ordemdia_count=Count( sessao_plenaria__data_inicio__range=_range).values_list(
'presencaordemdia__sessao_plenaria', 'parlamentar_id').annotate(
distinct=True), sessao_count=Count('id'))
sessao_porc=Count(0),
ordemdia_porc=Count(0) # Presenças de cada Ordem do Dia
).exclude( presenca_ordem = PresencaOrdemDia.objects.filter(
sessao_count=0, parlamentar_id__in=parlamentares_id,
ordemdia_count=0) sessao_plenaria__data_inicio__range=_range).values_list(
'parlamentar_id').annotate(
sessao_count=Count('id'))
total_ordemdia = PresencaOrdemDia.objects.filter( total_ordemdia = PresencaOrdemDia.objects.filter(
**param0).distinct('sessao_plenaria__id').order_by( **param0).distinct('sessao_plenaria__id').order_by(
'sessao_plenaria__id').count() 'sessao_plenaria__id').count()
self.calcular_porcentagem_presenca( total_sessao = context['object_list'].count()
pls,
context['object_list'].count(), # Completa o dicionario as informacoes parlamentar/sessao/ordem
total_ordemdia) 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_ordemdia'] = total_ordemdia
context['total_sessao'] = context['object_list'].count() context['total_sessao'] = context['object_list'].count()
context['parlamentares'] = pls context['parlamentares'] = parlamentares_presencas
context['periodo'] = ( context['periodo'] = (
self.request.GET['data_inicio_0'] + self.request.GET['data_inicio_0'] +
' - ' + self.request.GET['data_inicio_1']) ' - ' + self.request.GET['data_inicio_1'])

27
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 Autoria
from sapl.materia.models import Proposicao, Relatoria from sapl.materia.models import Proposicao, Relatoria
from sapl.parlamentares.apps import AppConfig from sapl.parlamentares.apps import AppConfig
from sapl.utils import parlamentares_ativos
from .forms import (FiliacaoForm, LegislaturaCreateForm, LegislaturaUpdateForm, from .forms import (FiliacaoForm, LegislaturaCreateForm, LegislaturaUpdateForm,
MandatoForm, ParlamentarCreateForm, ParlamentarForm, MandatoForm, ParlamentarCreateForm, ParlamentarForm,
@ -235,32 +236,6 @@ def json_date_convert(date):
year=int(ano)) 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): def frente_atualiza_lista_parlamentares(request):
''' '''
:param request: recebe os parâmetros do GET da chamada Ajax :param request: recebe os parâmetros do GET da chamada Ajax

3
sapl/templates/base/RelatorioPresencaSessao_filter.html

@ -1,6 +1,7 @@
{% extends "crud/list.html" %} {% extends "crud/list.html" %}
{% load i18n %} {% load i18n %}
{% load crispy_forms_tags %} {% load crispy_forms_tags %}
{% load common_tags %}
{% block base_content %} {% block base_content %}
{% if not filter_url %} {% if not filter_url %}
@ -37,7 +38,7 @@
<tbody> <tbody>
{% for p in parlamentares %} {% for p in parlamentares %}
<tr> <tr>
<td><b>{{p}}</b> / {{p.filiacao_atual|default:"Sem Partido"}}</td> <td><b>{{p.parlamentar}}</b> / {{p.parlamentar|filiacao_intervalo_filter:date_range|default:"Sem Partido"}}</td>
<td>{{p.sessao_count}}</td> <td>{{p.sessao_count}}</td>
<td>{{p.sessao_porc}}</td> <td>{{p.sessao_porc}}</td>
<td>{{p.ordemdia_count}}</td> <td>{{p.ordemdia_count}}</td>

2
sapl/templates/sessao/blocos_resumo/lista_presenca.html

@ -4,7 +4,7 @@
<legend>Lista de Presença na Sessão</legend> <legend>Lista de Presença na Sessão</legend>
<div class="row"> <div class="row">
{% for p in presenca_sessao %} {% for p in presenca_sessao %}
<div class="col-md-12">{{p.nome_parlamentar}} / {{ p|filiacao_epoca_filter:object }}</div> <div class="col-md-12">{{p.nome_parlamentar}} / {{ p|filiacao_data_filter:object.data_inicio }}</div>
{% endfor %} {% endfor %}
</div> </div>
</fieldset> </fieldset>

2
sapl/templates/sessao/blocos_resumo/lista_presenca_ordem_dia.html

@ -4,7 +4,7 @@
<legend>Lista de Presença na Ordem do Dia</legend> <legend>Lista de Presença na Ordem do Dia</legend>
<div class="row"> <div class="row">
{% for p in presenca_ordem %} {% for p in presenca_ordem %}
<div class="col-md-12">{{p.nome_parlamentar}} / {{ p|filiacao_epoca_filter:object }}</div> <div class="col-md-12">{{p.nome_parlamentar}} / {{ p|filiacao_data_filter:object.data_inicio }}</div>
{% endfor %} {% endfor %}
</div> </div>
</fieldset> </fieldset>

43
sapl/utils.py

@ -598,19 +598,48 @@ def qs_override_django_filter(self):
return self._qs return self._qs
def filiacao_data(parlamentar, data): def filiacao_data(parlamentar, data_inicio, data_fim=None):
from sapl.parlamentares.models import Filiacao from sapl.parlamentares.models import Filiacao
filiacoes_parlamentar = Filiacao.objects.filter( filiacoes_parlamentar = Filiacao.objects.filter(
parlamentar=parlamentar) parlamentar=parlamentar)
filiacoes = filiacoes_parlamentar.filter(Q( filiacoes = filiacoes_parlamentar.filter(Q(
data__lte=data, data__lte=data_inicio,
data_desfiliacao__isnull=True) | Q( data_desfiliacao__isnull=True) | Q(
data__lte=data, data__lte=data_inicio,
data_desfiliacao__gte=data)) data_desfiliacao__gte=data_inicio))
if filiacoes: if data_fim:
return filiacoes.last().partido.sigla 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: else:
return '' 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)
Loading…
Cancel
Save