django-smartbase-admin 1.0.13__py3-none-any.whl → 1.0.14__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/admin/admin_base.py +19 -0
- django_smartbase_admin/admin/widgets.py +6 -6
- django_smartbase_admin/engine/configuration.py +25 -25
- django_smartbase_admin/engine/menu_item.py +8 -5
- django_smartbase_admin/static/sb_admin/dist/main.js +1 -1
- django_smartbase_admin/static/sb_admin/src/js/multiselect.js +4 -2
- django_smartbase_admin/templates/sb_admin/actions/change_form.html +25 -23
- django_smartbase_admin/templates/sb_admin/includes/inline_fieldset.html +11 -11
- django_smartbase_admin/utils.py +4 -1
- django_smartbase_admin/views/translations_view.py +9 -3
- {django_smartbase_admin-1.0.13.dist-info → django_smartbase_admin-1.0.14.dist-info}/METADATA +1 -1
- {django_smartbase_admin-1.0.13.dist-info → django_smartbase_admin-1.0.14.dist-info}/RECORD +14 -14
- {django_smartbase_admin-1.0.13.dist-info → django_smartbase_admin-1.0.14.dist-info}/LICENSE.md +0 -0
- {django_smartbase_admin-1.0.13.dist-info → django_smartbase_admin-1.0.14.dist-info}/WHEEL +0 -0
|
@@ -36,6 +36,8 @@ from django.utils.text import capfirst
|
|
|
36
36
|
from django.utils.translation import gettext_lazy as _
|
|
37
37
|
from django_admin_inline_paginator.admin import TabularInlinePaginated
|
|
38
38
|
from django_htmx.http import trigger_client_event
|
|
39
|
+
from parler.admin import TranslatableAdmin
|
|
40
|
+
|
|
39
41
|
from django_smartbase_admin.engine.field import SBAdminField
|
|
40
42
|
from filer.fields.file import FilerFileField
|
|
41
43
|
from filer.fields.image import AdminImageFormField, FilerImageField
|
|
@@ -821,6 +823,9 @@ class SBAdmin(
|
|
|
821
823
|
def get_additional_filter_for_previous_next_context(self, request, object_id) -> Q:
|
|
822
824
|
return Q()
|
|
823
825
|
|
|
826
|
+
def get_change_view_context(self, request, object_id) -> dict | dict[str, Any]:
|
|
827
|
+
return {"show_back_button": True}
|
|
828
|
+
|
|
824
829
|
def get_previous_next_context(self, request, object_id) -> dict | dict[str, Any]:
|
|
825
830
|
if not self.sbadmin_previous_next_buttons_enabled or not object_id:
|
|
826
831
|
return {}
|
|
@@ -871,6 +876,7 @@ class SBAdmin(
|
|
|
871
876
|
|
|
872
877
|
def change_view(self, request, object_id, form_url="", extra_context=None):
|
|
873
878
|
extra_context = extra_context or {}
|
|
879
|
+
extra_context.update(self.get_change_view_context(request, object_id))
|
|
874
880
|
extra_context.update(self.get_global_context(request, object_id))
|
|
875
881
|
extra_context.update(self.get_fieldsets_context(request, object_id))
|
|
876
882
|
extra_context.update(self.get_tabs_context(request, object_id))
|
|
@@ -1151,3 +1157,16 @@ class SBAdminStackedInline(SBAdminInline, NestedStackedInline):
|
|
|
1151
1157
|
class SBAdminGenericStackedInline(SBAdminInline, NestedGenericStackedInline):
|
|
1152
1158
|
template = "sb_admin/inlines/stacked_inline.html"
|
|
1153
1159
|
fieldset_template = "sb_admin/includes/inline_fieldset.html"
|
|
1160
|
+
|
|
1161
|
+
|
|
1162
|
+
class SBTranslatableAdmin(SBAdmin, TranslatableAdmin):
|
|
1163
|
+
def get_readonly_fields(self, request, obj=...):
|
|
1164
|
+
readonly_fields = super().get_readonly_fields(request, obj)
|
|
1165
|
+
if "sbadmin_translation_status" not in readonly_fields:
|
|
1166
|
+
readonly_fields += ("sbadmin_translation_status",)
|
|
1167
|
+
return readonly_fields
|
|
1168
|
+
|
|
1169
|
+
def get_fieldsets(self, request, obj=...):
|
|
1170
|
+
fieldsets = super().get_fieldsets(request, obj)
|
|
1171
|
+
fieldsets.append(SBAdminTranslationsService.get_translation_fieldset())
|
|
1172
|
+
return fieldsets
|
|
@@ -421,25 +421,25 @@ class SBAdminAutocompleteWidget(
|
|
|
421
421
|
)
|
|
422
422
|
and not self.is_multiselect()
|
|
423
423
|
):
|
|
424
|
-
self.add_related_buttons_urls(parsed_value, context)
|
|
424
|
+
self.add_related_buttons_urls(parsed_value, threadsafe_request, context)
|
|
425
425
|
|
|
426
426
|
return context
|
|
427
427
|
|
|
428
|
-
def add_related_buttons_urls(self, parsed_value, context):
|
|
428
|
+
def add_related_buttons_urls(self, parsed_value, request, context):
|
|
429
429
|
related_model = self.model
|
|
430
430
|
app_label = related_model._meta.app_label
|
|
431
431
|
model_name = related_model._meta.model_name
|
|
432
432
|
|
|
433
433
|
try:
|
|
434
|
-
if parsed_value:
|
|
434
|
+
if parsed_value and self.has_view_or_change_permission(request, self.model):
|
|
435
435
|
change_url = reverse(
|
|
436
436
|
"sb_admin:{}_{}_change".format(app_label, model_name),
|
|
437
437
|
args=(parsed_value,),
|
|
438
438
|
)
|
|
439
439
|
context["widget"]["attrs"]["related_edit_url"] = change_url
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
440
|
+
if self.has_add_permission(request, self.model):
|
|
441
|
+
add_url = reverse("sb_admin:{}_{}_add".format(app_label, model_name))
|
|
442
|
+
context["widget"]["attrs"]["related_add_url"] = add_url
|
|
443
443
|
except NoReverseMatch:
|
|
444
444
|
pass
|
|
445
445
|
|
|
@@ -41,12 +41,12 @@ class SBAdminRoleConfiguration(metaclass=Singleton):
|
|
|
41
41
|
filters_version = FilterVersions.FILTERS_VERSION_1
|
|
42
42
|
|
|
43
43
|
def __init__(
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
44
|
+
self,
|
|
45
|
+
default_view=None,
|
|
46
|
+
registered_views=None,
|
|
47
|
+
menu_items=None,
|
|
48
|
+
global_filter_form=None,
|
|
49
|
+
filters_version=None,
|
|
50
50
|
) -> None:
|
|
51
51
|
super().__init__()
|
|
52
52
|
self.default_view = default_view or self.default_view or []
|
|
@@ -134,13 +134,13 @@ class SBAdminRoleConfiguration(metaclass=Singleton):
|
|
|
134
134
|
self.autocomplete_map[view.get_id()] = view
|
|
135
135
|
|
|
136
136
|
def restrict_queryset(
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
137
|
+
self,
|
|
138
|
+
qs,
|
|
139
|
+
model,
|
|
140
|
+
request,
|
|
141
|
+
request_data,
|
|
142
|
+
global_filter=True,
|
|
143
|
+
global_filter_data_map=None,
|
|
144
144
|
):
|
|
145
145
|
return qs
|
|
146
146
|
|
|
@@ -154,7 +154,7 @@ class SBAdminRoleConfiguration(metaclass=Singleton):
|
|
|
154
154
|
return request.user.is_staff
|
|
155
155
|
|
|
156
156
|
def has_permission(
|
|
157
|
-
|
|
157
|
+
self, request, request_data, view, model=None, obj=None, permission=None
|
|
158
158
|
):
|
|
159
159
|
if isinstance(permission, SBAdminCustomAction):
|
|
160
160
|
return self.has_action_permission(
|
|
@@ -174,7 +174,7 @@ class SBAdminRoleConfiguration(metaclass=Singleton):
|
|
|
174
174
|
return request.user.is_staff
|
|
175
175
|
|
|
176
176
|
def get_autocomplete_widget(
|
|
177
|
-
|
|
177
|
+
self, view, request, form_field, db_field, model, multiselect=False
|
|
178
178
|
):
|
|
179
179
|
from django_smartbase_admin.admin.widgets import SBAdminAutocompleteWidget
|
|
180
180
|
|
|
@@ -186,12 +186,12 @@ class SBAdminRoleConfiguration(metaclass=Singleton):
|
|
|
186
186
|
return default_widget
|
|
187
187
|
|
|
188
188
|
def get_form_field_widget_class(
|
|
189
|
-
|
|
189
|
+
self, view, request, form_field, db_field, default_widget_class
|
|
190
190
|
):
|
|
191
191
|
return default_widget_class
|
|
192
192
|
|
|
193
193
|
def apply_global_filter_to_queryset(
|
|
194
|
-
|
|
194
|
+
self, qs, request, request_data, global_filter_data_map
|
|
195
195
|
):
|
|
196
196
|
global_filter_data_map = global_filter_data_map or {}
|
|
197
197
|
global_filter_data_map = {
|
|
@@ -211,9 +211,9 @@ class SBAdminRoleConfiguration(metaclass=Singleton):
|
|
|
211
211
|
except:
|
|
212
212
|
pass
|
|
213
213
|
if (
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
214
|
+
include_all_values_for_empty_fields
|
|
215
|
+
and field.name in include_all_values_for_empty_fields
|
|
216
|
+
and not field_value
|
|
217
217
|
):
|
|
218
218
|
continue
|
|
219
219
|
field_value = to_list(field_value)
|
|
@@ -228,10 +228,10 @@ class SBAdminRoleConfiguration(metaclass=Singleton):
|
|
|
228
228
|
return response
|
|
229
229
|
|
|
230
230
|
def autocomplete_show_related_buttons(
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
231
|
+
self,
|
|
232
|
+
related_model,
|
|
233
|
+
field_name,
|
|
234
|
+
current_view,
|
|
235
|
+
request,
|
|
236
236
|
) -> bool:
|
|
237
237
|
return not is_modal(request)
|
|
@@ -56,11 +56,14 @@ class SBAdminMenuItem(object):
|
|
|
56
56
|
return self.label or self.view.get_menu_label()
|
|
57
57
|
|
|
58
58
|
def get_url(self, request):
|
|
59
|
-
|
|
60
|
-
self.url
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
59
|
+
if callable(self.url):
|
|
60
|
+
return self.url(request)
|
|
61
|
+
elif self.url:
|
|
62
|
+
return self.url
|
|
63
|
+
elif self.view:
|
|
64
|
+
return self.view.get_menu_view_url(request)
|
|
65
|
+
else:
|
|
66
|
+
return ""
|
|
64
67
|
|
|
65
68
|
def get_icon(self):
|
|
66
69
|
return self.icon or getattr(self.view, "icon", None)
|