django-unfold 0.34.0__tar.gz → 0.35.0__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (202) hide show
  1. {django_unfold-0.34.0 → django_unfold-0.35.0}/PKG-INFO +17 -5
  2. {django_unfold-0.34.0 → django_unfold-0.35.0}/README.md +16 -4
  3. {django_unfold-0.34.0 → django_unfold-0.35.0}/pyproject.toml +1 -1
  4. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/admin.py +7 -5
  5. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/filters/admin.py +34 -1
  6. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/filters/forms.py +36 -3
  7. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/decorators.py +2 -2
  8. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/static/unfold/js/app.js +23 -0
  9. django_unfold-0.35.0/src/unfold/static/unfold/js/select2.init.js +15 -0
  10. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/admin/change_form.html +1 -1
  11. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/admin/submit_line.html +1 -1
  12. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/widgets.py +11 -1
  13. {django_unfold-0.34.0 → django_unfold-0.35.0}/LICENSE.md +0 -0
  14. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/__init__.py +0 -0
  15. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/apps.py +0 -0
  16. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/checks.py +0 -0
  17. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/__init__.py +0 -0
  18. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/filters/__init__.py +0 -0
  19. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/filters/apps.py +0 -0
  20. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/filters/static/unfold/filters/css/nouislider.min.css +0 -0
  21. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/filters/static/unfold/filters/js/DateTimeShortcuts.js +0 -0
  22. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/filters/static/unfold/filters/js/admin-numeric-filter.js +0 -0
  23. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/filters/static/unfold/filters/js/nouislider.min.js +0 -0
  24. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/filters/static/unfold/filters/js/wNumb.min.js +0 -0
  25. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/filters/templates/unfold/filters/filters_date_range.html +0 -0
  26. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/filters/templates/unfold/filters/filters_datetime_range.html +0 -0
  27. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/filters/templates/unfold/filters/filters_field.html +0 -0
  28. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/filters/templates/unfold/filters/filters_numeric_range.html +0 -0
  29. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/filters/templates/unfold/filters/filters_numeric_single.html +0 -0
  30. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/filters/templates/unfold/filters/filters_numeric_slider.html +0 -0
  31. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/forms/__init__.py +0 -0
  32. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/forms/apps.py +0 -0
  33. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/forms/static/unfold/forms/css/trix.css +0 -0
  34. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/forms/static/unfold/forms/js/trix.config.js +0 -0
  35. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/forms/static/unfold/forms/js/trix.js +0 -0
  36. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/forms/templates/unfold/forms/array.html +0 -0
  37. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/forms/templates/unfold/forms/helpers/toolbar.html +0 -0
  38. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/forms/templates/unfold/forms/wysiwyg.html +0 -0
  39. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/forms/widgets.py +0 -0
  40. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/guardian/__init__.py +0 -0
  41. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/guardian/apps.py +0 -0
  42. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/guardian/templates/admin/guardian/model/change_form.html +0 -0
  43. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/guardian/templates/admin/guardian/model/field.html +0 -0
  44. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/guardian/templates/admin/guardian/model/obj_perms_manage.html +0 -0
  45. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/guardian/templates/admin/guardian/model/obj_perms_manage_group.html +0 -0
  46. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/guardian/templates/admin/guardian/model/obj_perms_manage_user.html +0 -0
  47. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/guardian/templates/unfold/guardian/group_form.html +0 -0
  48. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/guardian/templates/unfold/guardian/user_form.html +0 -0
  49. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/import_export/__init__.py +0 -0
  50. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/import_export/apps.py +0 -0
  51. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/import_export/forms.py +0 -0
  52. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/import_export/templates/admin/import_export/base.html +0 -0
  53. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/import_export/templates/admin/import_export/change_form.html +0 -0
  54. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/import_export/templates/admin/import_export/change_list_export.html +0 -0
  55. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/import_export/templates/admin/import_export/change_list_export_item.html +0 -0
  56. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/import_export/templates/admin/import_export/change_list_import_export.html +0 -0
  57. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/import_export/templates/admin/import_export/change_list_import_item.html +0 -0
  58. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/import_export/templates/admin/import_export/export.html +0 -0
  59. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/import_export/templates/admin/import_export/import.html +0 -0
  60. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/import_export/templates/admin/import_export/import_confirm.html +0 -0
  61. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/import_export/templates/admin/import_export/import_errors.html +0 -0
  62. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/import_export/templates/admin/import_export/import_form.html +0 -0
  63. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/import_export/templates/admin/import_export/import_preview.html +0 -0
  64. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/import_export/templates/admin/import_export/import_validation.html +0 -0
  65. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/import_export/templates/admin/import_export/resource_fields_list.html +0 -0
  66. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/inlines/__init__.py +0 -0
  67. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/inlines/admin.py +0 -0
  68. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/inlines/apps.py +0 -0
  69. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/inlines/checks.py +0 -0
  70. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/inlines/forms.py +0 -0
  71. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/simple_history/__init__.py +0 -0
  72. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/simple_history/apps.py +0 -0
  73. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/simple_history/templates/simple_history/object_history.html +0 -0
  74. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/simple_history/templates/simple_history/object_history_form.html +0 -0
  75. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/simple_history/templates/simple_history/object_history_list.html +0 -0
  76. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/contrib/simple_history/templates/simple_history/submit_line.html +0 -0
  77. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/dataclasses.py +0 -0
  78. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/exceptions.py +0 -0
  79. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/fields.py +0 -0
  80. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/forms.py +0 -0
  81. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/settings.py +0 -0
  82. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/sites.py +0 -0
  83. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/static/unfold/css/simplebar.css +0 -0
  84. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/static/unfold/css/styles.css +0 -0
  85. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/static/unfold/fonts/inter/Inter-Bold.woff2 +0 -0
  86. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/static/unfold/fonts/inter/Inter-Medium.woff2 +0 -0
  87. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/static/unfold/fonts/inter/Inter-Regular.woff2 +0 -0
  88. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/static/unfold/fonts/inter/Inter-SemiBold.woff2 +0 -0
  89. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/static/unfold/fonts/inter/styles.css +0 -0
  90. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/static/unfold/fonts/material-symbols/Material-Symbols-Outlined.woff2 +0 -0
  91. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/static/unfold/fonts/material-symbols/styles.css +0 -0
  92. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/static/unfold/js/alpine.anchor.js +0 -0
  93. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/static/unfold/js/alpine.js +0 -0
  94. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/static/unfold/js/alpine.persist.js +0 -0
  95. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/static/unfold/js/chart.js +0 -0
  96. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/static/unfold/js/htmx.js +0 -0
  97. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/static/unfold/js/simplebar.js +0 -0
  98. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/styles.css +0 -0
  99. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/admin/actions.html +0 -0
  100. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/admin/app_index.html +0 -0
  101. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/admin/app_list.html +0 -0
  102. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/admin/auth/user/add_form.html +0 -0
  103. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/admin/auth/user/change_password.html +0 -0
  104. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/admin/base.html +0 -0
  105. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/admin/base_site.html +0 -0
  106. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/admin/change_form_object_tools.html +0 -0
  107. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/admin/change_list.html +0 -0
  108. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/admin/change_list_object_tools.html +0 -0
  109. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/admin/change_list_results.html +0 -0
  110. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/admin/date_hierarchy.html +0 -0
  111. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/admin/delete_confirmation.html +0 -0
  112. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/admin/delete_selected_confirmation.html +0 -0
  113. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/admin/edit_inline/stacked.html +0 -0
  114. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/admin/edit_inline/tabular.html +0 -0
  115. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/admin/filter.html +0 -0
  116. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/admin/includes/fieldset.html +0 -0
  117. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/admin/includes/object_delete_summary.html +0 -0
  118. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/admin/index.html +0 -0
  119. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/admin/login.html +0 -0
  120. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/admin/nav_sidebar.html +0 -0
  121. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/admin/object_history.html +0 -0
  122. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/admin/pagination.html +0 -0
  123. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/admin/search_form.html +0 -0
  124. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/auth/widgets/read_only_password_hash.html +0 -0
  125. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/registration/logged_out.html +0 -0
  126. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/registration/password_change_done.html +0 -0
  127. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/registration/password_change_form.html +0 -0
  128. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/change_list_filter.html +0 -0
  129. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/components/button.html +0 -0
  130. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/components/card.html +0 -0
  131. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/components/chart/bar.html +0 -0
  132. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/components/chart/line.html +0 -0
  133. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/components/container.html +0 -0
  134. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/components/flex.html +0 -0
  135. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/components/icon.html +0 -0
  136. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/components/navigation.html +0 -0
  137. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/components/progress.html +0 -0
  138. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/components/separator.html +0 -0
  139. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/components/table.html +0 -0
  140. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/components/text.html +0 -0
  141. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/components/title.html +0 -0
  142. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/helpers/account_links.html +0 -0
  143. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/helpers/actions_row.html +0 -0
  144. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/helpers/add_link.html +0 -0
  145. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/helpers/app_list.html +0 -0
  146. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/helpers/app_list_default.html +0 -0
  147. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/helpers/attrs.html +0 -0
  148. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/helpers/boolean.html +0 -0
  149. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/helpers/breadcrumb_item.html +0 -0
  150. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/helpers/display_header.html +0 -0
  151. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/helpers/display_label.html +0 -0
  152. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/helpers/field.html +0 -0
  153. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/helpers/field_readonly.html +0 -0
  154. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/helpers/field_readonly_value.html +0 -0
  155. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/helpers/fieldset_row.html +0 -0
  156. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/helpers/fieldsets_tabs.html +0 -0
  157. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/helpers/form_errors.html +0 -0
  158. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/helpers/form_label.html +0 -0
  159. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/helpers/header.html +0 -0
  160. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/helpers/help_text.html +0 -0
  161. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/helpers/history.html +0 -0
  162. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/helpers/label.html +0 -0
  163. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/helpers/messages/error.html +0 -0
  164. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/helpers/messages/errornote.html +0 -0
  165. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/helpers/messages/info.html +0 -0
  166. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/helpers/messages.html +0 -0
  167. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/helpers/navigation.html +0 -0
  168. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/helpers/pagination_current_item.html +0 -0
  169. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/helpers/pagination_ellipsis.html +0 -0
  170. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/helpers/search.html +0 -0
  171. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/helpers/search_results.html +0 -0
  172. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/helpers/site_icon.html +0 -0
  173. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/helpers/site_logo.html +0 -0
  174. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/helpers/submit.html +0 -0
  175. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/helpers/tab_action.html +0 -0
  176. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/helpers/tab_list.html +0 -0
  177. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/helpers/theme_switch.html +0 -0
  178. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/helpers/userlinks.html +0 -0
  179. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/helpers/welcomemsg.html +0 -0
  180. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/layouts/base.html +0 -0
  181. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/layouts/base_simple.html +0 -0
  182. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/layouts/skeleton.html +0 -0
  183. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/widgets/clearable_file_input.html +0 -0
  184. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/widgets/clearable_file_input_small.html +0 -0
  185. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/widgets/date.html +0 -0
  186. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/widgets/foreign_key_raw_id.html +0 -0
  187. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/widgets/radio.html +0 -0
  188. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/widgets/radio_option.html +0 -0
  189. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/widgets/range.html +0 -0
  190. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/widgets/related_widget_wrapper.html +0 -0
  191. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/widgets/split_datetime.html +0 -0
  192. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/widgets/split_datetime_vertical.html +0 -0
  193. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/widgets/split_money.html +0 -0
  194. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/widgets/textarea.html +0 -0
  195. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/widgets/textarea_expandable.html +0 -0
  196. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templates/unfold/widgets/time.html +0 -0
  197. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templatetags/__init__.py +0 -0
  198. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templatetags/unfold.py +0 -0
  199. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/templatetags/unfold_list.py +0 -0
  200. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/typing.py +0 -0
  201. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/utils.py +0 -0
  202. {django_unfold-0.34.0 → django_unfold-0.35.0}/src/unfold/views.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: django-unfold
