django-unfold 0.33.0__py3-none-any.whl → 0.35.0__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. {django_unfold-0.33.0.dist-info → django_unfold-0.35.0.dist-info}/METADATA +33 -5
  2. {django_unfold-0.33.0.dist-info → django_unfold-0.35.0.dist-info}/RECORD +74 -73
  3. unfold/admin.py +12 -14
  4. unfold/contrib/filters/admin.py +34 -1
  5. unfold/contrib/filters/forms.py +36 -3
  6. unfold/contrib/filters/templates/unfold/filters/filters_date_range.html +1 -1
  7. unfold/contrib/filters/templates/unfold/filters/filters_datetime_range.html +1 -1
  8. unfold/contrib/filters/templates/unfold/filters/filters_numeric_range.html +1 -1
  9. unfold/contrib/filters/templates/unfold/filters/filters_numeric_single.html +1 -1
  10. unfold/contrib/filters/templates/unfold/filters/filters_numeric_slider.html +1 -1
  11. unfold/contrib/guardian/templates/unfold/guardian/group_form.html +10 -10
  12. unfold/contrib/guardian/templates/unfold/guardian/user_form.html +10 -10
  13. unfold/contrib/import_export/templates/admin/import_export/import_confirm.html +1 -1
  14. unfold/contrib/import_export/templates/admin/import_export/import_errors.html +3 -3
  15. unfold/contrib/import_export/templates/admin/import_export/import_preview.html +6 -6
  16. unfold/contrib/import_export/templates/admin/import_export/import_validation.html +8 -8
  17. unfold/contrib/simple_history/templates/simple_history/object_history_list.html +18 -18
  18. unfold/decorators.py +2 -2
  19. unfold/fields.py +2 -2
  20. unfold/forms.py +2 -1
  21. unfold/static/unfold/css/styles.css +1 -1
  22. unfold/static/unfold/js/app.js +23 -0
  23. unfold/static/unfold/js/select2.init.js +15 -0
  24. unfold/styles.css +6 -10
  25. unfold/templates/admin/actions.html +14 -12
  26. unfold/templates/admin/app_list.html +3 -5
  27. unfold/templates/admin/change_form.html +1 -1
  28. unfold/templates/admin/change_list.html +4 -4
  29. unfold/templates/admin/change_list_results.html +4 -4
  30. unfold/templates/admin/delete_confirmation.html +9 -9
  31. unfold/templates/admin/delete_selected_confirmation.html +9 -9
  32. unfold/templates/admin/edit_inline/stacked.html +64 -58
  33. unfold/templates/admin/edit_inline/tabular.html +11 -11
  34. unfold/templates/admin/filter.html +5 -5
  35. unfold/templates/admin/includes/object_delete_summary.html +2 -2
  36. unfold/templates/admin/object_history.html +9 -9
  37. unfold/templates/admin/pagination.html +3 -3
  38. unfold/templates/admin/submit_line.html +7 -7
  39. unfold/templates/unfold/change_list_filter.html +3 -3
  40. unfold/templates/unfold/components/progress.html +1 -1
  41. unfold/templates/unfold/components/table.html +4 -4
  42. unfold/templates/unfold/components/title.html +1 -1
  43. unfold/templates/unfold/helpers/account_links.html +2 -2
  44. unfold/templates/unfold/helpers/actions_row.html +14 -12
  45. unfold/templates/unfold/helpers/add_link.html +2 -2
  46. unfold/templates/unfold/helpers/app_list.html +7 -7
  47. unfold/templates/unfold/helpers/app_list_default.html +7 -7
  48. unfold/templates/unfold/helpers/breadcrumb_item.html +1 -1
  49. unfold/templates/unfold/helpers/display_header.html +4 -2
  50. unfold/templates/unfold/helpers/field_readonly_value.html +1 -1
  51. unfold/templates/unfold/helpers/fieldset_row.html +1 -1
  52. unfold/templates/unfold/helpers/fieldsets_tabs.html +1 -1
  53. unfold/templates/unfold/helpers/help_text.html +1 -1
  54. unfold/templates/unfold/helpers/history.html +3 -3
  55. unfold/templates/unfold/helpers/label.html +6 -6
  56. unfold/templates/unfold/helpers/messages.html +12 -1
  57. unfold/templates/unfold/helpers/navigation.html +1 -1
  58. unfold/templates/unfold/helpers/search_results.html +2 -2
  59. unfold/templates/unfold/helpers/site_icon.html +1 -1
  60. unfold/templates/unfold/helpers/tab_action.html +1 -1
  61. unfold/templates/unfold/helpers/tab_list.html +9 -5
  62. unfold/templates/unfold/helpers/theme_switch.html +2 -2
  63. unfold/templates/unfold/helpers/welcomemsg.html +5 -3
  64. unfold/templates/unfold/layouts/skeleton.html +2 -2
  65. unfold/templates/unfold/widgets/clearable_file_input.html +2 -2
  66. unfold/templates/unfold/widgets/clearable_file_input_small.html +2 -2
  67. unfold/templates/unfold/widgets/foreign_key_raw_id.html +8 -4
  68. unfold/templates/unfold/widgets/radio_option.html +1 -1
  69. unfold/templates/unfold/widgets/split_datetime.html +2 -2
  70. unfold/templates/unfold/widgets/split_datetime_vertical.html +2 -2
  71. unfold/templatetags/unfold_list.py +6 -7
  72. unfold/widgets.py +21 -6
  73. {django_unfold-0.33.0.dist-info → django_unfold-0.35.0.dist-info}/LICENSE.md +0 -0
  74. {django_unfold-0.33.0.dist-info → django_unfold-0.35.0.dist-info}/WHEEL +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: django-unfold
3
- Version: 0.33.0
3
+ Version: 0.35.0
4
4
  Summary: Modern Django admin theme for seamless interface development
5
5
  Home-page: https://unfoldadmin.com
6
6
  License: MIT
