Repository: interlegis/sapl

Issue:
Exibir a Sessão Legislativa atual na Mesa Diretora
Deixar a Sessão Legislativa atual como default quando entrar na tela da Mesa Diretora, da mesma forma como é apresentada a Legislatura (atual).
Justificativa: Se forem inseridas mais de uma Sessão Legislativa (futuras), o sistema exibirá a última. O usuário poderá se enganar achando que não foi cadastrado a Mesa atual.

grato


Discussion:

Resolving patch:
diff --git a/sapl/decorators.py b/sapl/decorators.py
new file mode 100644
--- /dev/null
+++ b/sapl/decorators.py
@@ -0,0 +1,40 @@
+from datetime import date
+from functools import wraps
+
+
+def vigencia_atual(decorated_method):
+    """
+    concatena a string ' (Atual)' caso a model instancia estiver
+    em vigência na data atual do servidor
+
+    Premissas:
+        * A classe precisa conter os atributos 'data_inicio' e 'data_fim'.
+        * 'data_inicio' e 'data_fim' precisam ser do tipo models.DateField
+    """
+    @wraps(decorated_method)
+    def display_atual(self):
+        try:
+            string_displayed = decorated_method(self)
+        except TypeError:
+            string_displayed = ""
+
+        if hasattr(self, 'data_inicio') and hasattr(self, 'data_fim'):
+            today = date.today()
+            e_atual = self.data_inicio <= today <= self.data_fim
+            string_displayed = "{} {}".format(
+                string_displayed, "(Atual)" if e_atual else "")
+        else:
+            print('{} {}'.format(
+                "Instance does not have the attributes [{}, {}].".format(
+                    'data_inicio',
+                    'data_fim'
+                ),
+                "Decorator @{} has been disabled.".format(
+                    vigencia_atual.__name__()
+                    )
+                )
+            )
+
+        return string_displayed
+
+    return display_atual
diff --git a/sapl/parlamentares/models.py b/sapl/parlamentares/models.py
--- a/sapl/parlamentares/models.py
+++ b/sapl/parlamentares/models.py
@@ -6,6 +6,7 @@
 from model_utils import Choices
 
 from sapl.base.models import Autor
+from sapl.decorators import vigencia_atual
 from sapl.utils import (INDICADOR_AFASTAMENTO, UF, YES_NO_CHOICES,
                         SaplGenericRelation, get_settings_auth_user_model,
                         intervalos_tem_intersecao,
@@ -28,14 +29,12 @@ def atual(self):
         current_year = datetime.now().year
         return self.data_inicio.year <= current_year <= self.data_fim.year
 
+    @vigencia_atual
     def __str__(self):
-        current = ' (%s)' % _('Atual') if self.atual() else ''
-
-        return _('%(numero)sª (%(start)s - %(end)s)%(current)s') % {
+        return _('%(numero)sª (%(start)s - %(end)s)') % {
             'numero': self.numero,
             'start': self.data_inicio.year,
-            'end': self.data_fim.year,
-            'current': current}
+            'end': self.data_fim.year}
 
 
 @reversion.register()
@@ -64,6 +63,7 @@ class Meta:
         verbose_name_plural = _('Sessões Legislativas')
         ordering = ['-data_inicio', '-data_fim']
 
+    @vigencia_atual
     def __str__(self):
         return _('%(numero)sº (%(inicio)s - %(fim)s)') % {
             'numero': self.numero,
diff --git a/sapl/parlamentares/views.py b/sapl/parlamentares/views.py
--- a/sapl/parlamentares/views.py
+++ b/sapl/parlamentares/views.py
@@ -1,4 +1,4 @@
-import datetime
+from datetime import datetime
 import json
 
 from django.contrib import messages
@@ -657,17 +657,20 @@ def get(self, request, *args, **kwargs):
                 not SessaoLegislativa.objects.exists()):
             return self.validation(request)
 
-        sessao = SessaoLegislativa.objects.filter(
-            legislatura=Legislatura.objects.first()).first(
-        )
+        legislatura = Legislatura.objects.first()
+        sessoes = SessaoLegislativa.objects.filter(
+            legislatura=legislatura).order_by("data_inicio")
 
-        mesa = sessao.composicaomesa_set.all() if sessao else []
+        today = datetime.now()
+        sessao_atual = sessoes.filter(data_inicio__year=today.year).first()
+
+        mesa = sessao_atual.composicaomesa_set.all() if sessao_atual else []
 
         cargos_ocupados = [m.cargo for m in mesa]
         cargos = CargoMesa.objects.all()
         cargos_vagos = list(set(cargos) - set(cargos_ocupados))
 
-        parlamentares = Legislatura.objects.first().mandato_set.all()
+        parlamentares = legislatura.mandato_set.all()
         parlamentares_ocupados = [m.parlamentar for m in mesa]
         parlamentares_vagos = list(
             set(
@@ -682,11 +685,9 @@ def get(self, request, *args, **kwargs):
         return self.render_to_response(
             {'legislaturas': Legislatura.objects.all(
             ).order_by('-numero'),
-                'legislatura_selecionada': Legislatura.objects.first(),
-                'sessoes': SessaoLegislativa.objects.filter(
-                legislatura=Legislatura.objects.first()),
-                'sessao_selecionada': SessaoLegislativa.objects.filter(
-                legislatura=Legislatura.objects.first()).first(),
+                'legislatura_selecionada': legislatura,
+                'sessoes': sessoes,
+                'sessao_selecionada': sessao_atual,
                 'composicao_mesa': mesa,
                 'parlamentares': parlamentares_vagos,
                 'cargos_vagos': cargos_vagos
@@ -700,7 +701,6 @@ def altera_field_mesa(request):
         operação (Legislatura/Sessão/Inclusão/Remoção),
         atualizando os campos após cada alteração
     """
-
     legislatura = request.GET['legislatura']
     sessoes = SessaoLegislativa.objects.filter(
         legislatura=legislatura).order_by('-data_inicio')
@@ -716,9 +716,11 @@ def altera_field_mesa(request):
     # Caso a mudança tenha sido no campo legislatura, a sessão
     # atual deve ser a primeira daquela legislatura
     else:
-        sessao_selecionada = SessaoLegislativa.objects.filter(
-            legislatura=legislatura).order_by(
-            '-data_inicio').first().id
+        today = datetime.now()
+        try:
+            sessao_selecionada = sessoes.get(data_inicio__year=today.year).id
+        except ObjectDoesNotExist:
+            sessao_selecionada = sessoes.first().id
 
     # Atualiza os componentes da view após a mudança
     composicao_mesa = ComposicaoMesa.objects.filter(
@@ -881,7 +883,11 @@ def altera_field_mesa_public_view(request):
     # Caso a mudança tenha sido no campo legislatura, a sessão
     # atual deve ser a primeira daquela legislatura
     else:
-        sessao_selecionada = sessoes.first().id
+        try:
+            today = datetime.now()
+            sessao_selecionada = sessoes.get(data_inicio__year=today.year).id
+        except ObjectDoesNotExist as e:
+            sessao_selecionada = sessoes.first().id
 
     # Atualiza os componentes da view após a mudança
     lista_sessoes = [(s.id, s.__str__()) for s in sessoes]


Test patch: