Browse Source

refact: impl LastModified diretamente nos models que possuem campos específicos

pull/3808/head
LeandroJatai 1 week ago
committed by LeandroJataí
parent
commit
c3acd030b6
  1. 47
      sapl/api/views.py
  2. 12
      sapl/api/views_materia.py

47
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

12
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 implementa o método last_modified_func que atende o caso
específico de MateriaLegislativa, baseado no campo data_ultima_atualizacao.
Portanto, não 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:

Loading…
Cancel
Save