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.
@@ -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
- f"sb_admin:{self.get_id()}_action",
502
- kwargs={"action": action, "modifier": modifier},
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
- f"sb_admin:{self.get_id()}_action",
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):