django-unfold 0.21.1__tar.gz → 0.23.0__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (183) hide show
  1. {django_unfold-0.21.1 → django_unfold-0.23.0}/LICENSE.md +1 -1
  2. {django_unfold-0.21.1 → django_unfold-0.23.0}/PKG-INFO +26 -2
  3. {django_unfold-0.21.1 → django_unfold-0.23.0}/README.md +25 -1
  4. {django_unfold-0.21.1 → django_unfold-0.23.0}/pyproject.toml +12 -21
  5. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/admin.py +29 -22
  6. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/apps.py +5 -0
  7. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/checks.py +1 -1
  8. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/contrib/filters/apps.py +1 -0
  9. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/contrib/forms/apps.py +1 -0
  10. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/contrib/guardian/apps.py +1 -1
  11. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/contrib/import_export/apps.py +1 -1
  12. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/forms.py +6 -1
  13. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/sites.py +4 -4
  14. django_unfold-0.23.0/src/unfold/static/unfold/css/styles.css +1 -0
  15. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/styles.css +15 -4
  16. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/admin/actions.html +9 -9
  17. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/admin/app_list.html +6 -14
  18. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/admin/base.html +2 -4
  19. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/admin/change_form.html +1 -2
  20. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/admin/change_list.html +3 -3
  21. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/admin/change_list_results.html +17 -5
  22. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/admin/edit_inline/tabular.html +3 -3
  23. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/admin/login.html +9 -5
  24. django_unfold-0.23.0/src/unfold/templates/admin/search_form.html +17 -0
  25. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/unfold/helpers/account_links.html +2 -2
  26. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/unfold/helpers/app_list.html +5 -1
  27. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/unfold/helpers/display_label.html +2 -0
  28. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/unfold/helpers/tab_list.html +1 -1
  29. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/unfold/layouts/base_simple.html +1 -1
  30. django_unfold-0.23.0/src/unfold/templates/unfold/widgets/date.html +3 -0
  31. {django_unfold-0.21.1/src/unfold/templates/admin → django_unfold-0.23.0/src/unfold/templates/unfold}/widgets/related_widget_wrapper.html +4 -4
  32. django_unfold-0.23.0/src/unfold/templates/unfold/widgets/time.html +3 -0
  33. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templatetags/unfold_list.py +63 -48
  34. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/widgets.py +16 -3
  35. django_unfold-0.21.1/src/unfold/static/unfold/css/styles.css +0 -1
  36. django_unfold-0.21.1/src/unfold/templates/admin/search_form.html +0 -19
  37. django_unfold-0.21.1/src/unfold/templates/unfold/widgets/date.html +0 -3
  38. django_unfold-0.21.1/src/unfold/templates/unfold/widgets/time.html +0 -3
  39. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/__init__.py +0 -0
  40. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/contrib/__init__.py +0 -0
  41. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/contrib/filters/__init__.py +0 -0
  42. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/contrib/filters/admin.py +0 -0
  43. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/contrib/filters/forms.py +0 -0
  44. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/contrib/filters/static/unfold/filters/css/nouislider.min.css +0 -0
  45. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/contrib/filters/static/unfold/filters/js/DateTimeShortcuts.js +0 -0
  46. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/contrib/filters/static/unfold/filters/js/admin-numeric-filter.js +0 -0
  47. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/contrib/filters/static/unfold/filters/js/nouislider.min.js +0 -0
  48. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/contrib/filters/static/unfold/filters/js/wNumb.min.js +0 -0
  49. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/contrib/filters/templates/unfold/filters/filters_date_range.html +0 -0
  50. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/contrib/filters/templates/unfold/filters/filters_datetime_range.html +0 -0
  51. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/contrib/filters/templates/unfold/filters/filters_numeric_range.html +0 -0
  52. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/contrib/filters/templates/unfold/filters/filters_numeric_single.html +0 -0
  53. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/contrib/filters/templates/unfold/filters/filters_numeric_slider.html +0 -0
  54. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/contrib/forms/__init__.py +0 -0
  55. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/contrib/forms/static/unfold/forms/css/trix.css +0 -0
  56. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/contrib/forms/static/unfold/forms/js/trix.config.js +0 -0
  57. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/contrib/forms/static/unfold/forms/js/trix.js +0 -0
  58. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/contrib/forms/templates/unfold/forms/helpers/toolbar.html +0 -0
  59. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/contrib/forms/templates/unfold/forms/wysiwyg.html +0 -0
  60. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/contrib/forms/widgets.py +0 -0
  61. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/contrib/guardian/__init__.py +0 -0
  62. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/contrib/guardian/templates/admin/guardian/model/change_form.html +0 -0
  63. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/contrib/guardian/templates/admin/guardian/model/field.html +0 -0
  64. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/contrib/guardian/templates/admin/guardian/model/obj_perms_manage.html +0 -0
  65. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/contrib/guardian/templates/admin/guardian/model/obj_perms_manage_group.html +0 -0
  66. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/contrib/guardian/templates/admin/guardian/model/obj_perms_manage_user.html +0 -0
  67. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/contrib/guardian/templates/unfold/guardian/group_form.html +0 -0
  68. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/contrib/guardian/templates/unfold/guardian/user_form.html +0 -0
  69. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/contrib/import_export/__init__.py +0 -0
  70. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/contrib/import_export/admin.py +0 -0
  71. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/contrib/import_export/forms.py +0 -0
  72. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/contrib/import_export/templates/admin/import_export/base.html +0 -0
  73. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/contrib/import_export/templates/admin/import_export/change_list_export_item.html +0 -0
  74. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/contrib/import_export/templates/admin/import_export/change_list_import_export.html +0 -0
  75. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/contrib/import_export/templates/admin/import_export/change_list_import_item.html +0 -0
  76. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/contrib/import_export/templates/admin/import_export/export.html +0 -0
  77. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/contrib/import_export/templates/admin/import_export/import.html +0 -0
  78. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/contrib/import_export/templates/admin/import_export/import_confirm.html +0 -0
  79. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/contrib/import_export/templates/admin/import_export/import_errors.html +0 -0
  80. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/contrib/import_export/templates/admin/import_export/import_form.html +0 -0
  81. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/contrib/import_export/templates/admin/import_export/import_preview.html +0 -0
  82. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/contrib/import_export/templates/admin/import_export/import_validation.html +0 -0
  83. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/contrib/simple_history/__init__.py +0 -0
  84. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/contrib/simple_history/apps.py +0 -0
  85. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/contrib/simple_history/templates/simple_history/_object_history_list.html +0 -0
  86. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/contrib/simple_history/templates/simple_history/object_history.html +0 -0
  87. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/contrib/simple_history/templates/simple_history/object_history_form.html +0 -0
  88. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/contrib/simple_history/templates/simple_history/submit_line.html +0 -0
  89. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/dataclasses.py +0 -0
  90. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/decorators.py +0 -0
  91. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/exceptions.py +0 -0
  92. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/settings.py +0 -0
  93. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/static/unfold/fonts/inter/Inter-Bold.woff2 +0 -0
  94. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/static/unfold/fonts/inter/Inter-Medium.woff2 +0 -0
  95. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/static/unfold/fonts/inter/Inter-Regular.woff2 +0 -0
  96. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/static/unfold/fonts/inter/Inter-SemiBold.woff2 +0 -0
  97. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/static/unfold/fonts/inter/styles.css +0 -0
  98. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/static/unfold/fonts/material-symbols/Material-Symbols-Outlined.woff2 +0 -0
  99. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/static/unfold/fonts/material-symbols/styles.css +0 -0
  100. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/static/unfold/js/alpine.js +0 -0
  101. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/static/unfold/js/alpine.persist.js +0 -0
  102. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/static/unfold/js/app.js +0 -0
  103. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/static/unfold/js/chart.js +0 -0
  104. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/static/unfold/js/htmx.js +0 -0
  105. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/admin/app_index.html +0 -0
  106. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/admin/auth/user/add_form.html +0 -0
  107. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/admin/auth/user/change_password.html +0 -0
  108. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/admin/base_site.html +0 -0
  109. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/admin/change_form_object_tools.html +0 -0
  110. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/admin/change_list_object_tools.html +0 -0
  111. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/admin/date_hierarchy.html +0 -0
  112. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/admin/delete_confirmation.html +0 -0
  113. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/admin/delete_selected_confirmation.html +0 -0
  114. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/admin/edit_inline/stacked.html +0 -0
  115. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/admin/filter.html +0 -0
  116. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/admin/includes/fieldset.html +0 -0
  117. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/admin/includes/object_delete_summary.html +0 -0
  118. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/admin/index.html +0 -0
  119. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/admin/nav_sidebar.html +0 -0
  120. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/admin/object_history.html +0 -0
  121. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/admin/pagination.html +0 -0
  122. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/admin/submit_line.html +0 -0
  123. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/auth/widgets/read_only_password_hash.html +0 -0
  124. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/registration/logged_out.html +0 -0
  125. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/registration/password_change_done.html +0 -0
  126. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/registration/password_change_form.html +0 -0
  127. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/unfold/change_list_filter.html +0 -0
  128. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/unfold/components/card.html +0 -0
  129. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/unfold/components/chart/bar.html +0 -0
  130. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/unfold/components/chart/line.html +0 -0
  131. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/unfold/components/container.html +0 -0
  132. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/unfold/components/flex.html +0 -0
  133. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/unfold/components/navigation.html +0 -0
  134. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/unfold/components/progress.html +0 -0
  135. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/unfold/components/separator.html +0 -0
  136. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/unfold/components/text.html +0 -0
  137. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/unfold/components/title.html +0 -0
  138. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/unfold/helpers/actions_row.html +0 -0
  139. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/unfold/helpers/add_link.html +0 -0
  140. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/unfold/helpers/app_list_default.html +0 -0
  141. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/unfold/helpers/boolean.html +0 -0
  142. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/unfold/helpers/breadcrumb_item.html +0 -0
  143. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/unfold/helpers/display_header.html +0 -0
  144. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/unfold/helpers/field.html +0 -0
  145. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/unfold/helpers/field_readonly.html +0 -0
  146. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/unfold/helpers/fieldsets_tabs.html +0 -0
  147. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/unfold/helpers/form_errors.html +0 -0
  148. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/unfold/helpers/form_label.html +0 -0
  149. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/unfold/helpers/header.html +0 -0
  150. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/unfold/helpers/help_text.html +0 -0
  151. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/unfold/helpers/history.html +0 -0
  152. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/unfold/helpers/label.html +0 -0
  153. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/unfold/helpers/messages/error.html +0 -0
  154. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/unfold/helpers/messages/errornote.html +0 -0
  155. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/unfold/helpers/messages/info.html +0 -0
  156. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/unfold/helpers/messages.html +0 -0
  157. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/unfold/helpers/navigation.html +0 -0
  158. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/unfold/helpers/pagination_current_item.html +0 -0
  159. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/unfold/helpers/pagination_ellipsis.html +0 -0
  160. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/unfold/helpers/search.html +0 -0
  161. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/unfold/helpers/search_results.html +0 -0
  162. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/unfold/helpers/site_icon.html +0 -0
  163. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/unfold/helpers/site_logo.html +0 -0
  164. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/unfold/helpers/submit.html +0 -0
  165. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/unfold/helpers/tab_action.html +0 -0
  166. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/unfold/helpers/theme_switch.html +0 -0
  167. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/unfold/helpers/userlinks.html +0 -0
  168. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/unfold/helpers/welcomemsg.html +0 -0
  169. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/unfold/layouts/skeleton.html +0 -0
  170. {django_unfold-0.21.1/src/unfold/templates/admin → django_unfold-0.23.0/src/unfold/templates/unfold}/widgets/clearable_file_input.html +0 -0
  171. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/unfold/widgets/clearable_file_input_small.html +0 -0
  172. {django_unfold-0.21.1/src/unfold/templates/admin → django_unfold-0.23.0/src/unfold/templates/unfold}/widgets/radio.html +0 -0
  173. {django_unfold-0.21.1/src/unfold/templates/admin → django_unfold-0.23.0/src/unfold/templates/unfold}/widgets/radio_option.html +0 -0
  174. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/unfold/widgets/range.html +0 -0
  175. {django_unfold-0.21.1/src/unfold/templates/admin → django_unfold-0.23.0/src/unfold/templates/unfold}/widgets/split_datetime.html +0 -0
  176. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/unfold/widgets/split_datetime_vertical.html +0 -0
  177. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/unfold/widgets/split_money.html +0 -0
  178. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templates/unfold/widgets/textarea.html +0 -0
  179. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templatetags/__init__.py +0 -0
  180. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/templatetags/unfold.py +0 -0
  181. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/typing.py +0 -0
  182. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/utils.py +0 -0
  183. {django_unfold-0.21.1 → django_unfold-0.23.0}/src/unfold/views.py +0 -0
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2023 Unfold Admin
3
+ Copyright (c) 2023-present Unfold Admin
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: django-unfold
3
- Version: 0.21.1
3
+ Version: 0.23.0
4
4
  Summary: Modern Django admin theme for seamless interface development