3
- Version: 0.34.0
3
+ Version: 0.35.0
4
4
  Summary: Modern Django admin theme for seamless interface development
5
5
  Home-page: https://unfoldadmin.com
6
6
  License: MIT
@@ -179,7 +179,7 @@ class CustomAdminClass(ModelAdmin):
179
179
  from django.contrib import admin
180
180
  from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
181
181
  from django.contrib.auth.admin import GroupAdmin as BaseGroupAdmin
182
- from django.contrib.auth.models import User
182
+ from django.contrib.auth.models import User, Group
183
183
 
184
184
  from unfold.admin import ModelAdmin
185
185
 
@@ -360,6 +360,9 @@ class CustomAdminClass(ModelAdmin):
360
360
  # Display fields in changeform in compressed mode
361
361
  compressed_fields = True # Default: False
362
362
 
363
+ # Warn before leaving unsaved changes in changeform
364
+ warn_unsaved_form = True # Default: False
365
+
363
366
  # Preprocess content of readonly fields before render
364
367
  readonly_preprocess_fields = {
365
368
  "model_field_name": "html.unescape",
@@ -645,7 +648,14 @@ The difference between them is that `ChoicesDropdownFilter` will collect a list
645
648
  from django.contrib import admin
646
649
  from django.contrib.auth.models import User
647
650
  from unfold.admin import ModelAdmin
648
- from unfold.contrib.filters.admin import ChoicesDropdownFilter, RelatedDropdownFilter, DropdownFilter
651
+ from unfold.contrib.filters.admin import (
652
+ ChoicesDropdownFilter,
653
+ MultipleChoicesDropdownFilter,
654
+ RelatedDropdownFilter,
655
+ MultipleRelatedDropdownFilter,
656
+ DropdownFilter,
657
+ MultipleDropdownFilter
658
+ )
649
659
 
650
660
 
651
661
  class CustomDropdownFilter(DropdownFilter):
@@ -672,7 +682,9 @@ class MyAdmin(ModelAdmin):
672
682
  list_filter = [
673
683
  CustomDropdownFilter,
674
684
  ("modelfield_with_choices", ChoicesDropdownFilter),
685
+ ("modelfield_with_choices_multiple", MultipleChoicesDropdownFilter),
675
686
  ("modelfield_with_foreign_key", RelatedDropdownFilter)
687
+ ("modelfield_with_foreign_key_multiple", MultipleRelatedDropdownFilter)
676
688
  ]
677
689
  ```
678
690
 
@@ -1363,8 +1375,8 @@ def dashboard_callback(request: HttpRequest) -> Dict:
1363
1375
  ```
1364
1376
 
1365
1377
  ```django-html
1366
- {% component "unfold/components/card" with title="Card title" %}
1367
- {% component "unfold/components/table.html" with table=table_data card_included=1 striped=1 %}{% encomponent %}
1378
+ {% component "unfold/components/card.html" with title="Card title" %}
1379
+ {% component "unfold/components/table.html" with table=table_data card_included=1 striped=1 %}{% endcomponent %}
1368
1380
  {% endcomponent %}
1369
1381
  ```
1370
1382
 
@@ -155,7 +155,7 @@ class CustomAdminClass(ModelAdmin):
155
155
  from django.contrib import admin
156
156
  from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
157
157
  from django.contrib.auth.admin import GroupAdmin as BaseGroupAdmin
158
- from django.contrib.auth.models import User
158
+ from django.contrib.auth.models import User, Group
159
159
 
160
160
  from unfold.admin import ModelAdmin
161
161
 
@@ -336,6 +336,9 @@ class CustomAdminClass(ModelAdmin):
336
336
  # Display fields in changeform in compressed mode
337
337
  compressed_fields = True # Default: False
338
338
 
339
+ # Warn before leaving unsaved changes in changeform
340
+ warn_unsaved_form = True # Default: False
341
+
339
342
  # Preprocess content of readonly fields before render
340
343
  readonly_preprocess_fields = {
341
344
  "model_field_name": "html.unescape",
@@ -621,7 +624,14 @@ The difference between them is that `ChoicesDropdownFilter` will collect a list
621
624
  from django.contrib import admin
622
625
  from django.contrib.auth.models import User
623
626
  from unfold.admin import ModelAdmin
624
- from unfold.contrib.filters.admin import ChoicesDropdownFilter, RelatedDropdownFilter, DropdownFilter
627
+ from unfold.contrib.filters.admin import (
628
+ ChoicesDropdownFilter,
629
+ MultipleChoicesDropdownFilter,
630
+ RelatedDropdownFilter,
631
+ MultipleRelatedDropdownFilter,
632
+ DropdownFilter,
633
+ MultipleDropdownFilter
634
+ )
625
635
 
626
636
 
627
637
  class CustomDropdownFilter(DropdownFilter):
@@ -648,7 +658,9 @@ class MyAdmin(ModelAdmin):
648
658
  list_filter = [
649
659
  CustomDropdownFilter,
650
660
  ("modelfield_with_choices", ChoicesDropdownFilter),
661
+ ("modelfield_with_choices_multiple", MultipleChoicesDropdownFilter),
651
662
  ("modelfield_with_foreign_key", RelatedDropdownFilter)
663
+ ("modelfield_with_foreign_key_multiple", MultipleRelatedDropdownFilter)
652
664
  ]
653
665
  ```
654
666
 
@@ -1339,8 +1351,8 @@ def dashboard_callback(request: HttpRequest) -> Dict:
1339
1351
  ```
1340
1352
 
1341
1353
  ```django-html
1342
- {% component "unfold/components/card" with title="Card title" %}
1343
- {% component "unfold/components/table.html" with table=table_data card_included=1 striped=1 %}{% encomponent %}
1354
+ {% component "unfold/components/card.html" with title="Card title" %}
1355
+ {% component "unfold/components/table.html" with table=table_data card_included=1 striped=1 %}{% endcomponent %}
1344
1356
  {% endcomponent %}
1345
1357
  ```
1346
1358
 
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "django-unfold"
3
- version = "0.34.0"
3
+ version = "0.35.0"
4
4
  description = "Modern Django admin theme for seamless interface development"
5
5
  license = "MIT"
6
6
  readme = "README.md"
@@ -236,6 +236,7 @@ class ModelAdmin(ModelAdminMixin, BaseModelAdmin):
236
236
  list_disable_select_all = False
237
237
  compressed_fields = False
238
238
  readonly_preprocess_fields = {}
239
+ warn_unsaved_form = False
239
240
  checks_class = UnfoldModelAdminChecks
240
241
 
241
242
  @property
@@ -244,13 +245,14 @@ class ModelAdmin(ModelAdminMixin, BaseModelAdmin):
244
245
  additional_media = forms.Media()
245
246
 
246
247
  for filter in self.list_filter:
247
- if not isinstance(filter, (tuple, list)):
248
- continue
249
-
250
- if hasattr(filter[1], "form_class") and hasattr(
251
- filter[1].form_class, "Media"
248
+ if (
249
+ isinstance(filter, (tuple, list))
250
+ and hasattr(filter[1], "form_class")
251
+ and hasattr(filter[1].form_class, "Media")
252
252
  ):
253
253
  additional_media += forms.Media(filter[1].form_class.Media)
254
+ elif hasattr(filter, "form_class") and hasattr(filter.form_class, "Media"):
255
+ additional_media += forms.Media(filter.form_class.Media)
254
256
 
255
257
  return media + additional_media
256
258
 
@@ -41,12 +41,23 @@ class ValueMixin:
41
41
  )
42
42
 
43
43
 
44
+ class MultiValueMixin:
45
+ def value(self) -> Optional[List[str]]:
46
+ return (
47
+ self.lookup_val
48
+ if self.lookup_val not in EMPTY_VALUES
49
+ and isinstance(self.lookup_val, List)
50
+ and len(self.lookup_val) > 0
51
+ else self.lookup_val
52
+ )
53
+
54
+
44
55
  class DropdownMixin:
45
56
  template = "unfold/filters/filters_field.html"
46
57
  form_class = DropdownForm
47
58
  all_option = ["", _("All")]
48
59
 
49
- def queryset(self, request, queryset) -> QuerySet:
60
+ def queryset(self, request: HttpRequest, queryset: QuerySet) -> QuerySet:
50
61
  if self.value() not in EMPTY_VALUES:
51
62
  return super().queryset(request, queryset)
52
63
 
@@ -112,11 +123,23 @@ class DropdownFilter(admin.SimpleListFilter):
112
123
  name=self.parameter_name,
113
124
  choices=[self.all_option, *self.lookup_choices],
114
125
  data={self.parameter_name: self.value()},
126
+ multiple=self.multiple if hasattr(self, "multiple") else False,
115
127
  ),
116
128
  },
