Browse Source

fix: ajuste no frontend para evitar cache automático devido a LastModified sem tratamento adequado

pull/3808/head
LeandroJatai 3 weeks ago
committed by LeandroJataí
parent
commit
318fe76d72
  1. 2
      drfautoapi/drfautoapi.py
  2. 6
      frontend/src/__apps/parlamentar/main.js
  3. 3
      frontend/src/__global/js/functions.js
  4. 13
      sapl/api/views.py
  5. 2
      sapl/templates/crud/detail.html
  6. 2
      sapl/templates/crud/detail_detail.html

2
drfautoapi/drfautoapi.py

@ -226,7 +226,7 @@ class ApiViewSetConstrutor():
return cls return cls
@classmethod @classmethod
def last_modified_method(cls, klass): def last_modified_class(cls, klass):
cls.LastModifiedDecorator = klass cls.LastModifiedDecorator = klass
return cls return cls

6
frontend/src/__apps/parlamentar/main.js

@ -3,6 +3,12 @@ import Vue from 'vue'
import { FormSelectPlugin } from 'bootstrap-vue' import { FormSelectPlugin } from 'bootstrap-vue'
import axios from 'axios' import axios from 'axios'
// TODO: refatorar para aproveitar cache e LastModified no frontend oficial
// Configuração global para todas as requisições GET do axios
axios.defaults.headers.get['Cache-Control'] = 'no-cache, no-store, must-revalidate'
axios.defaults.headers.get['Pragma'] = 'no-cache' // Suporte para navegadores mais antigos
axios.defaults.headers.get['Expires'] = '0' // Expira imediatamente
axios.defaults.xsrfCookieName = 'csrftoken' axios.defaults.xsrfCookieName = 'csrftoken'
axios.defaults.xsrfHeaderName = 'X-CSRFToken' axios.defaults.xsrfHeaderName = 'X-CSRFToken'

3
frontend/src/__global/js/functions.js

@ -66,7 +66,8 @@ window.autorModal = function () {
$('#pesquisar').click(function () { $('#pesquisar').click(function () {
const json_data = { const json_data = {
q: $('#q').val() q: $('#q').val(),
utc_time: Date.now(),
// get_all: true // get_all: true
} }
$.get('/api/base/autor', json_data, function (data) { $.get('/api/base/autor', json_data, function (data) {

13
sapl/api/views.py

@ -36,11 +36,7 @@ class LastModifiedDecorator:
- Se for uma listagem, considera o último AuditLog de todos os objetos - Se for uma listagem, considera o último AuditLog de todos os objetos
retornados na listagem levando em consideração resultado de FilterSet. retornados na listagem levando em consideração resultado de FilterSet.
- Retorna 304 Not Modified se o recurso não foi modificado - Retorna 304 Not Modified se o recurso não foi modificado
""" """
def __init__(self):
pass
def __call__(self, cls): def __call__(self, cls):
original_dispatch = cls.dispatch original_dispatch = cls.dispatch
@ -53,7 +49,7 @@ class LastModifiedDecorator:
last_modified_func = self.last_modified_func if not hasattr(view, 'last_modified_func') else view.last_modified_func last_modified_func = self.last_modified_func if not hasattr(view, 'last_modified_func') else view.last_modified_func
def patched_viewset_method(*_args, **_kwargs): def patched_viewset_method(*_args, **_kwargs):
return original_dispatch(view, drf_request, *_args, **_kwargs) return original_dispatch(view, drf_request, *args, **kwargs)
django_decorator = django_condition(last_modified_func=last_modified_func) django_decorator = django_condition(last_modified_func=last_modified_func)
decorated_viewset_method = django_decorator(patched_viewset_method) decorated_viewset_method = django_decorator(patched_viewset_method)
@ -63,6 +59,10 @@ class LastModifiedDecorator:
return cls return cls
def last_modified_func(self, request, *args, **kwargs): def last_modified_func(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
"""
try: try:
if 'pk' in kwargs: if 'pk' in kwargs:
obj_id = kwargs['pk'] obj_id = kwargs['pk']
@ -75,6 +75,7 @@ class LastModifiedDecorator:
if view: if view:
for backend in list(view.filter_backends): for backend in list(view.filter_backends):
queryset = backend().filter_queryset(request, view.queryset, view) queryset = backend().filter_queryset(request, view.queryset, view)
if queryset.exists(): if queryset.exists():
last_log = AuditLog.objects.filter( last_log = AuditLog.objects.filter(
model_name=self.model._meta.model_name, model_name=self.model._meta.model_name,
@ -97,7 +98,7 @@ class LastModifiedDecorator:
return None return None
SaplApiViewSetConstrutor = ApiViewSetConstrutor SaplApiViewSetConstrutor = ApiViewSetConstrutor
SaplApiViewSetConstrutor.last_modified_method(LastModifiedDecorator) SaplApiViewSetConstrutor.last_modified_class(LastModifiedDecorator)
SaplApiViewSetConstrutor.import_modules([ SaplApiViewSetConstrutor.import_modules([
'sapl.api.views_audiencia', 'sapl.api.views_audiencia',
'sapl.api.views_base', 'sapl.api.views_base',

2
sapl/templates/crud/detail.html

@ -104,7 +104,7 @@
{% if view.openapi_url %} {% if view.openapi_url %}
<div class="container justify-content-end d-flex"> <div class="container justify-content-end d-flex">
<div class="actions btn-group" role="group"> <div class="actions btn-group" role="group">
<a href="{{ view.openapi_url }}" class="btn btn-sm btn-info py-0"> <a href="{{ view.openapi_url }}?utc_time={% now 'U' %}" class="btn btn-sm btn-info py-0">
<small class="text-white"> <small class="text-white">
{% trans 'OpenAPI' %} {% trans 'OpenAPI' %}
</small> </small>

2
sapl/templates/crud/detail_detail.html

@ -67,7 +67,7 @@
{% if view.openapi_url %} {% if view.openapi_url %}
<div class="container justify-content-end d-flex"> <div class="container justify-content-end d-flex">
<div class="actions btn-group" role="group"> <div class="actions btn-group" role="group">
<a href="{{ view.openapi_url }}" class="btn btn-sm btn-info py-0"> <a href="{{ view.openapi_url }}?utc_time={% now 'U' %}" class="btn btn-sm btn-info py-0">
<small class="text-white"> <small class="text-white">
{% trans 'OpenAPI' %} {% trans 'OpenAPI' %}
</small> </small>

Loading…
Cancel
Save