Browse Source

Refactor validation code for Servant assignment

producao
Marcio Mazza 10 years ago
parent
commit
62e810a98d
  1. 46
      sigi/apps/servidores/forms.py
  2. 31
      sigi/apps/servidores/test_servidores_forms.py
  3. 42
      sigi/apps/utils/validators.py

46
sigi/apps/servidores/forms.py

@ -1,11 +1,17 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from collections import namedtuple
from django import forms from django import forms
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from sigi.apps.servidores.models import Ferias, Licenca, Funcao, Servidor from sigi.apps.servidores.models import Ferias, Licenca, Funcao, Servidor
from sigi.apps.utils.validators import valida_data, valida_periodo_data
def valida_data_inicial_menor_que_final(data, chave_ini, chave_fim):
if data.get(chave_ini) >= data.get(chave_fim):
raise forms.ValidationError(_(
u"A data de início deve ser menor que a data final. Verifique novamente"))
class FeriasForm(forms.ModelForm): class FeriasForm(forms.ModelForm):
class Meta: class Meta:
@ -14,9 +20,7 @@ class FeriasForm(forms.ModelForm):
def clean(self): def clean(self):
data = self.cleaned_data data = self.cleaned_data
if valida_data(data.get('inicio_ferias'), data.get('fim_ferias')): valida_data_inicial_menor_que_final(data, 'inicio_ferias', 'fim_ferias')
raise forms.ValidationError(_(u"""A data de início deve ser menor
que a data final. Verifique novamente"""))
return data return data
@ -28,12 +32,17 @@ class LicencaForm(forms.ModelForm):
def clean(self): def clean(self):
data = self.cleaned_data data = self.cleaned_data
if valida_data(data.get('inicio_licenca'), data.get('fim_licenca')): valida_data_inicial_menor_que_final(data, 'inicio_licenca', 'fim_licenca')
raise forms.ValidationError(_(u"""A data de início deve ser menor
que a data final. Verifique novamente"""))
return data return data
Periodo = namedtuple('Periodo', ['ini', 'fim'])
def periodos_se_sobrepoe(periodo1, periodo2):
return not (periodo1.fim < periodo2.ini or periodo2.fim < periodo1.ini)
class FuncaoForm(forms.ModelForm): class FuncaoForm(forms.ModelForm):
class Meta: class Meta:
@ -42,24 +51,15 @@ class FuncaoForm(forms.ModelForm):
def clean(self): def clean(self):
data = self.cleaned_data data = self.cleaned_data
if valida_data(data.get('inicio_funcao'), data.get('fim_funcao')): valida_data_inicial_menor_que_final(data, 'inicio_funcao', 'fim_funcao')
raise forms.ValidationError(_(u"""A data de início deve ser menor
que a data final. Verifique
novamente"""))
# Verifica na função anterior, se o seu período é igual # Verifica na função anterior, se o seu período é igual
# ou está entre o período da função atual. # ou está entre o período da função atual.
servidor = Servidor.objects.get(nome_completo=data.get('servidor')) servidor = Servidor.objects.get(nome_completo=data.get('servidor'))
if len(servidor.funcao_set.all()): for funcao in servidor.funcao_set.all():
if len(servidor.funcao_set.all()) > 1: if periodos_se_sobrepoe(
funcao_anterior = servidor.funcao_set.all()[1] Periodo(funcao.inicio_funcao, funcao.fim_funcao),
elif len(servidor.funcao_set.all()) == 1: Periodo(data.get('inicio_funcao'), data.get('fim_funcao'))):
funcao_anterior = servidor.funcao_set.all()[0] raise forms.ValidationError(_(
u"Este período coincide com o de outra função exercida."))
if valida_periodo_data(funcao_anterior.inicio_funcao,
funcao_anterior.fim_funcao, data.get('inicio_funcao'),
data.get('fim_funcao')):
raise forms.ValidationError(_(u"""Você não pode exercer
uma função no mesmo período que a anterior, como também,
não pode ser entre o período da mesma."""))
return data return data

31
sigi/apps/servidores/test_servidores_forms.py

@ -0,0 +1,31 @@
# -*- coding: utf-8 -*-
from django import forms
import pytest
from datetime import date
from sigi.apps.servidores.forms import valida_data_inicial_menor_que_final, Periodo, periodos_se_sobrepoe
@pytest.mark.parametrize('data', [
dict(ini=1, fim=2),
pytest.mark.xfail(raises=forms.ValidationError)(dict(ini=2, fim=1)),
pytest.mark.xfail(raises=forms.ValidationError)(dict(ini=1, fim=1)),
])
def test_valida_data_inicial_menor_que_final(data):
valida_data_inicial_menor_que_final(data, 'ini', 'fim')
periodos = [
[Periodo(date(2000, 10, 1), date(2001, 1, 1)), Periodo(date(2001, 1, 1), date(2002, 2, 2)), True], # um dia de interseção
[Periodo(date(2000, 10, 1), date(2001, 1, 1)), Periodo(date(2001, 1, 2), date(2002, 2, 2)), False], # exatamente um dia após
[Periodo(date(2000, 10, 1), date(2001, 1, 1)), Periodo(date(2000, 12, 2), date(2002, 2, 2)), True],
[Periodo(date(2000, 10, 1), date(2001, 1, 1)), Periodo(date(2014, 1, 1), date(2014, 2, 2)), False],
]
# para testar que a ordem dos parametros nao importa
periodos_trocados = [[b, a, res] for [a, b, res] in periodos]
@pytest.mark.parametrize('periodo1, periodo2, resultado', periodos + periodos_trocados)
def test_periodos_se_sobrepoe(periodo1, periodo2, resultado):
assert periodos_se_sobrepoe(periodo1, periodo2) == resultado

42
sigi/apps/utils/validators.py

@ -1,42 +0,0 @@
# -*- coding: utf-8 -*-
def valida_data(data_inicio, data_final):
"""Função responsável por validar se o intervalo das
datas estão erradas, ou seja, se a data de início está
maior ou igual a data final.
Caso seja maior ou igual retornará ``True``, caso contrário
retornará ``False``.
"""
if data_inicio >= data_final:
return True
else:
return False
def valida_periodo_data(di01, df01, di02, df02):
"""Função responsável por validar dois períodos de datas.
Isso é usado para verificar se determinado servidor exerceu
mais de uma função dentro de determinados períodos descritos
abaixo:
1 - A segunda função não pode ter exercido ao mesmo tempo que
a primeira função. Exemplo:
Primeiro Função: 01/05/2011 -- 01/11/2011
Segundo Função: 01/05/2011 -- 01/11/2011
2 - A segunda função não pode ter exercido, dentro do período
da primeira função. Exemplo:
Primeira Função: 01/05/2011 -- 01/11/2011
Segunda Função: 02/05/2011 -- 30/10/2011
"""
# Verificando a primeira situação
if di01 == di02 and df01 == df02:
return True
elif ((di01 >= di02) or (di02 <= df01)) and df01 <= df02:
return True
else:
return False
Loading…
Cancel
Save