From c3acd030b67070e3f4c7ed3bdd8b1d2e6f5a2c75 Mon Sep 17 00:00:00 2001 From: LeandroJatai Date: Sat, 8 Nov 2025 10:14:42 -0300 Subject: [PATCH] =?UTF-8?q?refact:=20impl=20LastModified=20diretamente=20n?= =?UTF-8?q?os=20models=20que=20possuem=20campos=20espec=C3=ADficos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/api/views.py | 47 ++++++++++++++++++++++++++++++++++++--- sapl/api/views_materia.py | 12 ++++++++-- 2 files changed, 54 insertions(+), 5 deletions(-) diff --git a/sapl/api/views.py b/sapl/api/views.py index aeaa1d974..c2b8ae786 100644 --- a/sapl/api/views.py +++ b/sapl/api/views.py @@ -59,6 +59,47 @@ class LastModifiedDecorator: return cls def last_modified_func(self, request, *args, **kwargs): + + default_fields_for_timestamp = ( + 'data_ultima_atualizacao', + 'ultima_edicao' + ) + + # tenta encontrar um dos campos acima para usar como last_modified + fields = tuple( + filter( + lambda f: f in default_fields_for_timestamp, + map( + lambda f: f.name, self.model._meta.get_fields() + ) + ) + ) + field_name = fields[0] if fields else None + + # Retornando None. que indica para o decorator retornar 200 OK sem Last-Modified + # Na prática, desativando o AuditLog como last_modified + # Porém, mantendo a estrutura para possível uso futuro + if not field_name: + # sem campo definido para last_modified, usa AuditLog + return None # self.last_modified_func__auditlog(request, *args, **kwargs) + + pk = kwargs.get('pk', None) + if pk: + return self.model.objects.filter(pk=pk).values_list(field_name, flat=True)[:1].first() + + view = kwargs.get('view', None) + + if view: + queryset = view.get_queryset() + for backend in list(view.filter_backends): + queryset = backend().filter_queryset(request, queryset, view) + else: + queryset = self.model.objects.all() + + timestamp = queryset.order_by(f'-{field_name}').values_list(field_name, flat=True)[:1].first() + return timestamp + + def last_modified_func__auditlog(self, request, *args, **kwargs): """ - Método padrão para obter o last_modified baseado no AuditLog - Pode ser sobrescrito na customização do ViewSet caso necessário - Existe um exemplo de sobrescrita em sapl/api/views_materia.py @@ -69,7 +110,7 @@ class LastModifiedDecorator: last_log = AuditLog.objects.filter( model_name=self.model._meta.model_name, object_id=obj_id - ).order_by('-timestamp').values_list('timestamp', flat=True).first() + ).order_by('-timestamp').values_list('timestamp', flat=True)[:1].first() else: view = kwargs.get('view', None) if view: @@ -80,14 +121,14 @@ class LastModifiedDecorator: last_log = AuditLog.objects.filter( model_name=self.model._meta.model_name, object_id__in=queryset.values_list('pk', flat=True) - ).order_by('-timestamp').values_list('timestamp', flat=True).first() + ).order_by('-timestamp').values_list('timestamp', flat=True)[:1].first() else: last_log = None else: last_log = AuditLog.objects.filter( model_name=self.model._meta.model_name, object_id__in=self.model.objects.values_list('pk', flat=True) - ).order_by('-timestamp').values_list('timestamp', flat=True).first() + ).order_by('-timestamp').values_list('timestamp', flat=True)[:1].first() if last_log: return last_log diff --git a/sapl/api/views_materia.py b/sapl/api/views_materia.py index d00b8eabb..1810aea2e 100644 --- a/sapl/api/views_materia.py +++ b/sapl/api/views_materia.py @@ -110,17 +110,25 @@ class _MateriaLegislativaViewSet: self.queryset = self.get_object().anexadas.all() return self.list(request, *args, **kwargs) +""" + O próprio decorator LastModifiedDecorator já implementa o método last_modified_func que atende o caso + específico de MateriaLegislativa, baseado no campo data_ultima_atualizacao. + Portanto, não há necessidade de reimplementar este método aqui. Mas segue o código comentado + para referência futura caso necessário e como exemplo de implementação customizada que sobrescreve + o comportamento padrão do decorator. + def last_modified_func(self, request, *args, **kwargs): pk = kwargs.get('pk', None) if pk: - return MateriaLegislativa.objects.filter(pk=pk).values_list('data_ultima_atualizacao', flat=True).first() + return MateriaLegislativa.objects.filter(pk=pk).values_list('data_ultima_atualizacao', flat=True)[:1].first() queryset = self.get_queryset() for backend in list(self.filter_backends): queryset = backend().filter_queryset(request, self.queryset, self) - timestamp = queryset.order_by('-data_ultima_atualizacao').values_list('data_ultima_atualizacao', flat=True).first() + timestamp = queryset.order_by('-data_ultima_atualizacao').values_list('data_ultima_atualizacao', flat=True)[:1].first() return timestamp +""" @customize(TipoMateriaLegislativa) class _TipoMateriaLegislativaViewSet: