django-cfg 1.0.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (444) hide show
  1. django_cfg-1.0.3/.gitignore +41 -0
  2. django_cfg-1.0.3/@unfold/code/__init__.py +0 -0
  3. django_cfg-1.0.3/@unfold/code/admin.py +229 -0
  4. django_cfg-1.0.3/@unfold/code/apps.py +20 -0
  5. django_cfg-1.0.3/@unfold/code/checks.py +64 -0
  6. django_cfg-1.0.3/@unfold/code/components.py +47 -0
  7. django_cfg-1.0.3/@unfold/code/contrib/__init__.py +0 -0
  8. django_cfg-1.0.3/@unfold/code/contrib/constance/__init__.py +0 -0
  9. django_cfg-1.0.3/@unfold/code/contrib/constance/apps.py +6 -0
  10. django_cfg-1.0.3/@unfold/code/contrib/constance/settings.py +32 -0
  11. django_cfg-1.0.3/@unfold/code/contrib/constance/templates/admin/constance/change_list.html +70 -0
  12. django_cfg-1.0.3/@unfold/code/contrib/constance/templates/admin/constance/includes/results_list.html +71 -0
  13. django_cfg-1.0.3/@unfold/code/contrib/filters/__init__.py +0 -0
  14. django_cfg-1.0.3/@unfold/code/contrib/filters/admin/__init__.py +60 -0
  15. django_cfg-1.0.3/@unfold/code/contrib/filters/admin/autocomplete_filters.py +16 -0
  16. django_cfg-1.0.3/@unfold/code/contrib/filters/admin/choice_filters.py +173 -0
  17. django_cfg-1.0.3/@unfold/code/contrib/filters/admin/datetime_filters.py +212 -0
  18. django_cfg-1.0.3/@unfold/code/contrib/filters/admin/dropdown_filters.py +115 -0
  19. django_cfg-1.0.3/@unfold/code/contrib/filters/admin/mixins.py +177 -0
  20. django_cfg-1.0.3/@unfold/code/contrib/filters/admin/numeric_filters.py +196 -0
  21. django_cfg-1.0.3/@unfold/code/contrib/filters/admin/text_filters.py +65 -0
  22. django_cfg-1.0.3/@unfold/code/contrib/filters/apps.py +6 -0
  23. django_cfg-1.0.3/@unfold/code/contrib/filters/forms.py +283 -0
  24. django_cfg-1.0.3/@unfold/code/contrib/filters/static/unfold/filters/css/nouislider/LICENSE +21 -0
  25. django_cfg-1.0.3/@unfold/code/contrib/filters/static/unfold/filters/css/nouislider/nouislider.min.css +1 -0
  26. django_cfg-1.0.3/@unfold/code/contrib/filters/static/unfold/filters/js/DateTimeShortcuts.js +408 -0
  27. django_cfg-1.0.3/@unfold/code/contrib/filters/static/unfold/filters/js/admin-numeric-filter.js +35 -0
  28. django_cfg-1.0.3/@unfold/code/contrib/filters/static/unfold/filters/js/nouislider/LICENSE +21 -0
  29. django_cfg-1.0.3/@unfold/code/contrib/filters/static/unfold/filters/js/nouislider/nouislider.min.js +1 -0
  30. django_cfg-1.0.3/@unfold/code/contrib/filters/static/unfold/filters/js/wnumb/LICENSE +9 -0
  31. django_cfg-1.0.3/@unfold/code/contrib/filters/static/unfold/filters/js/wnumb/wNumb.min.js +1 -0
  32. django_cfg-1.0.3/@unfold/code/contrib/filters/templates/unfold/filters/filters_date_range.html +17 -0
  33. django_cfg-1.0.3/@unfold/code/contrib/filters/templates/unfold/filters/filters_datetime_range.html +17 -0
  34. django_cfg-1.0.3/@unfold/code/contrib/filters/templates/unfold/filters/filters_field.html +7 -0
  35. django_cfg-1.0.3/@unfold/code/contrib/filters/templates/unfold/filters/filters_numeric_range.html +17 -0
  36. django_cfg-1.0.3/@unfold/code/contrib/filters/templates/unfold/filters/filters_numeric_single.html +15 -0
  37. django_cfg-1.0.3/@unfold/code/contrib/filters/templates/unfold/filters/filters_numeric_slider.html +35 -0
  38. django_cfg-1.0.3/@unfold/code/contrib/forms/__init__.py +0 -0
  39. django_cfg-1.0.3/@unfold/code/contrib/forms/apps.py +6 -0
  40. django_cfg-1.0.3/@unfold/code/contrib/forms/static/unfold/forms/css/trix/LICENSE +20 -0
  41. django_cfg-1.0.3/@unfold/code/contrib/forms/static/unfold/forms/css/trix/trix.css +412 -0
  42. django_cfg-1.0.3/@unfold/code/contrib/forms/static/unfold/forms/js/trix/LICENSE +20 -0
  43. django_cfg-1.0.3/@unfold/code/contrib/forms/static/unfold/forms/js/trix/trix.js +5 -0
  44. django_cfg-1.0.3/@unfold/code/contrib/forms/static/unfold/forms/js/trix.config.js +39 -0
  45. django_cfg-1.0.3/@unfold/code/contrib/forms/templates/unfold/forms/array.html +33 -0
  46. django_cfg-1.0.3/@unfold/code/contrib/forms/templates/unfold/forms/helpers/toolbar.html +111 -0
  47. django_cfg-1.0.3/@unfold/code/contrib/forms/templates/unfold/forms/wysiwyg.html +7 -0
  48. django_cfg-1.0.3/@unfold/code/contrib/forms/widgets.py +122 -0
  49. django_cfg-1.0.3/@unfold/code/contrib/guardian/__init__.py +0 -0
  50. django_cfg-1.0.3/@unfold/code/contrib/guardian/apps.py +6 -0
  51. django_cfg-1.0.3/@unfold/code/contrib/guardian/templates/admin/guardian/model/change_form.html +13 -0
  52. django_cfg-1.0.3/@unfold/code/contrib/guardian/templates/admin/guardian/model/field.html +11 -0
  53. django_cfg-1.0.3/@unfold/code/contrib/guardian/templates/admin/guardian/model/obj_perms_manage.html +37 -0
  54. django_cfg-1.0.3/@unfold/code/contrib/guardian/templates/admin/guardian/model/obj_perms_manage_group.html +57 -0
  55. django_cfg-1.0.3/@unfold/code/contrib/guardian/templates/admin/guardian/model/obj_perms_manage_user.html +58 -0
  56. django_cfg-1.0.3/@unfold/code/contrib/guardian/templates/unfold/guardian/group_form.html +72 -0
  57. django_cfg-1.0.3/@unfold/code/contrib/guardian/templates/unfold/guardian/user_form.html +72 -0
  58. django_cfg-1.0.3/@unfold/code/contrib/import_export/__init__.py +0 -0
  59. django_cfg-1.0.3/@unfold/code/contrib/import_export/apps.py +6 -0
  60. django_cfg-1.0.3/@unfold/code/contrib/import_export/forms.py +53 -0
  61. django_cfg-1.0.3/@unfold/code/contrib/import_export/templates/admin/import_export/base.html +8 -0
  62. django_cfg-1.0.3/@unfold/code/contrib/import_export/templates/admin/import_export/change_form.html +10 -0
  63. django_cfg-1.0.3/@unfold/code/contrib/import_export/templates/admin/import_export/change_list_export.html +5 -0
  64. django_cfg-1.0.3/@unfold/code/contrib/import_export/templates/admin/import_export/change_list_export_item.html +7 -0
  65. django_cfg-1.0.3/@unfold/code/contrib/import_export/templates/admin/import_export/change_list_import.html +5 -0
  66. django_cfg-1.0.3/@unfold/code/contrib/import_export/templates/admin/import_export/change_list_import_export.html +6 -0
  67. django_cfg-1.0.3/@unfold/code/contrib/import_export/templates/admin/import_export/change_list_import_item.html +7 -0
  68. django_cfg-1.0.3/@unfold/code/contrib/import_export/templates/admin/import_export/export.html +82 -0
  69. django_cfg-1.0.3/@unfold/code/contrib/import_export/templates/admin/import_export/import.html +62 -0
  70. django_cfg-1.0.3/@unfold/code/contrib/import_export/templates/admin/import_export/import_confirm.html +19 -0
  71. django_cfg-1.0.3/@unfold/code/contrib/import_export/templates/admin/import_export/import_errors.html +42 -0
  72. django_cfg-1.0.3/@unfold/code/contrib/import_export/templates/admin/import_export/import_form.html +24 -0
  73. django_cfg-1.0.3/@unfold/code/contrib/import_export/templates/admin/import_export/import_preview.html +41 -0
  74. django_cfg-1.0.3/@unfold/code/contrib/import_export/templates/admin/import_export/import_validation.html +93 -0
  75. django_cfg-1.0.3/@unfold/code/contrib/import_export/templates/admin/import_export/resource_fields_list.html +26 -0
  76. django_cfg-1.0.3/@unfold/code/contrib/inlines/__init__.py +0 -0
  77. django_cfg-1.0.3/@unfold/code/contrib/inlines/admin.py +147 -0
  78. django_cfg-1.0.3/@unfold/code/contrib/inlines/apps.py +6 -0
  79. django_cfg-1.0.3/@unfold/code/contrib/inlines/checks.py +16 -0
  80. django_cfg-1.0.3/@unfold/code/contrib/inlines/forms.py +44 -0
  81. django_cfg-1.0.3/@unfold/code/contrib/location_field/__init__.py +0 -0
  82. django_cfg-1.0.3/@unfold/code/contrib/location_field/apps.py +6 -0
  83. django_cfg-1.0.3/@unfold/code/contrib/location_field/templates/location_field/map_widget.html +5 -0
  84. django_cfg-1.0.3/@unfold/code/contrib/simple_history/__init__.py +0 -0
  85. django_cfg-1.0.3/@unfold/code/contrib/simple_history/apps.py +6 -0
  86. django_cfg-1.0.3/@unfold/code/contrib/simple_history/templates/simple_history/object_history.html +35 -0
  87. django_cfg-1.0.3/@unfold/code/contrib/simple_history/templates/simple_history/object_history_form.html +55 -0
  88. django_cfg-1.0.3/@unfold/code/contrib/simple_history/templates/simple_history/object_history_list.html +118 -0
  89. django_cfg-1.0.3/@unfold/code/contrib/simple_history/templates/simple_history/submit_line.html +23 -0
  90. django_cfg-1.0.3/@unfold/code/dataclasses.py +41 -0
  91. django_cfg-1.0.3/@unfold/code/decorators.py +138 -0
  92. django_cfg-1.0.3/@unfold/code/enums.py +10 -0
  93. django_cfg-1.0.3/@unfold/code/exceptions.py +2 -0
  94. django_cfg-1.0.3/@unfold/code/fields.py +207 -0
  95. django_cfg-1.0.3/@unfold/code/forms.py +260 -0
  96. django_cfg-1.0.3/@unfold/code/layout.py +57 -0
  97. django_cfg-1.0.3/@unfold/code/mixins/__init__.py +4 -0
  98. django_cfg-1.0.3/@unfold/code/mixins/action_model_admin.py +342 -0
  99. django_cfg-1.0.3/@unfold/code/mixins/base_model_admin.py +129 -0
  100. django_cfg-1.0.3/@unfold/code/overrides.py +73 -0
  101. django_cfg-1.0.3/@unfold/code/paginator.py +21 -0
  102. django_cfg-1.0.3/@unfold/code/sections.py +82 -0
  103. django_cfg-1.0.3/@unfold/code/settings.py +106 -0
  104. django_cfg-1.0.3/@unfold/code/sites.py +628 -0
  105. django_cfg-1.0.3/@unfold/code/static/admin/js/admin/RelatedObjectLookups.js +301 -0
  106. django_cfg-1.0.3/@unfold/code/static/admin/js/inlines.js +499 -0
  107. django_cfg-1.0.3/@unfold/code/static/unfold/css/simplebar/LICENSE +21 -0
  108. django_cfg-1.0.3/@unfold/code/static/unfold/css/simplebar/simplebar.css +230 -0
  109. django_cfg-1.0.3/@unfold/code/static/unfold/css/styles.css +2 -0
  110. django_cfg-1.0.3/@unfold/code/static/unfold/fonts/inter/Inter-Bold.woff2 +0 -0
  111. django_cfg-1.0.3/@unfold/code/static/unfold/fonts/inter/Inter-Medium.woff2 +0 -0
  112. django_cfg-1.0.3/@unfold/code/static/unfold/fonts/inter/Inter-Regular.woff2 +0 -0
  113. django_cfg-1.0.3/@unfold/code/static/unfold/fonts/inter/Inter-SemiBold.woff2 +0 -0
  114. django_cfg-1.0.3/@unfold/code/static/unfold/fonts/inter/LICENSE +92 -0
  115. django_cfg-1.0.3/@unfold/code/static/unfold/fonts/inter/styles.css +31 -0
  116. django_cfg-1.0.3/@unfold/code/static/unfold/fonts/material-symbols/LICENSE +202 -0
  117. django_cfg-1.0.3/@unfold/code/static/unfold/fonts/material-symbols/Material-Symbols-Outlined.woff2 +0 -0
  118. django_cfg-1.0.3/@unfold/code/static/unfold/fonts/material-symbols/styles.css +6 -0
  119. django_cfg-1.0.3/@unfold/code/static/unfold/js/alpine/LICENSE +21 -0
  120. django_cfg-1.0.3/@unfold/code/static/unfold/js/alpine/alpine.anchor.js +1 -0
  121. django_cfg-1.0.3/@unfold/code/static/unfold/js/alpine/alpine.js +5 -0
  122. django_cfg-1.0.3/@unfold/code/static/unfold/js/alpine/alpine.persist.js +1 -0
  123. django_cfg-1.0.3/@unfold/code/static/unfold/js/alpine/alpine.resize.js +1 -0
  124. django_cfg-1.0.3/@unfold/code/static/unfold/js/alpine/alpine.sort.js +1 -0
  125. django_cfg-1.0.3/@unfold/code/static/unfold/js/app.js +520 -0
  126. django_cfg-1.0.3/@unfold/code/static/unfold/js/chart/LICENSE +9 -0
  127. django_cfg-1.0.3/@unfold/code/static/unfold/js/chart/chart.js +1 -0
  128. django_cfg-1.0.3/@unfold/code/static/unfold/js/htmx/LICENSE +13 -0
  129. django_cfg-1.0.3/@unfold/code/static/unfold/js/htmx/htmx.js +1 -0
  130. django_cfg-1.0.3/@unfold/code/static/unfold/js/select2.init.js +52 -0
  131. django_cfg-1.0.3/@unfold/code/static/unfold/js/simplebar/LICENSE +21 -0
  132. django_cfg-1.0.3/@unfold/code/static/unfold/js/simplebar/simplebar.js +10 -0
  133. django_cfg-1.0.3/@unfold/code/styles.css +673 -0
  134. django_cfg-1.0.3/@unfold/code/templates/admin/actions.html +60 -0
  135. django_cfg-1.0.3/@unfold/code/templates/admin/app_index.html +39 -0
  136. django_cfg-1.0.3/@unfold/code/templates/admin/app_list.html +51 -0
  137. django_cfg-1.0.3/@unfold/code/templates/admin/auth/user/add_form.html +8 -0
  138. django_cfg-1.0.3/@unfold/code/templates/admin/auth/user/change_password.html +59 -0
  139. django_cfg-1.0.3/@unfold/code/templates/admin/base.html +62 -0
  140. django_cfg-1.0.3/@unfold/code/templates/admin/base_site.html +9 -0
  141. django_cfg-1.0.3/@unfold/code/templates/admin/change_form.html +141 -0
  142. django_cfg-1.0.3/@unfold/code/templates/admin/change_form_object_tools.html +15 -0
  143. django_cfg-1.0.3/@unfold/code/templates/admin/change_list.html +128 -0
  144. django_cfg-1.0.3/@unfold/code/templates/admin/change_list_object_tools.html +5 -0
  145. django_cfg-1.0.3/@unfold/code/templates/admin/change_list_results.html +120 -0
  146. django_cfg-1.0.3/@unfold/code/templates/admin/date_hierarchy.html +33 -0
  147. django_cfg-1.0.3/@unfold/code/templates/admin/delete_confirmation.html +103 -0
  148. django_cfg-1.0.3/@unfold/code/templates/admin/delete_selected_confirmation.html +97 -0
  149. django_cfg-1.0.3/@unfold/code/templates/admin/edit_inline/stacked.html +112 -0
  150. django_cfg-1.0.3/@unfold/code/templates/admin/edit_inline/tabular.html +42 -0
  151. django_cfg-1.0.3/@unfold/code/templates/admin/filter.html +35 -0
  152. django_cfg-1.0.3/@unfold/code/templates/admin/includes/fieldset.html +33 -0
  153. django_cfg-1.0.3/@unfold/code/templates/admin/includes/object_delete_summary.html +15 -0
  154. django_cfg-1.0.3/@unfold/code/templates/admin/index.html +21 -0
  155. django_cfg-1.0.3/@unfold/code/templates/admin/login.html +62 -0
  156. django_cfg-1.0.3/@unfold/code/templates/admin/nav_sidebar.html +15 -0
  157. django_cfg-1.0.3/@unfold/code/templates/admin/object_history.html +86 -0
  158. django_cfg-1.0.3/@unfold/code/templates/admin/pagination.html +23 -0
  159. django_cfg-1.0.3/@unfold/code/templates/admin/search_form.html +30 -0
  160. django_cfg-1.0.3/@unfold/code/templates/admin/submit_line.html +67 -0
  161. django_cfg-1.0.3/@unfold/code/templates/auth/widgets/read_only_password_hash.html +13 -0
  162. django_cfg-1.0.3/@unfold/code/templates/registration/logged_out.html +28 -0
  163. django_cfg-1.0.3/@unfold/code/templates/registration/password_change_done.html +29 -0
  164. django_cfg-1.0.3/@unfold/code/templates/registration/password_change_form.html +51 -0
  165. django_cfg-1.0.3/@unfold/code/templates/unfold/components/button.html +13 -0
  166. django_cfg-1.0.3/@unfold/code/templates/unfold/components/card.html +27 -0
  167. django_cfg-1.0.3/@unfold/code/templates/unfold/components/chart/bar.html +3 -0
  168. django_cfg-1.0.3/@unfold/code/templates/unfold/components/chart/cohort.html +59 -0
  169. django_cfg-1.0.3/@unfold/code/templates/unfold/components/chart/line.html +3 -0
  170. django_cfg-1.0.3/@unfold/code/templates/unfold/components/container.html +3 -0
  171. django_cfg-1.0.3/@unfold/code/templates/unfold/components/flex.html +3 -0
  172. django_cfg-1.0.3/@unfold/code/templates/unfold/components/icon.html +1 -0
  173. django_cfg-1.0.3/@unfold/code/templates/unfold/components/navigation.html +15 -0
  174. django_cfg-1.0.3/@unfold/code/templates/unfold/components/progress.html +23 -0
  175. django_cfg-1.0.3/@unfold/code/templates/unfold/components/separator.html +1 -0
  176. django_cfg-1.0.3/@unfold/code/templates/unfold/components/table.html +47 -0
  177. django_cfg-1.0.3/@unfold/code/templates/unfold/components/text.html +3 -0
  178. django_cfg-1.0.3/@unfold/code/templates/unfold/components/title.html +3 -0
  179. django_cfg-1.0.3/@unfold/code/templates/unfold/components/tracker.html +5 -0
  180. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/account_links.html +45 -0
  181. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/actions_row.html +33 -0
  182. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/add_link.html +21 -0
  183. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/app_list.html +102 -0
  184. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/app_list_default.html +62 -0
  185. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/attrs.html +1 -0
  186. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/boolean.html +15 -0
  187. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/breadcrumb_item.html +8 -0
  188. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/change_list_actions.html +13 -0
  189. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/change_list_filter.html +25 -0
  190. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/change_list_filter_actions.html +33 -0
  191. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/command.html +53 -0
  192. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/command_history.html +54 -0
  193. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/command_results.html +50 -0
  194. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/delete_submit_line.html +11 -0
  195. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/display_dropdown.html +33 -0
  196. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/display_header.html +30 -0
  197. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/display_label.html +11 -0
  198. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/edit_inline/tabular_delete.html +13 -0
  199. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/edit_inline/tabular_error.html +8 -0
  200. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/edit_inline/tabular_field.html +27 -0
  201. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/edit_inline/tabular_heading.html +25 -0
  202. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/edit_inline/tabular_row.html +27 -0
  203. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/edit_inline/tabular_title.html +49 -0
  204. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/empty_results.html +35 -0
  205. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/field.html +27 -0
  206. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/field_readonly.html +7 -0
  207. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/field_readonly_value.html +1 -0
  208. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/fieldset_row.html +25 -0
  209. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/fieldset_row_checkbox.html +45 -0
  210. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/fieldset_row_field.html +21 -0
  211. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/fieldsets_tabs.html +26 -0
  212. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/form_errors.html +11 -0
  213. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/form_label.html +7 -0
  214. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/header.html +25 -0
  215. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/header_back_button.html +13 -0
  216. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/help_text.html +5 -0
  217. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/history.html +41 -0
  218. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/label.html +16 -0
  219. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/language_form.html +10 -0
  220. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/language_switch.html +25 -0
  221. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/messages/debug.html +3 -0
  222. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/messages/error.html +15 -0
  223. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/messages/errornote.html +7 -0
  224. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/messages/info.html +3 -0
  225. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/messages/success.html +3 -0
  226. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/messages/warning.html +3 -0
  227. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/messages.html +19 -0
  228. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/navigation.html +13 -0
  229. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/navigation_header.html +28 -0
  230. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/pagination.html +7 -0
  231. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/pagination_current_item.html +3 -0
  232. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/pagination_default.html +23 -0
  233. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/pagination_ellipsis.html +3 -0
  234. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/pagination_infinite.html +11 -0
  235. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/pagination_inline.html +36 -0
  236. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/popup_header.html +27 -0
  237. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/search.html +48 -0
  238. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/search_results.html +14 -0
  239. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/shortcut.html +3 -0
  240. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/site_branding.html +9 -0
  241. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/site_dropdown.html +19 -0
  242. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/site_icon.html +31 -0
  243. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/site_logo.html +11 -0
  244. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/submit.html +3 -0
  245. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/tab_action.html +59 -0
  246. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/tab_actions.html +19 -0
  247. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/tab_items.html +46 -0
  248. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/tab_list.html +11 -0
  249. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/theme_switch.html +34 -0
  250. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/unauthenticated_header.html +15 -0
  251. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/unauthenticated_title.html +11 -0
  252. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/userlinks.html +25 -0
  253. django_cfg-1.0.3/@unfold/code/templates/unfold/helpers/welcomemsg.html +41 -0
  254. django_cfg-1.0.3/@unfold/code/templates/unfold/layouts/base.html +7 -0
  255. django_cfg-1.0.3/@unfold/code/templates/unfold/layouts/base_simple.html +39 -0
  256. django_cfg-1.0.3/@unfold/code/templates/unfold/layouts/skeleton.html +86 -0
  257. django_cfg-1.0.3/@unfold/code/templates/unfold/layouts/unauthenticated.html +37 -0
  258. django_cfg-1.0.3/@unfold/code/templates/unfold/templatetags/preserve_changelist_filters.html +3 -0
  259. django_cfg-1.0.3/@unfold/code/templates/unfold/widgets/clearable_file_input.html +41 -0
  260. django_cfg-1.0.3/@unfold/code/templates/unfold/widgets/clearable_file_input_small.html +46 -0
  261. django_cfg-1.0.3/@unfold/code/templates/unfold/widgets/date.html +3 -0
  262. django_cfg-1.0.3/@unfold/code/templates/unfold/widgets/foreign_key_raw_id.html +21 -0
  263. django_cfg-1.0.3/@unfold/code/templates/unfold/widgets/radio.html +20 -0
  264. django_cfg-1.0.3/@unfold/code/templates/unfold/widgets/radio_option.html +12 -0
  265. django_cfg-1.0.3/@unfold/code/templates/unfold/widgets/range.html +11 -0
  266. django_cfg-1.0.3/@unfold/code/templates/unfold/widgets/related_widget_wrapper.html +54 -0
  267. django_cfg-1.0.3/@unfold/code/templates/unfold/widgets/select.html +9 -0
  268. django_cfg-1.0.3/@unfold/code/templates/unfold/widgets/split_datetime.html +17 -0
  269. django_cfg-1.0.3/@unfold/code/templates/unfold/widgets/split_datetime_vertical.html +29 -0
  270. django_cfg-1.0.3/@unfold/code/templates/unfold/widgets/split_money.html +13 -0
  271. django_cfg-1.0.3/@unfold/code/templates/unfold/widgets/text.html +28 -0
  272. django_cfg-1.0.3/@unfold/code/templates/unfold/widgets/textarea.html +1 -0
  273. django_cfg-1.0.3/@unfold/code/templates/unfold/widgets/time.html +3 -0
  274. django_cfg-1.0.3/@unfold/code/templates/unfold/widgets/url.html +9 -0
  275. django_cfg-1.0.3/@unfold/code/templates/unfold_crispy/display_form.html +9 -0
  276. django_cfg-1.0.3/@unfold/code/templates/unfold_crispy/errors.html +3 -0
  277. django_cfg-1.0.3/@unfold/code/templates/unfold_crispy/errors_formset.html +3 -0
  278. django_cfg-1.0.3/@unfold/code/templates/unfold_crispy/field.html +25 -0
  279. django_cfg-1.0.3/@unfold/code/templates/unfold_crispy/inputs.html +7 -0
  280. django_cfg-1.0.3/@unfold/code/templates/unfold_crispy/layout/attrs.html +1 -0
  281. django_cfg-1.0.3/@unfold/code/templates/unfold_crispy/layout/baseinput.html +9 -0
  282. django_cfg-1.0.3/@unfold/code/templates/unfold_crispy/layout/button.html +1 -0
  283. django_cfg-1.0.3/@unfold/code/templates/unfold_crispy/layout/buttonholder.html +3 -0
  284. django_cfg-1.0.3/@unfold/code/templates/unfold_crispy/layout/checkbox.html +35 -0
  285. django_cfg-1.0.3/@unfold/code/templates/unfold_crispy/layout/column.html +3 -0
  286. django_cfg-1.0.3/@unfold/code/templates/unfold_crispy/layout/div.html +4 -0
  287. django_cfg-1.0.3/@unfold/code/templates/unfold_crispy/layout/field_errors.html +7 -0
  288. django_cfg-1.0.3/@unfold/code/templates/unfold_crispy/layout/fieldset.html +11 -0
  289. django_cfg-1.0.3/@unfold/code/templates/unfold_crispy/layout/fieldset_subheader.html +3 -0
  290. django_cfg-1.0.3/@unfold/code/templates/unfold_crispy/layout/help_text.html +5 -0
  291. django_cfg-1.0.3/@unfold/code/templates/unfold_crispy/layout/help_text_and_errors.html +3 -0
  292. django_cfg-1.0.3/@unfold/code/templates/unfold_crispy/layout/hr.html +13 -0
  293. django_cfg-1.0.3/@unfold/code/templates/unfold_crispy/layout/radio_checkbox_select.html +21 -0
  294. django_cfg-1.0.3/@unfold/code/templates/unfold_crispy/layout/row.html +3 -0
  295. django_cfg-1.0.3/@unfold/code/templates/unfold_crispy/layout/table_inline_formset.html +104 -0
  296. django_cfg-1.0.3/@unfold/code/templates/unfold_crispy/uni_form.html +11 -0
  297. django_cfg-1.0.3/@unfold/code/templates/unfold_crispy/whole_uni_form.html +14 -0
  298. django_cfg-1.0.3/@unfold/code/templates/unfold_crispy/whole_uni_formset.html +30 -0
  299. django_cfg-1.0.3/@unfold/code/templatetags/__init__.py +0 -0
  300. django_cfg-1.0.3/@unfold/code/templatetags/unfold.py +605 -0
  301. django_cfg-1.0.3/@unfold/code/templatetags/unfold_list.py +417 -0
  302. django_cfg-1.0.3/@unfold/code/typing.py +25 -0
  303. django_cfg-1.0.3/@unfold/code/utils.py +191 -0
  304. django_cfg-1.0.3/@unfold/code/views.py +47 -0
  305. django_cfg-1.0.3/@unfold/code/widgets.py +901 -0
  306. django_cfg-1.0.3/@unfold/docs/actions/action-form-example.md +109 -0
  307. django_cfg-1.0.3/@unfold/docs/actions/changeform-submitline.md +43 -0
  308. django_cfg-1.0.3/@unfold/docs/actions/changeform.md +54 -0
  309. django_cfg-1.0.3/@unfold/docs/actions/changelist-row.md +44 -0
  310. django_cfg-1.0.3/@unfold/docs/actions/changelist.md +39 -0
  311. django_cfg-1.0.3/@unfold/docs/actions/dropdown-actions.md +33 -0
  312. django_cfg-1.0.3/@unfold/docs/actions/index.md +5 -0
  313. django_cfg-1.0.3/@unfold/docs/actions/introduction.md +128 -0
  314. django_cfg-1.0.3/@unfold/docs/components/button.md +61 -0
  315. django_cfg-1.0.3/@unfold/docs/components/cohort.md +95 -0
  316. django_cfg-1.0.3/@unfold/docs/components/component-class.md +43 -0
  317. django_cfg-1.0.3/@unfold/docs/components/index.md +5 -0
  318. django_cfg-1.0.3/@unfold/docs/components/introduction.md +76 -0
  319. django_cfg-1.0.3/@unfold/docs/components/table.md +49 -0
  320. django_cfg-1.0.3/@unfold/docs/components/tracker.md +68 -0
  321. django_cfg-1.0.3/@unfold/docs/configuration/command.md +59 -0
  322. django_cfg-1.0.3/@unfold/docs/configuration/conditional-fields.md +68 -0
  323. django_cfg-1.0.3/@unfold/docs/configuration/crispy-forms.md +214 -0
  324. django_cfg-1.0.3/@unfold/docs/configuration/custom-pages.md +80 -0
  325. django_cfg-1.0.3/@unfold/docs/configuration/custom-sites.md +85 -0
  326. django_cfg-1.0.3/@unfold/docs/configuration/dashboard.md +71 -0
  327. django_cfg-1.0.3/@unfold/docs/configuration/index.md +4 -0
  328. django_cfg-1.0.3/@unfold/docs/configuration/modeladmin.md +76 -0
  329. django_cfg-1.0.3/@unfold/docs/configuration/multi-language.md +101 -0
  330. django_cfg-1.0.3/@unfold/docs/configuration/paginator.md +33 -0
  331. django_cfg-1.0.3/@unfold/docs/configuration/sections.md +98 -0
  332. django_cfg-1.0.3/@unfold/docs/configuration/settings.md +183 -0
  333. django_cfg-1.0.3/@unfold/docs/configuration/site-dropdown.md +36 -0
  334. django_cfg-1.0.3/@unfold/docs/decorators/action.md +44 -0
  335. django_cfg-1.0.3/@unfold/docs/decorators/display.md +163 -0
  336. django_cfg-1.0.3/@unfold/docs/decorators/index.md +5 -0
  337. django_cfg-1.0.3/@unfold/docs/development/devcontainer.md +45 -0
  338. django_cfg-1.0.3/@unfold/docs/development/index.md +4 -0
  339. django_cfg-1.0.3/@unfold/docs/development/poetry-dependency.md +50 -0
  340. django_cfg-1.0.3/@unfold/docs/fields/index.md +4 -0
  341. django_cfg-1.0.3/@unfold/docs/fields/json.md +52 -0
  342. django_cfg-1.0.3/@unfold/docs/filters/autocomplete.md +39 -0
  343. django_cfg-1.0.3/@unfold/docs/filters/checkbox-radio.md +112 -0
  344. django_cfg-1.0.3/@unfold/docs/filters/datetime.md +30 -0
  345. django_cfg-1.0.3/@unfold/docs/filters/dropdown.md +63 -0
  346. django_cfg-1.0.3/@unfold/docs/filters/horizontal.md +32 -0
  347. django_cfg-1.0.3/@unfold/docs/filters/index.md +4 -0
  348. django_cfg-1.0.3/@unfold/docs/filters/introduction.md +22 -0
  349. django_cfg-1.0.3/@unfold/docs/filters/numeric.md +51 -0
  350. django_cfg-1.0.3/@unfold/docs/filters/text.md +44 -0
  351. django_cfg-1.0.3/@unfold/docs/inlines/index.md +4 -0
  352. django_cfg-1.0.3/@unfold/docs/inlines/introduction.md +30 -0
  353. django_cfg-1.0.3/@unfold/docs/inlines/nonrelated.md +42 -0
  354. django_cfg-1.0.3/@unfold/docs/inlines/options.md +68 -0
  355. django_cfg-1.0.3/@unfold/docs/inlines/paginated.md +56 -0
  356. django_cfg-1.0.3/@unfold/docs/inlines/sortable.md +47 -0
  357. django_cfg-1.0.3/@unfold/docs/installation/auth.md +40 -0
  358. django_cfg-1.0.3/@unfold/docs/installation/index.md +5 -0
  359. django_cfg-1.0.3/@unfold/docs/installation/quickstart.md +64 -0
  360. django_cfg-1.0.3/@unfold/docs/integrations/django-celery-beat.md +77 -0
  361. django_cfg-1.0.3/@unfold/docs/integrations/django-constance.md +49 -0
  362. django_cfg-1.0.3/@unfold/docs/integrations/django-guardian.md +17 -0
  363. django_cfg-1.0.3/@unfold/docs/integrations/django-import-export.md +51 -0
  364. django_cfg-1.0.3/@unfold/docs/integrations/django-location-field.md +11 -0
  365. django_cfg-1.0.3/@unfold/docs/integrations/django-modeltranslation.md +47 -0
  366. django_cfg-1.0.3/@unfold/docs/integrations/django-money.md +19 -0
  367. django_cfg-1.0.3/@unfold/docs/integrations/django-simple-history.md +46 -0
  368. django_cfg-1.0.3/@unfold/docs/integrations/index.md +4 -0
  369. django_cfg-1.0.3/@unfold/docs/styles-scripts/customizing-tailwind.md +146 -0
  370. django_cfg-1.0.3/@unfold/docs/styles-scripts/index.md +4 -0
  371. django_cfg-1.0.3/@unfold/docs/styles-scripts/loading-files.md +26 -0
  372. django_cfg-1.0.3/@unfold/docs/tabs/changeform.md +51 -0
  373. django_cfg-1.0.3/@unfold/docs/tabs/changelist.md +46 -0
  374. django_cfg-1.0.3/@unfold/docs/tabs/dynamic.md +97 -0
  375. django_cfg-1.0.3/@unfold/docs/tabs/fieldsets.md +58 -0
  376. django_cfg-1.0.3/@unfold/docs/tabs/index.md +4 -0
  377. django_cfg-1.0.3/@unfold/docs/tabs/inline.md +27 -0
  378. django_cfg-1.0.3/@unfold/docs/widgets/array.md +54 -0
  379. django_cfg-1.0.3/@unfold/docs/widgets/index.md +4 -0
  380. django_cfg-1.0.3/@unfold/docs/widgets/wysiwyg.md +39 -0
  381. django_cfg-1.0.3/@unfold/new/DJANGO_UNFOLD_DASHBOARD.md +882 -0
  382. django_cfg-1.0.3/@unfold/new/DJANGO_UNFOLD_MISSING_FEATURES.md +651 -0
  383. django_cfg-1.0.3/@unfold/new/DJANGO_UNFOLD_TABS.md +502 -0
  384. django_cfg-1.0.3/LICENSE +21 -0
  385. django_cfg-1.0.3/MANIFEST.in +6 -0
  386. django_cfg-1.0.3/PKG-INFO +591 -0
  387. django_cfg-1.0.3/README.md +519 -0
  388. django_cfg-1.0.3/django_cfg/__init__.py +87 -0
  389. django_cfg-1.0.3/django_cfg/apps.py +20 -0
  390. django_cfg-1.0.3/django_cfg/callbacks.py +196 -0
  391. django_cfg-1.0.3/django_cfg/health.py +267 -0
  392. django_cfg-1.0.3/django_cfg/management/__init__.py +1 -0
  393. django_cfg-1.0.3/django_cfg/management/commands/__init__.py +1 -0
  394. django_cfg-1.0.3/django_cfg/management/commands/show_config.py +225 -0
  395. django_cfg-1.0.3/django_cfg/management/commands/validate_config.py +184 -0
  396. django_cfg-1.0.3/django_cfg/models/__init__.py +61 -0
  397. django_cfg-1.0.3/django_cfg/models/api.py +145 -0
  398. django_cfg-1.0.3/django_cfg/models/base.py +287 -0
  399. django_cfg-1.0.3/django_cfg/models/cache.py +128 -0
  400. django_cfg-1.0.3/django_cfg/models/constance.py +236 -0
  401. django_cfg-1.0.3/django_cfg/models/database.py +333 -0
  402. django_cfg-1.0.3/django_cfg/models/email.py +163 -0
  403. django_cfg-1.0.3/django_cfg/models/environment.py +276 -0
  404. django_cfg-1.0.3/django_cfg/models/logging.py +366 -0
  405. django_cfg-1.0.3/django_cfg/models/security.py +125 -0
  406. django_cfg-1.0.3/django_cfg/models/unfold/__init__.py +35 -0
  407. django_cfg-1.0.3/django_cfg/models/unfold/config.py +517 -0
  408. django_cfg-1.0.3/django_cfg/models/unfold/dashboard.py +107 -0
  409. django_cfg-1.0.3/django_cfg/models/unfold/dropdown.py +16 -0
  410. django_cfg-1.0.3/django_cfg/models/unfold/navigation.py +38 -0
  411. django_cfg-1.0.3/django_cfg/models/unfold/tabs.py +17 -0
  412. django_cfg-1.0.3/django_cfg/routers.py +48 -0
  413. django_cfg-1.0.3/django_cfg/templates/__init__.py +1 -0
  414. django_cfg-1.0.3/django_cfg/templates/admin/index.html +40 -0
  415. django_cfg-1.0.3/django_cfg/templates/admin/layouts/dashboard_with_tabs.html +266 -0
  416. django_cfg-1.0.3/django_cfg/templates/admin/snippets/components/activity_tracker.html +17 -0
  417. django_cfg-1.0.3/django_cfg/templates/admin/snippets/components/charts_section.html +39 -0
  418. django_cfg-1.0.3/django_cfg/templates/admin/snippets/components/quick_actions.html +110 -0
  419. django_cfg-1.0.3/django_cfg/templates/admin/snippets/components/recent_activity.html +45 -0
  420. django_cfg-1.0.3/django_cfg/templates/admin/snippets/components/recent_users_table.html +118 -0
  421. django_cfg-1.0.3/django_cfg/templates/admin/snippets/components/stats_cards.html +40 -0
  422. django_cfg-1.0.3/django_cfg/templates/admin/snippets/components/stats_tiles.html +130 -0
  423. django_cfg-1.0.3/django_cfg/templates/admin/snippets/components/system_health.html +72 -0
  424. django_cfg-1.0.3/django_cfg/templates/admin/snippets/components/system_metrics.html +54 -0
  425. django_cfg-1.0.3/django_cfg/templates/admin/snippets/components/user_permissions.html +57 -0
  426. django_cfg-1.0.3/django_cfg/templates/admin/snippets/tabs/app_stats_tab.html +174 -0
  427. django_cfg-1.0.3/django_cfg/templates/admin/snippets/tabs/overview_tab.html +126 -0
  428. django_cfg-1.0.3/django_cfg/templates/admin/snippets/tabs/stats_tab.html +109 -0
  429. django_cfg-1.0.3/django_cfg/templates/admin/snippets/tabs/users_tab.html +51 -0
  430. django_cfg-1.0.3/django_cfg/templates/admin/snippets/zones/zones_table.html +204 -0
  431. django_cfg-1.0.3/django_cfg/toolkit.py +663 -0
  432. django_cfg-1.0.3/django_cfg/urls.py +33 -0
  433. django_cfg-1.0.3/package.json +12 -0
  434. django_cfg-1.0.3/pyproject.toml +97 -0
  435. django_cfg-1.0.3/requirements-dev.txt +19 -0
  436. django_cfg-1.0.3/requirements-minimal.txt +9 -0
  437. django_cfg-1.0.3/requirements.txt +7 -0
  438. django_cfg-1.0.3/scripts/README.md +123 -0
  439. django_cfg-1.0.3/scripts/__init__.py +7 -0
  440. django_cfg-1.0.3/scripts/dev_cli.py +203 -0
  441. django_cfg-1.0.3/scripts/generate_requirements.py +165 -0
  442. django_cfg-1.0.3/scripts/publisher.py +148 -0
  443. django_cfg-1.0.3/scripts/test_generation.sh +62 -0
  444. django_cfg-1.0.3/scripts/version_manager.py +242 -0
