django-unfold 0.30.0__py3-none-any.whl → 0.31.0__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. {django_unfold-0.30.0.dist-info → django_unfold-0.31.0.dist-info}/METADATA +59 -18
  2. {django_unfold-0.30.0.dist-info → django_unfold-0.31.0.dist-info}/RECORD +72 -71
  3. unfold/admin.py +30 -11
  4. unfold/contrib/filters/templates/unfold/filters/filters_numeric_slider.html +3 -3
  5. unfold/contrib/forms/templates/unfold/forms/array.html +3 -1
  6. unfold/contrib/forms/templates/unfold/forms/helpers/toolbar.html +6 -6
  7. unfold/contrib/forms/templates/unfold/forms/wysiwyg.html +1 -1
  8. unfold/contrib/forms/widgets.py +22 -11
  9. unfold/contrib/guardian/templates/unfold/guardian/group_form.html +4 -4
  10. unfold/contrib/guardian/templates/unfold/guardian/user_form.html +4 -4
  11. unfold/contrib/import_export/templates/admin/import_export/change_form.html +1 -1
  12. unfold/contrib/import_export/templates/admin/import_export/import_errors.html +1 -1
  13. unfold/contrib/import_export/templates/admin/import_export/import_preview.html +3 -3
  14. unfold/contrib/import_export/templates/admin/import_export/import_validation.html +4 -4
  15. unfold/contrib/inlines/forms.py +1 -2
  16. unfold/contrib/simple_history/templates/simple_history/object_history_list.html +9 -9
  17. unfold/contrib/simple_history/templates/simple_history/submit_line.html +1 -1
  18. unfold/dataclasses.py +10 -1
  19. unfold/fields.py +1 -1
  20. unfold/settings.py +1 -0
  21. unfold/sites.py +39 -15
  22. unfold/static/unfold/css/styles.css +1 -1
  23. unfold/static/unfold/js/alpine.anchor.js +1 -0
  24. unfold/static/unfold/js/alpine.js +2 -2
  25. unfold/static/unfold/js/alpine.persist.js +1 -1
  26. unfold/static/unfold/js/app.js +26 -3
  27. unfold/styles.css +10 -10
  28. unfold/templates/admin/actions.html +1 -1
  29. unfold/templates/admin/app_list.html +1 -1
  30. unfold/templates/admin/base.html +4 -4
  31. unfold/templates/admin/change_list.html +2 -2
  32. unfold/templates/admin/change_list_results.html +2 -2
  33. unfold/templates/admin/delete_confirmation.html +4 -4
  34. unfold/templates/admin/delete_selected_confirmation.html +4 -4
  35. unfold/templates/admin/edit_inline/stacked.html +2 -2
  36. unfold/templates/admin/edit_inline/tabular.html +3 -3
  37. unfold/templates/admin/filter.html +2 -2
  38. unfold/templates/admin/includes/fieldset.html +1 -1
  39. unfold/templates/admin/includes/object_delete_summary.html +1 -1
  40. unfold/templates/admin/login.html +8 -8
  41. unfold/templates/admin/object_history.html +4 -4
  42. unfold/templates/admin/search_form.html +1 -1
  43. unfold/templates/admin/submit_line.html +7 -5
  44. unfold/templates/auth/widgets/read_only_password_hash.html +1 -1
  45. unfold/templates/registration/logged_out.html +1 -1
  46. unfold/templates/unfold/change_list_filter.html +9 -1
  47. unfold/templates/unfold/helpers/account_links.html +2 -2
  48. unfold/templates/unfold/helpers/actions_row.html +4 -4
  49. unfold/templates/unfold/helpers/app_list.html +48 -38
  50. unfold/templates/unfold/helpers/app_list_default.html +4 -4
  51. unfold/templates/unfold/helpers/breadcrumb_item.html +1 -1
  52. unfold/templates/unfold/helpers/field_readonly_value.html +1 -1
  53. unfold/templates/unfold/helpers/fieldset_row.html +6 -6
  54. unfold/templates/unfold/helpers/fieldsets_tabs.html +2 -2
  55. unfold/templates/unfold/helpers/header.html +1 -1
  56. unfold/templates/unfold/helpers/help_text.html +1 -1
  57. unfold/templates/unfold/helpers/history.html +1 -1
  58. unfold/templates/unfold/helpers/label.html +1 -1
  59. unfold/templates/unfold/helpers/search.html +7 -4
  60. unfold/templates/unfold/helpers/search_results.html +2 -2
  61. unfold/templates/unfold/helpers/tab_action.html +1 -1
  62. unfold/templates/unfold/helpers/tab_list.html +27 -5
  63. unfold/templates/unfold/helpers/theme_switch.html +2 -2
  64. unfold/templates/unfold/layouts/skeleton.html +6 -1
  65. unfold/templates/unfold/widgets/clearable_file_input.html +14 -6
  66. unfold/templates/unfold/widgets/clearable_file_input_small.html +4 -4
  67. unfold/templates/unfold/widgets/split_datetime.html +2 -2
  68. unfold/templatetags/unfold.py +33 -12
  69. unfold/templatetags/unfold_list.py +16 -6
  70. unfold/widgets.py +2 -2
  71. {django_unfold-0.30.0.dist-info → django_unfold-0.31.0.dist-info}/LICENSE.md +0 -0
  72. {django_unfold-0.30.0.dist-info → django_unfold-0.31.0.dist-info}/WHEEL +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: django-unfold
3
- Version: 0.30.0
3
+ Version: 0.31.0
4
4
  Summary: Modern Django admin theme for seamless interface development
5
5
  Home-page: https://unfoldadmin.com
6
6
  License: MIT
