Browse Source

Fix #402 - checagem de filiação partidária

pull/423/head
Edward Ribeiro 10 years ago
parent
commit
61feb0b09c
  1. 116
      parlamentares/forms.py

116
parlamentares/forms.py

@ -1,3 +1,5 @@
from datetime import date
from django import forms from django import forms
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.db import transaction from django.db import transaction
@ -6,6 +8,7 @@ from django.utils.translation import ugettext_lazy as _
from floppyforms.widgets import ClearableFileInput from floppyforms.widgets import ClearableFileInput
import sapl import sapl
from sapl.utils import intervalos_tem_intersecao
from .models import Filiacao, Legislatura, Mandato, Parlamentar from .models import Filiacao, Legislatura, Mandato, Parlamentar
@ -50,59 +53,72 @@ class ParlamentarCreateForm(ParlamentarForm):
return parlamentar return parlamentar
def validate(data, data_desfiliacao, parlamentar, filiacao): def validar_datas(data_filiacao, data_desfiliacao, parlamentar, filiacao):
data_filiacao = data
data_desfiliacao = data_desfiliacao
# Dá erro caso a data de desfiliação seja anterior a de filiação # Verifica se data de desfiliacao é anterior a data de filiacao
if data_desfiliacao and data_desfiliacao < data_filiacao: if data_desfiliacao and data_desfiliacao < data_filiacao:
error_msg = _("A data de desfiliação não pode anterior \ error_msg = _("A data de desfiliação não pode anterior \
à data de filiação") à data de filiação")
return [False, error_msg] return [False, error_msg]
# Esse bloco garante que não haverá intersecção entre os filiacao_atual_id = filiacao.pk
# períodos de filiação # recupera filiacoes em ordem crescente de data
id_filiacao_atual = filiacao.pk todas_filiacoes = parlamentar.filiacao_set.all().order_by('data')
todas_filiacoes = parlamentar.filiacao_set.all() filiacoes_id = [parlamentar.pk for parlamentar in todas_filiacoes]
for filiacoes in todas_filiacoes: # Novo registro inserido com filiacoes ja existentes
if (not filiacoes.data_desfiliacao and if filiacao_atual_id not in filiacoes_id and len(filiacoes_id) > 0:
filiacoes.id != id_filiacao_atual): ultima_filiacao = todas_filiacoes.last()
error_msg = _("O parlamentar não pode se filiar a algum partido \ # Se ultima filiacao aberta e insercao posterior a esta filiacao
sem antes se desfiliar do partido anterior") if (not ultima_filiacao.data_desfiliacao and
return [False, error_msg] data_filiacao >= ultima_filiacao.data):
error_msg = _("O parlamentar não pode se filiar \
a novo partido sem antes se \
desfiliar do partido anterior")
return [False, error_msg]
primeira_filiacao = todas_filiacoes.first()
# se novo registro tem data de desfiliacao aberta
# e eh anterior a primeira data de filiacao já existente.
if (not data_desfiliacao and
data_filiacao <= primeira_filiacao.data):
error_msg = _("O parlamentar não pode se filiar \
,sem uma data de desfiliação, \
a algum partido anterior")
return [False, error_msg]
# checa intervalos de interseccao
error_msg = None error_msg = None
for filiacoes in todas_filiacoes: for filiacoes in todas_filiacoes:
if filiacoes.id != id_filiacao_atual: # nao comparar o registro com ele mesmo
if filiacoes.id != filiacao_atual_id:
data_init = filiacoes.data
data_fim = filiacoes.data_desfiliacao # Se a atualizacao eh para remover a data de desfiliacao
if not data_desfiliacao:
if data_init <= data_filiacao < data_fim: # so permite na ultima data (ou a unica)
if filiacao_atual_id != filiacoes_id[-1]:
error_msg = _("A data de filiação e \ error_msg = _("Data de desfiliação do parlamentar não \
desfiliação não podem estar no intervalo \ pode ser ausente, se existirem datas de \
de outro período de filiação") filiação posteriores")
break return [False, error_msg]
else:
if (data_desfiliacao and data_inicio = filiacoes.data
data_init < data_desfiliacao < data_fim): data_fim = filiacoes.data_desfiliacao
error_msg = _("A data de filiação e \ # Se ainda desfiliado, preenche uma desfiliacao ficticia
desfiliação não podem estar no intervalo \ # para fins de checagem de interseccao
de outro período de filiação") if not data_fim:
break data_fim = date.today()
if (data_desfiliacao and
data_filiacao <= data_init and # finalmente verifica intersecao
data_desfiliacao >= data_fim): if intervalos_tem_intersecao(data_inicio, data_fim,
data_filiacao, data_desfiliacao):
error_msg = _("A data de filiação e \ error_msg = _("A data de filiação e \
desfiliação não podem estar no intervalo \ desfiliação não podem estar no intervalo \
de outro período de filiação") de outro período de filiação")
break break
if error_msg: if error_msg:
return [False, error_msg] return [False, error_msg]
@ -122,10 +138,10 @@ class FiliacaoForm(ModelForm):
return self.errors return self.errors
filiacao = super(FiliacaoForm, self).save(commit=False) filiacao = super(FiliacaoForm, self).save(commit=False)
validacao = validate(self.cleaned_data['data'], validacao = validar_datas(self.cleaned_data['data'],
self.cleaned_data['data_desfiliacao'], self.cleaned_data['data_desfiliacao'],
filiacao.parlamentar, filiacao.parlamentar,
filiacao) filiacao)
if not validacao[0]: if not validacao[0]:
raise ValidationError(validacao[1]) raise ValidationError(validacao[1])

Loading…
Cancel
Save