|
|
|
@ -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: |
|
|
|
|