django-unfold 0.38.0__tar.gz → 0.39.0__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (205) hide show
  1. {django_unfold-0.38.0 → django_unfold-0.39.0}/PKG-INFO +1 -1
  2. {django_unfold-0.38.0 → django_unfold-0.39.0}/pyproject.toml +1 -1
  3. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/admin.py +2 -0
  4. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/forms.py +5 -1
  5. django_unfold-0.39.0/src/unfold/static/admin/js/admin/RelatedObjectLookups.js +295 -0
  6. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/static/unfold/js/app.js +3 -1
  7. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/admin/change_form.html +8 -1
  8. django_unfold-0.39.0/src/unfold/templates/unfold/components/button.html +3 -0
  9. django_unfold-0.38.0/src/unfold/templates/unfold/components/button.html +0 -3
  10. {django_unfold-0.38.0 → django_unfold-0.39.0}/LICENSE.md +0 -0
  11. {django_unfold-0.38.0 → django_unfold-0.39.0}/README.md +0 -0
  12. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/__init__.py +0 -0
  13. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/apps.py +0 -0
  14. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/checks.py +0 -0
  15. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/__init__.py +0 -0
  16. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/filters/__init__.py +0 -0
  17. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/filters/admin.py +0 -0
  18. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/filters/apps.py +0 -0
  19. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/filters/forms.py +0 -0
  20. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/filters/static/unfold/filters/css/nouislider.min.css +0 -0
  21. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/filters/static/unfold/filters/js/DateTimeShortcuts.js +0 -0
  22. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/filters/static/unfold/filters/js/admin-numeric-filter.js +0 -0
  23. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/filters/static/unfold/filters/js/nouislider.min.js +0 -0
  24. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/filters/static/unfold/filters/js/wNumb.min.js +0 -0
  25. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/filters/templates/unfold/filters/filters_date_range.html +0 -0
  26. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/filters/templates/unfold/filters/filters_datetime_range.html +0 -0
  27. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/filters/templates/unfold/filters/filters_field.html +0 -0
  28. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/filters/templates/unfold/filters/filters_numeric_range.html +0 -0
  29. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/filters/templates/unfold/filters/filters_numeric_single.html +0 -0
  30. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/filters/templates/unfold/filters/filters_numeric_slider.html +0 -0
  31. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/forms/__init__.py +0 -0
  32. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/forms/apps.py +0 -0
  33. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/forms/static/unfold/forms/css/trix.css +0 -0
  34. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/forms/static/unfold/forms/js/trix.config.js +0 -0
  35. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/forms/static/unfold/forms/js/trix.js +0 -0
  36. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/forms/templates/unfold/forms/array.html +0 -0
  37. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/forms/templates/unfold/forms/helpers/toolbar.html +0 -0
  38. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/forms/templates/unfold/forms/wysiwyg.html +0 -0
  39. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/forms/widgets.py +0 -0
  40. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/guardian/__init__.py +0 -0
  41. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/guardian/apps.py +0 -0
  42. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/guardian/templates/admin/guardian/model/change_form.html +0 -0
  43. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/guardian/templates/admin/guardian/model/field.html +0 -0
  44. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/guardian/templates/admin/guardian/model/obj_perms_manage.html +0 -0
  45. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/guardian/templates/admin/guardian/model/obj_perms_manage_group.html +0 -0
  46. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/guardian/templates/admin/guardian/model/obj_perms_manage_user.html +0 -0
  47. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/guardian/templates/unfold/guardian/group_form.html +0 -0
  48. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/guardian/templates/unfold/guardian/user_form.html +0 -0
  49. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/import_export/__init__.py +0 -0
  50. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/import_export/apps.py +0 -0
  51. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/import_export/forms.py +0 -0
  52. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/import_export/templates/admin/import_export/base.html +0 -0
  53. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/import_export/templates/admin/import_export/change_form.html +0 -0
  54. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/import_export/templates/admin/import_export/change_list_export.html +0 -0
  55. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/import_export/templates/admin/import_export/change_list_export_item.html +0 -0
  56. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/import_export/templates/admin/import_export/change_list_import_export.html +0 -0
  57. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/import_export/templates/admin/import_export/change_list_import_item.html +0 -0
  58. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/import_export/templates/admin/import_export/export.html +0 -0
  59. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/import_export/templates/admin/import_export/import.html +0 -0
  60. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/import_export/templates/admin/import_export/import_confirm.html +0 -0
  61. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/import_export/templates/admin/import_export/import_errors.html +0 -0
  62. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/import_export/templates/admin/import_export/import_form.html +0 -0
  63. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/import_export/templates/admin/import_export/import_preview.html +0 -0
  64. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/import_export/templates/admin/import_export/import_validation.html +0 -0
  65. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/import_export/templates/admin/import_export/resource_fields_list.html +0 -0
  66. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/inlines/__init__.py +0 -0
  67. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/inlines/admin.py +0 -0
  68. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/inlines/apps.py +0 -0
  69. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/inlines/checks.py +0 -0
  70. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/inlines/forms.py +0 -0
  71. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/simple_history/__init__.py +0 -0
  72. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/simple_history/apps.py +0 -0
  73. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/simple_history/templates/simple_history/object_history.html +0 -0
  74. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/simple_history/templates/simple_history/object_history_form.html +0 -0
  75. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/simple_history/templates/simple_history/object_history_list.html +0 -0
  76. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/contrib/simple_history/templates/simple_history/submit_line.html +0 -0
  77. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/dataclasses.py +0 -0
  78. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/decorators.py +0 -0
  79. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/exceptions.py +0 -0
  80. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/fields.py +0 -0
  81. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/settings.py +0 -0
  82. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/sites.py +0 -0
  83. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/static/unfold/css/simplebar.css +0 -0
  84. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/static/unfold/css/styles.css +0 -0
  85. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/static/unfold/fonts/inter/Inter-Bold.woff2 +0 -0
  86. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/static/unfold/fonts/inter/Inter-Medium.woff2 +0 -0
  87. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/static/unfold/fonts/inter/Inter-Regular.woff2 +0 -0
  88. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/static/unfold/fonts/inter/Inter-SemiBold.woff2 +0 -0
  89. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/static/unfold/fonts/inter/styles.css +0 -0
  90. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/static/unfold/fonts/material-symbols/Material-Symbols-Outlined.woff2 +0 -0
  91. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/static/unfold/fonts/material-symbols/styles.css +0 -0
  92. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/static/unfold/js/alpine.anchor.js +0 -0
  93. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/static/unfold/js/alpine.js +0 -0
  94. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/static/unfold/js/alpine.persist.js +0 -0
  95. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/static/unfold/js/chart.js +0 -0
  96. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/static/unfold/js/htmx.js +0 -0
  97. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/static/unfold/js/select2.init.js +0 -0
  98. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/static/unfold/js/simplebar.js +0 -0
  99. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/styles.css +0 -0
  100. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/admin/actions.html +0 -0
  101. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/admin/app_index.html +0 -0
  102. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/admin/app_list.html +0 -0
  103. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/admin/auth/user/add_form.html +0 -0
  104. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/admin/auth/user/change_password.html +0 -0
  105. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/admin/base.html +0 -0
  106. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/admin/base_site.html +0 -0
  107. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/admin/change_form_object_tools.html +0 -0
  108. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/admin/change_list.html +0 -0
  109. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/admin/change_list_object_tools.html +0 -0
  110. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/admin/change_list_results.html +0 -0
  111. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/admin/date_hierarchy.html +0 -0
  112. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/admin/delete_confirmation.html +0 -0
  113. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/admin/delete_selected_confirmation.html +0 -0
  114. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/admin/edit_inline/stacked.html +0 -0
  115. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/admin/edit_inline/tabular.html +0 -0
  116. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/admin/filter.html +0 -0
  117. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/admin/includes/fieldset.html +0 -0
  118. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/admin/includes/object_delete_summary.html +0 -0
  119. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/admin/index.html +0 -0
  120. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/admin/login.html +0 -0
  121. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/admin/nav_sidebar.html +0 -0
  122. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/admin/object_history.html +0 -0
  123. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/admin/pagination.html +0 -0
  124. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/admin/search_form.html +0 -0
  125. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/admin/submit_line.html +0 -0
  126. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/auth/widgets/read_only_password_hash.html +0 -0
  127. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/registration/logged_out.html +0 -0
  128. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/registration/password_change_done.html +0 -0
  129. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/registration/password_change_form.html +0 -0
  130. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/change_list_filter.html +0 -0
  131. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/components/card.html +0 -0
  132. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/components/chart/bar.html +0 -0
  133. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/components/chart/line.html +0 -0
  134. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/components/container.html +0 -0
  135. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/components/flex.html +0 -0
  136. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/components/icon.html +0 -0
  137. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/components/navigation.html +0 -0
  138. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/components/progress.html +0 -0
  139. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/components/separator.html +0 -0
  140. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/components/table.html +0 -0
  141. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/components/text.html +0 -0
  142. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/components/title.html +0 -0
  143. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/helpers/account_links.html +0 -0
  144. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/helpers/actions_row.html +0 -0
  145. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/helpers/add_link.html +0 -0
  146. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/helpers/app_list.html +0 -0
  147. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/helpers/app_list_default.html +0 -0
  148. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/helpers/attrs.html +0 -0
  149. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/helpers/boolean.html +0 -0
  150. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/helpers/breadcrumb_item.html +0 -0
  151. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/helpers/display_header.html +0 -0
  152. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/helpers/display_label.html +0 -0
  153. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/helpers/field.html +0 -0
  154. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/helpers/field_readonly.html +0 -0
  155. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/helpers/field_readonly_value.html +0 -0
  156. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/helpers/fieldset_row.html +0 -0
  157. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/helpers/fieldsets_tabs.html +0 -0
  158. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/helpers/form_errors.html +0 -0
  159. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/helpers/form_label.html +0 -0
  160. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/helpers/header.html +0 -0
  161. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/helpers/help_text.html +0 -0
  162. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/helpers/history.html +0 -0
  163. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/helpers/label.html +0 -0
  164. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/helpers/messages/error.html +0 -0
  165. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/helpers/messages/errornote.html +0 -0
  166. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/helpers/messages/info.html +0 -0
  167. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/helpers/messages.html +0 -0
  168. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/helpers/navigation.html +0 -0
  169. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/helpers/pagination_current_item.html +0 -0
  170. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/helpers/pagination_ellipsis.html +0 -0
  171. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/helpers/search.html +0 -0
  172. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/helpers/search_results.html +0 -0
  173. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/helpers/site_icon.html +0 -0
  174. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/helpers/site_logo.html +0 -0
  175. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/helpers/submit.html +0 -0
  176. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/helpers/tab_action.html +0 -0
  177. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/helpers/tab_list.html +0 -0
  178. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/helpers/theme_switch.html +0 -0
  179. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/helpers/userlinks.html +0 -0
  180. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/helpers/welcomemsg.html +0 -0
  181. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/layouts/base.html +0 -0
  182. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/layouts/base_simple.html +0 -0
  183. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/layouts/skeleton.html +0 -0
  184. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/widgets/clearable_file_input.html +0 -0
  185. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/widgets/clearable_file_input_small.html +0 -0
  186. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/widgets/date.html +0 -0
  187. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/widgets/foreign_key_raw_id.html +0 -0
  188. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/widgets/radio.html +0 -0
  189. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/widgets/radio_option.html +0 -0
  190. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/widgets/range.html +0 -0
  191. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/widgets/related_widget_wrapper.html +0 -0
  192. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/widgets/split_datetime.html +0 -0
  193. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/widgets/split_datetime_vertical.html +0 -0
  194. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/widgets/split_money.html +0 -0
  195. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/widgets/textarea.html +0 -0
  196. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/widgets/textarea_expandable.html +0 -0
  197. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/widgets/time.html +0 -0
  198. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templates/unfold/widgets/url.html +0 -0
  199. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templatetags/__init__.py +0 -0
  200. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templatetags/unfold.py +0 -0
  201. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/templatetags/unfold_list.py +0 -0
  202. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/typing.py +0 -0
  203. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/utils.py +0 -0
  204. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/views.py +0 -0
  205. {django_unfold-0.38.0 → django_unfold-0.39.0}/src/unfold/widgets.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: django-unfold
