django-unfold 0.55.1__py3-none-any.whl → 0.55.2__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: django-unfold
3
- Version: 0.55.1
3
+ Version: 0.55.2
4
4
  Summary: Modern Django admin theme for seamless interface development
5
5
  License: MIT
6
6
  Keywords: django,admin,tailwind,theme
@@ -1,5 +1,5 @@
1
1
  unfold/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- unfold/admin.py,sha256=_dshyJ1LhGZhcx-eRdny9l1OEcIrqxmKzQzpfZcQAY4,6205
2
+ unfold/admin.py,sha256=2YwKqP5slOtqpEInq_u-0-XlddY7Qnj21VeH-lsLkxg,6552
3
3
  unfold/apps.py,sha256=SlBXPYrUd2uXn67qFbRvbXSUk3XFWrF4-5WELgDCvho,381
4
4
  unfold/checks.py,sha256=8I3i4xR_KgyJdpQyZUZzKNeyYf-sNzg6PAlsREuMfgI,1664
5
5
  unfold/components.py,sha256=vqkQzseYUvLXDohmTVAlbKopALjyX4WA9yglvdfhqu4,1283
@@ -7,10 +7,10 @@ unfold/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
7
  unfold/contrib/filters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
8
  unfold/contrib/filters/admin/__init__.py,sha256=7pooAoA2Y9MbBL_RTJBZeIAwV5ECrOvMbe0_egoHfew,1663
9
9
  unfold/contrib/filters/admin/autocomplete_filters.py,sha256=Jh3m3iQ8YubZRQDVzHPGfpk9RulOhHkZc0N7L6KV9wc,514
10
- unfold/contrib/filters/admin/choice_filters.py,sha256=xptxmUM9FL4xZklBOBnFR0yNlzNAZgEt3xLBtMBgQko,5575
10
+ unfold/contrib/filters/admin/choice_filters.py,sha256=wI_m5k8SLwHkWoFeCPvI0bN_RuF0RNyzRP3z8jor684,5651
11
11
  unfold/contrib/filters/admin/datetime_filters.py,sha256=cVari_7jsfeYxJoRBhcAUOr6v9XdtDtMuMs-S1Irafo,7757
12
- unfold/contrib/filters/admin/dropdown_filters.py,sha256=aBJeutavLRocbrverAUM6mx4_kCyDWKnjcx3JRVqXuc,3837
13
- unfold/contrib/filters/admin/mixins.py,sha256=4SiJ1Qnp-REUXOhk80zq8uW0nc2i-r8aftvSaFrpPXw,5820
12
+ unfold/contrib/filters/admin/dropdown_filters.py,sha256=exiIyU6c_as7XBJsaAPPx5b8eY3IDbuCFGPJu1b0ux4,3856
13
+ unfold/contrib/filters/admin/mixins.py,sha256=Z8BrdqbnjM1Ldr7qfhb6aWeOXKc5NqUgp-1NDU7SqS4,5839
14
14
  unfold/contrib/filters/admin/numeric_filters.py,sha256=8GNmesgMmMIfEZb2IrGbaBoJuvB2FpIc7wPIPBpHat4,6420
15
15
  unfold/contrib/filters/admin/text_filters.py,sha256=19cOEGpSaXafcM8QuGiYaWmNi5UIQnCXEhKG-vCTfe8,2088
16
16
  unfold/contrib/filters/apps.py,sha256=wEySJy0gMLzFLb9XNKE-RexiO05X7NaQ5QmxZyziJ_k,136
@@ -226,7 +226,7 @@ unfold/templates/unfold/helpers/site_logo.html,sha256=S_QJoT2qh0xw0ciaKxoT4GJ6QI
226
226
  unfold/templates/unfold/helpers/submit.html,sha256=4Mgf4lx7Atm8GPqD6LTJK3NA9zoSJjs9VPig7sDp8Ao,203
227
227
  unfold/templates/unfold/helpers/tab_action.html,sha256=ODm7ws5sbhpE4OvGuQbzynlVwk6AJRreMUra6hh1lxM,3306
228
228
  unfold/templates/unfold/helpers/tab_actions.html,sha256=DMNqY1YyrNrcutOMC3J1neZZjIkPeYShp1i5xZ10nrc,695
229
- unfold/templates/unfold/helpers/tab_items.html,sha256=Gi6cjYJ7tJWO6zSXjg8xNHY9ALpYzjQOEORusf_AZfg,3325
229
+ unfold/templates/unfold/helpers/tab_items.html,sha256=I-lM7ID6W9oCM9lOuAxu4m40cRlFquJLYLC4-RFoCTw,3349
230
230
  unfold/templates/unfold/helpers/tab_list.html,sha256=Tqkug9GyoIQ2geVKWrnnuE0bxeTRXj0MSEwwixoOGz4,436