117
129
  )
118
130
 
119
131
 
132
+ class MultipleDropdownFilter(DropdownFilter):
133
+ multiple = True
134
+
135
+ def __init__(self, request, params, model, model_admin):
136
+ self.request = request
137
+ super().__init__(request, params, model, model_admin)
138
+
139
+ def value(self):
140
+ return self.request.GET.getlist(self.parameter_name)
141
+
142
+
120
143
  class ChoicesDropdownFilter(ValueMixin, DropdownMixin, admin.ChoicesFieldListFilter):
121
144
  def choices(self, changelist: ChangeList):
122
145
  choices = [self.all_option, *self.field.flatchoices]
@@ -127,10 +150,15 @@ class ChoicesDropdownFilter(ValueMixin, DropdownMixin, admin.ChoicesFieldListFil
127
150
  name=self.lookup_kwarg,
128
151
  choices=choices,
129
152
  data={self.lookup_kwarg: self.value()},
153
+ multiple=self.multiple if hasattr(self, "multiple") else False,
130
154
  ),
131
155
  }
132
156
 
133
157
 
158
+ class MultipleChoicesDropdownFilter(MultiValueMixin, ChoicesDropdownFilter):
159
+ multiple = True
160
+
161
+
134
162
  class RelatedDropdownFilter(ValueMixin, DropdownMixin, admin.RelatedFieldListFilter):
