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.
- {django_unfold-0.30.0.dist-info → django_unfold-0.31.0.dist-info}/METADATA +59 -18
- {django_unfold-0.30.0.dist-info → django_unfold-0.31.0.dist-info}/RECORD +72 -71
- unfold/admin.py +30 -11
- unfold/contrib/filters/templates/unfold/filters/filters_numeric_slider.html +3 -3
- unfold/contrib/forms/templates/unfold/forms/array.html +3 -1
- unfold/contrib/forms/templates/unfold/forms/helpers/toolbar.html +6 -6
- unfold/contrib/forms/templates/unfold/forms/wysiwyg.html +1 -1
- unfold/contrib/forms/widgets.py +22 -11
- unfold/contrib/guardian/templates/unfold/guardian/group_form.html +4 -4
- unfold/contrib/guardian/templates/unfold/guardian/user_form.html +4 -4
- unfold/contrib/import_export/templates/admin/import_export/change_form.html +1 -1
- unfold/contrib/import_export/templates/admin/import_export/import_errors.html +1 -1
- unfold/contrib/import_export/templates/admin/import_export/import_preview.html +3 -3
- unfold/contrib/import_export/templates/admin/import_export/import_validation.html +4 -4
- unfold/contrib/inlines/forms.py +1 -2
- unfold/contrib/simple_history/templates/simple_history/object_history_list.html +9 -9
- unfold/contrib/simple_history/templates/simple_history/submit_line.html +1 -1
- unfold/dataclasses.py +10 -1
- unfold/fields.py +1 -1
- unfold/settings.py +1 -0
- unfold/sites.py +39 -15
- unfold/static/unfold/css/styles.css +1 -1
- unfold/static/unfold/js/alpine.anchor.js +1 -0
- unfold/static/unfold/js/alpine.js +2 -2
- unfold/static/unfold/js/alpine.persist.js +1 -1
- unfold/static/unfold/js/app.js +26 -3
- unfold/styles.css +10 -10
- unfold/templates/admin/actions.html +1 -1
- unfold/templates/admin/app_list.html +1 -1
- unfold/templates/admin/base.html +4 -4
- unfold/templates/admin/change_list.html +2 -2
- unfold/templates/admin/change_list_results.html +2 -2
- unfold/templates/admin/delete_confirmation.html +4 -4
- unfold/templates/admin/delete_selected_confirmation.html +4 -4
- unfold/templates/admin/edit_inline/stacked.html +2 -2
- unfold/templates/admin/edit_inline/tabular.html +3 -3
- unfold/templates/admin/filter.html +2 -2
- unfold/templates/admin/includes/fieldset.html +1 -1
- unfold/templates/admin/includes/object_delete_summary.html +1 -1
- unfold/templates/admin/login.html +8 -8
- unfold/templates/admin/object_history.html +4 -4
- unfold/templates/admin/search_form.html +1 -1
- unfold/templates/admin/submit_line.html +7 -5
- unfold/templates/auth/widgets/read_only_password_hash.html +1 -1
- unfold/templates/registration/logged_out.html +1 -1
- unfold/templates/unfold/change_list_filter.html +9 -1
- unfold/templates/unfold/helpers/account_links.html +2 -2
- unfold/templates/unfold/helpers/actions_row.html +4 -4
- unfold/templates/unfold/helpers/app_list.html +48 -38
- unfold/templates/unfold/helpers/app_list_default.html +4 -4
- unfold/templates/unfold/helpers/breadcrumb_item.html +1 -1
- unfold/templates/unfold/helpers/field_readonly_value.html +1 -1
- unfold/templates/unfold/helpers/fieldset_row.html +6 -6
- unfold/templates/unfold/helpers/fieldsets_tabs.html +2 -2
- unfold/templates/unfold/helpers/header.html +1 -1
- unfold/templates/unfold/helpers/help_text.html +1 -1
- unfold/templates/unfold/helpers/history.html +1 -1
- unfold/templates/unfold/helpers/label.html +1 -1
- unfold/templates/unfold/helpers/search.html +7 -4
- unfold/templates/unfold/helpers/search_results.html +2 -2
- unfold/templates/unfold/helpers/tab_action.html +1 -1
- unfold/templates/unfold/helpers/tab_list.html +27 -5
- unfold/templates/unfold/helpers/theme_switch.html +2 -2
- unfold/templates/unfold/layouts/skeleton.html +6 -1
- unfold/templates/unfold/widgets/clearable_file_input.html +14 -6
- unfold/templates/unfold/widgets/clearable_file_input_small.html +4 -4
- unfold/templates/unfold/widgets/split_datetime.html +2 -2
- unfold/templatetags/unfold.py +33 -12
- unfold/templatetags/unfold_list.py +16 -6
- unfold/widgets.py +2 -2
- {django_unfold-0.30.0.dist-info → django_unfold-0.31.0.dist-info}/LICENSE.md +0 -0
- {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.
|
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
|

|
34
34
|

|
35
35
|
|
36
|
-
Unfold is theme for Django admin incorporating most common
|
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
|
60
|
-
- **Colors:** possibility to override default color scheme
|
61
|
-
- **Changeform modes:** display fields in
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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=
|
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=
|
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=
|
27
|
-
unfold/contrib/forms/templates/unfold/forms/helpers/toolbar.html,sha256=
|
28
|
-
unfold/contrib/forms/templates/unfold/forms/wysiwyg.html,sha256=
|
29
|
-
unfold/contrib/forms/widgets.py,sha256=
|
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=
|
38
|
-
unfold/contrib/guardian/templates/unfold/guardian/user_form.html,sha256=
|
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
|
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=
|
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=
|
54
|
-
unfold/contrib/import_export/templates/admin/import_export/import_validation.html,sha256=
|
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=
|
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
|
66
|
-
unfold/contrib/simple_history/templates/simple_history/submit_line.html,sha256=
|
67
|
-
unfold/dataclasses.py,sha256=
|
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=
|
70
|
+
unfold/fields.py,sha256=7sXZDYnXbGKQ9KJtkageVVGNejoAbqoDpzK-mW0TuLw,7448
|
71
71
|
unfold/forms.py,sha256=_HDCPoFUGMGvURIDMh1ut6VrhjkonIPxarYRGn0gi_A,4071
|
72
|
-
unfold/settings.py,sha256
|
73
|
-
unfold/sites.py,sha256=
|
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=
|
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=
|
84
|
-
unfold/static/unfold/js/alpine.
|
85
|
-
unfold/static/unfold/js/
|
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=
|
90
|
-
unfold/templates/admin/actions.html,sha256=
|
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=
|
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=
|
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=
|
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=
|
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=
|
104
|
-
unfold/templates/admin/delete_selected_confirmation.html,sha256=
|
105
|
-
unfold/templates/admin/edit_inline/stacked.html,sha256=
|
106
|
-
unfold/templates/admin/edit_inline/tabular.html,sha256=
|
107
|
-
unfold/templates/admin/filter.html,sha256=
|
108
|
-
unfold/templates/admin/includes/fieldset.html,sha256=
|
109
|
-
unfold/templates/admin/includes/object_delete_summary.html,sha256=
|
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=
|
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=
|
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=
|
116
|
-
unfold/templates/admin/submit_line.html,sha256=
|
117
|
-
unfold/templates/auth/widgets/read_only_password_hash.html,sha256=
|
118
|
-
unfold/templates/registration/logged_out.html,sha256=
|
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=
|
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=
|
134
|
-
unfold/templates/unfold/helpers/actions_row.html,sha256=
|
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=
|
137
|
-
unfold/templates/unfold/helpers/app_list_default.html,sha256=
|
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=
|
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=
|
146
|
-
unfold/templates/unfold/helpers/fieldset_row.html,sha256=
|
147
|
-
unfold/templates/unfold/helpers/fieldsets_tabs.html,sha256=
|
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
|
151
|
-
unfold/templates/unfold/helpers/help_text.html,sha256=
|
152
|
-
unfold/templates/unfold/helpers/history.html,sha256=
|
153
|
-
unfold/templates/unfold/helpers/label.html,sha256=
|
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=
|
162
|
-
unfold/templates/unfold/helpers/search_results.html,sha256=
|
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=
|
167
|
-
unfold/templates/unfold/helpers/tab_list.html,sha256=
|
168
|
-
unfold/templates/unfold/helpers/theme_switch.html,sha256=
|
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=
|
174
|
-
unfold/templates/unfold/widgets/clearable_file_input.html,sha256=
|
175
|
-
unfold/templates/unfold/widgets/clearable_file_input_small.html,sha256=
|
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=
|
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=
|
190
|
-
unfold/templatetags/unfold_list.py,sha256=
|
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=
|
195
|
-
django_unfold-0.
|
196
|
-
django_unfold-0.
|
197
|
-
django_unfold-0.
|
198
|
-
django_unfold-0.
|
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,
|
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
|
-
|
271
|
-
|
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(
|
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(
|
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
|
|