From b421e52594163a0e2de71884dacd675d76fc0fdb Mon Sep 17 00:00:00 2001 From: ulyssesBML Date: Wed, 22 Jan 2020 13:46:38 -0300 Subject: [PATCH] Resolvendo problemas encomtrados no PR --- sapl/api/serializers.py | 43 ++++++++++--------- sapl/api/views.py | 27 ++++++------ sapl/parlamentares/views.py | 82 ------------------------------------- 3 files changed, 37 insertions(+), 115 deletions(-) diff --git a/sapl/api/serializers.py b/sapl/api/serializers.py index 139927b73..04e7016b4 100644 --- a/sapl/api/serializers.py +++ b/sapl/api/serializers.py @@ -69,22 +69,23 @@ class ParlamentarResumeSerializer(serializers.ModelSerializer): def check_titular(self,obj): is_titular = None - if Legislatura.objects.exists(): - try: - legislatura = Legislatura.objects.get(id=self.context.get('legislatura')) - except ObjectDoesNotExist: - legislatura = Legislatura.objects.first() - + if not Legislatura.objects.exists(): + self.logger.error("Não há legislaturas cadastradas.") + return "" - 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() - if mandato: - is_titular = 'Sim' if mandato.titular else 'Não' - else: - is_titular = '-' + try: + legislatura = Legislatura.objects.get(id=self.context.get('legislatura')) + except ObjectDoesNotExist: + legislatura = Legislatura.objects.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() + if mandato: + is_titular = 'Sim' if mandato.titular else 'Não' + else: + is_titular = '-' return is_titular def check_partido(self,obj): @@ -95,11 +96,13 @@ class ParlamentarResumeSerializer(serializers.ModelSerializer): # ou igual a data de fim da legislatura username = self.context['request'].user.username - if Legislatura.objects.exists(): - try: - legislatura = Legislatura.objects.get(id=self.context.get('legislatura')) - except ObjectDoesNotExist: - legislatura = Legislatura.objects.first() + if not Legislatura.objects.exists(): + self.logger.error("Não há legislaturas cadastradas.") + return "" + try: + legislatura = Legislatura.objects.get(id=self.context.get('legislatura')) + except ObjectDoesNotExist: + legislatura = Legislatura.objects.first() try: self.logger.debug("user=" + username + ". Tentando obter filiação do parlamentar com (data<={} e data_desfiliacao>={}) " diff --git a/sapl/api/views.py b/sapl/api/views.py index a5ce4e3ce..f07710215 100644 --- a/sapl/api/views.py +++ b/sapl/api/views.py @@ -14,6 +14,7 @@ from django_filters.rest_framework.backends import DjangoFilterBackend from django_filters.rest_framework.filterset import FilterSet from django_filters.utils import resolve_field from django.utils import timezone +from django.core.exceptions import ObjectDoesNotExist from rest_framework import serializers as rest_serializers from rest_framework.decorators import action from rest_framework.fields import SerializerMethodField @@ -351,22 +352,22 @@ class _ParlamentarViewSet: """ Pega lista de parlamentares pelo id da legislatura. """ - legislatura = Legislatura.objects.get(pk=kwargs['pk']) + try: + legislatura = Legislatura.objects.get(pk=kwargs['pk']) + except ObjectDoesNotExist: + return Response("") data_atual = timezone.now().date() + filter_params = { + 'legislatura':legislatura, + 'data_inicio_mandato__gte':legislatura.data_inicio, + 'data_fim_mandato__gte':legislatura.data_fim, + } + if legislatura.data_inicio < data_atual < legislatura.data_fim: - mandatos = Mandato.objects.filter( - legislatura=legislatura, - data_inicio_mandato__gte=legislatura.data_inicio, - data_fim_mandato__gte=data_atual, - ).order_by('-data_inicio_mandato') - else: - 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') - + filter_params['data_fim_mandato__gte'] = data_atual + + mandatos = Mandato.objects.filter(**filter_params).order_by('-data_inicio_mandato') parlamentares = Parlamentar.objects.filter(mandato__in=mandatos).distinct() serializer_class = ParlamentarResumeSerializer(parlamentares, many=True, diff --git a/sapl/parlamentares/views.py b/sapl/parlamentares/views.py index 4adf325f6..c9aa5302a 100644 --- a/sapl/parlamentares/views.py +++ b/sapl/parlamentares/views.py @@ -615,88 +615,6 @@ class ParlamentarCrud(Crud): return [_('Parlamentar'), _('Partido'), _('Ativo?'), _('Titular?')] - def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) - username = self.request.user.username - - # Adiciona legislatura para filtrar parlamentares - legislaturas = Legislatura.objects.all().order_by('-numero') - context['legislaturas'] = legislaturas - context['legislatura_id'] = self.take_legislatura_id() - - # Pega a Legislatura - legislatura = Legislatura.objects.get( - id=context['legislatura_id']) - - for row in context['rows']: - - # Pega o Parlamentar por meio da pk - parlamentar = Parlamentar.objects.get( - id=(row[0][1].split('/')[-1])) - - # Conserta a issue do github https://github.com/interlegis/sapl/issues/3028 - # Inicialmente a titularidade era conseguida através do código - # queryset.filter(mandato__legislatura_id=legislatura_id).annotate( - # mandato_titular=F('mandato__titular')).distinct() - # em get_queryset(), MAS não funciona se o parlamentar tem vários - # mandatos na mesma legislatura, sendo ao menos um titular e outro não, - # pois isso gera entradas repetidas. Este código corrige essa situação. - mandato = Mandato.objects.filter( - parlamentar=parlamentar, - data_inicio_mandato__gte=legislatura.data_inicio, - data_fim_mandato__lte=legislatura.data_fim - ).order_by('-data_inicio_mandato').first() - - if mandato: - titular = 'Sim' if mandato.titular else 'Não' - row.append((titular, None)) - else: - row.append(('-', None)) - - for index, value in enumerate(row): - row[index] += (None if index else parlamentar,) - - # 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 - 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 = parlamentar.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)) - row[1] = ('Não possui filiação', None, None) - - # 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)) - row[1] = ( - 'O Parlamentar possui duas filiações conflitantes', - None, None) - - # Caso encontre UMA filiação nessas condições - else: - self.logger.debug("user=" + username + - ". Filiação encontrada com sucesso.") - row[1] = (filiacao.partido.sigla, None, None) - - return context - - class ParlamentarMateriasView(FormView): template_name = "parlamentares/materias.html" success_url = reverse_lazy('sapl.parlamentares:parlamentar_materia')