Browse Source

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

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

* WIP

* WIP

* WIP

* WIP
pull/445/head
Edward 9 years ago
parent
commit
fd304d0409
  1. 104
      parlamentares/forms.py
  2. 2
      protocoloadm/views.py

104
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,60 @@ 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]
# 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 filiacao ainda em aberto, preenche uma desfiliacao
desfiliação não podem estar no intervalo \ # ficticia 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 # finalmente verifica intersecao
data_filiacao <= data_init and if intervalos_tem_intersecao(data_inicio, data_fim,
data_desfiliacao >= 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 +126,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])

2
protocoloadm/views.py

@ -4,7 +4,7 @@ from datetime import date, datetime
from braces.views import FormValidMessageMixin from braces.views import FormValidMessageMixin
from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ObjectDoesNotExist
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.db.models import Q, Max from django.db.models import Max, Q
from django.http import HttpResponse, HttpResponseRedirect from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import redirect from django.shortcuts import redirect
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _

Loading…
Cancel
Save