Browse Source

Merge c3acd030b6 into 7735e4e2c7

pull/3808/merge
LeandroJataí 1 week ago
committed by GitHub
parent
commit
af9b40bfd6
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 12
      drfautoapi/drfautoapi.py
  2. 6
      frontend/src/__apps/parlamentar/main.js
  3. 3
      frontend/src/__global/js/functions.js
  4. 90
      frontend/webpack-stats.json
  5. 129
      sapl/api/views.py
  6. 19
      sapl/api/views_materia.py
  7. BIN
      sapl/static/sapl/frontend/css/chunk-vendors.045ec640.css.gz
  8. BIN
      sapl/static/sapl/frontend/css/compilacao.0baf3580.css.gz
  9. BIN
      sapl/static/sapl/frontend/css/global.042f6737.css.gz
  10. BIN
      sapl/static/sapl/frontend/css/painel.e2b9504e.css.gz
  11. BIN
      sapl/static/sapl/frontend/fonts/fa-brands-400.5d18d427.ttf.gz
  12. BIN
      sapl/static/sapl/frontend/fonts/fa-regular-400.81482cd4.ttf.gz
  13. BIN
      sapl/static/sapl/frontend/fonts/fa-solid-900.69d3141a.ttf.gz
  14. BIN
      sapl/static/sapl/frontend/fonts/fa-v4compatibility.2c070fd2.ttf.gz
  15. BIN
      sapl/static/sapl/frontend/img/down_arrow_select.jpg.gz
  16. BIN
      sapl/static/sapl/frontend/js/chunk-vendors.e8ab4373.js.LICENSE.txt.gz
  17. BIN
      sapl/static/sapl/frontend/js/chunk-vendors.e8ab4373.js.gz
  18. 4
      sapl/static/sapl/frontend/js/chunk-vendors.f2d6067d.js
  19. 0
      sapl/static/sapl/frontend/js/chunk-vendors.f2d6067d.js.LICENSE.txt
  20. BIN
      sapl/static/sapl/frontend/js/chunk-vendors.f2d6067d.js.LICENSE.txt.gz
  21. BIN
      sapl/static/sapl/frontend/js/chunk-vendors.f2d6067d.js.gz
  22. BIN
      sapl/static/sapl/frontend/js/compilacao.148cb66b.js.gz
  23. 2
      sapl/static/sapl/frontend/js/global.bb3e904b.js
  24. BIN
      sapl/static/sapl/frontend/js/global.bb3e904b.js.gz
  25. 2
      sapl/static/sapl/frontend/js/global.d557d20c.js
  26. 0
      sapl/static/sapl/frontend/js/global.d557d20c.js.LICENSE.txt
  27. BIN
      sapl/static/sapl/frontend/js/global.d557d20c.js.gz
  28. BIN
      sapl/static/sapl/frontend/js/painel.f3190acc.js.gz
  29. 1
      sapl/static/sapl/frontend/js/parlamentar.a1a4b65b.js
  30. BIN
      sapl/static/sapl/frontend/js/parlamentar.a1a4b65b.js.gz
  31. 1
      sapl/static/sapl/frontend/js/parlamentar.f63027a7.js
  32. BIN
      sapl/static/sapl/frontend/js/parlamentar.f63027a7.js.gz
  33. BIN
      sapl/static/sapl/frontend/js/skins/content/dark/content.css.gz
  34. BIN
      sapl/static/sapl/frontend/js/skins/content/dark/content.js.gz
  35. BIN
      sapl/static/sapl/frontend/js/skins/content/dark/content.min.css.gz
  36. BIN
      sapl/static/sapl/frontend/js/skins/content/default/content.css.gz
  37. BIN
      sapl/static/sapl/frontend/js/skins/content/default/content.js.gz
  38. BIN
      sapl/static/sapl/frontend/js/skins/content/default/content.min.css.gz
  39. BIN
      sapl/static/sapl/frontend/js/skins/content/document/content.css.gz
  40. BIN
      sapl/static/sapl/frontend/js/skins/content/document/content.js.gz
  41. BIN
      sapl/static/sapl/frontend/js/skins/content/document/content.min.css.gz
  42. BIN
      sapl/static/sapl/frontend/js/skins/content/tinymce-5-dark/content.css.gz
  43. BIN
      sapl/static/sapl/frontend/js/skins/content/tinymce-5-dark/content.js.gz
  44. BIN
      sapl/static/sapl/frontend/js/skins/content/tinymce-5-dark/content.min.css.gz
  45. BIN
      sapl/static/sapl/frontend/js/skins/content/tinymce-5/content.css.gz
  46. BIN
      sapl/static/sapl/frontend/js/skins/content/tinymce-5/content.js.gz
  47. BIN
      sapl/static/sapl/frontend/js/skins/content/tinymce-5/content.min.css.gz
  48. BIN
      sapl/static/sapl/frontend/js/skins/content/writer/content.css.gz
  49. BIN
      sapl/static/sapl/frontend/js/skins/content/writer/content.js.gz
  50. BIN
      sapl/static/sapl/frontend/js/skins/content/writer/content.min.css.gz
  51. BIN
      sapl/static/sapl/frontend/js/skins/ui/oxide-dark/content.css.gz
  52. BIN
      sapl/static/sapl/frontend/js/skins/ui/oxide-dark/content.inline.css.gz
  53. BIN
      sapl/static/sapl/frontend/js/skins/ui/oxide-dark/content.inline.js.gz
  54. BIN
      sapl/static/sapl/frontend/js/skins/ui/oxide-dark/content.inline.min.css.gz
  55. BIN
      sapl/static/sapl/frontend/js/skins/ui/oxide-dark/content.js.gz
  56. BIN
      sapl/static/sapl/frontend/js/skins/ui/oxide-dark/content.min.css.gz
  57. BIN
      sapl/static/sapl/frontend/js/skins/ui/oxide-dark/skin.css.gz
  58. BIN
      sapl/static/sapl/frontend/js/skins/ui/oxide-dark/skin.js.gz
  59. BIN
      sapl/static/sapl/frontend/js/skins/ui/oxide-dark/skin.min.css.gz
  60. BIN
      sapl/static/sapl/frontend/js/skins/ui/oxide-dark/skin.shadowdom.css.gz
  61. BIN
      sapl/static/sapl/frontend/js/skins/ui/oxide-dark/skin.shadowdom.js.gz
  62. BIN
      sapl/static/sapl/frontend/js/skins/ui/oxide-dark/skin.shadowdom.min.css.gz
  63. BIN
      sapl/static/sapl/frontend/js/skins/ui/oxide/content.css.gz
  64. BIN
      sapl/static/sapl/frontend/js/skins/ui/oxide/content.inline.css.gz
  65. BIN
      sapl/static/sapl/frontend/js/skins/ui/oxide/content.inline.js.gz
  66. BIN
      sapl/static/sapl/frontend/js/skins/ui/oxide/content.inline.min.css.gz
  67. BIN
      sapl/static/sapl/frontend/js/skins/ui/oxide/content.js.gz
  68. BIN
      sapl/static/sapl/frontend/js/skins/ui/oxide/content.min.css.gz
  69. BIN
      sapl/static/sapl/frontend/js/skins/ui/oxide/skin.css.gz
  70. BIN
      sapl/static/sapl/frontend/js/skins/ui/oxide/skin.js.gz
  71. BIN
      sapl/static/sapl/frontend/js/skins/ui/oxide/skin.min.css.gz
  72. BIN
      sapl/static/sapl/frontend/js/skins/ui/oxide/skin.shadowdom.css.gz
  73. BIN
      sapl/static/sapl/frontend/js/skins/ui/oxide/skin.shadowdom.js.gz
  74. BIN
      sapl/static/sapl/frontend/js/skins/ui/oxide/skin.shadowdom.min.css.gz
  75. BIN
      sapl/static/sapl/frontend/js/skins/ui/tinymce-5-dark/content.css.gz
  76. BIN
      sapl/static/sapl/frontend/js/skins/ui/tinymce-5-dark/content.inline.css.gz
  77. BIN
      sapl/static/sapl/frontend/js/skins/ui/tinymce-5-dark/content.inline.js.gz
  78. BIN
      sapl/static/sapl/frontend/js/skins/ui/tinymce-5-dark/content.inline.min.css.gz
  79. BIN
      sapl/static/sapl/frontend/js/skins/ui/tinymce-5-dark/content.js.gz
  80. BIN
      sapl/static/sapl/frontend/js/skins/ui/tinymce-5-dark/content.min.css.gz
  81. BIN
      sapl/static/sapl/frontend/js/skins/ui/tinymce-5-dark/skin.css.gz
  82. BIN
      sapl/static/sapl/frontend/js/skins/ui/tinymce-5-dark/skin.js.gz
  83. BIN
      sapl/static/sapl/frontend/js/skins/ui/tinymce-5-dark/skin.min.css.gz
  84. BIN
      sapl/static/sapl/frontend/js/skins/ui/tinymce-5-dark/skin.shadowdom.css.gz
  85. BIN
      sapl/static/sapl/frontend/js/skins/ui/tinymce-5-dark/skin.shadowdom.js.gz
  86. BIN
      sapl/static/sapl/frontend/js/skins/ui/tinymce-5-dark/skin.shadowdom.min.css.gz
  87. BIN
      sapl/static/sapl/frontend/js/skins/ui/tinymce-5/content.css.gz
  88. BIN
      sapl/static/sapl/frontend/js/skins/ui/tinymce-5/content.inline.css.gz
  89. BIN
      sapl/static/sapl/frontend/js/skins/ui/tinymce-5/content.inline.js.gz
  90. BIN
      sapl/static/sapl/frontend/js/skins/ui/tinymce-5/content.inline.min.css.gz
  91. BIN
      sapl/static/sapl/frontend/js/skins/ui/tinymce-5/content.js.gz
  92. BIN
      sapl/static/sapl/frontend/js/skins/ui/tinymce-5/content.min.css.gz
  93. BIN
      sapl/static/sapl/frontend/js/skins/ui/tinymce-5/skin.css.gz
  94. BIN
      sapl/static/sapl/frontend/js/skins/ui/tinymce-5/skin.js.gz
  95. BIN
      sapl/static/sapl/frontend/js/skins/ui/tinymce-5/skin.min.css.gz
  96. BIN
      sapl/static/sapl/frontend/js/skins/ui/tinymce-5/skin.shadowdom.css.gz
  97. BIN
      sapl/static/sapl/frontend/js/skins/ui/tinymce-5/skin.shadowdom.js.gz
  98. BIN
      sapl/static/sapl/frontend/js/skins/ui/tinymce-5/skin.shadowdom.min.css.gz
  99. 2
      sapl/templates/crud/detail.html
  100. 2
      sapl/templates/crud/detail_detail.html