231
231
  unfold/templates/unfold/helpers/theme_switch.html,sha256=Kh3Q8RuBWCUuY8YJLwBwd5yKzDhK6y0Ggx_ERoGEGv8,2218
232
232
  unfold/templates/unfold/helpers/userlinks.html,sha256=oZqiwCxG_zRecAbzYrr8_hQvkndVB6-liP6LEZM1UZc,863
@@ -276,7 +276,7 @@ unfold/typing.py,sha256=i7LM2LiwYTAjT5-OLDUPVn5b9X-DMmHnjlZG2toWwSE,692
276
276
  unfold/utils.py,sha256=SJikRuAuJN0bE9rfzUujZwycTRrzQm14Hk0zB0EwivU,6164
277
277
  unfold/views.py,sha256=FuYnMrlg6SegLUDDN6An__yZj8rchD_iBK8myieYhkA,1492
278
278
  unfold/widgets.py,sha256=-l0eRljJheVWhTtD0nTvNuY1dvNmwtfd-aqXdSVr-q0,22344
279
- django_unfold-0.55.1.dist-info/LICENSE.md,sha256=Ltk_quRyyvV3J5v3brtOqmibeZSw2Hrb8bY1W3ya0Ik,1077
280
- django_unfold-0.55.1.dist-info/METADATA,sha256=t0DhmEvjtNDYPVLS_fO_1pGZSp-9BWhGe1rrL4_zmPI,7951
281
- django_unfold-0.55.1.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
282
- django_unfold-0.55.1.dist-info/RECORD,,
279
+ django_unfold-0.55.2.dist-info/LICENSE.md,sha256=Ltk_quRyyvV3J5v3brtOqmibeZSw2Hrb8bY1W3ya0Ik,1077
280
+ django_unfold-0.55.2.dist-info/METADATA,sha256=VU-0LANsFK1IMiSmz7m0Bc42ToZA16I5mkBi2iB3GWQ,7951
281
+ django_unfold-0.55.2.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
282
+ django_unfold-0.55.2.dist-info/RECORD,,
unfold/admin.py CHANGED
@@ -9,6 +9,7 @@ from django.contrib.admin import display, helpers
9
9
  from django.db.models import BLANK_CHOICE_DASH, Model
10
10
  from django.http import HttpRequest, HttpResponse
11
11
  from django.shortcuts import redirect
12
+ from django.template.response import TemplateResponse
12
13
  from django.urls import URLPattern, path
13
14
  from django.utils.safestring import mark_safe
14
15
  from django.utils.translation import gettext_lazy as _
@@ -56,12 +57,12 @@ class ModelAdmin(BaseModelAdminMixin, ActionModelAdminMixin, BaseModelAdmin):
56
57
  warn_unsaved_form = False
57
58
  checks_class = UnfoldModelAdminChecks
58
59
 
59
- @property
60
- def media(self):
61
- media = super().media
60
+ def changelist_view(
61
+ self, request: HttpRequest, extra_context: Optional[dict[str, str]] = None
62
+ ) -> TemplateResponse:
62
63
  additional_media = forms.Media()
63
64
 