135
163
  def choices(self, changelist: ChangeList):
136
164
  yield {
@@ -139,10 +167,15 @@ class RelatedDropdownFilter(ValueMixin, DropdownMixin, admin.RelatedFieldListFil
139
167
  name=self.lookup_kwarg,
140
168
  choices=[self.all_option, *self.lookup_choices],
141
169
  data={self.lookup_kwarg: self.value()},
170
+ multiple=self.multiple if hasattr(self, "multiple") else False,
142
171
  ),
143
172
  }
144
173
 
145
174
 
175
+ class MultipleRelatedDropdownFilter(MultiValueMixin, RelatedDropdownFilter):
176
+ multiple = True
177
+
178
+
146
179
  class SingleNumericFilter(admin.FieldListFilter):
147
180
  request = None
148
181
  parameter_name = None
@@ -1,8 +1,10 @@
1
1
  from django import forms
2
+ from django.forms import ChoiceField, MultipleChoiceField
2
3
  from django.utils.translation import gettext_lazy as _
3
4
 
4
5
  from ...widgets import (
5
6
  INPUT_CLASSES,
7
+ UnfoldAdminSelectMultipleWidget,
6
8
  UnfoldAdminSelectWidget,
7
9
  UnfoldAdminSplitDateTimeVerticalWidget,
8
10
  UnfoldAdminTextInputWidget,
@@ -21,15 +23,46 @@ class SearchForm(forms.Form):
21
23
 
22
24
 
23
25
  class DropdownForm(forms.Form):
24
- def __init__(self, name, label, choices, *args, **kwargs):
26
+ widget = UnfoldAdminSelectWidget(
27
+ attrs={
28
+ "data-theme": "admin-autocomplete",
29
+ "class": "admin-autocomplete",
30
+ }
31
+ )
32
+ field = ChoiceField
33
+
34
+ def __init__(self, name, label, choices, multiple=False, *args, **kwargs):
25
35
  super().__init__(*args, **kwargs)
26
36
 
27
- self.fields[name] = forms.ChoiceField(
37
+ if multiple:
38
+ self.widget = UnfoldAdminSelectMultipleWidget(
39
+ attrs={
40
+ "data-theme": "admin-autocomplete",
41
+ "class": "admin-autocomplete",
42
+ }
43
+ )
44
+ self.field = MultipleChoiceField
45
+
46
+ self.fields[name] = self.field(
28
47
  label=label,
29
48
  required=False,
30
49
  choices=choices,
31
- widget=UnfoldAdminSelectWidget,
50
+ widget=self.widget,
51
+ )
52
+
53
+ class Media:
54
+ js = (
55
+ "admin/js/vendor/jquery/jquery.js",
56
+ "admin/js/vendor/select2/select2.full.js",
57
+ "admin/js/jquery.init.js",
58
+ "unfold/js/select2.init.js",
32
59
  )
60
+ css = {
61
+ "screen": (
62
+ "admin/css/vendor/select2/select2.css",
63
+ "admin/css/autocomplete.css",
64
+ ),
65
+ }
33
66
 
34
67
 
35
68
  class SingleNumericForm(forms.Form):
@@ -29,12 +29,12 @@ def action(
29
29
  getattr(model_admin, f"has_{permission}_permission")
30
30
  for permission in permissions
31
31
  )
32
- # TODO add obj parameter into has_permission method call.
33
32
  # Permissions methods have following syntax: has_<some>_permission(self, request, obj=None):
34
33
  # But obj is not examined by default in django admin and it would also require additional
35
34
  # fetch from database, therefore it is not supported yet
36
35
  if not any(
37
- has_permission(request) for has_permission in permission_checks
36
+ has_permission(request, kwargs.get("object_id"))
37
+ for has_permission in permission_checks
38
38
  ):
39
39
  raise PermissionDenied
40
40
  return func(model_admin, request, *args, **kwargs)
@@ -8,8 +8,31 @@ window.addEventListener("load", (e) => {
8
8
  renderCharts();
9
9
 
10
10
  filterForm();
11
+
12
+ warnWithoutSaving();
11
13
  });
12
14
 
15
+ /*************************************************************
16
+ * Warn without saving
17
+ *************************************************************/
18
+ const warnWithoutSaving = () => {
19
+ let formChanged = false;
20
+
21
+ Array.from(
22
+ document.querySelectorAll(
23
+ "form.warn-unsaved-form input, form.warn-unsaved-form select"
24
+ )
25
+ ).forEach((field) => {
26
+ field.addEventListener("change", (e) => (formChanged = true));
27
+ });
28
+
29
+ window.addEventListener("beforeunload", (e) => {
30
+ if (formChanged) {
31
+ e.preventDefault();
32
+ }
33
+ });
34
+ };
35
+
13
36
  /*************************************************************
14
37
  * Filter form
15
38
  *************************************************************/
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ {
3
+ const $ = django.jQuery;
4
+
5
+ $.fn.djangoCustomSelect2 = function () {
6
+ $.each(this, function (i, element) {
7
+ $(element).select2();
8
+ });
9
+ return this;
10
+ };
11
+
12
+ $(function () {
13
+ $(".admin-autocomplete").djangoCustomSelect2();
14
+ });
15
+ }
@@ -59,7 +59,7 @@
59
59
 
60
60
  {% block content %}
61
61
  <div id="content-main">
62
- <form {% if has_file_field %}enctype="multipart/form-data" {% endif %}{% if form_url %}action="{{ form_url }}" {% endif %}method="post" id="{{ opts.model_name }}_form" novalidate>
62
+ <form {% if has_file_field %}enctype="multipart/form-data" {% endif %}{% if form_url %}action="{{ form_url }}" {% endif %}method="post" id="{{ opts.model_name }}_form" {% if adminform.model_admin.warn_unsaved_form %}class="warn-unsaved-form"{% endif %} novalidate>
63
63
  {% csrf_token %}
64
64
 
65
65
  {% block form_top %}{% endblock %}
@@ -42,7 +42,7 @@
42
42
  {% endif %}
43
43
 
44
44
  {% if show_save_as_new %}
45
- <button type="submit" name="_saveasnew" class="border font-medium px-3 py-2 rounded-md transition-all w-full hover:bg-gray-50 dark:border-gray-700 dark:hover:text-gray-200 dark:hover:bg-gray-900">
45
+ <button type="submit" name="_saveasnew" class="border font-medium hidden px-3 py-2 rounded-md transition-all w-full hover:bg-gray-50 lg:block lg:w-auto dark:border-gray-700 dark:hover:text-gray-200 dark:hover:bg-gray-900">
46
46
  {% translate 'Save as new' %}
47
47
  </button>
48
48
  {% endif %}
@@ -25,6 +25,7 @@ from django.forms import (
25
25
  NumberInput,
26
26
  PasswordInput,
27
27
  Select,
28
+ SelectMultiple,
28
29
  )
29
30
  from django.utils.translation import gettext_lazy as _
30
31
 
@@ -480,7 +481,16 @@ class UnfoldAdminSelectWidget(Select):
480
481
  if attrs is None:
481
482
  attrs = {}
482
483
 
483
- attrs["class"] = " ".join(SELECT_CLASSES)
484
+ attrs["class"] = " ".join([*SELECT_CLASSES, attrs.get("class", "")])
485
+ super().__init__(attrs, choices)
486
+
487
+
488
+ class UnfoldAdminSelectMultipleWidget(SelectMultiple):
489
+ def __init__(self, attrs=None, choices=()):
490
+ if attrs is None:
491
+ attrs = {}
492
+
493
+ attrs["class"] = " ".join([*SELECT_CLASSES, attrs.get("class", "")])
484
494
  super().__init__(attrs, choices)
485
495
 
486
496