12
drfautoapi/drfautoapi.py

@ -219,6 +219,17 @@ class ApiViewSetConstrutor():
class ApiViewSet(ModelViewSet):
filter_backends = (DjangoFilterBackend,)
class LastModifiedDecorator(object):
def __init__(self):
pass
def __call__(self, cls):
return cls
@classmethod
def last_modified_class(cls, klass):
cls.LastModifiedDecorator = klass
return cls
@classmethod
def get_viewset_for_model(cls, model):
return cls._built_sets[model._meta.app_config][model]
@ -334,6 +345,7 @@ class ApiViewSetConstrutor():
if not hasattr(_meta_filterset, 'model'):
model = _model
@cls.LastModifiedDecorator()
class ModelApiViewSet(ApiViewSetConstrutor.ApiViewSet):
queryset = _model.objects.all()
filterset_class = ApiFilterSet

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

@ -3,6 +3,12 @@ import Vue from 'vue'
import { FormSelectPlugin } from 'bootstrap-vue'
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.xsrfHeaderName = 'X-CSRFToken'

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

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

90
frontend/webpack-stats.json

@ -271,25 +271,25 @@
"path": "/home/leandrojatai/desenvolvimento/envs/sapl/sapl/static/sapl/frontend/img/user.png",
"publicPath": "/static/sapl/frontend/img/user.png"
},
"js/chunk-vendors.e8ab4373.js": {
"name": "js/chunk-vendors.e8ab4373.js",
"path": "/home/leandrojatai/desenvolvimento/envs/sapl/sapl/static/sapl/frontend/js/chunk-vendors.e8ab4373.js",
"publicPath": "/static/sapl/frontend/js/chunk-vendors.e8ab4373.js"
},
"js/chunk-vendors.e8ab4373.js.gz": {
"name": "js/chunk-vendors.e8ab4373.js.gz",
"path": "/home/leandrojatai/desenvolvimento/envs/sapl/sapl/static/sapl/frontend/js/chunk-vendors.e8ab4373.js.gz",
"publicPath": "/static/sapl/frontend/js/chunk-vendors.e8ab4373.js.gz"
},
"js/chunk-vendors.e8ab4373.js.LICENSE.txt": {
"name": "js/chunk-vendors.e8ab4373.js.LICENSE.txt",
"path": "/home/leandrojatai/desenvolvimento/envs/sapl/sapl/static/sapl/frontend/js/chunk-vendors.e8ab4373.js.LICENSE.txt",
"publicPath": "/static/sapl/frontend/js/chunk-vendors.e8ab4373.js.LICENSE.txt"
},
"js/chunk-vendors.e8ab4373.js.LICENSE.txt.gz": {
"name": "js/chunk-vendors.e8ab4373.js.LICENSE.txt.gz",
"path": "/home/leandrojatai/desenvolvimento/envs/sapl/sapl/static/sapl/frontend/js/chunk-vendors.e8ab4373.js.LICENSE.txt.gz",
"publicPath": "/static/sapl/frontend/js/chunk-vendors.e8ab4373.js.LICENSE.txt.gz"
"js/chunk-vendors.f2d6067d.js": {
"name": "js/chunk-vendors.f2d6067d.js",
"path": "/home/leandrojatai/desenvolvimento/envs/sapl/sapl/static/sapl/frontend/js/chunk-vendors.f2d6067d.js",
"publicPath": "/static/sapl/frontend/js/chunk-vendors.f2d6067d.js"
},
"js/chunk-vendors.f2d6067d.js.gz": {
"name": "js/chunk-vendors.f2d6067d.js.gz",
"path": "/home/leandrojatai/desenvolvimento/envs/sapl/sapl/static/sapl/frontend/js/chunk-vendors.f2d6067d.js.gz",
"publicPath": "/static/sapl/frontend/js/chunk-vendors.f2d6067d.js.gz"
},
"js/chunk-vendors.f2d6067d.js.LICENSE.txt": {
"name": "js/chunk-vendors.f2d6067d.js.LICENSE.txt",
"path": "/home/leandrojatai/desenvolvimento/envs/sapl/sapl/static/sapl/frontend/js/chunk-vendors.f2d6067d.js.LICENSE.txt",
"publicPath": "/static/sapl/frontend/js/chunk-vendors.f2d6067d.js.LICENSE.txt"
},
"js/chunk-vendors.f2d6067d.js.LICENSE.txt.gz": {
"name": "js/chunk-vendors.f2d6067d.js.LICENSE.txt.gz",
"path": "/home/leandrojatai/desenvolvimento/envs/sapl/sapl/static/sapl/frontend/js/chunk-vendors.f2d6067d.js.LICENSE.txt.gz",
"publicPath": "/static/sapl/frontend/js/chunk-vendors.f2d6067d.js.LICENSE.txt.gz"
},
"js/compilacao.148cb66b.js": {
"name": "js/compilacao.148cb66b.js",
@ -301,20 +301,20 @@
"path": "/home/leandrojatai/desenvolvimento/envs/sapl/sapl/static/sapl/frontend/js/compilacao.148cb66b.js.gz",
"publicPath": "/static/sapl/frontend/js/compilacao.148cb66b.js.gz"
},
"js/global.bb3e904b.js": {
"name": "js/global.bb3e904b.js",
"path": "/home/leandrojatai/desenvolvimento/envs/sapl/sapl/static/sapl/frontend/js/global.bb3e904b.js",
"publicPath": "/static/sapl/frontend/js/global.bb3e904b.js"
"js/global.d557d20c.js": {
"name": "js/global.d557d20c.js",
"path": "/home/leandrojatai/desenvolvimento/envs/sapl/sapl/static/sapl/frontend/js/global.d557d20c.js",
"publicPath": "/static/sapl/frontend/js/global.d557d20c.js"
},
"js/global.bb3e904b.js.gz": {
"name": "js/global.bb3e904b.js.gz",
"path": "/home/leandrojatai/desenvolvimento/envs/sapl/sapl/static/sapl/frontend/js/global.bb3e904b.js.gz",
"publicPath": "/static/sapl/frontend/js/global.bb3e904b.js.gz"
"js/global.d557d20c.js.gz": {
"name": "js/global.d557d20c.js.gz",
"path": "/home/leandrojatai/desenvolvimento/envs/sapl/sapl/static/sapl/frontend/js/global.d557d20c.js.gz",
"publicPath": "/static/sapl/frontend/js/global.d557d20c.js.gz"
},
"js/global.bb3e904b.js.LICENSE.txt": {
"name": "js/global.bb3e904b.js.LICENSE.txt",
"path": "/home/leandrojatai/desenvolvimento/envs/sapl/sapl/static/sapl/frontend/js/global.bb3e904b.js.LICENSE.txt",
"publicPath": "/static/sapl/frontend/js/global.bb3e904b.js.LICENSE.txt"
"js/global.d557d20c.js.LICENSE.txt": {
"name": "js/global.d557d20c.js.LICENSE.txt",
"path": "/home/leandrojatai/desenvolvimento/envs/sapl/sapl/static/sapl/frontend/js/global.d557d20c.js.LICENSE.txt",
"publicPath": "/static/sapl/frontend/js/global.d557d20c.js.LICENSE.txt"
},
"js/painel.f3190acc.js": {
"name": "js/painel.f3190acc.js",
@ -326,15 +326,15 @@
"path": "/home/leandrojatai/desenvolvimento/envs/sapl/sapl/static/sapl/frontend/js/painel.f3190acc.js.gz",
"publicPath": "/static/sapl/frontend/js/painel.f3190acc.js.gz"
},
"js/parlamentar.a1a4b65b.js": {
"name": "js/parlamentar.a1a4b65b.js",
"path": "/home/leandrojatai/desenvolvimento/envs/sapl/sapl/static/sapl/frontend/js/parlamentar.a1a4b65b.js",
"publicPath": "/static/sapl/frontend/js/parlamentar.a1a4b65b.js"
"js/parlamentar.f63027a7.js": {
"name": "js/parlamentar.f63027a7.js",
"path": "/home/leandrojatai/desenvolvimento/envs/sapl/sapl/static/sapl/frontend/js/parlamentar.f63027a7.js",
"publicPath": "/static/sapl/frontend/js/parlamentar.f63027a7.js"
},
"js/parlamentar.a1a4b65b.js.gz": {
"name": "js/parlamentar.a1a4b65b.js.gz",
"path": "/home/leandrojatai/desenvolvimento/envs/sapl/sapl/static/sapl/frontend/js/parlamentar.a1a4b65b.js.gz",
"publicPath": "/static/sapl/frontend/js/parlamentar.a1a4b65b.js.gz"
"js/parlamentar.f63027a7.js.gz": {
"name": "js/parlamentar.f63027a7.js.gz",
"path": "/home/leandrojatai/desenvolvimento/envs/sapl/sapl/static/sapl/frontend/js/parlamentar.f63027a7.js.gz",
"publicPath": "/static/sapl/frontend/js/parlamentar.f63027a7.js.gz"
},
"js/skins/content/dark/content.css": {
"name": "js/skins/content/dark/content.css",
@ -1000,27 +1000,27 @@
"chunks": {
"compilacao": [
"css/chunk-vendors.045ec640.css",
"js/chunk-vendors.e8ab4373.js",
"js/chunk-vendors.f2d6067d.js",
"css/compilacao.0baf3580.css",
"js/compilacao.148cb66b.js"
],
"global": [
"css/chunk-vendors.045ec640.css",
"js/chunk-vendors.e8ab4373.js",
"js/chunk-vendors.f2d6067d.js",
"css/global.042f6737.css",
"js/global.bb3e904b.js"
"js/global.d557d20c.js"
],
"painel": [
"css/chunk-vendors.045ec640.css",
"js/chunk-vendors.e8ab4373.js",
"js/chunk-vendors.f2d6067d.js",
"css/painel.e2b9504e.css",
"js/painel.f3190acc.js"
],
"parlamentar": [
"css/chunk-vendors.045ec640.css",
"js/chunk-vendors.e8ab4373.js",
"js/chunk-vendors.f2d6067d.js",
"css/parlamentar.cd5dc5a8.css",
"js/parlamentar.a1a4b65b.js"
"js/parlamentar.f63027a7.js"
]
},
"publicPath": "/static/sapl/frontend/"

129
sapl/api/views.py

@ -9,6 +9,9 @@ from rest_framework.response import Response
from rest_framework.views import APIView
from drfautoapi.drfautoapi import ApiViewSetConstrutor
from django.views.decorators.http import condition as django_condition
from sapl.base.models import AuditLog
logger = logging.getLogger(__name__)
@ -21,8 +24,122 @@ def recria_token(request, pk):
return Response({"message": "Token recriado com sucesso!", "token": token.key})
class LastModifiedDecorator:
""" - Decorator para adicionar suporte a Last-Modified em ViewSets
- Baseado em django.views.decorators.http.condition
- Por padrão utiliza o AuditLog para determinar a data do last_modified
- Pode ser sobrescrito na customização do ViewSet caso necessário
- Existe um exemplo de sobrescrita em sapl/api/views_materia.py
- Devolve Last-Modified baseado no timestamp do último AuditLog
- Se for uma listagem, considera o último AuditLog de todos os objetos
retornados na listagem levando em consideração resultado de FilterSet.
- Retorna 304 Not Modified se o recurso não foi modificado
"""
def __call__(self, cls):
original_dispatch = cls.dispatch
self.model = cls.queryset.model
def wrapped_dispatch(view, request, *args, **kwargs):
drf_request = request
wsgi_request = view.initialize_request(request, *args, **kwargs)
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):
return original_dispatch(view, drf_request, *args, **kwargs)
django_decorator = django_condition(last_modified_func=last_modified_func)
decorated_viewset_method = django_decorator(patched_viewset_method)
return decorated_viewset_method(wsgi_request, *args, view=view, **kwargs)
cls.dispatch = wrapped_dispatch
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
"""
try:
if 'pk' in kwargs:
obj_id = kwargs['pk']
last_log = AuditLog.objects.filter(
model_name=self.model._meta.model_name,
object_id=obj_id
).order_by('-timestamp').values_list('timestamp', flat=True)[:1].first()
else:
view = kwargs.get('view', None)
if view:
for backend in list(view.filter_backends):
queryset = backend().filter_queryset(request, view.queryset, view)
if queryset.exists():
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)[: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)[:1].first()
if last_log:
return last_log
except Exception as e:
logger.error(f"Erro ao obter last_modified: {e}")
return None
SaplApiViewSetConstrutor = ApiViewSetConstrutor
SaplApiViewSetConstrutor.last_modified_class(LastModifiedDecorator)
SaplApiViewSetConstrutor.import_modules([
'sapl.api.views_audiencia',
'sapl.api.views_base',
@ -39,7 +156,7 @@ SaplApiViewSetConstrutor.import_modules([
"""
1. ApiViewSetConstrutor constroi uma rest_framework.viewsets.ModelViewSet
para todos os models de todas as app_configs passadas no list
para todos os models de todas as app_configs passadas no list
2. Define DjangoFilterBackend como ferramenta de filtro dos campos
3. Define Serializer como a seguir:
3.1 - Define um Serializer genérico para cada módel
@ -47,7 +164,7 @@ SaplApiViewSetConstrutor.import_modules([
recupera Serializer customizados no módulo DEFAULT_SERIALIZER_MODULE
3.2 - Para todo model é opcional a existência de {model}Serializer.
Caso não seja definido um Serializer customizado, utiliza-se o genérico
3.3 - Caso exista GLOBAL_SERIALIZER_MIXIN definido,
3.3 - Caso exista GLOBAL_SERIALIZER_MIXIN definido,
utiliza este Serializer para construir o genérico de 3.1
4. Define um FilterSet como a seguir:
4.1 - Define um FilterSet genérico para cada módel
@ -55,13 +172,13 @@ SaplApiViewSetConstrutor.import_modules([
recupera o FilterSet customizado no módulo DEFAULT_FILTER_MODULE
4.2 - Para todo model é opcional a existência de {model}FilterSet.
Caso não seja definido um FilterSet customizado, utiliza-se o genérico
4.3 - Caso exista GLOBAL_FILTERSET_MIXIN definido,
4.3 - Caso exista GLOBAL_FILTERSET_MIXIN definido,
utiliza este FilterSet para construir o genérico de 4.1
4.4 - Caso não exista GLOBAL_FILTERSET_MIXIN, será aplicado
4.4 - Caso não exista GLOBAL_FILTERSET_MIXIN, será aplicado
drfautoapi.drjautoapi.ApiFilterSetMixin que inclui parametro para:
- order_by: através do parâmetro "o"
- amplia os lookups aceitos pelo FilterSet default
para os aceitos pelo django sem a necessidade de criar
- amplia os lookups aceitos pelo FilterSet default
para os aceitos pelo django sem a necessidade de criar
fields específicos em um FilterSet customizado.
5. ApiViewSetConstrutor não cria padrões e/ou exige conhecimento alem dos

19
sapl/api/views_materia.py

@ -110,6 +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)[: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)[:1].first()
return timestamp
"""
@customize(TipoMateriaLegislativa)
class _TipoMateriaLegislativaViewSet:

BIN
sapl/static/sapl/frontend/css/chunk-vendors.045ec640.css.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/css/compilacao.0baf3580.css.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/css/global.042f6737.css.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/css/painel.e2b9504e.css.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/fonts/fa-brands-400.5d18d427.ttf.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/fonts/fa-regular-400.81482cd4.ttf.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/fonts/fa-solid-900.69d3141a.ttf.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/fonts/fa-v4compatibility.2c070fd2.ttf.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/img/down_arrow_select.jpg.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/chunk-vendors.e8ab4373.js.LICENSE.txt.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/chunk-vendors.e8ab4373.js.gz

Binary file not shown.

4
sapl/static/sapl/frontend/js/chunk-vendors.e8ab4373.js → sapl/static/sapl/frontend/js/chunk-vendors.f2d6067d.js

File diff suppressed because one or more lines are too long

0
sapl/static/sapl/frontend/js/chunk-vendors.e8ab4373.js.LICENSE.txt → sapl/static/sapl/frontend/js/chunk-vendors.f2d6067d.js.LICENSE.txt

BIN
sapl/static/sapl/frontend/js/chunk-vendors.f2d6067d.js.LICENSE.txt.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/chunk-vendors.f2d6067d.js.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/compilacao.148cb66b.js.gz

Binary file not shown.

2
sapl/static/sapl/frontend/js/global.bb3e904b.js

File diff suppressed because one or more lines are too long

BIN
sapl/static/sapl/frontend/js/global.bb3e904b.js.gz

Binary file not shown.

2
sapl/static/sapl/frontend/js/global.d557d20c.js

File diff suppressed because one or more lines are too long

0
sapl/static/sapl/frontend/js/global.bb3e904b.js.LICENSE.txt → sapl/static/sapl/frontend/js/global.d557d20c.js.LICENSE.txt

BIN
sapl/static/sapl/frontend/js/global.d557d20c.js.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/painel.f3190acc.js.gz

Binary file not shown.

1
sapl/static/sapl/frontend/js/parlamentar.a1a4b65b.js

@ -1 +0,0 @@
(()=>{"use strict";var u,p,e,t={8020:(e,a,t)=>{t(3792),t(3362),t(9085),t(9391),t(6918),t(2008),t(2712),t(3288),t(6099),t(8781);var r=t(2893),i=t(8246),s=t(7906),n=t(2543);s.A.defaults.xsrfCookieName="csrftoken",s.A.defaults.xsrfHeaderName="X-CSRFToken",r.Ay.use(i.m0),new r.Ay({delimiters:["[[","]]"],el:"#app2",data:function(){return{nome_pesquisa:"",is_pesquisa:!1,legislatura_selecionada:"",legislaturas:[],parlamentares:[],visible_parlamentares:[],size_parlamentares:0,filter_ativo:!0,filter_titular:""}},watch:{nome_pesquisa:function(e){this.debouncepesquisaParlamentar()}},created:function(){this.debouncepesquisaParlamentar=n.debounce(this.pesquisaParlamentar,500)},methods:{getParlamentares:function(e){var a=this;!this.legislatura_selecionada&&"0"!==this.legislatura_selecionada.toString()||s.A.get("/api/parlamentares/legislatura/"+this.legislatura_selecionada+"/parlamentares/?get_all=true").then(function(e){a.parlamentares=e.data,a.visible_parlamentares=a.parlamentares,a.size_parlamentares=a.visible_parlamentares.length,a.checkTitularAtivo()}).catch(function(e){console.error("Ocorreu um erro ao obter os dados de parlamentares:"+e)})},pesquisaParlamentar:function(e){var a=this;s.A.get("/api/parlamentares/parlamentar/search_parlamentares/",{params:{nome_parlamentar:this.nome_pesquisa}}).then(function(e){a.parlamentares=e.data,a.visible_parlamentares=a.parlamentares,a.size_parlamentares=a.visible_parlamentares.length}).catch(function(e){console.error("Erro ao procurar parlamentar:"+e)})},checkTitularAtivo:function(e){this.visible_parlamentares=this.parlamentares,this.filter_ativo&&(this.visible_parlamentares=this.visible_parlamentares.filter(function(e){return e.ativo})),this.filter_titular&&(this.visible_parlamentares=this.visible_parlamentares.filter(function(e){return"Sim"===e.titular})),this.size_parlamentares=this.visible_parlamentares.length},pesquisaChange:function(e){this.is_pesquisa=!this.is_pesquisa,this.filter_ativo=!0,this.is_pesquisa?this.parlamentares=[]:this.getParlamentares()}},mounted:function(){var a=this;s.A.get("/api/parlamentares/legislatura/?get_all=true").then(function(e){a.legislaturas=e.data;var i=(new Date).getFullYear();a.legislatura_selecionada=a.legislaturas.reduce(function(e,a){var t=new Date(a.data_inicio+" 00:00").getFullYear(),r=new Date(a.data_fim+" 00:00").getFullYear();return e=t<=i&&i<=r?a.id:e},"")}).then(function(e){a.getParlamentares()}).catch(function(e){console.error("Ocorreu um erro ao obter os dados de legislação: "+e)})}})}},r={};function c(e){var a=r[e];return void 0!==a||(a=r[e]={id:e,loaded:!1,exports:{}},t[e].call(a.exports,a,a.exports,c),a.loaded=!0),a.exports}c.m=t,u=[],c.O=(e,a,t,r)=>{if(!a){for(var i=1/0,s=0;s<u.length;s++){for(var n,[a,t,r]=u[s],l=!0,o=0;o<a.length;o++)(!1&r||r<=i)&&Object.keys(c.O).every(e=>c.O[e](a[o]))?a.splice(o--,1):(l=!1,r<i&&(i=r));l&&(u.splice(s--,1),void 0!==(n=t()))&&(e=n)}return e}r=r||0;for(var s=u.length;0<s&&u[s-1][2]>r;s--)u[s]=u[s-1];u[s]=[a,t,r]},c.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return c.d(a,{a:a}),a},c.d=(e,a)=>{for(var t in a)c.o(a,t)&&!c.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:a[t]})},c.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),c.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),c.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},c.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),c.j=788,p={788:0},c.O.j=e=>0===p[e],a=(e,a)=>{var t,r,i,[s,n,l]=a,o=0;if(s.some(e=>0!==p[e])){for(t in n)c.o(n,t)&&(c.m[t]=n[t]);l&&(i=l(c))}for(e&&e(a);o<s.length;o++)r=s[o],c.o(p,r)&&p[r]&&p[r][0](),p[r]=0;return c.O(i)},(e=self.webpackChunksapl_frontend=self.webpackChunksapl_frontend||[]).forEach(a.bind(null,0)),e.push=a.bind(null,e.push.bind(e));var a=c.O(void 0,[504],()=>c(8020));c.O(a)})();

BIN
sapl/static/sapl/frontend/js/parlamentar.a1a4b65b.js.gz

Binary file not shown.

1
sapl/static/sapl/frontend/js/parlamentar.f63027a7.js

@ -0,0 +1 @@
(()=>{"use strict";var u,c,e,t={8020:(e,a,t)=>{t(3792),t(3362),t(9085),t(9391),t(6918),t(2008),t(2712),t(3288),t(6099),t(8781);var r=t(2893),s=t(8246),i=t(7906),n=t(2543);i.A.defaults.headers.get["Cache-Control"]="no-cache, no-store, must-revalidate",i.A.defaults.headers.get.Pragma="no-cache",i.A.defaults.headers.get.Expires="0",i.A.defaults.xsrfCookieName="csrftoken",i.A.defaults.xsrfHeaderName="X-CSRFToken",r.Ay.use(s.m0),new r.Ay({delimiters:["[[","]]"],el:"#app2",data:function(){return{nome_pesquisa:"",is_pesquisa:!1,legislatura_selecionada:"",legislaturas:[],parlamentares:[],visible_parlamentares:[],size_parlamentares:0,filter_ativo:!0,filter_titular:""}},watch:{nome_pesquisa:function(e){this.debouncepesquisaParlamentar()}},created:function(){this.debouncepesquisaParlamentar=n.debounce(this.pesquisaParlamentar,500)},methods:{getParlamentares:function(e){var a=this;!this.legislatura_selecionada&&"0"!==this.legislatura_selecionada.toString()||i.A.get("/api/parlamentares/legislatura/"+this.legislatura_selecionada+"/parlamentares/?get_all=true").then(function(e){a.parlamentares=e.data,a.visible_parlamentares=a.parlamentares,a.size_parlamentares=a.visible_parlamentares.length,a.checkTitularAtivo()}).catch(function(e){console.error("Ocorreu um erro ao obter os dados de parlamentares:"+e)})},pesquisaParlamentar:function(e){var a=this;i.A.get("/api/parlamentares/parlamentar/search_parlamentares/",{params:{nome_parlamentar:this.nome_pesquisa}}).then(function(e){a.parlamentares=e.data,a.visible_parlamentares=a.parlamentares,a.size_parlamentares=a.visible_parlamentares.length}).catch(function(e){console.error("Erro ao procurar parlamentar:"+e)})},checkTitularAtivo:function(e){this.visible_parlamentares=this.parlamentares,this.filter_ativo&&(this.visible_parlamentares=this.visible_parlamentares.filter(function(e){return e.ativo})),this.filter_titular&&(this.visible_parlamentares=this.visible_parlamentares.filter(function(e){return"Sim"===e.titular})),this.size_parlamentares=this.visible_parlamentares.length},pesquisaChange:function(e){this.is_pesquisa=!this.is_pesquisa,this.filter_ativo=!0,this.is_pesquisa?this.parlamentares=[]:this.getParlamentares()}},mounted:function(){var a=this;i.A.get("/api/parlamentares/legislatura/?get_all=true").then(function(e){a.legislaturas=e.data;var s=(new Date).getFullYear();a.legislatura_selecionada=a.legislaturas.reduce(function(e,a){var t=new Date(a.data_inicio+" 00:00").getFullYear(),r=new Date(a.data_fim+" 00:00").getFullYear();return e=t<=s&&s<=r?a.id:e},"")}).then(function(e){a.getParlamentares()}).catch(function(e){console.error("Ocorreu um erro ao obter os dados de legislação: "+e)})}})}},r={};function p(e){var a=r[e];return void 0!==a||(a=r[e]={id:e,loaded:!1,exports:{}},t[e].call(a.exports,a,a.exports,p),a.loaded=!0),a.exports}p.m=t,u=[],p.O=(e,a,t,r)=>{if(!a){for(var s=1/0,i=0;i<u.length;i++){for(var n,[a,t,r]=u[i],l=!0,o=0;o<a.length;o++)(!1&r||r<=s)&&Object.keys(p.O).every(e=>p.O[e](a[o]))?a.splice(o--,1):(l=!1,r<s&&(s=r));l&&(u.splice(i--,1),void 0!==(n=t()))&&(e=n)}return e}r=r||0;for(var i=u.length;0<i&&u[i-1][2]>r;i--)u[i]=u[i-1];u[i]=[a,t,r]},p.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return p.d(a,{a:a}),a},p.d=(e,a)=>{for(var t in a)p.o(a,t)&&!p.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:a[t]})},p.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),p.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),p.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},p.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),p.j=788,c={788:0},p.O.j=e=>0===c[e],a=(e,a)=>{var t,r,s,[i,n,l]=a,o=0;if(i.some(e=>0!==c[e])){for(t in n)p.o(n,t)&&(p.m[t]=n[t]);l&&(s=l(p))}for(e&&e(a);o<i.length;o++)r=i[o],p.o(c,r)&&c[r]&&c[r][0](),c[r]=0;return p.O(s)},(e=self.webpackChunksapl_frontend=self.webpackChunksapl_frontend||[]).forEach(a.bind(null,0)),e.push=a.bind(null,e.push.bind(e));var a=p.O(void 0,[504],()=>p(8020));p.O(a)})();

BIN
sapl/static/sapl/frontend/js/parlamentar.f63027a7.js.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/content/dark/content.css.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/content/dark/content.js.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/content/dark/content.min.css.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/content/default/content.css.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/content/default/content.js.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/content/default/content.min.css.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/content/document/content.css.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/content/document/content.js.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/content/document/content.min.css.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/content/tinymce-5-dark/content.css.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/content/tinymce-5-dark/content.js.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/content/tinymce-5-dark/content.min.css.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/content/tinymce-5/content.css.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/content/tinymce-5/content.js.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/content/tinymce-5/content.min.css.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/content/writer/content.css.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/content/writer/content.js.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/content/writer/content.min.css.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/ui/oxide-dark/content.css.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/ui/oxide-dark/content.inline.css.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/ui/oxide-dark/content.inline.js.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/ui/oxide-dark/content.inline.min.css.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/ui/oxide-dark/content.js.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/ui/oxide-dark/content.min.css.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/ui/oxide-dark/skin.css.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/ui/oxide-dark/skin.js.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/ui/oxide-dark/skin.min.css.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/ui/oxide-dark/skin.shadowdom.css.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/ui/oxide-dark/skin.shadowdom.js.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/ui/oxide-dark/skin.shadowdom.min.css.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/ui/oxide/content.css.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/ui/oxide/content.inline.css.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/ui/oxide/content.inline.js.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/ui/oxide/content.inline.min.css.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/ui/oxide/content.js.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/ui/oxide/content.min.css.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/ui/oxide/skin.css.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/ui/oxide/skin.js.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/ui/oxide/skin.min.css.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/ui/oxide/skin.shadowdom.css.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/ui/oxide/skin.shadowdom.js.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/ui/oxide/skin.shadowdom.min.css.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/ui/tinymce-5-dark/content.css.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/ui/tinymce-5-dark/content.inline.css.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/ui/tinymce-5-dark/content.inline.js.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/ui/tinymce-5-dark/content.inline.min.css.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/ui/tinymce-5-dark/content.js.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/ui/tinymce-5-dark/content.min.css.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/ui/tinymce-5-dark/skin.css.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/ui/tinymce-5-dark/skin.js.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/ui/tinymce-5-dark/skin.min.css.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/ui/tinymce-5-dark/skin.shadowdom.css.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/ui/tinymce-5-dark/skin.shadowdom.js.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/ui/tinymce-5-dark/skin.shadowdom.min.css.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/ui/tinymce-5/content.css.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/ui/tinymce-5/content.inline.css.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/ui/tinymce-5/content.inline.js.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/ui/tinymce-5/content.inline.min.css.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/ui/tinymce-5/content.js.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/ui/tinymce-5/content.min.css.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/ui/tinymce-5/skin.css.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/ui/tinymce-5/skin.js.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/ui/tinymce-5/skin.min.css.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/ui/tinymce-5/skin.shadowdom.css.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/ui/tinymce-5/skin.shadowdom.js.gz

Binary file not shown.

BIN
sapl/static/sapl/frontend/js/skins/ui/tinymce-5/skin.shadowdom.min.css.gz

Binary file not shown.

2
sapl/templates/crud/detail.html

@ -104,7 +104,7 @@
{% if view.openapi_url %}
<div class="container justify-content-end d-flex">
<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">
{% trans 'OpenAPI' %}
</small>

2
sapl/templates/crud/detail_detail.html

@ -67,7 +67,7 @@
{% if view.openapi_url %}
<div class="container justify-content-end d-flex">
<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">
{% trans 'OpenAPI' %}
</small>

Loading…
Cancel
Save