5
5
  Home-page: https://unfoldadmin.com
6
6
  License: MIT
@@ -59,6 +59,8 @@ Did you decide to start using Unfold but you don't have time to make the switch
59
59
  - **Colors:** possibility to override default color scheme
60
60
  - **Third party packages:** default support for multiple popular applications
61
61
  - **Environment label**: distinguish between environments by displaying a label
62
+ - **Parallel admin**: support for having default admin in parallel with Unfold
63
+ - **VS Code**: project configuration and development container is included
62
64
 
63
65
  ## Table of contents <!-- omit from toc -->
64
66
 
@@ -94,6 +96,9 @@ Did you decide to start using Unfold but you don't have time to make the switch
94
96
  - [Pre-commit](#pre-commit)
95
97
  - [Poetry configuration](#poetry-configuration)
96
98
  - [Compiling Tailwind](#compiling-tailwind)
99
+ - [Using VS Code with containers](#using-vs-code-with-containers)
100
+ - [Development server](#development-server)
101
+ - [Compiling Tailwind in devcontainer](#compiling-tailwind-in-devcontainer)
97
102
  - [Credits](#credits)
98
103
 
99
104
  ## Installation
@@ -704,6 +709,10 @@ class CrontabScheduleAdmin(ModelAdmin):
704
709
  @admin.register(SolarSchedule)
705
710
  class SolarScheduleAdmin(ModelAdmin):
706
711
  pass
712
+
713
+ @admin.register(ClockedSchedule)
714
+ class ClockedScheduleAdmin(ModelAdmin):
715
+ pass
707
716
  ```
708
717
 
709
718
  ### django-guardian
@@ -733,7 +742,7 @@ When implementing `import_export.admin.ExportActionModelAdmin` class in admin pa
733
742
  admin.py
734
743
 
735
744
  from unfold.admin import ModelAdmin
736
- from unfold.contrib.import_export import ExportActionModelAdmin
745
+ from unfold.contrib.import_export.admin import ExportActionModelAdmin
737
746
 
738
747
  class ExampleAdmin(ModelAdmin, ExportActionModelAdmin):
739
748
  pass
@@ -989,6 +998,7 @@ Before adding any source code, it is recommended to have pre-commit installed on
989
998
  pip install pre-commit
990
999
  pre-commit install
991
1000
  pre-commit install --hook-type commit-msg
1001
+ pre-commit run --all-files # Check if everything is okay
992
1002
  ```
993
1003
 
994
1004
  ### Poetry configuration
@@ -1016,6 +1026,20 @@ Some components like datepickers, calendars or selectors in admin was not possib
1016
1026
 
1017
1027
  **Note:** most of the custom styles located in style.css are created via `@apply some-tailwind-class;` as is not possible to manually add CSS class to element which are for example created via jQuery.
1018
1028
 
1029
+ ### Using VS Code with containers
1030
+
1031
+ Unfold already contains prepared support for VS Code development. After cloning the project locally, open the main folder in VS Code (in terminal `code .`). Immediately, you would see a message from VS Code **Folder contains a Dev Container configuration file. Reopen folder to develop in a container** which will inform you that the support for containers is prepared. Confirm the message by clicking on **Reopen in Container**. If the message is not there, you can still manually open the project in a container by running the command **Dev Containers: Reopen in Container**.
1032
+
1033
+ #### Development server
1034
+
1035
+ Now the VS Code will build an image and install Python dependencies. After successful installation is completed, VS Code will spin a container and from now it is possible to directly develop in the container. Unfold contains an example development application with the basic Unfold configuration available under `tests/server`. Run `python manage.py runserver` within a `tests/server` folder to start a development Django server. Note that you have to run the command from VS Code terminal which is already connected to the running container.
1036
+
1037
+ **Note:** this is not a production ready server. Use it just for running tests or developing features & fixes.
1038
+
1039
+ #### Compiling Tailwind in devcontainer
1040
+
1041
+ The container has already a node preinstalled so it is possible to compile a new CSS. Open the terminal and run `npm install` which will install all dependencies and will create `node_modules` folder. Now, you can run npm commands for Tailwind as described in the previous chapter.
1042
+
1019
1043
  ## Credits
1020
1044
 
1021
1045
  - [TailwindCSS](https://tailwindcss.com/) - CSS framework
@@ -35,6 +35,8 @@ Did you decide to start using Unfold but you don't have time to make the switch
35
35
  - **Colors:** possibility to override default color scheme
36
36
  - **Third party packages:** default support for multiple popular applications
37
37
  - **Environment label**: distinguish between environments by displaying a label
38
+ - **Parallel admin**: support for having default admin in parallel with Unfold
39
+ - **VS Code**: project configuration and development container is included
38
40
 
39
41
  ## Table of contents <!-- omit from toc -->
40
42
 
@@ -70,6 +72,9 @@ Did you decide to start using Unfold but you don't have time to make the switch
70
72
  - [Pre-commit](#pre-commit)
71
73
  - [Poetry configuration](#poetry-configuration)
72
74
  - [Compiling Tailwind](#compiling-tailwind)
75
+ - [Using VS Code with containers](#using-vs-code-with-containers)
76
+ - [Development server](#development-server)
77
+ - [Compiling Tailwind in devcontainer](#compiling-tailwind-in-devcontainer)
73
78
  - [Credits](#credits)
74
79
 
75
80
  ## Installation
@@ -680,6 +685,10 @@ class CrontabScheduleAdmin(ModelAdmin):
680
685
  @admin.register(SolarSchedule)
681
686
  class SolarScheduleAdmin(ModelAdmin):
682
687
  pass
688
+
689
+ @admin.register(ClockedSchedule)
690
+ class ClockedScheduleAdmin(ModelAdmin):
691
+ pass
683
692
  ```
684
693
 
685
694
  ### django-guardian
@@ -709,7 +718,7 @@ When implementing `import_export.admin.ExportActionModelAdmin` class in admin pa
709
718
  admin.py
710
719
 
711
720
  from unfold.admin import ModelAdmin
712
- from unfold.contrib.import_export import ExportActionModelAdmin
721
+ from unfold.contrib.import_export.admin import ExportActionModelAdmin
713
722
 
714
723
  class ExampleAdmin(ModelAdmin, ExportActionModelAdmin):
715
724
  pass
@@ -965,6 +974,7 @@ Before adding any source code, it is recommended to have pre-commit installed on
965
974
  pip install pre-commit
966
975
  pre-commit install
967
976
  pre-commit install --hook-type commit-msg
977
+ pre-commit run --all-files # Check if everything is okay
968
978
  ```
969
979
 
970
980
  ### Poetry configuration
@@ -992,6 +1002,20 @@ Some components like datepickers, calendars or selectors in admin was not possib
992
1002
 
993
1003
  **Note:** most of the custom styles located in style.css are created via `@apply some-tailwind-class;` as is not possible to manually add CSS class to element which are for example created via jQuery.
994
1004
 
1005
+ ### Using VS Code with containers
1006
+
1007
+ Unfold already contains prepared support for VS Code development. After cloning the project locally, open the main folder in VS Code (in terminal `code .`). Immediately, you would see a message from VS Code **Folder contains a Dev Container configuration file. Reopen folder to develop in a container** which will inform you that the support for containers is prepared. Confirm the message by clicking on **Reopen in Container**. If the message is not there, you can still manually open the project in a container by running the command **Dev Containers: Reopen in Container**.
1008
+
1009
+ #### Development server
1010
+
1011
+ Now the VS Code will build an image and install Python dependencies. After successful installation is completed, VS Code will spin a container and from now it is possible to directly develop in the container. Unfold contains an example development application with the basic Unfold configuration available under `tests/server`. Run `python manage.py runserver` within a `tests/server` folder to start a development Django server. Note that you have to run the command from VS Code terminal which is already connected to the running container.
1012
+
1013
+ **Note:** this is not a production ready server. Use it just for running tests or developing features & fixes.
1014
+
1015
+ #### Compiling Tailwind in devcontainer
1016
+
1017
+ The container has already a node preinstalled so it is possible to compile a new CSS. Open the terminal and run `npm install` which will install all dependencies and will create `node_modules` folder. Now, you can run npm commands for Tailwind as described in the previous chapter.
1018
+
995
1019
  ## Credits
996
1020
 
997
1021
  - [TailwindCSS](https://tailwindcss.com/) - CSS framework
@@ -1,21 +1,14 @@
1
1
  [tool.poetry]
2
2
  name = "django-unfold"
3
- version = "0.21.1"
3
+ version = "0.23.0"
4
4
  description = "Modern Django admin theme for seamless interface development"
5
5
  license = "MIT"
6
6
  readme = "README.md"
7
7
  authors = []
8
8
  homepage = "https://unfoldadmin.com"
9
9
  repository = "https://github.com/unfoldadmin/django-unfold"
10
- packages = [
11
- { include = "unfold", from = "src" },
12
- ]
13
- keywords = [
14
- "django",
15
- "admin",
16
- "tailwind",
17
- "theme",
18
- ]
10
+ packages = [{ include = "unfold", from = "src" }]
11
+ keywords = ["django", "admin", "tailwind", "theme"]
19
12
  classifiers = [
20
13
  "Programming Language :: Python",
21
14
  "Programming Language :: Python :: 3.8",
@@ -39,13 +32,14 @@ pytest-django = "^4.5.2"
39
32
  tox = "^4.5.2"
40
33
 
41
34
 
42
-
43
35
  [tool.poetry.group.dev.dependencies]
44
36
  python-semantic-release = "^8.7.0"
45
37
 
46
38
  [tool.ruff]
47
39
  fix = true
48
40
  line-length = 88
41
+
42
+ [tool.ruff.lint]
49
43
  select = [
50
44
  "E", # pycodestyle errors
51
45
  "W", # pycodestyle warnings
@@ -56,23 +50,19 @@ select = [
56
50
  "UP", # pyupgrade
57
51
  ]
58
52
  ignore = [
59
- "E501", # line too long, handled by black
60
- "B905", # zip() without strict=True
61
- "C901", # too complex
53
+ "E501", # line too long, handled by black
54
+ "B905", # zip() without strict=True
55
+ "C901", # too complex
62
56
  ]
63
57
 
64
58
  [tool.semantic_release]
65
59
  tag_format = "{version}"
66
60
  major_on_zero = true
67
- version_toml = [
68
- "pyproject.toml:tool.poetry.version"
69
- ]
61
+ version_toml = ["pyproject.toml:tool.poetry.version"]
70
62
 
71
63
  [tool.semantic_release.changelog]
72
64
  template_dir = ".github/templates"
73
- exclude_commit_patterns = [
74
- "chore: version bump"
75
- ]
65
+ exclude_commit_patterns = ["chore: version bump"]
76
66
 
77
67
  [tool.semantic_release.changelog.environment]
78
68
  trim_blocks = true
@@ -85,8 +75,9 @@ upload_to_vcs_release = false
85
75
  addopts = """\
86
76
  --strict-config
87
77
  --strict-markers
88
- --ds=tests.settings
78
+ --ds=example.settings
89
79
  """
80
+ pythonpath = "tests/server"
90
81
  django_find_project = false
91
82
 
92
83
  [build-system]
@@ -8,6 +8,7 @@ from django.contrib.admin import StackedInline as BaseStackedInline
8
8
  from django.contrib.admin import TabularInline as BaseTabularInline
9
9
  from django.contrib.admin import display, helpers
10
10
  from django.contrib.admin.utils import lookup_field
11
+ from django.contrib.admin.widgets import RelatedFieldWidgetWrapper
11
12
  from django.core.exceptions import ObjectDoesNotExist
12
13
  from django.db import models
13
14
  from django.db.models import (
@@ -39,7 +40,6 @@ from django.utils.safestring import SafeText, mark_safe
39
40
  from django.utils.text import capfirst
40
41
  from django.utils.translation import gettext_lazy as _
41
42
  from django.views import View
42
- from unfold.utils import display_for_field
43
43
 
44
44
  from .checks import UnfoldModelAdminChecks
45
45
  from .dataclasses import UnfoldAction
@@ -47,9 +47,9 @@ from .exceptions import UnfoldException
47
47
  from .forms import ActionForm
48
48
  from .settings import get_config
49
49
  from .typing import FieldsetsType
50
+ from .utils import display_for_field
50
51
  from .widgets import (
51
52
  CHECKBOX_LABEL_CLASSES,
52
- INPUT_CLASSES,
53
53
  LABEL_CLASSES,
54
54
  SELECT_CLASSES,
55
55
  UnfoldAdminBigIntegerFieldWidget,
@@ -62,6 +62,7 @@ from .widgets import (
62
62
  UnfoldAdminMoneyWidget,
63
63
  UnfoldAdminNullBooleanSelectWidget,
64
64
  UnfoldAdminRadioSelectWidget,
65
+ UnfoldAdminSelect,
65
66
  UnfoldAdminSingleDateWidget,
66
67
  UnfoldAdminSingleTimeWidget,
67
68
  UnfoldAdminSplitDateTimeWidget,
@@ -142,6 +143,11 @@ class UnfoldAdminField(helpers.AdminField):
142
143
  def label_tag(self) -> SafeText:
143
144
  classes = []
144
145
 
146
+ if not self.field.field.widget.__class__.__name__.startswith(
147
+ "Unfold"
148
+ ) and not self.field.field.widget.template_name.startswith("unfold"):
149
+ return super().label_tag()
150
+
145
151
  # TODO load config from current AdminSite (override Fieldline.__iter__ method)
146
152
  for lang, flag in get_config()["EXTENSIONS"]["modeltranslation"][
147
153
  "flags"
@@ -175,6 +181,9 @@ helpers.AdminField = UnfoldAdminField
175
181
 
176
182
  class UnfoldAdminReadonlyField(helpers.AdminReadonlyField):
177
183
  def label_tag(self) -> SafeText:
184
+ if not isinstance(self.model_admin, ModelAdmin):
185
+ return super().label_tag()
186
+
178
187
  attrs = {
179
188
  "class": " ".join(LABEL_CLASSES + ["mb-2"]),
180
189
  }
@@ -285,9 +294,7 @@ class ModelAdminMixin:
285
294
  radio_style=self.radio_fields[db_field.name]
286
295
  )
287
296
  else:
288
- kwargs["widget"] = forms.Select(
289
- attrs={"class": " ".join(SELECT_CLASSES)}
290
- )
297
+ kwargs["widget"] = UnfoldAdminSelect()
291
298
 
292
299
  kwargs["choices"] = db_field.get_choices(
293
300
  include_blank=db_field.blank, blank_choice=[("", _("Select value"))]
@@ -301,16 +308,12 @@ class ModelAdminMixin:
301
308
  # Overrides widgets for all related fields
302
309
  if "widget" not in kwargs:
303
310
  if db_field.name in self.raw_id_fields:
304
- kwargs["widget"] = forms.TextInput(
305
- attrs={"class": " ".join(INPUT_CLASSES)}
306
- )
311
+ kwargs["widget"] = UnfoldAdminTextInputWidget()
307
312
  elif (
308
313
  db_field.name not in self.get_autocomplete_fields(request)
309
314
  and db_field.name not in self.radio_fields
310
315
  ):
311
- kwargs["widget"] = forms.Select(
312
- attrs={"class": " ".join(SELECT_CLASSES)}
313
- )
316
+ kwargs["widget"] = UnfoldAdminSelect()
314
317
  kwargs["empty_label"] = _("Select value")
315
318
 
316
319
  return super().formfield_for_foreignkey(db_field, request, **kwargs)
@@ -323,9 +326,7 @@ class ModelAdminMixin:
323
326
  ) -> ModelMultipleChoiceField:
324
327
  if "widget" not in kwargs:
325
328
  if db_field.name in self.raw_id_fields:
326
- kwargs["widget"] = forms.TextInput(
327
- attrs={"class": " ".join(INPUT_CLASSES)}
328
- )
329
+ kwargs["widget"] = UnfoldAdminTextInputWidget()
329
330
 
330
331
  form_field = super().formfield_for_manytomany(db_field, request, **kwargs)
331
332
 
@@ -342,9 +343,7 @@ class ModelAdminMixin:
342
343
  self, db_field: Field, request: HttpRequest, **kwargs
343
344
  ) -> Optional[Field]:
344
345
  if "widget" not in kwargs:
345
- kwargs["widget"] = forms.NullBooleanSelect(
346
- attrs={"class": " ".join(SELECT_CLASSES)}
347
- )
346
+ kwargs["widget"] = UnfoldAdminNullBooleanSelectWidget()
348
347
 
349
348
  return db_field.formfield(**kwargs)
350
349
 
@@ -354,7 +353,14 @@ class ModelAdminMixin:
354
353
  if isinstance(db_field, models.BooleanField) and db_field.null is True:
355
354
  return self.formfield_for_nullboolean_field(db_field, request, **kwargs)
356
355
 
357
- return super().formfield_for_dbfield(db_field, request, **kwargs)
356
+ formfield = super().formfield_for_dbfield(db_field, request, **kwargs)
357
+
358
+ if formfield and isinstance(formfield.widget, RelatedFieldWidgetWrapper):
359
+ formfield.widget.template_name = (
360
+ "unfold/widgets/related_widget_wrapper.html"
361
+ )
362
+
363
+ return formfield
358
364
 
359
365
 
360
366
  class ModelAdmin(ModelAdminMixin, BaseModelAdmin):
@@ -400,7 +406,7 @@ class ModelAdmin(ModelAdminMixin, BaseModelAdmin):
400
406
  filtered_actions.append(action)
401
407
  continue
402
408
  permission_checks = (
403
- getattr(self, "has_%s_permission" % permission)
409
+ getattr(self, f"has_{permission}_permission")
404
410
  for permission in action.method.allowed_permissions
405
411
  )
406
412
  if any(has_permission(request) for has_permission in permission_checks):
@@ -546,7 +552,8 @@ class ModelAdmin(ModelAdminMixin, BaseModelAdmin):
546
552
  "title": action.description,
547
553
  "attrs": action.method.attrs,
548
554
  "path": reverse(
549
- f"admin:{action.action_name}", args=(object_id,)
555
+ f"{self.admin_site.name}:{action.action_name}",
556
+ args=(object_id,),
550
557
  ),
551
558
  }
552
559
  )
@@ -570,7 +577,7 @@ class ModelAdmin(ModelAdminMixin, BaseModelAdmin):
570
577
  {
571
578
  "title": action.description,
572
579
  "attrs": action.method.attrs,
573
- "path": reverse(f"admin:{action.action_name}"),
580
+ "path": reverse(f"{self.admin_site.name}:{action.action_name}"),
574
581
  }
575
582
  for action in self.get_actions_list(request)
576
583
  ]
@@ -579,7 +586,7 @@ class ModelAdmin(ModelAdminMixin, BaseModelAdmin):
579
586
  {
580
587
  "title": action.description,
581
588
  "attrs": action.method.attrs,
582
- "raw_path": f"admin:{action.action_name}",
589
+ "raw_path": f"{self.admin_site.name}:{action.action_name}",
583
590
  }
584
591
  for action in self.get_actions_row(request)
585
592
  ]
@@ -7,9 +7,14 @@ from .sites import UnfoldAdminSite
7
7
 
8
8
  class DefaultAppConfig(AppConfig):
9
9
  name = "unfold"
10
+ default = True
10
11
 
11
12
  def ready(self):
12
13
  site = UnfoldAdminSite()
13
14
 
14
15
  admin.site = site
15
16
  sites.site = site
17
+
18
+
19
+ class BasicAppConfig(AppConfig):
20
+ name = "unfold"
@@ -30,7 +30,7 @@ class UnfoldModelAdminChecks(ModelAdminChecks):
30
30
  if not hasattr(action.method, "allowed_permissions"):
31
31
  continue
32
32
  for permission in action.method.allowed_permissions:
33
- method_name = "has_%s_permission" % permission
33
+ method_name = f"has_{permission}_permission"
34
34
  if not hasattr(obj, method_name):
35
35
  errors.append(
36
36
  checks.Error(
@@ -3,3 +3,4 @@ from django.apps import AppConfig
3
3
 
4
4
  class DefaultAppConfig(AppConfig):
5
5
  name = "unfold.contrib.filters"
6
+ label = "unfold_filters"
@@ -3,3 +3,4 @@ from django.apps import AppConfig
3
3
 
4
4
  class DefaultAppConfig(AppConfig):
5
5
  name = "unfold.contrib.forms"
6
+ label = "unfold_forms"
@@ -3,4 +3,4 @@ from django.apps import AppConfig
3
3
 
4
4
  class GuardianConfig(AppConfig):
5
5
  name = "unfold.contrib.guardian"
6
- label = "unfoldguardian"
6
+ label = "unfold_guardian"
@@ -3,4 +3,4 @@ from django.apps import AppConfig
3
3
 
4
4
  class ImportExportConfig(AppConfig):
5
5
  name = "unfold.contrib.import_export"
6
- label = "importexport"
6
+ label = "unfold_importexport"
@@ -22,7 +22,12 @@ from .widgets import BASE_INPUT_CLASSES, INPUT_CLASSES, SELECT_CLASSES
22
22
  class ActionForm(forms.Form):
23
23
  action = forms.ChoiceField(
24
24
  label="",
25
- widget=forms.Select({"class": " ".join([*SELECT_CLASSES, "w-72"])}),
25
+ widget=forms.Select(
26
+ {
27
+ "class": " ".join([*SELECT_CLASSES, "max-w-full", "lg:!w-64"]),
28
+ "x-model": "action",
29
+ }
30
+ ),
26
31
  )
27
32
 
28
33
  select_across = forms.BooleanField(
@@ -205,7 +205,7 @@ class UnfoldAdminSite(AdminSite):
205
205
 
206
206
  from .forms import AdminOwnPasswordChangeForm
207
207
 
208
- url = reverse("admin:password_change_done", current_app=self.name)
208
+ url = reverse(f"{self.name}:password_change_done", current_app=self.name)
209
209
  defaults = {
210
210
  "form_class": AdminOwnPasswordChangeForm,
211
211
  "success_url": url,
@@ -224,9 +224,9 @@ class UnfoldAdminSite(AdminSite):
224
224
  if not isinstance(link, str):
225
225
  link = str(link)
226
226
 
227
- if link in request.path and link != reverse_lazy("admin:index"):
227
+ if link in request.path and link != reverse_lazy(f"{self.name}:index"):
228
228
  return True
229
- elif link == request.path == reverse_lazy("admin:index"):
229
+ elif link == request.path == reverse_lazy(f"{self.name}:index"):
230
230
  return True
231
231
 
232
232
  return False
@@ -266,7 +266,7 @@ class UnfoldAdminSite(AdminSite):
266
266
  if "badge" in item and isinstance(item["badge"], str):
267
267
  try:
268
268
  callback = import_string(item["badge"])
269
- item["badge"] = lazy(callback)(request)
269
+ item["badge_callback"] = lazy(callback)(request)
270
270
  except ImportError:
271
271
  pass
272
272