@@ -33,7 +33,7 @@ Description-Content-Type: text/markdown
33
33
  ![Code Style - Ruff](https://img.shields.io/badge/code%20style-ruff-30173D.svg?style=for-the-badge)
34
34
  ![Pre Commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white&style=for-the-badge)
35
35
 
36
- Unfold is theme for Django admin incorporating most common practises for building full-fledged admin areas. It is designed to work at the top of default administration provided by Django.
36
+ Unfold is a theme for Django admin incorporating most common practices for building full-fledged admin areas. It is designed to work on top of default administration provided by Django.
37
37
 
38
38
  - **Unfold:** demo site is available at [unfoldadmin.com](https://unfoldadmin.com?utm_medium=github&utm_source=unfold)
39
39
  - **Formula:** repository with demo implementation at [github.com/unfoldadmin/formula](https://github.com/unfoldadmin/formula)
@@ -45,7 +45,7 @@ Did you decide to start using Unfold but you don't have time to make the switch
45
45
 
46
46
  ## Features <!-- omit from toc -->
47
47
 
48
- - **Visual**: provides new user interface based on Tailwind CSS framework
48
+ - **Visual**: provides a new user interface based on Tailwind CSS framework
49
49
  - **Sidebar:** simplifies definition of custom sidebar navigation with icons
50
50
  - **Dark mode:** supports both light and dark mode versions
51
51
  - **Configuration:** most of the basic options can be changed in settings.py
@@ -55,14 +55,16 @@ Did you decide to start using Unfold but you don't have time to make the switch
55
55
  - **Array widget:** built-in widget for `django.contrib.postgres.fields.ArrayField`
56
56
  - **Filters:** custom dropdown, numeric, datetime, and text fields
57
57
  - **Dashboard:** custom components for rapid dashboard development
58
+ - **Inline tabs:** group inlines into tab navigation in the change form
58
59
  - **Model tabs:** define custom tab navigations for models
59
- - **Fieldset tabs:** merge several fielsets into tabs in change form
60
- - **Colors:** possibility to override default color scheme
61
- - **Changeform modes:** display fields in changeform in compressed mode
60
+ - **Fieldset tabs:** merge several fieldsets into tabs in the change form
61
+ - **Colors:** possibility to override the default color scheme
62
+ - **Changeform modes:** display fields in the change form in compressed mode
62
63
  - **Third party packages:** default support for multiple popular applications
63
64
  - **Environment label**: distinguish between environments by displaying a label
64
65
  - **Nonrelated inlines**: displays nonrelated model as inline in changeform
65
66
  - **Parallel admin**: support for default admin in parallel with Unfold. [Admin migration guide](https://unfoldadmin.com/blog/migrating-django-admin-unfold/?utm_medium=github&utm_source=unfold)
67
+ - **Favicons**: built-in support for configuring various site favicons
66
68
  - **VS Code**: project configuration and development container is included
67
69
 
68
70
  ## Table of contents <!-- omit from toc -->
@@ -111,7 +113,7 @@ Did you decide to start using Unfold but you don't have time to make the switch
111
113
 
112
114
  ## Installation
113
115
 
114
- The installation process is minimal. Everything what is needed after installation is to put new application at the beginning of **INSTALLED_APPS**. Default admin configuration in urls.py can stay as it is and there are no changes required.
116
+ The installation process is minimal. Everything that is needed after installation is to put new application at the beginning of **INSTALLED_APPS**. The default admin configuration in urls.py can stay as it is, and no changes are required.
115
117
 
116
118
  ```python
117
119
  # settings.py
@@ -170,17 +172,24 @@ class CustomAdminClass(ModelAdmin):
170
172
 
171
173
  from django.contrib import admin
172
174
  from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
175
+ from django.contrib.auth.admin import GroupAdmin as BaseGroupAdmin
173
176
  from django.contrib.auth.models import User
174
177
 
175
178
  from unfold.admin import ModelAdmin
176
179
 
177
180
 
178
181
  admin.site.unregister(User)
182
+ admin.site.unregister(Group)
179
183
 
180
184
 
181
185
  @admin.register(User)
182
186
  class UserAdmin(BaseUserAdmin, ModelAdmin):
183
187
  pass
188
+
189
+
190
+ @admin.register(Group)
191
+ class GroupAdmin(BaseGroupAdmin, ModelAdmin):
192
+ pass
184
193
  ```
185
194
 
186
195
  ## Configuration
@@ -209,6 +218,14 @@ UNFOLD = {
209
218
  "dark": lambda request: static("logo-dark.svg"), # dark mode
210
219
  },
211
220
  "SITE_SYMBOL": "speed", # symbol from icon set
221
+ "SITE_FAVICONS": [
222
+ {
223
+ "rel": "icon",
224
+ "sizes": "32x32",
225
+ "type": "image/svg+xml",
226
+ "href": lambda request: static("favicon.svg"),
227
+ },
228
+ ],
212
229
  "SHOW_HISTORY": True, # show/hide "History" button, default: True
213
230
  "SHOW_VIEW_ON_SITE": True, # show/hide "View on site" button, default: True
214
231
  "ENVIRONMENT": "sample_app.environment_callback",
@@ -255,6 +272,7 @@ UNFOLD = {
255
272
  {
256
273
  "title": _("Navigation"),
257
274
  "separator": True, # Top border
275
+ "collapsible": True, # Collapsible group of links
258
276
  "items": [
259
277
  {
260
278
  "title": _("Dashboard"),
@@ -345,6 +363,9 @@ class CustomAdminClass(ModelAdmin):
345
363
  # Display submit button in filters
346
364
  list_filter_submit = False
347
365
 
366
+ # Display changelist in fullwidth
367
+ list_fullwidth = False
368
+
348
369
  # Position horizontal scrollbar in changelist at the top
349
370
  list_horizontal_scrollbar_top = False
350
371
 
@@ -441,7 +462,7 @@ class UserAdmin(ModelAdmin):
441
462
  actions_detail = ["change_detail_action_block"]
442
463
  actions_submit_line = ["submit_line_action_activate"]
443
464
 
444
- @action(description=_("Save & Activate"))
465
+ @action(description=_("Save & Activate"), permissions=["submit_line_action_activate"])
445
466
  def submit_line_action_activate(self, request: HttpRequest, obj: User):
446
467
  """
447
468
  If instance is modified in any way, it also needs to be saved,
@@ -453,6 +474,9 @@ class UserAdmin(ModelAdmin):
453
474
  obj.is_active = True
454
475
  obj.save()
455
476
 
477
+ def has_submit_line_action_activate_permission(self, request: HttpRequest, object_id: Union[str, int]):
478
+ pass
479
+
456
480
  @action(description=_("Import"), url_path="import")
457
481
  def changelist_global_action_import(self, request: HttpRequest):
458
482
  """
@@ -477,7 +501,7 @@ class UserAdmin(ModelAdmin):
477
501
  """
478
502
  return redirect(f"https://example.com/{object_id}")
479
503
 
480
- @action(description=_("Detail"), url_path="detail-action", attrs={"target": "_blank"})
504
+ @action(description=_("Detail"), url_path="detail-action", attrs={"target": "_blank"}, permissions=["change_detail_action_block"])
481
505
  def change_detail_action_block(self, request: HttpRequest, object_id: int):
482
506
  """
483
507
  Handler for detail action.
@@ -492,6 +516,10 @@ class UserAdmin(ModelAdmin):
492
516
  return redirect(
493
517
  reverse_lazy("admin:users_user_change", args=(object_id,))
494
518
  )
519
+
520
+
521
+ def has_change_detail_action_block_permission(self, request: HttpRequest, object_id: Union[str, int]):
522
+ pass
495
523
  ```
496
524
 
497
525
  ### Action with form example
@@ -563,7 +591,7 @@ Text input field which allows filtering by the free string submitted by the user
563
591
 
564
592
  `FieldTextFilter` requires just a model field name and the filter will make `__icontains` search on this field. There are no other things to configure so the integration in `list_filter` will be just one new row looking like `("model_field_name", FieldTextFilter)`.
565
593
 
566
- In the case of the `TextFilter`, it is needed the write a whole new class inheriting from `TextFilter` with a custom implementation of the `queryset` method and the `parameter_name` attribute. This attribute will be a representation of the search query parameter name in URI. The benefit of the `TextFilter` is the possibility of writing complex queries.
594
+ In the case of the `TextFilter`, it is needed to write a whole new class inheriting from `TextFilter` with a custom implementation of the `queryset` method and the `parameter_name` attribute. This attribute will be a representation of the search query parameter name in URI. The benefit of the `TextFilter` is the possibility of writing complex queries.
567
595
 
568
596
  ```python
569
597
  from django.contrib import admin
@@ -598,7 +626,7 @@ class MyAdmin(ModelAdmin):
598
626
 
599
627
  Dropdown filters will display a select field with a list of options. Unfold contains two types of dropdowns: `ChoicesDropdownFilter` and `RelatedDropdownFilter`.
600
628
 
601
- The difference between them is that `ChoicesDropdownFilter` will collect a list of options based on the `choices` attribute of the model field so most commonly it will be used in combination with `CharField` with specified `choices`. On the other side, `RelatedDropdownFilter` needs a one-to-many or many-to-many foreign key to display options.
629
+ The difference between them is that `ChoicesDropdownFilter` will collect a list of options based on the `choices` attribute of the model field so most commonly it will be used in combination with `CharField` with specified `choices`. On the other hand, `RelatedDropdownFilter` needs a one-to-many or many-to-many foreign key to display options.
602
630
 
603
631
  **Note:** At the moment Unfold does not implement a dropdown with an autocomplete functionality, so it is important not to use dropdowns displaying large datasets.
604
632
 
@@ -907,6 +935,19 @@ class MyModelAdmin(ModelAdmin):
907
935
  )
908
936
  ```
909
937
 
938
+ Inlines can be grouped into tab navigation by specifying `tab` attribute in the inline class.
939
+
940
+ ```python
941
+ # admin.py
942
+
943
+ from unfold.admin import TabularInline
944
+
945
+
946
+ class MyInline(TabularInline):
947
+ model = User
948
+ tab = True
949
+ ```
950
+
910
951
  ## Third party packages
911
952
 
912
953
  ### django-celery-beat
@@ -976,11 +1017,11 @@ class ClockedScheduleAdmin(BaseClockedScheduleAdmin, ModelAdmin):
976
1017
 
977
1018
  ### django-guardian
978
1019
 
979
- Adding support for django-guardian is quote straightforward in Unfold, just add `unfold.contrib.guardian` to `INSTALLED_APPS` at the beggining of the file. This action will override all templates coming from the django-guardian. Please note that **Object permissions** link is available in top right dropdown navigation.
1020
+ Adding support for django-guardian is quite straightforward in Unfold, just add `unfold.contrib.guardian` to `INSTALLED_APPS` at the beginning of the file. This action will override all templates coming from the django-guardian. Please note that **Object permissions** link is available in top right dropdown navigation.
980
1021
 
981
1022
  ### django-import-export
982
1023
 
983
- 1. Add `unfold.contrib.import_export` to `INSTALLED_APPS` at the beggining of the file. This action will override all templates coming from the application.
1024
+ 1. Add `unfold.contrib.import_export` to `INSTALLED_APPS` at the beginning of the file. This action will override all templates coming from the application.
984
1025
  2. Change `import_form_class` and `export_form_class` in ModelAdmin which is inheriting from `ImportExportModelAdmin`. This chunk of code is responsible for adding proper styling to form elements.
985
1026
 
986
1027
  ```python
@@ -1052,7 +1093,7 @@ This application is supported in Unfold by default. It is not needed to add any
1052
1093
 
1053
1094
  ### django-simple-history
1054
1095
 
1055
- To make this application work, add `unfold.contrib.simple_history` into `settings.py` in `INSTALLED_APPS` variable before right after `unfold`. This app should ensure that templates coming from django-simple-history are overriden by Unfold.
1096
+ To make this application work, add `unfold.contrib.simple_history` into `settings.py` in `INSTALLED_APPS` variable before right after `unfold`. This app should ensure that templates coming from django-simple-history are overridden by Unfold.
1056
1097
 
1057
1098
  ## User Admin Form
1058
1099
 
@@ -1133,7 +1174,7 @@ npx tailwindcss -o your_project/static/css/styles.css --watch --minify
1133
1174
 
1134
1175
  ### Overriding template
1135
1176
 
1136
- Create `templates/admin/index.html` in your project and paste the base template below into it. By default, all your custom styles here are not compiled because CSS classes are located in your specific project. Here it is needed to set up the Tailwind for your project and all requried instructions are located in [Project Level Tailwind Stylesheet](#project-level-tailwind-stylesheet) chapter.
1177
+ Create `templates/admin/index.html` in your project and paste the base template below into it. By default, all your custom styles here are not compiled because CSS classes are located in your specific project. Here it is needed to set up the Tailwind for your project and all required instructions are located in [Project Level Tailwind Stylesheet](#project-level-tailwind-stylesheet) chapter.
1137
1178
 
1138
1179
  ```html+django
1139
1180
  {% extends 'unfold/layouts/base_simple.html' %}
@@ -1255,7 +1296,7 @@ Below you can find a more complex example which is using multiple components and
1255
1296
 
1256
1297
  ### Pre-commit
1257
1298
 
1258
- Before adding any source code, it is recommended to have pre-commit installed on your local computer to check for all potential issues when comitting the code.
1299
+ Before adding any source code, it is recommended to have pre-commit installed on your local computer to check for all potential issues when committing the code.
1259
1300
 
1260
1301
  ```bash
1261
1302
  pip install pre-commit
@@ -1275,7 +1316,7 @@ To add a new feature or fix the easiest approach is to use django-unfold in comb
1275
1316
 
1276
1317
  ### Compiling Tailwind
1277
1318
 
1278
- At the moment project contains package.json with all dependencies required to compile new CSS file. Tailwind configuration file is set to check all html, js and py files for Tailwind's classeses occurrences.
1319
+ At the moment project contains package.json with all dependencies required to compile new CSS file. Tailwind configuration file is set to check all html, js and py files for Tailwind's classes occurrences.
1279
1320
 
1280
1321
  ```bash
1281
1322
  npm install
@@ -1285,7 +1326,7 @@ npm run tailwind:watch # run after each change in code
1285
1326
  npm run tailwind:build # run once
1286
1327
  ```
1287
1328
 
1288
- Some components like datepickers, calendars or selectors in admin was not possible to style by overriding html templates so their default styles are overriden in **styles.css**.
1329
+ Some components like datepickers, calendars or selectors in admin was not possible to style by overriding html templates so their default styles are overridden in **styles.css**.
1289
1330
 
1290
1331
  **Note:** most of the custom styles located in style.css are created via `@apply some-tailwind-class;` as is not possible to manually add CSS class to element which are for example created via jQuery.
1291
1332
 
@@ -1,5 +1,5 @@
1
1
  unfold/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- unfold/admin.py,sha256=mKkWn3sjggvPoJor2K8xLjLq43tb5qAGBfeki5Lq4JY,19063
2
+ unfold/admin.py,sha256=pTftvCeukl-tsnOhQf8JJT59CcpTnpQafn7IkWqfW3U,19580
3
3
  unfold/apps.py,sha256=SlBXPYrUd2uXn67qFbRvbXSUk3XFWrF4-5WELgDCvho,381
4
4
  unfold/checks.py,sha256=Smgji9w19hnYjJElJ_FJnnyTEAE-E-OUB6otHu7lasY,1670
5
5
  unfold/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -17,16 +17,16 @@ unfold/contrib/filters/templates/unfold/filters/filters_datetime_range.html,sha2
17
17
  unfold/contrib/filters/templates/unfold/filters/filters_field.html,sha256=UTlSZlpg-gAc_a-EJLLF0NI_ofuSHQ2kMMoAs99nL2E,164
18
18
  unfold/contrib/filters/templates/unfold/filters/filters_numeric_range.html,sha256=NoJwm36x1J65Pq8cLk_g_qJ0Cil3CtDwja9dqZgRX8g,639
19
19
  unfold/contrib/filters/templates/unfold/filters/filters_numeric_single.html,sha256=EeQv2fHYX6MK9wwM0lgGkKGfmyDo82VLtx_E0M9MUtI,576
20
- unfold/contrib/filters/templates/unfold/filters/filters_numeric_slider.html,sha256=SpkLgq_m1-7WSdZzf3IPcySXxdaqe0z6qljAhhZSHec,1681
20
+ unfold/contrib/filters/templates/unfold/filters/filters_numeric_slider.html,sha256=3MKISUpYX-A5gp-ILshnj0s-DCmL7NDdVcqGJ5NyHRQ,1681
21
21
  unfold/contrib/forms/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
22
  unfold/contrib/forms/apps.py,sha256=Di0TMzVuRpVxLG-8Bjdq5ALCSf5r7u2xVhD0jU6H5Sc,132
23
23
  unfold/contrib/forms/static/unfold/forms/css/trix.css,sha256=TH9WdnaZrmwI8hAEydwjobdrBzSw_KYdRTSQDuD-8hE,20027
24
24
  unfold/contrib/forms/static/unfold/forms/js/trix.config.js,sha256=spkNBlJVk_pqido_rM6yywQxkJ3Kqb7DMLiBgpKksdA,858
25
25
  unfold/contrib/forms/static/unfold/forms/js/trix.js,sha256=HJXkWw7Mtocr7IeyBVplEIeO4X0kUhHHsI1Yra_ZMl8,175599
26
- unfold/contrib/forms/templates/unfold/forms/array.html,sha256=11silyHbsJA0U_ksS8MvfFOJKC_qKTAwXxoMIB78APk,1507
27
- unfold/contrib/forms/templates/unfold/forms/helpers/toolbar.html,sha256=yS8Zy-UrzvZ5RUYwdprQzREffnYq0NlIbXBfZM2UB04,9700
28
- unfold/contrib/forms/templates/unfold/forms/wysiwyg.html,sha256=4ZefV6XrjJlUczcuSw8BhvMJUFSZPSXo1IkgkBivh5g,351
29
- unfold/contrib/forms/widgets.py,sha256=D8utpEv-t_VDkppICA_0jtHvke7uElzAgaGMqd7NBHw,2875
26
+ unfold/contrib/forms/templates/unfold/forms/array.html,sha256=GcfmREGCvLfXWSXM-t6F54uFgvqliFUeRZ2oeOIV6u0,1555
27
+ unfold/contrib/forms/templates/unfold/forms/helpers/toolbar.html,sha256=6H6eaE_Po7OQRpl_YZj1sJJGZcENYzeQ4O8sg2pskMs,9700
28
+ unfold/contrib/forms/templates/unfold/forms/wysiwyg.html,sha256=uLLf59jsD3apAm9Uh1TH4pwCOtO7pL2djAeZLOHyNAI,399
29
+ unfold/contrib/forms/widgets.py,sha256=CZppWn1zMnHGPFTqhKbMS66XPVHWQMIoTNAbV40Nhs0,3141
30
30
  unfold/contrib/guardian/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
31
  unfold/contrib/guardian/apps.py,sha256=ObJqwh4vHxkD4XfduP5IQAiYiWZxsXUOUqF1_R1GsRI,136
32
32
  unfold/contrib/guardian/templates/admin/guardian/model/change_form.html,sha256=FSJc4MYYWyzZAy8Ay0b7Ov-cUo-oELHOM5fQehM54Lg,403
@@ -34,13 +34,13 @@ unfold/contrib/guardian/templates/admin/guardian/model/field.html,sha256=V9ZgmYi
34
34
  unfold/contrib/guardian/templates/admin/guardian/model/obj_perms_manage.html,sha256=p7GmZOyDqj1urDAh9pyZhatnSpe-G6gXtQ_DpRK-J8k,1426
35
35
  unfold/contrib/guardian/templates/admin/guardian/model/obj_perms_manage_group.html,sha256=TOXgGhNqujwl4XUYMXOMfPmTPszNkY4Sb3-7oRAy158,2318
36
36
  unfold/contrib/guardian/templates/admin/guardian/model/obj_perms_manage_user.html,sha256=drAeEnr6lh6SgDPC-bkaGtLkd_DxOtcHBSbgb_zaV00,2316
37
- unfold/contrib/guardian/templates/unfold/guardian/group_form.html,sha256=P8WMC5EejUHV5AxEiIQ2LOGzefLHk5J5UHiNq9wnBgY,4145
38
- unfold/contrib/guardian/templates/unfold/guardian/user_form.html,sha256=ci7FRrhTEKbFKKxsJ-07_dWXBYz4mqXPoqu5HfqYLaM,4132
37
+ unfold/contrib/guardian/templates/unfold/guardian/group_form.html,sha256=DsewzbWXXqJHPX8xLY57kxf9LrqrQ6HJF_3heXKJO1Q,4145
38
+ unfold/contrib/guardian/templates/unfold/guardian/user_form.html,sha256=lnhZNYUDKF_5vj0s15R8mRiJ1WmNehyRbe3y2kNINH0,4132
39
39
  unfold/contrib/import_export/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
40
40
  unfold/contrib/import_export/apps.py,sha256=SdJu6Qh90VqGWY19FSDhhpUqhTbaIYsJKny3zX5baHI,149
41
41
  unfold/contrib/import_export/forms.py,sha256=O8BBKJIdqLg3-uUFQyDV9-L6EoJ7EVSX3LJBP1zegGw,2037
42
42
  unfold/contrib/import_export/templates/admin/import_export/base.html,sha256=loL2qcV-f8aAzkHss_I4IkwfgemVW2CjOu_aiBxdwX0,357
43
- unfold/contrib/import_export/templates/admin/import_export/change_form.html,sha256=_YorgltKO0CRSaLBAp67XnGMUBWEP_XewsUff0hlrE4,446
43
+ unfold/contrib/import_export/templates/admin/import_export/change_form.html,sha256=-NZyyDmKC9rGOBBcuKBYZR9jRDVz1zJr5xXPfusxChQ,446
44
44
  unfold/contrib/import_export/templates/admin/import_export/change_list_export.html,sha256=vZb2XVoJrDSjM1msiZqkQPMLQGjuqRHuLNdt11hmbQs,164
45
45
  unfold/contrib/import_export/templates/admin/import_export/change_list_export_item.html,sha256=pTDeqPKOlCPKH2dxMIfPnWuc2wVDzB7AzL73WbxSnRY,257
46
46
  unfold/contrib/import_export/templates/admin/import_export/change_list_import_export.html,sha256=JdKd6P2Ot9Ou4yg4CywTauuE1UiTz_mRvDwlx3vj3LI,229
@@ -48,31 +48,31 @@ unfold/contrib/import_export/templates/admin/import_export/change_list_import_it
48
48
  unfold/contrib/import_export/templates/admin/import_export/export.html,sha256=NZ2bZ0yvskp_twIjX9LSROMmicXAU8dDXemxdII9_K0,3447
49
49
  unfold/contrib/import_export/templates/admin/import_export/import.html,sha256=P54_f3s96PV87Bo-FCZfmsn9DkRXLOB36r7HYF6y7GM,2075
50
50
  unfold/contrib/import_export/templates/admin/import_export/import_confirm.html,sha256=M-acK4XSLHuPFD_NJashGYvPPeJrJsC-3LMvHs3lRis,867
51
- unfold/contrib/import_export/templates/admin/import_export/import_errors.html,sha256=0DmJvZs31u-E2Y53yySci86cTnG9aUnOzvfYrOo0lYA,1422
51
+ unfold/contrib/import_export/templates/admin/import_export/import_errors.html,sha256=lV01ICc0mUzPzR0TbrOI1dM7j4sDjgSQa89kNJpEBGI,1422
52
52
  unfold/contrib/import_export/templates/admin/import_export/import_form.html,sha256=mMuMTAbgMbJ1IyCQPBkzmob4m5lJmZ69_QSo3GvvSiY,990
53
- unfold/contrib/import_export/templates/admin/import_export/import_preview.html,sha256=pNuLDW6zc5yOF1jurL2EgR0j05RL9ZVJLZiV4R21GJc,2413
54
- unfold/contrib/import_export/templates/admin/import_export/import_validation.html,sha256=1wQOiXN_Ga9VO6GGyl__KEiuJlCh4gTqzZdzIbmKxG0,4880
53
+ unfold/contrib/import_export/templates/admin/import_export/import_preview.html,sha256=nUuzDhMN7EBVbNsiCjQMJJokuAHE3nbK29JODE5tbOk,2413
54
+ unfold/contrib/import_export/templates/admin/import_export/import_validation.html,sha256=gt8My-0bCkjTEUpc1p8XZBpmNpDmCXrvJSN1sksLCtI,4880
55
55
  unfold/contrib/import_export/templates/admin/import_export/resource_fields_list.html,sha256=7LzgBiT73c4GHVZx3-ap_cuMz57EnIJ1ESGA5xR31mM,871
56
56
  unfold/contrib/inlines/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
57
57
  unfold/contrib/inlines/admin.py,sha256=p55cNAFOwEFToyFdXUtGl6Vt6j89s9i42V4kHYSZ5Ws,5928
58
58
  unfold/contrib/inlines/apps.py,sha256=Z9JBnzywq-DanZbD56fG0ndBfLXbojzkjVBleqoOBSU,136
59
59
  unfold/contrib/inlines/checks.py,sha256=8sdyBcxw0erqQvp9sHlpGgy0rXfum-cd2eQE0rXFKQ0,559
60
- unfold/contrib/inlines/forms.py,sha256=R9OJvrbqNLlKvTxw97JjElCY4CQ3IyRIkjIJUN0gJ9k,1323
60
+ unfold/contrib/inlines/forms.py,sha256=s49xrIkQTbvSMsrP4DydXWkpP1v8NCUmQw_Bcoqf0i4,1322
61
61
  unfold/contrib/simple_history/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
62
62
  unfold/contrib/simple_history/apps.py,sha256=eF_KVYb60CAnGgWk2Z1YKYGfgA3TJBMr229qI7e2pgU,153
63
63
  unfold/contrib/simple_history/templates/simple_history/object_history.html,sha256=ioBkepWc9-PQe4Kfy32RKOt_zf4fntz5XUfFeV3yQVw,771
64
64
  unfold/contrib/simple_history/templates/simple_history/object_history_form.html,sha256=MOL3Tw3Nk3Rnq1koRV7yeCev4CP06_4xqAIOQk1M7FU,2290
65
- unfold/contrib/simple_history/templates/simple_history/object_history_list.html,sha256=-QAWguUzGtD08_LBBk00_5ZYUjnso-q6dLXSeALc0n4,7449
66
- unfold/contrib/simple_history/templates/simple_history/submit_line.html,sha256=ns9CEkU4HwKHhhj8qj_9UXvzp0viGtD1tp93GV2WRCs,1703
67
- unfold/dataclasses.py,sha256=XssBT3nfeFO-oekKDWrX6abIyrIW1P8CPzzCv1TRYFM,266
65
+ unfold/contrib/simple_history/templates/simple_history/object_history_list.html,sha256=ydMWblJ74Uyd-sx34bO1mcEgCPPcIQZVL6neBoOllwk,7449
66
+ unfold/contrib/simple_history/templates/simple_history/submit_line.html,sha256=9v7PfS8M6N0NccTEb_9QyTG28NgDBiIkjuBOfWGIQ18,1703
67
+ unfold/dataclasses.py,sha256=4PAWLVlUhyGMq1Mwai7afCgrRO0Inulw0opFUKVEOBk,483
68
68
  unfold/decorators.py,sha256=6E4vPVwK0IQDAiDPg9pgyypRqciX_gR0jwITDcrSc8U,3367
69
69
  unfold/exceptions.py,sha256=gcCj1ox61E137bk_0Cqy4YC3SttdPgB-fiJUqpmyHSE,43
70
- unfold/fields.py,sha256=FLUxqlqNNCQgzRD12n_l54arqNZG1p_vJ6dYQIdf4cE,7466
70
+ unfold/fields.py,sha256=7sXZDYnXbGKQ9KJtkageVVGNejoAbqoDpzK-mW0TuLw,7448
71
71
  unfold/forms.py,sha256=_HDCPoFUGMGvURIDMh1ut6VrhjkonIPxarYRGn0gi_A,4071
72
- unfold/settings.py,sha256=--TdTSWdOA8TQGW4-vjJkjy_zEyd_kZwBr3BIuQ8hzI,1208
73
- unfold/sites.py,sha256=Gy_i43j2nizW2g8-mas5icvtk-beKism_CznATW6Ia8,12586
72
+ unfold/settings.py,sha256=uUl9WtHmYQF-BM_yCohGB5pGHjMWpZ0tUZOSki47gMA,1233
73
+ unfold/sites.py,sha256=yr66aXr1UYSZw9I9VRKpmkQxUtUP9336zs1GZJWJqis,13505
74
74
  unfold/static/unfold/css/simplebar.css,sha256=5LLaEM11pKi6JFCOLt4XKuZxTpT9rpdq_tNlaQytFlU,4647
75
- unfold/static/unfold/css/styles.css,sha256=lTKMfdZtOfoNQfL0Z55WECAwN9Po-7lUNsGs2ppFRQg,94176
75
+ unfold/static/unfold/css/styles.css,sha256=EOABBi3y0LjZk91HplY9csOvU8v9Q6MLOCTqqhW1Aa0,94339
76
76
  unfold/static/unfold/fonts/inter/Inter-Bold.woff2,sha256=O88EyjAeRPE_QEyKBKpK5wf2epUOEu8wwjj5bnhCZqE,46552
77
77
  unfold/static/unfold/fonts/inter/Inter-Medium.woff2,sha256=O88EyjAeRPE_QEyKBKpK5wf2epUOEu8wwjj5bnhCZqE,46552
78
78
  unfold/static/unfold/fonts/inter/Inter-Regular.woff2,sha256=O88EyjAeRPE_QEyKBKpK5wf2epUOEu8wwjj5bnhCZqE,46552
@@ -80,45 +80,46 @@ unfold/static/unfold/fonts/inter/Inter-SemiBold.woff2,sha256=O88EyjAeRPE_QEyKBKp
80
80
  unfold/static/unfold/fonts/inter/styles.css,sha256=QqdgevXVfcD6vZGo8ciSkaEG_62_YcZg0hvHTNgJ56E,608
81
81
  unfold/static/unfold/fonts/material-symbols/Material-Symbols-Outlined.woff2,sha256=GlHQ683zaA6TnebtaEaDEaeGocmioSKaspbbUAVSfEE,349864
82
82
  unfold/static/unfold/fonts/material-symbols/styles.css,sha256=U0oiGd2DS7LXnbuqgsvPNTDJgLZlA9s6LFOJ6FDihks,557
83
- unfold/static/unfold/js/alpine.js,sha256=XQltNouEUe1VZDk-nixNjSZDFH9lyKSBiK7BjpTB-0s,41071
84
- unfold/static/unfold/js/alpine.persist.js,sha256=84PZYnPi25AFm7wIWRe1gzA74c5Rv2VYASYEfaqKLHI,626
85
- unfold/static/unfold/js/app.js,sha256=d0V6JQ8VOpr47ArsV0fq0GGWml1GzdRW-94DraBPtJQ,5768
83
+ unfold/static/unfold/js/alpine.anchor.js,sha256=2Jg9aUq749pjFynzr_H1NK3lf-nXrbHMtO9wvlWJyIQ,15524
84
+ unfold/static/unfold/js/alpine.js,sha256=NY2a-7GrW--i9IBhowd25bzXcH9BCmBrqYX5i8OxwDQ,44659
85
+ unfold/static/unfold/js/alpine.persist.js,sha256=jFBwr6faTqqhp3sVi4_VTxJ0FpaF9YGZN1ZGLl_5QYM,837
86
+ unfold/static/unfold/js/app.js,sha256=2-56Kc20KH69Prjcj6ezURAKID3U8V2mHgbhPjeH6HA,6314
86
87
  unfold/static/unfold/js/chart.js,sha256=22W6cFERR-CElMOKRgMMicueMVP0Vf7FBEBYH8Z8tCk,200633
87
88
  unfold/static/unfold/js/htmx.js,sha256=XOLqvnZiyEx46EW9vaJTBUaaWg8CGVVfXJkVsUmJbpI,42820
88
89
  unfold/static/unfold/js/simplebar.js,sha256=t-uG1FAD6ZoiMeN--wac0XRS7SxoDVG6zvRnGuEp7X8,27176
89
- unfold/styles.css,sha256=Mj6VEsDlhfOkTnNeGgNja3JX0FSDCg-UQEN-hRbDH9s,18350
90
- unfold/templates/admin/actions.html,sha256=fffRBkdfaPASnDC59M6R1Z7h3MFEXn3Y-QU9ZdCI7RE,2647
90
+ unfold/styles.css,sha256=oWQMIFvTtU80auJaw1kYzQQxslHhbvwZ9BrtFxvHaYk,18350
91
+ unfold/templates/admin/actions.html,sha256=n_Z2dJv2h7DUkz7HjshJDgHMOdTcLEr2M2GIZjoKVTA,2647
91
92
  unfold/templates/admin/app_index.html,sha256=lVjMIFsspHQ09LGHKfdfg7TlqlL39AX5LbwoeoZjFhk,1335
92
- unfold/templates/admin/app_list.html,sha256=AdWB3duShcYHISTS8l-ule088FSQ8Jw9anPbS1-vuYc,3060
93
+ unfold/templates/admin/app_list.html,sha256=ZTUCZMEnaK5JJ-HQfoEyWi36luEiaTiBwuUOtCdyaQ0,3060
93
94
  unfold/templates/admin/auth/user/add_form.html,sha256=iLig-vd2YExXsj0xGBwYhZ4kGUihwYtLtNVhzObgSzg,478
94
95
  unfold/templates/admin/auth/user/change_password.html,sha256=-Wa9ml3yss-kDz0YQxCiwoxs91KQD8eetCt5l6xekWM,2892
95
- unfold/templates/admin/base.html,sha256=MGqtCcydXZPnp6dasaWktyd9D6rdUYX01rFGAv7Zkm4,2226
96
+ unfold/templates/admin/base.html,sha256=RptiEpgXZ6seYrPu-1Stoe8ECHpi9PjkJjFheGecYF0,2358
96
97
  unfold/templates/admin/base_site.html,sha256=3ckWrcAdd7Pw1hk6Zwyknab_Qb-rteV9-mXhMnfo6VI,361
97
98
  unfold/templates/admin/change_form.html,sha256=oWK5wr0qv6QMJrFQ9Veacozg_CN1DwmBqbzPOuDtiA4,4443
98
99
  unfold/templates/admin/change_form_object_tools.html,sha256=eyeH-i2HgEM0Yi-OJA2D1VnKJyC19A_my1IDGxxoP8Y,593
99
- unfold/templates/admin/change_list.html,sha256=18GDZswc1c0xtw2BcKti9SX95Ar9e1BX_HSY0K79g_8,5102
100
+ unfold/templates/admin/change_list.html,sha256=QgpUsMibQRy8g7o7JbB2VZnOemmQuJ9oEYv0gJYXCX0,5155
100
101
  unfold/templates/admin/change_list_object_tools.html,sha256=cmMiT2nT20Ph5yfpj9aHPr76Z-JP4aSXp0o-Rnad28s,147
101
- unfold/templates/admin/change_list_results.html,sha256=sV4HR-vKCxZRZOkm3GnabYpPk4iRpMnmVuVmvxBxH4k,5494
102
+ unfold/templates/admin/change_list_results.html,sha256=Hls_hFPFMoAmt-PZF9rY9dpG_J52lvuLy4oJ19S3DF0,5494
102
103
  unfold/templates/admin/date_hierarchy.html,sha256=BfUPbsLpHZVa40BHBahz1H9RSVuz36Jc3yrlobOiIpw,1306
103
- unfold/templates/admin/delete_confirmation.html,sha256=hpa2E14oZEXBBs6W1qdNQuF650TIO2Rhr52Q6UfwVeQ,5166
104
- unfold/templates/admin/delete_selected_confirmation.html,sha256=Foka2yvwAMEZre-Kh1KNadRzrCotdKM2U4e6AJQYZu8,4941
105
- unfold/templates/admin/edit_inline/stacked.html,sha256=kKWuO0un9hebuUZjLLr1mygC7K8MuHfPsnTxL87OqJI,5489
106
- unfold/templates/admin/edit_inline/tabular.html,sha256=MSamuoICJK2hG5m5MBOxZZA9NRhCENSJgTuBLfRlgNs,13350
107
- unfold/templates/admin/filter.html,sha256=0zTLzx31LjC1k3v8Q2lCopegFVZul8psqEJoWaHb-Vg,1752
108
- unfold/templates/admin/includes/fieldset.html,sha256=lMVwBifFWKvLvHqZ6yjP6Xf6BJFzi-EOf5JHIxEHmRI,888
109
- unfold/templates/admin/includes/object_delete_summary.html,sha256=Nv69SCzyJHFX14iJFfodxKM0IIpQegKZH0fvKB15QJI,468
104
+ unfold/templates/admin/delete_confirmation.html,sha256=n4KcDWPwGtoS_E0osakTuUTHfy5qsPG_LxAAMQHZ_Qw,5166
105
+ unfold/templates/admin/delete_selected_confirmation.html,sha256=Jhu8r3KiIIPtPYVxSLuES87PN4Vgg5Xi17QU4gG2PPo,4941
106
+ unfold/templates/admin/edit_inline/stacked.html,sha256=mkMFqmphS1WUjaI6MSxHOozBOLgkZ6_LxLVwlvrcbFg,5712
107
+ unfold/templates/admin/edit_inline/tabular.html,sha256=Yf2HJv58t2BPZNJfg0InUb0RZQoTsIzjW98BQyTaMGY,13573
108
+ unfold/templates/admin/filter.html,sha256=G7h_8yIRidSQORzL503E3UtlF-73u6JLf5So0wAYw-w,1752
109
+ unfold/templates/admin/includes/fieldset.html,sha256=R9DCaOQsFkNUZBPSI9OuhBx0VYmNG-GQ88BTsHpZh94,952
110
+ unfold/templates/admin/includes/object_delete_summary.html,sha256=o57knP7uUUY6GeBUnhAb0c9s2oW_aIhInUmR_TN5QAI,468
110
111
  unfold/templates/admin/index.html,sha256=pkGdKWdD3zzOvkRdELvdb15sleSpfl4eHPA14PAh7z0,684
111
- unfold/templates/admin/login.html,sha256=J1CmA_DiB5Ba1dXVbT4IS2C8pTie5peVJTxWWQNgVHE,3836
112
+ unfold/templates/admin/login.html,sha256=MI6LOulHm1929UAwPzKCWZRRkvdzbwA6MuTBbg7XGjg,4076
112
113
  unfold/templates/admin/nav_sidebar.html,sha256=cKuC28XU9NT17lrCVugn2cHf39kgkoX499axJt29L3s,1162
113
- unfold/templates/admin/object_history.html,sha256=PsbhXFd_3SCB9YkSJeHESp2VqjNlHtUW26mRtaZ-MD0,5069
114
+ unfold/templates/admin/object_history.html,sha256=gXg72ygzFxsVZ5Aej9U5Kh-9mDi0gSxM50TK2IMNNLk,5069
114
115
  unfold/templates/admin/pagination.html,sha256=KWTPV7_hVSZ1374a-pqHXhnOueNQKu1UnSUYirrWtCk,1173
115
- unfold/templates/admin/search_form.html,sha256=8fJlPYHQDCm4Je05wwdNJuJQR6ChLgghWmo-yHSybMs,1099
116
- unfold/templates/admin/submit_line.html,sha256=X7xg5vgWfHFWJOuXOLshma_LWWI0H9GHDmMYD1JqfI4,4353
117
- unfold/templates/auth/widgets/read_only_password_hash.html,sha256=Li9efo-3cFC5zj9im0SPfc62R4ZNVPQhs24H1U7xmD8,785
118
- unfold/templates/registration/logged_out.html,sha256=E7RHtB6AGQwgUIiV7dwJ1DbdfNvEhzJARONnB6jRLhQ,1028
116
+ unfold/templates/admin/search_form.html,sha256=vKuruVUEMarx8FPrBp86yqqFtUXfFPzR_9GxhnOCs4U,1173
117
+ unfold/templates/admin/submit_line.html,sha256=5ji4NVEg_aN22B6OWB5ptFpulpihaPeROXEUszwNdQY,4439
118
+ unfold/templates/auth/widgets/read_only_password_hash.html,sha256=I08wFPcDr0Gjrg64nlcKiB12Tz2g_nnJXemiy8tkoZg,785
119
+ unfold/templates/registration/logged_out.html,sha256=4rjAazcxt8ZCqA5bConKRgAk4VrljNTksdtg7D_btrU,1028
119
120
  unfold/templates/registration/password_change_done.html,sha256=i1ZzfTwZHWNWoN9_xHZDdcgLdTOVbTFFD1HUSuG0LkY,1062
120
121
  unfold/templates/registration/password_change_form.html,sha256=zzmqFHfMExS7czgEBdEtetXk2Ae_7jzaID7CpE_xlgo,2225
121
- unfold/templates/unfold/change_list_filter.html,sha256=NKZJMvHVjmney1vms08LsDTPPh6Z9fo6LqgauJWhVfA,2189
122
+ unfold/templates/unfold/change_list_filter.html,sha256=dwSpZkhhDvDsYJXO_0PybZdquZKUIQmZkDaIyyIXisE,2507
122
123
  unfold/templates/unfold/components/button.html,sha256=M_kn5fJPadvBfTUdN56-LMkouvfpUMga7orRJoVifgc,178
123
124
  unfold/templates/unfold/components/card.html,sha256=F0iaFv4F8NOjhka24XJHckJxub_Yhq2tJ4cLu6aTHwI,799
124
125
  unfold/templates/unfold/components/chart/bar.html,sha256=nDdDCUXvFd793OpNgNPQo0vBmvYngMsQyPHVTf1vfOw,297
@@ -130,27 +131,27 @@ unfold/templates/unfold/components/progress.html,sha256=pfdSjZD17IK4L5kGO8tRYikp
130
131
  unfold/templates/unfold/components/separator.html,sha256=G0IlKIFEXJmLZc0KP2YcsLzkaskeb0PrLvOdoKFTgmc,90
131
132
  unfold/templates/unfold/components/text.html,sha256=-GjxvdiaBQIaNfPSzT6SSIwnc3R27FkSDQMoF3FDPso,102
132
133
  unfold/templates/unfold/components/title.html,sha256=PSiNK-s8jUJfu6f9zCcGOOyLiKxS-dsAFu3aR-yjNdU,131
133
- unfold/templates/unfold/helpers/account_links.html,sha256=4iddfRn6yHZG--aEEme4XnxQa6-gh0jyVt6ymGKb6Xo,1939
134
- unfold/templates/unfold/helpers/actions_row.html,sha256=1xd39zx38NOoKuDuxAG7PHeu5x2OTIraQGFkm15Erqg,1681
134
+ unfold/templates/unfold/helpers/account_links.html,sha256=JCm4z_jZSshn8k812xdRx3ZHt_wdHgZngQKZXTSK0tc,1939
135
+ unfold/templates/unfold/helpers/actions_row.html,sha256=X_s1C6vA0mTexXsbOnKpEPdA5qQgzbJ8jUHsddt-aW0,1722
135
136
  unfold/templates/unfold/helpers/add_link.html,sha256=mIgpKrwqBO1oJ4cwPQWSX1oUHBwHJmy5-2TxUHf-1bo,808
136
- unfold/templates/unfold/helpers/app_list.html,sha256=lFnW8p9DcZbI9t3_ee9JX9ERHA0NRL2V88zpzuG4jq8,4720
137
- unfold/templates/unfold/helpers/app_list_default.html,sha256=vZkw1F7oHOKReNkdHRYjhuNdA1nNdvSD4wbDmf0bnsM,4102
137
+ unfold/templates/unfold/helpers/app_list.html,sha256=C4UIaUtI-DEGH8N-tSrzVXPcBzyrS8sBcHuuthW0KF4,5757
138
+ unfold/templates/unfold/helpers/app_list_default.html,sha256=LjnBSEd7tsVLWWa-hvbP00CcPtgafOzy4kgWXhAUY2E,4102
138
139
  unfold/templates/unfold/helpers/attrs.html,sha256=Mwpj72kuwYj8hOT3J2T8qx6f1r_4xwwaS1slHA-82jI,166
139
140
  unfold/templates/unfold/helpers/boolean.html,sha256=6gXAMEJcNVB14je9uN32dxImXP3KMCiWPeKU5EAnawA,569
140
- unfold/templates/unfold/helpers/breadcrumb_item.html,sha256=k_1j57UV0WtzFFlMKaewj4NLbR_DhXI6RzCHThblZLw,234
141
+ unfold/templates/unfold/helpers/breadcrumb_item.html,sha256=QSosg4GdgYSJIfVkBamHxuNwtRu5WQZAn6YNcCnwaFA,234
141
142
  unfold/templates/unfold/helpers/display_header.html,sha256=HiuaIJ6Y8DSM99OFypLO_2uQadZIw7tSg1aJJpFEXkM,1161
142
143
  unfold/templates/unfold/helpers/display_label.html,sha256=LS9DWzYjHkYLV27sZDwyXlg2sLJ0AlId9FbjnXpsbfg,317
143
144
  unfold/templates/unfold/helpers/field.html,sha256=Ds-zUHkdyxamfUCVNhxvtM0XoJg9OCA0QcsLbLWv4oo,882
144
145
  unfold/templates/unfold/helpers/field_readonly.html,sha256=O0gHEW46OWt1oUUk0lZiyR-mztWv_7IH6GpKRm2wUw4,235
145
- unfold/templates/unfold/helpers/field_readonly_value.html,sha256=tNhw67n_Ak8wWbeV3yb64HmKUoKaB7YI2Ks6MAdPhyc,442
146
- unfold/templates/unfold/helpers/fieldset_row.html,sha256=j1DN-Ankl72kEQnZejo5mGz-TFATlI62HxNZt81Xf5M,4131
147
- unfold/templates/unfold/helpers/fieldsets_tabs.html,sha256=V3bgW75eozaBDty-xfciGafhCWq_Ba5HfQkk92yRc9A,1445
146
+ unfold/templates/unfold/helpers/field_readonly_value.html,sha256=eAQcLZc2YpWOwOmKZQVP60oDRp4Zpo4fZJBEo9nLwNo,442
147
+ unfold/templates/unfold/helpers/fieldset_row.html,sha256=Pg0qqHXlKzzECeJxJ_0PlPdHZUK-MrIxY-vvvJZeHX0,4125
148
+ unfold/templates/unfold/helpers/fieldsets_tabs.html,sha256=YDIiO-f5Hn__o9fEyhQXPD_Pf7jklhUAsxQy_qH7k3Y,1477
148
149
  unfold/templates/unfold/helpers/form_errors.html,sha256=EwerIJptSCWXvtAJ1IZKfEn98qlShBIGavsTThbklAs,266
149
150
  unfold/templates/unfold/helpers/form_label.html,sha256=SR4U6iK9w4oels6iGY_Da-yN4BbXQVN9zCDlBGGXcw8,310
150
- unfold/templates/unfold/helpers/header.html,sha256=jklASqVEJRa22jxdXq_X2UZb2uYn_ywaZbI2N4nBv20,998
151
- unfold/templates/unfold/helpers/help_text.html,sha256=iBXw0LWfoYT5PoPLJek9ixv4SuK7hfVkjPgmv2ODW-s,146
152
- unfold/templates/unfold/helpers/history.html,sha256=0_Imm7Fc1PqjjXEmHh8QEQg_qIqBZWx2BeK5o3axfvY,2017
153
- unfold/templates/unfold/helpers/label.html,sha256=sgFj9tYw9SjAq8p20nKOFjkC2653K8K1ryXT9dW4H8g,684
151
+ unfold/templates/unfold/helpers/header.html,sha256=-wEd5_REov-lU6Od_BaZbvfQCFBZMtRGB4rQwCBWcDc,1051
152
+ unfold/templates/unfold/helpers/help_text.html,sha256=GAKDPqM-70JRwvS_T748VumWrZqhOLz63KCuitBwen8,146
153
+ unfold/templates/unfold/helpers/history.html,sha256=PI7qMI6W-3-3uV7oR-1WmUiitpC85USSy7U9o3AuNy4,2017
154
+ unfold/templates/unfold/helpers/label.html,sha256=FRRreTItfDtqgk0vuqQWX-R8AAaw2mM4jSrpyXGLFp4,684
154
155
  unfold/templates/unfold/helpers/messages/error.html,sha256=mlHVdfpG2ycsKIDBJB9CZs6fM4bMGkpmJvtxHjEApjE,558
155
156
  unfold/templates/unfold/helpers/messages/errornote.html,sha256=5ChxoVYkF4jI-cw72gVHh0CRxDnG9ME_U6UQOArax2k,404
156
157
  unfold/templates/unfold/helpers/messages/info.html,sha256=js95Hm3CzqpP6_XJpnA2vG7qt8eyHmJJJcDF0e5PLtQ,143
@@ -158,41 +159,41 @@ unfold/templates/unfold/helpers/messages.html,sha256=axUkgdYQySOTKEuRBDkohXFf8dM
158
159
  unfold/templates/unfold/helpers/navigation.html,sha256=TdBm-7YM6B9qpCAKT1tN6CfPFM6pob6Xz5oojYkcAVA,1185
159
160
  unfold/templates/unfold/helpers/pagination_current_item.html,sha256=4cZ2KLVcP0Y7xuGyXgexDQ07r94cgM5Gnmtv11dkRPQ,69
160
161
  unfold/templates/unfold/helpers/pagination_ellipsis.html,sha256=Ar9Ntf2I_79mIVW5Hadwkn1Kx1Lj3d8eIXNXI1IIBfg,56
161
- unfold/templates/unfold/helpers/search.html,sha256=T3JLlzEeHTEpX6qfjNQ0cQPW2rtVIOyE9quEyVHVXsA,1382
162
- unfold/templates/unfold/helpers/search_results.html,sha256=N5CNMJSF91jbJS6OQP0nANlnwVeS9UmnuOJ8QLitl2c,774
162
+ unfold/templates/unfold/helpers/search.html,sha256=tCJLkG3qYDTOsgkaCer0y4cNo_ubw9fQXIt0w_72uCo,1588
163
+ unfold/templates/unfold/helpers/search_results.html,sha256=Ki-NoM_Gj5eJ4dMTqiVtyhQIdHPRS_77R7VJZikv83I,774
163
164
  unfold/templates/unfold/helpers/site_icon.html,sha256=RO-R5yRt6yOx41Z8dpDP4lzwMXFdz8Dp5j8vGUtHzh0,789
164
165
  unfold/templates/unfold/helpers/site_logo.html,sha256=05tqXzHy--pluceRQ2jDUZCFX9DjPHdBqGaieUv9sXk,424
165
166
  unfold/templates/unfold/helpers/submit.html,sha256=oSzq85LRLhdOlbFtFZFhYm6ucT95u6LunTeSTDClszQ,206
166
- unfold/templates/unfold/helpers/tab_action.html,sha256=FMj_aWoVbY4xGXFSkLv94IoiN-N7yy33T_EnDgcXfe4,403
167
- unfold/templates/unfold/helpers/tab_list.html,sha256=MUtQM63uH5XB6A3SN1pagB_GuRVAPNWfI9Y-xsMPyRg,2266
168
- unfold/templates/unfold/helpers/theme_switch.html,sha256=B5wfWEoMjLJp6V8aR0ClN-_ZUcjU--Jclbqny2sEmNM,2271
167
+ unfold/templates/unfold/helpers/tab_action.html,sha256=jsEtb3umg4H3qx1F9WkWpg78GllzmNKEOB9asFcs_2c,403
168
+ unfold/templates/unfold/helpers/tab_list.html,sha256=_f59XxqsccYk2NuJBigWzDcwjB7IJUpFFhGD9_mnrMw,4075
169
+ unfold/templates/unfold/helpers/theme_switch.html,sha256=s5ZeWbx8Ynaq777EU8tGzCoX-09JMKt4l4qpxxX8dMQ,2271
169
170
  unfold/templates/unfold/helpers/userlinks.html,sha256=qWjtBt9Q_tU8a874ii0Qqg8t_d-SSYBTB_3QZfNlx9g,634
170
171
  unfold/templates/unfold/helpers/welcomemsg.html,sha256=noRysgSENef4_53pXaTiBCy2or6lQm1ZtmCQVODAB1c,1120
171
172
  unfold/templates/unfold/layouts/base.html,sha256=bAXZDbyiyxNiE-49mqr7pHUFhC2mHZQzIDUY-js_yZ0,379
172
173
  unfold/templates/unfold/layouts/base_simple.html,sha256=T37-ncKZBLNnOlsUQq90rGl3sLdRjFaxWCPG399pkbE,1179
173
- unfold/templates/unfold/layouts/skeleton.html,sha256=iXrUiggVp36vmBIia5p32c-9Ruy0PxkFFQogDpvENbk,3419
174
- unfold/templates/unfold/widgets/clearable_file_input.html,sha256=gAJsfyCnanOyeN4ypp1y7r76znvITV7FYTyWvPsmlDs,1882
175
- unfold/templates/unfold/widgets/clearable_file_input_small.html,sha256=LPgiKuMAYPiEupFxdlwc1TozNRV1w9ekdRuv-5P4fgw,2531
174
+ unfold/templates/unfold/layouts/skeleton.html,sha256=DCfXXG5ZKw6up2ZTBta2TL1ZcuGlnZOfJWUh5ltzBz0,3821
175
+ unfold/templates/unfold/widgets/clearable_file_input.html,sha256=Pa3qK7aHhTA66HYpbeeCfiV8cj2fbQa5gClxebbdsQQ,2234
176
+ unfold/templates/unfold/widgets/clearable_file_input_small.html,sha256=5gR3OrAQc3PabIB0HaIAmMBqdr3SRNcxmLPPmMkVBas,2512
176
177
  unfold/templates/unfold/widgets/date.html,sha256=WXo2LG1v_gBZBSg-zocj7oujMKI0MWLYCIFfB04HMLQ,122
177
178
  unfold/templates/unfold/widgets/foreign_key_raw_id.html,sha256=VyJjnN0v75-NFb_O25smszKzlRXwl_H9zyPsrBLb11g,1036
178
179
  unfold/templates/unfold/widgets/radio.html,sha256=3WcmclQNg7R_pRjEHL1dHkGjAzWlWNYnhHkAirC4nuA,646
179
180
  unfold/templates/unfold/widgets/radio_option.html,sha256=IZgPx-aWKJuxrSalJ3K50RFd1vwSpb9Qk0yZwfV78_A,368
180
181
  unfold/templates/unfold/widgets/range.html,sha256=28FBtSUgUcG82vpk_I27Lbs5oWZOV_oMzVhx4wj3-Ik,262
181
182
  unfold/templates/unfold/widgets/related_widget_wrapper.html,sha256=0I6wSu8z_sJPqmX6uZev4mQGIIM336d6kvHdHj36ny4,3831
182
- unfold/templates/unfold/widgets/split_datetime.html,sha256=u4pSJOVAb4HIzZc4oQmRZe76jtoDx5Ils6b-Gw38LRU,1688
183
+ unfold/templates/unfold/widgets/split_datetime.html,sha256=75gpnx5pF5PaoLfj-e3XOdNEBDWvEdzLK85cawUDjRQ,1688
183
184
  unfold/templates/unfold/widgets/split_datetime_vertical.html,sha256=xinCH4kkQ-yKUqcSI7-m-_UEzOEKWqvLTjUa3i-e8EM,881
184
185
  unfold/templates/unfold/widgets/split_money.html,sha256=AFLUBmzGbY-RXgsfz7gaDxVRhplaIPhXjg_hWYo9xcY,352
185
186
  unfold/templates/unfold/widgets/textarea.html,sha256=-ZLDGrtASero7L-J3VvTNq_KjPAZh_kLVw0Ow3awqXM,144
186
187
  unfold/templates/unfold/widgets/textarea_expandable.html,sha256=4xIGWb20DuwiwumndByrAyh7xF-ReXKLulSpDImX_cs,459
187
188
  unfold/templates/unfold/widgets/time.html,sha256=WXo2LG1v_gBZBSg-zocj7oujMKI0MWLYCIFfB04HMLQ,122
188
189
  unfold/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
189
- unfold/templatetags/unfold.py,sha256=mz5mq7fj2381BEQE6UguBWnBa9gjs1m1DrT5iuXE5nc,6363
190
- unfold/templatetags/unfold_list.py,sha256=5xAjQX0_JnVwDaj-wGkGqbjOAtp-a18koWIKj5VfBz0,13867
190
+ unfold/templatetags/unfold.py,sha256=jWumX0e2KIyDxz_CmIfyOu7blILxVBqUPtGi1VutaBo,6884
191
+ unfold/templatetags/unfold_list.py,sha256=hqSrBD6-8vHV6Ig3QNVmDvfViE_aud_7Ay-br7w0G7E,14193
191
192
  unfold/typing.py,sha256=1P8PWM2oeaceUJtA5j071RbKEBpHYaux441u7Hd6wv4,643
192
193
  unfold/utils.py,sha256=zZdJE4FmwRd7p5a7sJiAoZjBOJitXJduOq7BulyppWM,4803
193
194
  unfold/views.py,sha256=hQCyeeMa9kcJV1IZeeYqj8PGW7J4QWME8n-5n0UGmiU,1003
194
- unfold/widgets.py,sha256=41zf0dFwVqyvxDqPbVckMglM4yt9foQVRJ9lmBkVXKk,15893
195
- django_unfold-0.30.0.dist-info/LICENSE.md,sha256=Ltk_quRyyvV3J5v3brtOqmibeZSw2Hrb8bY1W3ya0Ik,1077
196
- django_unfold-0.30.0.dist-info/METADATA,sha256=R_EzmyPIAsGK08aHdJbjJVn47ZDXzk2nkV1Do970urk,53344
197
- django_unfold-0.30.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
198
- django_unfold-0.30.0.dist-info/RECORD,,
195
+ unfold/widgets.py,sha256=fgFqWQZwIGvsYmtuAf6oCN71uFUXM_yuD8CEcSFUiUQ,15893
196
+ django_unfold-0.31.0.dist-info/LICENSE.md,sha256=Ltk_quRyyvV3J5v3brtOqmibeZSw2Hrb8bY1W3ya0Ik,1077
197
+ django_unfold-0.31.0.dist-info/METADATA,sha256=ghDshhUSgSCC8jSoCDumgrjqgLs4yClxCHWs5COll3Y,54572
198
+ django_unfold-0.31.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
199
+ django_unfold-0.31.0.dist-info/RECORD,,
unfold/admin.py CHANGED
@@ -1,6 +1,6 @@
1
1
  import copy
2
2
  from functools import update_wrapper
3
- from typing import Any, Callable, Dict, List, Optional, Tuple
3
+ from typing import Any, Callable, Dict, List, Optional, Tuple, Union
4
4
 
5
5
  from django import forms
6
6
  from django.contrib.admin import ModelAdmin as BaseModelAdmin
@@ -148,6 +148,7 @@ class ModelAdminMixin:
148
148
  else:
149
149
  kwargs["widget"] = UnfoldAdminSelectWidget()
150
150
 
151
+ if "choices" not in kwargs:
151
152
  kwargs["choices"] = db_field.get_choices(
152
153
  include_blank=db_field.blank, blank_choice=[("", _("Select value"))]
153
154
  )
@@ -229,6 +230,7 @@ class ModelAdmin(ModelAdminMixin, BaseModelAdmin):
229
230
  add_fieldsets = ()
230
231
  list_horizontal_scrollbar_top = False
231
232
  list_filter_submit = False
233
+ list_fullwidth = False
232
234
  compressed_fields = False
233
235
  readonly_preprocess_fields = {}
234
236
  checks_class = UnfoldModelAdminChecks
@@ -255,7 +257,10 @@ class ModelAdmin(ModelAdminMixin, BaseModelAdmin):
255
257
  return super().get_fieldsets(request, obj)
256
258
 
257
259
  def _filter_unfold_actions_by_permissions(
258
- self, request: HttpRequest, actions: List[UnfoldAction]
260
+ self,
261
+ request: HttpRequest,
262
+ actions: List[UnfoldAction],
263
+ object_id: Optional[Union[int, str]] = None,
259
264
  ) -> List[UnfoldAction]:
260
265
  """Filter out any Unfold actions that the user doesn't have access to."""
261
266
  filtered_actions = []
@@ -263,12 +268,22 @@ class ModelAdmin(ModelAdminMixin, BaseModelAdmin):
263
268
  if not hasattr(action.method, "allowed_permissions"):
264
269
  filtered_actions.append(action)
265
270
  continue
271
+
266
272
  permission_checks = (
267
273
  getattr(self, f"has_{permission}_permission")
268
274
  for permission in action.method.allowed_permissions
269
275
  )
270
- if any(has_permission(request) for has_permission in permission_checks):
271
- filtered_actions.append(action)
276
+
277
+ if object_id:
278
+ if any(
279
+ has_permission(request, object_id)
280
+ for has_permission in permission_checks
281
+ ):
282
+ filtered_actions.append(action)
283
+ else:
284
+ if any(has_permission(request) for has_permission in permission_checks):
285
+ filtered_actions.append(action)
286
+
272
287
  return filtered_actions
273
288
 
274
289
  def get_actions_list(self, request: HttpRequest) -> List[UnfoldAction]:
@@ -282,9 +297,11 @@ class ModelAdmin(ModelAdminMixin, BaseModelAdmin):
282
297
  """
283
298
  return [self.get_unfold_action(action) for action in self.actions_list or []]
284
299
 
285
- def get_actions_detail(self, request: HttpRequest) -> List[UnfoldAction]:
300
+ def get_actions_detail(
301
+ self, request: HttpRequest, object_id: int
302
+ ) -> List[UnfoldAction]:
286
303
  return self._filter_unfold_actions_by_permissions(
287
- request, self._get_base_actions_detail()
304
+ request, self._get_base_actions_detail(), object_id
288
305
  )
289
306
 
290
307
  def _get_base_actions_detail(self) -> List[UnfoldAction]:
@@ -304,9 +321,11 @@ class ModelAdmin(ModelAdminMixin, BaseModelAdmin):
304
321
  """
305
322
  return [self.get_unfold_action(action) for action in self.actions_row or []]
306
323
 
307
- def get_actions_submit_line(self, request: HttpRequest) -> List[UnfoldAction]:
324
+ def get_actions_submit_line(
325
+ self, request: HttpRequest, object_id: int
326
+ ) -> List[UnfoldAction]:
308
327
  return self._filter_unfold_actions_by_permissions(
309
- request, self._get_base_actions_submit_line()
328
+ request, self._get_base_actions_submit_line(), object_id
310
329
  )
311
330
 
312
331
  def _get_base_actions_submit_line(self) -> List[UnfoldAction]:
@@ -404,7 +423,7 @@ class ModelAdmin(ModelAdminMixin, BaseModelAdmin):
404
423
 
405
424
  actions = []
406
425
  if object_id:
407
- for action in self.get_actions_detail(request):
426
+ for action in self.get_actions_detail(request, object_id):
408
427
  actions.append(
409
428
  {
410
429
  "title": action.description,
@@ -418,7 +437,7 @@ class ModelAdmin(ModelAdminMixin, BaseModelAdmin):
418
437
 
419
438
  extra_context.update(
420
439
  {
421
- "actions_submit_line": self.get_actions_submit_line(request),
440
+ "actions_submit_line": self.get_actions_submit_line(request, object_id),
422
441
  "actions_detail": actions,
423
442
  }
424
443
  )
@@ -485,7 +504,7 @@ class ModelAdmin(ModelAdminMixin, BaseModelAdmin):
485
504
  ) -> None:
486
505
  super().save_model(request, obj, form, change)
487
506
 
488
- for action in self.get_actions_submit_line(request):
507
+ for action in self.get_actions_submit_line(request, obj.pk):
489
508
  if action.action_name not in request.POST:
490
509
  continue
491
510