django-unfold 0.58.0__py3-none-any.whl → 0.60.0__py3-none-any.whl
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.
- {django_unfold-0.58.0.dist-info → django_unfold-0.60.0.dist-info}/METADATA +3 -2
- {django_unfold-0.58.0.dist-info → django_unfold-0.60.0.dist-info}/RECORD +60 -50
- unfold/admin.py +45 -13
- unfold/checks.py +24 -2
- unfold/contrib/filters/templates/unfold/filters/filters_numeric_slider.html +2 -2
- unfold/contrib/inlines/admin.py +11 -6
- unfold/contrib/inlines/forms.py +3 -1
- unfold/contrib/location_field/__init__.py +0 -0
- unfold/contrib/location_field/apps.py +6 -0
- unfold/contrib/location_field/templates/location_field/map_widget.html +5 -0
- unfold/decorators.py +27 -13
- unfold/fields.py +18 -20
- unfold/forms.py +99 -3
- unfold/layout.py +16 -0
- unfold/mixins/action_model_admin.py +22 -14
- unfold/mixins/base_model_admin.py +15 -1
- unfold/paginator.py +12 -1
- unfold/settings.py +8 -1
- unfold/sites.py +27 -29
- unfold/static/admin/js/admin/RelatedObjectLookups.js +9 -3
- unfold/static/unfold/css/styles.css +1 -1
- unfold/styles.css +12 -16
- unfold/templates/admin/app_list.html +4 -1
- unfold/templates/admin/base.html +1 -1
- unfold/templates/admin/change_form.html +2 -1
- unfold/templates/admin/edit_inline/stacked.html +12 -8
- unfold/templates/admin/edit_inline/tabular.html +2 -0
- unfold/templates/admin/includes/fieldset.html +9 -3
- unfold/templates/admin/login.html +45 -88
- unfold/templates/admin/pagination.html +1 -1
- unfold/templates/unfold/components/button.html +10 -1
- unfold/templates/unfold/helpers/account_links.html +14 -6
- unfold/templates/unfold/helpers/app_list.html +5 -2
- unfold/templates/unfold/helpers/app_list_default.html +2 -1
- unfold/templates/unfold/helpers/change_list_actions.html +2 -2
- unfold/templates/unfold/helpers/change_list_filter_actions.html +1 -1
- unfold/templates/unfold/helpers/edit_inline/tabular_heading.html +1 -1
- unfold/templates/unfold/helpers/empty_results.html +2 -2
- unfold/templates/unfold/helpers/field.html +5 -3
- unfold/templates/unfold/helpers/header.html +1 -1
- unfold/templates/unfold/helpers/language_form.html +10 -0
- unfold/templates/unfold/helpers/language_switch.html +17 -19
- unfold/templates/unfold/helpers/navigation.html +1 -1
- unfold/templates/unfold/helpers/pagination_infinite.html +3 -3
- unfold/templates/unfold/helpers/pagination_inline.html +28 -0
- unfold/templates/unfold/helpers/theme_switch.html +29 -27
- unfold/templates/unfold/helpers/unauthenticated_header.html +15 -0
- unfold/templates/unfold/helpers/unauthenticated_title.html +11 -0
- unfold/templates/unfold/helpers/userlinks.html +2 -6
- unfold/templates/unfold/helpers/welcomemsg.html +9 -7
- unfold/templates/unfold/layouts/unauthenticated.html +37 -0
- unfold/templates/unfold/widgets/select.html +1 -1
- unfold/templates/unfold/widgets/text.html +28 -0
- unfold/templates/unfold_crispy/layout/fieldset.html +3 -1
- unfold/templates/unfold_crispy/layout/fieldset_subheader.html +3 -0
- unfold/templatetags/unfold.py +37 -2
- unfold/utils.py +2 -2
- unfold/widgets.py +49 -3
- {django_unfold-0.58.0.dist-info → django_unfold-0.60.0.dist-info}/LICENSE.md +0 -0
- {django_unfold-0.58.0.dist-info → django_unfold-0.60.0.dist-info}/WHEEL +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.3
|
2
2
|
Name: django-unfold
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.60.0
|
4
4
|
Summary: Modern Django admin theme for seamless interface development
|
5
5
|
License: MIT
|
6
6
|
Keywords: django,admin,tailwind,theme
|
@@ -50,11 +50,11 @@ Unfold Studio is a theme customizer for Django admin that helps you create a bra
|
|
50
50
|
|
51
51
|
## Fresh Features & Enhancements
|
52
52
|
|
53
|
+
- **Paginated inlines:** Break down large record sets into pages within inlines for better admin performance
|
53
54
|
- **Conditional fields:** Show or hide fields dynamically based on the values of other fields in the form
|
54
55
|
- **Infinite paginator:** Efficiently handle large datasets with seamless pagination that reduces server load
|
55
56
|
- **Checkbox & radio filters:** Enhanced filter options with checkbox and radio interfaces for intuitive filtering
|
56
57
|
- **Site dropdown:** Configurable dropdown menu in the header area for managing custom navigation links
|
57
|
-
- **Dropdown actions:** Organize action items in customizable dropdown menus
|
58
58
|
|
59
59
|
## Core Features & Capabilities
|
60
60
|
|
@@ -74,6 +74,7 @@ Unfold Studio is a theme customizer for Django admin that helps you create a bra
|
|
74
74
|
- **Sortable inlines:** Allow sorting inlines by dragging and dropping
|
75
75
|
- **Environment label:** Distinguish between environments by displaying a label
|
76
76
|
- **Nonrelated inlines:** Display nonrelated models as inlines in the change form
|
77
|
+
- **Paginated inlines:** Break down large record sets into pages within inlines for better admin performance
|
77
78
|
- **Favicons:** Built-in support for configuring various site favicons
|
78
79
|
- **Themes:** Allow customization of color scheme, background color, border radius, and more
|
79
80
|
- **Font colors:** Adjust font colors for better readability
|
@@ -1,7 +1,7 @@
|
|
1
1
|
unfold/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
2
|
-
unfold/admin.py,sha256=
|
2
|
+
unfold/admin.py,sha256=GKntMIZnksjuAuHZQ9ppw6NlKPU_59V-EC-gEaZa61I,7451
|
3
3
|
unfold/apps.py,sha256=SlBXPYrUd2uXn67qFbRvbXSUk3XFWrF4-5WELgDCvho,381
|
4
|
-
unfold/checks.py,sha256=
|
4
|
+
unfold/checks.py,sha256=e5HEhbXRcu3FwZDT_d-IbimeVpjJ6jgCUPXWvsUjEw0,2601
|
5
5
|
unfold/components.py,sha256=vqkQzseYUvLXDohmTVAlbKopALjyX4WA9yglvdfhqu4,1283
|
6
6
|
unfold/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
7
7
|
unfold/contrib/filters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -28,7 +28,7 @@ unfold/contrib/filters/templates/unfold/filters/filters_datetime_range.html,sha2
|
|
28
28
|
unfold/contrib/filters/templates/unfold/filters/filters_field.html,sha256=UTlSZlpg-gAc_a-EJLLF0NI_ofuSHQ2kMMoAs99nL2E,164
|
29
29
|
unfold/contrib/filters/templates/unfold/filters/filters_numeric_range.html,sha256=TnklQxXhe17UaImoiHahhtN6d1xVdXt2dhIMQESJY68,661
|
30
30
|
unfold/contrib/filters/templates/unfold/filters/filters_numeric_single.html,sha256=uELVrDzFgmzGwkm37SpZeXXbfpijDnSBIJVtf6evWjM,598
|
31
|
-
unfold/contrib/filters/templates/unfold/filters/filters_numeric_slider.html,sha256=
|
31
|
+
unfold/contrib/filters/templates/unfold/filters/filters_numeric_slider.html,sha256=_yOzo0T0OcHFKAZFj6L3-4_Y9MlKg53yKMq7LizWFS0,1762
|
32
32
|
unfold/contrib/forms/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
33
33
|
unfold/contrib/forms/apps.py,sha256=Di0TMzVuRpVxLG-8Bjdq5ALCSf5r7u2xVhD0jU6H5Sc,132
|
34
34
|
unfold/contrib/forms/static/unfold/forms/css/trix/LICENSE,sha256=-g0UVDdcvHcBvBPZFsOuceYTuK5xgyFkHmeOCUCTk8Q,1053
|
@@ -67,10 +67,13 @@ unfold/contrib/import_export/templates/admin/import_export/import_preview.html,s
|
|
67
67
|
unfold/contrib/import_export/templates/admin/import_export/import_validation.html,sha256=K7j5OlWMQUTcSVulJtIraKfWIupSvmN4R5bZ2hH4tRA,5117
|
68
68
|
unfold/contrib/import_export/templates/admin/import_export/resource_fields_list.html,sha256=Bc6uD8aHA5YYbZgLAPpGUckFjnxn9uq19YuKKFxTj4Y,887
|
69
69
|
unfold/contrib/inlines/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
70
|
-
unfold/contrib/inlines/admin.py,sha256=
|
70
|
+
unfold/contrib/inlines/admin.py,sha256=__U86gR2OfdEiLPmOsKwTu7t8X2be8_jL-NL1SSNb3Q,6066
|
71
71
|
unfold/contrib/inlines/apps.py,sha256=Z9JBnzywq-DanZbD56fG0ndBfLXbojzkjVBleqoOBSU,136
|
72
72
|
unfold/contrib/inlines/checks.py,sha256=0vkHUh-MtNSTrcOjCLbZmtI4961fFOygOv_dBAps6zw,534
|
73
|
-
unfold/contrib/inlines/forms.py,sha256=
|
73
|
+
unfold/contrib/inlines/forms.py,sha256=noZdrBgvsu9tCBbRW3f9p7o6xKSuXtWR14qbZPdZBPA,1395
|
74
|
+
unfold/contrib/location_field/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
75
|
+
unfold/contrib/location_field/apps.py,sha256=qbNLfWXWf9q_gZxnuwFNVj20liSk_OT29uWMAi1she8,150
|
76
|
+
unfold/contrib/location_field/templates/location_field/map_widget.html,sha256=HXNqZ7TRh8zxq7jxGv5V5De7jdB_L6smXSWX_KXujJs,179
|
74
77
|
unfold/contrib/simple_history/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
75
78
|
unfold/contrib/simple_history/apps.py,sha256=eF_KVYb60CAnGgWk2Z1YKYGfgA3TJBMr229qI7e2pgU,153
|
76
79
|
unfold/contrib/simple_history/templates/simple_history/object_history.html,sha256=unZQE70be7cK6v0YPlITFeaosmiLt3kiei-pmmCjBg0,1711
|
@@ -78,25 +81,25 @@ unfold/contrib/simple_history/templates/simple_history/object_history_form.html,
|
|
78
81
|
unfold/contrib/simple_history/templates/simple_history/object_history_list.html,sha256=PWtjuAcxciAI001qIrXLvbUxzCFl_SDAaHA5FhR16Z8,6858
|
79
82
|
unfold/contrib/simple_history/templates/simple_history/submit_line.html,sha256=tJgOgq7lMetWF4DJoBqUYdRSY6EeRivXhOBYlyPXzTk,1750
|
80
83
|
unfold/dataclasses.py,sha256=a-9INnkCAIcnMgoffTcB1rxWCJH33AjhMCWIGWnjWbI,719
|
81
|
-
unfold/decorators.py,sha256=
|
84
|
+
unfold/decorators.py,sha256=jPiYFy1p0WGFn68VZhAZkYCPDF7argb9SDFaH6aemHk,4922
|
82
85
|
unfold/enums.py,sha256=9sTfyEycMWeoGPBa-ft6ZhQGnW1vkFg108RMBVf9nko,187
|
83
86
|
unfold/exceptions.py,sha256=gcCj1ox61E137bk_0Cqy4YC3SttdPgB-fiJUqpmyHSE,43
|
84
|
-
unfold/fields.py,sha256=
|
85
|
-
unfold/forms.py,sha256=
|
86
|
-
unfold/layout.py,sha256=
|
87
|
+
unfold/fields.py,sha256=h7mpRlsoFu6xQrCbehrjsBpyxFsXc-lMDzEI1JREoJk,7304
|
88
|
+
unfold/forms.py,sha256=N2VN_rhy-U0XXae1TWIZam-fJimR8YXJGm-pt_G2zp4,7747
|
89
|
+
unfold/layout.py,sha256=Q-dFTA6UlvvPCA4PsGyTkHQmBLO7PL56xBfZi-bdt0c,1459
|
87
90
|
unfold/mixins/__init__.py,sha256=YlhoDs9Y_DXQ8Ejr3enxuHMS1-Ij9fwukxNwpeOS4Co,190
|
88
|
-
unfold/mixins/action_model_admin.py,sha256=
|
89
|
-
unfold/mixins/base_model_admin.py,sha256=
|
91
|
+
unfold/mixins/action_model_admin.py,sha256=9Zt4FLrQWEQSO2vrpwjzpFo_I3_yE000uEwHndsW5kg,12365
|
92
|
+
unfold/mixins/base_model_admin.py,sha256=dGxyd2ATcfMdzUlBuNOr059kbuFVLWXL8_VpHV8nV84,4611
|
90
93
|
unfold/overrides.py,sha256=ERVY9boZiXgjDYcTEZcIp7KWoeBZ45VM_zN31yAOjyQ,2922
|
91
|
-
unfold/paginator.py,sha256=
|
94
|
+
unfold/paginator.py,sha256=bZiEY-1kqZy_6CYGs9fHo6WntMgpnFCH-LJPoXkEESk,533
|
92
95
|
unfold/sections.py,sha256=Lcg3xCZ76fqjm4vD4x7YdE5VsbTKluL-sX5QTEBlHxA,2379
|
93
|
-
unfold/settings.py,sha256=
|
94
|
-
unfold/sites.py,sha256=
|
95
|
-
unfold/static/admin/js/admin/RelatedObjectLookups.js,sha256=
|
96
|
+
unfold/settings.py,sha256=DE3hComMaWtty8o-LqdgGGcoku3mevRWJah4NH1k5B4,2879
|
97
|
+
unfold/sites.py,sha256=QY6PVMAM6CPxFytcoJP3lj40WaorSJSjSHAoHnQbg-k,17291
|
98
|
+
unfold/static/admin/js/admin/RelatedObjectLookups.js,sha256=ubKKhWmX_QborwPnaLHuQshTwQw6tK1pAViWdKIjw4E,9222
|
96
99
|
unfold/static/admin/js/inlines.js,sha256=zcYwLGI_6RHg-gucDbbhp43RRoZd3so8bPk841KFaIE,15573
|
97
100
|
unfold/static/unfold/css/simplebar/LICENSE,sha256=okNJf6UFl2NrEiC4iqORNBa16IKgUgV88acdcl9FbtY,1081
|
98
101
|
unfold/static/unfold/css/simplebar/simplebar.css,sha256=5LLaEM11pKi6JFCOLt4XKuZxTpT9rpdq_tNlaQytFlU,4647
|
99
|
-
unfold/static/unfold/css/styles.css,sha256=
|
102
|
+
unfold/static/unfold/css/styles.css,sha256=LqAcA9FY50-oBxSdJIf0jAWaIPW70Z4qsMgGhredRB0,158705
|
100
103
|
unfold/static/unfold/fonts/inter/Inter-Bold.woff2,sha256=-oiBJ7baAVtlVp8DUfO1w5GtkokElR8cIOn4RiqNleo,114840
|
101
104
|
unfold/static/unfold/fonts/inter/Inter-Medium.woff2,sha256=D_PpRhThST61VjFP0keubEqFp3g7TMhr5TmUDPg_Kkg,114348
|
102
105
|
unfold/static/unfold/fonts/inter/Inter-Regular.woff2,sha256=4G9rG8VTqupORmgCPtCrChRxKcMQf1Ebx9A9NhsK4IU,111268
|
@@ -120,15 +123,15 @@ unfold/static/unfold/js/htmx/htmx.js,sha256=acrv0NqSJpBm5yXX_hdeJrnVDJYuMFZFnAxH
|
|
120
123
|
unfold/static/unfold/js/select2.init.js,sha256=l0O8ggw_CkAw-QtH3qEzC8xWk0mR9QHjy4VzAjMwiQQ,1109
|
121
124
|
unfold/static/unfold/js/simplebar/LICENSE,sha256=okNJf6UFl2NrEiC4iqORNBa16IKgUgV88acdcl9FbtY,1081
|
122
125
|
unfold/static/unfold/js/simplebar/simplebar.js,sha256=t-uG1FAD6ZoiMeN--wac0XRS7SxoDVG6zvRnGuEp7X8,27176
|
123
|
-
unfold/styles.css,sha256=
|
126
|
+
unfold/styles.css,sha256=nHXgzszvYC6doRZQf3UlZTVcyPsNgb5rSibZVqAxmd4,21208
|
124
127
|
unfold/templates/admin/actions.html,sha256=iuuubcAILkOoYBgV6cpXqFIyZUh4zMqyFp0JaDFlPKU,3096
|
125
128
|
unfold/templates/admin/app_index.html,sha256=LRR07CLcZVsYpisCOncWdMSACARNstcDt536Oydnt60,1239
|
126
|
-
unfold/templates/admin/app_list.html,sha256
|
129
|
+
unfold/templates/admin/app_list.html,sha256=-DEZKFdmkdTq3rix_cgZurPZ1r8PHg5pBL3i7ZtzVdI,2972
|
127
130
|
unfold/templates/admin/auth/user/add_form.html,sha256=tZgg6UoKxJ7zL6T99PLHlLBwd4LlDI2mGn6d5hmtsPs,486
|
128
131
|
unfold/templates/admin/auth/user/change_password.html,sha256=028v1dfQTlSmdr-WCuV4lBOmFa7Oo38CsYhsXEe8ANI,2831
|
129
|
-
unfold/templates/admin/base.html,sha256=
|
132
|
+
unfold/templates/admin/base.html,sha256=z9sU8rezHLqOZk5x13_5nvnqpRYf6XxQaMfa7N_GU68,2460
|
130
133
|
unfold/templates/admin/base_site.html,sha256=UOsecaCycpyn_ygJNIKO7MQtDFJuHv--r83-mzaVY30,300
|
131
|
-
unfold/templates/admin/change_form.html,sha256=
|
134
|
+
unfold/templates/admin/change_form.html,sha256=stW5bIL_HuxtD9Bb0RVLHZiP8ln8lGBQ3D3V6MeJbAY,5616
|
132
135
|
unfold/templates/admin/change_form_object_tools.html,sha256=eyeH-i2HgEM0Yi-OJA2D1VnKJyC19A_my1IDGxxoP8Y,593
|
133
136
|
unfold/templates/admin/change_list.html,sha256=49PwsDjJuTDXfoCqpUqAFc84HFNOJk8dIHSdYCQIDuk,5269
|
134
137
|
unfold/templates/admin/change_list_object_tools.html,sha256=cmMiT2nT20Ph5yfpj9aHPr76Z-JP4aSXp0o-Rnad28s,147
|
@@ -136,23 +139,23 @@ unfold/templates/admin/change_list_results.html,sha256=u9eUoOTWJ9woVeLVYhftAriCX
|
|
136
139
|
unfold/templates/admin/date_hierarchy.html,sha256=A-sIqBKzZTMqSn3NSHORIL1yTEAqhj4Atff0OvWtqT0,1413
|
137
140
|
unfold/templates/admin/delete_confirmation.html,sha256=IPSGhOpxDl6hJB9LtpSg_XRkVmbDO1BpO9q_dthqkac,4635
|
138
141
|
unfold/templates/admin/delete_selected_confirmation.html,sha256=T3NNe7pP0WM2QM4F39AbkDGsfd_d_tKYRpwxvExahgU,4399
|
139
|
-
unfold/templates/admin/edit_inline/stacked.html,sha256=
|
140
|
-
unfold/templates/admin/edit_inline/tabular.html,sha256=
|
142
|
+
unfold/templates/admin/edit_inline/stacked.html,sha256=MNIFkU5YI2Olwu4jNlQ-qnPTiNms4MM2j9UlYFdU108,8232
|
143
|
+
unfold/templates/admin/edit_inline/tabular.html,sha256=v-4YjGqHLMT40tv_aMua5lK5z6T19bejFvETdMK5u94,3011
|
141
144
|
unfold/templates/admin/filter.html,sha256=DEyrLgCWuncS1O1WR0vlt1evGQFvKoZV2pABkHzSoGU,2039
|
142
|
-
unfold/templates/admin/includes/fieldset.html,sha256=
|
145
|
+
unfold/templates/admin/includes/fieldset.html,sha256=QjEx8UBivPdibePGkg30xGYUS6Smcu2wIeDTHsaM0PM,1132
|
143
146
|
unfold/templates/admin/includes/object_delete_summary.html,sha256=FgwfapZCKWtnFtTHqh1MRuxxLot4bAw92WCcR_V8ImI,444
|
144
147
|
unfold/templates/admin/index.html,sha256=9ey6IIXxBVTEkVSDiQw01AwvMbUnG_h0B08N1Zg3wTg,578
|
145
|
-
unfold/templates/admin/login.html,sha256=
|
148
|
+
unfold/templates/admin/login.html,sha256=W07Dtr3-YQ-JP1jYKZMsBxrmO1u49A5R4UZyOUmZYfY,2465
|
146
149
|
unfold/templates/admin/nav_sidebar.html,sha256=xvCaXOamXawmf80NhE0OwjjjuNwoyoePS--lsdqDeIE,772
|
147
150
|
unfold/templates/admin/object_history.html,sha256=t-iJFQnpstowwsabGGA-FQjmcT1KIKhKLKbQ3iVELkk,4832
|
148
|
-
unfold/templates/admin/pagination.html,sha256
|
151
|
+
unfold/templates/admin/pagination.html,sha256=-9kjc_lKEeqvDVHMrnTfnlXDxMSkM8GNRGZGuI9D8os,912
|
149
152
|
unfold/templates/admin/search_form.html,sha256=ebd6ccOASaIUQsOZ0mVkcoB-EiKLqkN7y7cEm3fwsL8,1360
|
150
153
|
unfold/templates/admin/submit_line.html,sha256=GvknbdmXXEw93BIQ8azUHhnQ1AcojExgGiSr0XaNg2A,4658
|
151
154
|
unfold/templates/auth/widgets/read_only_password_hash.html,sha256=MlaNXJ2PLEbv8Nd01BBp-AQEfMB13LNxD_DzRemXhCg,775
|
152
155
|
unfold/templates/registration/logged_out.html,sha256=oIdaqGcvIdBih3yNnUkXSEpvofRsBJ77obldnhcnP2U,997
|
153
156
|
unfold/templates/registration/password_change_done.html,sha256=ITV6Fug4S6YG3WG-O1cm-sDAXTHEXPcNZ_w2x1IQFu8,1006
|
154
157
|
unfold/templates/registration/password_change_form.html,sha256=-8AauxUHWHXVaokG269UsETY_FHKqU83Zx38ZzrAA1A,2159
|
155
|
-
unfold/templates/unfold/components/button.html,sha256=
|
158
|
+
unfold/templates/unfold/components/button.html,sha256=RlNNIa_JmcsNFH151ECHkbB2TxpgeCPRh-eW1Bc0Xtk,933
|
156
159
|
unfold/templates/unfold/components/card.html,sha256=N9ld_SWpXdmaqAea9bboy0bTg1YqIkAhsJmOj7nd0qs,1353
|
157
160
|
unfold/templates/unfold/components/chart/bar.html,sha256=nDdDCUXvFd793OpNgNPQo0vBmvYngMsQyPHVTf1vfOw,297
|
158
161
|
unfold/templates/unfold/components/chart/cohort.html,sha256=L00WR-igYv0C3t2yT_nZqeI-M5gVHpoaGv5RooRojqU,2402
|
@@ -167,17 +170,17 @@ unfold/templates/unfold/components/table.html,sha256=VVMTrrDy_Oq09MG9aNAsnMZfXSp
|
|
167
170
|
unfold/templates/unfold/components/text.html,sha256=-GjxvdiaBQIaNfPSzT6SSIwnc3R27FkSDQMoF3FDPso,102
|
168
171
|
unfold/templates/unfold/components/title.html,sha256=aMYSO30ybFYqPnqwlJVh2uNmcgnVrRycZkHTjJTjpX8,171
|
169
172
|
unfold/templates/unfold/components/tracker.html,sha256=krlvsb06lpfdOIANsyrBOoLq1sgv6rXUGr-7MmP5Le0,292
|
170
|
-
unfold/templates/unfold/helpers/account_links.html,sha256=
|
173
|
+
unfold/templates/unfold/helpers/account_links.html,sha256=Tq30bAkOU8QRR6CaB1CvTfTgkoPP5dz2v0OHYq0pRSE,2348
|
171
174
|
unfold/templates/unfold/helpers/actions_row.html,sha256=RqhZsxgIFR-r1casv5CueL81uxNl8rA3XuCMDP--zLA,2586
|
172
175
|
unfold/templates/unfold/helpers/add_link.html,sha256=Z0TzUavXH8AQ7A-I0SQ79t-UI87dyP_PZEpsDrm13Q8,810
|
173
|
-
unfold/templates/unfold/helpers/app_list.html,sha256=
|
174
|
-
unfold/templates/unfold/helpers/app_list_default.html,sha256=
|
176
|
+
unfold/templates/unfold/helpers/app_list.html,sha256=baydU9R_xmH9pWgs8B7PUcwTWcLxHDhD1ehs75c5PD0,5879
|
177
|
+
unfold/templates/unfold/helpers/app_list_default.html,sha256=0TR2ZTy0KUqa6YR8IgihA_4RQqBIFOroYpRHHIyD4H8,4015
|
175
178
|
unfold/templates/unfold/helpers/attrs.html,sha256=Mwpj72kuwYj8hOT3J2T8qx6f1r_4xwwaS1slHA-82jI,166
|
176
179
|
unfold/templates/unfold/helpers/boolean.html,sha256=kcSZr3siQeBWIy_jsx1tFf4m6IB3ooRnu8UUNQrh6so,569
|
177
180
|
unfold/templates/unfold/helpers/breadcrumb_item.html,sha256=9T6ojN7LOXIlgwSwlIwHgy5U22eQYtarCqcmzsQIoPU,201
|
178
|
-
unfold/templates/unfold/helpers/change_list_actions.html,sha256=
|
181
|
+
unfold/templates/unfold/helpers/change_list_actions.html,sha256=xuFMZel6kH014H9sl0hKvQo7LP0UxwlhFQHIUeyQxVM,643
|
179
182
|
unfold/templates/unfold/helpers/change_list_filter.html,sha256=WwU-AG4U5qZQ_sFs1z_jaaYBWqIv3ASmtKIQIhAp2gs,1908
|
180
|
-
unfold/templates/unfold/helpers/change_list_filter_actions.html,sha256=
|
183
|
+
unfold/templates/unfold/helpers/change_list_filter_actions.html,sha256=K99hHgpCLaAHxv-eqIf4nOUfq6CeTQHekEeudKTRYME,2036
|
181
184
|
unfold/templates/unfold/helpers/delete_submit_line.html,sha256=7SNS0axGytvUih9KxtOzy9ZC5rwG9u99iQxlnUZQfdE,700
|
182
185
|
unfold/templates/unfold/helpers/display_dropdown.html,sha256=IpOy8-hww4arAVjPIRsHrip30J3IEd2p-2BzD3BjIaA,2906
|
183
186
|
unfold/templates/unfold/helpers/display_header.html,sha256=2u-5Vc3mA6rS3ZlOWm3WRNLUX1wmZy4OSmGY2mdPZYs,1714
|
@@ -185,11 +188,11 @@ unfold/templates/unfold/helpers/display_label.html,sha256=LS9DWzYjHkYLV27sZDwyXl
|
|
185
188
|
unfold/templates/unfold/helpers/edit_inline/tabular_delete.html,sha256=wr8zmSUhKcoxxms6gJsBqBrANFTOXELYUvlr3XjnjnE,931
|
186
189
|
unfold/templates/unfold/helpers/edit_inline/tabular_error.html,sha256=8XGlgUJ47JllmXhwPZDlcl81NzZmvuBIp8FZBWoeu9Q,336
|
187
190
|
unfold/templates/unfold/helpers/edit_inline/tabular_field.html,sha256=QETtgDYirbFBMCRH0sRU8IkODS0fBouA6crZ_K4ufTA,1007
|
188
|
-
unfold/templates/unfold/helpers/edit_inline/tabular_heading.html,sha256=
|
191
|
+
unfold/templates/unfold/helpers/edit_inline/tabular_heading.html,sha256=wvnpGFJVHFvamGLpRCpGoP7WALFKqR1KKvVIIRhWFQc,1520
|
189
192
|
unfold/templates/unfold/helpers/edit_inline/tabular_row.html,sha256=eCyWEYvvDDCr9SR4_0ua5-GqCLIlFzgQYIZP0ip8cp8,2145
|
190
193
|
unfold/templates/unfold/helpers/edit_inline/tabular_title.html,sha256=2sk1TRzpmwy8PPPMNdf6CJx0zVSk-I2q3yX8uEPjuxE,2710
|
191
|
-
unfold/templates/unfold/helpers/empty_results.html,sha256=
|
192
|
-
unfold/templates/unfold/helpers/field.html,sha256=
|
194
|
+
unfold/templates/unfold/helpers/empty_results.html,sha256=zN1XM6_9_Oj-inMZlDxEnicYfBRr4HhwS9ODAnMiRYc,1947
|
195
|
+
unfold/templates/unfold/helpers/field.html,sha256=KEs1SQRxzJ0x11zithlxVyv5zfQ9a_XGoJJ9AiWk1Vc,1038
|
193
196
|
unfold/templates/unfold/helpers/field_readonly.html,sha256=4qtXjWE7SA2qZSTYLOv0lT4pQfD0TE34mvWQJY7jhS8,237
|
194
197
|
unfold/templates/unfold/helpers/field_readonly_value.html,sha256=FI_CFEsCN7ELQux9gF-IaZ7nT7jyzidqwR2Med-E52g,504
|
195
198
|
unfold/templates/unfold/helpers/fieldset_row.html,sha256=LriorPLXU4VmqstjX1oBc3T49H8CbhCrRxwQ7YfUSkI,1219
|
@@ -198,12 +201,13 @@ unfold/templates/unfold/helpers/fieldset_row_field.html,sha256=cqLT1fHsCCszOHxvY
|
|
198
201
|
unfold/templates/unfold/helpers/fieldsets_tabs.html,sha256=NRmkr_vWnEyIFZ1xLpJf_VW1H3xcDlIhMFBuElp3dIo,1468
|
199
202
|
unfold/templates/unfold/helpers/form_errors.html,sha256=mrv2_J7RPcLfVtoN1UHh3rfUyOSZpHl67wk1UGqtPcY,266
|
200
203
|
unfold/templates/unfold/helpers/form_label.html,sha256=7FfaXfviQmqKpsA1E7NSwM8rJiMNLl9e73XQram0Pfs,249
|
201
|
-
unfold/templates/unfold/helpers/header.html,sha256=
|
204
|
+
unfold/templates/unfold/helpers/header.html,sha256=cHAPz7niLLQDQbrZpURZS1hiA8OYLzkGaqnYzjgv8aE,1151
|
202
205
|
unfold/templates/unfold/helpers/header_back_button.html,sha256=lNZcYZzQRZdNSI70UrxJ-pq7xnxifziZXtSK1FoPy_U,416
|
203
206
|
unfold/templates/unfold/helpers/help_text.html,sha256=o-2_hyruIr_Xt0fo38aGgrpptPJFhddnVMPOVQOYhE4,113
|
204
207
|
unfold/templates/unfold/helpers/history.html,sha256=qxfCZxFIyl91qDpxfwozhmyVFZwULysA8Y_2H8XJ7bM,1937
|
205
208
|
unfold/templates/unfold/helpers/label.html,sha256=DRs0B08SmIvNY0QcFy78xDiI0hAKyfjExu-cm33PAaQ,911
|
206
|
-
unfold/templates/unfold/helpers/
|
209
|
+
unfold/templates/unfold/helpers/language_form.html,sha256=Ve1qfIcL4DV6cxYfhqGkC_KghDjNyEB8j3hYts1S34M,708
|
210
|
+
unfold/templates/unfold/helpers/language_switch.html,sha256=vZiYutLOWChHUQRw1OaHIYVhfzl84-BfZq14FUCKvuo,1225
|
207
211
|
unfold/templates/unfold/helpers/messages/debug.html,sha256=OIWKZp04zxWPmVaKZaEtzrikZq1kVruncYRKiKrHWds,153
|
208
212
|
unfold/templates/unfold/helpers/messages/error.html,sha256=16-4bslrpgXR1fTk8bmRUItIbnQcU5XjDgI1xesoKcc,600
|
209
213
|
unfold/templates/unfold/helpers/messages/errornote.html,sha256=3RVj4BIdft3yEUOdzmli0QPQ_l9hUAOTpHIfL4ZOpMg,356
|
@@ -211,13 +215,14 @@ unfold/templates/unfold/helpers/messages/info.html,sha256=4SCFtg3p6F33ZHJhYoIm2V
|
|
211
215
|
unfold/templates/unfold/helpers/messages/success.html,sha256=UWHpRJTvVhXiYC9-AvJ9HeEZJj-poejFgy7EgLvwpf8,157
|
212
216
|
unfold/templates/unfold/helpers/messages/warning.html,sha256=UldycPr8wdyp5vdjlkfs_yHCEvNg9PgspyzTALAjdDY,161
|
213
217
|
unfold/templates/unfold/helpers/messages.html,sha256=ISkUlIDraDAVBwASkX1tFXHo8TY1vHKmmhh8BAg123E,915
|
214
|
-
unfold/templates/unfold/helpers/navigation.html,sha256=
|
218
|
+
unfold/templates/unfold/helpers/navigation.html,sha256=U9cMmw3ETMI88zqHvSf5VQkMehcU6YfLKTcH1CmS4fY,554
|
215
219
|
unfold/templates/unfold/helpers/navigation_header.html,sha256=08_LTuJF6MrG0hK6lUI9daCP5kQr5Q7FwY7Pl4kFxJQ,1474
|
216
220
|
unfold/templates/unfold/helpers/pagination.html,sha256=N5TQDlj5kgJLj02oRiaX8W62jQtZVNoWfI2hXdpuY1g,439
|
217
221
|
unfold/templates/unfold/helpers/pagination_current_item.html,sha256=4cZ2KLVcP0Y7xuGyXgexDQ07r94cgM5Gnmtv11dkRPQ,69
|
218
222
|
unfold/templates/unfold/helpers/pagination_default.html,sha256=pseTrqaG5EOn_IpCy0GXNht3ickSkZYJ4lJaocZeI6A,496
|
219
223
|
unfold/templates/unfold/helpers/pagination_ellipsis.html,sha256=8g0KUUKtqRkXx_EBLGtsJsiYQO4tPS3GazZjxT90e0M,56
|
220
|
-
unfold/templates/unfold/helpers/pagination_infinite.html,sha256
|
224
|
+
unfold/templates/unfold/helpers/pagination_infinite.html,sha256=QyHcYb36CeuiwpukC0Y553UC4LU2tPolGos-0mh7WP0,557
|
225
|
+
unfold/templates/unfold/helpers/pagination_inline.html,sha256=wFuXDvW1p-9OF1FSlOERkhP1Jt1WLzNfN7UkqsHtOQ4,1414
|
221
226
|
unfold/templates/unfold/helpers/search.html,sha256=Pu2hxLGkN_NA-BU8_t4E7Q6uaY6hYTLoD8NZHyrcCaQ,1549
|
222
227
|
unfold/templates/unfold/helpers/search_results.html,sha256=pQx7KoDMapWDusV88qe5hxlxicfP-S9iacji1Hq41Kc,661
|
223
228
|
unfold/templates/unfold/helpers/site_branding.html,sha256=_pUyOvdjlV624eRq0wjpJkgXpn9DCDGc-0U6Mw0FupI,266
|
@@ -229,12 +234,15 @@ unfold/templates/unfold/helpers/tab_action.html,sha256=cy4JxV-wfXv9tNOTgsWXuj1bc
|
|
229
234
|
unfold/templates/unfold/helpers/tab_actions.html,sha256=Ir0HFxNAdZWdE6GuxaanSScNYONft0lNB1sZZcKMS5Q,685
|
230
235
|
unfold/templates/unfold/helpers/tab_items.html,sha256=5kZcU7R9tZKKxVLahp2siZpZf7FhrluBH1dIAIaWoAg,3377
|
231
236
|
unfold/templates/unfold/helpers/tab_list.html,sha256=mprad7Fu5ms1qGqjDl9HMmtfUodk43smd3IjagYOyr0,452
|
232
|
-
unfold/templates/unfold/helpers/theme_switch.html,sha256=
|
233
|
-
unfold/templates/unfold/helpers/
|
234
|
-
unfold/templates/unfold/helpers/
|
237
|
+
unfold/templates/unfold/helpers/theme_switch.html,sha256=Y46KKpULH_G-fKQuc5LzfSB7Pubcgj_dBJPRMwZoWxE,2408
|
238
|
+
unfold/templates/unfold/helpers/unauthenticated_header.html,sha256=DNfZt_JDnMFwwo_SG0iYEB3I7eQIbwaB4QcpJGs1dtk,535
|
239
|
+
unfold/templates/unfold/helpers/unauthenticated_title.html,sha256=2aGnsdZbDV6yno9pb4sqEi15J7M9iLiMz3FY9F0Sgq4,387
|
240
|
+
unfold/templates/unfold/helpers/userlinks.html,sha256=bJRDQXQ_0XgxLpfmZoNgU9xpn4X6T6LOAgEmzepFXOI,740
|
241
|
+
unfold/templates/unfold/helpers/welcomemsg.html,sha256=Z3dDvozCJ5VhSVA_1go0F4ZD0lQYhCmoWqd_RM00pec,2019
|
235
242
|
unfold/templates/unfold/layouts/base.html,sha256=e9T-vuPvrySHf23LLwRuTQXUg0Q4x-6gmT_yXghqc-I,278
|
236
243
|
unfold/templates/unfold/layouts/base_simple.html,sha256=qUZ9YM24UHgWbmTl61zgN4_ty49P1FZJQ2siNbwnFnQ,1244
|
237
244
|
unfold/templates/unfold/layouts/skeleton.html,sha256=2AWjJx6TxpYbXldwrXRbtyp9XTpAu6O0U_zcJtfYfWs,4684
|
245
|
+
unfold/templates/unfold/layouts/unauthenticated.html,sha256=Rh84psp8Ek-i1hVIiYz-HX7lyiQL7FnqA_uAp-D69DI,1022
|
238
246
|
unfold/templates/unfold/templatetags/preserve_changelist_filters.html,sha256=sx2jUhogNY4emBhY8PqxQ6mXifbXQb_IQI9Hd0boJI0,111
|
239
247
|
unfold/templates/unfold/widgets/clearable_file_input.html,sha256=8dXZnc6z2D2K08hqHsQwR5UJffcIRnmYBT02zmCOr9A,2191
|
240
248
|
unfold/templates/unfold/widgets/clearable_file_input_small.html,sha256=zhnaDz72mJgMrq-nCPCMuR5tEJaFVfJyOJUAzR6tQWc,2624
|
@@ -244,10 +252,11 @@ unfold/templates/unfold/widgets/radio.html,sha256=7Mgc92mMwJdVLjCxoGj5lo76KNaN5d
|
|
244
252
|
unfold/templates/unfold/widgets/radio_option.html,sha256=wVg6zIB0O44vwBgQCCphPuCXeh-gaDg6ed-0gcf5kg4,324
|
245
253
|
unfold/templates/unfold/widgets/range.html,sha256=Zhfj2VTusS3nZjOYR7slcjk1JtFK0psZbaSCw6TDY1I,294
|
246
254
|
unfold/templates/unfold/widgets/related_widget_wrapper.html,sha256=8poy8kZRGPqmY4gSXkEZt7vevBomrKoe2Lg5zsjpwiU,3919
|
247
|
-
unfold/templates/unfold/widgets/select.html,sha256=
|
255
|
+
unfold/templates/unfold/widgets/select.html,sha256=MyhlEO4sf7AUjOgH84rL76rhYM0WEn4qRqzuzPmgu5M,715
|
248
256
|
unfold/templates/unfold/widgets/split_datetime.html,sha256=Hfv2PoHxPmV_21DmBFmMcR4WVP9vTV9SrfjVdliRci8,1074
|
249
257
|
unfold/templates/unfold/widgets/split_datetime_vertical.html,sha256=39lZsRyRcKr8DIcy9oL39zC8nAHZTHwW6gyTYOKePrQ,806
|
250
258
|
unfold/templates/unfold/widgets/split_money.html,sha256=AFLUBmzGbY-RXgsfz7gaDxVRhplaIPhXjg_hWYo9xcY,352
|
259
|
+
unfold/templates/unfold/widgets/text.html,sha256=jR_nrBN5A-evlX8aHpJplB_CG4aJblaVLMdp8z4-dG8,949
|
251
260
|
unfold/templates/unfold/widgets/textarea.html,sha256=-ZLDGrtASero7L-J3VvTNq_KjPAZh_kLVw0Ow3awqXM,144
|
252
261
|
unfold/templates/unfold/widgets/time.html,sha256=ih9wj8koTaHb9s1NGUmyN9rHvSAmqCMbti9ONDOIujg,122
|
253
262
|
unfold/templates/unfold/widgets/url.html,sha256=IRLgW44VTKN7UrSWeywJwaxQhfG5jhhXuT-KTadKX58,304
|
@@ -264,7 +273,8 @@ unfold/templates/unfold_crispy/layout/checkbox.html,sha256=V1YGDcYfn4spUHx6M5ux8
|
|
264
273
|
unfold/templates/unfold_crispy/layout/column.html,sha256=Bob4xRcbJOHScDjSjLMRIMNf4lonNmm8F_JOm2azTik,172
|
265
274
|
unfold/templates/unfold_crispy/layout/div.html,sha256=RE9qQ2w2I2zpi7Z7xzVmVO03UXq0yZvMw-W7rVJkEdw,174
|
266
275
|
unfold/templates/unfold_crispy/layout/field_errors.html,sha256=N0eNJo4OvYzFHPD6vX2gSZWabm46W1GP011sd_dua1I,291
|
267
|
-
unfold/templates/unfold_crispy/layout/fieldset.html,sha256=
|
276
|
+
unfold/templates/unfold_crispy/layout/fieldset.html,sha256=hbbJVTNUOwFoBtpFMpqGaf-I4cXnQZEG5s91EUxBUzY,654
|
277
|
+
unfold/templates/unfold_crispy/layout/fieldset_subheader.html,sha256=fAD3wa9JiuYJwbo8bsmW-LhMw72V2j27EkRgy0G6Kc8,209
|
268
278
|
unfold/templates/unfold_crispy/layout/help_text.html,sha256=FY0UQv5FsoOFhrqvbILEfZE78Hj30r73YHCtg_MWNeY,207
|
269
279
|
unfold/templates/unfold_crispy/layout/help_text_and_errors.html,sha256=Um14wIg0FHthNM0mKE9VdptTrC-lTTcrDUO-UbbXxhY,108
|
270
280
|
unfold/templates/unfold_crispy/layout/hr.html,sha256=_u0V0lIdK3PLREGspx3zywhUQHcFeY7BuMUbaLyN1WU,321
|
@@ -275,13 +285,13 @@ unfold/templates/unfold_crispy/uni_form.html,sha256=l9UNCUrIycgJ0p_B6qhtO_YxdARy
|
|
275
285
|
unfold/templates/unfold_crispy/whole_uni_form.html,sha256=ufXRKCIGqkqKFOsh166rpKUnHpFMyBV4eYUCRhs3iws,475
|
276
286
|
unfold/templates/unfold_crispy/whole_uni_formset.html,sha256=CYksfG2hRUdi5n691KW2ih-FfBxpOU4qVBfbOvcu1zs,873
|
277
287
|
unfold/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
278
|
-
unfold/templatetags/unfold.py,sha256=
|
288
|
+
unfold/templatetags/unfold.py,sha256=Z4VYkTigW2DEURcyq8E7d8EkvCWl_TG_mNDmveE5K6k,18141
|
279
289
|
unfold/templatetags/unfold_list.py,sha256=ayShOYEXcV3o7wKt3t2aFTWvg62Mb-WGlxjYVGgk3a0,14344
|
280
290
|
unfold/typing.py,sha256=i7LM2LiwYTAjT5-OLDUPVn5b9X-DMmHnjlZG2toWwSE,692
|
281
|
-
unfold/utils.py,sha256=
|
291
|
+
unfold/utils.py,sha256=lXKkvhaTxoTtd4p3bB0wHIZD26md6XzBcDkPL5bJGH8,6191
|
282
292
|
unfold/views.py,sha256=FuYnMrlg6SegLUDDN6An__yZj8rchD_iBK8myieYhkA,1492
|
283
|
-
unfold/widgets.py,sha256=
|
284
|
-
django_unfold-0.
|
285
|
-
django_unfold-0.
|
286
|
-
django_unfold-0.
|
287
|
-
django_unfold-0.
|
293
|
+
unfold/widgets.py,sha256=kBQ94omaglt0csjNbX4VFWL1rjb0vBFZeC2X6HOvHuY,24484
|
294
|
+
django_unfold-0.60.0.dist-info/LICENSE.md,sha256=Ltk_quRyyvV3J5v3brtOqmibeZSw2Hrb8bY1W3ya0Ik,1077
|
295
|
+
django_unfold-0.60.0.dist-info/METADATA,sha256=WUTbBoxXiw3YcvlNnKH5WzMcS0SFxpus6JweY1mUfPQ,8092
|
296
|
+
django_unfold-0.60.0.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
|
297
|
+
django_unfold-0.60.0.dist-info/RECORD,,
|
unfold/admin.py
CHANGED
@@ -1,11 +1,18 @@
|
|
1
1
|
from functools import update_wrapper
|
2
|
-
from typing import Optional
|
2
|
+
from typing import Any, Optional
|
3
3
|
|
4
4
|
from django import forms
|
5
5
|
from django.contrib.admin import ModelAdmin as BaseModelAdmin
|
6
6
|
from django.contrib.admin import StackedInline as BaseStackedInline
|
7
7
|
from django.contrib.admin import TabularInline as BaseTabularInline
|
8
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
|
+
)
|
9
16
|
from django.db.models import BLANK_CHOICE_DASH, Model
|
10
17
|
from django.http import HttpRequest, HttpResponse
|
11
18
|
from django.shortcuts import redirect
|
@@ -16,8 +23,11 @@ from django.utils.translation import gettext_lazy as _
|
|
16
23
|
from django.views import View
|
17
24
|
|
18
25
|
from unfold.checks import UnfoldModelAdminChecks
|
19
|
-
from unfold.
|
20
|
-
|
26
|
+
from unfold.forms import (
|
27
|
+
ActionForm,
|
28
|
+
PaginationGenericInlineFormSet,
|
29
|
+
PaginationInlineFormSet,
|
30
|
+
)
|
21
31
|
from unfold.mixins import ActionModelAdminMixin, BaseModelAdminMixin
|
22
32
|
from unfold.overrides import FORMFIELD_OVERRIDES_INLINE
|
23
33
|
from unfold.typing import FieldsetsType
|
@@ -32,10 +42,6 @@ checkbox = UnfoldBooleanWidget(
|
|
32
42
|
lambda value: False,
|
33
43
|
)
|
34
44
|
|
35
|
-
helpers.AdminField = UnfoldAdminField
|
36
|
-
|
37
|
-
helpers.AdminReadonlyField = UnfoldAdminReadonlyField
|
38
|
-
|
39
45
|
|
40
46
|
class ModelAdmin(BaseModelAdminMixin, ActionModelAdminMixin, BaseModelAdmin):
|
41
47
|
action_form = ActionForm
|
@@ -182,16 +188,42 @@ class ModelAdmin(BaseModelAdminMixin, ActionModelAdminMixin, BaseModelAdmin):
|
|
182
188
|
def get_changelist(self, request, **kwargs):
|
183
189
|
return ChangeList
|
184
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
|
+
formset_kwargs["request"] = request
|
185
196
|
|
186
|
-
|
187
|
-
|
188
|
-
readonly_preprocess_fields = {}
|
189
|
-
ordering_field = None
|
190
|
-
hide_ordering_field = False
|
197
|
+
if hasattr(inline, "per_page"):
|
198
|
+
formset_kwargs["per_page"] = inline.per_page
|
191
199
|
|
200
|
+
return formset_kwargs
|
192
201
|
|
193
|
-
|
202
|
+
|
203
|
+
class BaseInlineMixin:
|
194
204
|
formfield_overrides = FORMFIELD_OVERRIDES_INLINE
|
195
205
|
readonly_preprocess_fields = {}
|
196
206
|
ordering_field = None
|
207
|
+
per_page = None
|
197
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
|
unfold/checks.py
CHANGED
@@ -2,9 +2,10 @@ from typing import Any
|
|
2
2
|
|
3
3
|
from django.contrib.admin.checks import ModelAdminChecks
|
4
4
|
from django.contrib.admin.options import BaseModelAdmin
|
5
|
+
from django.contrib.auth.models import Permission
|
5
6
|
from django.core import checks
|
6
7
|
|
7
|
-
from .dataclasses import UnfoldAction
|
8
|
+
from unfold.dataclasses import UnfoldAction
|
8
9
|
|
9
10
|
|
10
11
|
class UnfoldModelAdminChecks(ModelAdminChecks):
|
@@ -29,14 +30,35 @@ class UnfoldModelAdminChecks(ModelAdminChecks):
|
|
29
30
|
for action in actions:
|
30
31
|
if not hasattr(action.method, "allowed_permissions"):
|
31
32
|
continue
|
33
|
+
|
32
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
|
33
54
|
method_name = f"has_{permission}_permission"
|
34
55
|
if not hasattr(obj, method_name):
|
35
56
|
errors.append(
|
36
57
|
checks.Error(
|
37
|
-
f"{obj.__class__.__name__} must define a {method_name}() method for the {action.method.
|
58
|
+
f"{obj.__class__.__name__} must define a {method_name}() method for the {action.method.original_function_name}() action.",
|
38
59
|
obj=obj.__class__,
|
39
60
|
id="admin.E129",
|
40
61
|
)
|
41
62
|
)
|
63
|
+
|
42
64
|
return errors
|
@@ -9,11 +9,11 @@
|
|
9
9
|
|
10
10
|
{% if choice.min is not None and choice.max is not None and choice.step %}
|
11
11
|
<div class="admin-numeric-filter-slider-tooltips">
|
12
|
-
<span class="admin-numeric-filter-slider-tooltip-from border cursor-not-allowed flex grow flex-row items-center mr-auto rounded-default shadow-xs px-3 py-2 w-full dark:bg-base-900 dark:border-base-700 dark:text-font-default-dark">
|
12
|
+
<span class="admin-numeric-filter-slider-tooltip-from border border-base-200 cursor-not-allowed flex grow flex-row items-center mr-auto rounded-default shadow-xs px-3 py-2 w-full dark:bg-base-900 dark:border-base-700 dark:text-font-default-dark">
|
13
13
|
{{ choice.value_from }}
|
14
14
|
</span>
|
15
15
|
|
16
|
-
<span class="admin-numeric-filter-slider-tooltip-to border cursor-not-allowed flex grow flex-row items-center rounded-default shadow-xs px-3 py-2 w-full dark:bg-base-900 dark:border-base-700 dark:text-font-default-dark">
|
16
|
+
<span class="admin-numeric-filter-slider-tooltip-to border border-base-200 cursor-not-allowed flex grow flex-row items-center rounded-default shadow-xs px-3 py-2 w-full dark:bg-base-900 dark:border-base-700 dark:text-font-default-dark">
|
17
17
|
{{ choice.value_to }}
|
18
18
|
</span>
|
19
19
|
</div>
|
unfold/contrib/inlines/admin.py
CHANGED
@@ -12,10 +12,15 @@ from django.http import HttpRequest
|
|
12
12
|
from django.utils.text import get_text_list
|
13
13
|
from django.utils.translation import gettext_lazy as _
|
14
14
|
|
15
|
-
from unfold.admin import
|
16
|
-
|
17
|
-
|
18
|
-
|
15
|
+
from unfold.admin import (
|
16
|
+
StackedInline,
|
17
|
+
TabularInline,
|
18
|
+
)
|
19
|
+
from unfold.contrib.inlines.checks import NonrelatedModelAdminChecks
|
20
|
+
from unfold.contrib.inlines.forms import (
|
21
|
+
NonrelatedInlineModelFormSet,
|
22
|
+
nonrelated_inline_formset_factory,
|
23
|
+
)
|
19
24
|
|
20
25
|
|
21
26
|
class NonrelatedInlineMixin:
|
@@ -135,8 +140,8 @@ class NonrelatedInlineMixin:
|
|
135
140
|
|
136
141
|
|
137
142
|
class NonrelatedStackedInline(NonrelatedInlineMixin, StackedInline):
|
138
|
-
|
143
|
+
formset = NonrelatedInlineModelFormSet
|
139
144
|
|
140
145
|
|
141
146
|
class NonrelatedTabularInline(NonrelatedInlineMixin, TabularInline):
|
142
|
-
|
147
|
+
formset = NonrelatedInlineModelFormSet
|
unfold/contrib/inlines/forms.py
CHANGED
@@ -3,8 +3,10 @@ from typing import Any, Callable, Optional
|
|
3
3
|
from django.db.models import Model, QuerySet
|
4
4
|
from django.forms import BaseModelFormSet, ModelForm, modelformset_factory
|
5
5
|
|
6
|
+
from unfold.forms import PaginationFormSetMixin
|
6
7
|
|
7
|
-
|
8
|
+
|
9
|
+
class NonrelatedInlineModelFormSet(PaginationFormSetMixin, BaseModelFormSet):
|
8
10
|
def __init__(
|
9
11
|
self,
|
10
12
|
instance: Optional[Model] = None,
|
File without changes
|
unfold/decorators.py
CHANGED
@@ -29,13 +29,19 @@ def action(
|
|
29
29
|
**kwargs,
|
30
30
|
) -> Optional[HttpResponse]:
|
31
31
|
if permissions:
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
32
|
+
permission_rules = []
|
33
|
+
|
34
|
+
for permission in permissions:
|
35
|
+
if "." in permission:
|
36
|
+
permission_rules.append(permission)
|
37
|
+
else:
|
38
|
+
# Permissions methods have following syntax: has_<some>_permission(self, request, obj=None):
|
39
|
+
# But obj is not examined by default in django admin and it would also require additional
|
40
|
+
# fetch from database, therefore it is not supported yet
|
41
|
+
permission_rules.append(
|
42
|
+
getattr(model_admin, f"has_{permission}_permission")
|
43
|
+
)
|
44
|
+
|
39
45
|
has_detail_action = func.__name__ in model_admin._extract_action_names(
|
40
46
|
model_admin.actions_detail
|
41
47
|
)
|
@@ -46,12 +52,19 @@ def action(
|
|
46
52
|
)
|
47
53
|
)
|
48
54
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
+
permission_checks = []
|
56
|
+
|
57
|
+
for permission_rule in permission_rules:
|
58
|
+
if isinstance(permission_rule, str) and "." in permission_rule:
|
59
|
+
permission_checks.append(request.user.has_perm(permission_rule))
|
60
|
+
elif has_detail_action or has_submit_line_action:
|
61
|
+
permission_checks.append(
|
62
|
+
permission_rule(request, kwargs.get("object_id"))
|
63
|
+
)
|
64
|
+
else:
|
65
|
+
permission_checks.append(permission_rule(request))
|
66
|
+
|
67
|
+
if not all(permission_checks):
|
55
68
|
raise PermissionDenied
|
56
69
|
return func(model_admin, request, *args, **kwargs)
|
57
70
|
|
@@ -73,6 +86,7 @@ def action(
|
|
73
86
|
inner.variant = ActionVariant.DEFAULT
|
74
87
|
|
75
88
|
inner.attrs = attrs or {}
|
89
|
+
inner.original_function_name = func.__name__
|
76
90
|
return inner
|
77
91
|
|
78
92
|
if function is None:
|