diff --git a/sapl/audiencia/forms.py b/sapl/audiencia/forms.py index 9312a237b..9f55d3e6d 100644 --- a/sapl/audiencia/forms.py +++ b/sapl/audiencia/forms.py @@ -98,7 +98,7 @@ class AudienciaForm(forms.ModelForm): if self.cleaned_data['hora_inicio'] and self.cleaned_data['hora_fim']: if (self.cleaned_data['hora_fim'] < self.cleaned_data['hora_inicio']): - msg = _('A hora de fim não pode ser anterior a hora de ínicio') + msg = _('A hora de fim não pode ser anterior a hora de início') raise ValidationError(msg) return cleaned_data diff --git a/sapl/base/forms.py b/sapl/base/forms.py index 12cc43564..3a1b7575f 100644 --- a/sapl/base/forms.py +++ b/sapl/base/forms.py @@ -10,6 +10,7 @@ from django.contrib.auth.forms import (AuthenticationForm, PasswordResetForm, from django.contrib.auth.models import Group, User from django.core.exceptions import ValidationError from django.db import models, transaction +from django.db.models import Q from django.forms import Form, ModelForm from django.utils.translation import ugettext_lazy as _ from django.utils.translation import string_concat @@ -170,6 +171,52 @@ class SessaoLegislativaForm(ModelForm): data_inicio = cleaned_data['data_inicio'] data_fim = cleaned_data['data_fim'] + legislatura = cleaned_data['legislatura'] + numero = cleaned_data['numero'] + data_inicio_leg = legislatura.data_inicio + data_fim_leg = legislatura.data_fim + pk = self.initial['id'] + + # Querys para verificar se existem Sessões Legislativas no período selecionado no form + # Caso onde a data_inicio e data_fim são iguais a de alguma sessão já criada + primeiro_caso = Q(data_inicio=data_inicio, data_fim=data_fim) + # Caso onde a data_inicio está entre o início e o fim de uma Sessão já existente + segundo_caso = Q(data_inicio__lt=data_inicio, data_fim__range=(data_inicio, data_fim)) + # Caso onde a data_fim está entre o início e o fim de uma Sessão já existente + terceiro_caso = Q(data_inicio__range=(data_inicio, data_fim), data_fim__gt=data_fim) + sessoes_existentes = SessaoLegislativa.objects.filter(primeiro_caso|segundo_caso|terceiro_caso).\ + exclude(pk=pk) + + if sessoes_existentes: + raise ValidationError('Já existe registrado uma Sessão Legislativa que coincide com a data ' + 'inserida, favor verificar as Sessões existentes antes de criar uma ' + 'nova Sessão Legislativa') + + sessoes_legislativas = SessaoLegislativa.objects.filter(legislatura=legislatura).exclude(pk=pk) + + if sessoes_legislativas: + numeracoes = [n.numero for n in sessoes_legislativas] + numeracoes = sorted(numeracoes) + ult = max(numeracoes) + + else: + ult = SessaoLegislativa.objects.latest('data_fim') + ult = ult.numero + + if numero <= ult: + raise ValidationError('O número da Sessão Legislativa não pode ser menor ou igual ' + 'que o de Sessões Legislativas passadas') + + + if data_inicio < data_inicio_leg or \ + data_inicio > data_fim_leg: + raise ValidationError('A data de início da Sessão Legislativa deve estar compreendida ' + 'entre a data início e fim da Legislatura selecionada') + + if data_fim > data_fim_leg or \ + data_fim < data_inicio_leg: + raise ValidationError('A data de fim da Sessão Legislativa deve estar compreendida ' + 'entre a data início e fim da Legislatura selecionada') if data_inicio > data_fim: raise ValidationError('Data início não pode ser superior à data fim') @@ -182,6 +229,23 @@ class SessaoLegislativaForm(ModelForm): raise ValidationError('Data início de intervalo não pode ser ' 'superior à data fim de intervalo') + if data_inicio_intervalo: + if data_inicio_intervalo < data_inicio or \ + data_inicio_intervalo < data_inicio_leg or \ + data_inicio_intervalo > data_fim or \ + data_inicio_intervalo > data_inicio_leg: + raise ValidationError('A data de início do intervalo deve estar compreendida entre ' + 'as datas de início e fim tanto da Legislatura quanto da ' + 'própria Sessão Legislativa') + + if data_fim_intervalo: + if data_fim_intervalo > data_fim or \ + data_fim_intervalo > data_fim_leg or \ + data_fim_intervalo < data_inicio or \ + data_fim_intervalo < data_inicio_leg: + raise ValidationError('A data de fim do intervalo deve estar compreendida entre ' + 'as datas de início e fim tanto da Legislatura quanto da ' + 'própria Sessão Legislativa') return cleaned_data diff --git a/sapl/sessao/forms.py b/sapl/sessao/forms.py index cc68df531..34ae035f9 100644 --- a/sapl/sessao/forms.py +++ b/sapl/sessao/forms.py @@ -75,6 +75,8 @@ class SessaoPlenariaForm(ModelForm): sl = self.cleaned_data['sessao_legislativa'] leg = self.cleaned_data['legislatura'] tipo = self.cleaned_data['tipo'] + abertura = self.cleaned_data['data_inicio'] + encerramento = self.cleaned_data['data_fim'] error = ValidationError( "Número de Sessão Plenária já existente " @@ -96,6 +98,91 @@ class SessaoPlenariaForm(ModelForm): else: # create raise error + + # Condições da verificação + abertura_entre_leg = leg.data_inicio <= abertura <= leg.data_fim + abertura_entre_sl = sl.data_inicio <= abertura <= sl.data_fim + if encerramento is not None: + encerramento_entre_leg = leg.data_inicio < encerramento < leg.data_fim + encerramento_entre_sl = sl.data_inicio < encerramento < sl.data_fim + + # Verificação das datas de abertura e encerramento da Sessão + # Verificações com a data de encerramento preenchidas + if encerramento is not None: + # Verifica se a data de encerramento é anterior a data de abertura + if encerramento < abertura: + raise ValidationError("A data de encerramento não pode ser " + "anterior a data de abertura.") + # Verifica se a data de abertura está entre a data de início e fim da legislatura + if abertura_entre_leg and encerramento_entre_leg: + if abertura_entre_sl and encerramento_entre_sl: + pass + elif abertura_entre_sl and not encerramento_entre_sl: + raise ValidationError("A data de encerramento deve estar entre " + "as datas de início e fim da Sessão Legislativa.") + elif not abertura_entre_sl and encerramento_entre_sl: + raise ValidationError("A data de abertura deve estar entre as " + "datas de início e fim da Sessão Legislativa.") + elif not abertura_entre_sl and not encerramento_entre_sl: + raise ValidationError("A data de abertura e de encerramento devem estar " + "entre as datas de início e fim da Sessão Legislativa.") + elif abertura_entre_leg and not encerramento_entre_leg: + if abertura_entre_sl and encerramento_entre_sl: + raise ValidationError("A data de encerramento deve estar entre " + "as datas de início e fim da Legislatura.") + elif abertura_entre_sl and not encerramento_entre_sl: + raise ValidationError("A data de encerramento deve estar entre " + "as datas de início e fim tanto da " + "Legislatura quanto da Sessão Legislativa.") + elif not abertura_entre_sl and encerramento_entre_sl: + raise ValidationError("As datas de abertura e encerramento devem " + "estar entre as " + "datas de início e fim tanto Legislatura " + "quanto da Sessão Legislativa.") + elif not abertura_entre_sl and not encerramento_entre_sl: + raise ValidationError("As datas de abertura e encerramento devem " + "estar entre as " + "datas de início e fim tanto Legislatura " + "quanto da Sessão Legislativa.") + elif not abertura_entre_leg and not encerramento_entre_leg: + if abertura_entre_sl and encerramento_entre_sl: + raise ValidationError("As datas de abertura e encerramento devem " + "estar entre as " + "datas de início e fim da Legislatura.") + elif abertura_entre_sl and not encerramento_entre_sl: + raise ValidationError("As datas de abertura e encerramento devem " + "estar entre as " + "datas de início e fim tanto Legislatura " + "quanto da Sessão Legislativa.") + elif not abertura_entre_sl and encerramento_entre_sl: + raise ValidationError("As datas de abertura e encerramento devem " + "estar entre as " + "datas de início e fim tanto Legislatura " + "quanto da Sessão Legislativa.") + elif not abertura_entre_sl and not encerramento_entre_sl: + raise ValidationError("As datas de abertura e encerramento devem " + "estar entre as " + "datas de início e fim tanto Legislatura " + "quanto da Sessão Legislativa.") + + + # Verificações com a data de encerramento vazia + else: + if abertura_entre_leg: + if abertura_entre_sl: + pass + else: + raise ValidationError("A data de abertura da sessão deve estar " + "entre a data de início e fim da Sessão Legislativa.") + else: + if abertura_entre_sl: + raise ValidationError("A data de abertura da sessão deve estar " + "entre a data de início e fim da Legislatura.") + else: + raise ValidationError("A data de abertura da sessão deve estar " + "entre a data de início e fim tanto da " + "Legislatura quanto da Sessão Legislativa.") + return self.cleaned_data diff --git a/sapl/sessao/tests/test_sessao.py b/sapl/sessao/tests/test_sessao.py index 336c62ad0..1715cd0ae 100644 --- a/sapl/sessao/tests/test_sessao.py +++ b/sapl/sessao/tests/test_sessao.py @@ -38,7 +38,7 @@ def test_sessao_plenaria_form_valido(): 'numero': '1', 'tipo': str(tipo.pk), 'sessao_legislativa': str(sessao.pk), - 'data_inicio': '10/11/2017', + 'data_inicio': str(sessao.data_inicio), 'hora_inicio': '10:10', 'painel_aberto': False }) diff --git a/sapl/sessao/tests/test_sessao_view.py b/sapl/sessao/tests/test_sessao_view.py index 082652c19..17b77e8d8 100644 --- a/sapl/sessao/tests/test_sessao_view.py +++ b/sapl/sessao/tests/test_sessao_view.py @@ -18,7 +18,7 @@ def test_incluir_sessao_plenaria_submit(admin_client): 'numero': '1', 'tipo': str(tipo.pk), 'sessao_legislativa': str(sessao.pk), - 'data_inicio': '10/11/2017', + 'data_inicio': str(sessao.data_inicio), 'hora_inicio': '10:10' }, follow=True)