From e90a38e011e6345f1a5d2f43f3be3c5fd55fa4bf Mon Sep 17 00:00:00 2001 From: Eliseu Egewarth Date: Tue, 29 Aug 2017 15:18:34 -0300 Subject: [PATCH] Fix #1387 exibir sessao legislativa atual mesa diretora (#1427) * Fix #1387 Signed-off-by: Eliseu Egewarth * Adiciona decorator vigencia_atual e aplica ele nas models Legislatura e SessaoLegislativa Signed-off-by: Eliseu Egewarth * Fix #1387 Signed-off-by: Eliseu Egewarth --- sapl/decorators.py | 40 ++++++++++++++++++++++++++++++++++++ sapl/parlamentares/models.py | 10 ++++----- sapl/parlamentares/views.py | 38 +++++++++++++++++++--------------- 3 files changed, 67 insertions(+), 21 deletions(-) create mode 100644 sapl/decorators.py diff --git a/sapl/decorators.py b/sapl/decorators.py new file mode 100644 index 000000000..6bf61d81b --- /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 index 8bbc3704f..ce825d88d 100644 --- a/sapl/parlamentares/models.py +++ b/sapl/parlamentares/models.py @@ -6,6 +6,7 @@ from django.utils.translation import ugettext_lazy as _ 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 @@ class Legislatura(models.Model): 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 SessaoLegislativa(models.Model): 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 index 46a6dc7d4..fff00b775 100644 --- 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 @@ class MesaDiretoraView(FormView): 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 @@ class MesaDiretoraView(FormView): 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]