diff --git a/parlamentares/views.py b/parlamentares/views.py index 1f7e9ff14..7b356deb6 100644 --- a/parlamentares/views.py +++ b/parlamentares/views.py @@ -11,6 +11,7 @@ from django.utils.safestring import mark_safe from django.utils.translation import ugettext_lazy as _ from django.views.generic.edit import FormMixin from vanilla import GenericView +from django.core.exceptions import ObjectDoesNotExist import sapl from sapl.crud import build_crud @@ -780,6 +781,17 @@ class FiliacaoView(FormMixin, GenericView): 'form': form, 'legislatura_id': parlamentar.mandato_set.last().legislatura.id}) + # Função usada para todos os caso de erro na filiação + def error_message(self, parlamentar, form, mensagem): + filiacoes = Filiacao.objects.filter(parlamentar=parlamentar) + return self.render_to_response( + {'parlamentar': parlamentar, + 'filiacoes': filiacoes, + 'form': form, + 'legislatura_id': parlamentar.mandato_set.last( + ).legislatura.id, + 'mensagem_erro': mensagem}) + def post(self, request, *args, **kwargs): form = FiliacaoForm(request.POST) @@ -796,40 +808,51 @@ class FiliacaoView(FormMixin, GenericView): parlamentar=parlamentar) candidato_nao_desfiliou = Filiacao.objects.filter( - parlamentar=parlamentar, - data_desfiliacao=None) + parlamentar=parlamentar, + data_desfiliacao=None) + # Vê se o candidato já se filiou alguma vez a algum partido if not candidato_filiado: filiacao = form.save(commit=False) filiacao.parlamentar = parlamentar filiacao.save() return self.form_valid(form) else: - + # Dá erro caso não tenha se desfiliado do anterior if candidato_nao_desfiliou: - filiacoes = Filiacao.objects.filter( - parlamentar=parlamentar) - return self.render_to_response( - {'parlamentar': parlamentar, - 'filiacoes': filiacoes, - 'form': form, - 'legislatura_id': parlamentar.mandato_set.last( - ).legislatura.id, - 'mensagem_erro': "Você não pode se filiar a algum partido\ - sem antes se desfiliar do partido anterior"}) + mensagem = "Você não pode se filiar a algum partido\ + sem antes se desfiliar do partido anterior" + return self.error_message(parlamentar, form, mensagem) + # Dá erro caso a data de desfiliação seja anterior a de + # filiação if data_desfiliacao and data_desfiliacao < data_filiacao: - filiacoes = Filiacao.objects.filter( - parlamentar=parlamentar) - return self.render_to_response( - {'parlamentar': parlamentar, - 'filiacoes': filiacoes, - 'form': form, - 'legislatura_id': parlamentar.mandato_set.last( - ).legislatura.id, - 'mensagem_erro': "A data de filiação não pode\ - anterior à data de desfiliação"}) - + mensagem = "A data de filiação não pode\ + anterior à data de desfiliação" + return self.error_message(parlamentar, form, mensagem) + + # Esse bloco garante que não haverá intersecção entre os + # períodos de filiação + todas_filiacoes = candidato_filiado + for i in range(len(todas_filiacoes)): + data_init = todas_filiacoes[i].data + data_fim = todas_filiacoes[i].data_desfiliacao + if data_filiacao >= data_init and data_filiacao < data_fim: + mensagem = "A data de filiação e\ + desfiliação não podem estar no intervalo\ + de outro período de filiação" + return self.error_message(parlamentar, form, mensagem) + + if (data_desfiliacao and + data_desfiliacao < data_fim and + data_desfiliacao > data_init): + + mensagem = "A data de filiação e\ + desfiliação não podem estar no intervalo\ + de outro período de filiação" + return self.error_message(parlamentar, form, mensagem) + + # Salva a nova filiação caso tudo esteja correto else: filiacao = form.save(commit=False) filiacao.parlamentar = parlamentar @@ -838,15 +861,8 @@ class FiliacaoView(FormMixin, GenericView): else: pid = kwargs['pk'] parlamentar = Parlamentar.objects.get(id=pid) - filiacoes = Filiacao.objects.filter( - parlamentar=parlamentar) - - return self.render_to_response( - {'parlamentar': parlamentar, - 'filiacoes': filiacoes, - 'form': form, - 'legislatura_id': parlamentar.mandato_set.last( - ).legislatura.id}) + mensagem = "" + return self.error_message(parlamentar, form, mensagem) class FiliacaoEditView(FormMixin, GenericView): @@ -866,17 +882,90 @@ class FiliacaoEditView(FormMixin, GenericView): 'legislatura_id': parlamentar.mandato_set.last( ).legislatura_id}) + def error_message(self, parlamentar, form, mensagem): + return self.render_to_response( + {'form': form, + 'parlamentar': parlamentar, + 'legislatura_id': parlamentar.mandato_set.last( + ).legislatura_id, + 'mensagem_erro': mensagem}) + def post(self, request, *args, **kwargs): filiacao = Filiacao.objects.get(id=kwargs['dk']) form = FiliacaoEditForm(request.POST, instance=filiacao) parlamentar = Parlamentar.objects.get(id=kwargs['pk']) if form.is_valid(): + + data_filiacao = form.cleaned_data['data'] + data_desfiliacao = form.cleaned_data['data_desfiliacao'] + + filiacao = form.save(commit=False) + pid = kwargs['pk'] + parlamentar = Parlamentar.objects.get(id=pid) + + candidato_filiado = Filiacao.objects.filter( + parlamentar=parlamentar) + + candidato_nao_desfiliou = Filiacao.objects.filter( + parlamentar=parlamentar, + data_desfiliacao=None) + + # Vê se o candidato já se filiou alguma vez a algum partido + if not candidato_filiado: + filiacao = form.save(commit=False) + filiacao.parlamentar = parlamentar + filiacao.save() + return self.form_valid(form) + else: + # Dá erro caso não tenha se desfiliado do anterior + if candidato_nao_desfiliou: + mensagem = "Você não pode se filiar a algum partido\ + sem antes se desfiliar do partido anterior" + return self.error_message(parlamentar, form, mensagem) + + # Dá erro caso a data de desfiliação seja anterior a de + # filiação + if data_desfiliacao and data_desfiliacao < data_filiacao: + mensagem = "A data de filiação não pode\ + anterior à data de desfiliação" + return self.error_message(parlamentar, form, mensagem) + + # Esse bloco garante que não haverá intersecção entre os + # períodos de filiação + todas_filiacoes = candidato_filiado + id_filiacao_atual = int(kwargs['dk']) + for i in range(len(todas_filiacoes)): + if todas_filiacoes[i].id != id_filiacao_atual: + data_init = todas_filiacoes[i].data + data_fim = todas_filiacoes[i].data_desfiliacao + if (data_filiacao >= data_init and + data_filiacao < data_fim): + + mensagem = "A data de filiação e\ + desfiliação não podem estar no intervalo\ + de outro período de filiação" + return self.error_message(parlamentar, + form, + mensagem) + + if (data_desfiliacao and + data_desfiliacao < data_fim and + data_desfiliacao > data_init): + + mensagem = "A data de filiação e\ + desfiliação não podem estar no intervalo\ + de outro período de filiação" + return self.error_message(parlamentar, + form, + mensagem) + if 'Salvar' in request.POST: filiacao.save() elif 'Excluir' in request.POST: filiacao.delete() return self.form_valid(form) + else: return self.render_to_response( {'form': form, diff --git a/templates/parlamentares/parlamentares_filiacao_edit.html b/templates/parlamentares/parlamentares_filiacao_edit.html index 05b37468d..cd3c46e53 100644 --- a/templates/parlamentares/parlamentares_filiacao_edit.html +++ b/templates/parlamentares/parlamentares_filiacao_edit.html @@ -16,6 +16,8 @@ {% endblock %} {% block detail_content %} +{% if mensagem_erro %}
{{ mensagem_erro }}
{% endif %} + {% crispy form %} {% endblock detail_content %}