django-unfold 0.53.0__tar.gz → 0.55.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {django_unfold-0.53.0 → django_unfold-0.55.0}/PKG-INFO +24 -11
- {django_unfold-0.53.0 → django_unfold-0.55.0}/README.md +23 -10
- {django_unfold-0.53.0 → django_unfold-0.55.0}/pyproject.toml +2 -2
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/filters/admin/__init__.py +17 -0
- django_unfold-0.55.0/src/unfold/contrib/filters/admin/choice_filters.py +173 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/filters/admin/dropdown_filters.py +15 -1
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/filters/admin/mixins.py +25 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/filters/forms.py +41 -3
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/filters/templates/unfold/filters/filters_date_range.html +1 -1
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/filters/templates/unfold/filters/filters_datetime_range.html +1 -1
- django_unfold-0.55.0/src/unfold/layout.py +23 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/sites.py +17 -6
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/static/admin/js/inlines.js +23 -3
- django_unfold-0.55.0/src/unfold/static/unfold/css/styles.css +1 -0
- django_unfold-0.55.0/src/unfold/static/unfold/fonts/material-symbols/LICENSE +202 -0
- django_unfold-0.55.0/src/unfold/static/unfold/fonts/material-symbols/Material-Symbols-Outlined.woff2 +0 -0
- django_unfold-0.55.0/src/unfold/static/unfold/js/alpine.js +5 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/static/unfold/js/select2.init.js +4 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/styles.css +2 -1
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/change_list.html +15 -13
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/change_list_results.html +1 -1
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/edit_inline/tabular.html +1 -2
- django_unfold-0.55.0/src/unfold/templates/unfold/components/button.html +4 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/components/chart/cohort.html +2 -2
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/change_list_filter.html +2 -2
- django_unfold-0.55.0/src/unfold/templates/unfold/helpers/change_list_filter_actions.html +33 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/edit_inline/tabular_field.html +10 -8
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/field.html +4 -2
- django_unfold-0.55.0/src/unfold/templates/unfold/helpers/form_label.html +7 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/tab_action.html +17 -2
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/widgets/clearable_file_input.html +1 -1
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/widgets/clearable_file_input_small.html +1 -1
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/widgets/radio_option.html +1 -1
- django_unfold-0.55.0/src/unfold/templates/unfold_crispy/display_form.html +9 -0
- django_unfold-0.55.0/src/unfold/templates/unfold_crispy/errors.html +3 -0
- django_unfold-0.55.0/src/unfold/templates/unfold_crispy/field.html +23 -0
- django_unfold-0.55.0/src/unfold/templates/unfold_crispy/inputs.html +7 -0
- django_unfold-0.55.0/src/unfold/templates/unfold_crispy/layout/attrs.html +1 -0
- django_unfold-0.55.0/src/unfold/templates/unfold_crispy/layout/baseinput.html +9 -0
- django_unfold-0.55.0/src/unfold/templates/unfold_crispy/layout/button.html +1 -0
- django_unfold-0.55.0/src/unfold/templates/unfold_crispy/layout/buttonholder.html +3 -0
- django_unfold-0.55.0/src/unfold/templates/unfold_crispy/layout/checkbox.html +19 -0
- django_unfold-0.55.0/src/unfold/templates/unfold_crispy/layout/column.html +3 -0
- django_unfold-0.55.0/src/unfold/templates/unfold_crispy/layout/div.html +4 -0
- django_unfold-0.55.0/src/unfold/templates/unfold_crispy/layout/field_errors.html +7 -0
- django_unfold-0.55.0/src/unfold/templates/unfold_crispy/layout/fieldset.html +9 -0
- django_unfold-0.55.0/src/unfold/templates/unfold_crispy/layout/help_text.html +5 -0
- django_unfold-0.55.0/src/unfold/templates/unfold_crispy/layout/help_text_and_errors.html +3 -0
- django_unfold-0.55.0/src/unfold/templates/unfold_crispy/layout/radio_checkbox_select.html +21 -0
- django_unfold-0.55.0/src/unfold/templates/unfold_crispy/layout/row.html +3 -0
- django_unfold-0.55.0/src/unfold/templates/unfold_crispy/layout/table_inline_formset.html +100 -0
- django_unfold-0.55.0/src/unfold/templates/unfold_crispy/uni_form.html +11 -0
- django_unfold-0.55.0/src/unfold/templates/unfold_crispy/whole_uni_form.html +14 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templatetags/unfold.py +26 -14
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/widgets.py +88 -1
- django_unfold-0.53.0/src/unfold/static/unfold/css/styles.css +0 -1
- django_unfold-0.53.0/src/unfold/static/unfold/fonts/material-symbols/Material-Symbols-Outlined.woff2 +0 -0
- django_unfold-0.53.0/src/unfold/static/unfold/js/alpine.js +0 -5
- django_unfold-0.53.0/src/unfold/templates/unfold/components/button.html +0 -4
- django_unfold-0.53.0/src/unfold/templates/unfold/helpers/change_list_filter_actions.html +0 -31
- django_unfold-0.53.0/src/unfold/templates/unfold/helpers/form_label.html +0 -7
- {django_unfold-0.53.0 → django_unfold-0.55.0}/LICENSE.md +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/__init__.py +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/admin.py +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/apps.py +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/checks.py +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/components.py +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/__init__.py +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/filters/__init__.py +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/filters/admin/autocomplete_filters.py +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/filters/admin/datetime_filters.py +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/filters/admin/numeric_filters.py +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/filters/admin/text_filters.py +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/filters/apps.py +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/filters/static/unfold/filters/css/nouislider.min.css +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/filters/static/unfold/filters/js/DateTimeShortcuts.js +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/filters/static/unfold/filters/js/admin-numeric-filter.js +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/filters/static/unfold/filters/js/nouislider.min.js +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/filters/static/unfold/filters/js/wNumb.min.js +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/filters/templates/unfold/filters/filters_field.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/filters/templates/unfold/filters/filters_numeric_range.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/filters/templates/unfold/filters/filters_numeric_single.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/filters/templates/unfold/filters/filters_numeric_slider.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/forms/__init__.py +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/forms/apps.py +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/forms/static/unfold/forms/css/trix.css +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/forms/static/unfold/forms/js/trix.config.js +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/forms/static/unfold/forms/js/trix.js +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/forms/templates/unfold/forms/array.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/forms/templates/unfold/forms/helpers/toolbar.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/forms/templates/unfold/forms/wysiwyg.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/forms/widgets.py +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/guardian/__init__.py +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/guardian/apps.py +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/guardian/templates/admin/guardian/model/change_form.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/guardian/templates/admin/guardian/model/field.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/guardian/templates/admin/guardian/model/obj_perms_manage.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/guardian/templates/admin/guardian/model/obj_perms_manage_group.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/guardian/templates/admin/guardian/model/obj_perms_manage_user.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/guardian/templates/unfold/guardian/group_form.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/guardian/templates/unfold/guardian/user_form.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/import_export/__init__.py +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/import_export/apps.py +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/import_export/forms.py +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/import_export/templates/admin/import_export/base.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/import_export/templates/admin/import_export/change_form.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/import_export/templates/admin/import_export/change_list_export.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/import_export/templates/admin/import_export/change_list_export_item.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/import_export/templates/admin/import_export/change_list_import_export.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/import_export/templates/admin/import_export/change_list_import_item.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/import_export/templates/admin/import_export/export.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/import_export/templates/admin/import_export/import.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/import_export/templates/admin/import_export/import_confirm.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/import_export/templates/admin/import_export/import_errors.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/import_export/templates/admin/import_export/import_form.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/import_export/templates/admin/import_export/import_preview.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/import_export/templates/admin/import_export/import_validation.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/import_export/templates/admin/import_export/resource_fields_list.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/inlines/__init__.py +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/inlines/admin.py +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/inlines/apps.py +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/inlines/checks.py +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/inlines/forms.py +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/simple_history/__init__.py +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/simple_history/apps.py +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/simple_history/templates/simple_history/object_history.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/simple_history/templates/simple_history/object_history_form.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/simple_history/templates/simple_history/object_history_list.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/simple_history/templates/simple_history/submit_line.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/dataclasses.py +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/decorators.py +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/enums.py +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/exceptions.py +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/fields.py +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/forms.py +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/mixins/__init__.py +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/mixins/action_model_admin.py +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/mixins/base_model_admin.py +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/overrides.py +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/paginator.py +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/sections.py +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/settings.py +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/static/admin/js/admin/RelatedObjectLookups.js +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/static/unfold/css/simplebar.css +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/static/unfold/fonts/inter/Inter-Bold.woff2 +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/static/unfold/fonts/inter/Inter-Medium.woff2 +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/static/unfold/fonts/inter/Inter-Regular.woff2 +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/static/unfold/fonts/inter/Inter-SemiBold.woff2 +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/static/unfold/fonts/inter/styles.css +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/static/unfold/fonts/material-symbols/styles.css +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/static/unfold/js/alpine.anchor.js +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/static/unfold/js/alpine.persist.js +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/static/unfold/js/alpine.resize.js +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/static/unfold/js/alpine.sort.js +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/static/unfold/js/app.js +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/static/unfold/js/chart.js +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/static/unfold/js/htmx.js +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/static/unfold/js/simplebar.js +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/actions.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/app_index.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/app_list.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/auth/user/add_form.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/auth/user/change_password.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/base.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/base_site.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/change_form.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/change_form_object_tools.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/change_list_object_tools.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/date_hierarchy.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/delete_confirmation.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/delete_selected_confirmation.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/edit_inline/stacked.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/filter.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/includes/fieldset.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/includes/object_delete_summary.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/index.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/login.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/nav_sidebar.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/object_history.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/pagination.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/search_form.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/admin/submit_line.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/auth/widgets/read_only_password_hash.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/registration/logged_out.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/registration/password_change_done.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/registration/password_change_form.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/components/card.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/components/chart/bar.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/components/chart/line.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/components/container.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/components/flex.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/components/icon.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/components/navigation.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/components/progress.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/components/separator.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/components/table.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/components/text.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/components/title.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/components/tracker.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/account_links.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/actions_row.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/add_link.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/app_list.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/app_list_default.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/attrs.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/boolean.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/breadcrumb_item.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/change_list_actions.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/delete_submit_line.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/display_dropdown.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/display_header.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/display_label.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/edit_inline/tabular_delete.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/edit_inline/tabular_error.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/edit_inline/tabular_heading.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/edit_inline/tabular_row.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/edit_inline/tabular_title.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/empty_results.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/field_readonly.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/field_readonly_value.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/fieldset_row.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/fieldset_row_checkbox.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/fieldset_row_field.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/fieldsets_tabs.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/form_errors.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/header.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/header_back_button.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/help_text.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/history.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/label.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/language_switch.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/messages/debug.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/messages/error.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/messages/errornote.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/messages/info.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/messages/success.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/messages/warning.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/messages.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/navigation.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/navigation_header.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/pagination_current_item.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/pagination_default.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/pagination_ellipsis.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/pagination_infinite.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/search.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/search_results.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/site_branding.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/site_dropdown.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/site_icon.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/site_logo.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/submit.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/tab_actions.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/tab_items.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/tab_list.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/theme_switch.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/userlinks.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/helpers/welcomemsg.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/layouts/base.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/layouts/base_simple.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/layouts/skeleton.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/templatetags/preserve_changelist_filters.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/widgets/date.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/widgets/foreign_key_raw_id.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/widgets/radio.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/widgets/range.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/widgets/related_widget_wrapper.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/widgets/split_datetime.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/widgets/split_datetime_vertical.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/widgets/split_money.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/widgets/textarea.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/widgets/time.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templates/unfold/widgets/url.html +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templatetags/__init__.py +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/templatetags/unfold_list.py +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/typing.py +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/utils.py +0 -0
- {django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/views.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.3
|
2
2
|
Name: django-unfold
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.55.0
|
4
4
|
Summary: Modern Django admin theme for seamless interface development
|
5
5
|
License: MIT
|
6
6
|
Keywords: django,admin,tailwind,theme
|
@@ -27,6 +27,7 @@ Description-Content-Type: text/markdown
|
|
27
27
|
## Unfold Django Admin Theme
|
28
28
|
|
29
29
|
[](https://pypi.org/project/django-unfold/)
|
30
|
+
[](https://discord.gg/9sQj9MEbNz)
|
30
31
|
[](https://github.com/unfoldadmin/django-unfold/actions?query=workflow%3Arelease)
|
31
32
|

|
32
33
|

|
@@ -43,26 +44,31 @@ Transform your Django admin into a powerful, modern administrative interface wit
|
|
43
44
|
|
44
45
|
Need assistance with implementing Unfold or require custom Django development? Professional consulting and development services are available to help transform your Django admin interface and enhance your web applications. Whether migrating from the native Django admin to Unfold or seeking expert technical guidance, reach out to discuss your project requirements and explore development possibilities. [Get in touch](https://unfoldadmin.com/consulting?utm_medium=github&utm_source=unfold) to learn more about available services.
|
45
46
|
|
47
|
+
## Unfold Studio
|
48
|
+
|
49
|
+
Unfold Studio is a theme customizer for Django admin that helps you create a branded interface. You can customize colors, upload your logo, and adjust the style without coding. The tool is currently in development, and [you can join the waitlist](https://unfoldadmin.com/studio/) to be notified when it's available.
|
50
|
+
|
46
51
|
## Fresh Features & Enhancements
|
47
52
|
|
48
|
-
- **
|
53
|
+
- **Conditional fields:** Show or hide fields dynamically based on the values of other fields in the form
|
54
|
+
- **Infinite paginator:** Efficiently handle large datasets with seamless pagination that reduces server load
|
55
|
+
- **Checkbox & radio filters:** Enhanced filter options with checkbox and radio interfaces for intuitive filtering
|
49
56
|
- **Site dropdown:** Configurable dropdown menu in the header area for managing custom navigation links
|
50
57
|
- **Dropdown actions:** Organize action items in customizable dropdown menus
|
51
|
-
- **Custom tab navigation:** Create flexible, structured tab navigation with customizable routing
|
52
|
-
|
53
58
|
|
54
59
|
## Core Features & Capabilities
|
55
60
|
|
56
61
|
- **Visual Interface**: Provides a modern user interface based on the Tailwind CSS framework.
|
57
|
-
- **Sidebar
|
58
|
-
- **Dark
|
59
|
-
- **Flexible
|
60
|
-
- **Advanced
|
61
|
-
- **Dashboard
|
62
|
-
- **UI
|
63
|
-
- **WYSIWYG
|
62
|
+
- **Sidebar navigation**: Simplifies the creation of sidebar menus with icons, collapsible sections, and more.
|
63
|
+
- **Dark mode support**: Includes both light and dark mode themes.
|
64
|
+
- **Flexible actions**: Provides multiple ways to define actions throughout the admin interface.
|
65
|
+
- **Advanced filters**: Features custom dropdowns, autocomplete, numeric, datetime, and text field filters.
|
66
|
+
- **Dashboard tools**: Includes helpers for building custom dashboard pages.
|
67
|
+
- **UI components**: Offers reusable interface components such as cards, buttons, and charts.
|
68
|
+
- **WYSIWYG editor**: Built-in support for WYSIWYG editing through Trix.
|
64
69
|
- **Array widget:** Built-in widget for `django.contrib.postgres.fields.ArrayField`
|
65
70
|
- **Inline tabs:** Group inlines into tab navigation in the change form
|
71
|
+
- **Conditional fields:** Show or hide fields dynamically based on the values of other fields in the form
|
66
72
|
- **Model tabs:** Allow defining custom tab navigation for models
|
67
73
|
- **Fieldset tabs:** Merge multiple fieldsets into tabs in the change form
|
68
74
|
- **Sortable inlines:** Allow sorting inlines by dragging and dropping
|
@@ -73,9 +79,16 @@ Need assistance with implementing Unfold or require custom Django development? P
|
|
73
79
|
- **Font colors:** Adjust font colors for better readability
|
74
80
|
- **Changeform modes:** Display fields in compressed mode in the change form
|
75
81
|
- **Language switcher:** Allow changing language directly from the admin area
|
82
|
+
- **Infinite paginator:** Efficiently handle large datasets with seamless pagination that reduces server load
|
76
83
|
- **Parallel admin:** Supports [running the default admin](https://unfoldadmin.com/blog/migrating-django-admin-unfold/?utm_medium=github&utm_source=unfold) alongside Unfold.
|
77
84
|
- **Third-party packages:** Provides default support for multiple popular applications.
|
78
85
|
- **Configuration:** Allows basic options to be changed in `settings.py`.
|
79
86
|
- **Dependencies:** Built entirely on `django.contrib.admin`.
|
80
87
|
- **VS Code:** Project configuration and development container included.
|
81
88
|
|
89
|
+
## Credits
|
90
|
+
|
91
|
+
- Icons: [Material Symbols](https://github.com/google/material-design-icons)
|
92
|
+
- Font: [Inter](https://github.com/rsms/inter)
|
93
|
+
- Charts: [Chart.js](https://github.com/chartjs/Chart.js)
|
94
|
+
|
@@ -3,6 +3,7 @@
|
|
3
3
|
## Unfold Django Admin Theme
|
4
4
|
|
5
5
|
[](https://pypi.org/project/django-unfold/)
|
6
|
+
[](https://discord.gg/9sQj9MEbNz)
|
6
7
|
[](https://github.com/unfoldadmin/django-unfold/actions?query=workflow%3Arelease)
|
7
8
|

|
8
9
|

|
@@ -19,26 +20,31 @@ Transform your Django admin into a powerful, modern administrative interface wit
|
|
19
20
|
|
20
21
|
Need assistance with implementing Unfold or require custom Django development? Professional consulting and development services are available to help transform your Django admin interface and enhance your web applications. Whether migrating from the native Django admin to Unfold or seeking expert technical guidance, reach out to discuss your project requirements and explore development possibilities. [Get in touch](https://unfoldadmin.com/consulting?utm_medium=github&utm_source=unfold) to learn more about available services.
|
21
22
|
|
23
|
+
## Unfold Studio
|
24
|
+
|
25
|
+
Unfold Studio is a theme customizer for Django admin that helps you create a branded interface. You can customize colors, upload your logo, and adjust the style without coding. The tool is currently in development, and [you can join the waitlist](https://unfoldadmin.com/studio/) to be notified when it's available.
|
26
|
+
|
22
27
|
## Fresh Features & Enhancements
|
23
28
|
|
24
|
-
- **
|
29
|
+
- **Conditional fields:** Show or hide fields dynamically based on the values of other fields in the form
|
30
|
+
- **Infinite paginator:** Efficiently handle large datasets with seamless pagination that reduces server load
|
31
|
+
- **Checkbox & radio filters:** Enhanced filter options with checkbox and radio interfaces for intuitive filtering
|
25
32
|
- **Site dropdown:** Configurable dropdown menu in the header area for managing custom navigation links
|
26
33
|
- **Dropdown actions:** Organize action items in customizable dropdown menus
|
27
|
-
- **Custom tab navigation:** Create flexible, structured tab navigation with customizable routing
|
28
|
-
|
29
34
|
|
30
35
|
## Core Features & Capabilities
|
31
36
|
|
32
37
|
- **Visual Interface**: Provides a modern user interface based on the Tailwind CSS framework.
|
33
|
-
- **Sidebar
|
34
|
-
- **Dark
|
35
|
-
- **Flexible
|
36
|
-
- **Advanced
|
37
|
-
- **Dashboard
|
38
|
-
- **UI
|
39
|
-
- **WYSIWYG
|
38
|
+
- **Sidebar navigation**: Simplifies the creation of sidebar menus with icons, collapsible sections, and more.
|
39
|
+
- **Dark mode support**: Includes both light and dark mode themes.
|
40
|
+
- **Flexible actions**: Provides multiple ways to define actions throughout the admin interface.
|
41
|
+
- **Advanced filters**: Features custom dropdowns, autocomplete, numeric, datetime, and text field filters.
|
42
|
+
- **Dashboard tools**: Includes helpers for building custom dashboard pages.
|
43
|
+
- **UI components**: Offers reusable interface components such as cards, buttons, and charts.
|
44
|
+
- **WYSIWYG editor**: Built-in support for WYSIWYG editing through Trix.
|
40
45
|
- **Array widget:** Built-in widget for `django.contrib.postgres.fields.ArrayField`
|
41
46
|
- **Inline tabs:** Group inlines into tab navigation in the change form
|
47
|
+
- **Conditional fields:** Show or hide fields dynamically based on the values of other fields in the form
|
42
48
|
- **Model tabs:** Allow defining custom tab navigation for models
|
43
49
|
- **Fieldset tabs:** Merge multiple fieldsets into tabs in the change form
|
44
50
|
- **Sortable inlines:** Allow sorting inlines by dragging and dropping
|
@@ -49,8 +55,15 @@ Need assistance with implementing Unfold or require custom Django development? P
|
|
49
55
|
- **Font colors:** Adjust font colors for better readability
|
50
56
|
- **Changeform modes:** Display fields in compressed mode in the change form
|
51
57
|
- **Language switcher:** Allow changing language directly from the admin area
|
58
|
+
- **Infinite paginator:** Efficiently handle large datasets with seamless pagination that reduces server load
|
52
59
|
- **Parallel admin:** Supports [running the default admin](https://unfoldadmin.com/blog/migrating-django-admin-unfold/?utm_medium=github&utm_source=unfold) alongside Unfold.
|
53
60
|
- **Third-party packages:** Provides default support for multiple popular applications.
|
54
61
|
- **Configuration:** Allows basic options to be changed in `settings.py`.
|
55
62
|
- **Dependencies:** Built entirely on `django.contrib.admin`.
|
56
63
|
- **VS Code:** Project configuration and development container included.
|
64
|
+
|
65
|
+
## Credits
|
66
|
+
|
67
|
+
- Icons: [Material Symbols](https://github.com/google/material-design-icons)
|
68
|
+
- Font: [Inter](https://github.com/rsms/inter)
|
69
|
+
- Charts: [Chart.js](https://github.com/chartjs/Chart.js)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
[tool.poetry]
|
2
2
|
name = "django-unfold"
|
3
|
-
version = "0.
|
3
|
+
version = "0.55.0"
|
4
4
|
description = "Modern Django admin theme for seamless interface development"
|
5
5
|
license = "MIT"
|
6
6
|
readme = "README.md"
|
@@ -90,7 +90,7 @@ legacy_tox_ini = """
|
|
90
90
|
[tox]
|
91
91
|
isolated_build = true
|
92
92
|
envlist =
|
93
|
-
python{39,310,311,312,313}-django{42,50,51}
|
93
|
+
python{39,310,311,312,313}-django{42,50,51,52}
|
94
94
|
|
95
95
|
[testenv]
|
96
96
|
skip_install = true
|
@@ -2,6 +2,15 @@ from unfold.contrib.filters.admin.autocomplete_filters import (
|
|
2
2
|
AutocompleteSelectFilter,
|
3
3
|
AutocompleteSelectMultipleFilter,
|
4
4
|
)
|
5
|
+
from unfold.contrib.filters.admin.choice_filters import (
|
6
|
+
AllValuesCheckboxFilter,
|
7
|
+
BooleanRadioFilter,
|
8
|
+
CheckboxFilter,
|
9
|
+
ChoicesCheckboxFilter,
|
10
|
+
ChoicesRadioFilter,
|
11
|
+
RadioFilter,
|
12
|
+
RelatedCheckboxFilter,
|
13
|
+
)
|
5
14
|
from unfold.contrib.filters.admin.datetime_filters import (
|
6
15
|
RangeDateFilter,
|
7
16
|
RangeDateTimeFilter,
|
@@ -23,12 +32,20 @@ from unfold.contrib.filters.admin.numeric_filters import (
|
|
23
32
|
from unfold.contrib.filters.admin.text_filters import FieldTextFilter, TextFilter
|
24
33
|
|
25
34
|
__all__ = [
|
35
|
+
"AllValuesCheckboxFilter",
|
36
|
+
"BooleanRadioFilter",
|
37
|
+
"CheckboxFilter",
|
38
|
+
"ChoicesCheckboxFilter",
|
39
|
+
"ChoicesRadioFilter",
|
40
|
+
"MultipleRelatedCheckboxFilter",
|
41
|
+
"RadioFilter",
|
26
42
|
"ChoicesDropdownFilter",
|
27
43
|
"MultipleChoicesDropdownFilter",
|
28
44
|
"DropdownFilter",
|
29
45
|
"RelatedDropdownFilter",
|
30
46
|
"MultipleDropdownFilter",
|
31
47
|
"MultipleRelatedDropdownFilter",
|
48
|
+
"RelatedCheckboxFilter",
|
32
49
|
"FieldTextFilter",
|
33
50
|
"TextFilter",
|
34
51
|
"RangeDateFilter",
|
@@ -0,0 +1,173 @@
|
|
1
|
+
from collections.abc import Generator
|
2
|
+
from typing import Any
|
3
|
+
|
4
|
+
from django.contrib import admin
|
5
|
+
from django.contrib.admin.views.main import ChangeList
|
6
|
+
from django.core.validators import EMPTY_VALUES
|
7
|
+
from django.db.models import QuerySet
|
8
|
+
from django.http import HttpRequest
|
9
|
+
from django.utils.translation import gettext_lazy as _
|
10
|
+
|
11
|
+
from unfold.contrib.filters.admin.mixins import (
|
12
|
+
ChoicesMixin,
|
13
|
+
MultiValueMixin,
|
14
|
+
ValueMixin,
|
15
|
+
)
|
16
|
+
from unfold.contrib.filters.forms import CheckboxForm, HorizontalRadioForm, RadioForm
|
17
|
+
|
18
|
+
|
19
|
+
class RadioFilter(admin.SimpleListFilter):
|
20
|
+
template = "unfold/filters/filters_field.html"
|
21
|
+
form_class = RadioForm
|
22
|
+
all_option = ["", _("All")]
|
23
|
+
|
24
|
+
def choices(self, changelist: ChangeList) -> tuple[dict[str, Any], ...]:
|
25
|
+
add_facets = changelist.add_facets
|
26
|
+
facet_counts = self.get_facet_queryset(changelist) if add_facets else None
|
27
|
+
choices = []
|
28
|
+
|
29
|
+
if self.all_option:
|
30
|
+
choices = [self.all_option]
|
31
|
+
|
32
|
+
if add_facets:
|
33
|
+
for i, (lookup, title) in enumerate(self.lookup_choices):
|
34
|
+
if (count := facet_counts.get(f"{i}__c", -1)) != -1:
|
35
|
+
title = f"{title} ({count})"
|
36
|
+
else:
|
37
|
+
title = f"{title} (-)"
|
38
|
+
|
39
|
+
choices.append((lookup, title))
|
40
|
+
else:
|
41
|
+
choices.extend(self.lookup_choices)
|
42
|
+
|
43
|
+
return (
|
44
|
+
{
|
45
|
+
"form": self.form_class(
|
46
|
+
label=_(" By %(filter_title)s ") % {"filter_title": self.title},
|
47
|
+
name=self.parameter_name,
|
48
|
+
choices=choices,
|
49
|
+
data={self.parameter_name: self.value()},
|
50
|
+
),
|
51
|
+
},
|
52
|
+
)
|
53
|
+
|
54
|
+
|
55
|
+
class CheckboxFilter(RadioFilter):
|
56
|
+
form_class = CheckboxForm
|
57
|
+
all_option = None
|
58
|
+
|
59
|
+
def value(self) -> list[Any]:
|
60
|
+
return self.request.GET.getlist(self.parameter_name)
|
61
|
+
|
62
|
+
|
63
|
+
class ChoicesRadioFilter(ValueMixin, ChoicesMixin, admin.ChoicesFieldListFilter):
|
64
|
+
form_class = RadioForm
|
65
|
+
all_option = ["", _("All")]
|
66
|
+
|
67
|
+
|
68
|
+
class ChoicesCheckboxFilter(
|
69
|
+
MultiValueMixin, ChoicesMixin, admin.ChoicesFieldListFilter
|
70
|
+
):
|
71
|
+
form_class = CheckboxForm
|
72
|
+
all_option = None
|
73
|
+
|
74
|
+
|
75
|
+
class BooleanRadioFilter(ValueMixin, admin.BooleanFieldListFilter):
|
76
|
+
template = "unfold/filters/filters_field.html"
|
77
|
+
form_class = HorizontalRadioForm
|
78
|
+
all_option = ["", _("All")]
|
79
|
+
|
80
|
+
def choices(self, changelist: ChangeList) -> Generator[dict[str, Any], None, None]:
|
81
|
+
add_facets = changelist.add_facets
|
82
|
+
facet_counts = self.get_facet_queryset(changelist) if add_facets else None
|
83
|
+
|
84
|
+
if add_facets:
|
85
|
+
choices = [
|
86
|
+
self.all_option,
|
87
|
+
*[
|
88
|
+
("1", f"{_('Yes')} ({facet_counts['true__c']})"),
|
89
|
+
("0", f"{_('No')} ({facet_counts['false__c']})"),
|
90
|
+
],
|
91
|
+
]
|
92
|
+
else:
|
93
|
+
choices = [
|
94
|
+
self.all_option,
|
95
|
+
*[
|
96
|
+
("1", _("Yes")),
|
97
|
+
("0", _("No")),
|
98
|
+
],
|
99
|
+
]
|
100
|
+
|
101
|
+
yield {
|
102
|
+
"form": self.form_class(
|
103
|
+
label=_(" By %(filter_title)s ") % {"filter_title": self.title},
|
104
|
+
name=self.lookup_kwarg,
|
105
|
+
choices=choices,
|
106
|
+
data={self.lookup_kwarg: self.value()},
|
107
|
+
),
|
108
|
+
}
|
109
|
+
|
110
|
+
|
111
|
+
class RelatedCheckboxFilter(MultiValueMixin, admin.RelatedFieldListFilter):
|
112
|
+
template = "unfold/filters/filters_field.html"
|
113
|
+
form_class = CheckboxForm
|
114
|
+
|
115
|
+
def queryset(self, request: HttpRequest, queryset: QuerySet) -> QuerySet:
|
116
|
+
if self.value() not in EMPTY_VALUES:
|
117
|
+
return super().queryset(request, queryset)
|
118
|
+
|
119
|
+
return queryset
|
120
|
+
|
121
|
+
def choices(self, changelist: ChangeList) -> Generator[dict[str, Any], None, None]:
|
122
|
+
add_facets = changelist.add_facets
|
123
|
+
facet_counts = self.get_facet_queryset(changelist) if add_facets else None
|
124
|
+
|
125
|
+
if add_facets:
|
126
|
+
choices = []
|
127
|
+
|
128
|
+
for pk_val, val in self.lookup_choices:
|
129
|
+
count = facet_counts[f"{pk_val}__c"]
|
130
|
+
choice = (pk_val, f"{val} ({count})")
|
131
|
+
choices.append(choice)
|
132
|
+
else:
|
133
|
+
choices = self.lookup_choices
|
134
|
+
|
135
|
+
yield {
|
136
|
+
"form": self.form_class(
|
137
|
+
label=_(" By %(filter_title)s ") % {"filter_title": self.title},
|
138
|
+
name=self.lookup_kwarg,
|
139
|
+
choices=choices,
|
140
|
+
data={self.lookup_kwarg: self.value()},
|
141
|
+
),
|
142
|
+
}
|
143
|
+
|
144
|
+
|
145
|
+
class AllValuesCheckboxFilter(MultiValueMixin, admin.AllValuesFieldListFilter):
|
146
|
+
template = "unfold/filters/filters_field.html"
|
147
|
+
form_class = CheckboxForm
|
148
|
+
|
149
|
+
def choices(self, changelist: ChangeList) -> Generator[dict[str, Any], None, None]:
|
150
|
+
add_facets = changelist.add_facets
|
151
|
+
facet_counts = self.get_facet_queryset(changelist) if add_facets else None
|
152
|
+
|
153
|
+
if add_facets:
|
154
|
+
choices = []
|
155
|
+
|
156
|
+
for i, val in enumerate(self.lookup_choices):
|
157
|
+
count = facet_counts[f"{i}__c"]
|
158
|
+
choice = (val, f"{val} ({count})")
|
159
|
+
choices.append(choice)
|
160
|
+
else:
|
161
|
+
choices = [[val, val] for _i, val in enumerate(self.lookup_choices)]
|
162
|
+
|
163
|
+
if len(choices) == 0:
|
164
|
+
return
|
165
|
+
|
166
|
+
yield {
|
167
|
+
"form": self.form_class(
|
168
|
+
label=_(" By %(filter_title)s ") % {"filter_title": self.title},
|
169
|
+
name=self.lookup_kwarg,
|
170
|
+
choices=choices,
|
171
|
+
data={self.lookup_kwarg: self.value()},
|
172
|
+
),
|
173
|
+
}
|
{django_unfold-0.53.0 → django_unfold-0.55.0}/src/unfold/contrib/filters/admin/dropdown_filters.py
RENAMED
@@ -86,11 +86,25 @@ class RelatedDropdownFilter(ValueMixin, DropdownMixin, admin.RelatedFieldListFil
|
|
86
86
|
self.request = request
|
87
87
|
|
88
88
|
def choices(self, changelist: ChangeList) -> Generator[dict[str, Any], None, None]:
|
89
|
+
add_facets = changelist.add_facets
|
90
|
+
facet_counts = self.get_facet_queryset(changelist) if add_facets else None
|
91
|
+
|
92
|
+
if add_facets:
|
93
|
+
choices = [self.all_option]
|
94
|
+
|
95
|
+
for pk_val, val in self.lookup_choices:
|
96
|
+
if add_facets:
|
97
|
+
count = facet_counts[f"{pk_val}__c"]
|
98
|
+
choice = (pk_val, f"{val} ({count})")
|
99
|
+
choices.append(choice)
|
100
|
+
else:
|
101
|
+
choices = [self.all_option, *self.lookup_choices]
|
102
|
+
|
89
103
|
yield {
|
90
104
|
"form": self.form_class(
|
91
105
|
label=_(" By %(filter_title)s ") % {"filter_title": self.title},
|
92
106
|
name=self.lookup_kwarg,
|
93
|
-
choices=
|
107
|
+
choices=choices,
|
94
108
|
data={self.lookup_kwarg: self.value()},
|
95
109
|
multiple=self.multiple if hasattr(self, "multiple") else False,
|
96
110
|
),
|
@@ -51,6 +51,31 @@ class DropdownMixin:
|
|
51
51
|
return queryset
|
52
52
|
|
53
53
|
|
54
|
+
class ChoicesMixin:
|
55
|
+
template = "unfold/filters/filters_field.html"
|
56
|
+
|
57
|
+
def choices(self, changelist: ChangeList) -> Generator[dict[str, Any], None, None]:
|
58
|
+
add_facets = changelist.add_facets
|
59
|
+
facet_counts = self.get_facet_queryset(changelist) if add_facets else None
|
60
|
+
choices = [self.all_option] if self.all_option else []
|
61
|
+
|
62
|
+
for i, choice in enumerate(self.field.flatchoices):
|
63
|
+
if add_facets:
|
64
|
+
count = facet_counts[f"{i}__c"]
|
65
|
+
choice = (choice[0], f"{choice[1]} ({count})")
|
66
|
+
|
67
|
+
choices.append(choice)
|
68
|
+
|
69
|
+
yield {
|
70
|
+
"form": self.form_class(
|
71
|
+
label=_(" By %(filter_title)s ") % {"filter_title": self.title},
|
72
|
+
name=self.lookup_kwarg,
|
73
|
+
choices=choices,
|
74
|
+
data={self.lookup_kwarg: self.value()},
|
75
|
+
),
|
76
|
+
}
|
77
|
+
|
78
|
+
|
54
79
|
class RangeNumericMixin:
|
55
80
|
request = None
|
56
81
|
parameter_name = None
|
@@ -1,14 +1,20 @@
|
|
1
1
|
from django import forms
|
2
|
+
from django.contrib.admin.options import HORIZONTAL
|
2
3
|
from django.contrib.admin.widgets import AutocompleteSelect, AutocompleteSelectMultiple
|
3
4
|
from django.db.models import Field as ModelField
|
4
|
-
from django.forms import
|
5
|
+
from django.forms import (
|
6
|
+
ChoiceField,
|
7
|
+
ModelMultipleChoiceField,
|
8
|
+
MultipleChoiceField,
|
9
|
+
)
|
5
10
|
from django.http import HttpRequest
|
6
11
|
from django.utils.translation import gettext_lazy as _
|
7
12
|
|
8
13
|
from unfold.admin import ModelAdmin
|
9
|
-
|
10
|
-
from ...widgets import (
|
14
|
+
from unfold.widgets import (
|
11
15
|
INPUT_CLASSES,
|
16
|
+
UnfoldAdminCheckboxSelectMultiple,
|
17
|
+
UnfoldAdminRadioSelectWidget,
|
12
18
|
UnfoldAdminSelectMultipleWidget,
|
13
19
|
UnfoldAdminSelectWidget,
|
14
20
|
UnfoldAdminSplitDateTimeVerticalWidget,
|
@@ -71,6 +77,38 @@ class AutocompleteDropdownForm(forms.Form):
|
|
71
77
|
}
|
72
78
|
|
73
79
|
|
80
|
+
class CheckboxForm(forms.Form):
|
81
|
+
field = MultipleChoiceField
|
82
|
+
widget = UnfoldAdminCheckboxSelectMultiple
|
83
|
+
|
84
|
+
def __init__(
|
85
|
+
self,
|
86
|
+
name: str,
|
87
|
+
label: str,
|
88
|
+
choices: tuple,
|
89
|
+
*args,
|
90
|
+
**kwargs,
|
91
|
+
) -> None:
|
92
|
+
super().__init__(*args, **kwargs)
|
93
|
+
|
94
|
+
self.fields[name] = self.field(
|
95
|
+
label=label,
|
96
|
+
required=False,
|
97
|
+
choices=choices,
|
98
|
+
widget=self.widget,
|
99
|
+
)
|
100
|
+
|
101
|
+
|
102
|
+
class RadioForm(CheckboxForm):
|
103
|
+
field = ChoiceField
|
104
|
+
widget = UnfoldAdminRadioSelectWidget
|
105
|
+
|
106
|
+
|
107
|
+
class HorizontalRadioForm(RadioForm):
|
108
|
+
horizontal = True
|
109
|
+
widget = UnfoldAdminRadioSelectWidget(radio_style=HORIZONTAL)
|
110
|
+
|
111
|
+
|
74
112
|
class DropdownForm(forms.Form):
|
75
113
|
widget = UnfoldAdminSelectWidget(
|
76
114
|
attrs={
|
@@ -4,7 +4,7 @@
|
|
4
4
|
<div class="flex flex-col">
|
5
5
|
<h3 class="font-semibold mb-2 text-font-important-light dark:text-font-important-dark">{% blocktrans with filter_title=title %}By {{ filter_title }}{% endblocktrans %}</h3>
|
6
6
|
|
7
|
-
<div class="flex flex-col space-y-
|
7
|
+
<div class="flex flex-col space-y-2">
|
8
8
|
{% for field in choice.form %}
|
9
9
|
<div class="flex flex-row flex-wrap group relative{% if field.errors %} errors{% endif %}">
|
10
10
|
{{ field }}
|
@@ -4,7 +4,7 @@
|
|
4
4
|
<div class="flex flex-col">
|
5
5
|
<h3 class="font-semibold mb-2 text-font-important-light dark:text-font-important-dark">{% blocktrans with filter_title=title %}By {{ filter_title }}{% endblocktrans %}</h3>
|
6
6
|
|
7
|
-
<div class="flex flex-col space-y-
|
7
|
+
<div class="flex flex-col space-y-2">
|
8
8
|
{% for field in choice.form %}
|
9
9
|
<div class="flex flex-row flex-wrap group relative{% if field.errors %} errors{% endif %}">
|
10
10
|
{{ field }}
|
@@ -0,0 +1,23 @@
|
|
1
|
+
from crispy_forms.layout import BaseInput
|
2
|
+
|
3
|
+
from unfold.widgets import BUTTON_CLASSES
|
4
|
+
|
5
|
+
|
6
|
+
class ButtonClassesMixin:
|
7
|
+
def __init__(self, *args, css_class=None, **kwargs):
|
8
|
+
classes = BUTTON_CLASSES
|
9
|
+
|
10
|
+
if css_class:
|
11
|
+
classes.append(css_class)
|
12
|
+
|
13
|
+
self.field_classes = " ".join(classes)
|
14
|
+
|
15
|
+
super().__init__(*args, **kwargs)
|
16
|
+
|
17
|
+
|
18
|
+
class Submit(ButtonClassesMixin, BaseInput):
|
19
|
+
input_type = "submit"
|
20
|
+
|
21
|
+
|
22
|
+
class Button(ButtonClassesMixin, BaseInput):
|
23
|
+
input_type = "button"
|
@@ -24,9 +24,16 @@ except ImportError:
|
|
24
24
|
return func
|
25
25
|
|
26
26
|
|
27
|
-
from .settings import get_config
|
28
|
-
from .utils import hex_to_rgb
|
29
|
-
from .widgets import
|
27
|
+
from unfold.settings import get_config
|
28
|
+
from unfold.utils import hex_to_rgb
|
29
|
+
from unfold.widgets import (
|
30
|
+
BUTTON_CLASSES,
|
31
|
+
CHECKBOX_CLASSES,
|
32
|
+
FILE_CLASSES,
|
33
|
+
INPUT_CLASSES,
|
34
|
+
RADIO_CLASSES,
|
35
|
+
SWITCH_CLASSES,
|
36
|
+
)
|
30
37
|
|
31
38
|
|
32
39
|
class UnfoldAdminSite(AdminSite):
|
@@ -34,7 +41,7 @@ class UnfoldAdminSite(AdminSite):
|
|
34
41
|
settings_name = "UNFOLD"
|
35
42
|
|
36
43
|
def __init__(self, name: str = "admin") -> None:
|
37
|
-
from .forms import AuthenticationForm
|
44
|
+
from unfold.forms import AuthenticationForm
|
38
45
|
|
39
46
|
super().__init__(name)
|
40
47
|
|
@@ -68,8 +75,12 @@ class UnfoldAdminSite(AdminSite):
|
|
68
75
|
sidebar_config = self._get_config("SIDEBAR", request)
|
69
76
|
data = {
|
70
77
|
"form_classes": {
|
71
|
-
"text_input": INPUT_CLASSES,
|
72
|
-
"checkbox": CHECKBOX_CLASSES,
|
78
|
+
"text_input": " ".join(INPUT_CLASSES),
|
79
|
+
"checkbox": " ".join(CHECKBOX_CLASSES),
|
80
|
+
"button": " ".join(BUTTON_CLASSES),
|
81
|
+
"radio": " ".join(RADIO_CLASSES),
|
82
|
+
"switch": " ".join(SWITCH_CLASSES),
|
83
|
+
"file": " ".join(FILE_CLASSES),
|
73
84
|
},
|
74
85
|
"site_title": self._get_config("SITE_TITLE", request) or self.site_title,
|
75
86
|
"site_header": self._get_config("SITE_HEADER", request) or self.site_header,
|
@@ -96,12 +96,23 @@
|
|
96
96
|
.removeClass(options.emptyCssClass)
|
97
97
|
.addClass(options.formCssClass)
|
98
98
|
.attr("id", options.prefix + "-" + nextIndex);
|
99
|
+
|
99
100
|
addInlineDeleteButton(row);
|
100
101
|
row.find("*").each(function () {
|
101
102
|
updateElementIndex(this, options.prefix, totalForms.val());
|
102
103
|
});
|
104
|
+
|
103
105
|
// Insert the new form when it has been fully edited.
|
104
|
-
|
106
|
+
// !CHANGED from original
|
107
|
+
if ($(template).parent().is("tbody")) {
|
108
|
+
row
|
109
|
+
.wrap('<tbody class="template"></tbody>')
|
110
|
+
.parent()
|
111
|
+
.insertBefore($(template).parent());
|
112
|
+
} else {
|
113
|
+
row.insertBefore($(template));
|
114
|
+
}
|
115
|
+
|
105
116
|
// Update number of total forms.
|
106
117
|
$(totalForms).val(parseInt(totalForms.val(), 10) + 1);
|
107
118
|
nextIndex += 1;
|
@@ -183,7 +194,13 @@
|
|
183
194
|
if (prevRow.length && prevRow.hasClass("row-form-errors")) {
|
184
195
|
prevRow.remove();
|
185
196
|
}
|
186
|
-
|
197
|
+
|
198
|
+
// !CHANGED from original
|
199
|
+
if (deleteButton.parent().parent().parent().parent().is("tbody")) {
|
200
|
+
row.parent().remove();
|
201
|
+
} else {
|
202
|
+
row.remove();
|
203
|
+
}
|
187
204
|
nextIndex -= 1;
|
188
205
|
// Pass the deleted form to the post-delete callback, if provided.
|
189
206
|
if (options.removed) {
|
@@ -245,8 +262,11 @@
|
|
245
262
|
}
|
246
263
|
|
247
264
|
// Create the delete buttons for all unsaved inlines:
|
265
|
+
// !CHANGED from original, added parent() and used find() instead of filter()
|
248
266
|
$this
|
249
|
-
.
|
267
|
+
.parent()
|
268
|
+
.parent()
|
269
|
+
.find(
|
250
270
|
"." +
|
251
271
|
options.formCssClass +
|
252
272
|
":not(.has_original):not(." +
|