3
- Version: 0.38.0
3
+ Version: 0.39.0
4
4
  Summary: Modern Django admin theme for seamless interface development
5
5
  Home-page: https://unfoldadmin.com
6
6
  License: MIT
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "django-unfold"
3
- version = "0.38.0"
3
+ version = "0.39.0"
4
4
  description = "Modern Django admin theme for seamless interface development"
5
5
  license = "MIT"
6
6
  readme = "README.md"
@@ -235,6 +235,8 @@ class ModelAdmin(ModelAdminMixin, BaseModelAdmin):
235
235
  list_filter_submit = False
236
236
  list_fullwidth = False
237
237
  list_disable_select_all = False
238
+ change_form_before_template = None
239
+ change_form_after_template = None
238
240
  compressed_fields = False
239
241
  readonly_preprocess_fields = {}
240
242
  warn_unsaved_form = False
@@ -10,9 +10,13 @@ from django.contrib.admin.forms import (
10
10
  from django.contrib.auth.forms import (
11
11
  AdminPasswordChangeForm as BaseAdminPasswordChangeForm,
12
12
  )
13
+
14
+ try:
15
+ from django.contrib.auth.forms import AdminUserCreationForm as BaseUserCreationForm
16
+ except ImportError:
17
+ from django.contrib.auth.forms import UserCreationForm as BaseUserCreationForm
13
18
  from django.contrib.auth.forms import ReadOnlyPasswordHashWidget
14
19
  from django.contrib.auth.forms import UserChangeForm as BaseUserChangeForm
15
- from django.contrib.auth.forms import UserCreationForm as BaseUserCreationForm
16
20
  from django.http import HttpRequest
17
21
  from django.utils.safestring import mark_safe
18
22
  from django.utils.translation import gettext_lazy as _
@@ -0,0 +1,295 @@
1
+ /*global SelectBox, interpolate*/
2
+ // Handles related-objects functionality: lookup link for raw_id_fields
3
+ // and Add Another links.
4
+ "use strict";
5
+ {
6
+ const $ = django.jQuery;
7
+ let popupIndex = 0;
8
+ const relatedWindows = [];
9
+
10
+ function dismissChildPopups() {
11
+ relatedWindows.forEach(function (win) {
12
+ if (!win.closed) {
13
+ win.dismissChildPopups();
14
+ win.close();
15
+ }
16
+ });
17
+ }
18
+
19
+ function setPopupIndex() {
20
+ if (document.getElementsByName("_popup").length > 0) {
21
+ const index = window.name.lastIndexOf("__") + 2;
22
+ popupIndex = parseInt(window.name.substring(index));
23
+ } else {
24
+ popupIndex = 0;
25
+ }
26
+ }
27
+
28
+ function addPopupIndex(name) {
29
+ return name + "__" + (popupIndex + 1);
30
+ }
31
+
32
+ function removePopupIndex(name) {
33
+ return name.replace(new RegExp("__" + (popupIndex + 1) + "$"), "");
34
+ }
35
+
36
+ function showAdminPopup(triggeringLink, name_regexp, add_popup) {
37
+ const name = addPopupIndex(triggeringLink.id.replace(name_regexp, ""));
38
+ const href = new URL(triggeringLink.href);
39
+ if (add_popup) {
40
+ href.searchParams.set("_popup", 1);
41
+ }
42
+ const win = window.open(
43
+ href,
44
+ name,
45
+ "height=768,width=1024,resizable=yes,scrollbars=yes"
46
+ );
47
+ relatedWindows.push(win);
48
+ win.focus();
49
+ return false;
50
+ }
51
+
52
+ function showRelatedObjectLookupPopup(triggeringLink) {
53
+ return showAdminPopup(triggeringLink, /^lookup_/, true);
54
+ }
55
+
56
+ function dismissRelatedLookupPopup(win, chosenId) {
57
+ const name = removePopupIndex(win.name);
58
+ const elem = document.getElementById(name);
59
+ if (elem.classList.contains("vManyToManyRawIdAdminField") && elem.value) {
60
+ elem.value += "," + chosenId;
61
+ } else {
62
+ document.getElementById(name).value = chosenId;
63
+ }
64
+ const index = relatedWindows.indexOf(win);
65
+ if (index > -1) {
66
+ relatedWindows.splice(index, 1);
67
+ }
68
+ win.close();
69
+ }
70
+
71
+ function showRelatedObjectPopup(triggeringLink) {
72
+ return showAdminPopup(triggeringLink, /^(change|add|delete)_/, false);
73
+ }
74
+
75
+ function updateRelatedObjectLinks(triggeringLink) {
76
+ const $this = $(triggeringLink);
77
+ const siblings = $this.nextAll(
78
+ ".view-related, .change-related, .delete-related"
79
+ );
80
+ if (!siblings.length) {
81
+ return;
82
+ }
83
+ const value = $this.val();
84
+ if (value) {
85
+ siblings.each(function () {
86
+ const elm = $(this);
87
+ elm.attr(
88
+ "href",
89
+ elm.attr("data-href-template").replace("__fk__", value)
90
+ );
91
+ elm.removeAttr("aria-disabled");
92
+ });
93
+ } else {
94
+ siblings.removeAttr("href");
95
+ siblings.attr("aria-disabled", true);
96
+ }
97
+ }
98
+
99
+ function updateRelatedSelectsOptions(
100
+ currentSelect,
101
+ win,
102
+ objId,
103
+ newRepr,
104
+ newId,
105
+ skipIds = []
106
+ ) {
107
+ // After create/edit a model from the options next to the current
108
+ // select (+ or :pencil:) update ForeignKey PK of the rest of selects
109
+ // in the page.
110
+
111
+ const path = win.location.pathname;
112
+ // Extract the model from the popup url '.../<model>/add/' or
113
+ // '.../<model>/<id>/change/' depending the action (add or change).
114
+ const modelName = path.split("/")[path.split("/").length - (objId ? 4 : 3)];
115
+ // Select elements with a specific model reference and context of "available-source".
116
+ const selectsRelated = document.querySelectorAll(
117
+ `[data-model-ref="${modelName}"] [data-context="available-source"]`
118
+ );
119
+
120
+ selectsRelated.forEach(function (select) {
121
+ if (
122
+ currentSelect === select ||
123
+ (skipIds && skipIds.includes(select.id))
124
+ ) {
125
+ return;
126
+ }
127
+
128
+ let option = select.querySelector(`option[value="${objId}"]`);
129
+
130
+ if (!option) {
131
+ option = new Option(newRepr, newId);
132
+ select.options.add(option);
133
+ // Update SelectBox cache for related fields.
134
+ if (
135
+ window.SelectBox !== undefined &&
136
+ !SelectBox.cache[currentSelect.id]
137
+ ) {
138
+ SelectBox.add_to_cache(select.id, option);
139
+ SelectBox.redisplay(select.id);
140
+ }
141
+ return;
142
+ }
143
+
144
+ option.textContent = newRepr;
145
+ option.value = newId;
146
+ });
147
+ }
148
+
149
+ function dismissAddRelatedObjectPopup(win, newId, newRepr) {
150
+ const name = removePopupIndex(win.name);
151
+ const elem = document.getElementById(name);
152
+ if (elem) {
153
+ const elemName = elem.nodeName.toUpperCase();
154
+ if (elemName === "SELECT") {
155
+ elem.options[elem.options.length] = new Option(
156
+ newRepr,
157
+ newId,
158
+ true,
159
+ true
160
+ );
161
+ updateRelatedSelectsOptions(elem, win, null, newRepr, newId);
162
+ } else if (elemName === "INPUT") {
163
+ if (
164
+ elem.classList.contains("vManyToManyRawIdAdminField") &&
165
+ elem.value
166
+ ) {
167
+ elem.value += "," + newId;
168
+ } else {
169
+ elem.value = newId;
170
+ }
171
+ }
172
+ // Trigger a change event to update related links if required.
173
+ $(elem).trigger("change");
174
+ } else {
175
+ const toId = name + "_to";
176
+ const toElem = document.getElementById(toId);
177
+ const o = new Option(newRepr, newId);
178
+ SelectBox.add_to_cache(toId, o);
179
+ SelectBox.redisplay(toId);
180
+ if (toElem && toElem.nodeName.toUpperCase() === "SELECT") {
181
+ const skipIds = [name + "_from"];
182
+ updateRelatedSelectsOptions(toElem, win, null, newRepr, newId, skipIds);
183
+ }
184
+ }
185
+ const index = relatedWindows.indexOf(win);
186
+ if (index > -1) {
187
+ relatedWindows.splice(index, 1);
188
+ }
189
+ win.close();
190
+ }
191
+
192
+ function dismissChangeRelatedObjectPopup(win, objId, newRepr, newId) {
193
+ const id = removePopupIndex(win.name.replace(/^edit_/, ""));
194
+ const selectsSelector = interpolate("#%s, #%s_from, #%s_to", [id, id, id]);
195
+ const selects = $(selectsSelector);
196
+ selects
197
+ .find("option")
198
+ .each(function () {
199
+ if (this.value === objId) {
200
+ this.textContent = newRepr;
201
+ this.value = newId;
202
+ }
203
+ })
204
+ .trigger("change");
205
+ updateRelatedSelectsOptions(selects[0], win, objId, newRepr, newId);
206
+ selects
207
+ .next()
208
+ .find(".select2-selection__rendered")
209
+ .each(function () {
210
+ // The element can have a clear button as a child.
211
+ // Use the lastChild to modify only the displayed value.
212
+ this.lastChild.textContent = newRepr;
213
+ this.title = newRepr;
214
+ });
215
+ const index = relatedWindows.indexOf(win);
216
+ if (index > -1) {
217
+ relatedWindows.splice(index, 1);
218
+ }
219
+ win.close();
220
+ }
221
+
222
+ function dismissDeleteRelatedObjectPopup(win, objId) {
223
+ const id = removePopupIndex(win.name.replace(/^delete_/, ""));
224
+ const selectsSelector = interpolate("#%s, #%s_from, #%s_to", [id, id, id]);
225
+ const selects = $(selectsSelector);
226
+ selects
227
+ .find("option")
228
+ .each(function () {
229
+ if (this.value === objId) {
230
+ $(this).remove();
231
+ }
232
+ })
233
+ .trigger("change");
234
+ const index = relatedWindows.indexOf(win);
235
+ if (index > -1) {
236
+ relatedWindows.splice(index, 1);
237
+ }
238
+ win.close();
239
+ }
240
+
241
+ window.showRelatedObjectLookupPopup = showRelatedObjectLookupPopup;
242
+ window.dismissRelatedLookupPopup = dismissRelatedLookupPopup;
243
+ window.showRelatedObjectPopup = showRelatedObjectPopup;
244
+ window.updateRelatedObjectLinks = updateRelatedObjectLinks;
245
+ window.dismissAddRelatedObjectPopup = dismissAddRelatedObjectPopup;
246
+ window.dismissChangeRelatedObjectPopup = dismissChangeRelatedObjectPopup;
247
+ window.dismissDeleteRelatedObjectPopup = dismissDeleteRelatedObjectPopup;
248
+ window.dismissChildPopups = dismissChildPopups;
249
+
250
+ // Kept for backward compatibility
251
+ window.showAddAnotherPopup = showRelatedObjectPopup;
252
+ window.dismissAddAnotherPopup = dismissAddRelatedObjectPopup;
253
+
254
+ window.addEventListener("unload", function (evt) {
255
+ window.dismissChildPopups();
256
+ });
257
+
258
+ $(document).ready(function () {
259
+ setPopupIndex();
260
+ $("a[data-popup-opener]").on("click", function (event) {
261
+ event.preventDefault();
262
+ opener.dismissRelatedLookupPopup(window, $(this).data("popup-opener"));
263
+ });
264
+ $("body").on(
265
+ "click",
266
+ '.related-widget-wrapper-link[data-popup="yes"]',
267
+ function (e) {
268
+ e.preventDefault();
269
+ if (this.href) {
270
+ const event = $.Event("django:show-related", { href: this.href });
271
+ $(this).trigger(event);
272
+ if (!event.isDefaultPrevented()) {
273
+ showRelatedObjectPopup(this);
274
+ }
275
+ }
276
+ }
277
+ );
278
+ $("body").on("change", ".related-widget-wrapper select", function (e) {
279
+ const event = $.Event("django:update-related");
280
+ $(this).trigger(event);
281
+ if (!event.isDefaultPrevented()) {
282
+ updateRelatedObjectLinks(this);
283
+ }
284
+ });
285
+ $(".related-widget-wrapper select").trigger("change");
286
+ $("body").on("click", ".related-lookup", function (e) {
287
+ e.preventDefault();
288
+ const event = $.Event("django:lookup-related");
289
+ $(this).trigger(event);
290
+ if (!event.isDefaultPrevented()) {
291
+ showRelatedObjectLookupPopup(this);
292
+ }
293
+ });
294
+ });
295
+ }
@@ -124,7 +124,9 @@ const fileInputUpdatePath = () => {
124
124
  input.addEventListener("change", (e) => {
125
125
  const parts = e.target.value.split("\\");
126
126
  const placeholder =
127
- input.parentNode.parentNode.querySelector("input[type=text]");
127
+ input.parentNode.parentNode.parentNode.querySelector(
128
+ "input[type=text]"
129
+ );
128
130
  placeholder.setAttribute("value", parts[parts.length - 1]);
129
131
  });
130
132
  });