64
- for filter in self.list_filter:
65
+ for filter in self.get_list_filter(request):
65
66
  if (
66
67
  isinstance(filter, (tuple, list))
67
68
  and hasattr(filter[1], "form_class")
@@ -71,7 +72,16 @@ class ModelAdmin(BaseModelAdminMixin, ActionModelAdminMixin, BaseModelAdmin):
71
72
  elif hasattr(filter, "form_class") and hasattr(filter.form_class, "Media"):
72
73
  additional_media += forms.Media(filter.form_class.Media)
73
74
 
74
- return media + additional_media
75
+ if not extra_context:
76
+ extra_context = {}
77
+
78
+ extra_context.update(
79
+ {
80
+ "media": self.media + additional_media,
81
+ }
82
+ )
83
+
84
+ return super().changelist_view(request, extra_context)
75
85
 
76
86
  def get_fieldsets(self, request: HttpRequest, obj=None) -> FieldsetsType:
77
87
  if not obj and self.add_fieldsets:
@@ -22,7 +22,7 @@ class RadioFilter(admin.SimpleListFilter):
22
22
  all_option = ["", _("All")]
23
23
 
24
24
  def choices(self, changelist: ChangeList) -> tuple[dict[str, Any], ...]:
25
- add_facets = changelist.add_facets
25
+ add_facets = getattr(changelist, "add_facets", False)
26
26
  facet_counts = self.get_facet_queryset(changelist) if add_facets else None
27
27
  choices = []
28
28
 
@@ -78,7 +78,7 @@ class BooleanRadioFilter(ValueMixin, admin.BooleanFieldListFilter):
78
78
  all_option = ["", _("All")]
79
79
 
80
80
  def choices(self, changelist: ChangeList) -> Generator[dict[str, Any], None, None]:
81
- add_facets = changelist.add_facets
81
+ add_facets = getattr(changelist, "add_facets", False)
82
82
  facet_counts = self.get_facet_queryset(changelist) if add_facets else None
83
83
 
84
84
  if add_facets:
@@ -119,7 +119,7 @@ class RelatedCheckboxFilter(MultiValueMixin, admin.RelatedFieldListFilter):
119
119
  return queryset
120
120
 
121
121
  def choices(self, changelist: ChangeList) -> Generator[dict[str, Any], None, None]:
122
- add_facets = changelist.add_facets
122
+ add_facets = getattr(changelist, "add_facets", False)
123
123
  facet_counts = self.get_facet_queryset(changelist) if add_facets else None
124
124
 
125
125
  if add_facets:
@@ -147,7 +147,7 @@ class AllValuesCheckboxFilter(MultiValueMixin, admin.AllValuesFieldListFilter):
147
147
  form_class = CheckboxForm
148
148
 
149
149
  def choices(self, changelist: ChangeList) -> Generator[dict[str, Any], None, None]:
150
- add_facets = changelist.add_facets
150
+ add_facets = getattr(changelist, "add_facets", False)
151
151
  facet_counts = self.get_facet_queryset(changelist) if add_facets else None
152
152
 
153
153
  if add_facets:
@@ -86,7 +86,7 @@ class RelatedDropdownFilter(ValueMixin, DropdownMixin, admin.RelatedFieldListFil
86
86
  self.request = request
87
87
 
88
88
  def choices(self, changelist: ChangeList) -> Generator[dict[str, Any], None, None]:
89
- add_facets = changelist.add_facets
89
+ add_facets = getattr(changelist, "add_facets", False)
90
90
  facet_counts = self.get_facet_queryset(changelist) if add_facets else None
91
91
 
92
92
  if add_facets:
@@ -55,7 +55,7 @@ class ChoicesMixin:
55
55
  template = "unfold/filters/filters_field.html"
56
56
 
57
57
  def choices(self, changelist: ChangeList) -> Generator[dict[str, Any], None, None]:
58
- add_facets = changelist.add_facets
58
+ add_facets = getattr(changelist, "add_facets", False)
59
59
  facet_counts = self.get_facet_queryset(changelist) if add_facets else None
60
60
  choices = [self.all_option] if self.all_option else []
61
61
 
@@ -5,11 +5,11 @@
5
5
  {% for item in tabs_list %}
6
6
  {% if item.has_permission %}
7
7
  <li class="border-b last:border-b-0 md:border-b-0 md:mr-8 dark:border-base-800">
8
- <a href="{% if item.link_callback %}{{ item.link_callback }}{% else %}{{ item.link }}{% endif %}{% if item.inline %}#{{ item.inline }}{% endif %}"
8
+ <a href="{% if item.link_callback %}{{ item.link_callback }}{% else %}{{ item.link }}{% endif %}{% if item.inline %}#{{ item.inline|slugify }}{% endif %}"
9
9
  class="block px-3 py-2 md:py-4 md:px-0 dark:border-base-800 {% if item.active and not item.inline %} border-b font-semibold -mb-px text-primary-600 hover:text-primary-600 dark:text-primary-500 dark:hover:text-primary-500 md:border-primary-500 dark:md:!border-primary-600{% else %}font-medium hover:text-primary-600 dark:hover:text-primary-500{% endif %}"
10
10
  {% if item.inline %}
11
- x-on:click="activeTab = '{{ item.inline }}'"
12
- x-bind:class="{'border-b border-base-200 dark:border-base-800 md:border-primary-500 dark:md:!border-primary-600 font-semibold -mb-px text-primary-600 dark:text-primary-500': activeTab == '{{ item.inline }}'}"
11
+ x-on:click="activeTab = '{{ item.inline|slugify }}'"
12
+ x-bind:class="{'border-b border-base-200 dark:border-base-800 md:border-primary-500 dark:md:!border-primary-600 font-semibold -mb-px text-primary-600 dark:text-primary-500': activeTab == '{{ item.inline|slugify }}'}"
13
13
  {% endif %}
14
14
  >
15
15
  {{ item.title }}