Repository: interlegis/sapl

Issue:
Refatorar Tramitação
Problemas observados:

1. Quando existem duas Tramitações com a mesma `data_tramitacao`, o sistema se confunde ao inicializar a **Unidade Local** da próxima Tramitação.

2. Má construção do código no `forms.py`
- Solução: Refatorar código


Discussion:
Como ainda não houve consenso sobre o problema (1), será utilizada uma solução de contorno, pela urgência de solução deste problema. O problema (2) será resolvido nesta issue também.

Resolving patch:
diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py
--- a/sapl/materia/forms.py
+++ b/sapl/materia/forms.py
@@ -215,24 +215,26 @@ class Meta:
 
     def __init__(self, *args, **kwargs):
         super(TramitacaoForm, self).__init__(*args, **kwargs)
-        self.fields['data_tramitacao'].initial = datetime.now()
+        self.fields['data_tramitacao'].initial = datetime.now().date()
 
     def clean(self):
-        super(TramitacaoForm, self).clean()
+        cleaned_data = super(TramitacaoForm, self).clean()
 
-        if 'data_encaminhamento' in self.data:
-            data_enc_form = self.cleaned_data['data_encaminhamento']
-        if 'data_fim_prazo' in self.data:
-            data_prazo_form = self.cleaned_data['data_fim_prazo']
-        if 'data_tramitacao' in self.data:
-            data_tram_form = self.cleaned_data['data_tramitacao']
+        if 'data_encaminhamento' in cleaned_data:
+            data_enc_form = cleaned_data['data_encaminhamento']
+        if 'data_fim_prazo' in cleaned_data:
+            data_prazo_form = cleaned_data['data_fim_prazo']
+        if 'data_tramitacao' in cleaned_data:
+            data_tram_form = cleaned_data['data_tramitacao']
 
         if self.errors:
             return self.errors
 
         ultima_tramitacao = Tramitacao.objects.filter(
             materia_id=self.instance.materia_id).exclude(
-            id=self.instance.id).last()
+            id=self.instance.id).order_by(
+            '-data_tramitacao',
+            '-id').first()
 
         if not self.instance.data_tramitacao:
 
@@ -243,7 +245,7 @@ def clean(self):
                             'destino  da última adicionada!')
                     raise ValidationError(msg)
 
-            if self.cleaned_data['data_tramitacao'] > datetime.now().date():
+            if cleaned_data['data_tramitacao'] > datetime.now().date():
                 msg = _(
                     'A data de tramitação deve ser ' +
                     'menor ou igual a data de hoje!')
@@ -267,7 +269,7 @@ def clean(self):
                         'maior que a data de tramitação!')
                 raise ValidationError(msg)
 
-        return self.cleaned_data
+        return cleaned_data
 
 
 class TramitacaoUpdateForm(TramitacaoForm):
@@ -296,13 +298,26 @@ class Meta:
         }
 
     def clean(self):
-        super(TramitacaoUpdateForm, self).clean()
+        ultima_tramitacao = Tramitacao.objects.filter(
+            materia_id=self.instance.materia_id).order_by(
+            '-data_tramitacao',
+            '-id').first()
+
+        # Se a Tramitação que está sendo editada não for a mais recente,
+        # ela não pode ter seu destino alterado.
+        if ultima_tramitacao != self.instance:
+            if self.cleaned_data['unidade_tramitacao_destino'] != \
+                    self.instance.unidade_tramitacao_destino:
+                raise ValidationError(
+                    'Você não pode mudar a Unidade de Destino desta '\
+                    'tramitação, pois irá conflitar com a Unidade ' \
+                    'Local da tramitação seguinte')
 
-        local = self.instance.unidade_tramitacao_local
-        data_tram = self.instance.data_tramitacao
+        self.cleaned_data['data_tramitacao'] = \
+            self.instance.data_tramitacao
+        self.cleaned_data['unidade_tramitacao_local'] = \
+            self.instance.unidade_tramitacao_local
 
-        self.cleaned_data['data_tramitacao'] = data_tram
-        self.cleaned_data['unidade_tramitacao_local'] = local
         return super(TramitacaoUpdateForm, self).clean()
 
 
diff --git a/sapl/materia/views.py b/sapl/materia/views.py
--- a/sapl/materia/views.py
+++ b/sapl/materia/views.py
@@ -928,7 +928,8 @@ def get_success_url(self):
         def get_initial(self):
             local = MateriaLegislativa.objects.get(
                 pk=self.kwargs['pk']).tramitacao_set.order_by(
-                '-data_tramitacao').first()
+                '-data_tramitacao',
+                '-id').first()
 
             if local:
                 self.initial['unidade_tramitacao_local'
@@ -1007,7 +1008,8 @@ class ListView(MasterDetailCrud.ListView):
         def get_queryset(self):
             qs = super(MasterDetailCrud.ListView, self).get_queryset()
             kwargs = {self.crud.parent_field: self.kwargs['pk']}
-            return qs.filter(**kwargs).order_by('-data_tramitacao', '-id')
+            return qs.filter(**kwargs).order_by('-data_tramitacao',
+                                                '-id')
 
     class DeleteView(MasterDetailCrud.DeleteView):
 


Test patch: