mirror of https://github.com/interlegis/sapl.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
137 lines
4.9 KiB
137 lines
4.9 KiB
from datetime import date
|
|
|
|
from django import forms
|
|
from django.core.exceptions import ValidationError
|
|
from django.db import transaction
|
|
from django.forms import ModelForm
|
|
from django.utils.translation import ugettext_lazy as _
|
|
from floppyforms.widgets import ClearableFileInput
|
|
|
|
import sapl
|
|
from sapl.utils import intervalos_tem_intersecao
|
|
|
|
from .models import Filiacao, Legislatura, Mandato, Parlamentar
|
|
|
|
|
|
class ImageThumbnailFileInput(ClearableFileInput):
|
|
template_name = 'floppyforms/image_thumbnail.html'
|
|
|
|
|
|
class ParlamentarForm(ModelForm):
|
|
|
|
class Meta:
|
|
model = Parlamentar
|
|
exclude = []
|
|
widgets = {'fotografia': sapl.utils.ImageThumbnailFileInput,
|
|
'biografia': forms.Textarea(
|
|
attrs={'id': 'texto-rico'})}
|
|
|
|
|
|
class ParlamentarCreateForm(ParlamentarForm):
|
|
|
|
legislatura = forms.ModelChoiceField(
|
|
label=_('Legislatura'),
|
|
required=True,
|
|
queryset=Legislatura.objects.all().order_by('-data_inicio'),
|
|
empty_label='----------',
|
|
)
|
|
|
|
data_expedicao_diploma = forms.DateField(
|
|
label=_('Expedição do Diploma'),
|
|
required=True,
|
|
)
|
|
|
|
@transaction.atomic
|
|
def save(self, commit=True):
|
|
parlamentar = super(ParlamentarCreateForm, self).save(commit)
|
|
legislatura = self.cleaned_data['legislatura']
|
|
Mandato.objects.create(
|
|
parlamentar=parlamentar,
|
|
legislatura=legislatura,
|
|
data_fim_mandato=legislatura.data_fim,
|
|
data_expedicao_diploma=self.cleaned_data['data_expedicao_diploma'])
|
|
return parlamentar
|
|
|
|
|
|
def validar_datas(data_filiacao, data_desfiliacao, parlamentar, filiacao):
|
|
|
|
# Verifica se data de desfiliacao é anterior a data de filiacao
|
|
if data_desfiliacao and data_desfiliacao < data_filiacao:
|
|
error_msg = _("A data de desfiliação não pode anterior \
|
|
à data de filiação")
|
|
return [False, error_msg]
|
|
|
|
filiacao_atual_id = filiacao.pk
|
|
# recupera filiacoes em ordem crescente de data
|
|
todas_filiacoes = parlamentar.filiacao_set.all().order_by('data')
|
|
filiacoes_id = [parlamentar.pk for parlamentar in todas_filiacoes]
|
|
|
|
# Novo registro inserido com filiacoes ja existentes
|
|
if filiacao_atual_id not in filiacoes_id and len(filiacoes_id) > 0:
|
|
ultima_filiacao = todas_filiacoes.last()
|
|
# Se ultima filiacao aberta e insercao posterior a esta filiacao
|
|
if (not ultima_filiacao.data_desfiliacao and
|
|
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
|
|
for filiacoes in todas_filiacoes:
|
|
# nao comparar o registro com ele mesmo
|
|
if filiacoes.id != filiacao_atual_id:
|
|
|
|
# Se a atualizacao eh para remover a data de desfiliacao
|
|
if not data_desfiliacao:
|
|
# so permite na ultima data (ou a unica)
|
|
if filiacao_atual_id != filiacoes_id[-1]:
|
|
error_msg = _("Data de desfiliação do parlamentar não \
|
|
pode ser ausente, se existirem datas de \
|
|
filiação posteriores")
|
|
return [False, error_msg]
|
|
else:
|
|
data_inicio = filiacoes.data
|
|
data_fim = filiacoes.data_desfiliacao
|
|
|
|
# Se filiacao ainda em aberto, preenche uma desfiliacao
|
|
# ficticia para fins de checagem de interseccao
|
|
if not data_fim:
|
|
data_fim = date.today()
|
|
|
|
# finalmente verifica intersecao
|
|
if intervalos_tem_intersecao(data_inicio, data_fim,
|
|
data_filiacao, data_desfiliacao):
|
|
error_msg = _("A data de filiação e \
|
|
desfiliação não podem estar no intervalo \
|
|
de outro período de filiação")
|
|
break
|
|
if error_msg:
|
|
return [False, error_msg]
|
|
|
|
return [True, '']
|
|
|
|
|
|
class FiliacaoForm(ModelForm):
|
|
|
|
class Meta:
|
|
model = Filiacao
|
|
fields = ['partido',
|
|
'data',
|
|
'data_desfiliacao']
|
|
|
|
def clean(self):
|
|
if self.errors:
|
|
return self.errors
|
|
|
|
filiacao = super(FiliacaoForm, self).save(commit=False)
|
|
validacao = validar_datas(self.cleaned_data['data'],
|
|
self.cleaned_data['data_desfiliacao'],
|
|
filiacao.parlamentar,
|
|
filiacao)
|
|
|
|
if not validacao[0]:
|
|
raise ValidationError(validacao[1])
|
|
|
|
return self.cleaned_data
|
|
|