Repository: interlegis/sapl

Issue:
 Atualização de User e Ip na Edição de Tramitação de Matéria Legislativa
<!--- Forneça um resumo geral da _issue_ no título acima -->

## Comportamento Esperado
<!--- Se você está descrevendo um _bug_, conte-nos o que deveria acontecer. -->
<!--- Se você está sugerindo uma mudança/melhoria, conte-nos como deve funcionar. -->
Quando uma tramitação não é alterada na edição de tramitação de matéria legislativa, manter os últimos valores de user e ip.

## Passos para Reproduzir (para bugs)
<!--- Forneça um link para um exemplo, ou um conjunto de passos inequívocos -->
<!--- para reproduzir esse bug. Inclua código para reproduzir, se relevante. -->
1. Acessar uma tramitação de matéria legislativa utilizando um usuário diferente do que realizou a última alteração nessa tramitação;
2. Clicar em Editar;
3. Clicar em Salvar;
4. Observar os valores dos campos Usuário e IP.





Discussion:

Resolving patch:
diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py
--- a/sapl/materia/forms.py
+++ b/sapl/materia/forms.py
@@ -653,17 +653,6 @@ def clean(self):
                     'Você não pode mudar a Unidade de Destino desta '
                     'tramitação, pois irá conflitar com a Unidade '
                     'Local da tramitação seguinte')
-        
-        # Se não houve qualquer alteração em um dos dados, mantém o usuário e ip
-        if not (cd['data_tramitacao'] != obj.data_tramitacao or \
-           cd['unidade_tramitacao_destino'] != obj.unidade_tramitacao_destino or \
-           cd['status'] != obj.status or cd['texto'] != obj.texto or \
-           cd['data_encaminhamento'] != obj.data_encaminhamento or \
-           cd['data_fim_prazo'] != obj.data_fim_prazo or \
-           cd['urgente'] != obj.urgente or \
-           cd['turno'] != obj.turno):
-            cd['user'] = obj.user
-            cd['ip'] = obj.ip
 
         cd['data_tramitacao'] = obj.data_tramitacao
         cd['unidade_tramitacao_local'] = obj.unidade_tramitacao_local
diff --git a/sapl/materia/views.py b/sapl/materia/views.py
--- a/sapl/materia/views.py
+++ b/sapl/materia/views.py
@@ -1256,18 +1256,29 @@ class UpdateView(MasterDetailCrud.UpdateView):
 
         layout_key = 'TramitacaoUpdate'
 
-        def get_initial(self):
-            initial = super(UpdateView, self).get_initial()
-            initial['ip'] = get_client_ip(self.request)
-            initial['user'] = self.request.user
-            return initial
-
         def form_valid(self, form):
+            dict_objeto_antigo = Tramitacao.objects.get(pk=self.kwargs['pk']).__dict__
+
             self.object = form.save()
-            username = self.request.user.username
+            dict_objeto_novo = self.object.__dict__
+
+            user = self.request.user
+
+            atributos = [
+                'data_tramitacao', 'unidade_tramitacao_destino_id', 'status_id', 'texto',
+                'data_encaminhamento', 'data_fim_prazo', 'urgente', 'turno'
+            ]
+
+            # Se não houve qualquer alteração em um dos dados, mantém o usuário e ip
+            for atributo in atributos:
+                if dict_objeto_antigo[atributo] != dict_objeto_novo[atributo]:
+                    self.object.user = user
+                    self.object.ip = get_client_ip(self.request)
+                    self.object.save()
+                    break
 
             try:
-                self.logger.debug("user=" + username + ". Tentando enviar Tramitacao (sender={}, post={}, request={}"
+                self.logger.debug("user=" + user.username + ". Tentando enviar Tramitacao (sender={}, post={}, request={}"
                                   .format(Tramitacao, self.object, self.request))
                 tramitacao_signal.send(sender=Tramitacao,
                                        post=self.object,
@@ -1276,7 +1287,7 @@ def form_valid(self, form):
                 msg = _('Tramitação atualizada, mas e-mail de acompanhamento '
                         'de matéria não enviado. Há problemas na configuração '
                         'do e-mail.')
-                self.logger.warning('user=' + username + '. Tramitação atualizada, mas e-mail de acompanhamento '
+                self.logger.warning('user=' + user.username + '. Tramitação atualizada, mas e-mail de acompanhamento '
                                     'de matéria não enviado. Há problemas na configuração '
                                     'do e-mail.')
                 messages.add_message(self.request, messages.WARNING, msg)


Test patch: