Repository: interlegis/sapl

Issue:
Localização atual e status do documento administrativo
versão 3.2!
Assim como na matéria legislativa, ver a possibilidade de se colocar também no documento administrativo os campos localização atual, status e documentos acessórios na tela de pesquisa, uma vez que o mesmo pode tramitar assim como a matéria. Esses dados apareceriam no resultado da pesquisa...

![image](https://user-images.githubusercontent.com/30807716/42697382-5dd89820-8691-11e8-8037-5b22b74cc9dd.png)



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
@@ -766,14 +766,10 @@ def qs(self):
 
 
 def pega_ultima_tramitacao():
-    ultimas_tramitacoes = Tramitacao.objects.values(
+    return Tramitacao.objects.values(
         'materia_id').annotate(data_encaminhamento=Max(
             'data_encaminhamento'),
-        id=Max('id')).values_list('id')
-
-    lista = [item for sublist in ultimas_tramitacoes for item in sublist]
-
-    return lista
+        id=Max('id')).values_list('id', flat=True)
 
 
 def filtra_tramitacao_status(status):
diff --git a/sapl/protocoloadm/forms.py b/sapl/protocoloadm/forms.py
--- a/sapl/protocoloadm/forms.py
+++ b/sapl/protocoloadm/forms.py
@@ -7,6 +7,7 @@
 from django.core.exceptions import (MultipleObjectsReturned,
                                     ObjectDoesNotExist, ValidationError)
 from django.db import models
+from django.db.models import Max
 from django.forms import ModelForm
 from django.utils import timezone
 from django.utils.translation import ugettext_lazy as _
@@ -873,3 +874,34 @@ def __init__(self, *args, **kwargs):
                      form_actions(label='Desvincular')
                      )
         )
+
+
+def pega_ultima_tramitacao_adm():
+    return TramitacaoAdministrativo.objects.values(
+        'materia_id').annotate(data_encaminhamento=Max(
+            'data_encaminhamento'),
+        id=Max('id')).values_list('id', flat=True)
+
+
+def filtra_tramitacao_adm_status(status):
+    lista = pega_ultima_tramitacao_adm()
+    return TramitacaoAdministrativo.objects.filter(
+        id__in=lista,
+        status=status).distinct().values_list('materia_id', flat=True)
+
+
+def filtra_tramitacao_adm_destino(destino):
+    lista = pega_ultima_tramitacao_adm()
+    return TramitacaoAdministrativo.objects.filter(
+        id__in=lista,
+        unidade_tramitacao_destino=destino).distinct().values_list(
+            'materia_id', flat=True)
+
+
+def filtra_tramitacao_adm_destino_and_status(status, destino):
+    lista = pega_ultima_tramitacao_adm()
+    return TramitacaoAdministrativo.objects.filter(
+        id__in=lista,
+        status=status,
+        unidade_tramitacao_destino=destino).distinct().values_list(
+            'materia_id', flat=True)
diff --git a/sapl/protocoloadm/views.py b/sapl/protocoloadm/views.py
--- a/sapl/protocoloadm/views.py
+++ b/sapl/protocoloadm/views.py
@@ -31,7 +31,8 @@
                     DocumentoAdministrativoFilterSet,
                     DocumentoAdministrativoForm, ProtocoloDocumentForm,
                     ProtocoloFilterSet, ProtocoloMateriaForm,
-                    TramitacaoAdmEditForm, TramitacaoAdmForm, DesvincularDocumentoForm, DesvincularMateriaForm)
+                    TramitacaoAdmEditForm, TramitacaoAdmForm, DesvincularDocumentoForm, DesvincularMateriaForm,
+                    filtra_tramitacao_adm_destino_and_status, filtra_tramitacao_adm_destino, filtra_tramitacao_adm_status)
 from .models import (DocumentoAcessorioAdministrativo, DocumentoAdministrativo,
                      StatusTramitacaoAdministrativo,
                      TipoDocumentoAdministrativo, TramitacaoAdministrativo)
@@ -543,13 +544,34 @@ def get_filterset_kwargs(self, filterset_class):
 
         kwargs = {'data': self.request.GET or None}
 
+        status_tramitacao = self.request.GET.get('tramitacao__status')
+        unidade_destino = self.request.GET.get(
+            'tramitacao__unidade_tramitacao_destino')
+
         qs = self.get_queryset()
 
-        qs = qs.distinct()
+        if status_tramitacao and unidade_destino:
+            lista = filtra_tramitacao_adm_destino_and_status(status_tramitacao,
+                                                         unidade_destino)
+            qs = qs.filter(id__in=lista).distinct()
+
+        elif status_tramitacao:
+            lista = filtra_tramitacao_adm_status(status_tramitacao)
+            qs = qs.filter(id__in=lista).distinct()
+
+        elif unidade_destino:
+            lista = filtra_tramitacao_adm_destino(unidade_destino)
+            qs = qs.filter(id__in=lista).distinct()
 
         if 'o' in self.request.GET and not self.request.GET['o']:
             qs = qs.order_by('-ano', '-numero')
 
+        qs = qs.prefetch_related("documentoacessorioadministrativo_set",
+                                 "tramitacaoadministrativo_set",
+                                 "tramitacaoadministrativo_set__status",
+                                 "tramitacaoadministrativo_set__unidade_tramitacao_local",
+                                 "tramitacaoadministrativo_set__unidade_tramitacao_destino")
+
         kwargs.update({
             'queryset': qs,
         })


Test patch: