Browse Source

Troca custom manager por função utilitária de visibilidade

Atende à revisão do PR: substitui a subclasse SessaoPlenariaQuerySet e o
método .visiveis_para() por uma função restringe_sessoes_visiveis(qs, user),
chamada como wrapper nos pontos de acesso público. Mantém a mesma regra de
filtragem e o comportamento de fundir as cadeias de filter em um único SQL.
pull/3845/head
João Moraes 3 days ago
parent
commit
1e4bf50d57
  1. 38
      sapl/sessao/models.py
  2. 9
      sapl/sessao/tests/test_sessao_view.py
  3. 12
      sapl/sessao/views.py

38
sapl/sessao/models.py

@ -153,26 +153,24 @@ def anexo_upload_path(instance, filename):
# return get_sessao_media_path(instance, 'anexo', filename) # return get_sessao_media_path(instance, 'anexo', filename)
class SessaoPlenariaQuerySet(models.QuerySet): def restringe_sessoes_visiveis(qs, user):
"""Restringe o queryset às sessões visíveis na consulta pública.
def visiveis_para(self, user):
"""Restringe às sessões que o usuário pode ver na consulta pública. Usuário autenticado enxerga todas. Para o público, ficam ocultas as
sessões cadastradas com antecedência, ou seja, as marcadas como não
Usuário autenticado enxerga todas. Para o público, ficam ocultas as iniciadas e sem pauta publicada.
sessões cadastradas com antecedência, ou seja, as marcadas como não
iniciadas e sem pauta publicada. `iniciada` nulo conta como visível: o default do campo surgiu na
migração 0027, que não preencheu as linhas existentes, então bases
`iniciada` nulo conta como visível: o default do campo surgiu na antigas têm sessões realizadas com o campo em NULL.
migração 0027, que não preencheu as linhas existentes, então bases """
antigas têm sessões realizadas com o campo em NULL. if user.is_authenticated:
""" return qs
if user.is_authenticated:
return self
return self.filter( return qs.filter(
Q(publicar_pauta=True) | Q(publicar_pauta=True) |
Q(iniciada=True) | Q(iniciada=True) |
Q(iniciada__isnull=True)) Q(iniciada__isnull=True))
class SessaoPlenaria(models.Model): class SessaoPlenaria(models.Model):
@ -277,8 +275,6 @@ class SessaoPlenaria(models.Model):
) )
) )
objects = SessaoPlenariaQuerySet.as_manager()
class Meta: class Meta:
verbose_name = _('Sessão Plenária') verbose_name = _('Sessão Plenária')
verbose_name_plural = _('Sessões Plenárias') verbose_name_plural = _('Sessões Plenárias')

9
sapl/sessao/tests/test_sessao_view.py

@ -11,7 +11,8 @@ from sapl.sessao.models import (SessaoPlenaria, TipoSessaoPlenaria,
IntegranteMesa, SessaoPlenariaPresenca, IntegranteMesa, SessaoPlenariaPresenca,
JustificativaAusencia, ExpedienteSessao, JustificativaAusencia, ExpedienteSessao,
TipoExpediente, ExpedienteMateria, TipoExpediente, ExpedienteMateria,
Orador, OcorrenciaSessao) Orador, OcorrenciaSessao,
restringe_sessoes_visiveis)
from sapl.parlamentares.models import Parlamentar, CargoMesa, Filiacao from sapl.parlamentares.models import Parlamentar, CargoMesa, Filiacao
@ -160,7 +161,8 @@ def test_visiveis_para_oculta_do_anonimo_apenas_a_sessao_previa():
# Sessões anteriores à migração 0027 ficaram com `iniciada` em NULL. # Sessões anteriores à migração 0027 ficaram com `iniciada` em NULL.
legada = baker.make(SessaoPlenaria, iniciada=None, publicar_pauta=False) legada = baker.make(SessaoPlenaria, iniciada=None, publicar_pauta=False)
visiveis = SessaoPlenaria.objects.visiveis_para(AnonymousUser()) visiveis = restringe_sessoes_visiveis(
SessaoPlenaria.objects.all(), AnonymousUser())
assert previa not in visiveis assert previa not in visiveis
assert com_pauta in visiveis assert com_pauta in visiveis
@ -174,7 +176,8 @@ def test_visiveis_para_nao_oculta_nada_de_usuario_autenticado():
operador = baker.make(get_user_model()) operador = baker.make(get_user_model())
assert previa in SessaoPlenaria.objects.visiveis_para(operador) assert previa in restringe_sessoes_visiveis(
SessaoPlenaria.objects.all(), operador)
@pytest.mark.django_db(transaction=False) @pytest.mark.django_db(transaction=False)

12
sapl/sessao/views.py

@ -64,7 +64,7 @@ from .models import (Bancada, CargoBancada, CargoMesa,
SessaoPlenaria, SessaoPlenariaPresenca, TipoExpediente, SessaoPlenaria, SessaoPlenariaPresenca, TipoExpediente,
TipoResultadoVotacao, TipoSessaoPlenaria, VotoParlamentar, TipoRetiradaPauta, TipoResultadoVotacao, TipoSessaoPlenaria, VotoParlamentar, TipoRetiradaPauta,
RetiradaPauta, TipoJustificativa, JustificativaAusencia, OradorOrdemDia, RetiradaPauta, TipoJustificativa, JustificativaAusencia, OradorOrdemDia,
ORDENACAO_RESUMO, RegistroLeitura) ORDENACAO_RESUMO, RegistroLeitura, restringe_sessoes_visiveis)
TipoSessaoCrud = CrudAux.build(TipoSessaoPlenaria, 'tipo_sessao_plenaria') TipoSessaoCrud = CrudAux.build(TipoSessaoPlenaria, 'tipo_sessao_plenaria')
TipoJustificativaCrud = CrudAux.build(TipoJustificativa, 'tipo_justificativa') TipoJustificativaCrud = CrudAux.build(TipoJustificativa, 'tipo_justificativa')
@ -1349,8 +1349,9 @@ class SessaoCrud(Crud):
class DetailView(Crud.DetailView): class DetailView(Crud.DetailView):
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
if not SessaoPlenaria.objects.visiveis_para( if not restringe_sessoes_visiveis(
request.user).filter(pk=kwargs.get('pk')).exists(): SessaoPlenaria.objects.filter(pk=kwargs.get('pk')),
request.user).exists():
raise Http404() raise Http404()
return super().get(request, *args, **kwargs) return super().get(request, *args, **kwargs)
@ -2334,7 +2335,8 @@ class ResumoView(DetailView):
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
def get_queryset(self): def get_queryset(self):
return SessaoPlenaria.objects.visiveis_para(self.request.user) return restringe_sessoes_visiveis(
SessaoPlenaria.objects.all(), self.request.user)
def get_context(self, *args, **kwargs): def get_context(self, *args, **kwargs):
self.object = self.get_object() self.object = self.get_object()
@ -4043,7 +4045,7 @@ class PesquisarSessaoPlenariaView(MultiFormatOutputMixin, FilterView):
qs = self.get_queryset().select_related( qs = self.get_queryset().select_related(
'tipo', 'sessao_legislativa', 'legislatura') 'tipo', 'sessao_legislativa', 'legislatura')
qs = qs.visiveis_para(self.request.user) qs = restringe_sessoes_visiveis(qs, self.request.user)
qs = qs.distinct().order_by( qs = qs.distinct().order_by(
'-legislatura__numero', '-data_inicio', '-hora_inicio') '-legislatura__numero', '-data_inicio', '-hora_inicio')

Loading…
Cancel
Save