Repository: interlegis/sapl

Issue:
Ordenação dinâmica das Matérias de Expediente e Ordem do Dia



Discussion:

Resolving patch:
diff --git a/sapl/base/templatetags/common_tags.py b/sapl/base/templatetags/common_tags.py
--- a/sapl/base/templatetags/common_tags.py
+++ b/sapl/base/templatetags/common_tags.py
@@ -132,3 +132,8 @@ def cronometro_to_seconds(value):
         'cronometro_' + value).isoformat().split(':')
 
     return 60 * int(m) + int(s)
+
+
+@register.filter
+def to_list_pk(object_list):
+    return [o.pk for o in object_list]
diff --git a/sapl/sessao/urls.py b/sapl/sessao/urls.py
--- a/sapl/sessao/urls.py
+++ b/sapl/sessao/urls.py
@@ -23,7 +23,8 @@
                                recuperar_numero_sessao,
                                reordernar_materias_expediente,
                                reordernar_materias_ordem,
-                               sessao_legislativa_legislatura_ajax)
+                               sessao_legislativa_legislatura_ajax,
+                               mudar_ordem_materia_sessao)
 
 from .apps import AppConfig
 
@@ -127,4 +128,8 @@
         VotacaoExpedienteView.as_view(), name='votacaosecretaexp'),
     url(r'^sessao/(?P<pk>\d+)/matexp/votsec/view/(?P<oid>\d+)/(?P<mid>\d+)$',
         VotacaoExpedienteEditView.as_view(), name='votacaosecretaexpedit'),
+
+    url(r'^ajax/mudar-ordem-materia-sessao/',
+        mudar_ordem_materia_sessao,
+        name='mudar_ordem_materia_sessao'),
 ]
diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py
--- a/sapl/sessao/views.py
+++ b/sapl/sessao/views.py
@@ -12,6 +12,7 @@
 from django.utils.decorators import method_decorator
 from django.utils.html import strip_tags
 from django.utils.translation import ugettext_lazy as _
+from django.views.decorators.csrf import csrf_exempt
 from django.views.generic import ListView, TemplateView
 from django.views.generic.base import RedirectView
 from django.views.generic.detail import DetailView
@@ -2407,3 +2408,60 @@ def post(self, request, *args, **kwargs):
                 ordem_dia.save()
 
         return self.get(request, self.kwargs)
+
+
+@csrf_exempt
+def mudar_ordem_materia_sessao(request):
+    # Pega os dados vindos da requisição
+    posicao_inicial = int(request.POST['pos_ini']) + 1
+    posicao_final = int(request.POST['pos_fim']) + 1
+    pk_sessao = int(request.POST['pk_sessao'])
+    pk_list = request.POST.getlist('pk_list[]')
+
+    materia = request.POST['materia']
+    
+    # Verifica se está nas Matérias do Expediente ou da Ordem do Dia
+    if materia == 'expediente':
+        materia = ExpedienteMateria
+    elif materia == 'ordem':
+        materia = OrdemDia
+    else:
+        return
+
+    # Testa se existe alguma matéria na posição recebida
+    try:
+        materia_1 = materia.objects.get(
+            sessao_plenaria=pk_sessao,
+            numero_ordem=posicao_inicial)
+    except ObjectDoesNotExist:
+        raise # TODO tratar essa exceção
+
+    # Se a posição inicial for menor que a final, todos que
+    # estiverem acima da nova posição devem ter sua ordem decrementada
+    # em uma posição
+    if posicao_inicial < posicao_final:
+        materias_expediente = materia.objects.filter(
+            sessao_plenaria=pk_sessao,
+            numero_ordem__lte=posicao_final,
+            numero_ordem__gte=posicao_inicial)
+        for m in materias_expediente:
+            m.numero_ordem = m.numero_ordem - 1
+            m.save()
+
+
+    # Se a posição inicial for maior que a final, todos que
+    # estiverem abaixo da nova posição devem ter sua ordem incrementada
+    # em uma posição
+    elif posicao_inicial > posicao_final:
+        materias_expediente = materia.objects.filter(
+            sessao_plenaria=pk_sessao,
+            numero_ordem__gte=posicao_final,
+            numero_ordem__lte=posicao_inicial)
+        for m in materias_expediente:
+            m.numero_ordem = m.numero_ordem + 1
+            m.save()
+
+    materia_1.numero_ordem = posicao_final
+    materia_1.save()
+
+    return


Test patch: