From d0212e3aa5ca9b15cd9b362045013a1fbda7952c Mon Sep 17 00:00:00 2001 From: ulyssesBML Date: Fri, 17 Jan 2020 12:15:15 -0300 Subject: [PATCH] Corrigindo erros lista parlamentares Fix #3078 --- sapl/api/serializers.py | 62 ++++++++++++++++--- sapl/api/views.py | 15 ++++- .../parlamentares/parlamentares_list.html | 4 +- 3 files changed, 69 insertions(+), 12 deletions(-) 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?