diff --git a/sapl/api/serializers.py b/sapl/api/serializers.py
index 143948f16..726b1679a 100644
--- a/sapl/api/serializers.py
+++ b/sapl/api/serializers.py
@@ -1,10 +1,14 @@
+import logging
from django.conf import settings
+from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist
+from django.db.models import F, Q
from rest_framework import serializers
from rest_framework.relations import StringRelatedField
from sapl.parlamentares.models import Parlamentar, Mandato, Filiacao, Legislatura
from sapl.base.models import Autor, CasaLegislativa
from sapl.utils import filiacao_data
+
class IntRelatedField(StringRelatedField):
def to_representation(self, value):
return int(value)
@@ -60,24 +64,68 @@ class CasaLegislativaSerializer(serializers.ModelSerializer):
class ParlamentarResumeSerializer(serializers.ModelSerializer):
titular = serializers.SerializerMethodField('check_titular')
partido = serializers.SerializerMethodField('check_partido')
+ logger = logging.getLogger(__name__)
+
def check_titular(self,obj):
is_titular = None
if Legislatura.objects.exists():
- legislatura = self.context.get('legislatura')
+ legislatura = Legislatura.objects.get(id=self.context.get('legislatura'))
if not legislatura:
legislatura = Legislatura.objects.first()
- mandato = Mandato.objects.filter(legislatura=legislatura,parlamentar=obj).first()
+ mandato = Mandato.objects.filter(
+ parlamentar=obj,
+ data_inicio_mandato__gte=legislatura.data_inicio,
+ data_fim_mandato__lte=legislatura.data_fim
+ ).order_by('-data_inicio_mandato').first()
+
is_titular = mandato.titular if mandato else False
return is_titular
def check_partido(self,obj):
- legislatura_id = self.context.get('legislatura')
- if not legislatura_id:
- legislatura = Legislatura.objects.first()
+ # Coloca a filiação atual ao invés da última
+ # As condições para mostrar a filiação são:
+ # A data de filiacao deve ser menor que a data de fim
+ # da legislatura e data de desfiliação deve nula, ou maior,
+ # ou igual a data de fim da legislatura
+
+ username = self.context['request'].user.username
+ if Legislatura.objects.exists():
+ legislatura = Legislatura.objects.get(id=self.context.get('legislatura'))
+ if not legislatura:
+ legislatura = Legislatura.objects.first()
+
+ try:
+ self.logger.debug("user=" + username + ". Tentando obter filiação do parlamentar com (data<={} e data_desfiliacao>={}) "
+ "ou (data<={} e data_desfiliacao=Null))."
+ .format(legislatura.data_fim, legislatura.data_fim, legislatura.data_fim))
+ filiacao = obj.filiacao_set.get(Q(
+ data__lte=legislatura.data_fim,
+ data_desfiliacao__gte=legislatura.data_fim) | Q(
+ data__lte=legislatura.data_fim,
+ data_desfiliacao__isnull=True))
+
+ # Caso não exista filiação com essas condições
+ except ObjectDoesNotExist:
+ self.logger.error("user=" + username + ". Parlamentar com (data<={} e data_desfiliacao>={}) "
+ "ou (data<={} e data_desfiliacao=Null)) não possui filiação."
+ .format(legislatura.data_fim, legislatura.data_fim, legislatura.data_fim))
+ filiacao = 'Não possui filiação'
+
+ # Caso exista mais de uma filiação nesse intervalo
+ # Entretanto, NÃO DEVE OCORRER
+ except MultipleObjectsReturned:
+ self.logger.error("user=" + username + ". O Parlamentar com (data<={} e data_desfiliacao>={}) "
+ "ou (data<={} e data_desfiliacao=Null)) possui duas filiações conflitantes"
+ .format(legislatura.data_fim, legislatura.data_fim, legislatura.data_fim))
+ filiacao = 'O Parlamentar possui duas filiações conflitantes'
+
+ # Caso encontre UMA filiação nessas condições
else:
- legislatura = Legislatura.objects.get(id=legislatura_id)
- filiacao = filiacao_data(obj, legislatura.data_inicio, legislatura.data_fim)
+ self.logger.debug("user=" + username +
+ ". Filiação encontrada com sucesso.")
+ filiacao = filiacao.partido.sigla
+
return filiacao
class Meta:
diff --git a/sapl/api/views.py b/sapl/api/views.py
index 92af46e00..6e7838ea1 100644
--- a/sapl/api/views.py
+++ b/sapl/api/views.py
@@ -31,7 +31,7 @@ from sapl.protocoloadm.models import DocumentoAdministrativo,\
DocumentoAcessorioAdministrativo, TramitacaoAdministrativo, Anexado
from sapl.sessao.models import SessaoPlenaria, ExpedienteSessao
from sapl.utils import models_with_gr_for_model, choice_anos_com_sessaoplenaria
-from sapl.parlamentares.models import Mandato, Parlamentar
+from sapl.parlamentares.models import Mandato, Parlamentar, Legislatura
class BusinessRulesNotImplementedMixin:
@@ -350,8 +350,17 @@ class _ParlamentarViewSet:
"""
Pega lista de parlamentares pelo id da legislatura.
"""
- parlamentares = Parlamentar.objects.filter(mandato__legislatura=kwargs['pk'])
- serializer_class = ParlamentarResumeSerializer(parlamentares,many=True,context={'legislatura':kwargs['pk']})
+ legislatura = Legislatura.objects.get(pk=kwargs['pk'])
+ mandatos = Mandato.objects.filter(
+ legislatura=legislatura,
+ data_inicio_mandato__gte=legislatura.data_inicio,
+ data_fim_mandato__lte=legislatura.data_fim
+ ).order_by('-data_inicio_mandato')
+
+ parlamentares = Parlamentar.objects.filter(mandato__in=mandatos).distinct()
+ serializer_class = ParlamentarResumeSerializer(parlamentares,
+ many=True,
+ context={'request':request,'legislatura':kwargs['pk']})
return Response(serializer_class.data)
@action(detail=False,methods=['GET'])
diff --git a/sapl/templates/parlamentares/parlamentares_list.html b/sapl/templates/parlamentares/parlamentares_list.html
index 7a8aeb304..dcc6e3112 100644
--- a/sapl/templates/parlamentares/parlamentares_list.html
+++ b/sapl/templates/parlamentares/parlamentares_list.html
@@ -50,9 +50,9 @@
Parlamentar
- Parido
+ Partido
Ativo?
- Titlar?
+ Titular?