@@ -0,0 +1,41 @@
1
+
2
+ vercel
3
+ *.log
4
+ *.pyc
5
+ __pycache__
6
+
7
+ # Ignore SQLite database files
8
+ db.sqlite3
9
+
10
+ .DS_Store
11
+ cache
12
+
13
+ # Environments
14
+ .env*
15
+ .env.openrouter
16
+ .venv
17
+ env
18
+ .env.openrouter
19
+ venv
20
+ ENV
21
+ env.bak/
22
+ venv.bak/
23
+
24
+ node_modules
25
+ yarn-error.log
26
+ yarn.lock
27
+ package-lock.json
28
+
29
+ .pytest_cache
30
+
31
+ # For pypi package
32
+ __pycache__/
33
+ *.pyc
34
+ *.pyo
35
+ *.pyd
36
+ *.pyw
37
+ *.pyz
38
+ *.pywz
39
+ *.pyzw
40
+ *.egg-info/
41
+
File without changes
@@ -0,0 +1,229 @@
1
+ from functools import update_wrapper
2
+ from typing import Any, Optional
3
+
4
+ from django import forms
5
+ from django.contrib.admin import ModelAdmin as BaseModelAdmin
6
+ from django.contrib.admin import StackedInline as BaseStackedInline
7
+ from django.contrib.admin import TabularInline as BaseTabularInline
8
+ from django.contrib.admin import display, helpers
9
+ from django.contrib.admin.options import InlineModelAdmin
10
+ from django.contrib.contenttypes.admin import (
11
+ GenericStackedInline as BaseGenericStackedInline,
12
+ )
13
+ from django.contrib.contenttypes.admin import (
14
+ GenericTabularInline as BaseGenericTabularInline,
15
+ )
16
+ from django.db.models import BLANK_CHOICE_DASH, Model
17
+ from django.http import HttpRequest, HttpResponse
18
+ from django.shortcuts import redirect
19
+ from django.template.response import TemplateResponse
20
+ from django.urls import URLPattern, path
21
+ from django.utils.safestring import mark_safe
22
+ from django.utils.translation import gettext_lazy as _
23
+ from django.views import View
24
+
25
+ from unfold.checks import UnfoldModelAdminChecks
26
+ from unfold.forms import (
27
+ ActionForm,
28
+ PaginationGenericInlineFormSet,
29
+ PaginationInlineFormSet,
30
+ )
31
+ from unfold.mixins import ActionModelAdminMixin, BaseModelAdminMixin
32
+ from unfold.overrides import FORMFIELD_OVERRIDES_INLINE
33
+ from unfold.typing import FieldsetsType
34
+ from unfold.views import ChangeList
35
+ from unfold.widgets import UnfoldBooleanWidget
36
+
37
+ checkbox = UnfoldBooleanWidget(
38
+ {
39
+ "class": "action-select",
40
+ "aria-label": _("Select record"),
41
+ },
42
+ lambda value: False,
43
+ )
44
+
45
+
46
+ class ModelAdmin(BaseModelAdminMixin, ActionModelAdminMixin, BaseModelAdmin):
47
+ action_form = ActionForm
48
+ custom_urls = ()
49
+ add_fieldsets = ()
50
+ list_horizontal_scrollbar_top = False
51
+ list_filter_submit = False
52
+ list_filter_sheet = True
53
+ list_fullwidth = False
54
+ list_disable_select_all = False
55
+ list_before_template = None
56
+ list_after_template = None
57
+ change_form_before_template = None
58
+ change_form_after_template = None
59
+ change_form_outer_before_template = None
60
+ change_form_outer_after_template = None
61
+ compressed_fields = False
62
+ readonly_preprocess_fields = {}
63
+ warn_unsaved_form = False
64
+ checks_class = UnfoldModelAdminChecks
65
+
66
+ def changelist_view(
67
+ self, request: HttpRequest, extra_context: Optional[dict[str, str]] = None
68
+ ) -> TemplateResponse:
69
+ additional_media = forms.Media()
70
+
71
+ for filter in self.get_list_filter(request):
72
+ if (
73
+ isinstance(filter, (tuple, list))
74
+ and hasattr(filter[1], "form_class")
75
+ and hasattr(filter[1].form_class, "Media")
76
+ ):
77
+ additional_media += forms.Media(filter[1].form_class.Media)
78
+ elif hasattr(filter, "form_class") and hasattr(filter.form_class, "Media"):
79
+ additional_media += forms.Media(filter.form_class.Media)
80
+
81
+ if not extra_context:
82
+ extra_context = {}
83
+
84
+ extra_context.update(
85
+ {
86
+ "media": self.media + additional_media,
87
+ }
88
+ )
89
+
90
+ return super().changelist_view(request, extra_context)
91
+
92
+ def get_fieldsets(self, request: HttpRequest, obj=None) -> FieldsetsType:
93
+ if not obj and self.add_fieldsets:
94
+ return self.add_fieldsets
95
+ return super().get_fieldsets(request, obj)
96
+
97
+ def get_custom_urls(self) -> tuple[tuple[str, str, View], ...]:
98
+ """
99
+ Method to get custom views for ModelAdmin with their urls
100
+
101
+ Format of custom_urls item:
102
+ ("path_to_view", "name_of_view", view_itself)
103
+ """
104
+ return () if self.custom_urls is None else self.custom_urls
105
+
106
+ def get_urls(self) -> list[URLPattern]:
107
+ urls = super().get_urls()
108
+
109
+ def wrap(view):
110
+ def wrapper(*args, **kwargs):
111
+ return self.admin_site.admin_view(view)(*args, **kwargs)
112
+
113
+ wrapper.model_admin = self
114
+ return update_wrapper(wrapper, view)
115
+
116
+ custom_urls = [
117
+ self._path_from_custom_url(custom_url)
118
+ for custom_url in self.get_custom_urls()
119
+ ]
120
+
121
+ actions_list_urls = [
122
+ path(
123
+ action.path,
124
+ wrap(action.method),
125
+ name=action.action_name,
126
+ )
127
+ for action in self._get_base_actions_list()
128
+ ]
129
+
130
+ action_detail_urls = [
131
+ path(
132
+ f"<path:object_id>/{action.path}",
133
+ wrap(action.method),
134
+ name=action.action_name,
135
+ )
136
+ for action in self._get_base_actions_detail()
137
+ ]
138
+
139
+ action_row_urls = [
140
+ path(
141
+ f"<path:object_id>/{action.path}",
142
+ wrap(action.method),
143
+ name=action.action_name,
144
+ )
145
+ for action in self._get_base_actions_row()
146
+ ]
147
+
148
+ return (
149
+ custom_urls
150
+ + action_row_urls
151
+ + actions_list_urls
152
+ + action_detail_urls
153
+ + urls
154
+ )
155
+
156
+ def _path_from_custom_url(self, custom_url) -> URLPattern:
157
+ return path(
158
+ custom_url[0],
159
+ self.admin_site.admin_view(custom_url[2]),
160
+ {"model_admin": self},
161
+ name=custom_url[1],
162
+ )
163
+
164
+ def get_action_choices(
165
+ self, request: HttpRequest, default_choices=BLANK_CHOICE_DASH
166
+ ):
167
+ default_choices = [("", _("Select action"))]
168
+ return super().get_action_choices(request, default_choices)
169
+
170
+ @display(description=mark_safe(checkbox.render("action_toggle_all", 1)))
171
+ def action_checkbox(self, obj: Model):
172
+ return checkbox.render(helpers.ACTION_CHECKBOX_NAME, str(obj.pk))
173
+
174
+ def response_change(self, request: HttpRequest, obj: Model) -> HttpResponse:
175
+ res = super().response_change(request, obj)
176
+ if "next" in request.GET:
177
+ return redirect(request.GET["next"])
178
+ return res
179
+
180
+ def response_add(
181
+ self, request: HttpRequest, obj: Model, post_url_continue: Optional[str] = None
182
+ ) -> HttpResponse:
183
+ res = super().response_add(request, obj, post_url_continue)
184
+ if "next" in request.GET:
185
+ return redirect(request.GET["next"])
186
+ return res
187
+
188
+ def get_changelist(self, request, **kwargs):
189
+ return ChangeList
190
+
191
+ def get_formset_kwargs(
192
+ self, request: HttpRequest, obj: Model, inline: InlineModelAdmin, prefix: str
193
+ ) -> dict[str, Any]:
194
+ formset_kwargs = super().get_formset_kwargs(request, obj, inline, prefix)
195
+
196
+ if hasattr(inline, "per_page"):
197
+ formset_kwargs["request"] = request
198
+ formset_kwargs["per_page"] = inline.per_page
199
+
200
+ return formset_kwargs
201
+
202
+
203
+ class BaseInlineMixin:
204
+ formfield_overrides = FORMFIELD_OVERRIDES_INLINE
205
+ readonly_preprocess_fields = {}
206
+ ordering_field = None
207
+ per_page = None
208
+ hide_ordering_field = False
209
+ collapsible = False
210
+
211
+
212
+ class TabularInline(BaseInlineMixin, BaseModelAdminMixin, BaseTabularInline):
213
+ formset = PaginationInlineFormSet
214
+
215
+
216
+ class StackedInline(BaseInlineMixin, BaseModelAdminMixin, BaseStackedInline):
217
+ formset = PaginationInlineFormSet
218
+
219
+
220
+ class GenericStackedInline(
221
+ BaseInlineMixin, BaseModelAdminMixin, BaseGenericStackedInline
222
+ ):
223
+ formset = PaginationGenericInlineFormSet
224
+
225
+
226
+ class GenericTabularInline(
227
+ BaseInlineMixin, BaseModelAdminMixin, BaseGenericTabularInline
228
+ ):
229
+ formset = PaginationGenericInlineFormSet
@@ -0,0 +1,20 @@
1
+ from django.apps import AppConfig
2
+ from django.contrib import admin
3
+ from django.contrib.admin import sites
4
+
5
+ from .sites import UnfoldAdminSite
6
+
7
+
8
+ class DefaultAppConfig(AppConfig):
9
+ name = "unfold"
10
+ default = True
11
+
12
+ def ready(self):
13
+ site = UnfoldAdminSite()
14
+
15
+ admin.site = site
16
+ sites.site = site
17
+
18
+
19
+ class BasicAppConfig(AppConfig):
20
+ name = "unfold"
@@ -0,0 +1,64 @@
1
+ from typing import Any
2
+
3
+ from django.contrib.admin.checks import ModelAdminChecks
4
+ from django.contrib.admin.options import BaseModelAdmin
5
+ from django.contrib.auth.models import Permission
6
+ from django.core import checks
7
+
8
+ from unfold.dataclasses import UnfoldAction
9
+
10
+
11
+ class UnfoldModelAdminChecks(ModelAdminChecks):
12
+ def check(self, admin_obj: BaseModelAdmin, **kwargs) -> list[checks.Error]:
13
+ return [
14
+ *super().check(admin_obj, **kwargs),
15
+ *self._check_unfold_action_permission_methods(admin_obj),
16
+ ]
17
+
18
+ def _check_unfold_action_permission_methods(self, obj: Any) -> list[checks.Error]:
19
+ """
20
+ Actions with an allowed_permission attribute require the ModelAdmin to
21
+ implement a has_<perm>_permission() method for each permission.
22
+ """
23
+ actions: list[UnfoldAction] = [
24
+ *obj._get_base_actions_list(),
25
+ *obj._get_base_actions_detail(),
26
+ *obj._get_base_actions_row(),
27
+ *obj._get_base_actions_submit_line(),
28
+ ]
29
+ errors = []
30
+ for action in actions:
31
+ if not hasattr(action.method, "allowed_permissions"):
32
+ continue
33
+
34
+ for permission in action.method.allowed_permissions:
35
+ # Check the existence of Django permission
36
+ if "." in permission:
37
+ app_label, codename = permission.split(".")
38
+
39
+ if not Permission.objects.filter(
40
+ content_type__app_label=app_label,
41
+ codename=codename,
42
+ ).exists():
43
+ errors.append(
44
+ checks.Error(
45
+ f"@action decorator on {action.method.original_function_name}() in class {obj.__class__.__name__} specifies permission {permission} which does not exists.",
46
+ obj=obj.__class__,
47
+ id="admin.E129",
48
+ )
49
+ )
50
+
51
+ continue
52
+
53
+ # Check the permission method existence
54
+ method_name = f"has_{permission}_permission"
55
+ if not hasattr(obj, method_name):
56
+ errors.append(
57
+ checks.Error(
58
+ f"{obj.__class__.__name__} must define a {method_name}() method for the {action.method.original_function_name}() action.",
59
+ obj=obj.__class__,
60
+ id="admin.E129",
61
+ )
62
+ )
63
+
64
+ return errors
@@ -0,0 +1,47 @@
1
+ from typing import Any, Optional
2
+
3
+ from django.http import HttpRequest
4
+
5
+
6
+ class ComponentRegistry:
7
+ _registry: dict[str, type] = {}
8
+
9
+ @classmethod
10
+ def register_class(cls, component_cls: type) -> None:
11
+ if not issubclass(component_cls, BaseComponent):
12
+ raise ValueError(
13
+ f"Class '{component_cls.__name__}' must inherit from BaseComponent."
14
+ )
15
+
16
+ class_name = component_cls.__name__
17
+
18
+ if class_name in cls._registry:
19
+ raise ValueError(f"Class '{class_name}' is already registered.")
20
+
21
+ cls._registry[class_name] = component_cls
22
+
23
+ @classmethod
24
+ def get_class(cls, class_name: str) -> Optional[type]:
25
+ return cls._registry.get(class_name)
26
+
27
+ @classmethod
28
+ def create_instance(cls, class_name: str, **kwargs: Any) -> Any:
29
+ component_cls = cls.get_class(class_name)
30
+
31
+ if component_cls is None:
32
+ raise ValueError(f"Class '{class_name}' is not registered.")
33
+
34
+ return component_cls(**kwargs)
35
+
36
+
37
+ def register_component(cls: type) -> type:
38
+ ComponentRegistry.register_class(cls)
39
+ return cls
40
+
41
+
42
+ class BaseComponent:
43
+ def __init__(self, request: HttpRequest):
44
+ self.request = request
45
+
46
+ def get_context_data(self, **kwargs):
47
+ return kwargs
File without changes
@@ -0,0 +1,6 @@
1
+ from django.apps import AppConfig
2
+
3
+
4
+ class ConstanceConfig(AppConfig):
5
+ name = "unfold.contrib.constance"
6
+ label = "unfold_constance"
@@ -0,0 +1,32 @@
1
+ UNFOLD_CONSTANCE_ADDITIONAL_FIELDS = {
2
+ str: [
3
+ "django.forms.CharField",
4
+ {
5
+ "widget": "unfold.widgets.UnfoldAdminTextInputWidget",
6
+ },
7
+ ],
8
+ int: [
9
+ "django.forms.IntegerField",
10
+ {
11
+ "widget": "unfold.widgets.UnfoldAdminIntegerFieldWidget",
12
+ },
13
+ ],
14
+ bool: [
15
+ "django.forms.BooleanField",
16
+ {
17
+ "widget": "unfold.widgets.UnfoldBooleanSwitchWidget",
18
+ },
19
+ ],
20
+ "file_field": [
21
+ "django.forms.fields.FileField",
22
+ {
23
+ "widget": "unfold.widgets.UnfoldAdminFileFieldWidget",
24
+ },
25
+ ],
26
+ "image_field": [
27
+ "django.forms.fields.ImageField",
28
+ {
29
+ "widget": "unfold.widgets.UnfoldAdminImageFieldWidget",
30
+ },
31
+ ],
32
+ }
@@ -0,0 +1,70 @@
1
+ {% extends "admin/base_site.html" %}
2
+
3
+ {% load admin_list static i18n %}
4
+
5
+ {% block extrahead %}
6
+ {% url 'admin:jsi18n' as jsi18nurl %}
7
+ <script type="text/javascript" src="{{ jsi18nurl|default:'../../jsi18n/' }}"></script>
8
+ {{ block.super }}
9
+ {{ media.js }}
10
+ <script type="text/javascript" src="{% static 'admin/js/constance.js' %}"></script>
11
+ {% endblock %}
12
+
13
+ {% block breadcrumbs %}
14
+ <div class="px-4">
15
+ <div class="container mb-6 mx-auto -my-3 lg:mb-12">
16
+ <ul class="flex flex-wrap">
17
+ {% url 'admin:index' as link %}
18
+ {% trans 'Home' as name %}
19
+ {% include 'unfold/helpers/breadcrumb_item.html' with link=link name=name %}
20
+
21
+ {% url 'admin:app_list' app_label=opts.app_label as link %}
22
+ {% include 'unfold/helpers/breadcrumb_item.html' with link=link name=opts.app_config.verbose_name %}
23
+
24
+ {% include 'unfold/helpers/breadcrumb_item.html' with link='' name=opts.verbose_name_plural|capfirst %}
25
+ </ul>
26
+ </div>
27
+ </div>
28
+ {% endblock %}
29
+
30
+
31
+ {% block content %}
32
+ <div id="content-main" class="constance">
33
+ <div id="changelist" class="flex flex-col gap-8 w-full">
34
+ <form id="changelist-form" action="" method="post" enctype="multipart/form-data" novalidate class="flex flex-col gap-8 w-full">
35
+ {% csrf_token %}
36
+
37
+ {% include "unfold/helpers/form_errors.html" with errors=form.non_field_errors %}
38
+
39
+ {% for field in form.hidden_fields %}
40
+ {{ field }}
41
+ {% endfor %}
42
+
43
+ {% if fieldsets %}
44
+ <div class="border border-base-200 rounded-default overflow-x-auto simplebar-horizontal-scrollbar-top dark:border-base-800" data-simplebar data-simplebar-auto-hide="false">
45
+ <table class="w-full border-collapse">
46
+ {% for fieldset in fieldsets %}
47
+ {% with config_values=fieldset.config_values %}
48
+ {% include "admin/constance/includes/results_list.html" %}
49
+ {% endwith %}
50
+ {% endfor %}
51
+
52
+ <tfoot>
53
+ <tr>
54
+ <td class="border-t border-base-200 px-3 py-2 dark:border-base-800" colspan="100%">
55
+ <div class="flex justify-end">
56
+ {% trans "Save" as title %}
57
+ {% include "unfold/helpers/submit.html" with title=title %}
58
+ </div>
59
+ </td>
60
+ </tr>
61
+ </tfoot>
62
+ </table>
63
+ </div>
64
+ {% else %}
65
+ {% include "admin/constance/includes/results_list.html" %}
66
+ {% endif %}
67
+ </form>
68
+ </div>
69
+ </div>
70
+ {% endblock %}
@@ -0,0 +1,71 @@
1
+ {% load admin_list static i18n %}
2
+
3
+ <tbody {% if fieldset.collapse %} x-data="{ rowsOpen: false }" {% endif %}>
4
+ <tr {% if fieldset.collapse %} x-on:click="rowsOpen = !rowsOpen" {% endif %} class="{% if fieldset.collapse %}cursor-pointer{% endif %}">
5
+ <th class="bg-base-50 border-t border-base-200 font-semibold px-3 py-2 text-left text-font-important-light dark:text-font-important-dark dark:border-base-800 dark:bg-white/[.04] {% if forloop.first %}border-t-0{% endif %}" colspan="100%">
6
+ {{ fieldset.title }}
7
+
8
+ {% if fieldset.collapse %}
9
+ <span class="material-symbols-outlined float-right select-none transition-all" title="{% trans "Collapse" %}" x-bind:class="rowsOpen ? 'rotate-180' : ''">
10
+ expand_more
11
+ </span>
12
+ {% endif %}
13
+ </th>
14
+ </tr>
15
+
16
+ <tr class="border-t border-base-200 dark:border-base-800 *:font-semibold *:px-3 *:py-2 *:text-left *:text-font-important-light dark:*:text-font-important-dark" {% if fieldset.collapse %}x-show="rowsOpen"{% endif %}>
17
+ <th>{% trans "Name" %}</th>
18
+ <th>{% trans "Value" %}</th>
19
+ <th>{% trans "Default" %}</th>
20
+ <th>{% trans "Code" %}</th>
21
+ <th>{% trans "Modified" %}</th>
22
+ <th></th>
23
+ </tr>
24
+
25
+ {% for item in config_values %}
26
+ <tr class="border-t border-base-200 h-[55px] *:px-3 *:py-2 *:align-middle dark:border-base-800" {% if fieldset.collapse %}x-show="rowsOpen"{% endif %}>
27
+ <th class="font-normal text-left">
28
+ {{ item.help_text|linebreaksbr }}
29
+ </th>
30
+
31
+ <td class="{% if item.form_field.errors %}group errors{% endif %}">
32
+ {{ item.form_field }}
33
+
34
+ {% include "unfold/helpers/form_errors.html" with errors=item.form_field.errors %}
35
+ </td>
36
+
37
+ <td>
38
+ {% if item.default %}
39
+ {% include "unfold/helpers/label.html" with text=item.default %}
40
+ {% else %}
41
+ -
42
+ {% endif %}
43
+ </td>
44
+
45
+ <td>
46
+ <a class="item-name item-anchor" href="#{{ item.name|slugify }}" tabindex="-1" id="{{ item.name|slugify }}" title="Link to this setting">
47
+ {% include "unfold/helpers/label.html" with text=item.name type="info" %}
48
+ </a>
49
+ </td>
50
+
51
+ <td>
52
+ {% include "unfold/helpers/boolean.html" with value=item.modified %}
53
+ </td>
54
+
55
+ <td class="w-px">
56
+ {% if not item.is_file %}
57
+ <a href="#"
58
+ tabindex="-1"
59
+ class="flex items-center gap-1 reset-link whitespace-nowrap"
60
+ data-default="{% spaceless %}{% if item.is_checkbox %}{% if item.raw_default %} true {% else %} false {% endif %}{% elif item.is_date %}{{ item.raw_default|date:"U" }}{% elif item.is_datetime %}{{ item.raw_default|date:"U" }}{% else %}{{ item.default }}{% endif %}{% endspaceless %}"
61
+ data-field-type="{% spaceless %}{% if item.is_checkbox %}checkbox{% elif item.is_datetime %}datetime{% elif item.is_date %}date{% endif %}{% endspaceless %}"
62
+ data-field-id="{{ item.form_field.auto_id }}">
63
+ <span class="material-symbols-outlined text-base-400 hover:text-base-700 dark:border-base-700 dark:text-base-500 dark:hover:text-base-200" title="{% trans "Reset to default" %}">
64
+ refresh
65
+ </span>
66
+ </a>
67
+ {% endif %}
68
+ </td>
69
+ </tr>
70
+ {% endfor %}
71
+ </tbody>
@@ -0,0 +1,60 @@
1
+ from unfold.contrib.filters.admin.autocomplete_filters import (
2
+ AutocompleteSelectFilter,
3
+ AutocompleteSelectMultipleFilter,
4
+ )
5
+ from unfold.contrib.filters.admin.choice_filters import (
6
+ AllValuesCheckboxFilter,
7
+ BooleanRadioFilter,
8
+ CheckboxFilter,
9
+ ChoicesCheckboxFilter,
10
+ ChoicesRadioFilter,
11
+ RadioFilter,
12
+ RelatedCheckboxFilter,
13
+ )
14
+ from unfold.contrib.filters.admin.datetime_filters import (
15
+ RangeDateFilter,
16
+ RangeDateTimeFilter,
17
+ )
18
+ from unfold.contrib.filters.admin.dropdown_filters import (
19
+ ChoicesDropdownFilter,
20
+ DropdownFilter,
21
+ MultipleChoicesDropdownFilter,
22
+ MultipleDropdownFilter,
23
+ MultipleRelatedDropdownFilter,
24
+ RelatedDropdownFilter,
25
+ )
26
+ from unfold.contrib.filters.admin.numeric_filters import (
27
+ RangeNumericFilter,
28
+ RangeNumericListFilter,
29
+ SingleNumericFilter,
30
+ SliderNumericFilter,
31
+ )
32
+ from unfold.contrib.filters.admin.text_filters import FieldTextFilter, TextFilter
33
+
34
+ __all__ = [
35
+ "AllValuesCheckboxFilter",
36
+ "BooleanRadioFilter",
37
+ "CheckboxFilter",
38
+ "ChoicesCheckboxFilter",
39
+ "ChoicesRadioFilter",
40
+ "MultipleRelatedCheckboxFilter",
41
+ "RadioFilter",
42
+ "ChoicesDropdownFilter",
43
+ "MultipleChoicesDropdownFilter",
44
+ "DropdownFilter",
45
+ "RelatedDropdownFilter",
46
+ "MultipleDropdownFilter",
47
+ "MultipleRelatedDropdownFilter",
48
+ "RelatedCheckboxFilter",
49
+ "FieldTextFilter",
50
+ "TextFilter",
51
+ "RangeDateFilter",
52
+ "RangeDateFilter",
53
+ "RangeDateTimeFilter",
54
+ "SingleNumericFilter",
55
+ "RangeNumericFilter",
56
+ "RangeNumericListFilter",
57
+ "SliderNumericFilter",
58
+ "AutocompleteSelectFilter",
59
+ "AutocompleteSelectMultipleFilter",
60
+ ]
@@ -0,0 +1,16 @@
1
+ from unfold.contrib.filters.admin.dropdown_filters import (
2
+ MultipleRelatedDropdownFilter,
3
+ RelatedDropdownFilter,
4
+ )
5
+ from unfold.contrib.filters.admin.mixins import AutocompleteMixin
6
+ from unfold.contrib.filters.forms import AutocompleteDropdownForm
7
+
8
+
9
+ class AutocompleteSelectFilter(AutocompleteMixin, RelatedDropdownFilter):
10
+ form_class = AutocompleteDropdownForm
11
+
12
+
13
+ class AutocompleteSelectMultipleFilter(
14
+ AutocompleteMixin, MultipleRelatedDropdownFilter
15
+ ):
16
+ form_class = AutocompleteDropdownForm