django-smartbase-admin 0.2.71__py3-none-any.whl → 0.2.73__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 +52 -20
- django_smartbase_admin/admin/site.py +0 -13
- django_smartbase_admin/admin/widgets.py +21 -0
- django_smartbase_admin/engine/configuration.py +12 -2
- django_smartbase_admin/integration/__init__.py +0 -0
- django_smartbase_admin/integration/django_cms.py +31 -0
- django_smartbase_admin/services/views.py +1 -1
- django_smartbase_admin/static/sb_admin/dist/main_style.css +1 -1
- django_smartbase_admin/static/sb_admin/src/css/components/_query-builder.css +4 -0
- django_smartbase_admin/static/sb_admin/src/css/components/_toggle.css +10 -0
- django_smartbase_admin/templates/sb_admin/actions/partials/tabulator_header_v2.html +1 -1
- django_smartbase_admin/templates/sb_admin/includes/inline_fieldset.html +1 -6
- django_smartbase_admin/templates/sb_admin/includes/readonly_field.html +19 -0
- django_smartbase_admin/templates/sb_admin/widgets/array.html +0 -1
- django_smartbase_admin/templates/sb_admin/widgets/attributes.html +67 -0
- {django_smartbase_admin-0.2.71.dist-info → django_smartbase_admin-0.2.73.dist-info}/METADATA +1 -1
- {django_smartbase_admin-0.2.71.dist-info → django_smartbase_admin-0.2.73.dist-info}/RECORD +19 -15
- {django_smartbase_admin-0.2.71.dist-info → django_smartbase_admin-0.2.73.dist-info}/LICENSE.md +0 -0
- {django_smartbase_admin-0.2.71.dist-info → django_smartbase_admin-0.2.73.dist-info}/WHEEL +0 -0
|
@@ -6,13 +6,14 @@ from ckeditor_uploader.fields import RichTextUploadingFormField
|
|
|
6
6
|
from django import forms
|
|
7
7
|
from django.contrib import admin
|
|
8
8
|
from django.contrib.admin.options import get_content_type_for_model
|
|
9
|
-
from django.contrib.admin.utils import unquote
|
|
9
|
+
from django.contrib.admin.utils import unquote, lookup_field
|
|
10
10
|
from django.contrib.admin.widgets import AdminTextareaWidget
|
|
11
11
|
from django.contrib.auth.forms import UsernameField, ReadOnlyPasswordHashWidget
|
|
12
12
|
from django.core.exceptions import (
|
|
13
13
|
FieldDoesNotExist,
|
|
14
14
|
ImproperlyConfigured,
|
|
15
15
|
PermissionDenied,
|
|
16
|
+
ObjectDoesNotExist,
|
|
16
17
|
)
|
|
17
18
|
from django.db import models
|
|
18
19
|
from django.forms import HiddenInput
|
|
@@ -61,6 +62,16 @@ try:
|
|
|
61
62
|
except ImportError:
|
|
62
63
|
pass
|
|
63
64
|
|
|
65
|
+
|
|
66
|
+
django_cms_attributes = None
|
|
67
|
+
try:
|
|
68
|
+
from djangocms_attributes_field.fields import AttributesFormField
|
|
69
|
+
|
|
70
|
+
django_cms_attributes = True
|
|
71
|
+
except ImportError:
|
|
72
|
+
pass
|
|
73
|
+
|
|
74
|
+
|
|
64
75
|
from django_smartbase_admin.admin.widgets import (
|
|
65
76
|
SBAdminTextInputWidget,
|
|
66
77
|
SBAdminTextareaWidget,
|
|
@@ -82,6 +93,7 @@ from django_smartbase_admin.admin.widgets import (
|
|
|
82
93
|
SBAdminReadOnlyPasswordHashWidget,
|
|
83
94
|
SBAdminHiddenWidget,
|
|
84
95
|
SBAdminCKEditorUploadingWidget,
|
|
96
|
+
SBAdminAttributesWidget,
|
|
85
97
|
)
|
|
86
98
|
from django_smartbase_admin.engine.admin_base_view import (
|
|
87
99
|
SBAdminBaseListView,
|
|
@@ -127,6 +139,8 @@ class SBAdminFormFieldWidgetsMixin:
|
|
|
127
139
|
}
|
|
128
140
|
if postrgres_enabled:
|
|
129
141
|
formfield_widgets[SimpleArrayField] = SBAdminArrayWidget
|
|
142
|
+
if django_cms_attributes:
|
|
143
|
+
formfield_widgets[AttributesFormField] = SBAdminAttributesWidget
|
|
130
144
|
|
|
131
145
|
django_widget_to_widget = {
|
|
132
146
|
forms.PasswordInput: SBAdminPasswordInputWidget,
|
|
@@ -274,9 +288,7 @@ class SBAdminBaseFormInit(SBAdminFormFieldWidgetsMixin, FormFieldsetMixin):
|
|
|
274
288
|
)
|
|
275
289
|
|
|
276
290
|
|
|
277
|
-
class SBAdminBaseForm(
|
|
278
|
-
SBAdminBaseFormInit, forms.ModelForm, SBAdminFormFieldWidgetsMixin
|
|
279
|
-
):
|
|
291
|
+
class SBAdminBaseForm(SBAdminBaseFormInit, forms.ModelForm):
|
|
280
292
|
pass
|
|
281
293
|
|
|
282
294
|
|
|
@@ -498,8 +510,12 @@ class SBAdminThirdParty(SBAdminInlineAndAdminCommon, SBAdminBaseView):
|
|
|
498
510
|
|
|
499
511
|
def get_action_url(self, action, modifier="template"):
|
|
500
512
|
return reverse(
|
|
501
|
-
|
|
502
|
-
kwargs={
|
|
513
|
+
"sb_admin:sb_admin_base",
|
|
514
|
+
kwargs={
|
|
515
|
+
"view": self.get_id(),
|
|
516
|
+
"action": action,
|
|
517
|
+
"modifier": modifier,
|
|
518
|
+
},
|
|
503
519
|
)
|
|
504
520
|
|
|
505
521
|
|
|
@@ -702,12 +718,11 @@ class SBAdmin(
|
|
|
702
718
|
if not hasattr(self, action):
|
|
703
719
|
raise ImproperlyConfigured(f"Action {action} does not exist on {self}")
|
|
704
720
|
return reverse(
|
|
705
|
-
|
|
721
|
+
"sb_admin:sb_admin_base",
|
|
706
722
|
kwargs={
|
|
723
|
+
"view": self.get_id(),
|
|
707
724
|
"action": action,
|
|
708
|
-
"modifier":
|
|
709
|
-
urllib.parse.quote(str(modifier), safe="") if modifier else None
|
|
710
|
-
),
|
|
725
|
+
"modifier": modifier,
|
|
711
726
|
},
|
|
712
727
|
)
|
|
713
728
|
|
|
@@ -758,27 +773,44 @@ class SBAdmin(
|
|
|
758
773
|
),
|
|
759
774
|
}
|
|
760
775
|
|
|
776
|
+
def get_readonly_base_fields_context(self, request, object_id=None):
|
|
777
|
+
obj = None
|
|
778
|
+
if object_id:
|
|
779
|
+
obj = self.get_object(request, object_id)
|
|
780
|
+
readonly_base_fields = {}
|
|
781
|
+
for field in self.readonly_fields:
|
|
782
|
+
base_field = self.form.base_fields.get(field)
|
|
783
|
+
if base_field:
|
|
784
|
+
try:
|
|
785
|
+
f, attr, value = lookup_field(field, obj, self)
|
|
786
|
+
except (AttributeError, ValueError, ObjectDoesNotExist):
|
|
787
|
+
value = base_field.initial
|
|
788
|
+
readonly_base_fields[field] = {
|
|
789
|
+
"field": base_field,
|
|
790
|
+
"value": value,
|
|
791
|
+
}
|
|
792
|
+
return {"readonly_base_fields": readonly_base_fields}
|
|
793
|
+
|
|
794
|
+
def add_view(self, request, form_url="", extra_context=None):
|
|
795
|
+
extra_context = extra_context or {}
|
|
796
|
+
extra_context.update(self.get_global_context(request, None))
|
|
797
|
+
extra_context.update(self.get_fieldsets_context(request, None))
|
|
798
|
+
extra_context.update(self.get_tabs_context(request, None))
|
|
799
|
+
extra_context.update(self.get_readonly_base_fields_context(request, None))
|
|
800
|
+
return self.changeform_view(request, None, form_url, extra_context)
|
|
801
|
+
|
|
761
802
|
def change_view(self, request, object_id, form_url="", extra_context=None):
|
|
762
803
|
extra_context = extra_context or {}
|
|
763
804
|
extra_context.update(self.get_global_context(request, object_id))
|
|
764
805
|
extra_context.update(self.get_fieldsets_context(request, object_id))
|
|
765
806
|
extra_context.update(self.get_tabs_context(request, object_id))
|
|
766
807
|
extra_context.update(self.get_previous_next_context(request, object_id))
|
|
808
|
+
extra_context.update(self.get_readonly_base_fields_context(request, object_id))
|
|
767
809
|
return super().change_view(request, object_id, form_url, extra_context)
|
|
768
810
|
|
|
769
811
|
def changelist_view(self, request, extra_context=None):
|
|
770
812
|
return self.action_list(request, extra_context=extra_context)
|
|
771
813
|
|
|
772
|
-
def _get_changed_field_labels_from_form(form, changed_data):
|
|
773
|
-
changed_field_labels = []
|
|
774
|
-
for field_name in changed_data:
|
|
775
|
-
try:
|
|
776
|
-
verbose_field_name = form.fields[field_name].label or field_name
|
|
777
|
-
except KeyError:
|
|
778
|
-
verbose_field_name = field_name
|
|
779
|
-
changed_field_labels.append(str(verbose_field_name))
|
|
780
|
-
return changed_field_labels
|
|
781
|
-
|
|
782
814
|
def history_view(self, request, object_id, extra_context=None):
|
|
783
815
|
try:
|
|
784
816
|
"The 'history' admin view for this model."
|
|
@@ -141,19 +141,6 @@ class SBAdminSite(admin.AdminSite):
|
|
|
141
141
|
name="components",
|
|
142
142
|
)
|
|
143
143
|
)
|
|
144
|
-
for model, model_admin in self._registry.items():
|
|
145
|
-
action_view = getattr(model_admin, "action_view", None)
|
|
146
|
-
if not action_view:
|
|
147
|
-
continue
|
|
148
|
-
urls += [
|
|
149
|
-
path(
|
|
150
|
-
"%s/%s/<str:action>/<str:modifier>"
|
|
151
|
-
% (model._meta.app_label, model._meta.model_name),
|
|
152
|
-
self.admin_view(action_view),
|
|
153
|
-
name="%s_%s_action"
|
|
154
|
-
% (model._meta.app_label, model._meta.model_name),
|
|
155
|
-
),
|
|
156
|
-
]
|
|
157
144
|
urls.extend(
|
|
158
145
|
[
|
|
159
146
|
path(
|
|
@@ -249,6 +249,27 @@ class SBAdminArrayWidget(SBAdminTextInputWidget):
|
|
|
249
249
|
return context
|
|
250
250
|
|
|
251
251
|
|
|
252
|
+
class SBAdminAttributesWidget(SBAdminTextInputWidget):
|
|
253
|
+
template_name = "sb_admin/widgets/attributes.html"
|
|
254
|
+
|
|
255
|
+
def get_context(self, name, value, attrs):
|
|
256
|
+
context = super().get_context(name, value, attrs)
|
|
257
|
+
widget = context.get("widget", None)
|
|
258
|
+
dict_widgets = []
|
|
259
|
+
template_widget = {"attrs": {"class": "input"}}
|
|
260
|
+
if widget and value:
|
|
261
|
+
dict_widgets = [
|
|
262
|
+
{
|
|
263
|
+
"key": {"value": key, **template_widget},
|
|
264
|
+
"value": {"value": value, **template_widget},
|
|
265
|
+
}
|
|
266
|
+
for key, value in value.items()
|
|
267
|
+
]
|
|
268
|
+
context["dict_widgets"] = dict_widgets
|
|
269
|
+
context["template_widget"] = template_widget
|
|
270
|
+
return context
|
|
271
|
+
|
|
272
|
+
|
|
252
273
|
class SBAdminAutocompleteWidget(
|
|
253
274
|
SBAdminBaseWidget, AutocompleteFilterWidget, forms.Widget
|
|
254
275
|
):
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
from copy import deepcopy
|
|
2
|
-
|
|
3
1
|
from django.contrib.auth import get_permission_codename
|
|
4
2
|
from django.db.models import Q
|
|
5
3
|
|
|
@@ -88,6 +86,18 @@ class SBAdminRoleConfiguration(metaclass=Singleton):
|
|
|
88
86
|
if hasattr(view, "get_id")
|
|
89
87
|
}
|
|
90
88
|
)
|
|
89
|
+
try:
|
|
90
|
+
from cms.plugin_pool import plugin_pool
|
|
91
|
+
|
|
92
|
+
for name, view in plugin_pool.plugins.items():
|
|
93
|
+
if hasattr(view, "get_id"):
|
|
94
|
+
view_instance = view()
|
|
95
|
+
self.view_map[view_instance.get_id()] = view_instance
|
|
96
|
+
view_instance.init_view_static(
|
|
97
|
+
self, view_instance.model, sb_admin_site
|
|
98
|
+
)
|
|
99
|
+
except ImportError:
|
|
100
|
+
pass
|
|
91
101
|
|
|
92
102
|
def init_model_admin_view_map(self):
|
|
93
103
|
for model, admin_view in sb_admin_site._registry.items():
|
|
File without changes
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
from django_smartbase_admin.admin.site import sb_admin_site
|
|
2
|
+
|
|
3
|
+
from django_smartbase_admin.admin.admin_base import SBAdmin
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class DjangoCMSPluginSBAdmin(SBAdmin):
|
|
7
|
+
initialised = False
|
|
8
|
+
list_display = []
|
|
9
|
+
|
|
10
|
+
def get_inline_instances(self, request, obj=None):
|
|
11
|
+
inline_instances = super().get_inline_instances(request, obj)
|
|
12
|
+
if not self.initialised:
|
|
13
|
+
for inline_instance in inline_instances:
|
|
14
|
+
inline_instance.init_view_static(
|
|
15
|
+
request.request_data.configuration,
|
|
16
|
+
inline_instance.model,
|
|
17
|
+
sb_admin_site,
|
|
18
|
+
)
|
|
19
|
+
self.initialised = True
|
|
20
|
+
return inline_instances
|
|
21
|
+
|
|
22
|
+
def get_sbadmin_fieldsets(self, request, object_id=None):
|
|
23
|
+
obj = self.model.objects.get(pk=object_id) if object_id else None
|
|
24
|
+
fieldsets = self.sbadmin_fieldsets or [
|
|
25
|
+
(
|
|
26
|
+
None,
|
|
27
|
+
{"fields": self.get_fields(request, obj)},
|
|
28
|
+
)
|
|
29
|
+
]
|
|
30
|
+
self.sbadmin_fieldsets = fieldsets
|
|
31
|
+
return fieldsets
|
|
@@ -61,7 +61,7 @@ class SBAdminViewService(object):
|
|
|
61
61
|
for filter_key, filter_value in filter_data.items():
|
|
62
62
|
filter_data_processed[filter_key] = cls.json_dumps_and_replace(filter_value)
|
|
63
63
|
view_params = {FILTER_DATA_NAME: filter_data_processed}
|
|
64
|
-
return cls.build_list_url(view_id, view_params)
|
|
64
|
+
return cls.build_list_url(view_id, view_params).replace("\\\\", "")
|
|
65
65
|
|
|
66
66
|
@classmethod
|
|
67
67
|
def get_pk_field_for_model(cls, model):
|