@@ -64,6 +64,10 @@
64
64
  <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>
65
65
  {% csrf_token %}
66
66
 
67
+ {% if adminform.model_admin.change_form_before_template %}
68
+ {% include adminform.model_admin.change_form_before_template %}
69
+ {% endif %}
70
+
67
71
  {% block form_top %}{% endblock %}
68
72
 
69
73
  <div>
@@ -94,11 +98,14 @@
94
98
  {% for inline_admin_formset in inline_admin_formsets %}
95
99
  {% include inline_admin_formset.opts.template %}
96
100
  {% endfor %}
97
-
98
101
  {% endblock %}
99
102
 
100
103
  {% block after_related_objects %}{% endblock %}
101
104
 
105
+ {% if adminform.model_admin.change_form_after_template %}
106
+ {% include adminform.model_admin.change_form_after_template %}
107
+ {% endif %}
108
+
102
109
  {% block submit_buttons_bottom %}{% submit_row %}{% endblock %}
103
110
 
104
111
  {% block admin_change_form_document_ready %}
@@ -0,0 +1,3 @@
1
+ <button {% if submit %}type="submit"{% endif%} {% if name %}name="{{ name }}"{% endif %} class="bg-primary-600 border border-transparent font-medium px-3 py-2 rounded-md text-sm text-white">
2
+ {{ children }}
3
+ </button>
@@ -1,3 +0,0 @@
1
- <button {% if submit %}type="submit"{% endif%} class="bg-primary-600 border border-transparent font-medium px-3 py-2 rounded-md text-sm text-white">
2
- {{ children }}
3
- </button>
File without changes