django-smartbase-admin 0.2.84__py3-none-any.whl → 0.2.86__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- django_smartbase_admin/actions/admin_action_list.py +9 -5
- django_smartbase_admin/admin/admin_base.py +50 -41
- django_smartbase_admin/admin/widgets.py +2 -0
- django_smartbase_admin/engine/admin_base_view.py +71 -59
- django_smartbase_admin/static/sb_admin/dist/main_style.css +1 -1
- django_smartbase_admin/static/sb_admin/src/css/_inlines.css +11 -7
- django_smartbase_admin/templates/sb_admin/inlines/stacked_inline.html +19 -13
- {django_smartbase_admin-0.2.84.dist-info → django_smartbase_admin-0.2.86.dist-info}/METADATA +1 -1
- {django_smartbase_admin-0.2.84.dist-info → django_smartbase_admin-0.2.86.dist-info}/RECORD +11 -11
- {django_smartbase_admin-0.2.84.dist-info → django_smartbase_admin-0.2.86.dist-info}/LICENSE.md +0 -0
- {django_smartbase_admin-0.2.84.dist-info → django_smartbase_admin-0.2.86.dist-info}/WHEEL +0 -0
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import json
|
|
2
2
|
import urllib.parse
|
|
3
3
|
from collections import defaultdict
|
|
4
|
+
from collections.abc import Iterable
|
|
5
|
+
from typing import Any
|
|
4
6
|
|
|
5
7
|
from django.contrib import messages
|
|
6
8
|
from django.contrib.admin.actions import delete_selected
|
|
@@ -54,34 +56,34 @@ class SBAdminBaseView(object):
|
|
|
54
56
|
def get_id(self):
|
|
55
57
|
raise NotImplementedError
|
|
56
58
|
|
|
57
|
-
def get_menu_label(self):
|
|
59
|
+
def get_menu_label(self) -> str:
|
|
58
60
|
return self.menu_label or self.model._meta.verbose_name_plural
|
|
59
61
|
|
|
60
|
-
def has_permission(self, request, obj=None, permission=None):
|
|
62
|
+
def has_permission(self, request, obj=None, permission=None) -> bool:
|
|
61
63
|
return SBAdminViewService.has_permission(
|
|
62
64
|
request=request, view=self, model=self.model, obj=obj, permission=permission
|
|
63
65
|
)
|
|
64
66
|
|
|
65
|
-
def has_add_permission(self, request, obj=None):
|
|
67
|
+
def has_add_permission(self, request, obj=None) -> bool:
|
|
66
68
|
return self.has_permission(request, obj, "add")
|
|
67
69
|
|
|
68
|
-
def has_view_permission(self, request, obj=None):
|
|
70
|
+
def has_view_permission(self, request, obj=None) -> bool:
|
|
69
71
|
return self.has_permission(request, obj, "view")
|
|
70
72
|
|
|
71
|
-
def has_change_permission(self, request, obj=None):
|
|
73
|
+
def has_change_permission(self, request, obj=None) -> bool:
|
|
72
74
|
return self.has_permission(request, obj, "change")
|
|
73
75
|
|
|
74
|
-
def has_delete_permission(self, request, obj=None):
|
|
76
|
+
def has_delete_permission(self, request, obj=None) -> bool:
|
|
75
77
|
return self.has_permission(request, obj, "delete")
|
|
76
78
|
|
|
77
|
-
def has_permission_for_action(self, request, action):
|
|
79
|
+
def has_permission_for_action(self, request, action: SBAdminCustomAction) -> bool:
|
|
78
80
|
return self.has_permission(
|
|
79
81
|
request=request,
|
|
80
82
|
obj=None,
|
|
81
83
|
permission=action,
|
|
82
84
|
)
|
|
83
85
|
|
|
84
|
-
def has_view_or_change_permission(self, request, obj=None):
|
|
86
|
+
def has_view_or_change_permission(self, request, obj=None) -> bool:
|
|
85
87
|
return self.has_view_permission(request, obj) or self.has_change_permission(
|
|
86
88
|
request, obj
|
|
87
89
|
)
|
|
@@ -92,7 +94,9 @@ class SBAdminBaseView(object):
|
|
|
92
94
|
|
|
93
95
|
return inner_view
|
|
94
96
|
|
|
95
|
-
def process_actions(
|
|
97
|
+
def process_actions(
|
|
98
|
+
self, request, actions: list[SBAdminCustomAction]
|
|
99
|
+
) -> list[SBAdminCustomAction]:
|
|
96
100
|
processed_actions = self.process_actions_permissions(request, actions)
|
|
97
101
|
for processed_action in processed_actions:
|
|
98
102
|
if isinstance(processed_action, SBAdminFormViewAction):
|
|
@@ -107,7 +111,9 @@ class SBAdminBaseView(object):
|
|
|
107
111
|
|
|
108
112
|
return processed_actions
|
|
109
113
|
|
|
110
|
-
def process_actions_permissions(
|
|
114
|
+
def process_actions_permissions(
|
|
115
|
+
self, request, actions: list[SBAdminCustomAction]
|
|
116
|
+
) -> list[SBAdminCustomAction]:
|
|
111
117
|
result = []
|
|
112
118
|
for action in actions:
|
|
113
119
|
if self.has_permission_for_action(request, action):
|
|
@@ -173,7 +179,7 @@ class SBAdminBaseView(object):
|
|
|
173
179
|
field.model_field = model_field
|
|
174
180
|
return field
|
|
175
181
|
|
|
176
|
-
def get_username_data(self, request):
|
|
182
|
+
def get_username_data(self, request) -> dict[str, Any]:
|
|
177
183
|
if request.request_data.user.first_name and request.request_data.user.last_name:
|
|
178
184
|
return {
|
|
179
185
|
"full_name": f"{request.request_data.user.first_name} {request.request_data.user.last_name}",
|
|
@@ -184,10 +190,14 @@ class SBAdminBaseView(object):
|
|
|
184
190
|
"initials": request.request_data.user.username[0],
|
|
185
191
|
}
|
|
186
192
|
|
|
187
|
-
def get_sbadmin_detail_actions(
|
|
193
|
+
def get_sbadmin_detail_actions(
|
|
194
|
+
self, request, object_id: int | str | None = None
|
|
195
|
+
) -> Iterable[SBAdminCustomAction] | None:
|
|
188
196
|
return self.sbadmin_detail_actions
|
|
189
197
|
|
|
190
|
-
def get_global_context(
|
|
198
|
+
def get_global_context(
|
|
199
|
+
self, request, object_id: int | str | None = None
|
|
200
|
+
) -> dict[str, Any]:
|
|
191
201
|
return {
|
|
192
202
|
"view_id": self.get_id(),
|
|
193
203
|
"configuration": request.request_data.configuration,
|
|
@@ -207,7 +217,7 @@ class SBAdminBaseView(object):
|
|
|
207
217
|
),
|
|
208
218
|
}
|
|
209
219
|
|
|
210
|
-
def get_model_path(self):
|
|
220
|
+
def get_model_path(self) -> str:
|
|
211
221
|
return SBAdminViewService.get_model_path(self.model)
|
|
212
222
|
|
|
213
223
|
|
|
@@ -239,10 +249,10 @@ class SBAdminBaseListView(SBAdminBaseView):
|
|
|
239
249
|
sbadmin_actions_initialized = False
|
|
240
250
|
sbadmin_list_action_class = SBAdminListAction
|
|
241
251
|
|
|
242
|
-
def activate_reorder(self, request):
|
|
252
|
+
def activate_reorder(self, request) -> None:
|
|
243
253
|
request.reorder_active = True
|
|
244
254
|
|
|
245
|
-
def action_list_json_reorder(self, request, modifier):
|
|
255
|
+
def action_list_json_reorder(self, request, modifier) -> JsonResponse:
|
|
246
256
|
self.activate_reorder(request)
|
|
247
257
|
return self.action_list_json(request, modifier, page_size=100)
|
|
248
258
|
|
|
@@ -273,22 +283,22 @@ class SBAdminBaseListView(SBAdminBaseView):
|
|
|
273
283
|
],
|
|
274
284
|
)
|
|
275
285
|
|
|
276
|
-
def is_reorder_active(self, request):
|
|
286
|
+
def is_reorder_active(self, request) -> bool:
|
|
277
287
|
return (
|
|
278
|
-
self.is_reorder_available()
|
|
288
|
+
self.is_reorder_available(request)
|
|
279
289
|
and getattr(request, "reorder_active", False) == True
|
|
280
290
|
)
|
|
281
291
|
|
|
282
|
-
def is_reorder_available(self):
|
|
292
|
+
def is_reorder_available(self, request) -> str | None:
|
|
283
293
|
return self.sbadmin_list_reorder_field
|
|
284
294
|
|
|
285
|
-
def action_table_reorder(self, request, modifier):
|
|
295
|
+
def action_table_reorder(self, request, modifier) -> JsonResponse:
|
|
286
296
|
self.activate_reorder(request)
|
|
287
297
|
qs = self.get_queryset(request)
|
|
288
298
|
pk_field = SBAdminViewService.get_pk_field_for_model(self.model).name
|
|
289
299
|
old_order = dict(
|
|
290
300
|
qs.values_list(pk_field, self.sbadmin_list_reorder_field).order_by(
|
|
291
|
-
*self.get_list_ordering()
|
|
301
|
+
*self.get_list_ordering(request)
|
|
292
302
|
)
|
|
293
303
|
)
|
|
294
304
|
current_row_id = json.loads(request.POST.get("currentRowId", ""))
|
|
@@ -316,30 +326,30 @@ class SBAdminBaseListView(SBAdminBaseView):
|
|
|
316
326
|
)
|
|
317
327
|
return JsonResponse({"message": request.POST})
|
|
318
328
|
|
|
319
|
-
def action_table_data_edit(self, request, modifier):
|
|
329
|
+
def action_table_data_edit(self, request, modifier) -> HttpResponse:
|
|
320
330
|
current_row_id = json.loads(request.POST.get("currentRowId", ""))
|
|
321
331
|
column_field_name = request.POST.get("columnFieldName", "")
|
|
322
332
|
cell_value = request.POST.get("cellValue", "")
|
|
323
333
|
messages.add_message(request, messages.ERROR, "Not Implemented")
|
|
324
334
|
return HttpResponse(status=200, content=render_notifications(request))
|
|
325
335
|
|
|
326
|
-
def init_actions(self, request):
|
|
336
|
+
def init_actions(self, request) -> None:
|
|
327
337
|
if self.sbadmin_actions_initialized:
|
|
328
338
|
return
|
|
329
339
|
self.process_actions(request, self.get_sbadmin_list_selection_actions(request))
|
|
330
340
|
self.sbadmin_actions_initialized = True
|
|
331
341
|
|
|
332
|
-
def init_view_dynamic(self, request, request_data=None, **kwargs):
|
|
342
|
+
def init_view_dynamic(self, request, request_data=None, **kwargs) -> None:
|
|
333
343
|
super().init_view_dynamic(request, request_data, **kwargs)
|
|
334
344
|
self.init_fields_cache(
|
|
335
345
|
self.get_sbadmin_list_display(request), request.request_data.configuration
|
|
336
346
|
)
|
|
337
347
|
self.init_actions(request)
|
|
338
348
|
|
|
339
|
-
def get_sbadmin_list_display(self, request):
|
|
340
|
-
return self.sbadmin_list_display or self.list_display
|
|
349
|
+
def get_sbadmin_list_display(self, request) -> list[str] | list:
|
|
350
|
+
return self.sbadmin_list_display or self.list_display or []
|
|
341
351
|
|
|
342
|
-
def register_autocomplete_views(self, request):
|
|
352
|
+
def register_autocomplete_views(self, request) -> None:
|
|
343
353
|
super().register_autocomplete_views(request)
|
|
344
354
|
self.init_fields_cache(
|
|
345
355
|
self.get_sbadmin_list_display(request),
|
|
@@ -352,7 +362,7 @@ class SBAdminBaseListView(SBAdminBaseView):
|
|
|
352
362
|
form.view = self
|
|
353
363
|
form()
|
|
354
364
|
|
|
355
|
-
def get_list_display(self, request):
|
|
365
|
+
def get_list_display(self, request) -> list[str] | list:
|
|
356
366
|
return [
|
|
357
367
|
getattr(field, "name", field)
|
|
358
368
|
for field in self.get_sbadmin_list_display(request)
|
|
@@ -364,12 +374,12 @@ class SBAdminBaseListView(SBAdminBaseView):
|
|
|
364
374
|
else:
|
|
365
375
|
return []
|
|
366
376
|
|
|
367
|
-
def get_list_ordering(self):
|
|
377
|
+
def get_list_ordering(self, request) -> Iterable[str] | list:
|
|
368
378
|
return self.ordering or []
|
|
369
379
|
|
|
370
|
-
def get_list_initial_order(self):
|
|
380
|
+
def get_list_initial_order(self, request) -> list[dict[str, Any]]:
|
|
371
381
|
order = []
|
|
372
|
-
for order_field in self.get_list_ordering():
|
|
382
|
+
for order_field in self.get_list_ordering(request):
|
|
373
383
|
direction = "desc" if order_field.startswith("-") else "asc"
|
|
374
384
|
order.append(
|
|
375
385
|
{
|
|
@@ -379,15 +389,15 @@ class SBAdminBaseListView(SBAdminBaseView):
|
|
|
379
389
|
)
|
|
380
390
|
return order
|
|
381
391
|
|
|
382
|
-
def get_list_per_page(self):
|
|
392
|
+
def get_list_per_page(self, request) -> int | None:
|
|
383
393
|
return self.list_per_page
|
|
384
394
|
|
|
385
|
-
def has_add_permission(self, request):
|
|
395
|
+
def has_add_permission(self, request, obj=None) -> bool:
|
|
386
396
|
if self.is_reorder_active(request):
|
|
387
397
|
return False
|
|
388
398
|
return super().has_add_permission(request)
|
|
389
399
|
|
|
390
|
-
def get_tabulator_definition(self, request):
|
|
400
|
+
def get_tabulator_definition(self, request) -> dict[str, Any]:
|
|
391
401
|
view_id = self.get_id()
|
|
392
402
|
tabulator_definition = {
|
|
393
403
|
"viewId": view_id,
|
|
@@ -404,8 +414,8 @@ class SBAdminBaseListView(SBAdminBaseView):
|
|
|
404
414
|
Action.TABLE_REORDER_ACTION.value
|
|
405
415
|
),
|
|
406
416
|
"tableDetailUrl": self.get_detail_url(),
|
|
407
|
-
"tableInitialSort": self.get_list_initial_order(),
|
|
408
|
-
"tableInitialPageSize": self.get_list_per_page(),
|
|
417
|
+
"tableInitialSort": self.get_list_initial_order(request),
|
|
418
|
+
"tableInitialPageSize": self.get_list_per_page(request),
|
|
409
419
|
"tableHistoryEnabled": self.sbadmin_table_history_enabled,
|
|
410
420
|
# used to initialize all columns with these values
|
|
411
421
|
"defaultColumnData": {},
|
|
@@ -447,9 +457,9 @@ class SBAdminBaseListView(SBAdminBaseView):
|
|
|
447
457
|
)
|
|
448
458
|
return tabulator_definition
|
|
449
459
|
|
|
450
|
-
def _get_sbadmin_list_actions(self, request):
|
|
460
|
+
def _get_sbadmin_list_actions(self, request) -> list[SBAdminCustomAction] | list:
|
|
451
461
|
list_actions = [*(self.get_sbadmin_list_actions(request) or [])]
|
|
452
|
-
if self.is_reorder_available():
|
|
462
|
+
if self.is_reorder_available(request):
|
|
453
463
|
list_actions = [
|
|
454
464
|
*list_actions,
|
|
455
465
|
SBAdminCustomAction(
|
|
@@ -461,7 +471,7 @@ class SBAdminBaseListView(SBAdminBaseView):
|
|
|
461
471
|
]
|
|
462
472
|
return list_actions
|
|
463
473
|
|
|
464
|
-
def get_sbadmin_list_actions(self, request):
|
|
474
|
+
def get_sbadmin_list_actions(self, request) -> list[SBAdminCustomAction]:
|
|
465
475
|
if not self.sbadmin_list_actions:
|
|
466
476
|
self.sbadmin_list_actions = [
|
|
467
477
|
SBAdminCustomAction(
|
|
@@ -472,7 +482,7 @@ class SBAdminBaseListView(SBAdminBaseView):
|
|
|
472
482
|
]
|
|
473
483
|
return self.sbadmin_list_actions
|
|
474
484
|
|
|
475
|
-
def get_sbadmin_list_selection_actions(self, request):
|
|
485
|
+
def get_sbadmin_list_selection_actions(self, request) -> list[SBAdminCustomAction]:
|
|
476
486
|
if not self.sbadmin_list_selection_actions:
|
|
477
487
|
self.sbadmin_list_selection_actions = [
|
|
478
488
|
SBAdminCustomAction(
|
|
@@ -489,7 +499,9 @@ class SBAdminBaseListView(SBAdminBaseView):
|
|
|
489
499
|
]
|
|
490
500
|
return self.sbadmin_list_selection_actions
|
|
491
501
|
|
|
492
|
-
def get_sbadmin_list_selection_actions_grouped(
|
|
502
|
+
def get_sbadmin_list_selection_actions_grouped(
|
|
503
|
+
self, request
|
|
504
|
+
) -> dict[str, list[SBAdminCustomAction]]:
|
|
493
505
|
result = {}
|
|
494
506
|
list_selection_actions = self.process_actions(
|
|
495
507
|
request, self.get_sbadmin_list_selection_actions(request)
|
|
@@ -500,7 +512,7 @@ class SBAdminBaseListView(SBAdminBaseView):
|
|
|
500
512
|
result[action.group].append(action)
|
|
501
513
|
return result
|
|
502
514
|
|
|
503
|
-
def get_sbadmin_xlsx_options(self, request):
|
|
515
|
+
def get_sbadmin_xlsx_options(self, request) -> SBAdminXLSXOptions:
|
|
504
516
|
self.sbadmin_xlsx_options = self.sbadmin_xlsx_options or SBAdminXLSXOptions(
|
|
505
517
|
header_cell_format=SBAdminXLSXFormat(
|
|
506
518
|
bg_color="#00aaa7", font_color="#ffffff", bold=True
|
|
@@ -512,7 +524,7 @@ class SBAdminBaseListView(SBAdminBaseView):
|
|
|
512
524
|
)
|
|
513
525
|
return self.sbadmin_xlsx_options
|
|
514
526
|
|
|
515
|
-
def action_xlsx_export(self, request, modifier):
|
|
527
|
+
def action_xlsx_export(self, request, modifier) -> HttpResponse:
|
|
516
528
|
action = self.sbadmin_list_action_class(self, request)
|
|
517
529
|
data = action.get_xlsx_data(request)
|
|
518
530
|
return SBAdminXLSXExportService.create_workbook_http_respone(*data)
|
|
@@ -637,15 +649,15 @@ class SBAdminBaseListView(SBAdminBaseView):
|
|
|
637
649
|
extra_context,
|
|
638
650
|
)
|
|
639
651
|
|
|
640
|
-
def action_list_json(self, request, modifier, page_size=None):
|
|
652
|
+
def action_list_json(self, request, modifier, page_size=None) -> JsonResponse:
|
|
641
653
|
action = self.sbadmin_list_action_class(self, request, page_size=page_size)
|
|
642
654
|
data = action.get_json_data()
|
|
643
655
|
return JsonResponse(data=data, safe=False)
|
|
644
656
|
|
|
645
|
-
def get_sbadmin_list_filter(self, request):
|
|
657
|
+
def get_sbadmin_list_filter(self, request) -> Iterable | None:
|
|
646
658
|
return self.sbadmin_list_filter
|
|
647
659
|
|
|
648
|
-
def get_all_config(self, request):
|
|
660
|
+
def get_all_config(self, request) -> dict[str, Any]:
|
|
649
661
|
all_config = {"name": _("All"), "url_params": {}, "default": True}
|
|
650
662
|
list_filter = self.get_sbadmin_list_filter(request) or []
|
|
651
663
|
if not list_filter:
|
|
@@ -669,10 +681,10 @@ class SBAdminBaseListView(SBAdminBaseView):
|
|
|
669
681
|
}
|
|
670
682
|
return all_config
|
|
671
683
|
|
|
672
|
-
def get_sbadmin_list_view_config(self, request):
|
|
684
|
+
def get_sbadmin_list_view_config(self, request) -> list:
|
|
673
685
|
return self.sbadmin_list_view_config or []
|
|
674
686
|
|
|
675
|
-
def get_base_config(self, request):
|
|
687
|
+
def get_base_config(self, request) -> list[dict[str, Any]]:
|
|
676
688
|
sbadmin_list_config = self.get_sbadmin_list_view_config(request)
|
|
677
689
|
list_view_config = [self.get_all_config(request), *sbadmin_list_config]
|
|
678
690
|
views = []
|
|
@@ -691,7 +703,7 @@ class SBAdminBaseListView(SBAdminBaseView):
|
|
|
691
703
|
)
|
|
692
704
|
return views
|
|
693
705
|
|
|
694
|
-
def get_config_data(self, request):
|
|
706
|
+
def get_config_data(self, request) -> dict[str, list[dict[str, Any]]]:
|
|
695
707
|
from django_smartbase_admin.models import SBAdminListViewConfiguration
|
|
696
708
|
|
|
697
709
|
current_views = list(
|
|
@@ -702,15 +714,15 @@ class SBAdminBaseListView(SBAdminBaseView):
|
|
|
702
714
|
.values()
|
|
703
715
|
)
|
|
704
716
|
for view in current_views:
|
|
705
|
-
view["detail_url"] = self.get_config_url(view["id"])
|
|
717
|
+
view["detail_url"] = self.get_config_url(request, view["id"])
|
|
706
718
|
config_views = self.get_base_config(request)
|
|
707
719
|
config_views.extend(current_views)
|
|
708
720
|
return {"current_views": config_views}
|
|
709
721
|
|
|
710
|
-
def get_ajax_url(self):
|
|
722
|
+
def get_ajax_url(self) -> str:
|
|
711
723
|
return self.get_action_url(Action.LIST_JSON.value)
|
|
712
724
|
|
|
713
|
-
def get_detail_url(self):
|
|
725
|
+
def get_detail_url(self) -> str:
|
|
714
726
|
url = reverse(
|
|
715
727
|
"sb_admin:sb_admin_base",
|
|
716
728
|
kwargs={
|
|
@@ -721,21 +733,21 @@ class SBAdminBaseListView(SBAdminBaseView):
|
|
|
721
733
|
)
|
|
722
734
|
return f"{url}/{OBJECT_ID_PLACEHOLDER}"
|
|
723
735
|
|
|
724
|
-
def get_config_url(self, config_name=None):
|
|
736
|
+
def get_config_url(self, request, config_name=None) -> str:
|
|
725
737
|
return self.get_action_url(Action.CONFIG.value, config_name)
|
|
726
738
|
|
|
727
|
-
def get_new_url(self):
|
|
739
|
+
def get_new_url(self, request) -> None:
|
|
728
740
|
return None
|
|
729
741
|
|
|
730
|
-
def get_context_data(self, request):
|
|
742
|
+
def get_context_data(self, request) -> dict:
|
|
731
743
|
return {}
|
|
732
744
|
|
|
733
|
-
def get_filters_version(self, request):
|
|
745
|
+
def get_filters_version(self, request) -> FilterVersions:
|
|
734
746
|
return (
|
|
735
747
|
self.filters_version or request.request_data.configuration.filters_version
|
|
736
748
|
)
|
|
737
749
|
|
|
738
|
-
def get_filters_template_name(self, request):
|
|
750
|
+
def get_filters_template_name(self, request) -> str:
|
|
739
751
|
filters_version = self.get_filters_version(request)
|
|
740
752
|
if filters_version is FilterVersions.FILTERS_VERSION_2:
|
|
741
753
|
return "sb_admin/components/filters_v2.html"
|
|
@@ -743,7 +755,7 @@ class SBAdminBaseListView(SBAdminBaseView):
|
|
|
743
755
|
# default
|
|
744
756
|
return "sb_admin/components/filters.html"
|
|
745
757
|
|
|
746
|
-
def get_tabulator_header_template_name(self, request):
|
|
758
|
+
def get_tabulator_header_template_name(self, request) -> str:
|
|
747
759
|
filters_version = self.get_filters_version(request)
|
|
748
760
|
if filters_version is FilterVersions.FILTERS_VERSION_2:
|
|
749
761
|
return "sb_admin/actions/partials/tabulator_header_v2.html"
|
|
@@ -751,5 +763,5 @@ class SBAdminBaseListView(SBAdminBaseView):
|
|
|
751
763
|
# default
|
|
752
764
|
return "sb_admin/actions/partials/tabulator_header_v1.html"
|
|
753
765
|
|
|
754
|
-
def get_search_field_placeholder(self):
|
|
766
|
+
def get_search_field_placeholder(self, request) -> str:
|
|
755
767
|
return self.search_field_placeholder
|