django-unfold 0.53.0__tar.gz → 0.55.0__tar.gz

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.
Files changed (277) hide show
  1. {django_unfold-0.53.0 → django_unfold-0.55.0}/PKG-INFO +24 -11
  2. {django_unfold-0.53.0 → django_unfold-0.55.0}/README.md +23 -10
  3. {django_unfold-0.53.0 → django_unfold-0.55.0}/pyproject.toml +2 -2
  4. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/filters/admin/__init__.py +17 -0
  5. django_unfold-0.55.0/src/unfold/contrib/filters/admin/choice_filters.py +173 -0
  6. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/filters/admin/dropdown_filters.py +15 -1
  7. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/filters/admin/mixins.py +25 -0
  8. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/filters/forms.py +41 -3
  9. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/filters/templates/unfold/filters/filters_date_range.html +1 -1
  10. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/filters/templates/unfold/filters/filters_datetime_range.html +1 -1
  11. django_unfold-0.55.0/src/unfold/layout.py +23 -0
  12. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/sites.py +17 -6
  13. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/static/admin/js/inlines.js +23 -3
  14. django_unfold-0.55.0/src/unfold/static/unfold/css/styles.css +1 -0
  15. django_unfold-0.55.0/src/unfold/static/unfold/fonts/material-symbols/LICENSE +202 -0
  16. django_unfold-0.55.0/src/unfold/static/unfold/fonts/material-symbols/Material-Symbols-Outlined.woff2 +0 -0
  17. django_unfold-0.55.0/src/unfold/static/unfold/js/alpine.js +5 -0
  18. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/static/unfold/js/select2.init.js +4 -0
  19. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/styles.css +2 -1
  20. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/change_list.html +15 -13
  21. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/change_list_results.html +1 -1
  22. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/edit_inline/tabular.html +1 -2
  23. django_unfold-0.55.0/src/unfold/templates/unfold/components/button.html +4 -0
  24. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/components/chart/cohort.html +2 -2
  25. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/change_list_filter.html +2 -2
  26. django_unfold-0.55.0/src/unfold/templates/unfold/helpers/change_list_filter_actions.html +33 -0
  27. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/edit_inline/tabular_field.html +10 -8
  28. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/field.html +4 -2
  29. django_unfold-0.55.0/src/unfold/templates/unfold/helpers/form_label.html +7 -0
  30. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/tab_action.html +17 -2
  31. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/widgets/clearable_file_input.html +1 -1
  32. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/widgets/clearable_file_input_small.html +1 -1
  33. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/widgets/radio_option.html +1 -1
  34. django_unfold-0.55.0/src/unfold/templates/unfold_crispy/display_form.html +9 -0
  35. django_unfold-0.55.0/src/unfold/templates/unfold_crispy/errors.html +3 -0
  36. django_unfold-0.55.0/src/unfold/templates/unfold_crispy/field.html +23 -0
  37. django_unfold-0.55.0/src/unfold/templates/unfold_crispy/inputs.html +7 -0
  38. django_unfold-0.55.0/src/unfold/templates/unfold_crispy/layout/attrs.html +1 -0
  39. django_unfold-0.55.0/src/unfold/templates/unfold_crispy/layout/baseinput.html +9 -0
  40. django_unfold-0.55.0/src/unfold/templates/unfold_crispy/layout/button.html +1 -0
  41. django_unfold-0.55.0/src/unfold/templates/unfold_crispy/layout/buttonholder.html +3 -0
  42. django_unfold-0.55.0/src/unfold/templates/unfold_crispy/layout/checkbox.html +19 -0
  43. django_unfold-0.55.0/src/unfold/templates/unfold_crispy/layout/column.html +3 -0
  44. django_unfold-0.55.0/src/unfold/templates/unfold_crispy/layout/div.html +4 -0
  45. django_unfold-0.55.0/src/unfold/templates/unfold_crispy/layout/field_errors.html +7 -0
  46. django_unfold-0.55.0/src/unfold/templates/unfold_crispy/layout/fieldset.html +9 -0
  47. django_unfold-0.55.0/src/unfold/templates/unfold_crispy/layout/help_text.html +5 -0
  48. django_unfold-0.55.0/src/unfold/templates/unfold_crispy/layout/help_text_and_errors.html +3 -0
  49. django_unfold-0.55.0/src/unfold/templates/unfold_crispy/layout/radio_checkbox_select.html +21 -0
  50. django_unfold-0.55.0/src/unfold/templates/unfold_crispy/layout/row.html +3 -0
  51. django_unfold-0.55.0/src/unfold/templates/unfold_crispy/layout/table_inline_formset.html +100 -0
  52. django_unfold-0.55.0/src/unfold/templates/unfold_crispy/uni_form.html +11 -0
  53. django_unfold-0.55.0/src/unfold/templates/unfold_crispy/whole_uni_form.html +14 -0
  54. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templatetags/unfold.py +26 -14
  55. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/widgets.py +88 -1
  56. django_unfold-0.53.0/src/unfold/static/unfold/css/styles.css +0 -1
  57. django_unfold-0.53.0/src/unfold/static/unfold/fonts/material-symbols/Material-Symbols-Outlined.woff2 +0 -0
  58. django_unfold-0.53.0/src/unfold/static/unfold/js/alpine.js +0 -5
  59. django_unfold-0.53.0/src/unfold/templates/unfold/components/button.html +0 -4
  60. django_unfold-0.53.0/src/unfold/templates/unfold/helpers/change_list_filter_actions.html +0 -31
  61. django_unfold-0.53.0/src/unfold/templates/unfold/helpers/form_label.html +0 -7
  62. {django_unfold-0.53.0 → django_unfold-0.55.0}/LICENSE.md +0 -0
  63. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/__init__.py +0 -0
  64. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/admin.py +0 -0
  65. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/apps.py +0 -0
  66. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/checks.py +0 -0
  67. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/components.py +0 -0
  68. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/__init__.py +0 -0
  69. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/filters/__init__.py +0 -0
  70. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/filters/admin/autocomplete_filters.py +0 -0
  71. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/filters/admin/datetime_filters.py +0 -0
  72. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/filters/admin/numeric_filters.py +0 -0
  73. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/filters/admin/text_filters.py +0 -0
  74. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/filters/apps.py +0 -0
  75. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/filters/static/unfold/filters/css/nouislider.min.css +0 -0
  76. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/filters/static/unfold/filters/js/DateTimeShortcuts.js +0 -0
  77. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/filters/static/unfold/filters/js/admin-numeric-filter.js +0 -0
  78. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/filters/static/unfold/filters/js/nouislider.min.js +0 -0
  79. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/filters/static/unfold/filters/js/wNumb.min.js +0 -0
  80. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/filters/templates/unfold/filters/filters_field.html +0 -0
  81. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/filters/templates/unfold/filters/filters_numeric_range.html +0 -0
  82. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/filters/templates/unfold/filters/filters_numeric_single.html +0 -0
  83. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/filters/templates/unfold/filters/filters_numeric_slider.html +0 -0
  84. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/forms/__init__.py +0 -0
  85. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/forms/apps.py +0 -0
  86. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/forms/static/unfold/forms/css/trix.css +0 -0
  87. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/forms/static/unfold/forms/js/trix.config.js +0 -0
  88. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/forms/static/unfold/forms/js/trix.js +0 -0
  89. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/forms/templates/unfold/forms/array.html +0 -0
  90. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/forms/templates/unfold/forms/helpers/toolbar.html +0 -0
  91. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/forms/templates/unfold/forms/wysiwyg.html +0 -0
  92. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/forms/widgets.py +0 -0
  93. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/guardian/__init__.py +0 -0
  94. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/guardian/apps.py +0 -0
  95. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/guardian/templates/admin/guardian/model/change_form.html +0 -0
  96. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/guardian/templates/admin/guardian/model/field.html +0 -0
  97. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/guardian/templates/admin/guardian/model/obj_perms_manage.html +0 -0
  98. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/guardian/templates/admin/guardian/model/obj_perms_manage_group.html +0 -0
  99. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/guardian/templates/admin/guardian/model/obj_perms_manage_user.html +0 -0
  100. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/guardian/templates/unfold/guardian/group_form.html +0 -0
  101. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/guardian/templates/unfold/guardian/user_form.html +0 -0
  102. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/import_export/__init__.py +0 -0
  103. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/import_export/apps.py +0 -0
  104. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/import_export/forms.py +0 -0
  105. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/import_export/templates/admin/import_export/base.html +0 -0
  106. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/import_export/templates/admin/import_export/change_form.html +0 -0
  107. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/import_export/templates/admin/import_export/change_list_export.html +0 -0
  108. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/import_export/templates/admin/import_export/change_list_export_item.html +0 -0
  109. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/import_export/templates/admin/import_export/change_list_import_export.html +0 -0
  110. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/import_export/templates/admin/import_export/change_list_import_item.html +0 -0
  111. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/import_export/templates/admin/import_export/export.html +0 -0
  112. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/import_export/templates/admin/import_export/import.html +0 -0
  113. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/import_export/templates/admin/import_export/import_confirm.html +0 -0
  114. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/import_export/templates/admin/import_export/import_errors.html +0 -0
  115. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/import_export/templates/admin/import_export/import_form.html +0 -0
  116. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/import_export/templates/admin/import_export/import_preview.html +0 -0
  117. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/import_export/templates/admin/import_export/import_validation.html +0 -0
  118. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/import_export/templates/admin/import_export/resource_fields_list.html +0 -0
  119. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/inlines/__init__.py +0 -0
  120. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/inlines/admin.py +0 -0
  121. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/inlines/apps.py +0 -0
  122. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/inlines/checks.py +0 -0
  123. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/inlines/forms.py +0 -0
  124. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/simple_history/__init__.py +0 -0
  125. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/simple_history/apps.py +0 -0
  126. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/simple_history/templates/simple_history/object_history.html +0 -0
  127. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/simple_history/templates/simple_history/object_history_form.html +0 -0
  128. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/simple_history/templates/simple_history/object_history_list.html +0 -0
  129. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/simple_history/templates/simple_history/submit_line.html +0 -0
  130. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/dataclasses.py +0 -0
  131. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/decorators.py +0 -0
  132. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/enums.py +0 -0
  133. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/exceptions.py +0 -0
  134. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/fields.py +0 -0
  135. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/forms.py +0 -0
  136. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/mixins/__init__.py +0 -0
  137. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/mixins/action_model_admin.py +0 -0
  138. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/mixins/base_model_admin.py +0 -0
  139. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/overrides.py +0 -0
  140. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/paginator.py +0 -0
  141. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/sections.py +0 -0
  142. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/settings.py +0 -0
  143. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/static/admin/js/admin/RelatedObjectLookups.js +0 -0
  144. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/static/unfold/css/simplebar.css +0 -0
  145. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/static/unfold/fonts/inter/Inter-Bold.woff2 +0 -0
  146. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/static/unfold/fonts/inter/Inter-Medium.woff2 +0 -0
  147. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/static/unfold/fonts/inter/Inter-Regular.woff2 +0 -0
  148. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/static/unfold/fonts/inter/Inter-SemiBold.woff2 +0 -0
  149. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/static/unfold/fonts/inter/styles.css +0 -0
  150. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/static/unfold/fonts/material-symbols/styles.css +0 -0
  151. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/static/unfold/js/alpine.anchor.js +0 -0
  152. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/static/unfold/js/alpine.persist.js +0 -0
  153. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/static/unfold/js/alpine.resize.js +0 -0
  154. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/static/unfold/js/alpine.sort.js +0 -0
  155. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/static/unfold/js/app.js +0 -0
  156. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/static/unfold/js/chart.js +0 -0
  157. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/static/unfold/js/htmx.js +0 -0
  158. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/static/unfold/js/simplebar.js +0 -0
  159. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/actions.html +0 -0
  160. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/app_index.html +0 -0
  161. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/app_list.html +0 -0
  162. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/auth/user/add_form.html +0 -0
  163. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/auth/user/change_password.html +0 -0
  164. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/base.html +0 -0
  165. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/base_site.html +0 -0
  166. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/change_form.html +0 -0
  167. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/change_form_object_tools.html +0 -0
  168. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/change_list_object_tools.html +0 -0
  169. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/date_hierarchy.html +0 -0
  170. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/delete_confirmation.html +0 -0
  171. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/delete_selected_confirmation.html +0 -0
  172. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/edit_inline/stacked.html +0 -0
  173. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/filter.html +0 -0
  174. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/includes/fieldset.html +0 -0
  175. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/includes/object_delete_summary.html +0 -0
  176. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/index.html +0 -0
  177. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/login.html +0 -0
  178. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/nav_sidebar.html +0 -0
  179. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/object_history.html +0 -0
  180. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/pagination.html +0 -0
  181. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/search_form.html +0 -0
  182. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/submit_line.html +0 -0
  183. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/auth/widgets/read_only_password_hash.html +0 -0
  184. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/registration/logged_out.html +0 -0
  185. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/registration/password_change_done.html +0 -0
  186. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/registration/password_change_form.html +0 -0
  187. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/components/card.html +0 -0
  188. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/components/chart/bar.html +0 -0
  189. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/components/chart/line.html +0 -0
  190. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/components/container.html +0 -0
  191. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/components/flex.html +0 -0
  192. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/components/icon.html +0 -0
  193. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/components/navigation.html +0 -0
  194. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/components/progress.html +0 -0
  195. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/components/separator.html +0 -0
  196. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/components/table.html +0 -0
  197. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/components/text.html +0 -0
  198. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/components/title.html +0 -0
  199. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/components/tracker.html +0 -0
  200. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/account_links.html +0 -0
  201. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/actions_row.html +0 -0
  202. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/add_link.html +0 -0
  203. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/app_list.html +0 -0
  204. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/app_list_default.html +0 -0
  205. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/attrs.html +0 -0
  206. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/boolean.html +0 -0
  207. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/breadcrumb_item.html +0 -0
  208. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/change_list_actions.html +0 -0
  209. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/delete_submit_line.html +0 -0
  210. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/display_dropdown.html +0 -0
  211. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/display_header.html +0 -0
  212. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/display_label.html +0 -0
  213. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/edit_inline/tabular_delete.html +0 -0
  214. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/edit_inline/tabular_error.html +0 -0
  215. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/edit_inline/tabular_heading.html +0 -0
  216. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/edit_inline/tabular_row.html +0 -0
  217. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/edit_inline/tabular_title.html +0 -0
  218. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/empty_results.html +0 -0
  219. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/field_readonly.html +0 -0
  220. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/field_readonly_value.html +0 -0
  221. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/fieldset_row.html +0 -0
  222. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/fieldset_row_checkbox.html +0 -0
  223. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/fieldset_row_field.html +0 -0
  224. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/fieldsets_tabs.html +0 -0
  225. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/form_errors.html +0 -0
  226. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/header.html +0 -0
  227. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/header_back_button.html +0 -0
  228. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/help_text.html +0 -0
  229. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/history.html +0 -0
  230. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/label.html +0 -0
  231. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/language_switch.html +0 -0
  232. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/messages/debug.html +0 -0
  233. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/messages/error.html +0 -0
  234. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/messages/errornote.html +0 -0
  235. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/messages/info.html +0 -0
  236. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/messages/success.html +0 -0
  237. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/messages/warning.html +0 -0
  238. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/messages.html +0 -0
  239. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/navigation.html +0 -0
  240. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/navigation_header.html +0 -0
  241. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/pagination_current_item.html +0 -0
  242. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/pagination_default.html +0 -0
  243. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/pagination_ellipsis.html +0 -0
  244. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/pagination_infinite.html +0 -0
  245. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/search.html +0 -0
  246. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/search_results.html +0 -0
  247. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/site_branding.html +0 -0
  248. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/site_dropdown.html +0 -0
  249. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/site_icon.html +0 -0
  250. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/site_logo.html +0 -0
  251. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/submit.html +0 -0
  252. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/tab_actions.html +0 -0
  253. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/tab_items.html +0 -0
  254. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/tab_list.html +0 -0
  255. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/theme_switch.html +0 -0
  256. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/userlinks.html +0 -0
  257. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/welcomemsg.html +0 -0
  258. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/layouts/base.html +0 -0
  259. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/layouts/base_simple.html +0 -0
  260. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/layouts/skeleton.html +0 -0
  261. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/templatetags/preserve_changelist_filters.html +0 -0
  262. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/widgets/date.html +0 -0
  263. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/widgets/foreign_key_raw_id.html +0 -0
  264. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/widgets/radio.html +0 -0
  265. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/widgets/range.html +0 -0
  266. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/widgets/related_widget_wrapper.html +0 -0
  267. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/widgets/split_datetime.html +0 -0
  268. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/widgets/split_datetime_vertical.html +0 -0
  269. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/widgets/split_money.html +0 -0
  270. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/widgets/textarea.html +0 -0
  271. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/widgets/time.html +0 -0
  272. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/widgets/url.html +0 -0
  273. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templatetags/__init__.py +0 -0
  274. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templatetags/unfold_list.py +0 -0
  275. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/typing.py +0 -0
  276. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/utils.py +0 -0
  277. {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/views.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: django-unfold
3
- Version: 0.53.0
3
+ Version: 0.55.0
4
4
  Summary: Modern Django admin theme for seamless interface development
5
5
  License: MIT
6
6
  Keywords: django,admin,tailwind,theme
@@ -27,6 +27,7 @@ Description-Content-Type: text/markdown
27
27
  ## Unfold Django Admin Theme
28
28
 
29
29
  [![PyPI - Version](https://img.shields.io/pypi/v/django-unfold.svg?style=for-the-badge)](https://pypi.org/project/django-unfold/)
30
+ [![Discord](https://img.shields.io/discord/1297493955231088650?style=for-the-badge&logo=discord&logoColor=%23ffffff&color=7289da)](https://discord.gg/9sQj9MEbNz)
30
31
  [![Build](https://img.shields.io/github/actions/workflow/status/unfoldadmin/django-unfold/release.yml?style=for-the-badge)](https://github.com/unfoldadmin/django-unfold/actions?query=workflow%3Arelease)
31
32
  ![Pre Commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white&style=for-the-badge)
32
33
  ![Code Style - Ruff](https://img.shields.io/badge/code%20style-ruff-30173D.svg?style=for-the-badge)
@@ -43,26 +44,31 @@ Transform your Django admin into a powerful, modern administrative interface wit
43
44
 
44
45
  Need assistance with implementing Unfold or require custom Django development? Professional consulting and development services are available to help transform your Django admin interface and enhance your web applications. Whether migrating from the native Django admin to Unfold or seeking expert technical guidance, reach out to discuss your project requirements and explore development possibilities. [Get in touch](https://unfoldadmin.com/consulting?utm_medium=github&utm_source=unfold) to learn more about available services.
45
46
 
47
+ ## Unfold Studio
48
+
49
+ Unfold Studio is a theme customizer for Django admin that helps you create a branded interface. You can customize colors, upload your logo, and adjust the style without coding. The tool is currently in development, and [you can join the waitlist](https://unfoldadmin.com/studio/) to be notified when it's available.
50
+
46
51
  ## Fresh Features & Enhancements
47
52
 
48
- - **Autocomplete filters:** Enhance filter functionality with built-in autocomplete support
53
+ - **Conditional fields:** Show or hide fields dynamically based on the values of other fields in the form
54
+ - **Infinite paginator:** Efficiently handle large datasets with seamless pagination that reduces server load
55
+ - **Checkbox & radio filters:** Enhanced filter options with checkbox and radio interfaces for intuitive filtering
49
56
  - **Site dropdown:** Configurable dropdown menu in the header area for managing custom navigation links
50
57
  - **Dropdown actions:** Organize action items in customizable dropdown menus
51
- - **Custom tab navigation:** Create flexible, structured tab navigation with customizable routing
52
-
53
58
 
54
59
  ## Core Features & Capabilities
55
60
 
56
61
  - **Visual Interface**: Provides a modern user interface based on the Tailwind CSS framework.
57
- - **Sidebar Navigation**: Simplifies the creation of sidebar menus with icons, collapsible sections, and more.
58
- - **Dark Mode Support**: Includes both light and dark mode themes.
59
- - **Flexible Actions**: Provides multiple ways to define actions throughout the admin interface.
60
- - **Advanced Filters**: Features custom dropdowns, autocomplete, numeric, datetime, and text field filters.
61
- - **Dashboard Tools**: Includes helpers for building custom dashboard pages.
62
- - **UI Components**: Offers reusable interface components such as cards, buttons, and charts.
63
- - **WYSIWYG Editor**: Built-in support for WYSIWYG editing through Trix.
62
+ - **Sidebar navigation**: Simplifies the creation of sidebar menus with icons, collapsible sections, and more.
63
+ - **Dark mode support**: Includes both light and dark mode themes.
64
+ - **Flexible actions**: Provides multiple ways to define actions throughout the admin interface.
65
+ - **Advanced filters**: Features custom dropdowns, autocomplete, numeric, datetime, and text field filters.
66
+ - **Dashboard tools**: Includes helpers for building custom dashboard pages.
67
+ - **UI components**: Offers reusable interface components such as cards, buttons, and charts.
68
+ - **WYSIWYG editor**: Built-in support for WYSIWYG editing through Trix.
64
69
  - **Array widget:** Built-in widget for `django.contrib.postgres.fields.ArrayField`
65
70
  - **Inline tabs:** Group inlines into tab navigation in the change form
71
+ - **Conditional fields:** Show or hide fields dynamically based on the values of other fields in the form
66
72
  - **Model tabs:** Allow defining custom tab navigation for models
67
73
  - **Fieldset tabs:** Merge multiple fieldsets into tabs in the change form
68
74
  - **Sortable inlines:** Allow sorting inlines by dragging and dropping
@@ -73,9 +79,16 @@ Need assistance with implementing Unfold or require custom Django development? P
73
79
  - **Font colors:** Adjust font colors for better readability
74
80
  - **Changeform modes:** Display fields in compressed mode in the change form
75
81
  - **Language switcher:** Allow changing language directly from the admin area
82
+ - **Infinite paginator:** Efficiently handle large datasets with seamless pagination that reduces server load
76
83
  - **Parallel admin:** Supports [running the default admin](https://unfoldadmin.com/blog/migrating-django-admin-unfold/?utm_medium=github&utm_source=unfold) alongside Unfold.
77
84
  - **Third-party packages:** Provides default support for multiple popular applications.
78
85
  - **Configuration:** Allows basic options to be changed in `settings.py`.
79
86
  - **Dependencies:** Built entirely on `django.contrib.admin`.
80
87
  - **VS Code:** Project configuration and development container included.
81
88
 
89
+ ## Credits
90
+
91
+ - Icons: [Material Symbols](https://github.com/google/material-design-icons)
92
+ - Font: [Inter](https://github.com/rsms/inter)
93
+ - Charts: [Chart.js](https://github.com/chartjs/Chart.js)
94
+
@@ -3,6 +3,7 @@
3
3
  ## Unfold Django Admin Theme
4
4
 
5
5
  [![PyPI - Version](https://img.shields.io/pypi/v/django-unfold.svg?style=for-the-badge)](https://pypi.org/project/django-unfold/)
6
+ [![Discord](https://img.shields.io/discord/1297493955231088650?style=for-the-badge&logo=discord&logoColor=%23ffffff&color=7289da)](https://discord.gg/9sQj9MEbNz)
6
7
  [![Build](https://img.shields.io/github/actions/workflow/status/unfoldadmin/django-unfold/release.yml?style=for-the-badge)](https://github.com/unfoldadmin/django-unfold/actions?query=workflow%3Arelease)
7
8
  ![Pre Commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white&style=for-the-badge)
8
9
  ![Code Style - Ruff](https://img.shields.io/badge/code%20style-ruff-30173D.svg?style=for-the-badge)
@@ -19,26 +20,31 @@ Transform your Django admin into a powerful, modern administrative interface wit
19
20
 
20
21
  Need assistance with implementing Unfold or require custom Django development? Professional consulting and development services are available to help transform your Django admin interface and enhance your web applications. Whether migrating from the native Django admin to Unfold or seeking expert technical guidance, reach out to discuss your project requirements and explore development possibilities. [Get in touch](https://unfoldadmin.com/consulting?utm_medium=github&utm_source=unfold) to learn more about available services.
21
22
 
23
+ ## Unfold Studio
24
+
25
+ Unfold Studio is a theme customizer for Django admin that helps you create a branded interface. You can customize colors, upload your logo, and adjust the style without coding. The tool is currently in development, and [you can join the waitlist](https://unfoldadmin.com/studio/) to be notified when it's available.
26
+
22
27
  ## Fresh Features & Enhancements
23
28
 
24
- - **Autocomplete filters:** Enhance filter functionality with built-in autocomplete support
29
+ - **Conditional fields:** Show or hide fields dynamically based on the values of other fields in the form
30
+ - **Infinite paginator:** Efficiently handle large datasets with seamless pagination that reduces server load
31
+ - **Checkbox & radio filters:** Enhanced filter options with checkbox and radio interfaces for intuitive filtering
25
32
  - **Site dropdown:** Configurable dropdown menu in the header area for managing custom navigation links
26
33
  - **Dropdown actions:** Organize action items in customizable dropdown menus
27
- - **Custom tab navigation:** Create flexible, structured tab navigation with customizable routing
28
-
29
34
 
30
35
  ## Core Features & Capabilities
31
36
 
32
37
  - **Visual Interface**: Provides a modern user interface based on the Tailwind CSS framework.
33
- - **Sidebar Navigation**: Simplifies the creation of sidebar menus with icons, collapsible sections, and more.
34
- - **Dark Mode Support**: Includes both light and dark mode themes.
35
- - **Flexible Actions**: Provides multiple ways to define actions throughout the admin interface.
36
- - **Advanced Filters**: Features custom dropdowns, autocomplete, numeric, datetime, and text field filters.
37
- - **Dashboard Tools**: Includes helpers for building custom dashboard pages.
38
- - **UI Components**: Offers reusable interface components such as cards, buttons, and charts.
39
- - **WYSIWYG Editor**: Built-in support for WYSIWYG editing through Trix.
38
+ - **Sidebar navigation**: Simplifies the creation of sidebar menus with icons, collapsible sections, and more.
39
+ - **Dark mode support**: Includes both light and dark mode themes.
40
+ - **Flexible actions**: Provides multiple ways to define actions throughout the admin interface.
41
+ - **Advanced filters**: Features custom dropdowns, autocomplete, numeric, datetime, and text field filters.
42
+ - **Dashboard tools**: Includes helpers for building custom dashboard pages.
43
+ - **UI components**: Offers reusable interface components such as cards, buttons, and charts.
44
+ - **WYSIWYG editor**: Built-in support for WYSIWYG editing through Trix.
40
45
  - **Array widget:** Built-in widget for `django.contrib.postgres.fields.ArrayField`
41
46
  - **Inline tabs:** Group inlines into tab navigation in the change form
47
+ - **Conditional fields:** Show or hide fields dynamically based on the values of other fields in the form
42
48
  - **Model tabs:** Allow defining custom tab navigation for models
43
49
  - **Fieldset tabs:** Merge multiple fieldsets into tabs in the change form
44
50
  - **Sortable inlines:** Allow sorting inlines by dragging and dropping
@@ -49,8 +55,15 @@ Need assistance with implementing Unfold or require custom Django development? P
49
55
  - **Font colors:** Adjust font colors for better readability
50
56
  - **Changeform modes:** Display fields in compressed mode in the change form
51
57
  - **Language switcher:** Allow changing language directly from the admin area
58
+ - **Infinite paginator:** Efficiently handle large datasets with seamless pagination that reduces server load
52
59
  - **Parallel admin:** Supports [running the default admin](https://unfoldadmin.com/blog/migrating-django-admin-unfold/?utm_medium=github&utm_source=unfold) alongside Unfold.
53
60
  - **Third-party packages:** Provides default support for multiple popular applications.
54
61
  - **Configuration:** Allows basic options to be changed in `settings.py`.
55
62
  - **Dependencies:** Built entirely on `django.contrib.admin`.
56
63
  - **VS Code:** Project configuration and development container included.
64
+
65
+ ## Credits
66
+
67
+ - Icons: [Material Symbols](https://github.com/google/material-design-icons)
68
+ - Font: [Inter](https://github.com/rsms/inter)
69
+ - Charts: [Chart.js](https://github.com/chartjs/Chart.js)
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "django-unfold"
3
- version = "0.53.0"
3
+ version = "0.55.0"
4
4
  description = "Modern Django admin theme for seamless interface development"
5
5
  license = "MIT"
6
6
  readme = "README.md"
@@ -90,7 +90,7 @@ legacy_tox_ini = """
90
90
  [tox]
91
91
  isolated_build = true
92
92
  envlist =
93
- python{39,310,311,312,313}-django{42,50,51}
93
+ python{39,310,311,312,313}-django{42,50,51,52}
94
94
 
95
95
  [testenv]
96
96
  skip_install = true
@@ -2,6 +2,15 @@ from unfold.contrib.filters.admin.autocomplete_filters import (
2
2
  AutocompleteSelectFilter,
3
3
  AutocompleteSelectMultipleFilter,
4
4
  )
5
+ from unfold.contrib.filters.admin.choice_filters import (
6
+ AllValuesCheckboxFilter,
7
+ BooleanRadioFilter,
8
+ CheckboxFilter,
9
+ ChoicesCheckboxFilter,
10
+ ChoicesRadioFilter,
11
+ RadioFilter,
12
+ RelatedCheckboxFilter,
13
+ )
5
14
  from unfold.contrib.filters.admin.datetime_filters import (
6
15
  RangeDateFilter,
7
16
  RangeDateTimeFilter,
@@ -23,12 +32,20 @@ from unfold.contrib.filters.admin.numeric_filters import (
23
32
  from unfold.contrib.filters.admin.text_filters import FieldTextFilter, TextFilter
24
33
 
25
34
  __all__ = [
35
+ "AllValuesCheckboxFilter",
36
+ "BooleanRadioFilter",
37
+ "CheckboxFilter",
38
+ "ChoicesCheckboxFilter",
39
+ "ChoicesRadioFilter",
40
+ "MultipleRelatedCheckboxFilter",
41
+ "RadioFilter",
26
42
  "ChoicesDropdownFilter",
27
43
  "MultipleChoicesDropdownFilter",
28
44
  "DropdownFilter",
29
45
  "RelatedDropdownFilter",
30
46
  "MultipleDropdownFilter",
31
47
  "MultipleRelatedDropdownFilter",
48
+ "RelatedCheckboxFilter",
32
49
  "FieldTextFilter",
33
50
  "TextFilter",
34
51
  "RangeDateFilter",
@@ -0,0 +1,173 @@
1
+ from collections.abc import Generator
2
+ from typing import Any
3
+
4
+ from django.contrib import admin
5
+ from django.contrib.admin.views.main import ChangeList
6
+ from django.core.validators import EMPTY_VALUES
7
+ from django.db.models import QuerySet
8
+ from django.http import HttpRequest
9
+ from django.utils.translation import gettext_lazy as _
10
+
11
+ from unfold.contrib.filters.admin.mixins import (
12
+ ChoicesMixin,
13
+ MultiValueMixin,
14
+ ValueMixin,
15
+ )
16
+ from unfold.contrib.filters.forms import CheckboxForm, HorizontalRadioForm, RadioForm
17
+
18
+
19
+ class RadioFilter(admin.SimpleListFilter):
20
+ template = "unfold/filters/filters_field.html"
21
+ form_class = RadioForm
22
+ all_option = ["", _("All")]
23
+
24
+ def choices(self, changelist: ChangeList) -> tuple[dict[str, Any], ...]:
25
+ add_facets = changelist.add_facets
26
+ facet_counts = self.get_facet_queryset(changelist) if add_facets else None
27
+ choices = []
28
+
29
+ if self.all_option:
30
+ choices = [self.all_option]
31
+
32
+ if add_facets:
33
+ for i, (lookup, title) in enumerate(self.lookup_choices):
34
+ if (count := facet_counts.get(f"{i}__c", -1)) != -1:
35
+ title = f"{title} ({count})"
36
+ else:
37
+ title = f"{title} (-)"
38
+
39
+ choices.append((lookup, title))
40
+ else:
41
+ choices.extend(self.lookup_choices)
42
+
43
+ return (
44
+ {
45
+ "form": self.form_class(
46
+ label=_(" By %(filter_title)s ") % {"filter_title": self.title},
47
+ name=self.parameter_name,
48
+ choices=choices,
49
+ data={self.parameter_name: self.value()},
50
+ ),
51
+ },
52
+ )
53
+
54
+
55
+ class CheckboxFilter(RadioFilter):
56
+ form_class = CheckboxForm
57
+ all_option = None
58
+
59
+ def value(self) -> list[Any]:
60
+ return self.request.GET.getlist(self.parameter_name)
61
+
62
+
63
+ class ChoicesRadioFilter(ValueMixin, ChoicesMixin, admin.ChoicesFieldListFilter):
64
+ form_class = RadioForm
65
+ all_option = ["", _("All")]
66
+
67
+
68
+ class ChoicesCheckboxFilter(
69
+ MultiValueMixin, ChoicesMixin, admin.ChoicesFieldListFilter
70
+ ):
71
+ form_class = CheckboxForm
72
+ all_option = None
73
+
74
+
75
+ class BooleanRadioFilter(ValueMixin, admin.BooleanFieldListFilter):
76
+ template = "unfold/filters/filters_field.html"
77
+ form_class = HorizontalRadioForm
78
+ all_option = ["", _("All")]
79
+
80
+ def choices(self, changelist: ChangeList) -> Generator[dict[str, Any], None, None]:
81
+ add_facets = changelist.add_facets
82
+ facet_counts = self.get_facet_queryset(changelist) if add_facets else None
83
+
84
+ if add_facets:
85
+ choices = [
86
+ self.all_option,
87
+ *[
88
+ ("1", f"{_('Yes')} ({facet_counts['true__c']})"),
89
+ ("0", f"{_('No')} ({facet_counts['false__c']})"),
90
+ ],
91
+ ]
92
+ else:
93
+ choices = [
94
+ self.all_option,
95
+ *[
96
+ ("1", _("Yes")),
97
+ ("0", _("No")),
98
+ ],
99
+ ]
100
+
101
+ yield {
102
+ "form": self.form_class(
103
+ label=_(" By %(filter_title)s ") % {"filter_title": self.title},
104
+ name=self.lookup_kwarg,
105
+ choices=choices,
106
+ data={self.lookup_kwarg: self.value()},
107
+ ),
108
+ }
109
+
110
+
111
+ class RelatedCheckboxFilter(MultiValueMixin, admin.RelatedFieldListFilter):
112
+ template = "unfold/filters/filters_field.html"
113
+ form_class = CheckboxForm
114
+
115
+ def queryset(self, request: HttpRequest, queryset: QuerySet) -> QuerySet:
116
+ if self.value() not in EMPTY_VALUES:
117
+ return super().queryset(request, queryset)
118
+
119
+ return queryset
120
+
121
+ def choices(self, changelist: ChangeList) -> Generator[dict[str, Any], None, None]:
122
+ add_facets = changelist.add_facets
123
+ facet_counts = self.get_facet_queryset(changelist) if add_facets else None
124
+
125
+ if add_facets:
126
+ choices = []
127
+
128
+ for pk_val, val in self.lookup_choices:
129
+ count = facet_counts[f"{pk_val}__c"]
130
+ choice = (pk_val, f"{val} ({count})")
131
+ choices.append(choice)
132
+ else:
133
+ choices = self.lookup_choices
134
+
135
+ yield {
136
+ "form": self.form_class(
137
+ label=_(" By %(filter_title)s ") % {"filter_title": self.title},
138
+ name=self.lookup_kwarg,
139
+ choices=choices,
140
+ data={self.lookup_kwarg: self.value()},
141
+ ),
142
+ }
143
+
144
+
145
+ class AllValuesCheckboxFilter(MultiValueMixin, admin.AllValuesFieldListFilter):
146
+ template = "unfold/filters/filters_field.html"
147
+ form_class = CheckboxForm
148
+
149
+ def choices(self, changelist: ChangeList) -> Generator[dict[str, Any], None, None]:
150
+ add_facets = changelist.add_facets
151
+ facet_counts = self.get_facet_queryset(changelist) if add_facets else None
152
+
153
+ if add_facets:
154
+ choices = []
155
+
156
+ for i, val in enumerate(self.lookup_choices):
157
+ count = facet_counts[f"{i}__c"]
158
+ choice = (val, f"{val} ({count})")
159
+ choices.append(choice)
160
+ else:
161
+ choices = [[val, val] for _i, val in enumerate(self.lookup_choices)]
162
+
163
+ if len(choices) == 0:
164
+ return
165
+
166
+ yield {
167
+ "form": self.form_class(
168
+ label=_(" By %(filter_title)s ") % {"filter_title": self.title},
169
+ name=self.lookup_kwarg,
170
+ choices=choices,
171
+ data={self.lookup_kwarg: self.value()},
172
+ ),
173
+ }
@@ -86,11 +86,25 @@ 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
90
+ facet_counts = self.get_facet_queryset(changelist) if add_facets else None
91
+
92
+ if add_facets:
93
+ choices = [self.all_option]
94
+
95
+ for pk_val, val in self.lookup_choices:
96
+ if add_facets:
97
+ count = facet_counts[f"{pk_val}__c"]
98
+ choice = (pk_val, f"{val} ({count})")
99
+ choices.append(choice)
100
+ else:
101
+ choices = [self.all_option, *self.lookup_choices]
102
+
89
103
  yield {
90
104
  "form": self.form_class(
91
105
  label=_(" By %(filter_title)s ") % {"filter_title": self.title},
92
106
  name=self.lookup_kwarg,
93
- choices=[self.all_option, *self.lookup_choices],
107
+ choices=choices,
94
108
  data={self.lookup_kwarg: self.value()},
95
109
  multiple=self.multiple if hasattr(self, "multiple") else False,
96
110
  ),
@@ -51,6 +51,31 @@ class DropdownMixin:
51
51
  return queryset
52
52
 
53
53
 
54
+ class ChoicesMixin:
55
+ template = "unfold/filters/filters_field.html"
56
+
57
+ def choices(self, changelist: ChangeList) -> Generator[dict[str, Any], None, None]:
58
+ add_facets = changelist.add_facets
59
+ facet_counts = self.get_facet_queryset(changelist) if add_facets else None
60
+ choices = [self.all_option] if self.all_option else []
61
+
62
+ for i, choice in enumerate(self.field.flatchoices):
63
+ if add_facets:
64
+ count = facet_counts[f"{i}__c"]
65
+ choice = (choice[0], f"{choice[1]} ({count})")
66
+
67
+ choices.append(choice)
68
+
69
+ yield {
70
+ "form": self.form_class(
71
+ label=_(" By %(filter_title)s ") % {"filter_title": self.title},
72
+ name=self.lookup_kwarg,
73
+ choices=choices,
74
+ data={self.lookup_kwarg: self.value()},
75
+ ),
76
+ }
77
+
78
+
54
79
  class RangeNumericMixin:
55
80
  request = None
56
81
  parameter_name = None
@@ -1,14 +1,20 @@
1
1
  from django import forms
2
+ from django.contrib.admin.options import HORIZONTAL
2
3
  from django.contrib.admin.widgets import AutocompleteSelect, AutocompleteSelectMultiple
3
4
  from django.db.models import Field as ModelField
4
- from django.forms import ChoiceField, ModelMultipleChoiceField, MultipleChoiceField
5
+ from django.forms import (
6
+ ChoiceField,
7
+ ModelMultipleChoiceField,
8
+ MultipleChoiceField,
9
+ )
5
10
  from django.http import HttpRequest
6
11
  from django.utils.translation import gettext_lazy as _
7
12
 
8
13
  from unfold.admin import ModelAdmin
9
-
10
- from ...widgets import (
14
+ from unfold.widgets import (
11
15
  INPUT_CLASSES,
16
+ UnfoldAdminCheckboxSelectMultiple,
17
+ UnfoldAdminRadioSelectWidget,
12
18
  UnfoldAdminSelectMultipleWidget,
13
19
  UnfoldAdminSelectWidget,
14
20
  UnfoldAdminSplitDateTimeVerticalWidget,
@@ -71,6 +77,38 @@ class AutocompleteDropdownForm(forms.Form):
71
77
  }
72
78
 
73
79
 
80
+ class CheckboxForm(forms.Form):
81
+ field = MultipleChoiceField
82
+ widget = UnfoldAdminCheckboxSelectMultiple
83
+
84
+ def __init__(
85
+ self,
86
+ name: str,
87
+ label: str,
88
+ choices: tuple,
89
+ *args,
90
+ **kwargs,
91
+ ) -> None:
92
+ super().__init__(*args, **kwargs)
93
+
94
+ self.fields[name] = self.field(
95
+ label=label,
96
+ required=False,
97
+ choices=choices,
98
+ widget=self.widget,
99
+ )
100
+
101
+
102
+ class RadioForm(CheckboxForm):
103
+ field = ChoiceField
104
+ widget = UnfoldAdminRadioSelectWidget
105
+
106
+
107
+ class HorizontalRadioForm(RadioForm):
108
+ horizontal = True
109
+ widget = UnfoldAdminRadioSelectWidget(radio_style=HORIZONTAL)
110
+
111
+
74
112
  class DropdownForm(forms.Form):
75
113
  widget = UnfoldAdminSelectWidget(
76
114
  attrs={
@@ -4,7 +4,7 @@
4
4
  <div class="flex flex-col">
5
5
  <h3 class="font-semibold mb-2 text-font-important-light dark:text-font-important-dark">{% blocktrans with filter_title=title %}By {{ filter_title }}{% endblocktrans %}</h3>
6
6
 
7
- <div class="flex flex-col space-y-4">
7
+ <div class="flex flex-col space-y-2">
8
8
  {% for field in choice.form %}
9
9
  <div class="flex flex-row flex-wrap group relative{% if field.errors %} errors{% endif %}">
10
10
  {{ field }}
@@ -4,7 +4,7 @@
4
4
  <div class="flex flex-col">
5
5
  <h3 class="font-semibold mb-2 text-font-important-light dark:text-font-important-dark">{% blocktrans with filter_title=title %}By {{ filter_title }}{% endblocktrans %}</h3>
6
6
 
7
- <div class="flex flex-col space-y-4">
7
+ <div class="flex flex-col space-y-2">
8
8
  {% for field in choice.form %}
9
9
  <div class="flex flex-row flex-wrap group relative{% if field.errors %} errors{% endif %}">
10
10
  {{ field }}
@@ -0,0 +1,23 @@
1
+ from crispy_forms.layout import BaseInput
2
+
3
+ from unfold.widgets import BUTTON_CLASSES
4
+
5
+
6
+ class ButtonClassesMixin:
7
+ def __init__(self, *args, css_class=None, **kwargs):
8
+ classes = BUTTON_CLASSES
9
+
10
+ if css_class:
11
+ classes.append(css_class)
12
+
13
+ self.field_classes = " ".join(classes)
14
+
15
+ super().__init__(*args, **kwargs)
16
+
17
+
18
+ class Submit(ButtonClassesMixin, BaseInput):
19
+ input_type = "submit"
20
+
21
+
22
+ class Button(ButtonClassesMixin, BaseInput):
23
+ input_type = "button"
@@ -24,9 +24,16 @@ except ImportError:
24
24
  return func
25
25
 
26
26
 
27
- from .settings import get_config
28
- from .utils import hex_to_rgb
29
- from .widgets import CHECKBOX_CLASSES, INPUT_CLASSES
27
+ from unfold.settings import get_config
28
+ from unfold.utils import hex_to_rgb
29
+ from unfold.widgets import (
30
+ BUTTON_CLASSES,
31
+ CHECKBOX_CLASSES,
32
+ FILE_CLASSES,
33
+ INPUT_CLASSES,
34
+ RADIO_CLASSES,
35
+ SWITCH_CLASSES,
36
+ )
30
37
 
31
38
 
32
39
  class UnfoldAdminSite(AdminSite):
@@ -34,7 +41,7 @@ class UnfoldAdminSite(AdminSite):
34
41
  settings_name = "UNFOLD"
35
42
 
36
43
  def __init__(self, name: str = "admin") -> None:
37
- from .forms import AuthenticationForm
44
+ from unfold.forms import AuthenticationForm
38
45
 
39
46
  super().__init__(name)
40
47
 
@@ -68,8 +75,12 @@ class UnfoldAdminSite(AdminSite):
68
75
  sidebar_config = self._get_config("SIDEBAR", request)
69
76
  data = {
70
77
  "form_classes": {
71
- "text_input": INPUT_CLASSES,
72
- "checkbox": CHECKBOX_CLASSES,
78
+ "text_input": " ".join(INPUT_CLASSES),
79
+ "checkbox": " ".join(CHECKBOX_CLASSES),
80
+ "button": " ".join(BUTTON_CLASSES),
81
+ "radio": " ".join(RADIO_CLASSES),
82
+ "switch": " ".join(SWITCH_CLASSES),
83
+ "file": " ".join(FILE_CLASSES),
73
84
  },
74
85
  "site_title": self._get_config("SITE_TITLE", request) or self.site_title,
75
86
  "site_header": self._get_config("SITE_HEADER", request) or self.site_header,
@@ -96,12 +96,23 @@
96
96
  .removeClass(options.emptyCssClass)
97
97
  .addClass(options.formCssClass)
98
98
  .attr("id", options.prefix + "-" + nextIndex);
99
+
99
100
  addInlineDeleteButton(row);
100
101
  row.find("*").each(function () {
101
102
  updateElementIndex(this, options.prefix, totalForms.val());
102
103
  });
104
+
103
105
  // Insert the new form when it has been fully edited.
104
- row.insertBefore($(template));
106
+ // !CHANGED from original
107
+ if ($(template).parent().is("tbody")) {
108
+ row
109
+ .wrap('<tbody class="template"></tbody>')
110
+ .parent()
111
+ .insertBefore($(template).parent());
112
+ } else {
113
+ row.insertBefore($(template));
114
+ }
115
+
105
116
  // Update number of total forms.
106
117
  $(totalForms).val(parseInt(totalForms.val(), 10) + 1);
107
118
  nextIndex += 1;
@@ -183,7 +194,13 @@
183
194
  if (prevRow.length && prevRow.hasClass("row-form-errors")) {
184
195
  prevRow.remove();
185
196
  }
186
- row.remove();
197
+
198
+ // !CHANGED from original
199
+ if (deleteButton.parent().parent().parent().parent().is("tbody")) {
200
+ row.parent().remove();
201
+ } else {
202
+ row.remove();
203
+ }
187
204
  nextIndex -= 1;
188
205
  // Pass the deleted form to the post-delete callback, if provided.
189
206
  if (options.removed) {
@@ -245,8 +262,11 @@
245
262
  }
246
263
 
247
264
  // Create the delete buttons for all unsaved inlines:
265
+ // !CHANGED from original, added parent() and used find() instead of filter()
248
266
  $this
249
- .filter(
267
+ .parent()
268
+ .parent()
269
+ .find(
250
270
  "." +
251
271
  options.formCssClass +
252
272
  ":not(.has_original):not(." +