Repository: interlegis/sapl

Issue:
Checagem de legislatura errada na edição
<!--- Forneça um resumo geral da _issue_ no título acima -->

A edição de Legislatura não está funcionando corretamente. Na hora da edição ele impede a edição se datas de início e fim de legislatura são os valores editados.

## Comportamento Esperado
Deve ser possível editar as datas da legislatura, desde que não choque com datas posteriores, desde que não tal intervalo não se choque com o de uma legislatura previamente cadastrada.

## Comportamento Atual
O sistema impede a edição de legislatura se as datas são alteradas.

## Possível Solução
O método `clean()` do formulário deve deixar editar as datas de início e fim da legislatura 

## Contexto
<!--- Como esse problema o afeta? O que você está tentando realizar? -->
<!--- Fornecer o contexto nos ajuda a encontrar uma solução que seja mais útil no mundo real -->

## Imagens do Ocorrido

![image](https://user-images.githubusercontent.com/9326037/52297706-7d7a1080-2968-11e9-92e4-280e6772c81d.png)


![image](https://user-images.githubusercontent.com/9326037/52297566-325ffd80-2968-11e9-9642-70999a4d9bec.png)


## Seu Ambiente
<!--- Inclua detalhes relevantes sobre o ambiente em que você presenciou/experienciou o bug. -->
* Versão usada (_Release_):
* Nome e versão do navegador:
* Nome e versão do Sistema Operacional (desktop ou mobile):
* Link para o seu projeto (Caso de fork deste projeto):

Checagem de legislatura errada na edição
<!--- Forneça um resumo geral da _issue_ no título acima -->

A edição de Legislatura não está funcionando corretamente. Na hora da edição ele impede a edição se datas de início e fim de legislatura são os valores editados.

## Comportamento Esperado
Deve ser possível editar as datas da legislatura, desde que não choque com datas posteriores, desde que não tal intervalo não se choque com o de uma legislatura previamente cadastrada.

## Comportamento Atual
O sistema impede a edição de legislatura se as datas são alteradas.

## Possível Solução
O método `clean()` do formulário deve deixar editar as datas de início e fim da legislatura 

## Contexto
<!--- Como esse problema o afeta? O que você está tentando realizar? -->
<!--- Fornecer o contexto nos ajuda a encontrar uma solução que seja mais útil no mundo real -->

## Imagens do Ocorrido

![image](https://user-images.githubusercontent.com/9326037/52297706-7d7a1080-2968-11e9-92e4-280e6772c81d.png)


![image](https://user-images.githubusercontent.com/9326037/52297566-325ffd80-2968-11e9-9642-70999a4d9bec.png)


## Seu Ambiente
<!--- Inclua detalhes relevantes sobre o ambiente em que você presenciou/experienciou o bug. -->
* Versão usada (_Release_):
* Nome e versão do navegador:
* Nome e versão do Sistema Operacional (desktop ou mobile):
* Link para o seu projeto (Caso de fork deste projeto):



Discussion:

Resolving patch:
diff --git a/sapl/parlamentares/forms.py b/sapl/parlamentares/forms.py
--- a/sapl/parlamentares/forms.py
+++ b/sapl/parlamentares/forms.py
@@ -167,21 +167,22 @@ def clean(self):
         pk = self.instance.pk
 
         ultima_legislatura = Legislatura.objects.filter(data_inicio__lt=data_inicio
-                                                        ).order_by('-data_inicio').first()
+                                                        ).order_by('-data_inicio').exclude(id=pk).first()
         proxima_legislatura = Legislatura.objects.filter(data_fim__gt=data_fim
-                                                         ).order_by('data_fim').first()
+                                                         ).order_by('data_fim').exclude(id=pk).first()
 
         if ultima_legislatura and ultima_legislatura.numero >= numero:
             self.logger.error("Número ({}) deve ser maior que o da legislatura anterior ({})."
                               .format(numero, ultima_legislatura.numero))
-            raise ValidationError(
-                _("Número deve ser maior que o da legislatura anterior"))
+            raise ValidationError(_("Número deve ser maior que o da legislatura anterior ({})."
+                                    .format(numero)))
         elif proxima_legislatura and proxima_legislatura.numero <= numero:
             self.logger.error("O Número ({}) deve ser menor que {}, pois existe uma "
-                              "legislatura afrente cronologicamente desta que está sendo criada!"
+                              "legislatura cronologicamente à frente desta que está sendo criada!"
                               .format(numero, proxima_legislatura.numero))
             msg_erro = "O Número deve ser menor que {}, pois existe uma " \
-                "legislatura afrente cronologicamente desta que está sendo criada!"
+
+            "legislatura cronologicamente à frente desta que está sendo criada!"
             msg_erro = msg_erro.format(proxima_legislatura.numero)
             raise ValidationError(_(msg_erro))
 


Test patch:
diff --git a/sapl/parlamentares/tests/test_parlamentares.py b/sapl/parlamentares/tests/test_parlamentares.py
--- a/sapl/parlamentares/tests/test_parlamentares.py
+++ b/sapl/parlamentares/tests/test_parlamentares.py
@@ -237,28 +237,100 @@ def test_legislatura_form_invalido():
 @pytest.mark.django_db(transaction=False)
 def test_legislatura_form_datas_invalidas():
 
-    legislatura_form = LegislaturaForm(data={'numero': '1',
+        legislatura_form = LegislaturaForm(data={'numero': '1',
+                                                'data_inicio': '2017-02-01',
+                                                'data_fim': '2021-12-31',
+                                                'data_eleicao': '2016-11-01'
+                                                })
+
+        assert legislatura_form.is_valid()
+
+        legislatura_form = LegislaturaForm(data={'numero': '1',
                                              'data_inicio': '2017-02-01',
                                              'data_fim': '2021-12-31',
                                              'data_eleicao': '2017-02-01'
                                              })
 
-    assert not legislatura_form.is_valid()
+        assert not legislatura_form.is_valid()
 
-    expected = \
+        expected = \
         _("A data início deve ser menor que a data fim "
           "e a data eleição deve ser menor que a data início")
-    assert legislatura_form.errors['__all__'] == [expected]
+        assert legislatura_form.errors['__all__'] == [expected]
 
-    legislatura_form = LegislaturaForm(data={'numero': '1',
+        legislatura_form = LegislaturaForm(data={'numero': '1',
                                              'data_inicio': '2017-02-01',
                                              'data_fim': '2017-01-01',
                                              'data_eleicao': '2016-11-01'
                                              })
 
-    assert not legislatura_form.is_valid()
+        assert not legislatura_form.is_valid()
 
-    assert legislatura_form.errors['__all__'] == [expected]
+        assert legislatura_form.errors['__all__'] == [expected]
+
+
+@pytest.mark.django_db(transaction=False)
+def test_legislatura_form_numeros_invalidos():
+
+        legislatura_form = LegislaturaForm(data={'numero': '5',
+                                                'data_inicio': '2017-02-01',
+                                                'data_fim': '2021-12-31',
+                                                'data_eleicao': '2016-11-01'
+                                                })
+
+        assert legislatura_form.is_valid()
+
+        legislatura = mommy.make(Legislatura, pk=1,
+                                 numero=5,
+                                 data_inicio='2017-02-01',
+                                 data_fim='2021-12-31',
+                                 data_eleicao='2016-11-01')
+
+        legislatura_form = LegislaturaForm(data={'numero': '6',
+                                                'data_inicio': '2014-02-01',
+                                                'data_fim': '2016-12-31',
+                                                'data_eleicao': '2013-11-01'
+                                                })
+
+        assert not legislatura_form.is_valid()
+
+        legislatura_form = LegislaturaForm(data={'numero': '4',
+                                                'data_inicio': '2022-02-01',
+                                                'data_fim': '2025-12-31',
+                                                'data_eleicao': '2021-11-01'
+                                                })
+
+        assert not legislatura_form.is_valid()
+
+        legislatura_form = LegislaturaForm(data={'numero': '5',
+                                                'data_inicio': '2014-02-01',
+                                                'data_fim': '2016-12-31',
+                                                'data_eleicao': '2013-11-01'
+                                                })
+        legislatura_form.instance = legislatura
+
+        assert legislatura_form.is_valid()
+
+        legislatura = mommy.make(Legislatura, pk=2,
+                                 numero=1,
+                                 data_inicio='2002-02-01',
+                                 data_fim='2005-12-31',
+                                 data_eleicao='2001-11-01')
+        
+        legislatura2 = mommy.make(Legislatura, pk=3,
+                                 numero=3,
+                                 data_inicio='2008-02-01',
+                                 data_fim='2011-12-31',
+                                 data_eleicao='2007-11-01')
+
+        legislatura_form = LegislaturaForm(data={'numero': '1',
+                                                'data_inicio': '2010-02-01',
+                                                'data_fim': '2013-12-31',
+                                                'data_eleicao': '2009-11-01'
+                                                })
+        legislatura_form.instance = legislatura
+
+        assert not legislatura_form.is_valid()
 
 
 @pytest.mark.django_db(transaction=False)