@@ -111,6 +111,7 @@ Did you decide to start using Unfold but you don't have time to make the switch
111
111
  - [Pre-commit](#pre-commit)
112
112
  - [Poetry configuration](#poetry-configuration)
113
113
  - [Compiling Tailwind](#compiling-tailwind)
114
+ - [Design system](#design-system)
114
115
  - [Using VS Code with containers](#using-vs-code-with-containers)
115
116
  - [Development server](#development-server)
116
117
  - [Compiling Tailwind in devcontainer](#compiling-tailwind-in-devcontainer)
@@ -178,7 +179,7 @@ class CustomAdminClass(ModelAdmin):
178
179
  from django.contrib import admin
179
180
  from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
180
181
  from django.contrib.auth.admin import GroupAdmin as BaseGroupAdmin
181
- from django.contrib.auth.models import User
182
+ from django.contrib.auth.models import User, Group
182
183
 
183
184
  from unfold.admin import ModelAdmin
184
185
 
@@ -359,6 +360,9 @@ class CustomAdminClass(ModelAdmin):
359
360
  # Display fields in changeform in compressed mode
360
361
  compressed_fields = True # Default: False
361
362
 
363
+ # Warn before leaving unsaved changes in changeform
364
+ warn_unsaved_form = True # Default: False
365
+
362
366
  # Preprocess content of readonly fields before render
363
367
  readonly_preprocess_fields = {
364
368
  "model_field_name": "html.unescape",
@@ -374,6 +378,9 @@ class CustomAdminClass(ModelAdmin):
374
378
  # Position horizontal scrollbar in changelist at the top
375
379
  list_horizontal_scrollbar_top = False
376
380
 
381
+ # Dsable select all action in changelist
382
+ list_disable_select_all = False
383
+
377
384
  # Custom actions
378
385
  actions_list = [] # Displayed above the results list
379
386
  actions_row = [] # Displayed in a table row in results list
@@ -641,7 +648,14 @@ The difference between them is that `ChoicesDropdownFilter` will collect a list
641
648
  from django.contrib import admin
642
649
  from django.contrib.auth.models import User
643
650
  from unfold.admin import ModelAdmin
644
- from unfold.contrib.filters.admin import ChoicesDropdownFilter, RelatedDropdownFilter, DropdownFilter
651
+ from unfold.contrib.filters.admin import (
652
+ ChoicesDropdownFilter,
653
+ MultipleChoicesDropdownFilter,
654
+ RelatedDropdownFilter,
655
+ MultipleRelatedDropdownFilter,
656
+ DropdownFilter,
657
+ MultipleDropdownFilter
658
+ )
645
659
 
646
660
 
647
661
  class CustomDropdownFilter(DropdownFilter):
@@ -668,7 +682,9 @@ class MyAdmin(ModelAdmin):
668
682
  list_filter = [
669
683
  CustomDropdownFilter,
670
684
  ("modelfield_with_choices", ChoicesDropdownFilter),
685
+ ("modelfield_with_choices_multiple", MultipleChoicesDropdownFilter),
671
686
  ("modelfield_with_foreign_key", RelatedDropdownFilter)
687
+ ("modelfield_with_foreign_key_multiple", MultipleRelatedDropdownFilter)
672
688
  ]
673
689
  ```
674
690
 
@@ -1359,8 +1375,8 @@ def dashboard_callback(request: HttpRequest) -> Dict:
1359
1375
  ```
1360
1376
 
1361
1377
  ```django-html
1362
- {% component "unfold/components/card" with title="Card title" %}
1363
- {% component "unfold/components/table.html" with table=table_data card_included=1 striped=1 %}{% encomponent %}
1378
+ {% component "unfold/components/card.html" with title="Card title" %}
1379
+ {% component "unfold/components/table.html" with table=table_data card_included=1 striped=1 %}{% endcomponent %}
1364
1380
  {% endcomponent %}
1365
1381
  ```
1366
1382
 
@@ -1402,6 +1418,17 @@ Some components like datepickers, calendars or selectors in admin was not possib
1402
1418
 
1403
1419
  **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.
1404
1420
 
1421
+
1422
+ ### Design system
1423
+
1424
+ | Component | Classes |
1425
+ | --------------------------------- | ------------------------------------------------------ |
1426
+ | Regular text | text-gray-600 dark:text-gray-300 |
1427
+ | Hover regular text | text-gray-700 dark:text-gray-200 |
1428
+ | Headings | font-semibold text-gray-900 dark:text-gray-100 |
1429
+ | Icon | text-gray-400 dark:text-gray-500 |
1430
+ | Hover icon | hover:text-gray-500 dark:hover:text-gray-400 |
1431
+
1405
1432
  ### Using VS Code with containers
1406
1433
 
1407
1434
  Unfold already contains prepared support for VS Code development. After cloning the project locally, open the main folder in VS Code (in terminal `code .`). Immediately, you would see a message from VS Code **Folder contains a Dev Container configuration file. Reopen folder to develop in a container** which will inform you that the support for containers is prepared. Confirm the message by clicking on **Reopen in Container**. If the message is not there, you can still manually open the project in a container by running the command **Dev Containers: Reopen in Container**.
@@ -1424,4 +1451,5 @@ The container has already a node preinstalled so it is possible to compile a new
1424
1451
  - [Material Icons](https://fonts.google.com/icons) - Icons from Google Fonts
1425
1452
  - [Trix](https://trix-editor.org/) - WYSIWYG editor
1426
1453
  - [Alpine.js](https://alpinejs.dev/) - JavaScript interactions
1454
+ - [Chart.js](https://github.com/chartjs/Chart.js/) - Chart components
1427
1455
 
@@ -1,23 +1,23 @@
1
1
  unfold/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- unfold/admin.py,sha256=pTftvCeukl-tsnOhQf8JJT59CcpTnpQafn7IkWqfW3U,19580
2
+ unfold/admin.py,sha256=nUAouLLyo57CE3EpOREHDMjOaj68P7MZO6KEPYlutYU,19587
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
6
6
  unfold/contrib/filters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
- unfold/contrib/filters/admin.py,sha256=hkrw-CthPsSubwsDpInqOiNw5vsl_zbQeYW23DnKSsY,20068
7
+ unfold/contrib/filters/admin.py,sha256=4dwK-LCXaopQeqW3818wUiZJhkJEDLNwbDLJboVJPHk,21138
8
8
  unfold/contrib/filters/apps.py,sha256=wEySJy0gMLzFLb9XNKE-RexiO05X7NaQ5QmxZyziJ_k,136
9
- unfold/contrib/filters/forms.py,sha256=cdBFNB45PPgKVzAbjrwbZVdYF6rZBUQPxxWMwZaKCpM,4736
9
+ unfold/contrib/filters/forms.py,sha256=N25YiD7YfBxg57-goSnaXc-eyEQFp1XYgDmmQwg7jQ0,5696
10
10
  unfold/contrib/filters/static/unfold/filters/css/nouislider.min.css,sha256=rddL_jOGGVEY6wR-aw0VYovAfz5fPeAIsulrlSNb1hc,4221
11
11
  unfold/contrib/filters/static/unfold/filters/js/DateTimeShortcuts.js,sha256=jgFNBDf6aHvUlyv0LEDHggXO-xA8pWOCWFWcVupdA30,19332
12
12
  unfold/contrib/filters/static/unfold/filters/js/admin-numeric-filter.js,sha256=nTkiiJk4Abn9d6KigxPSEsereFhFq-v5n_boiiY1eII,1668
13
13
  unfold/contrib/filters/static/unfold/filters/js/nouislider.min.js,sha256=aIEt5UlLNnEv4-HPyxcLqu9dTS7gXiMm35Mm0rFmQ0Q,26683
14
14
  unfold/contrib/filters/static/unfold/filters/js/wNumb.min.js,sha256=gayD3el5iizhy0DlsyKfZvfOfOZHDmb7BPvOcT97GSg,2236
15
- unfold/contrib/filters/templates/unfold/filters/filters_date_range.html,sha256=BVUsF4vCtDpxpXxevf--y3n8kO1FH3FMFbLG1qEUe6g,661
16
- unfold/contrib/filters/templates/unfold/filters/filters_datetime_range.html,sha256=BVUsF4vCtDpxpXxevf--y3n8kO1FH3FMFbLG1qEUe6g,661
15
+ unfold/contrib/filters/templates/unfold/filters/filters_date_range.html,sha256=dZESgm60-nS469z4T9PZ8W8g98NqIcCHl2vWQgtk164,655
16
+ unfold/contrib/filters/templates/unfold/filters/filters_datetime_range.html,sha256=dZESgm60-nS469z4T9PZ8W8g98NqIcCHl2vWQgtk164,655
17
17
  unfold/contrib/filters/templates/unfold/filters/filters_field.html,sha256=UTlSZlpg-gAc_a-EJLLF0NI_ofuSHQ2kMMoAs99nL2E,164
18
- unfold/contrib/filters/templates/unfold/filters/filters_numeric_range.html,sha256=NoJwm36x1J65Pq8cLk_g_qJ0Cil3CtDwja9dqZgRX8g,639
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=3MKISUpYX-A5gp-ILshnj0s-DCmL7NDdVcqGJ5NyHRQ,1681
18
+ unfold/contrib/filters/templates/unfold/filters/filters_numeric_range.html,sha256=n8WkxAd2qlmcLh_s5ToUul8LlbC3b8csP5gRwfAq8u8,633
19
+ unfold/contrib/filters/templates/unfold/filters/filters_numeric_single.html,sha256=I89EqKtIrus5pUeQc6APoovwogYua2-cA5QmQ6hNpHc,570
20
+ unfold/contrib/filters/templates/unfold/filters/filters_numeric_slider.html,sha256=yChI6vo111DTHfDENQO1b2Wixed21oNpH9bbTbFLGqY,1675
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
@@ -34,8 +34,8 @@ 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=DsewzbWXXqJHPX8xLY57kxf9LrqrQ6HJF_3heXKJO1Q,4145
38
- unfold/contrib/guardian/templates/unfold/guardian/user_form.html,sha256=lnhZNYUDKF_5vj0s15R8mRiJ1WmNehyRbe3y2kNINH0,4132
37
+ unfold/contrib/guardian/templates/unfold/guardian/group_form.html,sha256=erYUME-MViHHx3i2mVm3LpaOVNccNmep7PshPRU7tlg,3874
38
+ unfold/contrib/guardian/templates/unfold/guardian/user_form.html,sha256=tKYI6cnaZ2cGmq6DnGvuAq0o52R6PEg3lxpH5AM30o4,3862
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
@@ -47,11 +47,11 @@ unfold/contrib/import_export/templates/admin/import_export/change_list_import_ex
47
47
  unfold/contrib/import_export/templates/admin/import_export/change_list_import_item.html,sha256=XUuRxnsx9YQbKvW-E_JGl_ha7kpTSGSoRefOTTizuX0,233
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
- 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=lV01ICc0mUzPzR0TbrOI1dM7j4sDjgSQa89kNJpEBGI,1422
50
+ unfold/contrib/import_export/templates/admin/import_export/import_confirm.html,sha256=9DpqVW2TcrC8UrAawBP-6KIzKf0bZDNhpYIWduGTnVc,869
51
+ unfold/contrib/import_export/templates/admin/import_export/import_errors.html,sha256=JxY2An8aVZaWYK-uQz1eq1lvutRp-4PQgbKtYpCc1Fw,1413
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=nUuzDhMN7EBVbNsiCjQMJJokuAHE3nbK29JODE5tbOk,2413
54
- unfold/contrib/import_export/templates/admin/import_export/import_validation.html,sha256=gt8My-0bCkjTEUpc1p8XZBpmNpDmCXrvJSN1sksLCtI,4880
53
+ unfold/contrib/import_export/templates/admin/import_export/import_preview.html,sha256=UZG5ep4BRbq3K9g3Yv0sNJdVRYmEi4luHi51IHNGNU8,2263
54
+ unfold/contrib/import_export/templates/admin/import_export/import_validation.html,sha256=iOjwNDSQQHN6XVUZemYbsWI_wYeYEXTGc3T181Wg5NA,4635
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
@@ -62,17 +62,17 @@ unfold/contrib/simple_history/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5N
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=ydMWblJ74Uyd-sx34bO1mcEgCPPcIQZVL6neBoOllwk,7449
65
+ unfold/contrib/simple_history/templates/simple_history/object_history_list.html,sha256=f0RxTiPfC957uQzNfSkKoyMUzu8LRw4-MS6d3xZ2gew,6821
66
66
  unfold/contrib/simple_history/templates/simple_history/submit_line.html,sha256=9v7PfS8M6N0NccTEb_9QyTG28NgDBiIkjuBOfWGIQ18,1703
67
67
  unfold/dataclasses.py,sha256=4PAWLVlUhyGMq1Mwai7afCgrRO0Inulw0opFUKVEOBk,483
68
- unfold/decorators.py,sha256=6E4vPVwK0IQDAiDPg9pgyypRqciX_gR0jwITDcrSc8U,3367
68
+ unfold/decorators.py,sha256=jyjE2sunazp8gK1QIsNRJGEEDwO7RDKWDKnOI3GDWZE,3338
69
69
  unfold/exceptions.py,sha256=gcCj1ox61E137bk_0Cqy4YC3SttdPgB-fiJUqpmyHSE,43
70
- unfold/fields.py,sha256=7sXZDYnXbGKQ9KJtkageVVGNejoAbqoDpzK-mW0TuLw,7448
71
- unfold/forms.py,sha256=_HDCPoFUGMGvURIDMh1ut6VrhjkonIPxarYRGn0gi_A,4071
70
+ unfold/fields.py,sha256=yhtpDfqycpOxqdQlbncCg9qhELxGk3AtXizkZyzzH0g,7410
71
+ unfold/forms.py,sha256=8-IoFZLwUNJKTNdev_oJwdxm-_xekvrn_84IXKse4Q8,4100
72
72
  unfold/settings.py,sha256=uUl9WtHmYQF-BM_yCohGB5pGHjMWpZ0tUZOSki47gMA,1233
73
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=5fTnLC-aW-jSgwy5oBi0QZqUurBXsDCPDTin059_2Sg,95266
75
+ unfold/static/unfold/css/styles.css,sha256=2fhp571FdpPkyZA04XsP8uaTySEPGnC4sGZ4dT3ruHg,96866
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
@@ -83,43 +83,44 @@ unfold/static/unfold/fonts/material-symbols/styles.css,sha256=U0oiGd2DS7LXnbuqgs
83
83
  unfold/static/unfold/js/alpine.anchor.js,sha256=2Jg9aUq749pjFynzr_H1NK3lf-nXrbHMtO9wvlWJyIQ,15524
84
84
  unfold/static/unfold/js/alpine.js,sha256=NY2a-7GrW--i9IBhowd25bzXcH9BCmBrqYX5i8OxwDQ,44659
85
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
+ unfold/static/unfold/js/app.js,sha256=kL7gJu4bDcY7v61KYtYtjn7KxWd-rHVvL49GTD_q770,6884
87
87
  unfold/static/unfold/js/chart.js,sha256=22W6cFERR-CElMOKRgMMicueMVP0Vf7FBEBYH8Z8tCk,200633
88
88
  unfold/static/unfold/js/htmx.js,sha256=XOLqvnZiyEx46EW9vaJTBUaaWg8CGVVfXJkVsUmJbpI,42820
89
+ unfold/static/unfold/js/select2.init.js,sha256=SzpjSL1mD9tHedjSeXlmEwHjuuyqlnpilpSeEEKeYLE,265
89
90
  unfold/static/unfold/js/simplebar.js,sha256=t-uG1FAD6ZoiMeN--wac0XRS7SxoDVG6zvRnGuEp7X8,27176
90
- unfold/styles.css,sha256=oWQMIFvTtU80auJaw1kYzQQxslHhbvwZ9BrtFxvHaYk,18350
91
- unfold/templates/admin/actions.html,sha256=n_Z2dJv2h7DUkz7HjshJDgHMOdTcLEr2M2GIZjoKVTA,2647
91
+ unfold/styles.css,sha256=egNdWhCzaGS5Y_tCiceIU6BTNn1MkrMMooX5zDv_r6I,18223
92
+ unfold/templates/admin/actions.html,sha256=8GqELAxzywGyfQJiQeuhGIQUakdK_WeneILY06C7mEo,2746
92
93
  unfold/templates/admin/app_index.html,sha256=lVjMIFsspHQ09LGHKfdfg7TlqlL39AX5LbwoeoZjFhk,1335
93
- unfold/templates/admin/app_list.html,sha256=ZTUCZMEnaK5JJ-HQfoEyWi36luEiaTiBwuUOtCdyaQ0,3060
94
+ unfold/templates/admin/app_list.html,sha256=GumHcXTFGrZ4PpW7eHkbduR1eILk7CVYWzSJNy6PGEY,2802
94
95
  unfold/templates/admin/auth/user/add_form.html,sha256=iLig-vd2YExXsj0xGBwYhZ4kGUihwYtLtNVhzObgSzg,478
95
96
  unfold/templates/admin/auth/user/change_password.html,sha256=-Wa9ml3yss-kDz0YQxCiwoxs91KQD8eetCt5l6xekWM,2892
96
97
  unfold/templates/admin/base.html,sha256=RptiEpgXZ6seYrPu-1Stoe8ECHpi9PjkJjFheGecYF0,2358
97
98
  unfold/templates/admin/base_site.html,sha256=3ckWrcAdd7Pw1hk6Zwyknab_Qb-rteV9-mXhMnfo6VI,361
98
- unfold/templates/admin/change_form.html,sha256=oWK5wr0qv6QMJrFQ9Veacozg_CN1DwmBqbzPOuDtiA4,4443
99
+ unfold/templates/admin/change_form.html,sha256=FiVfbB1j1wb6qGfaLukdMUrLRXsO_sJ4wirKq1bit60,4528
99
100
  unfold/templates/admin/change_form_object_tools.html,sha256=eyeH-i2HgEM0Yi-OJA2D1VnKJyC19A_my1IDGxxoP8Y,593
100
- unfold/templates/admin/change_list.html,sha256=QgpUsMibQRy8g7o7JbB2VZnOemmQuJ9oEYv0gJYXCX0,5155
101
+ unfold/templates/admin/change_list.html,sha256=o8XnKa1xFot53-BxGeB8afJ0TF8N7TcJhyTA4vPnop0,5124
101
102
  unfold/templates/admin/change_list_object_tools.html,sha256=cmMiT2nT20Ph5yfpj9aHPr76Z-JP4aSXp0o-Rnad28s,147
102
- unfold/templates/admin/change_list_results.html,sha256=Hls_hFPFMoAmt-PZF9rY9dpG_J52lvuLy4oJ19S3DF0,5494
103
+ unfold/templates/admin/change_list_results.html,sha256=6PbAraLQ910cI1-03IT-yEHRwNIS07xoNyaqPAqEW6M,5520
103
104
  unfold/templates/admin/date_hierarchy.html,sha256=BfUPbsLpHZVa40BHBahz1H9RSVuz36Jc3yrlobOiIpw,1306
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=LcxB_0zX4EtzIurEfEFmDM2JdW-nVZrAgvkAJVusjEM,6641
107
- unfold/templates/admin/edit_inline/tabular.html,sha256=BsGwm6KEjdsGo0sJHjG9m5yhDSlRIjxl5Gy15MCBUOg,14465
108
- unfold/templates/admin/filter.html,sha256=G7h_8yIRidSQORzL503E3UtlF-73u6JLf5So0wAYw-w,1752
105
+ unfold/templates/admin/delete_confirmation.html,sha256=x0azTK-swC1WaN1J382QmR0D1zqsk0h11Zq03U6E9xo,4982
106
+ unfold/templates/admin/delete_selected_confirmation.html,sha256=nQpJ1_hBr-BgY-xgLU6vvj51_CEYyPq2Bd3iitkA-UQ,4764
107
+ unfold/templates/admin/edit_inline/stacked.html,sha256=fnzTEffWouBc05Ti8LwrLvLPXKe85VLMAvnNfuL8ZbA,7032
108
+ unfold/templates/admin/edit_inline/tabular.html,sha256=MxGI96FXhIP4wMxJQHqsYGZ_wYJJVQjDsBqRgABtr48,14122
109
+ unfold/templates/admin/filter.html,sha256=F2Gqb7GdGq41P-ZAp_JDKVKAbtaOjXx-Wb7oBZHV8NI,1617
109
110
  unfold/templates/admin/includes/fieldset.html,sha256=R9DCaOQsFkNUZBPSI9OuhBx0VYmNG-GQ88BTsHpZh94,952
110
- unfold/templates/admin/includes/object_delete_summary.html,sha256=o57knP7uUUY6GeBUnhAb0c9s2oW_aIhInUmR_TN5QAI,468
111
+ unfold/templates/admin/includes/object_delete_summary.html,sha256=G0MgYyjl7MPi2OM7j1ZbOMAD-sQ4eNZZB9E8iexD8rY,421
111
112
  unfold/templates/admin/index.html,sha256=pkGdKWdD3zzOvkRdELvdb15sleSpfl4eHPA14PAh7z0,684
112
113
  unfold/templates/admin/login.html,sha256=MI6LOulHm1929UAwPzKCWZRRkvdzbwA6MuTBbg7XGjg,4076
113
114
  unfold/templates/admin/nav_sidebar.html,sha256=cKuC28XU9NT17lrCVugn2cHf39kgkoX499axJt29L3s,1162
114
- unfold/templates/admin/object_history.html,sha256=gXg72ygzFxsVZ5Aej9U5Kh-9mDi0gSxM50TK2IMNNLk,5069
115
- unfold/templates/admin/pagination.html,sha256=KWTPV7_hVSZ1374a-pqHXhnOueNQKu1UnSUYirrWtCk,1173
115
+ unfold/templates/admin/object_history.html,sha256=mRD6nbIVmnsz2OG6UsuXdI55bflY3Vs8zbIE9X-Oi74,4816
116
+ unfold/templates/admin/pagination.html,sha256=KrwOM6gRizfpTMP59TESQaNGcQzkga2k02opl_7BxLo,1130
116
117
  unfold/templates/admin/search_form.html,sha256=vKuruVUEMarx8FPrBp86yqqFtUXfFPzR_9GxhnOCs4U,1173
117
- unfold/templates/admin/submit_line.html,sha256=5ji4NVEg_aN22B6OWB5ptFpulpihaPeROXEUszwNdQY,4439
118
+ unfold/templates/admin/submit_line.html,sha256=6V9qtE9BecN905-YkI5ZOLY3ZYyb_mhN_p9Zkhv4h8Q,4248
118
119
  unfold/templates/auth/widgets/read_only_password_hash.html,sha256=I08wFPcDr0Gjrg64nlcKiB12Tz2g_nnJXemiy8tkoZg,785
119
120
  unfold/templates/registration/logged_out.html,sha256=4rjAazcxt8ZCqA5bConKRgAk4VrljNTksdtg7D_btrU,1028
120
121
  unfold/templates/registration/password_change_done.html,sha256=i1ZzfTwZHWNWoN9_xHZDdcgLdTOVbTFFD1HUSuG0LkY,1062
121
122
  unfold/templates/registration/password_change_form.html,sha256=zzmqFHfMExS7czgEBdEtetXk2Ae_7jzaID7CpE_xlgo,2225
122
- unfold/templates/unfold/change_list_filter.html,sha256=dwSpZkhhDvDsYJXO_0PybZdquZKUIQmZkDaIyyIXisE,2507
123
+ unfold/templates/unfold/change_list_filter.html,sha256=XcufnmOwceEhf6dQ-Oy19lORlCwulqqVFwBvSilOsh8,2499
123
124
  unfold/templates/unfold/components/button.html,sha256=M_kn5fJPadvBfTUdN56-LMkouvfpUMga7orRJoVifgc,178
124
125
  unfold/templates/unfold/components/card.html,sha256=9Qpu74wRAmhW2fu3AJTVs9IexJjBf3tnLD8PNSi1ZKc,1071
125
126
  unfold/templates/unfold/components/chart/bar.html,sha256=nDdDCUXvFd793OpNgNPQo0vBmvYngMsQyPHVTf1vfOw,297
@@ -128,74 +129,74 @@ unfold/templates/unfold/components/container.html,sha256=WBk1rGHnTsObi3pJCpL3dfF
128
129
  unfold/templates/unfold/components/flex.html,sha256=_hBsQLJ6-7MfEfXNp5Wy-ykNtPMnnNg_io2IMGegn3s,134
129
130
  unfold/templates/unfold/components/icon.html,sha256=Qlhcf41FOwNVJ-nvA0RJ_Dn6JW6PUFXO6tOR3Xtf6e8,99
130
131
  unfold/templates/unfold/components/navigation.html,sha256=LzmcT8_SdmEp4XlqV0xjHhxxvfr_puG5-kAfzphw7YM,872
131
- unfold/templates/unfold/components/progress.html,sha256=pfdSjZD17IK4L5kGO8tRYikpGQnLQK11XAp4PG-tfh8,664
132
+ unfold/templates/unfold/components/progress.html,sha256=Dh8Q5rW5oVoRFrAxCcTbId3qI_SeA7V5V8KsmLgA8Bc,631
132
133
  unfold/templates/unfold/components/separator.html,sha256=IuQQu_kMgZY9D9w9-l6PHuVF0cX0bJuxcJHGXWswEhU,168
133
- unfold/templates/unfold/components/table.html,sha256=umX_Wh-kVkRqEdu-nxFYpPqSrlzRljVg7yBjd4vO6cc,2120
134
+ unfold/templates/unfold/components/table.html,sha256=iC7mhLlPLRgCaV0sVjEkxIR7A4NLV2-rSHqEbmwpaHw,2028
134
135
  unfold/templates/unfold/components/text.html,sha256=-GjxvdiaBQIaNfPSzT6SSIwnc3R27FkSDQMoF3FDPso,102
135
- unfold/templates/unfold/components/title.html,sha256=PSiNK-s8jUJfu6f9zCcGOOyLiKxS-dsAFu3aR-yjNdU,131
136
- unfold/templates/unfold/helpers/account_links.html,sha256=JCm4z_jZSshn8k812xdRx3ZHt_wdHgZngQKZXTSK0tc,1939
137
- unfold/templates/unfold/helpers/actions_row.html,sha256=X_s1C6vA0mTexXsbOnKpEPdA5qQgzbJ8jUHsddt-aW0,1722
138
- unfold/templates/unfold/helpers/add_link.html,sha256=mIgpKrwqBO1oJ4cwPQWSX1oUHBwHJmy5-2TxUHf-1bo,808
139
- unfold/templates/unfold/helpers/app_list.html,sha256=C4UIaUtI-DEGH8N-tSrzVXPcBzyrS8sBcHuuthW0KF4,5757
140
- unfold/templates/unfold/helpers/app_list_default.html,sha256=LjnBSEd7tsVLWWa-hvbP00CcPtgafOzy4kgWXhAUY2E,4102
136
+ unfold/templates/unfold/components/title.html,sha256=FyIpxJa8fLDyLNyfcTkTxQDTyHNHOByfQIZ445KUdW8,131
137
+ unfold/templates/unfold/helpers/account_links.html,sha256=Vd80PCa91D5v3gJJKKuEJ7ycL80n54XJEo-039ELsRU,1879
138
+ unfold/templates/unfold/helpers/actions_row.html,sha256=kjRxDPe-XinDTYjkhLGHFo0jfEzdc7bFK-zd2TlUtiU,1782
139
+ unfold/templates/unfold/helpers/add_link.html,sha256=CUFZ3quvp1JMAPmTkFRjpUXSy9GVXnIWNcRzv_gpq1A,810
140
+ unfold/templates/unfold/helpers/app_list.html,sha256=RBFGn5A985AkZpQm0r0SXr2nUJ2IvxQF35d94wmOdKc,5515
141
+ unfold/templates/unfold/helpers/app_list_default.html,sha256=T8xXI0LsEZCyttxXZGomGMkqEd8Wxj61RCYQ4YDxlHE,3908
141
142
  unfold/templates/unfold/helpers/attrs.html,sha256=Mwpj72kuwYj8hOT3J2T8qx6f1r_4xwwaS1slHA-82jI,166
142
143
  unfold/templates/unfold/helpers/boolean.html,sha256=6gXAMEJcNVB14je9uN32dxImXP3KMCiWPeKU5EAnawA,569
143
- unfold/templates/unfold/helpers/breadcrumb_item.html,sha256=QSosg4GdgYSJIfVkBamHxuNwtRu5WQZAn6YNcCnwaFA,234
144
- unfold/templates/unfold/helpers/display_header.html,sha256=HiuaIJ6Y8DSM99OFypLO_2uQadZIw7tSg1aJJpFEXkM,1161
144
+ unfold/templates/unfold/helpers/breadcrumb_item.html,sha256=Q9Usvwz2iGI9AYlNgyN0OZ9ZPftcoaXk37nxsFmCJSE,201
145
+ unfold/templates/unfold/helpers/display_header.html,sha256=99odsL1oUX0uiT2nEboXFPsm9IEetc1GbWReqJsPTRo,1248
145
146
  unfold/templates/unfold/helpers/display_label.html,sha256=LS9DWzYjHkYLV27sZDwyXlg2sLJ0AlId9FbjnXpsbfg,317
146
147
  unfold/templates/unfold/helpers/field.html,sha256=Ds-zUHkdyxamfUCVNhxvtM0XoJg9OCA0QcsLbLWv4oo,882
147
148
  unfold/templates/unfold/helpers/field_readonly.html,sha256=O0gHEW46OWt1oUUk0lZiyR-mztWv_7IH6GpKRm2wUw4,235
148
- unfold/templates/unfold/helpers/field_readonly_value.html,sha256=eAQcLZc2YpWOwOmKZQVP60oDRp4Zpo4fZJBEo9nLwNo,442
149
- unfold/templates/unfold/helpers/fieldset_row.html,sha256=Pg0qqHXlKzzECeJxJ_0PlPdHZUK-MrIxY-vvvJZeHX0,4125
150
- unfold/templates/unfold/helpers/fieldsets_tabs.html,sha256=YDIiO-f5Hn__o9fEyhQXPD_Pf7jklhUAsxQy_qH7k3Y,1477
149
+ unfold/templates/unfold/helpers/field_readonly_value.html,sha256=z-tAWjbXpRLRmbpZezxg5t9uylV2AVFLUIPDSsH8dcs,409
150
+ unfold/templates/unfold/helpers/fieldset_row.html,sha256=-X2L-0JK9ztnXWieV9FKDI232XB2cGRc6pgaRJKjcTg,4142
151
+ unfold/templates/unfold/helpers/fieldsets_tabs.html,sha256=dOHTr05uKYeBqiQPWaCd8_qMayZaVKXfxmrcb3iqix4,1477
151
152
  unfold/templates/unfold/helpers/form_errors.html,sha256=EwerIJptSCWXvtAJ1IZKfEn98qlShBIGavsTThbklAs,266
152
153
  unfold/templates/unfold/helpers/form_label.html,sha256=SR4U6iK9w4oels6iGY_Da-yN4BbXQVN9zCDlBGGXcw8,310
153
154
  unfold/templates/unfold/helpers/header.html,sha256=-wEd5_REov-lU6Od_BaZbvfQCFBZMtRGB4rQwCBWcDc,1051
154
- unfold/templates/unfold/helpers/help_text.html,sha256=GAKDPqM-70JRwvS_T748VumWrZqhOLz63KCuitBwen8,146
155
- unfold/templates/unfold/helpers/history.html,sha256=PI7qMI6W-3-3uV7oR-1WmUiitpC85USSy7U9o3AuNy4,2017
156
- unfold/templates/unfold/helpers/label.html,sha256=IstpON3T4LrWsLH70-Hj_E0qyA_1Xq9j6NnIgbowrWQ,683
155
+ unfold/templates/unfold/helpers/help_text.html,sha256=o-2_hyruIr_Xt0fo38aGgrpptPJFhddnVMPOVQOYhE4,113
156
+ unfold/templates/unfold/helpers/history.html,sha256=tfpOWNDzo2k7orcb7avfFBWVFe8Z5yVxtMkshD2C42E,1927
157
+ unfold/templates/unfold/helpers/label.html,sha256=w6bzLOyvbdz-pxOTo5wJ4KDDFtxpH4rxn7wzaod5FsI,783
157
158
  unfold/templates/unfold/helpers/messages/error.html,sha256=mlHVdfpG2ycsKIDBJB9CZs6fM4bMGkpmJvtxHjEApjE,558
158
159
  unfold/templates/unfold/helpers/messages/errornote.html,sha256=5ChxoVYkF4jI-cw72gVHh0CRxDnG9ME_U6UQOArax2k,404
159
160
  unfold/templates/unfold/helpers/messages/info.html,sha256=js95Hm3CzqpP6_XJpnA2vG7qt8eyHmJJJcDF0e5PLtQ,143
160
- unfold/templates/unfold/helpers/messages.html,sha256=axUkgdYQySOTKEuRBDkohXFf8dM1ioQt5m6iAR7Ls18,701
161
- unfold/templates/unfold/helpers/navigation.html,sha256=TdBm-7YM6B9qpCAKT1tN6CfPFM6pob6Xz5oojYkcAVA,1185
161
+ unfold/templates/unfold/helpers/messages.html,sha256=x06-ZXZe6l_n04h_CdoUkfYjsO8qu6xWR3dRhYuf2ww,927
162
+ unfold/templates/unfold/helpers/navigation.html,sha256=6qy1hPaLcCqujUfB3-iCSsXXUN54fW0RhxuA_XTsbA8,1213
162
163
  unfold/templates/unfold/helpers/pagination_current_item.html,sha256=4cZ2KLVcP0Y7xuGyXgexDQ07r94cgM5Gnmtv11dkRPQ,69
163
164
  unfold/templates/unfold/helpers/pagination_ellipsis.html,sha256=Ar9Ntf2I_79mIVW5Hadwkn1Kx1Lj3d8eIXNXI1IIBfg,56
164
165
  unfold/templates/unfold/helpers/search.html,sha256=tCJLkG3qYDTOsgkaCer0y4cNo_ubw9fQXIt0w_72uCo,1588
165
- unfold/templates/unfold/helpers/search_results.html,sha256=Ki-NoM_Gj5eJ4dMTqiVtyhQIdHPRS_77R7VJZikv83I,774
166
- unfold/templates/unfold/helpers/site_icon.html,sha256=RO-R5yRt6yOx41Z8dpDP4lzwMXFdz8Dp5j8vGUtHzh0,789
166
+ unfold/templates/unfold/helpers/search_results.html,sha256=liLy0JnKaDUKhVpsvPM6PKqqLO_rwuBf6whMo0QYMFg,637
167
+ unfold/templates/unfold/helpers/site_icon.html,sha256=MWGECpFsRJcBJiLLxDbUUKTYLNR1wMn8gOlvUPN5ugo,788
167
168
  unfold/templates/unfold/helpers/site_logo.html,sha256=05tqXzHy--pluceRQ2jDUZCFX9DjPHdBqGaieUv9sXk,424
168
169
  unfold/templates/unfold/helpers/submit.html,sha256=oSzq85LRLhdOlbFtFZFhYm6ucT95u6LunTeSTDClszQ,206
169
- unfold/templates/unfold/helpers/tab_action.html,sha256=jsEtb3umg4H3qx1F9WkWpg78GllzmNKEOB9asFcs_2c,403
170
- unfold/templates/unfold/helpers/tab_list.html,sha256=_f59XxqsccYk2NuJBigWzDcwjB7IJUpFFhGD9_mnrMw,4075
171
- unfold/templates/unfold/helpers/theme_switch.html,sha256=s5ZeWbx8Ynaq777EU8tGzCoX-09JMKt4l4qpxxX8dMQ,2271
170
+ unfold/templates/unfold/helpers/tab_action.html,sha256=QRsJq6MIY7hlCOaTfScTcCfv0sUZs3iM2tMFe4vjpAA,370
171
+ unfold/templates/unfold/helpers/tab_list.html,sha256=gpDVnMMJFP-AiWsf53LJUatT_Yy_locpMYLmnlc5yuU,4368
172
+ unfold/templates/unfold/helpers/theme_switch.html,sha256=21r_6v7rdpv1favvw5-5uwkRMUWwsAxcghdqDP38HYw,2212
172
173
  unfold/templates/unfold/helpers/userlinks.html,sha256=qWjtBt9Q_tU8a874ii0Qqg8t_d-SSYBTB_3QZfNlx9g,634
173
- unfold/templates/unfold/helpers/welcomemsg.html,sha256=noRysgSENef4_53pXaTiBCy2or6lQm1ZtmCQVODAB1c,1120
174
+ unfold/templates/unfold/helpers/welcomemsg.html,sha256=mZ9qHGKrtCgv8t39s7Fz97kVRfNT9t0S9ODpbNCGH74,1221
174
175
  unfold/templates/unfold/layouts/base.html,sha256=bAXZDbyiyxNiE-49mqr7pHUFhC2mHZQzIDUY-js_yZ0,379
175
176
  unfold/templates/unfold/layouts/base_simple.html,sha256=T37-ncKZBLNnOlsUQq90rGl3sLdRjFaxWCPG399pkbE,1179
176
- unfold/templates/unfold/layouts/skeleton.html,sha256=DCfXXG5ZKw6up2ZTBta2TL1ZcuGlnZOfJWUh5ltzBz0,3821
177
- unfold/templates/unfold/widgets/clearable_file_input.html,sha256=Pa3qK7aHhTA66HYpbeeCfiV8cj2fbQa5gClxebbdsQQ,2234
178
- unfold/templates/unfold/widgets/clearable_file_input_small.html,sha256=5gR3OrAQc3PabIB0HaIAmMBqdr3SRNcxmLPPmMkVBas,2512
177
+ unfold/templates/unfold/layouts/skeleton.html,sha256=wVbJntYS2cHbIzxDZXC3tD1aXAHzHI-0rtfHG-DP_nw,3792
178
+ unfold/templates/unfold/widgets/clearable_file_input.html,sha256=HNc93_OKFYWCc-TZhGfRlkN_ao9NRqUTGGZLFy-XnF0,2250
179
+ unfold/templates/unfold/widgets/clearable_file_input_small.html,sha256=DVDVTOpb9G9l06Y5A5d3QUeEoNfz4XZXvBn1yGqefO0,2528
179
180
  unfold/templates/unfold/widgets/date.html,sha256=WXo2LG1v_gBZBSg-zocj7oujMKI0MWLYCIFfB04HMLQ,122
180
- unfold/templates/unfold/widgets/foreign_key_raw_id.html,sha256=VyJjnN0v75-NFb_O25smszKzlRXwl_H9zyPsrBLb11g,1036
181
+ unfold/templates/unfold/widgets/foreign_key_raw_id.html,sha256=Ud6qyEfLCuZjwcvnJ-rQia1DrhU-Te9uZqv2cKbDpFk,1006
181
182
  unfold/templates/unfold/widgets/radio.html,sha256=3WcmclQNg7R_pRjEHL1dHkGjAzWlWNYnhHkAirC4nuA,646
182
- unfold/templates/unfold/widgets/radio_option.html,sha256=IZgPx-aWKJuxrSalJ3K50RFd1vwSpb9Qk0yZwfV78_A,368
183
+ unfold/templates/unfold/widgets/radio_option.html,sha256=ZlzyAaGcJjPJbmjjLHqsMgB0kiBSxWJGS-7wSKaIscY,319
183
184
  unfold/templates/unfold/widgets/range.html,sha256=28FBtSUgUcG82vpk_I27Lbs5oWZOV_oMzVhx4wj3-Ik,262
184
185
  unfold/templates/unfold/widgets/related_widget_wrapper.html,sha256=0I6wSu8z_sJPqmX6uZev4mQGIIM336d6kvHdHj36ny4,3831
185
- unfold/templates/unfold/widgets/split_datetime.html,sha256=75gpnx5pF5PaoLfj-e3XOdNEBDWvEdzLK85cawUDjRQ,1688
186
- unfold/templates/unfold/widgets/split_datetime_vertical.html,sha256=xinCH4kkQ-yKUqcSI7-m-_UEzOEKWqvLTjUa3i-e8EM,881
186
+ unfold/templates/unfold/widgets/split_datetime.html,sha256=-3nXwdQitkG_QtMXtQx76kO2_Z1F6xwPYmnjybBDLBo,1606
187
+ unfold/templates/unfold/widgets/split_datetime_vertical.html,sha256=xqDpC57CrYUrQhY7sPCBU4I8qriA4Ay-TXfbVGurPgY,799
187
188
  unfold/templates/unfold/widgets/split_money.html,sha256=AFLUBmzGbY-RXgsfz7gaDxVRhplaIPhXjg_hWYo9xcY,352
188
189
  unfold/templates/unfold/widgets/textarea.html,sha256=-ZLDGrtASero7L-J3VvTNq_KjPAZh_kLVw0Ow3awqXM,144
189
190
  unfold/templates/unfold/widgets/textarea_expandable.html,sha256=4xIGWb20DuwiwumndByrAyh7xF-ReXKLulSpDImX_cs,459
190
191
  unfold/templates/unfold/widgets/time.html,sha256=WXo2LG1v_gBZBSg-zocj7oujMKI0MWLYCIFfB04HMLQ,122
191
192
  unfold/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
192
193
  unfold/templatetags/unfold.py,sha256=jWumX0e2KIyDxz_CmIfyOu7blILxVBqUPtGi1VutaBo,6884
193
- unfold/templatetags/unfold_list.py,sha256=hqSrBD6-8vHV6Ig3QNVmDvfViE_aud_7Ay-br7w0G7E,14193
194
+ unfold/templatetags/unfold_list.py,sha256=q02u7jbMWyDi_6_rOk17W-jW6Yqe9dkuz7Cc_mDp4Ok,14181
194
195
  unfold/typing.py,sha256=1P8PWM2oeaceUJtA5j071RbKEBpHYaux441u7Hd6wv4,643
195
196
  unfold/utils.py,sha256=zZdJE4FmwRd7p5a7sJiAoZjBOJitXJduOq7BulyppWM,4803
196
197
  unfold/views.py,sha256=hQCyeeMa9kcJV1IZeeYqj8PGW7J4QWME8n-5n0UGmiU,1003
197
- unfold/widgets.py,sha256=fgFqWQZwIGvsYmtuAf6oCN71uFUXM_yuD8CEcSFUiUQ,15893
198
- django_unfold-0.33.0.dist-info/LICENSE.md,sha256=Ltk_quRyyvV3J5v3brtOqmibeZSw2Hrb8bY1W3ya0Ik,1077
199
- django_unfold-0.33.0.dist-info/METADATA,sha256=0nTE4zNM1RAKfqsJMNp6DcITOAvDxc1FQflVGuPkUU0,56626
200
- django_unfold-0.33.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
201
- django_unfold-0.33.0.dist-info/RECORD,,
198
+ unfold/widgets.py,sha256=6hQp13LmuhDJ41YxTG70SPJEg0agmHcmUhCtCUwI6SU,16369
199
+ django_unfold-0.35.0.dist-info/LICENSE.md,sha256=Ltk_quRyyvV3J5v3brtOqmibeZSw2Hrb8bY1W3ya0Ik,1077
200
+ django_unfold-0.35.0.dist-info/METADATA,sha256=_lkCvpMErEFx3xEWaKWziYEDzsvy4jxiLlfVkJav5u0,57888
201
+ django_unfold-0.35.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
202
+ django_unfold-0.35.0.dist-info/RECORD,,
unfold/admin.py CHANGED
@@ -84,7 +84,7 @@ FORMFIELD_OVERRIDES = {
84
84
  models.UUIDField: {"widget": UnfoldAdminUUIDInputWidget},
85
85
  models.TextField: {"widget": UnfoldAdminTextareaWidget},
86
86
  models.NullBooleanField: {"widget": UnfoldAdminNullBooleanSelectWidget},
87
- models.BooleanField: {"widget": UnfoldBooleanWidget},
87
+ models.BooleanField: {"widget": UnfoldBooleanSwitchWidget},
88
88
  models.IntegerField: {"widget": UnfoldAdminIntegerFieldWidget},
89
89
  models.BigIntegerField: {"widget": UnfoldAdminBigIntegerFieldWidget},
90
90
  models.DecimalField: {"widget": UnfoldAdminDecimalFieldWidget},
@@ -119,7 +119,9 @@ FORMFIELD_OVERRIDES_INLINE.update(
119
119
  }
120
120
  )
121
121
 
122
- checkbox = UnfoldBooleanWidget({"class": "action-select"}, lambda value: False)
122
+ checkbox = UnfoldBooleanWidget(
123
+ {"class": "action-select", "aria-label": _("Select record")}, lambda value: False
124
+ )
123
125
 
124
126
  helpers.AdminField = UnfoldAdminField
125
127
 
@@ -231,8 +233,10 @@ class ModelAdmin(ModelAdminMixin, BaseModelAdmin):
231
233
  list_horizontal_scrollbar_top = False
232
234
  list_filter_submit = False
233
235
  list_fullwidth = False
236
+ list_disable_select_all = False
234
237
  compressed_fields = False
235
238
  readonly_preprocess_fields = {}
239
+ warn_unsaved_form = False
236
240
  checks_class = UnfoldModelAdminChecks
237
241
 
238
242
  @property
@@ -241,13 +245,14 @@ class ModelAdmin(ModelAdminMixin, BaseModelAdmin):
241
245
  additional_media = forms.Media()
242
246
 
243
247
  for filter in self.list_filter:
244
- if not isinstance(filter, (tuple, list)):
245
- continue
246
-
247
- if hasattr(filter[1], "form_class") and hasattr(
248
- filter[1].form_class, "Media"
248
+ if (
249
+ isinstance(filter, (tuple, list))
250
+ and hasattr(filter[1], "form_class")
251
+ and hasattr(filter[1].form_class, "Media")
249
252
  ):
250
253
  additional_media += forms.Media(filter[1].form_class.Media)
254
+ elif hasattr(filter, "form_class") and hasattr(filter.form_class, "Media"):
255
+ additional_media += forms.Media(filter.form_class.Media)
251
256
 
252
257
  return media + additional_media
253
258
 
@@ -414,13 +419,6 @@ class ModelAdmin(ModelAdminMixin, BaseModelAdmin):
414
419
  if extra_context is None:
415
420
  extra_context = {}
416
421
 
417
- new_formfield_overrides = copy.deepcopy(self.formfield_overrides)
418
- new_formfield_overrides.update(
419
- {models.BooleanField: {"widget": UnfoldBooleanSwitchWidget}}
420
- )
421
-
422
- self.formfield_overrides = new_formfield_overrides
423
-
424
422
  actions = []
425
423
  if object_id:
426
424
  for action in self.get_actions_detail(request, object_id):
@@ -41,12 +41,23 @@ class ValueMixin:
41
41
  )
42
42
 
43
43
 
44
+ class MultiValueMixin:
45
+ def value(self) -> Optional[List[str]]:
46
+ return (
47
+ self.lookup_val
48
+ if self.lookup_val not in EMPTY_VALUES
49
+ and isinstance(self.lookup_val, List)
50
+ and len(self.lookup_val) > 0
51
+ else self.lookup_val
52
+ )
53
+
54
+
44
55
  class DropdownMixin:
45
56
  template = "unfold/filters/filters_field.html"
46
57
  form_class = DropdownForm
47
58
  all_option = ["", _("All")]
48
59
 
49
- def queryset(self, request, queryset) -> QuerySet:
60
+ def queryset(self, request: HttpRequest, queryset: QuerySet) -> QuerySet:
50
61
  if self.value() not in EMPTY_VALUES:
51
62
  return super().queryset(request, queryset)
52
63
 
@@ -112,11 +123,23 @@ class DropdownFilter(admin.SimpleListFilter):
112
123
  name=self.parameter_name,
113
124
  choices=[self.all_option, *self.lookup_choices],
114
125
  data={self.parameter_name: self.value()},
126
+ multiple=self.multiple if hasattr(self, "multiple") else False,
115
127
  ),
116
128
  },
117
129
  )
118
130
 
119
131
 
132
+ class MultipleDropdownFilter(DropdownFilter):
133
+ multiple = True
134
+
135
+ def __init__(self, request, params, model, model_admin):
136
+ self.request = request
137
+ super().__init__(request, params, model, model_admin)
138
+
139
+ def value(self):
140
+ return self.request.GET.getlist(self.parameter_name)
141
+
142
+
120
143
  class ChoicesDropdownFilter(ValueMixin, DropdownMixin, admin.ChoicesFieldListFilter):
121
144
  def choices(self, changelist: ChangeList):
122
145
  choices = [self.all_option, *self.field.flatchoices]
@@ -127,10 +150,15 @@ class ChoicesDropdownFilter(ValueMixin, DropdownMixin, admin.ChoicesFieldListFil
127
150
  name=self.lookup_kwarg,
128
151
  choices=choices,
129
152
  data={self.lookup_kwarg: self.value()},
153
+ multiple=self.multiple if hasattr(self, "multiple") else False,
130
154
  ),
131
155
  }
132
156
 
133
157
 
158
+ class MultipleChoicesDropdownFilter(MultiValueMixin, ChoicesDropdownFilter):
159
+ multiple = True
160
+
161
+
134
162
  class RelatedDropdownFilter(ValueMixin, DropdownMixin, admin.RelatedFieldListFilter):
135
163
  def choices(self, changelist: ChangeList):
136
164
  yield {
@@ -139,10 +167,15 @@ class RelatedDropdownFilter(ValueMixin, DropdownMixin, admin.RelatedFieldListFil
139
167
  name=self.lookup_kwarg,
140
168
  choices=[self.all_option, *self.lookup_choices],
141
169
  data={self.lookup_kwarg: self.value()},
170
+ multiple=self.multiple if hasattr(self, "multiple") else False,
142
171
  ),
143
172
  }
144
173
 
145
174
 
175
+ class MultipleRelatedDropdownFilter(MultiValueMixin, RelatedDropdownFilter):
176
+ multiple = True
177
+
178
+
146
179
  class SingleNumericFilter(admin.FieldListFilter):
147
180
  request = None
148
181
  parameter_name = None
@@ -1,8 +1,10 @@
1
1
  from django import forms
2
+ from django.forms import ChoiceField, MultipleChoiceField
2
3
  from django.utils.translation import gettext_lazy as _
3
4
 
4
5
  from ...widgets import (
5
6
  INPUT_CLASSES,
7
+ UnfoldAdminSelectMultipleWidget,
6
8
  UnfoldAdminSelectWidget,
7
9
  UnfoldAdminSplitDateTimeVerticalWidget,
8
10
  UnfoldAdminTextInputWidget,
@@ -21,15 +23,46 @@ class SearchForm(forms.Form):
21
23
 
22
24
 
23
25
  class DropdownForm(forms.Form):
24
- def __init__(self, name, label, choices, *args, **kwargs):
26
+ widget = UnfoldAdminSelectWidget(
27
+ attrs={
28
+ "data-theme": "admin-autocomplete",
29
+ "class": "admin-autocomplete",
30
+ }
31
+ )
32
+ field = ChoiceField
33
+
34
+ def __init__(self, name, label, choices, multiple=False, *args, **kwargs):
25
35
  super().__init__(*args, **kwargs)
26
36
 
27
- self.fields[name] = forms.ChoiceField(
37
+ if multiple:
38
+ self.widget = UnfoldAdminSelectMultipleWidget(
39
+ attrs={
40
+ "data-theme": "admin-autocomplete",
41
+ "class": "admin-autocomplete",
42
+ }
43
+ )
44
+ self.field = MultipleChoiceField
45
+
46
+ self.fields[name] = self.field(
28
47
  label=label,
29
48
  required=False,
30
49
  choices=choices,
31
- widget=UnfoldAdminSelectWidget,
50
+ widget=self.widget,
51
+ )
52
+
53
+ class Media:
54
+ js = (
55
+ "admin/js/vendor/jquery/jquery.js",
56
+ "admin/js/vendor/select2/select2.full.js",
57
+ "admin/js/jquery.init.js",
58
+ "unfold/js/select2.init.js",
32
59
  )
60
+ css = {
61
+ "screen": (
62
+ "admin/css/vendor/select2/select2.css",
63
+ "admin/css/autocomplete.css",
64
+ ),
65
+ }
33
66
 
34
67
 
35
68
  class SingleNumericForm(forms.Form):
@@ -2,7 +2,7 @@
2
2
 
3
3
  {% with choices.0 as choice %}
4
4
  <div class="flex flex-col mb-6">
5
- <h3 class="font-medium mb-2 text-gray-700 text-sm dark:text-gray-200">{% blocktrans with filter_title=title %}By {{ filter_title }}{% endblocktrans %}</h3>
5
+ <h3 class="font-semibold mb-2 text-gray-900 dark:text-gray-100">{% blocktrans with filter_title=title %}By {{ filter_title }}{% endblocktrans %}</h3>
6
6
 
7
7
  <div class="flex flex-col space-y-4">
8
8
  {% for field in choice.form %}
@@ -2,7 +2,7 @@
2
2
 
3
3
  {% with choices.0 as choice %}
4
4
  <div class="flex flex-col mb-6">
5
- <h3 class="font-medium mb-2 text-gray-700 text-sm dark:text-gray-200">{% blocktrans with filter_title=title %}By {{ filter_title }}{% endblocktrans %}</h3>
5
+ <h3 class="font-semibold mb-2 text-gray-900 dark:text-gray-100">{% blocktrans with filter_title=title %}By {{ filter_title }}{% endblocktrans %}</h3>
6
6
 
7
7
  <div class="flex flex-col space-y-4">
8
8
  {% for field in choice.form %}
@@ -2,7 +2,7 @@
2
2
 
3
3
  {% with choices.0 as choice %}
4
4
  <div class="flex flex-col mb-6">
5
- <h3 class="font-medium mb-2 text-gray-700 text-sm dark:text-gray-200">{% blocktrans with filter_title=title %}By {{ filter_title }}{% endblocktrans %}</h3>
5
+ <h3 class="font-semibold mb-2 text-gray-900 dark:text-gray-100">{% blocktrans with filter_title=title %}By {{ filter_title }}{% endblocktrans %}</h3>
6
6
 
7
7
  <div class="flex flex-row gap-4">
8
8
  {% for field in choice.form %}
@@ -2,7 +2,7 @@
2
2
 
3
3
  {% with choices.0 as choice %}
4
4
  <div class="flex flex-col mb-6">
5
- <h3 class="font-medium mb-2 text-gray-700 text-sm dark:text-gray-200">{% blocktrans with filter_title=title %}By {{ filter_title }}{% endblocktrans %}</h3>
5
+ <h3 class="font-semibold mb-2 text-gray-900 dark:text-gray-100">{% blocktrans with filter_title=title %}By {{ filter_title }}{% endblocktrans %}</h3>
6
6
 
7
7
  {% for field in choice.form %}
8
8
  <div class="flex flex-row flex-wrap group relative{% if field.errors %} errors{% endif %}">