wagtail 6.3.3__py3-none-any.whl → 6.4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- wagtail/__init__.py +1 -1
- wagtail/actions/publish_revision.py +4 -5
- wagtail/admin/auth.py +0 -2
- wagtail/admin/checks.py +1 -1
- wagtail/admin/filters.py +3 -1
- wagtail/admin/forms/account.py +21 -11
- wagtail/admin/forms/collections.py +2 -9
- wagtail/admin/forms/formsets.py +32 -0
- wagtail/admin/forms/pages.py +5 -1
- wagtail/admin/forms/workflows.py +2 -13
- wagtail/admin/locale/ar/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/ar/LC_MESSAGES/django.po +72 -26
- wagtail/admin/locale/ar/LC_MESSAGES/djangojs.mo +0 -0
- wagtail/admin/locale/ar/LC_MESSAGES/djangojs.po +9 -1
- wagtail/admin/locale/az_AZ/LC_MESSAGES/django.po +1 -1
- wagtail/admin/locale/be/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/be/LC_MESSAGES/django.po +4 -19
- wagtail/admin/locale/be/LC_MESSAGES/djangojs.mo +0 -0
- wagtail/admin/locale/be/LC_MESSAGES/djangojs.po +5 -2
- wagtail/admin/locale/bg/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/bg/LC_MESSAGES/django.po +1 -5
- wagtail/admin/locale/bg/LC_MESSAGES/djangojs.mo +0 -0
- wagtail/admin/locale/bg/LC_MESSAGES/djangojs.po +5 -2
- wagtail/admin/locale/bn/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/bn/LC_MESSAGES/django.po +1 -7
- wagtail/admin/locale/ca/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/ca/LC_MESSAGES/django.po +59 -104
- wagtail/admin/locale/ca/LC_MESSAGES/djangojs.mo +0 -0
- wagtail/admin/locale/ca/LC_MESSAGES/djangojs.po +5 -2
- wagtail/admin/locale/cs/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/cs/LC_MESSAGES/django.po +4 -28
- wagtail/admin/locale/cs/LC_MESSAGES/djangojs.mo +0 -0
- wagtail/admin/locale/cs/LC_MESSAGES/djangojs.po +5 -2
- wagtail/admin/locale/cy/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/cy/LC_MESSAGES/django.po +1 -7
- wagtail/admin/locale/cy/LC_MESSAGES/djangojs.mo +0 -0
- wagtail/admin/locale/cy/LC_MESSAGES/djangojs.po +5 -2
- wagtail/admin/locale/da/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/da/LC_MESSAGES/django.po +1 -18
- wagtail/admin/locale/da/LC_MESSAGES/djangojs.mo +0 -0
- wagtail/admin/locale/da/LC_MESSAGES/djangojs.po +5 -2
- wagtail/admin/locale/de/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/de/LC_MESSAGES/django.po +59 -106
- wagtail/admin/locale/de/LC_MESSAGES/djangojs.mo +0 -0
- wagtail/admin/locale/de/LC_MESSAGES/djangojs.po +5 -2
- wagtail/admin/locale/dv/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/dv/LC_MESSAGES/django.po +7 -44
- wagtail/admin/locale/dv/LC_MESSAGES/djangojs.mo +0 -0
- wagtail/admin/locale/dv/LC_MESSAGES/djangojs.po +5 -2
- wagtail/admin/locale/el/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/el/LC_MESSAGES/django.po +1 -64
- wagtail/admin/locale/el/LC_MESSAGES/djangojs.mo +0 -0
- wagtail/admin/locale/el/LC_MESSAGES/djangojs.po +5 -1
- wagtail/admin/locale/en/LC_MESSAGES/django.po +312 -356
- wagtail/admin/locale/en/LC_MESSAGES/djangojs.po +21 -16
- wagtail/admin/locale/es/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/es/LC_MESSAGES/django.po +7 -127
- wagtail/admin/locale/es/LC_MESSAGES/djangojs.mo +0 -0
- wagtail/admin/locale/es/LC_MESSAGES/djangojs.po +5 -2
- wagtail/admin/locale/es_419/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/es_419/LC_MESSAGES/django.po +1 -7
- wagtail/admin/locale/es_VE/LC_MESSAGES/django.po +1 -1
- wagtail/admin/locale/et/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/et/LC_MESSAGES/django.po +4 -22
- wagtail/admin/locale/et/LC_MESSAGES/djangojs.mo +0 -0
- wagtail/admin/locale/et/LC_MESSAGES/djangojs.po +5 -2
- wagtail/admin/locale/eu/LC_MESSAGES/django.po +1 -1
- wagtail/admin/locale/eu/LC_MESSAGES/djangojs.mo +0 -0
- wagtail/admin/locale/eu/LC_MESSAGES/djangojs.po +5 -2
- wagtail/admin/locale/fa/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/fa/LC_MESSAGES/django.po +4 -106
- wagtail/admin/locale/fa/LC_MESSAGES/djangojs.mo +0 -0
- wagtail/admin/locale/fa/LC_MESSAGES/djangojs.po +5 -1
- wagtail/admin/locale/fi/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/fi/LC_MESSAGES/django.po +6 -44
- wagtail/admin/locale/fi/LC_MESSAGES/djangojs.mo +0 -0
- wagtail/admin/locale/fi/LC_MESSAGES/djangojs.po +5 -2
- wagtail/admin/locale/fr/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/fr/LC_MESSAGES/django.po +64 -115
- wagtail/admin/locale/fr/LC_MESSAGES/djangojs.mo +0 -0
- wagtail/admin/locale/fr/LC_MESSAGES/djangojs.po +5 -2
- wagtail/admin/locale/gl/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/gl/LC_MESSAGES/django.po +59 -103
- wagtail/admin/locale/gl/LC_MESSAGES/djangojs.mo +0 -0
- wagtail/admin/locale/gl/LC_MESSAGES/djangojs.po +5 -2
- wagtail/admin/locale/he_IL/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/he_IL/LC_MESSAGES/django.po +1 -5
- wagtail/admin/locale/he_IL/LC_MESSAGES/djangojs.mo +0 -0
- wagtail/admin/locale/he_IL/LC_MESSAGES/djangojs.po +5 -2
- wagtail/admin/locale/hr_HR/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/hr_HR/LC_MESSAGES/django.po +4 -22
- wagtail/admin/locale/hr_HR/LC_MESSAGES/djangojs.mo +0 -0
- wagtail/admin/locale/hr_HR/LC_MESSAGES/djangojs.po +5 -2
- wagtail/admin/locale/ht/LC_MESSAGES/django.po +1 -1
- wagtail/admin/locale/hu/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/hu/LC_MESSAGES/django.po +7 -107
- wagtail/admin/locale/hu/LC_MESSAGES/djangojs.mo +0 -0
- wagtail/admin/locale/hu/LC_MESSAGES/djangojs.po +5 -2
- wagtail/admin/locale/id_ID/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/id_ID/LC_MESSAGES/django.po +4 -19
- wagtail/admin/locale/id_ID/LC_MESSAGES/djangojs.mo +0 -0
- wagtail/admin/locale/id_ID/LC_MESSAGES/djangojs.po +5 -1
- wagtail/admin/locale/is_IS/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/is_IS/LC_MESSAGES/django.po +7 -117
- wagtail/admin/locale/is_IS/LC_MESSAGES/djangojs.mo +0 -0
- wagtail/admin/locale/is_IS/LC_MESSAGES/djangojs.po +5 -2
- wagtail/admin/locale/it/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/it/LC_MESSAGES/django.po +7 -134
- wagtail/admin/locale/it/LC_MESSAGES/djangojs.mo +0 -0
- wagtail/admin/locale/it/LC_MESSAGES/djangojs.po +5 -2
- wagtail/admin/locale/ja/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/ja/LC_MESSAGES/django.po +4 -28
- wagtail/admin/locale/ja/LC_MESSAGES/djangojs.mo +0 -0
- wagtail/admin/locale/ja/LC_MESSAGES/djangojs.po +5 -1
- wagtail/admin/locale/ka/LC_MESSAGES/django.po +1 -1
- wagtail/admin/locale/ko/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/ko/LC_MESSAGES/django.po +6 -97
- wagtail/admin/locale/ko/LC_MESSAGES/djangojs.mo +0 -0
- wagtail/admin/locale/ko/LC_MESSAGES/djangojs.po +5 -2
- wagtail/admin/locale/lt/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/lt/LC_MESSAGES/django.po +4 -28
- wagtail/admin/locale/lt/LC_MESSAGES/djangojs.mo +0 -0
- wagtail/admin/locale/lt/LC_MESSAGES/djangojs.po +5 -2
- wagtail/admin/locale/lv/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/lv/LC_MESSAGES/django.po +1 -5
- wagtail/admin/locale/lv/LC_MESSAGES/djangojs.mo +0 -0
- wagtail/admin/locale/lv/LC_MESSAGES/djangojs.po +5 -2
- wagtail/admin/locale/mi/LC_MESSAGES/django.po +1 -1
- wagtail/admin/locale/mi/LC_MESSAGES/djangojs.mo +0 -0
- wagtail/admin/locale/mi/LC_MESSAGES/djangojs.po +5 -2
- wagtail/admin/locale/mn/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/mn/LC_MESSAGES/django.po +4 -15
- wagtail/admin/locale/mn/LC_MESSAGES/djangojs.mo +0 -0
- wagtail/admin/locale/mn/LC_MESSAGES/djangojs.po +5 -2
- wagtail/admin/locale/my/LC_MESSAGES/django.po +1 -1
- wagtail/admin/locale/nb/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/nb/LC_MESSAGES/django.po +4 -25
- wagtail/admin/locale/nb/LC_MESSAGES/djangojs.mo +0 -0
- wagtail/admin/locale/nb/LC_MESSAGES/djangojs.po +5 -1
- wagtail/admin/locale/nl/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/nl/LC_MESSAGES/django.po +59 -111
- wagtail/admin/locale/nl/LC_MESSAGES/djangojs.mo +0 -0
- wagtail/admin/locale/nl/LC_MESSAGES/djangojs.po +5 -2
- wagtail/admin/locale/pl/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/pl/LC_MESSAGES/django.po +7 -84
- wagtail/admin/locale/pl/LC_MESSAGES/djangojs.mo +0 -0
- wagtail/admin/locale/pl/LC_MESSAGES/djangojs.po +5 -2
- wagtail/admin/locale/pt_BR/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/pt_BR/LC_MESSAGES/django.po +7 -125
- wagtail/admin/locale/pt_BR/LC_MESSAGES/djangojs.mo +0 -0
- wagtail/admin/locale/pt_BR/LC_MESSAGES/djangojs.po +5 -2
- wagtail/admin/locale/pt_PT/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/pt_PT/LC_MESSAGES/django.po +4 -122
- wagtail/admin/locale/pt_PT/LC_MESSAGES/djangojs.mo +0 -0
- wagtail/admin/locale/pt_PT/LC_MESSAGES/djangojs.po +5 -2
- wagtail/admin/locale/ro/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/ro/LC_MESSAGES/django.po +7 -135
- wagtail/admin/locale/ro/LC_MESSAGES/djangojs.mo +0 -0
- wagtail/admin/locale/ro/LC_MESSAGES/djangojs.po +5 -2
- wagtail/admin/locale/ru/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/ru/LC_MESSAGES/django.po +69 -131
- wagtail/admin/locale/ru/LC_MESSAGES/djangojs.mo +0 -0
- wagtail/admin/locale/ru/LC_MESSAGES/djangojs.po +5 -2
- wagtail/admin/locale/sk_SK/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/sk_SK/LC_MESSAGES/django.po +1 -12
- wagtail/admin/locale/sk_SK/LC_MESSAGES/djangojs.mo +0 -0
- wagtail/admin/locale/sk_SK/LC_MESSAGES/djangojs.po +5 -2
- wagtail/admin/locale/sl/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/sl/LC_MESSAGES/django.po +7 -52
- wagtail/admin/locale/sl/LC_MESSAGES/djangojs.mo +0 -0
- wagtail/admin/locale/sl/LC_MESSAGES/djangojs.po +5 -2
- wagtail/admin/locale/sv/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/sv/LC_MESSAGES/django.po +7 -113
- wagtail/admin/locale/sv/LC_MESSAGES/djangojs.mo +0 -0
- wagtail/admin/locale/sv/LC_MESSAGES/djangojs.po +5 -2
- wagtail/admin/locale/tet/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/tet/LC_MESSAGES/django.po +4 -19
- wagtail/admin/locale/tet/LC_MESSAGES/djangojs.mo +0 -0
- wagtail/admin/locale/tet/LC_MESSAGES/djangojs.po +5 -2
- wagtail/admin/locale/th/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/th/LC_MESSAGES/django.po +4 -19
- wagtail/admin/locale/th/LC_MESSAGES/djangojs.mo +0 -0
- wagtail/admin/locale/th/LC_MESSAGES/djangojs.po +5 -2
- wagtail/admin/locale/tr/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/tr/LC_MESSAGES/django.po +4 -19
- wagtail/admin/locale/tr/LC_MESSAGES/djangojs.mo +0 -0
- wagtail/admin/locale/tr/LC_MESSAGES/djangojs.po +5 -2
- wagtail/admin/locale/tr_TR/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/tr_TR/LC_MESSAGES/django.po +4 -19
- wagtail/admin/locale/tr_TR/LC_MESSAGES/djangojs.mo +0 -0
- wagtail/admin/locale/tr_TR/LC_MESSAGES/djangojs.po +5 -1
- wagtail/admin/locale/ug/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/ug/LC_MESSAGES/django.po +7 -107
- wagtail/admin/locale/ug/LC_MESSAGES/djangojs.mo +0 -0
- wagtail/admin/locale/ug/LC_MESSAGES/djangojs.po +5 -2
- wagtail/admin/locale/uk/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/uk/LC_MESSAGES/django.po +4 -138
- wagtail/admin/locale/uk/LC_MESSAGES/djangojs.mo +0 -0
- wagtail/admin/locale/uk/LC_MESSAGES/djangojs.po +5 -2
- wagtail/admin/locale/vi/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/vi/LC_MESSAGES/django.po +1 -8
- wagtail/admin/locale/vi/LC_MESSAGES/djangojs.mo +0 -0
- wagtail/admin/locale/vi/LC_MESSAGES/djangojs.po +5 -2
- wagtail/admin/locale/zh/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/zh/LC_MESSAGES/django.po +1 -5
- wagtail/admin/locale/zh/LC_MESSAGES/djangojs.mo +0 -0
- wagtail/admin/locale/zh/LC_MESSAGES/djangojs.po +5 -2
- wagtail/admin/locale/zh_Hans/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/zh_Hans/LC_MESSAGES/django.po +7 -96
- wagtail/admin/locale/zh_Hans/LC_MESSAGES/djangojs.mo +0 -0
- wagtail/admin/locale/zh_Hans/LC_MESSAGES/djangojs.po +5 -2
- wagtail/admin/locale/zh_Hant/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/zh_Hant/LC_MESSAGES/django.po +4 -22
- wagtail/admin/locale/zh_Hant/LC_MESSAGES/djangojs.mo +0 -0
- wagtail/admin/locale/zh_Hant/LC_MESSAGES/djangojs.po +5 -2
- wagtail/admin/menu.py +0 -13
- wagtail/admin/panels/base.py +2 -2
- wagtail/admin/panels/group.py +4 -1
- wagtail/admin/panels/inline_panel.py +5 -2
- wagtail/admin/panels/model_utils.py +36 -0
- wagtail/admin/panels/page_utils.py +2 -40
- wagtail/admin/panels/signal_handlers.py +0 -2
- wagtail/admin/static/wagtailadmin/css/core.css +1 -1
- wagtail/admin/static/wagtailadmin/css/panels/draftail.css +1 -1
- wagtail/admin/static/wagtailadmin/css/panels/streamfield.css +1 -1
- wagtail/admin/static/wagtailadmin/js/comments.js +1 -1
- wagtail/admin/static/wagtailadmin/js/core.js +1 -1
- wagtail/admin/static/wagtailadmin/js/core.js.LICENSE.txt +1 -8
- wagtail/admin/static/wagtailadmin/js/draftail.js +1 -1
- wagtail/admin/static/wagtailadmin/js/modal-workflow.js +1 -1
- wagtail/admin/static/wagtailadmin/js/page-chooser-modal.js +1 -1
- wagtail/admin/static/wagtailadmin/js/privacy-switch.js +1 -1
- wagtail/admin/static/wagtailadmin/js/sidebar.js +1 -1
- wagtail/admin/static/wagtailadmin/js/telepath/blocks.js +1 -1
- wagtail/admin/static/wagtailadmin/js/telepath/widgets.js +1 -1
- wagtail/admin/static/wagtailadmin/js/userbar.js +1 -1
- wagtail/admin/static/wagtailadmin/js/userbar.js.LICENSE.txt +1 -1
- wagtail/admin/static/wagtailadmin/js/vendor.js +1 -1
- wagtail/admin/static/wagtailadmin/js/vendor.js.LICENSE.txt +7 -0
- wagtail/admin/templates/wagtailadmin/404.html +4 -0
- wagtail/admin/templates/wagtailadmin/chooser/browse.html +2 -1
- wagtail/admin/templates/wagtailadmin/chooser/tables/parent_page_cell.html +1 -1
- wagtail/admin/templates/wagtailadmin/collections/_privacy_switch.html +8 -1
- wagtail/admin/templates/wagtailadmin/generic/confirm_delete.html +15 -9
- wagtail/admin/templates/wagtailadmin/generic/confirm_unpublish.html +21 -25
- wagtail/admin/templates/wagtailadmin/generic/form.html +1 -1
- wagtail/admin/templates/wagtailadmin/generic/preview_error.html +3 -0
- wagtail/admin/templates/wagtailadmin/generic/revisions/compare.html +63 -76
- wagtail/admin/templates/wagtailadmin/pages/_editor_js.html +0 -2
- wagtail/admin/templates/wagtailadmin/pages/edit.html +1 -5
- wagtail/admin/templates/wagtailadmin/panels/inline_panel_child.html +1 -0
- wagtail/admin/templates/wagtailadmin/permissions/includes/collection_member_permissions_form.html +1 -1
- wagtail/admin/templates/wagtailadmin/permissions/includes/collection_member_permissions_formset.html +6 -22
- wagtail/admin/templates/wagtailadmin/shared/formatted_field.html +2 -2
- wagtail/admin/templates/wagtailadmin/shared/header.html +2 -2
- wagtail/admin/templates/wagtailadmin/shared/page_status_tag_new.html +32 -39
- wagtail/admin/templates/wagtailadmin/shared/revisions/confirm_unschedule.html +13 -17
- wagtail/admin/templates/wagtailadmin/shared/side_panels/includes/status/privacy.html +15 -3
- wagtail/admin/templates/wagtailadmin/shared/side_panels/preview.html +1 -1
- wagtail/admin/templates/wagtailadmin/skeleton.html +4 -2
- wagtail/admin/templates/wagtailadmin/workflows/create.html +1 -1
- wagtail/admin/templates/wagtailadmin/workflows/edit.html +1 -1
- wagtail/admin/templates/wagtailadmin/workflows/includes/workflow_pages_form.html +1 -1
- wagtail/admin/templates/wagtailadmin/workflows/includes/workflow_pages_formset.html +6 -23
- wagtail/admin/templatetags/wagtailadmin_tags.py +12 -0
- wagtail/admin/templatetags/wagtailuserbar.py +2 -3
- wagtail/admin/tests/pages/test_create_page.py +110 -1
- wagtail/admin/tests/pages/test_edit_page.py +3 -2
- wagtail/admin/tests/pages/test_explorer_view.py +18 -0
- wagtail/admin/tests/pages/test_page_usage.py +24 -20
- wagtail/admin/tests/pages/test_preview.py +69 -1
- wagtail/admin/tests/pages/test_revisions.py +40 -6
- wagtail/admin/tests/test_account_management.py +39 -1
- wagtail/admin/tests/test_audit_log.py +4 -2
- wagtail/admin/tests/test_block_preview.py +228 -0
- wagtail/admin/tests/test_edit_handlers.py +23 -6
- wagtail/admin/tests/test_page_chooser.py +50 -3
- wagtail/admin/tests/test_privacy.py +49 -26
- wagtail/admin/tests/test_site_summary.py +15 -10
- wagtail/admin/tests/test_templatetags.py +19 -0
- wagtail/admin/tests/test_userbar.py +82 -1
- wagtail/admin/tests/test_views_generic.py +27 -12
- wagtail/admin/tests/test_workflows.py +69 -0
- wagtail/admin/tests/tests.py +23 -4
- wagtail/admin/tests/ui/test_sidebar.py +1 -1
- wagtail/admin/tests/viewsets/test_model_viewset.py +15 -13
- wagtail/admin/ui/side_panels.py +7 -4
- wagtail/admin/urls/__init__.py +6 -0
- wagtail/admin/urls/pages.py +1 -1
- wagtail/admin/userbar.py +20 -1
- wagtail/admin/views/account.py +5 -0
- wagtail/admin/views/chooser.py +5 -1
- wagtail/admin/views/collections.py +0 -2
- wagtail/admin/views/generic/base.py +20 -10
- wagtail/admin/views/generic/history.py +0 -1
- wagtail/admin/views/generic/models.py +79 -21
- wagtail/admin/views/generic/preview.py +52 -1
- wagtail/admin/views/mixins.py +4 -2
- wagtail/admin/views/pages/bulk_actions/delete.py +11 -23
- wagtail/admin/views/pages/bulk_actions/page_bulk_action.py +17 -0
- wagtail/admin/views/pages/bulk_actions/publish.py +11 -31
- wagtail/admin/views/pages/bulk_actions/unpublish.py +11 -31
- wagtail/admin/views/pages/create.py +1 -0
- wagtail/admin/views/pages/edit.py +38 -30
- wagtail/admin/views/pages/revisions.py +43 -114
- wagtail/admin/views/pages/utils.py +0 -1
- wagtail/admin/views/tags.py +6 -2
- wagtail/admin/views/workflows.py +8 -6
- wagtail/admin/viewsets/model.py +0 -4
- wagtail/admin/viewsets/pages.py +0 -1
- wagtail/admin/widgets/tags.py +1 -0
- wagtail/api/v2/tests/test_documents.py +4 -2
- wagtail/api/v2/tests/test_images.py +4 -2
- wagtail/api/v2/tests/test_pages.py +8 -4
- wagtail/blocks/base.py +107 -8
- wagtail/blocks/field_block.py +6 -0
- wagtail/blocks/list_block.py +6 -1
- wagtail/blocks/static_block.py +3 -0
- wagtail/blocks/stream_block.py +8 -0
- wagtail/blocks/struct_block.py +10 -0
- wagtail/compat.py +16 -0
- wagtail/contrib/forms/forms.py +27 -7
- wagtail/contrib/forms/locale/af/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/ar/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/az_AZ/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/be/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/bg/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/bn/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/ca/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/cs/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/cy/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/da/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/de/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/dv/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/el/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/en/LC_MESSAGES/django.po +2 -2
- wagtail/contrib/forms/locale/es/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/es_419/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/et/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/eu/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/fa/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/fi/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/fr/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/gl/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/he_IL/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/hr_HR/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/ht/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/hu/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/hy/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/id_ID/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/is_IS/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/it/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/ja/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/ka/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/ko/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/lt/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/lv/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/mi/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/mn/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/my/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/nb/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/nl/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/pl/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/pt_BR/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/pt_PT/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/ro/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/ru/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/sk_SK/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/sl/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/sv/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/tet/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/th/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/tr/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/tr_TR/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/ug/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/uk/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/vi/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/zh/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/zh_Hans/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/locale/zh_Hant/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/forms/tests/test_views.py +75 -0
- wagtail/contrib/frontend_cache/tasks.py +83 -0
- wagtail/contrib/frontend_cache/tests.py +47 -32
- wagtail/contrib/frontend_cache/utils.py +2 -70
- wagtail/contrib/redirects/base_formats.py +2 -2
- wagtail/contrib/redirects/locale/ar/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/ar/LC_MESSAGES/django.po +9 -15
- wagtail/contrib/redirects/locale/be/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/be/LC_MESSAGES/django.po +1 -10
- wagtail/contrib/redirects/locale/bg/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/bg/LC_MESSAGES/django.po +4 -13
- wagtail/contrib/redirects/locale/bn/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/bn/LC_MESSAGES/django.po +1 -7
- wagtail/contrib/redirects/locale/ca/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/ca/LC_MESSAGES/django.po +7 -16
- wagtail/contrib/redirects/locale/cs/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/cs/LC_MESSAGES/django.po +7 -16
- wagtail/contrib/redirects/locale/cy/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/cy/LC_MESSAGES/django.po +7 -16
- wagtail/contrib/redirects/locale/da/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/da/LC_MESSAGES/django.po +1 -10
- wagtail/contrib/redirects/locale/de/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/de/LC_MESSAGES/django.po +7 -16
- wagtail/contrib/redirects/locale/dv/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/dv/LC_MESSAGES/django.po +1 -10
- wagtail/contrib/redirects/locale/el/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/el/LC_MESSAGES/django.po +7 -16
- wagtail/contrib/redirects/locale/en/LC_MESSAGES/django.po +24 -37
- wagtail/contrib/redirects/locale/en_IN/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/redirects/locale/es/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/es/LC_MESSAGES/django.po +7 -16
- wagtail/contrib/redirects/locale/es_419/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/es_419/LC_MESSAGES/django.po +1 -7
- wagtail/contrib/redirects/locale/es_VE/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/redirects/locale/et/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/et/LC_MESSAGES/django.po +7 -16
- wagtail/contrib/redirects/locale/eu/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/eu/LC_MESSAGES/django.po +1 -4
- wagtail/contrib/redirects/locale/fa/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/fa/LC_MESSAGES/django.po +7 -16
- wagtail/contrib/redirects/locale/fi/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/fi/LC_MESSAGES/django.po +7 -16
- wagtail/contrib/redirects/locale/fr/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/fr/LC_MESSAGES/django.po +7 -16
- wagtail/contrib/redirects/locale/gl/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/gl/LC_MESSAGES/django.po +7 -16
- wagtail/contrib/redirects/locale/he_IL/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/he_IL/LC_MESSAGES/django.po +7 -16
- wagtail/contrib/redirects/locale/hi/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/redirects/locale/hr_HR/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/hr_HR/LC_MESSAGES/django.po +7 -16
- wagtail/contrib/redirects/locale/ht/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/ht/LC_MESSAGES/django.po +1 -4
- wagtail/contrib/redirects/locale/hu/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/hu/LC_MESSAGES/django.po +7 -16
- wagtail/contrib/redirects/locale/hy/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/redirects/locale/id_ID/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/id_ID/LC_MESSAGES/django.po +7 -16
- wagtail/contrib/redirects/locale/is_IS/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/is_IS/LC_MESSAGES/django.po +8 -17
- wagtail/contrib/redirects/locale/it/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/it/LC_MESSAGES/django.po +7 -16
- wagtail/contrib/redirects/locale/ja/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/ja/LC_MESSAGES/django.po +7 -16
- wagtail/contrib/redirects/locale/ka/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/ka/LC_MESSAGES/django.po +1 -7
- wagtail/contrib/redirects/locale/ko/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/ko/LC_MESSAGES/django.po +7 -16
- wagtail/contrib/redirects/locale/lt/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/lt/LC_MESSAGES/django.po +7 -16
- wagtail/contrib/redirects/locale/lv/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/lv/LC_MESSAGES/django.po +4 -13
- wagtail/contrib/redirects/locale/mi/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/mi/LC_MESSAGES/django.po +4 -13
- wagtail/contrib/redirects/locale/mn/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/mn/LC_MESSAGES/django.po +7 -16
- wagtail/contrib/redirects/locale/my/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/my/LC_MESSAGES/django.po +3 -12
- wagtail/contrib/redirects/locale/nb/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/nb/LC_MESSAGES/django.po +7 -16
- wagtail/contrib/redirects/locale/nl/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/nl/LC_MESSAGES/django.po +7 -16
- wagtail/contrib/redirects/locale/pl/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/pl/LC_MESSAGES/django.po +7 -16
- wagtail/contrib/redirects/locale/pt_BR/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/pt_BR/LC_MESSAGES/django.po +7 -16
- wagtail/contrib/redirects/locale/pt_PT/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/pt_PT/LC_MESSAGES/django.po +7 -16
- wagtail/contrib/redirects/locale/ro/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/ro/LC_MESSAGES/django.po +7 -16
- wagtail/contrib/redirects/locale/ru/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/ru/LC_MESSAGES/django.po +7 -16
- wagtail/contrib/redirects/locale/sk_SK/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/sk_SK/LC_MESSAGES/django.po +7 -16
- wagtail/contrib/redirects/locale/sl/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/sl/LC_MESSAGES/django.po +7 -16
- wagtail/contrib/redirects/locale/sr/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/redirects/locale/sv/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/sv/LC_MESSAGES/django.po +7 -16
- wagtail/contrib/redirects/locale/ta/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/redirects/locale/tet/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/tet/LC_MESSAGES/django.po +7 -16
- wagtail/contrib/redirects/locale/th/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/th/LC_MESSAGES/django.po +7 -16
- wagtail/contrib/redirects/locale/tr/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/tr/LC_MESSAGES/django.po +7 -16
- wagtail/contrib/redirects/locale/tr_TR/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/tr_TR/LC_MESSAGES/django.po +7 -16
- wagtail/contrib/redirects/locale/ug/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/ug/LC_MESSAGES/django.po +7 -16
- wagtail/contrib/redirects/locale/uk/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/uk/LC_MESSAGES/django.po +7 -16
- wagtail/contrib/redirects/locale/vi/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/vi/LC_MESSAGES/django.po +1 -10
- wagtail/contrib/redirects/locale/zh/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/zh/LC_MESSAGES/django.po +4 -13
- wagtail/contrib/redirects/locale/zh_Hans/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/zh_Hans/LC_MESSAGES/django.po +7 -16
- wagtail/contrib/redirects/locale/zh_Hant/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/zh_Hant/LC_MESSAGES/django.po +7 -16
- wagtail/contrib/redirects/templates/wagtailredirects/add.html +1 -24
- wagtail/contrib/redirects/templates/wagtailredirects/confirm_delete.html +3 -13
- wagtail/contrib/redirects/tests/test_redirects.py +122 -110
- wagtail/contrib/redirects/tests/test_signal_handlers.py +75 -69
- wagtail/contrib/redirects/urls.py +2 -2
- wagtail/contrib/redirects/views.py +35 -73
- wagtail/contrib/search_promotions/admin_urls.py +10 -3
- wagtail/contrib/search_promotions/forms.py +55 -26
- wagtail/contrib/search_promotions/locale/af/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/af/LC_MESSAGES/django.po +4 -1
- wagtail/contrib/search_promotions/locale/ar/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/ar/LC_MESSAGES/django.po +15 -28
- wagtail/contrib/search_promotions/locale/az_AZ/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/az_AZ/LC_MESSAGES/django.po +1 -4
- wagtail/contrib/search_promotions/locale/be/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/be/LC_MESSAGES/django.po +15 -28
- wagtail/contrib/search_promotions/locale/bg/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/bg/LC_MESSAGES/django.po +9 -19
- wagtail/contrib/search_promotions/locale/bn/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/bn/LC_MESSAGES/django.po +1 -7
- wagtail/contrib/search_promotions/locale/ca/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/ca/LC_MESSAGES/django.po +25 -32
- wagtail/contrib/search_promotions/locale/cs/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/cs/LC_MESSAGES/django.po +15 -28
- wagtail/contrib/search_promotions/locale/cy/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/cy/LC_MESSAGES/django.po +15 -31
- wagtail/contrib/search_promotions/locale/da/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/da/LC_MESSAGES/django.po +9 -12
- wagtail/contrib/search_promotions/locale/de/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/de/LC_MESSAGES/django.po +25 -32
- wagtail/contrib/search_promotions/locale/dv/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/dv/LC_MESSAGES/django.po +9 -12
- wagtail/contrib/search_promotions/locale/el/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/el/LC_MESSAGES/django.po +14 -27
- wagtail/contrib/search_promotions/locale/en/LC_MESSAGES/django.po +44 -54
- wagtail/contrib/search_promotions/locale/es/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/es/LC_MESSAGES/django.po +15 -28
- wagtail/contrib/search_promotions/locale/es_419/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/es_419/LC_MESSAGES/django.po +1 -7
- wagtail/contrib/search_promotions/locale/et/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/et/LC_MESSAGES/django.po +15 -28
- wagtail/contrib/search_promotions/locale/eu/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/eu/LC_MESSAGES/django.po +7 -4
- wagtail/contrib/search_promotions/locale/fa/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/fa/LC_MESSAGES/django.po +15 -28
- wagtail/contrib/search_promotions/locale/fi/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/fi/LC_MESSAGES/django.po +15 -28
- wagtail/contrib/search_promotions/locale/fr/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/fr/LC_MESSAGES/django.po +26 -33
- wagtail/contrib/search_promotions/locale/gl/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/gl/LC_MESSAGES/django.po +27 -34
- wagtail/contrib/search_promotions/locale/he_IL/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/he_IL/LC_MESSAGES/django.po +12 -19
- wagtail/contrib/search_promotions/locale/hr_HR/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/hr_HR/LC_MESSAGES/django.po +18 -31
- wagtail/contrib/search_promotions/locale/ht/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/ht/LC_MESSAGES/django.po +3 -6
- wagtail/contrib/search_promotions/locale/hu/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/hu/LC_MESSAGES/django.po +19 -32
- wagtail/contrib/search_promotions/locale/id_ID/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/id_ID/LC_MESSAGES/django.po +15 -28
- wagtail/contrib/search_promotions/locale/is_IS/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/is_IS/LC_MESSAGES/django.po +17 -30
- wagtail/contrib/search_promotions/locale/it/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/it/LC_MESSAGES/django.po +18 -31
- wagtail/contrib/search_promotions/locale/ja/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/ja/LC_MESSAGES/django.po +14 -27
- wagtail/contrib/search_promotions/locale/ka/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/ka/LC_MESSAGES/django.po +3 -6
- wagtail/contrib/search_promotions/locale/ko/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/ko/LC_MESSAGES/django.po +14 -27
- wagtail/contrib/search_promotions/locale/lt/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/lt/LC_MESSAGES/django.po +15 -28
- wagtail/contrib/search_promotions/locale/lv/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/lv/LC_MESSAGES/django.po +9 -19
- wagtail/contrib/search_promotions/locale/mi/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/mi/LC_MESSAGES/django.po +6 -22
- wagtail/contrib/search_promotions/locale/mn/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/mn/LC_MESSAGES/django.po +9 -19
- wagtail/contrib/search_promotions/locale/my/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/my/LC_MESSAGES/django.po +3 -9
- wagtail/contrib/search_promotions/locale/nb/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/nb/LC_MESSAGES/django.po +14 -27
- wagtail/contrib/search_promotions/locale/nl/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/nl/LC_MESSAGES/django.po +25 -32
- wagtail/contrib/search_promotions/locale/pl/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/pl/LC_MESSAGES/django.po +17 -30
- wagtail/contrib/search_promotions/locale/pt_BR/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/pt_BR/LC_MESSAGES/django.po +18 -31
- wagtail/contrib/search_promotions/locale/pt_PT/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/pt_PT/LC_MESSAGES/django.po +15 -28
- wagtail/contrib/search_promotions/locale/ro/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/ro/LC_MESSAGES/django.po +18 -31
- wagtail/contrib/search_promotions/locale/ru/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/ru/LC_MESSAGES/django.po +27 -34
- wagtail/contrib/search_promotions/locale/sk_SK/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/sk_SK/LC_MESSAGES/django.po +12 -28
- wagtail/contrib/search_promotions/locale/sl/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/sl/LC_MESSAGES/django.po +18 -31
- wagtail/contrib/search_promotions/locale/sv/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/sv/LC_MESSAGES/django.po +15 -28
- wagtail/contrib/search_promotions/locale/tet/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/tet/LC_MESSAGES/django.po +15 -25
- wagtail/contrib/search_promotions/locale/th/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/th/LC_MESSAGES/django.po +15 -28
- wagtail/contrib/search_promotions/locale/tr/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/tr/LC_MESSAGES/django.po +15 -28
- wagtail/contrib/search_promotions/locale/tr_TR/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/tr_TR/LC_MESSAGES/django.po +15 -28
- wagtail/contrib/search_promotions/locale/ug/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/ug/LC_MESSAGES/django.po +14 -30
- wagtail/contrib/search_promotions/locale/uk/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/uk/LC_MESSAGES/django.po +15 -28
- wagtail/contrib/search_promotions/locale/vi/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/vi/LC_MESSAGES/django.po +3 -9
- wagtail/contrib/search_promotions/locale/zh/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/zh/LC_MESSAGES/django.po +9 -19
- wagtail/contrib/search_promotions/locale/zh_Hans/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/zh_Hans/LC_MESSAGES/django.po +15 -28
- wagtail/contrib/search_promotions/locale/zh_Hant/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/zh_Hant/LC_MESSAGES/django.po +15 -28
- wagtail/contrib/search_promotions/templates/wagtailsearchpromotions/add.html +21 -31
- wagtail/contrib/search_promotions/templates/wagtailsearchpromotions/confirm_delete.html +3 -12
- wagtail/contrib/search_promotions/templates/wagtailsearchpromotions/edit.html +11 -34
- wagtail/contrib/search_promotions/templates/wagtailsearchpromotions/includes/searchpromotion_form.html +1 -0
- wagtail/contrib/search_promotions/templates/wagtailsearchpromotions/includes/searchpromotions_formset.js +2 -1
- wagtail/contrib/search_promotions/templates/wagtailsearchpromotions/index.html +0 -1
- wagtail/contrib/search_promotions/tests.py +814 -13
- wagtail/contrib/search_promotions/views/__init__.py +1 -0
- wagtail/contrib/search_promotions/views/reports.py +56 -0
- wagtail/contrib/search_promotions/views/settings.py +258 -0
- wagtail/contrib/search_promotions/wagtail_hooks.py +12 -1
- wagtail/contrib/settings/locale/ar/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/settings/locale/ar/LC_MESSAGES/django.po +7 -2
- wagtail/contrib/settings/locale/az_AZ/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/be/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/bn/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/ca/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/cs/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/cy/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/da/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/de/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/dv/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/el/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/en/LC_MESSAGES/django.po +3 -3
- wagtail/contrib/settings/locale/en_IN/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/es/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/es_419/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/es_VE/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/et/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/fa/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/fi/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/fr/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/gl/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/he_IL/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/hi/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/hr_HR/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/ht/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/hu/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/id_ID/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/is_IS/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/it/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/ja/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/ka/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/ko/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/lt/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/lv/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/mi/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/mn/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/my/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/nb/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/nl/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/pl/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/pt_BR/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/pt_PT/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/ro/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/ru/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/sk_SK/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/sl/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/sr/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/sv/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/ta/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/tet/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/th/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/tr/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/tr_TR/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/ug/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/uk/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/vi/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/zh/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/zh_Hans/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/zh_Hant/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/templates/wagtailsettings/edit.html +1 -5
- wagtail/contrib/settings/tests/generic/test_admin.py +2 -5
- wagtail/contrib/settings/tests/generic/test_register.py +1 -1
- wagtail/contrib/settings/tests/site_specific/test_admin.py +2 -5
- wagtail/contrib/settings/tests/site_specific/test_register.py +1 -1
- wagtail/contrib/settings/views.py +9 -23
- wagtail/contrib/simple_translation/locale/ar/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/simple_translation/locale/be/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/simple_translation/locale/ca/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/simple_translation/locale/cs/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/simple_translation/locale/cy/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/simple_translation/locale/de/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/simple_translation/locale/dv/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/simple_translation/locale/el/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/simple_translation/locale/en/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/simple_translation/locale/es/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/simple_translation/locale/es_419/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/simple_translation/locale/fa/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/simple_translation/locale/fi/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/simple_translation/locale/fr/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/simple_translation/locale/gl/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/simple_translation/locale/hr_HR/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/simple_translation/locale/hu/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/simple_translation/locale/is_IS/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/simple_translation/locale/it/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/simple_translation/locale/ko/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/simple_translation/locale/lt/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/simple_translation/locale/mi/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/simple_translation/locale/mn/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/simple_translation/locale/nb/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/simple_translation/locale/nl/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/simple_translation/locale/pl/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/simple_translation/locale/pt_BR/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/simple_translation/locale/pt_PT/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/simple_translation/locale/ro/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/simple_translation/locale/ru/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/simple_translation/locale/sl/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/simple_translation/locale/sv/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/simple_translation/locale/ug/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/simple_translation/locale/uk/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/simple_translation/locale/vi/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/simple_translation/locale/zh_Hans/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/simple_translation/locale/zh_Hant/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/af/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/ar/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/az_AZ/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/be/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/bg/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/bn/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/ca/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/cs/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/cy/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/da/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/de/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/dv/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/el/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/en/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/en_IN/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/es/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/es_419/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/es_VE/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/et/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/fa/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/fi/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/fr/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/gl/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/he_IL/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/hi/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/hr_HR/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/ht/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/hu/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/id_ID/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/is_IS/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/it/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/ja/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/ka/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/ko/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/lt/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/lv/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/mi/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/mn/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/my/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/nb/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/nl/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/pl/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/pt_BR/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/pt_PT/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/ro/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/ru/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/sk_SK/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/sl/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/sv/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/ta/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/tet/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/th/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/tr/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/tr_TR/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/ug/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/uk/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/vi/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/zh/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/zh_Hans/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/styleguide/locale/zh_Hant/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/table_block/locale/ar/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/table_block/locale/be/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/table_block/locale/ca/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/table_block/locale/cs/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/table_block/locale/cy/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/table_block/locale/de/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/table_block/locale/dv/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/table_block/locale/el/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/table_block/locale/en/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/table_block/locale/en_IN/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/table_block/locale/es/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/table_block/locale/et/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/table_block/locale/fa/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/table_block/locale/fi/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/table_block/locale/fr/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/table_block/locale/gl/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/table_block/locale/hr_HR/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/table_block/locale/ht/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/table_block/locale/hu/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/table_block/locale/id_ID/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/table_block/locale/is_IS/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/table_block/locale/it/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/table_block/locale/ja/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/table_block/locale/ko/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/table_block/locale/lt/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/table_block/locale/lv/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/table_block/locale/mi/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/table_block/locale/mn/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/table_block/locale/my/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/table_block/locale/nb/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/table_block/locale/nl/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/table_block/locale/pl/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/table_block/locale/pt_BR/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/table_block/locale/pt_PT/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/table_block/locale/ro/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/table_block/locale/ru/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/table_block/locale/sk_SK/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/table_block/locale/sl/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/table_block/locale/sv/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/table_block/locale/tet/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/table_block/locale/th/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/table_block/locale/tr/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/table_block/locale/tr_TR/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/table_block/locale/ug/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/table_block/locale/uk/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/table_block/locale/vi/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/table_block/locale/zh_Hans/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/table_block/locale/zh_Hant/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/table_block/tests.py +4 -1
- wagtail/contrib/typed_table_block/blocks.py +3 -0
- wagtail/contrib/typed_table_block/locale/ar/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/typed_table_block/locale/be/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/typed_table_block/locale/ca/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/typed_table_block/locale/cy/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/typed_table_block/locale/de/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/typed_table_block/locale/dv/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/typed_table_block/locale/el/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/typed_table_block/locale/en/LC_MESSAGES/django.po +10 -10
- wagtail/contrib/typed_table_block/locale/es/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/typed_table_block/locale/fa/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/typed_table_block/locale/fi/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/typed_table_block/locale/fr/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/typed_table_block/locale/gl/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/typed_table_block/locale/hu/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/typed_table_block/locale/is_IS/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/typed_table_block/locale/it/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/typed_table_block/locale/ko/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/typed_table_block/locale/lt/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/typed_table_block/locale/nl/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/typed_table_block/locale/pl/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/typed_table_block/locale/pt_BR/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/typed_table_block/locale/pt_PT/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/typed_table_block/locale/ro/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/typed_table_block/locale/ru/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/typed_table_block/locale/sl/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/typed_table_block/locale/sv/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/typed_table_block/locale/th/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/typed_table_block/locale/ug/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/typed_table_block/locale/uk/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/typed_table_block/locale/zh/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/typed_table_block/locale/zh_Hans/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/typed_table_block/locale/zh_Hant/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/typed_table_block/static/typed_table_block/js/typed_table_block.js +1 -1
- wagtail/contrib/typed_table_block/tests.py +33 -0
- wagtail/documents/locale/af/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/ar/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/az_AZ/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/be/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/bg/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/bn/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/ca/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/cs/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/cy/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/da/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/de/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/dv/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/el/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/en/LC_MESSAGES/django.po +26 -26
- wagtail/documents/locale/es/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/es_419/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/et/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/eu/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/fa/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/fi/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/fr/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/gl/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/he_IL/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/hr_HR/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/ht/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/hu/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/id_ID/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/is_IS/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/it/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/ja/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/ka/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/ko/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/lt/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/lv/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/mi/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/mn/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/my/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/nb/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/nl/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/pl/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/pt_BR/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/pt_PT/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/ro/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/ru/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/sk_SK/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/sl/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/sv/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/tet/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/th/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/tr/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/tr_TR/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/ug/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/uk/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/vi/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/zh/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/zh_Hans/LC_MESSAGES/django.po +1 -1
- wagtail/documents/locale/zh_Hant/LC_MESSAGES/django.po +1 -1
- wagtail/documents/migrations/0011_add_choose_permissions.py +1 -0
- wagtail/documents/models.py +1 -0
- wagtail/documents/signal_handlers.py +6 -2
- wagtail/documents/static/wagtaildocs/js/add-multiple.js +1 -1
- wagtail/documents/templates/wagtaildocs/documents/edit.html +1 -3
- wagtail/documents/templates/wagtaildocs/multiple/add.html +7 -1
- wagtail/documents/tests/test_admin_views.py +74 -33
- wagtail/documents/tests/test_views.py +21 -12
- wagtail/documents/views/chooser.py +1 -0
- wagtail/documents/views/documents.py +1 -2
- wagtail/documents/views/multiple.py +0 -1
- wagtail/documents/views/serve.py +9 -2
- wagtail/documents/wagtail_hooks.py +6 -1
- wagtail/embeds/locale/ar/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/locale/az_AZ/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/locale/be/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/locale/bg/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/locale/bn/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/locale/ca/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/locale/cs/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/locale/cy/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/locale/da/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/locale/de/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/locale/dv/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/locale/el/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/locale/en/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/locale/es/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/locale/es_419/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/locale/et/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/locale/fa/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/locale/fi/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/locale/fr/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/locale/gl/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/locale/he_IL/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/locale/hr_HR/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/locale/ht/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/locale/hu/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/locale/id_ID/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/locale/is_IS/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/locale/it/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/locale/ja/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/locale/ko/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/locale/lt/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/locale/lv/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/locale/mi/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/locale/mn/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/locale/my/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/locale/nb/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/locale/nl/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/locale/pl/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/locale/pt_BR/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/locale/pt_PT/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/locale/ro/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/locale/ru/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/locale/sk_SK/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/locale/sl/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/locale/sv/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/locale/tet/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/locale/th/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/locale/tr/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/locale/tr_TR/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/locale/ug/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/locale/uk/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/locale/vi/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/locale/zh/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/locale/zh_Hans/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/locale/zh_Hant/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/oembed_providers.py +0 -64
- wagtail/fields.py +3 -0
- wagtail/images/apps.py +2 -1
- wagtail/images/blocks.py +6 -2
- wagtail/images/forms.py +40 -3
- wagtail/images/locale/ar/LC_MESSAGES/django.mo +0 -0
- wagtail/images/locale/ar/LC_MESSAGES/django.po +5 -1
- wagtail/images/locale/az_AZ/LC_MESSAGES/django.po +1 -1
- wagtail/images/locale/be/LC_MESSAGES/django.po +1 -1
- wagtail/images/locale/bg/LC_MESSAGES/django.po +1 -1
- wagtail/images/locale/bn/LC_MESSAGES/django.po +1 -1
- wagtail/images/locale/ca/LC_MESSAGES/django.po +1 -1
- wagtail/images/locale/cs/LC_MESSAGES/django.po +1 -1
- wagtail/images/locale/cy/LC_MESSAGES/django.po +1 -1
- wagtail/images/locale/da/LC_MESSAGES/django.po +1 -1
- wagtail/images/locale/de/LC_MESSAGES/django.po +1 -1
- wagtail/images/locale/dv/LC_MESSAGES/django.po +1 -1
- wagtail/images/locale/el/LC_MESSAGES/django.po +1 -1
- wagtail/images/locale/en/LC_MESSAGES/django.po +49 -49
- wagtail/images/locale/es/LC_MESSAGES/django.po +1 -1
- wagtail/images/locale/es_419/LC_MESSAGES/django.po +1 -1
- wagtail/images/locale/et/LC_MESSAGES/django.po +1 -1
- wagtail/images/locale/eu/LC_MESSAGES/django.po +1 -1
- wagtail/images/locale/fa/LC_MESSAGES/django.po +1 -1
- wagtail/images/locale/fi/LC_MESSAGES/django.po +1 -1
- wagtail/images/locale/fr/LC_MESSAGES/django.po +1 -1
- wagtail/images/locale/gl/LC_MESSAGES/django.po +1 -1
- wagtail/images/locale/he_IL/LC_MESSAGES/django.po +1 -1
- wagtail/images/locale/hr_HR/LC_MESSAGES/django.po +1 -1
- wagtail/images/locale/ht/LC_MESSAGES/django.po +1 -1
- wagtail/images/locale/hu/LC_MESSAGES/django.po +1 -1
- wagtail/images/locale/id_ID/LC_MESSAGES/django.po +1 -1
- wagtail/images/locale/is_IS/LC_MESSAGES/django.po +1 -1
- wagtail/images/locale/it/LC_MESSAGES/django.po +1 -1
- wagtail/images/locale/ja/LC_MESSAGES/django.po +1 -1
- wagtail/images/locale/ka/LC_MESSAGES/django.po +1 -1
- wagtail/images/locale/ko/LC_MESSAGES/django.po +1 -1
- wagtail/images/locale/lt/LC_MESSAGES/django.po +1 -1
- wagtail/images/locale/lv/LC_MESSAGES/django.po +1 -1
- wagtail/images/locale/mi/LC_MESSAGES/django.po +1 -1
- wagtail/images/locale/mn/LC_MESSAGES/django.po +1 -1
- wagtail/images/locale/my/LC_MESSAGES/django.po +1 -1
- wagtail/images/locale/nb/LC_MESSAGES/django.po +1 -1
- wagtail/images/locale/nl/LC_MESSAGES/django.po +1 -1
- wagtail/images/locale/pl/LC_MESSAGES/django.po +1 -1
- wagtail/images/locale/pt_BR/LC_MESSAGES/django.po +1 -1
- wagtail/images/locale/pt_PT/LC_MESSAGES/django.po +1 -1
- wagtail/images/locale/ro/LC_MESSAGES/django.po +1 -1
- wagtail/images/locale/ru/LC_MESSAGES/django.po +1 -1
- wagtail/images/locale/sk_SK/LC_MESSAGES/django.po +1 -1
- wagtail/images/locale/sl/LC_MESSAGES/django.po +1 -1
- wagtail/images/locale/sv/LC_MESSAGES/django.po +1 -1
- wagtail/images/locale/tet/LC_MESSAGES/django.po +1 -1
- wagtail/images/locale/th/LC_MESSAGES/django.po +1 -1
- wagtail/images/locale/tr/LC_MESSAGES/django.po +1 -1
- wagtail/images/locale/tr_TR/LC_MESSAGES/django.po +1 -1
- wagtail/images/locale/ug/LC_MESSAGES/django.po +1 -1
- wagtail/images/locale/uk/LC_MESSAGES/django.po +1 -1
- wagtail/images/locale/vi/LC_MESSAGES/django.po +1 -1
- wagtail/images/locale/zh/LC_MESSAGES/django.po +1 -1
- wagtail/images/locale/zh_Hans/LC_MESSAGES/django.po +1 -1
- wagtail/images/locale/zh_Hant/LC_MESSAGES/django.po +1 -1
- wagtail/images/migrations/0023_add_choose_permissions.py +1 -0
- wagtail/images/rich_text/contentstate.py +1 -0
- wagtail/images/rich_text/editor_html.py +1 -0
- wagtail/images/signal_handlers.py +17 -10
- wagtail/images/static/wagtailimages/js/add-multiple.js +1 -1
- wagtail/images/static/wagtailimages/js/image-block.js +1 -1
- wagtail/images/static/wagtailimages/js/image-chooser-telepath.js +1 -1
- wagtail/images/static/wagtailimages/js/image-chooser.js +1 -1
- wagtail/images/static/wagtailimages/js/image-url-generator.js +1 -1
- wagtail/images/static/wagtailimages/js/vendor/jquery.fileupload-image.js +1 -1
- wagtail/images/tasks.py +18 -0
- wagtail/images/templates/wagtailimages/images/edit.html +1 -3
- wagtail/images/templates/wagtailimages/images/url_generator.html +1 -1
- wagtail/images/templates/wagtailimages/multiple/add.html +7 -2
- wagtail/images/templates/wagtailimages/widgets/image_chooser.html +1 -1
- wagtail/images/tests/test_admin_views.py +53 -29
- wagtail/images/tests/test_blocks.py +3 -2
- wagtail/images/tests/test_models.py +12 -10
- wagtail/images/tests/tests.py +10 -0
- wagtail/images/views/chooser.py +1 -0
- wagtail/images/views/images.py +1 -3
- wagtail/images/views/multiple.py +0 -1
- wagtail/images/views/serve.py +18 -2
- wagtail/images/widgets.py +3 -0
- wagtail/locale/af/LC_MESSAGES/django.po +1 -1
- wagtail/locale/ar/LC_MESSAGES/django.mo +0 -0
- wagtail/locale/ar/LC_MESSAGES/django.po +10 -1
- wagtail/locale/az_AZ/LC_MESSAGES/django.po +1 -1
- wagtail/locale/be/LC_MESSAGES/django.mo +0 -0
- wagtail/locale/be/LC_MESSAGES/django.po +4 -1
- wagtail/locale/bg/LC_MESSAGES/django.mo +0 -0
- wagtail/locale/bg/LC_MESSAGES/django.po +4 -1
- wagtail/locale/bn/LC_MESSAGES/django.mo +0 -0
- wagtail/locale/bn/LC_MESSAGES/django.po +7 -1
- wagtail/locale/ca/LC_MESSAGES/django.mo +0 -0
- wagtail/locale/ca/LC_MESSAGES/django.po +10 -1
- wagtail/locale/cs/LC_MESSAGES/django.mo +0 -0
- wagtail/locale/cs/LC_MESSAGES/django.po +10 -1
- wagtail/locale/cy/LC_MESSAGES/django.mo +0 -0
- wagtail/locale/cy/LC_MESSAGES/django.po +7 -1
- wagtail/locale/da/LC_MESSAGES/django.mo +0 -0
- wagtail/locale/da/LC_MESSAGES/django.po +10 -1
- wagtail/locale/de/LC_MESSAGES/django.mo +0 -0
- wagtail/locale/de/LC_MESSAGES/django.po +10 -1
- wagtail/locale/dv/LC_MESSAGES/django.mo +0 -0
- wagtail/locale/dv/LC_MESSAGES/django.po +10 -1
- wagtail/locale/el/LC_MESSAGES/django.mo +0 -0
- wagtail/locale/el/LC_MESSAGES/django.po +10 -1
- wagtail/locale/en/LC_MESSAGES/django.po +228 -216
- wagtail/locale/es/LC_MESSAGES/django.mo +0 -0
- wagtail/locale/es/LC_MESSAGES/django.po +10 -1
- wagtail/locale/es_419/LC_MESSAGES/django.mo +0 -0
- wagtail/locale/es_419/LC_MESSAGES/django.po +7 -1
- wagtail/locale/et/LC_MESSAGES/django.mo +0 -0
- wagtail/locale/et/LC_MESSAGES/django.po +4 -1
- wagtail/locale/eu/LC_MESSAGES/django.po +1 -1
- wagtail/locale/fa/LC_MESSAGES/django.mo +0 -0
- wagtail/locale/fa/LC_MESSAGES/django.po +10 -1
- wagtail/locale/fi/LC_MESSAGES/django.mo +0 -0
- wagtail/locale/fi/LC_MESSAGES/django.po +10 -1
- wagtail/locale/fr/LC_MESSAGES/django.mo +0 -0
- wagtail/locale/fr/LC_MESSAGES/django.po +10 -1
- wagtail/locale/gl/LC_MESSAGES/django.mo +0 -0
- wagtail/locale/gl/LC_MESSAGES/django.po +10 -1
- wagtail/locale/he_IL/LC_MESSAGES/django.mo +0 -0
- wagtail/locale/he_IL/LC_MESSAGES/django.po +4 -1
- wagtail/locale/hr_HR/LC_MESSAGES/django.mo +0 -0
- wagtail/locale/hr_HR/LC_MESSAGES/django.po +4 -1
- wagtail/locale/hu/LC_MESSAGES/django.mo +0 -0
- wagtail/locale/hu/LC_MESSAGES/django.po +10 -1
- wagtail/locale/id_ID/LC_MESSAGES/django.mo +0 -0
- wagtail/locale/id_ID/LC_MESSAGES/django.po +4 -1
- wagtail/locale/is_IS/LC_MESSAGES/django.mo +0 -0
- wagtail/locale/is_IS/LC_MESSAGES/django.po +10 -1
- wagtail/locale/it/LC_MESSAGES/django.mo +0 -0
- wagtail/locale/it/LC_MESSAGES/django.po +10 -1
- wagtail/locale/ja/LC_MESSAGES/django.mo +0 -0
- wagtail/locale/ja/LC_MESSAGES/django.po +10 -1
- wagtail/locale/ka/LC_MESSAGES/django.po +1 -1
- wagtail/locale/ko/LC_MESSAGES/django.mo +0 -0
- wagtail/locale/ko/LC_MESSAGES/django.po +10 -1
- wagtail/locale/lt/LC_MESSAGES/django.mo +0 -0
- wagtail/locale/lt/LC_MESSAGES/django.po +10 -1
- wagtail/locale/lv/LC_MESSAGES/django.mo +0 -0
- wagtail/locale/lv/LC_MESSAGES/django.po +4 -1
- wagtail/locale/mi/LC_MESSAGES/django.po +1 -1
- wagtail/locale/mn/LC_MESSAGES/django.mo +0 -0
- wagtail/locale/mn/LC_MESSAGES/django.po +4 -1
- wagtail/locale/my/LC_MESSAGES/django.po +1 -1
- wagtail/locale/nb/LC_MESSAGES/django.mo +0 -0
- wagtail/locale/nb/LC_MESSAGES/django.po +10 -1
- wagtail/locale/nl/LC_MESSAGES/django.mo +0 -0
- wagtail/locale/nl/LC_MESSAGES/django.po +10 -1
- wagtail/locale/pl/LC_MESSAGES/django.mo +0 -0
- wagtail/locale/pl/LC_MESSAGES/django.po +10 -1
- wagtail/locale/pt_BR/LC_MESSAGES/django.mo +0 -0
- wagtail/locale/pt_BR/LC_MESSAGES/django.po +10 -1
- wagtail/locale/pt_PT/LC_MESSAGES/django.mo +0 -0
- wagtail/locale/pt_PT/LC_MESSAGES/django.po +10 -1
- wagtail/locale/ro/LC_MESSAGES/django.mo +0 -0
- wagtail/locale/ro/LC_MESSAGES/django.po +10 -1
- wagtail/locale/ru/LC_MESSAGES/django.mo +0 -0
- wagtail/locale/ru/LC_MESSAGES/django.po +10 -1
- wagtail/locale/sk_SK/LC_MESSAGES/django.mo +0 -0
- wagtail/locale/sk_SK/LC_MESSAGES/django.po +4 -1
- wagtail/locale/sl/LC_MESSAGES/django.mo +0 -0
- wagtail/locale/sl/LC_MESSAGES/django.po +10 -1
- wagtail/locale/sv/LC_MESSAGES/django.mo +0 -0
- wagtail/locale/sv/LC_MESSAGES/django.po +10 -1
- wagtail/locale/tet/LC_MESSAGES/django.mo +0 -0
- wagtail/locale/tet/LC_MESSAGES/django.po +4 -1
- wagtail/locale/th/LC_MESSAGES/django.mo +0 -0
- wagtail/locale/th/LC_MESSAGES/django.po +4 -1
- wagtail/locale/tr/LC_MESSAGES/django.mo +0 -0
- wagtail/locale/tr/LC_MESSAGES/django.po +4 -1
- wagtail/locale/tr_TR/LC_MESSAGES/django.mo +0 -0
- wagtail/locale/tr_TR/LC_MESSAGES/django.po +4 -1
- wagtail/locale/ug/LC_MESSAGES/django.mo +0 -0
- wagtail/locale/ug/LC_MESSAGES/django.po +10 -1
- wagtail/locale/uk/LC_MESSAGES/django.mo +0 -0
- wagtail/locale/uk/LC_MESSAGES/django.po +10 -1
- wagtail/locale/vi/LC_MESSAGES/django.po +1 -1
- wagtail/locale/zh/LC_MESSAGES/django.mo +0 -0
- wagtail/locale/zh/LC_MESSAGES/django.po +4 -1
- wagtail/locale/zh_Hans/LC_MESSAGES/django.mo +0 -0
- wagtail/locale/zh_Hans/LC_MESSAGES/django.po +10 -1
- wagtail/locale/zh_Hant/LC_MESSAGES/django.mo +0 -0
- wagtail/locale/zh_Hant/LC_MESSAGES/django.po +4 -1
- wagtail/locales/locale/ar/LC_MESSAGES/django.po +1 -1
- wagtail/locales/locale/be/LC_MESSAGES/django.po +1 -1
- wagtail/locales/locale/bg/LC_MESSAGES/django.po +1 -1
- wagtail/locales/locale/ca/LC_MESSAGES/django.po +1 -1
- wagtail/locales/locale/cs/LC_MESSAGES/django.po +1 -1
- wagtail/locales/locale/cy/LC_MESSAGES/django.po +1 -1
- wagtail/locales/locale/da/LC_MESSAGES/django.po +1 -1
- wagtail/locales/locale/de/LC_MESSAGES/django.po +1 -1
- wagtail/locales/locale/dv/LC_MESSAGES/django.po +1 -1
- wagtail/locales/locale/el/LC_MESSAGES/django.po +1 -1
- wagtail/locales/locale/en/LC_MESSAGES/django.po +1 -1
- wagtail/locales/locale/es/LC_MESSAGES/django.po +1 -1
- wagtail/locales/locale/et/LC_MESSAGES/django.po +1 -1
- wagtail/locales/locale/fa/LC_MESSAGES/django.po +1 -1
- wagtail/locales/locale/fi/LC_MESSAGES/django.po +1 -1
- wagtail/locales/locale/fr/LC_MESSAGES/django.po +1 -1
- wagtail/locales/locale/gl/LC_MESSAGES/django.po +1 -1
- wagtail/locales/locale/he_IL/LC_MESSAGES/django.po +1 -1
- wagtail/locales/locale/hr_HR/LC_MESSAGES/django.po +1 -1
- wagtail/locales/locale/hu/LC_MESSAGES/django.po +1 -1
- wagtail/locales/locale/id_ID/LC_MESSAGES/django.po +1 -1
- wagtail/locales/locale/is_IS/LC_MESSAGES/django.po +1 -1
- wagtail/locales/locale/it/LC_MESSAGES/django.po +1 -1
- wagtail/locales/locale/ja/LC_MESSAGES/django.po +1 -1
- wagtail/locales/locale/ko/LC_MESSAGES/django.po +1 -1
- wagtail/locales/locale/lt/LC_MESSAGES/django.po +1 -1
- wagtail/locales/locale/lv/LC_MESSAGES/django.po +1 -1
- wagtail/locales/locale/mi/LC_MESSAGES/django.po +1 -1
- wagtail/locales/locale/mn/LC_MESSAGES/django.po +1 -1
- wagtail/locales/locale/my/LC_MESSAGES/django.po +1 -1
- wagtail/locales/locale/nb/LC_MESSAGES/django.po +1 -1
- wagtail/locales/locale/nl/LC_MESSAGES/django.po +1 -1
- wagtail/locales/locale/pl/LC_MESSAGES/django.po +1 -1
- wagtail/locales/locale/pt_BR/LC_MESSAGES/django.po +1 -1
- wagtail/locales/locale/pt_PT/LC_MESSAGES/django.po +1 -1
- wagtail/locales/locale/ro/LC_MESSAGES/django.po +1 -1
- wagtail/locales/locale/ru/LC_MESSAGES/django.po +1 -1
- wagtail/locales/locale/sk_SK/LC_MESSAGES/django.po +1 -1
- wagtail/locales/locale/sl/LC_MESSAGES/django.po +1 -1
- wagtail/locales/locale/sv/LC_MESSAGES/django.po +1 -1
- wagtail/locales/locale/tet/LC_MESSAGES/django.po +1 -1
- wagtail/locales/locale/th/LC_MESSAGES/django.po +1 -1
- wagtail/locales/locale/tr/LC_MESSAGES/django.po +1 -1
- wagtail/locales/locale/tr_TR/LC_MESSAGES/django.po +1 -1
- wagtail/locales/locale/ug/LC_MESSAGES/django.po +1 -1
- wagtail/locales/locale/uk/LC_MESSAGES/django.po +1 -1
- wagtail/locales/locale/vi/LC_MESSAGES/django.po +1 -1
- wagtail/locales/locale/zh/LC_MESSAGES/django.po +1 -1
- wagtail/locales/locale/zh_Hans/LC_MESSAGES/django.po +1 -1
- wagtail/locales/locale/zh_Hant/LC_MESSAGES/django.po +1 -1
- wagtail/management/commands/publish_scheduled.py +1 -1
- wagtail/migrations/0087_alter_grouppagepermission_unique_together_and_more.py +16 -8
- wagtail/models/__init__.py +300 -119
- wagtail/models/i18n.py +2 -2
- wagtail/models/panels.py +37 -0
- wagtail/models/sites.py +7 -6
- wagtail/permission_policies/pages.py +2 -2
- wagtail/project_template/project_name/settings/base.py +4 -0
- wagtail/project_template/requirements.txt +1 -1
- wagtail/query.py +145 -0
- wagtail/search/backends/database/mysql/mysql.py +25 -17
- wagtail/search/backends/database/postgres/postgres.py +44 -83
- wagtail/search/backends/database/sqlite/sqlite.py +25 -17
- wagtail/search/backends/elasticsearch7.py +4 -0
- wagtail/search/locale/ar/LC_MESSAGES/django.po +1 -1
- wagtail/search/locale/be/LC_MESSAGES/django.po +1 -1
- wagtail/search/locale/ca/LC_MESSAGES/django.po +1 -1
- wagtail/search/locale/cs/LC_MESSAGES/django.po +1 -1
- wagtail/search/locale/cy/LC_MESSAGES/django.po +1 -1
- wagtail/search/locale/de/LC_MESSAGES/django.po +1 -1
- wagtail/search/locale/dv/LC_MESSAGES/django.po +1 -1
- wagtail/search/locale/en/LC_MESSAGES/django.po +1 -1
- wagtail/search/locale/es/LC_MESSAGES/django.po +1 -1
- wagtail/search/locale/et/LC_MESSAGES/django.po +1 -1
- wagtail/search/locale/fa/LC_MESSAGES/django.po +1 -1
- wagtail/search/locale/fi/LC_MESSAGES/django.po +1 -1
- wagtail/search/locale/fr/LC_MESSAGES/django.po +1 -1
- wagtail/search/locale/gl/LC_MESSAGES/django.po +1 -1
- wagtail/search/locale/hr_HR/LC_MESSAGES/django.po +1 -1
- wagtail/search/locale/ht/LC_MESSAGES/django.po +1 -1
- wagtail/search/locale/hu/LC_MESSAGES/django.po +1 -1
- wagtail/search/locale/id_ID/LC_MESSAGES/django.po +1 -1
- wagtail/search/locale/is_IS/LC_MESSAGES/django.po +1 -1
- wagtail/search/locale/it/LC_MESSAGES/django.po +1 -1
- wagtail/search/locale/ja/LC_MESSAGES/django.po +1 -1
- wagtail/search/locale/ko/LC_MESSAGES/django.po +1 -1
- wagtail/search/locale/lt/LC_MESSAGES/django.po +1 -1
- wagtail/search/locale/mi/LC_MESSAGES/django.po +1 -1
- wagtail/search/locale/mn/LC_MESSAGES/django.po +1 -1
- wagtail/search/locale/my/LC_MESSAGES/django.po +1 -1
- wagtail/search/locale/nb/LC_MESSAGES/django.po +1 -1
- wagtail/search/locale/nl/LC_MESSAGES/django.po +1 -1
- wagtail/search/locale/pl/LC_MESSAGES/django.po +1 -1
- wagtail/search/locale/pt_BR/LC_MESSAGES/django.po +1 -1
- wagtail/search/locale/pt_PT/LC_MESSAGES/django.po +1 -1
- wagtail/search/locale/ro/LC_MESSAGES/django.po +1 -1
- wagtail/search/locale/ru/LC_MESSAGES/django.po +1 -1
- wagtail/search/locale/sl/LC_MESSAGES/django.po +1 -1
- wagtail/search/locale/sv/LC_MESSAGES/django.po +1 -1
- wagtail/search/locale/tet/LC_MESSAGES/django.po +1 -1
- wagtail/search/locale/th/LC_MESSAGES/django.po +1 -1
- wagtail/search/locale/tr/LC_MESSAGES/django.po +1 -1
- wagtail/search/locale/tr_TR/LC_MESSAGES/django.po +1 -1
- wagtail/search/locale/ug/LC_MESSAGES/django.po +1 -1
- wagtail/search/locale/uk/LC_MESSAGES/django.po +1 -1
- wagtail/search/locale/vi/LC_MESSAGES/django.po +1 -1
- wagtail/search/locale/zh_Hans/LC_MESSAGES/django.po +1 -1
- wagtail/search/locale/zh_Hant/LC_MESSAGES/django.po +1 -1
- wagtail/search/query.py +8 -2
- wagtail/search/signal_handlers.py +6 -9
- wagtail/search/tasks.py +10 -0
- wagtail/search/tests/test_elasticsearch7_backend.py +21 -0
- wagtail/search/tests/test_index_functions.py +10 -6
- wagtail/search/tests/test_postgres_backend.py +0 -14
- wagtail/signal_handlers.py +5 -20
- wagtail/sites/locale/ar/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/be/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/bn/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/ca/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/cs/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/cy/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/da/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/de/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/dv/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/el/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/en/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/en_IN/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/es/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/es_419/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/es_VE/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/et/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/fa/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/fi/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/fr/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/gl/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/he_IL/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/hi/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/hr_HR/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/ht/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/hu/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/id_ID/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/is_IS/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/it/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/ja/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/ka/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/ko/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/lt/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/lv/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/mi/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/mn/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/my/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/nb/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/nl/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/pl/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/pt_BR/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/pt_PT/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/ro/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/ru/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/sk_SK/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/sl/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/sr/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/sv/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/ta/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/tet/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/th/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/tr/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/tr_TR/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/ug/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/uk/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/vi/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/zh_Hans/LC_MESSAGES/django.po +1 -1
- wagtail/sites/locale/zh_Hant/LC_MESSAGES/django.po +1 -1
- wagtail/snippets/locale/af/LC_MESSAGES/django.po +1 -1
- wagtail/snippets/locale/ar/LC_MESSAGES/django.po +1 -1
- wagtail/snippets/locale/az_AZ/LC_MESSAGES/django.po +1 -1
- wagtail/snippets/locale/be/LC_MESSAGES/django.po +1 -1
- wagtail/snippets/locale/bg/LC_MESSAGES/django.po +1 -1
- wagtail/snippets/locale/bn/LC_MESSAGES/django.po +1 -1
- wagtail/snippets/locale/ca/LC_MESSAGES/django.mo +0 -0
- wagtail/snippets/locale/ca/LC_MESSAGES/django.po +1 -9
- wagtail/snippets/locale/cs/LC_MESSAGES/django.po +1 -1
- wagtail/snippets/locale/cy/LC_MESSAGES/django.mo +0 -0
- wagtail/snippets/locale/cy/LC_MESSAGES/django.po +1 -9
- wagtail/snippets/locale/da/LC_MESSAGES/django.po +1 -1
- wagtail/snippets/locale/de/LC_MESSAGES/django.mo +0 -0
- wagtail/snippets/locale/de/LC_MESSAGES/django.po +1 -9
- wagtail/snippets/locale/dv/LC_MESSAGES/django.po +1 -1
- wagtail/snippets/locale/el/LC_MESSAGES/django.po +1 -1
- wagtail/snippets/locale/en/LC_MESSAGES/django.po +3 -13
- wagtail/snippets/locale/en_IN/LC_MESSAGES/django.po +1 -1
- wagtail/snippets/locale/es/LC_MESSAGES/django.mo +0 -0
- wagtail/snippets/locale/es/LC_MESSAGES/django.po +1 -9
- wagtail/snippets/locale/es_419/LC_MESSAGES/django.po +1 -1
- wagtail/snippets/locale/es_VE/LC_MESSAGES/django.po +1 -1
- wagtail/snippets/locale/et/LC_MESSAGES/django.po +1 -1
- wagtail/snippets/locale/eu/LC_MESSAGES/django.po +1 -1
- wagtail/snippets/locale/fa/LC_MESSAGES/django.po +1 -1
- wagtail/snippets/locale/fi/LC_MESSAGES/django.mo +0 -0
- wagtail/snippets/locale/fi/LC_MESSAGES/django.po +1 -5
- wagtail/snippets/locale/fr/LC_MESSAGES/django.mo +0 -0
- wagtail/snippets/locale/fr/LC_MESSAGES/django.po +1 -9
- wagtail/snippets/locale/gl/LC_MESSAGES/django.mo +0 -0
- wagtail/snippets/locale/gl/LC_MESSAGES/django.po +1 -9
- wagtail/snippets/locale/he_IL/LC_MESSAGES/django.po +1 -1
- wagtail/snippets/locale/hi/LC_MESSAGES/django.po +1 -1
- wagtail/snippets/locale/hr_HR/LC_MESSAGES/django.mo +0 -0
- wagtail/snippets/locale/hr_HR/LC_MESSAGES/django.po +1 -9
- wagtail/snippets/locale/ht/LC_MESSAGES/django.po +1 -1
- wagtail/snippets/locale/hu/LC_MESSAGES/django.mo +0 -0
- wagtail/snippets/locale/hu/LC_MESSAGES/django.po +1 -9
- wagtail/snippets/locale/id_ID/LC_MESSAGES/django.po +1 -1
- wagtail/snippets/locale/is_IS/LC_MESSAGES/django.mo +0 -0
- wagtail/snippets/locale/is_IS/LC_MESSAGES/django.po +1 -9
- wagtail/snippets/locale/it/LC_MESSAGES/django.mo +0 -0
- wagtail/snippets/locale/it/LC_MESSAGES/django.po +1 -9
- wagtail/snippets/locale/ja/LC_MESSAGES/django.po +1 -1
- wagtail/snippets/locale/ka/LC_MESSAGES/django.po +1 -1
- wagtail/snippets/locale/ko/LC_MESSAGES/django.po +1 -1
- wagtail/snippets/locale/lt/LC_MESSAGES/django.po +1 -1
- wagtail/snippets/locale/lv/LC_MESSAGES/django.po +1 -1
- wagtail/snippets/locale/mi/LC_MESSAGES/django.po +1 -1
- wagtail/snippets/locale/mn/LC_MESSAGES/django.po +1 -1
- wagtail/snippets/locale/my/LC_MESSAGES/django.po +1 -1
- wagtail/snippets/locale/nb/LC_MESSAGES/django.mo +0 -0
- wagtail/snippets/locale/nb/LC_MESSAGES/django.po +1 -9
- wagtail/snippets/locale/nl/LC_MESSAGES/django.mo +0 -0
- wagtail/snippets/locale/nl/LC_MESSAGES/django.po +1 -9
- wagtail/snippets/locale/pl/LC_MESSAGES/django.mo +0 -0
- wagtail/snippets/locale/pl/LC_MESSAGES/django.po +1 -9
- wagtail/snippets/locale/pt_BR/LC_MESSAGES/django.mo +0 -0
- wagtail/snippets/locale/pt_BR/LC_MESSAGES/django.po +1 -9
- wagtail/snippets/locale/pt_PT/LC_MESSAGES/django.po +1 -1
- wagtail/snippets/locale/ro/LC_MESSAGES/django.mo +0 -0
- wagtail/snippets/locale/ro/LC_MESSAGES/django.po +1 -9
- wagtail/snippets/locale/ru/LC_MESSAGES/django.mo +0 -0
- wagtail/snippets/locale/ru/LC_MESSAGES/django.po +1 -9
- wagtail/snippets/locale/sk_SK/LC_MESSAGES/django.po +1 -1
- wagtail/snippets/locale/sl/LC_MESSAGES/django.mo +0 -0
- wagtail/snippets/locale/sl/LC_MESSAGES/django.po +1 -9
- wagtail/snippets/locale/sr/LC_MESSAGES/django.po +1 -1
- wagtail/snippets/locale/sv/LC_MESSAGES/django.mo +0 -0
- wagtail/snippets/locale/sv/LC_MESSAGES/django.po +1 -9
- wagtail/snippets/locale/ta/LC_MESSAGES/django.po +1 -1
- wagtail/snippets/locale/tet/LC_MESSAGES/django.po +1 -1
- wagtail/snippets/locale/th/LC_MESSAGES/django.po +1 -1
- wagtail/snippets/locale/tr/LC_MESSAGES/django.po +1 -1
- wagtail/snippets/locale/tr_TR/LC_MESSAGES/django.po +1 -1
- wagtail/snippets/locale/ug/LC_MESSAGES/django.mo +0 -0
- wagtail/snippets/locale/ug/LC_MESSAGES/django.po +1 -9
- wagtail/snippets/locale/uk/LC_MESSAGES/django.po +1 -1
- wagtail/snippets/locale/vi/LC_MESSAGES/django.po +1 -1
- wagtail/snippets/locale/zh/LC_MESSAGES/django.po +1 -1
- wagtail/snippets/locale/zh_Hans/LC_MESSAGES/django.mo +0 -0
- wagtail/snippets/locale/zh_Hans/LC_MESSAGES/django.po +1 -9
- wagtail/snippets/locale/zh_Hant/LC_MESSAGES/django.po +1 -1
- wagtail/snippets/tests/test_preview.py +5 -0
- wagtail/snippets/tests/test_snippets.py +100 -45
- wagtail/snippets/tests/test_usage.py +29 -24
- wagtail/snippets/tests/test_viewset.py +1 -1
- wagtail/snippets/views/snippets.py +0 -12
- wagtail/tasks.py +41 -0
- wagtail/templates/wagtailcore/shared/block_preview.html +37 -0
- wagtail/test/earlypage/__init__.py +0 -0
- wagtail/test/earlypage/migrations/0001_initial.py +37 -0
- wagtail/test/earlypage/migrations/__init__.py +0 -0
- wagtail/test/earlypage/models.py +14 -0
- wagtail/test/settings.py +3 -0
- wagtail/test/testapp/fixtures/test.json +7 -0
- wagtail/test/testapp/fixtures/test_specific.json +6 -3
- wagtail/test/testapp/models.py +58 -44
- wagtail/test/testapp/templates/tests/custom_block_preview.html +16 -0
- wagtail/test/testapp/templates/tests/static_block_preview.html +5 -0
- wagtail/test/testapp/wagtail_hooks.py +9 -0
- wagtail/tests/test_blocks.py +200 -2
- wagtail/tests/test_hooks.py +166 -1
- wagtail/tests/test_management_commands.py +54 -13
- wagtail/tests/test_page_allowed_http_methods.py +32 -0
- wagtail/tests/test_page_model.py +68 -0
- wagtail/tests/test_page_privacy.py +10 -0
- wagtail/tests/test_page_queryset.py +79 -0
- wagtail/tests/test_reference_index.py +84 -75
- wagtail/tests/test_streamfield.py +12 -0
- wagtail/tests/test_utils.py +61 -0
- wagtail/users/forms.py +2 -9
- wagtail/users/locale/ar/LC_MESSAGES/django.po +1 -1
- wagtail/users/locale/be/LC_MESSAGES/django.po +1 -1
- wagtail/users/locale/bg/LC_MESSAGES/django.po +1 -1
- wagtail/users/locale/bn/LC_MESSAGES/django.po +1 -1
- wagtail/users/locale/ca/LC_MESSAGES/django.po +1 -1
- wagtail/users/locale/cs/LC_MESSAGES/django.po +1 -1
- wagtail/users/locale/cy/LC_MESSAGES/django.po +1 -1
- wagtail/users/locale/da/LC_MESSAGES/django.po +1 -1
- wagtail/users/locale/de/LC_MESSAGES/django.po +1 -1
- wagtail/users/locale/dv/LC_MESSAGES/django.po +1 -1
- wagtail/users/locale/el/LC_MESSAGES/django.po +1 -1
- wagtail/users/locale/en/LC_MESSAGES/django.po +17 -17
- wagtail/users/locale/es/LC_MESSAGES/django.po +1 -1
- wagtail/users/locale/es_419/LC_MESSAGES/django.po +1 -1
- wagtail/users/locale/et/LC_MESSAGES/django.po +1 -1
- wagtail/users/locale/eu/LC_MESSAGES/django.po +1 -1
- wagtail/users/locale/fa/LC_MESSAGES/django.po +1 -1
- wagtail/users/locale/fi/LC_MESSAGES/django.po +1 -1
- wagtail/users/locale/fr/LC_MESSAGES/django.po +1 -1
- wagtail/users/locale/gl/LC_MESSAGES/django.po +1 -1
- wagtail/users/locale/he_IL/LC_MESSAGES/django.po +1 -1
- wagtail/users/locale/hr_HR/LC_MESSAGES/django.po +1 -1
- wagtail/users/locale/hu/LC_MESSAGES/django.po +1 -1
- wagtail/users/locale/hy/LC_MESSAGES/django.po +1 -1
- wagtail/users/locale/id_ID/LC_MESSAGES/django.po +1 -1
- wagtail/users/locale/is_IS/LC_MESSAGES/django.po +1 -1
- wagtail/users/locale/it/LC_MESSAGES/django.po +1 -1
- wagtail/users/locale/ja/LC_MESSAGES/django.po +1 -1
- wagtail/users/locale/ka/LC_MESSAGES/django.po +1 -1
- wagtail/users/locale/ko/LC_MESSAGES/django.po +1 -1
- wagtail/users/locale/lt/LC_MESSAGES/django.po +1 -1
- wagtail/users/locale/lv/LC_MESSAGES/django.po +1 -1
- wagtail/users/locale/mi/LC_MESSAGES/django.po +1 -1
- wagtail/users/locale/mn/LC_MESSAGES/django.po +1 -1
- wagtail/users/locale/my/LC_MESSAGES/django.po +1 -1
- wagtail/users/locale/nb/LC_MESSAGES/django.po +1 -1
- wagtail/users/locale/nl/LC_MESSAGES/django.po +1 -1
- wagtail/users/locale/pl/LC_MESSAGES/django.po +1 -1
- wagtail/users/locale/pt_BR/LC_MESSAGES/django.po +1 -1
- wagtail/users/locale/pt_PT/LC_MESSAGES/django.po +1 -1
- wagtail/users/locale/ro/LC_MESSAGES/django.po +1 -1
- wagtail/users/locale/ru/LC_MESSAGES/django.po +1 -1
- wagtail/users/locale/sk_SK/LC_MESSAGES/django.po +1 -1
- wagtail/users/locale/sl/LC_MESSAGES/django.po +1 -1
- wagtail/users/locale/sv/LC_MESSAGES/django.po +1 -1
- wagtail/users/locale/tet/LC_MESSAGES/django.po +1 -1
- wagtail/users/locale/th/LC_MESSAGES/django.po +1 -1
- wagtail/users/locale/tr/LC_MESSAGES/django.po +1 -1
- wagtail/users/locale/tr_TR/LC_MESSAGES/django.po +1 -1
- wagtail/users/locale/ug/LC_MESSAGES/django.po +1 -1
- wagtail/users/locale/uk/LC_MESSAGES/django.po +1 -1
- wagtail/users/locale/vi/LC_MESSAGES/django.po +1 -1
- wagtail/users/locale/zh/LC_MESSAGES/django.po +1 -1
- wagtail/users/locale/zh_Hans/LC_MESSAGES/django.po +1 -1
- wagtail/users/locale/zh_Hant/LC_MESSAGES/django.po +1 -1
- wagtail/users/templates/wagtailusers/groups/create.html +0 -5
- wagtail/users/templates/wagtailusers/groups/includes/page_permissions_form.html +1 -1
- wagtail/users/templates/wagtailusers/groups/includes/page_permissions_formset.html +6 -6
- wagtail/users/tests/test_admin_views.py +96 -4
- wagtail/users/tests/test_utils.py +76 -0
- wagtail/users/utils.py +43 -11
- wagtail/utils/setup.py +2 -2
- wagtail/utils/templates.py +26 -0
- wagtail/utils/widgets.py +1 -0
- wagtail/views.py +9 -1
- wagtail/wagtail_hooks.py +67 -29
- {wagtail-6.3.3.dist-info → wagtail-6.4.dist-info}/METADATA +2 -2
- {wagtail-6.3.3.dist-info → wagtail-6.4.dist-info}/RECORD +1549 -1540
- wagtail/admin/static/wagtailadmin/js/expanding-formset.js +0 -1
- wagtail/admin/static/wagtailadmin/js/vendor/rangy-core.js +0 -1
- wagtail/admin/static/wagtailadmin/js/vendor/uuidv4.min.js +0 -1
- wagtail/contrib/redirects/locale/az_AZ/LC_MESSAGES/django.po +0 -22
- wagtail/contrib/search_promotions/locale/en_IN/LC_MESSAGES/django.po +0 -22
- wagtail/contrib/search_promotions/locale/hi/LC_MESSAGES/django.po +0 -22
- wagtail/contrib/search_promotions/locale/sr/LC_MESSAGES/django.po +0 -23
- wagtail/contrib/search_promotions/views.py +0 -323
- wagtail/images/static/wagtailimages/js/vendor/canvas-to-blob.min.js +0 -1
- wagtail/users/static/wagtailusers/js/group-form.js +0 -1
- wagtail/users/templates/wagtailusers/groups/includes/group_form_js.html +0 -3
- {wagtail-6.3.3.dist-info → wagtail-6.4.dist-info}/LICENSE +0 -0
- {wagtail-6.3.3.dist-info → wagtail-6.4.dist-info}/WHEEL +0 -0
- {wagtail-6.3.3.dist-info → wagtail-6.4.dist-info}/entry_points.txt +0 -0
- {wagtail-6.3.3.dist-info → wagtail-6.4.dist-info}/top_level.txt +0 -0
wagtail/models/__init__.py
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"""
|
|
2
|
-
wagtail.models is split into submodules for maintainability. All definitions intended as
|
|
2
|
+
``wagtail.models`` is split into submodules for maintainability. All definitions intended as
|
|
3
3
|
public should be imported here (with 'noqa: F401' comments as required) and outside code should
|
|
4
|
-
continue to import them from wagtail.models (e.g.
|
|
5
|
-
|
|
4
|
+
continue to import them from wagtail.models (e.g. ``from wagtail.models import Site``, not
|
|
5
|
+
``from wagtail.models.sites import Site``.)
|
|
6
6
|
|
|
7
7
|
Submodules should take care to keep the direction of dependencies consistent; where possible they
|
|
8
8
|
should implement low-level generic functionality which is then imported by higher-level models such
|
|
@@ -16,7 +16,6 @@ import logging
|
|
|
16
16
|
import posixpath
|
|
17
17
|
import uuid
|
|
18
18
|
from io import StringIO
|
|
19
|
-
from typing import TYPE_CHECKING
|
|
20
19
|
from urllib.parse import urlsplit
|
|
21
20
|
from warnings import warn
|
|
22
21
|
|
|
@@ -40,7 +39,8 @@ from django.db.models import Q, Value
|
|
|
40
39
|
from django.db.models.expressions import OuterRef, Subquery
|
|
41
40
|
from django.db.models.functions import Concat, Substr
|
|
42
41
|
from django.dispatch import receiver
|
|
43
|
-
from django.http import Http404
|
|
42
|
+
from django.http import Http404, HttpRequest, HttpResponse, HttpResponseNotAllowed
|
|
43
|
+
from django.http.request import validate_host
|
|
44
44
|
from django.template.response import TemplateResponse
|
|
45
45
|
from django.urls import NoReverseMatch, reverse
|
|
46
46
|
from django.utils import timezone
|
|
@@ -68,6 +68,7 @@ from wagtail.actions.publish_page_revision import PublishPageRevisionAction
|
|
|
68
68
|
from wagtail.actions.publish_revision import PublishRevisionAction
|
|
69
69
|
from wagtail.actions.unpublish import UnpublishAction
|
|
70
70
|
from wagtail.actions.unpublish_page import UnpublishPageAction
|
|
71
|
+
from wagtail.compat import HTTPMethod
|
|
71
72
|
from wagtail.coreutils import (
|
|
72
73
|
WAGTAIL_APPEND_SLASH,
|
|
73
74
|
camelcase_to_underscore,
|
|
@@ -126,14 +127,12 @@ from .media import ( # noqa: F401
|
|
|
126
127
|
UploadedFile,
|
|
127
128
|
get_root_collection_id,
|
|
128
129
|
)
|
|
130
|
+
from .panels import CommentPanelPlaceholder, PanelPlaceholder
|
|
129
131
|
from .reference_index import ReferenceIndex # noqa: F401
|
|
130
132
|
from .sites import Site, SiteManager, SiteRootPath # noqa: F401
|
|
131
133
|
from .specific import SpecificMixin
|
|
132
134
|
from .view_restrictions import BaseViewRestriction
|
|
133
135
|
|
|
134
|
-
if TYPE_CHECKING:
|
|
135
|
-
from django.http import HttpRequest
|
|
136
|
-
|
|
137
136
|
logger = logging.getLogger("wagtail")
|
|
138
137
|
|
|
139
138
|
PAGE_TEMPLATE_VAR = "page"
|
|
@@ -208,7 +207,7 @@ class BasePageManager(models.Manager):
|
|
|
208
207
|
|
|
209
208
|
def first_common_ancestor_of(self, pages, include_self=False, strict=False):
|
|
210
209
|
"""
|
|
211
|
-
This is similar to
|
|
210
|
+
This is similar to ``PageQuerySet.first_common_ancestor`` but works
|
|
212
211
|
for a list of pages instead of a queryset.
|
|
213
212
|
"""
|
|
214
213
|
if not pages:
|
|
@@ -243,12 +242,12 @@ class BasePageManager(models.Manager):
|
|
|
243
242
|
|
|
244
243
|
If given a QuerySet, this method will evaluate it. Only use this method
|
|
245
244
|
when you are ready to consume the queryset, e.g. after pagination has
|
|
246
|
-
been applied. This is typically done in the view's
|
|
247
|
-
using
|
|
245
|
+
been applied. This is typically done in the view's ``get_context_data``
|
|
246
|
+
using ``context["object_list"]``.
|
|
248
247
|
|
|
249
248
|
This method does not return a new queryset, but modifies the existing one,
|
|
250
249
|
to ensure any references to the queryset in the view's context are updated
|
|
251
|
-
(e.g. when using
|
|
250
|
+
(e.g. when using ``context_object_name``).
|
|
252
251
|
"""
|
|
253
252
|
parent_page_paths = {
|
|
254
253
|
Page._get_parent_path_from_path(page.path) for page in pages
|
|
@@ -328,7 +327,7 @@ class RevisionMixin(models.Model):
|
|
|
328
327
|
Subclasses should define a
|
|
329
328
|
:class:`~django.contrib.contenttypes.fields.GenericRelation` to
|
|
330
329
|
:class:`~wagtail.models.Revision` and override this property to return
|
|
331
|
-
that ``GenericRelation``. This allows subclasses to
|
|
330
|
+
that ``GenericRelation``. This allows subclasses to customize the
|
|
332
331
|
``related_query_name`` of the ``GenericRelation`` and add custom logic
|
|
333
332
|
(e.g. to always use the specific instance in ``Page``).
|
|
334
333
|
"""
|
|
@@ -725,6 +724,26 @@ class PreviewableMixin:
|
|
|
725
724
|
handler.load_middleware()
|
|
726
725
|
return handler.get_response(request)
|
|
727
726
|
|
|
727
|
+
def _get_fallback_hostname(self):
|
|
728
|
+
"""
|
|
729
|
+
Return a hostname that can be used on preview requests when the object has no
|
|
730
|
+
routable URL, or the real hostname is not valid according to ALLOWED_HOSTS.
|
|
731
|
+
"""
|
|
732
|
+
try:
|
|
733
|
+
hostname = settings.ALLOWED_HOSTS[0]
|
|
734
|
+
except IndexError:
|
|
735
|
+
# Django disallows empty ALLOWED_HOSTS outright when DEBUG=False, so we must
|
|
736
|
+
# have DEBUG=True. In this mode Django allows localhost amongst others.
|
|
737
|
+
return "localhost"
|
|
738
|
+
|
|
739
|
+
if hostname == "*":
|
|
740
|
+
# Any hostname is allowed
|
|
741
|
+
return "localhost"
|
|
742
|
+
|
|
743
|
+
# Hostnames beginning with a dot are domain wildcards such as ".example.com" -
|
|
744
|
+
# these allow example.com itself, so just strip the dot
|
|
745
|
+
return hostname.lstrip(".")
|
|
746
|
+
|
|
728
747
|
def _get_dummy_headers(self, original_request=None):
|
|
729
748
|
"""
|
|
730
749
|
Return a dict of META information to be included in a faked HttpRequest object to pass to
|
|
@@ -734,20 +753,19 @@ class PreviewableMixin:
|
|
|
734
753
|
if url:
|
|
735
754
|
url_info = urlsplit(url)
|
|
736
755
|
hostname = url_info.hostname
|
|
756
|
+
if not validate_host(
|
|
757
|
+
hostname,
|
|
758
|
+
settings.ALLOWED_HOSTS or [".localhost", "127.0.0.1", "[::1]"],
|
|
759
|
+
):
|
|
760
|
+
# The hostname is not valid according to ALLOWED_HOSTS - use a fallback
|
|
761
|
+
hostname = self._get_fallback_hostname()
|
|
762
|
+
|
|
737
763
|
path = url_info.path
|
|
738
764
|
port = url_info.port or (443 if url_info.scheme == "https" else 80)
|
|
739
765
|
scheme = url_info.scheme
|
|
740
766
|
else:
|
|
741
|
-
# Cannot determine a URL to this object - cobble
|
|
742
|
-
|
|
743
|
-
try:
|
|
744
|
-
hostname = settings.ALLOWED_HOSTS[0]
|
|
745
|
-
if hostname == "*":
|
|
746
|
-
# '*' is a valid value to find in ALLOWED_HOSTS[0], but it's not a valid domain name.
|
|
747
|
-
# So we pretend it isn't there.
|
|
748
|
-
raise IndexError
|
|
749
|
-
except IndexError:
|
|
750
|
-
hostname = "localhost"
|
|
767
|
+
# Cannot determine a URL to this object - cobble together an arbitrary valid one
|
|
768
|
+
hostname = self._get_fallback_hostname()
|
|
751
769
|
path = "/"
|
|
752
770
|
port = 80
|
|
753
771
|
scheme = "http"
|
|
@@ -1070,11 +1088,15 @@ class WorkflowMixin:
|
|
|
1070
1088
|
|
|
1071
1089
|
@property
|
|
1072
1090
|
def has_workflow(self):
|
|
1073
|
-
"""
|
|
1091
|
+
"""
|
|
1092
|
+
Returns ```True``` if the object has an active workflow assigned, otherwise ```False```.
|
|
1093
|
+
"""
|
|
1074
1094
|
return self.get_workflow() is not None
|
|
1075
1095
|
|
|
1076
1096
|
def get_workflow(self):
|
|
1077
|
-
"""
|
|
1097
|
+
"""
|
|
1098
|
+
Returns the active workflow assigned to the object.
|
|
1099
|
+
"""
|
|
1078
1100
|
return self.get_default_workflow()
|
|
1079
1101
|
|
|
1080
1102
|
@property
|
|
@@ -1094,12 +1116,14 @@ class WorkflowMixin:
|
|
|
1094
1116
|
|
|
1095
1117
|
@property
|
|
1096
1118
|
def workflow_in_progress(self):
|
|
1097
|
-
"""
|
|
1119
|
+
"""
|
|
1120
|
+
Returns ```True``` if a workflow is in progress on the current object, otherwise ```False```.
|
|
1121
|
+
"""
|
|
1098
1122
|
if not getattr(settings, "WAGTAIL_WORKFLOW_ENABLED", True):
|
|
1099
1123
|
return False
|
|
1100
1124
|
|
|
1101
1125
|
# `_current_workflow_states` may be populated by `prefetch_workflow_states`
|
|
1102
|
-
# on querysets as a performance
|
|
1126
|
+
# on querysets as a performance optimization
|
|
1103
1127
|
if hasattr(self, "_current_workflow_states"):
|
|
1104
1128
|
for state in self._current_workflow_states:
|
|
1105
1129
|
if state.status == WorkflowState.STATUS_IN_PROGRESS:
|
|
@@ -1112,12 +1136,14 @@ class WorkflowMixin:
|
|
|
1112
1136
|
|
|
1113
1137
|
@property
|
|
1114
1138
|
def current_workflow_state(self):
|
|
1115
|
-
"""
|
|
1139
|
+
"""
|
|
1140
|
+
Returns the in progress or needs changes workflow state on this object, if it exists.
|
|
1141
|
+
"""
|
|
1116
1142
|
if not getattr(settings, "WAGTAIL_WORKFLOW_ENABLED", True):
|
|
1117
1143
|
return None
|
|
1118
1144
|
|
|
1119
1145
|
# `_current_workflow_states` may be populated by `prefetch_workflow_states`
|
|
1120
|
-
# on querysets as a performance
|
|
1146
|
+
# on querysets as a performance optimization
|
|
1121
1147
|
if hasattr(self, "_current_workflow_states"):
|
|
1122
1148
|
try:
|
|
1123
1149
|
return self._current_workflow_states[0]
|
|
@@ -1132,7 +1158,9 @@ class WorkflowMixin:
|
|
|
1132
1158
|
|
|
1133
1159
|
@property
|
|
1134
1160
|
def current_workflow_task_state(self):
|
|
1135
|
-
"""
|
|
1161
|
+
"""
|
|
1162
|
+
Returns (specific class of) the current task state of the workflow on this object, if it exists.
|
|
1163
|
+
"""
|
|
1136
1164
|
current_workflow_state = self.current_workflow_state
|
|
1137
1165
|
if (
|
|
1138
1166
|
current_workflow_state
|
|
@@ -1143,7 +1171,9 @@ class WorkflowMixin:
|
|
|
1143
1171
|
|
|
1144
1172
|
@property
|
|
1145
1173
|
def current_workflow_task(self):
|
|
1146
|
-
"""
|
|
1174
|
+
"""
|
|
1175
|
+
Returns (specific class of) the current task in progress on this object, if it exists.
|
|
1176
|
+
"""
|
|
1147
1177
|
current_workflow_task_state = self.current_workflow_task_state
|
|
1148
1178
|
if current_workflow_task_state:
|
|
1149
1179
|
return current_workflow_task_state.task.specific
|
|
@@ -1372,21 +1402,63 @@ class Page(AbstractPage, index.Indexed, ClusterableModel, metaclass=PageBase):
|
|
|
1372
1402
|
COMMENTS_RELATION_NAME,
|
|
1373
1403
|
]
|
|
1374
1404
|
|
|
1375
|
-
#
|
|
1376
|
-
#
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1405
|
+
# Real panel classes are defined in wagtail.admin.panels, which we can't import here
|
|
1406
|
+
# because it would create a circular import. Instead, define them with placeholders
|
|
1407
|
+
# to be replaced with the real classes by `wagtail.admin.panels.model_utils.expand_panel_list`.
|
|
1408
|
+
content_panels = [
|
|
1409
|
+
PanelPlaceholder("wagtail.admin.panels.TitleFieldPanel", ["title"], {}),
|
|
1410
|
+
]
|
|
1411
|
+
promote_panels = [
|
|
1412
|
+
PanelPlaceholder(
|
|
1413
|
+
"wagtail.admin.panels.MultiFieldPanel",
|
|
1414
|
+
[
|
|
1415
|
+
[
|
|
1416
|
+
"slug",
|
|
1417
|
+
"seo_title",
|
|
1418
|
+
"search_description",
|
|
1419
|
+
],
|
|
1420
|
+
_("For search engines"),
|
|
1421
|
+
],
|
|
1422
|
+
{},
|
|
1423
|
+
),
|
|
1424
|
+
PanelPlaceholder(
|
|
1425
|
+
"wagtail.admin.panels.MultiFieldPanel",
|
|
1426
|
+
[
|
|
1427
|
+
[
|
|
1428
|
+
"show_in_menus",
|
|
1429
|
+
],
|
|
1430
|
+
_("For site menus"),
|
|
1431
|
+
],
|
|
1432
|
+
{},
|
|
1433
|
+
),
|
|
1434
|
+
]
|
|
1435
|
+
settings_panels = [
|
|
1436
|
+
PanelPlaceholder("wagtail.admin.panels.PublishingPanel", [], {}),
|
|
1437
|
+
CommentPanelPlaceholder(),
|
|
1438
|
+
]
|
|
1380
1439
|
|
|
1381
1440
|
# Privacy options for page
|
|
1382
1441
|
private_page_options = ["password", "groups", "login"]
|
|
1383
1442
|
|
|
1443
|
+
# Allows page types to specify a list of HTTP method names that page instances will
|
|
1444
|
+
# respond to. When the request type doesn't match, Wagtail should return a response
|
|
1445
|
+
# with a status code of 405.
|
|
1446
|
+
allowed_http_methods = [
|
|
1447
|
+
HTTPMethod.DELETE,
|
|
1448
|
+
HTTPMethod.GET,
|
|
1449
|
+
HTTPMethod.HEAD,
|
|
1450
|
+
HTTPMethod.OPTIONS,
|
|
1451
|
+
HTTPMethod.PATCH,
|
|
1452
|
+
HTTPMethod.POST,
|
|
1453
|
+
HTTPMethod.PUT,
|
|
1454
|
+
]
|
|
1455
|
+
|
|
1384
1456
|
@staticmethod
|
|
1385
1457
|
def route_for_request(request: HttpRequest, path: str) -> RouteResult | None:
|
|
1386
1458
|
"""
|
|
1387
1459
|
Find the page route for the given HTTP request object, and URL path. The route
|
|
1388
1460
|
result (`page`, `args`, and `kwargs`) will be cached via
|
|
1389
|
-
|
|
1461
|
+
``request._wagtail_route_for_request``.
|
|
1390
1462
|
"""
|
|
1391
1463
|
if not hasattr(request, "_wagtail_route_for_request"):
|
|
1392
1464
|
try:
|
|
@@ -1412,12 +1484,19 @@ class Page(AbstractPage, index.Indexed, ClusterableModel, metaclass=PageBase):
|
|
|
1412
1484
|
def find_for_request(request: HttpRequest, path: str) -> Page | None:
|
|
1413
1485
|
"""
|
|
1414
1486
|
Find the page for the given HTTP request object, and URL path. The full
|
|
1415
|
-
page route will be cached via
|
|
1487
|
+
page route will be cached via ``request._wagtail_route_for_request``.
|
|
1416
1488
|
"""
|
|
1417
1489
|
result = Page.route_for_request(request, path)
|
|
1418
1490
|
if result is not None:
|
|
1419
1491
|
return result[0]
|
|
1420
1492
|
|
|
1493
|
+
@classmethod
|
|
1494
|
+
def allowed_http_method_names(cls):
|
|
1495
|
+
return [
|
|
1496
|
+
method.value if hasattr(method, "value") else method
|
|
1497
|
+
for method in cls.allowed_http_methods
|
|
1498
|
+
]
|
|
1499
|
+
|
|
1421
1500
|
def __init__(self, *args, **kwargs):
|
|
1422
1501
|
super().__init__(*args, **kwargs)
|
|
1423
1502
|
if not self.id:
|
|
@@ -1574,11 +1653,12 @@ class Page(AbstractPage, index.Indexed, ClusterableModel, metaclass=PageBase):
|
|
|
1574
1653
|
# ensure that changes are only committed when we have updated all descendant URL paths, to preserve consistency
|
|
1575
1654
|
def save(self, clean=True, user=None, log_action=False, **kwargs):
|
|
1576
1655
|
"""
|
|
1577
|
-
Overrides default method
|
|
1656
|
+
Overrides default method behavior to make additional updates unique to pages,
|
|
1578
1657
|
such as updating the ``url_path`` value of descendant page to reflect changes
|
|
1579
1658
|
to this page's slug.
|
|
1580
1659
|
|
|
1581
|
-
New pages should generally be saved via the
|
|
1660
|
+
New pages should generally be saved via the :meth:`~treebeard.mp_tree.MP_Node.add_child`
|
|
1661
|
+
or :meth:`~treebeard.mp_tree.MP_Node.add_sibling`
|
|
1582
1662
|
method of an existing page, which will correctly set the ``path`` and ``depth``
|
|
1583
1663
|
fields on the new page before saving it.
|
|
1584
1664
|
|
|
@@ -1745,7 +1825,7 @@ class Page(AbstractPage, index.Indexed, ClusterableModel, metaclass=PageBase):
|
|
|
1745
1825
|
@property
|
|
1746
1826
|
def page_type_display_name(self):
|
|
1747
1827
|
"""
|
|
1748
|
-
A human-readable version of this page's type
|
|
1828
|
+
A human-readable version of this page's type.
|
|
1749
1829
|
"""
|
|
1750
1830
|
if not self.specific_class or self.is_root():
|
|
1751
1831
|
return ""
|
|
@@ -2082,6 +2162,38 @@ class Page(AbstractPage, index.Indexed, ClusterableModel, metaclass=PageBase):
|
|
|
2082
2162
|
self.get_context(request, *args, **kwargs),
|
|
2083
2163
|
)
|
|
2084
2164
|
|
|
2165
|
+
def check_request_method(self, request, *args, **kwargs):
|
|
2166
|
+
"""
|
|
2167
|
+
Checks the ``method`` attribute of the request against those supported
|
|
2168
|
+
by the page (as defined by :attr:`allowed_http_methods`) and responds
|
|
2169
|
+
accordingly.
|
|
2170
|
+
|
|
2171
|
+
If supported, ``None`` is returned, and the request is processed
|
|
2172
|
+
normally. If not, a warning is logged and an ``HttpResponseNotAllowed``
|
|
2173
|
+
is returned, and any further request handling is terminated.
|
|
2174
|
+
"""
|
|
2175
|
+
allowed_methods = self.allowed_http_method_names()
|
|
2176
|
+
if request.method not in allowed_methods:
|
|
2177
|
+
logger.warning(
|
|
2178
|
+
"Method Not Allowed (%s): %s",
|
|
2179
|
+
request.method,
|
|
2180
|
+
request.path,
|
|
2181
|
+
extra={"status_code": 405, "request": request},
|
|
2182
|
+
)
|
|
2183
|
+
return HttpResponseNotAllowed(allowed_methods)
|
|
2184
|
+
|
|
2185
|
+
def handle_options_request(self, request, *args, **kwargs):
|
|
2186
|
+
"""
|
|
2187
|
+
Returns an ``HttpResponse`` with an ``"Allow"`` header containing the list of
|
|
2188
|
+
supported HTTP methods for this page. This method is used instead of
|
|
2189
|
+
:meth:`serve` to handle requests when the ``OPTIONS`` HTTP verb is
|
|
2190
|
+
detected (and :class:`HTTPMethod.OPTIONS <python:http.HTTPMethod>` is
|
|
2191
|
+
present in :attr:`allowed_http_methods` for this type of page).
|
|
2192
|
+
"""
|
|
2193
|
+
return HttpResponse(
|
|
2194
|
+
headers={"Allow": ", ".join(self.allowed_http_method_names())}
|
|
2195
|
+
)
|
|
2196
|
+
|
|
2085
2197
|
def is_navigable(self):
|
|
2086
2198
|
"""
|
|
2087
2199
|
Return true if it's meaningful to browse subpages of this page -
|
|
@@ -2117,7 +2229,7 @@ class Page(AbstractPage, index.Indexed, ClusterableModel, metaclass=PageBase):
|
|
|
2117
2229
|
"""
|
|
2118
2230
|
Determine the URL for this page and return it as a tuple of
|
|
2119
2231
|
``(site_id, site_root_url, page_url_relative_to_site_root)``.
|
|
2120
|
-
Return None if the page is not routable.
|
|
2232
|
+
Return ``None`` if the page is not routable.
|
|
2121
2233
|
|
|
2122
2234
|
This is used internally by the ``full_url``, ``url``, ``relative_url``
|
|
2123
2235
|
and ``get_site`` properties and methods; pages with custom URL routing
|
|
@@ -2136,15 +2248,21 @@ class Page(AbstractPage, index.Indexed, ClusterableModel, metaclass=PageBase):
|
|
|
2136
2248
|
if not possible_sites:
|
|
2137
2249
|
return None
|
|
2138
2250
|
|
|
2251
|
+
# Thanks to the ordering applied by Site.get_site_root_paths(),
|
|
2252
|
+
# the first item is ideal in the vast majority of setups.
|
|
2139
2253
|
site_id, root_path, root_url, language_code = possible_sites[0]
|
|
2140
2254
|
|
|
2141
|
-
|
|
2142
|
-
if
|
|
2143
|
-
|
|
2144
|
-
|
|
2145
|
-
|
|
2146
|
-
|
|
2147
|
-
|
|
2255
|
+
unique_site_ids = {values[0] for values in possible_sites}
|
|
2256
|
+
if len(unique_site_ids) > 1 and isinstance(request, HttpRequest):
|
|
2257
|
+
# The page somehow belongs to more than one site (rare, but possible).
|
|
2258
|
+
# If 'request' is indeed a HttpRequest, use it to identify the 'current'
|
|
2259
|
+
# site and prefer an option matching that (where present).
|
|
2260
|
+
site = Site.find_for_request(request)
|
|
2261
|
+
if site:
|
|
2262
|
+
for values in possible_sites:
|
|
2263
|
+
if values[0] == site.pk:
|
|
2264
|
+
site_id, root_path, root_url, language_code = values
|
|
2265
|
+
break
|
|
2148
2266
|
|
|
2149
2267
|
use_wagtail_i18n = getattr(settings, "WAGTAIL_I18N_ENABLED", False)
|
|
2150
2268
|
|
|
@@ -2187,7 +2305,9 @@ class Page(AbstractPage, index.Indexed, ClusterableModel, metaclass=PageBase):
|
|
|
2187
2305
|
return (site_id, root_url, page_path)
|
|
2188
2306
|
|
|
2189
2307
|
def get_full_url(self, request=None):
|
|
2190
|
-
"""
|
|
2308
|
+
"""
|
|
2309
|
+
Return the full URL (including protocol / domain) to this page, or ``None`` if it is not routable.
|
|
2310
|
+
"""
|
|
2191
2311
|
url_parts = self.get_url_parts(request=request)
|
|
2192
2312
|
|
|
2193
2313
|
if url_parts is None or url_parts[1] is None and url_parts[2] is None:
|
|
@@ -2207,7 +2327,7 @@ class Page(AbstractPage, index.Indexed, ClusterableModel, metaclass=PageBase):
|
|
|
2207
2327
|
this is the local URL (starting with '/') if we're only running a single site
|
|
2208
2328
|
(i.e. we know that whatever the current page is being served from, this link will be on the
|
|
2209
2329
|
same domain), and the full URL (with domain) if not.
|
|
2210
|
-
Return None if the page is not routable.
|
|
2330
|
+
Return ``None`` if the page is not routable.
|
|
2211
2331
|
|
|
2212
2332
|
Accepts an optional but recommended ``request`` keyword argument that, if provided, will
|
|
2213
2333
|
be used to cache site-level URL information (thereby avoiding repeated database / cache
|
|
@@ -2246,7 +2366,7 @@ class Page(AbstractPage, index.Indexed, ClusterableModel, metaclass=PageBase):
|
|
|
2246
2366
|
"""
|
|
2247
2367
|
Return the 'most appropriate' URL for this page taking into account the site we're currently on;
|
|
2248
2368
|
a local URL if the site matches, or a fully qualified one otherwise.
|
|
2249
|
-
Return None if the page is not routable.
|
|
2369
|
+
Return ``None`` if the page is not routable.
|
|
2250
2370
|
|
|
2251
2371
|
Accepts an optional but recommended ``request`` keyword argument that, if provided, will
|
|
2252
2372
|
be used to cache site-level URL information (thereby avoiding repeated database / cache
|
|
@@ -2287,8 +2407,8 @@ class Page(AbstractPage, index.Indexed, ClusterableModel, metaclass=PageBase):
|
|
|
2287
2407
|
@classmethod
|
|
2288
2408
|
def clean_subpage_models(cls):
|
|
2289
2409
|
"""
|
|
2290
|
-
Returns the list of subpage types,
|
|
2291
|
-
Throws ValueError if any entry in subpage_types cannot be
|
|
2410
|
+
Returns the list of subpage types, normalized as model classes.
|
|
2411
|
+
Throws ValueError if any entry in subpage_types cannot be recognized as a model name,
|
|
2292
2412
|
or LookupError if a model does not exist (or is not a Page subclass).
|
|
2293
2413
|
"""
|
|
2294
2414
|
if cls._clean_subpage_models is None:
|
|
@@ -2311,8 +2431,8 @@ class Page(AbstractPage, index.Indexed, ClusterableModel, metaclass=PageBase):
|
|
|
2311
2431
|
@classmethod
|
|
2312
2432
|
def clean_parent_page_models(cls):
|
|
2313
2433
|
"""
|
|
2314
|
-
Returns the list of parent page types,
|
|
2315
|
-
Throws ValueError if any entry in parent_page_types cannot be
|
|
2434
|
+
Returns the list of parent page types, normalized as model classes.
|
|
2435
|
+
Throws ValueError if any entry in parent_page_types cannot be recognized as a model name,
|
|
2316
2436
|
or LookupError if a model does not exist (or is not a Page subclass).
|
|
2317
2437
|
"""
|
|
2318
2438
|
|
|
@@ -2337,7 +2457,7 @@ class Page(AbstractPage, index.Indexed, ClusterableModel, metaclass=PageBase):
|
|
|
2337
2457
|
def allowed_parent_page_models(cls):
|
|
2338
2458
|
"""
|
|
2339
2459
|
Returns the list of page types that this page type can be a subpage of,
|
|
2340
|
-
as a list of model classes
|
|
2460
|
+
as a list of model classes.
|
|
2341
2461
|
"""
|
|
2342
2462
|
return [
|
|
2343
2463
|
parent_model
|
|
@@ -2349,7 +2469,7 @@ class Page(AbstractPage, index.Indexed, ClusterableModel, metaclass=PageBase):
|
|
|
2349
2469
|
def allowed_subpage_models(cls):
|
|
2350
2470
|
"""
|
|
2351
2471
|
Returns the list of page types that this page type can have as subpages,
|
|
2352
|
-
as a list of model classes
|
|
2472
|
+
as a list of model classes.
|
|
2353
2473
|
"""
|
|
2354
2474
|
return [
|
|
2355
2475
|
subpage_model
|
|
@@ -2361,7 +2481,7 @@ class Page(AbstractPage, index.Indexed, ClusterableModel, metaclass=PageBase):
|
|
|
2361
2481
|
def creatable_subpage_models(cls):
|
|
2362
2482
|
"""
|
|
2363
2483
|
Returns the list of page types that may be created under this page type,
|
|
2364
|
-
as a list of model classes
|
|
2484
|
+
as a list of model classes.
|
|
2365
2485
|
"""
|
|
2366
2486
|
return [
|
|
2367
2487
|
page_model
|
|
@@ -2438,8 +2558,10 @@ class Page(AbstractPage, index.Indexed, ClusterableModel, metaclass=PageBase):
|
|
|
2438
2558
|
|
|
2439
2559
|
@property
|
|
2440
2560
|
def approved_schedule(self):
|
|
2441
|
-
|
|
2442
|
-
|
|
2561
|
+
"""
|
|
2562
|
+
``_approved_schedule`` may be populated by ``annotate_approved_schedule`` on ``PageQuerySet`` as a
|
|
2563
|
+
performance optimization.
|
|
2564
|
+
"""
|
|
2443
2565
|
if hasattr(self, "_approved_schedule"):
|
|
2444
2566
|
return self._approved_schedule
|
|
2445
2567
|
|
|
@@ -2478,7 +2600,7 @@ class Page(AbstractPage, index.Indexed, ClusterableModel, metaclass=PageBase):
|
|
|
2478
2600
|
"""
|
|
2479
2601
|
Copies a given page
|
|
2480
2602
|
|
|
2481
|
-
:param log_action: flag for logging the action. Pass None to skip logging. Can be passed an action string. Defaults to 'wagtail.copy'
|
|
2603
|
+
:param log_action: flag for logging the action. Pass None to skip logging. Can be passed an action string. Defaults to ``'wagtail.copy'``.
|
|
2482
2604
|
"""
|
|
2483
2605
|
return CopyPageAction(
|
|
2484
2606
|
self,
|
|
@@ -2539,7 +2661,7 @@ class Page(AbstractPage, index.Indexed, ClusterableModel, metaclass=PageBase):
|
|
|
2539
2661
|
|
|
2540
2662
|
def permissions_for_user(self, user):
|
|
2541
2663
|
"""
|
|
2542
|
-
Return a PagePermissionsTester object defining what actions the user can perform on this page
|
|
2664
|
+
Return a PagePermissionsTester object defining what actions the user can perform on this page.
|
|
2543
2665
|
"""
|
|
2544
2666
|
# Allow specific classes to override this method, but only cast to the
|
|
2545
2667
|
# specific instance if it's not already specific and if the method has
|
|
@@ -2695,9 +2817,9 @@ class Page(AbstractPage, index.Indexed, ClusterableModel, metaclass=PageBase):
|
|
|
2695
2817
|
"""
|
|
2696
2818
|
Serve a response indicating that the user has been denied access to view this page,
|
|
2697
2819
|
and must supply a password.
|
|
2698
|
-
form = a Django form object containing the password input
|
|
2820
|
+
``form`` = a Django form object containing the password input
|
|
2699
2821
|
(and zero or more hidden fields that also need to be output on the template)
|
|
2700
|
-
action_url = URL that this form should be POSTed to
|
|
2822
|
+
``action_url`` = URL that this form should be POSTed to
|
|
2701
2823
|
"""
|
|
2702
2824
|
|
|
2703
2825
|
password_required_template = self.password_required_template
|
|
@@ -2771,7 +2893,7 @@ class Page(AbstractPage, index.Indexed, ClusterableModel, metaclass=PageBase):
|
|
|
2771
2893
|
# These should definitely never change between revisions
|
|
2772
2894
|
obj.id = self.id
|
|
2773
2895
|
obj.pk = self.pk
|
|
2774
|
-
obj.
|
|
2896
|
+
obj.content_type_id = self.content_type_id
|
|
2775
2897
|
|
|
2776
2898
|
# Override possibly-outdated tree parameter fields
|
|
2777
2899
|
obj.path = self.path
|
|
@@ -2787,27 +2909,30 @@ class Page(AbstractPage, index.Indexed, ClusterableModel, metaclass=PageBase):
|
|
|
2787
2909
|
obj.draft_title = self.draft_title
|
|
2788
2910
|
obj.live = self.live
|
|
2789
2911
|
obj.has_unpublished_changes = self.has_unpublished_changes
|
|
2790
|
-
obj.
|
|
2912
|
+
obj.owner_id = self.owner_id
|
|
2791
2913
|
obj.locked = self.locked
|
|
2792
|
-
obj.
|
|
2914
|
+
obj.locked_by_id = self.locked_by_id
|
|
2793
2915
|
obj.locked_at = self.locked_at
|
|
2794
|
-
obj.
|
|
2916
|
+
obj.latest_revision_id = self.latest_revision_id
|
|
2795
2917
|
obj.latest_revision_created_at = self.latest_revision_created_at
|
|
2796
2918
|
obj.first_published_at = self.first_published_at
|
|
2797
2919
|
obj.translation_key = self.translation_key
|
|
2798
|
-
obj.
|
|
2920
|
+
obj.locale_id = self.locale_id
|
|
2799
2921
|
obj.alias_of_id = self.alias_of_id
|
|
2800
|
-
|
|
2801
|
-
|
|
2802
|
-
|
|
2922
|
+
revision_comment_positions = dict(
|
|
2923
|
+
getattr(obj, COMMENTS_RELATION_NAME).values_list("id", "position")
|
|
2924
|
+
)
|
|
2925
|
+
page_comments = (
|
|
2926
|
+
getattr(self, COMMENTS_RELATION_NAME)
|
|
2927
|
+
.filter(resolved_at__isnull=True)
|
|
2928
|
+
.defer("position")
|
|
2803
2929
|
)
|
|
2804
2930
|
for comment in page_comments:
|
|
2805
2931
|
# attempt to retrieve the comment position from the revision's stored version
|
|
2806
2932
|
# of the comment
|
|
2807
2933
|
try:
|
|
2808
|
-
|
|
2809
|
-
|
|
2810
|
-
except Comment.DoesNotExist:
|
|
2934
|
+
comment.position = revision_comment_positions[comment.id]
|
|
2935
|
+
except KeyError:
|
|
2811
2936
|
pass
|
|
2812
2937
|
setattr(obj, COMMENTS_RELATION_NAME, page_comments)
|
|
2813
2938
|
|
|
@@ -2815,7 +2940,9 @@ class Page(AbstractPage, index.Indexed, ClusterableModel, metaclass=PageBase):
|
|
|
2815
2940
|
|
|
2816
2941
|
@property
|
|
2817
2942
|
def has_workflow(self):
|
|
2818
|
-
"""
|
|
2943
|
+
"""
|
|
2944
|
+
Returns ``True`` if the page or an ancestor has an active workflow assigned, otherwise ``False``.
|
|
2945
|
+
"""
|
|
2819
2946
|
if not getattr(settings, "WAGTAIL_WORKFLOW_ENABLED", True):
|
|
2820
2947
|
return False
|
|
2821
2948
|
return (
|
|
@@ -2826,7 +2953,9 @@ class Page(AbstractPage, index.Indexed, ClusterableModel, metaclass=PageBase):
|
|
|
2826
2953
|
)
|
|
2827
2954
|
|
|
2828
2955
|
def get_workflow(self):
|
|
2829
|
-
"""
|
|
2956
|
+
"""
|
|
2957
|
+
Returns the active workflow assigned to the page or its nearest ancestor.
|
|
2958
|
+
"""
|
|
2830
2959
|
if not getattr(settings, "WAGTAIL_WORKFLOW_ENABLED", True):
|
|
2831
2960
|
return None
|
|
2832
2961
|
|
|
@@ -2902,7 +3031,7 @@ class RevisionsManager(models.Manager.from_queryset(RevisionQuerySet)):
|
|
|
2902
3031
|
of the previous revision, based on the revision_fk_name field. Useful
|
|
2903
3032
|
to avoid N+1 queries when generating comparison links between revisions.
|
|
2904
3033
|
|
|
2905
|
-
The logic is similar to Revision.get_previous().pk
|
|
3034
|
+
The logic is similar to ``Revision.get_previous().pk``.
|
|
2906
3035
|
"""
|
|
2907
3036
|
fk = revision_fk_name
|
|
2908
3037
|
return Subquery(
|
|
@@ -3465,7 +3594,7 @@ class PageViewRestriction(BaseViewRestriction):
|
|
|
3465
3594
|
|
|
3466
3595
|
def delete(self, user=None, **kwargs):
|
|
3467
3596
|
"""
|
|
3468
|
-
Custom delete handler to aid in logging
|
|
3597
|
+
Custom delete handler to aid in logging.
|
|
3469
3598
|
:param user: the user removing the view restriction
|
|
3470
3599
|
"""
|
|
3471
3600
|
specific_instance = self.page.specific
|
|
@@ -3506,9 +3635,9 @@ class WorkflowPage(models.Model):
|
|
|
3506
3635
|
|
|
3507
3636
|
def get_pages(self):
|
|
3508
3637
|
"""
|
|
3509
|
-
Returns a queryset of pages that are affected by this WorkflowPage link.
|
|
3638
|
+
Returns a queryset of pages that are affected by this ``WorkflowPage`` link.
|
|
3510
3639
|
|
|
3511
|
-
This includes all descendants of the page excluding any that have other
|
|
3640
|
+
This includes all descendants of the page excluding any that have other ``WorkflowPage``(s).
|
|
3512
3641
|
"""
|
|
3513
3642
|
descendant_pages = Page.objects.descendant_of(self.page, inclusive=True)
|
|
3514
3643
|
descendant_workflow_pages = WorkflowPage.objects.filter(
|
|
@@ -3614,12 +3743,16 @@ class Task(SpecificMixin, models.Model):
|
|
|
3614
3743
|
|
|
3615
3744
|
@property
|
|
3616
3745
|
def workflows(self):
|
|
3617
|
-
"""
|
|
3746
|
+
"""
|
|
3747
|
+
Returns all ``Workflow`` instances that use this task.
|
|
3748
|
+
"""
|
|
3618
3749
|
return Workflow.objects.filter(workflow_tasks__task=self)
|
|
3619
3750
|
|
|
3620
3751
|
@property
|
|
3621
3752
|
def active_workflows(self):
|
|
3622
|
-
"""
|
|
3753
|
+
"""
|
|
3754
|
+
Return a ``QuerySet``` of active workflows that this task is part of.
|
|
3755
|
+
"""
|
|
3623
3756
|
return Workflow.objects.active().filter(workflow_tasks__task=self)
|
|
3624
3757
|
|
|
3625
3758
|
@classmethod
|
|
@@ -3638,7 +3771,9 @@ class Task(SpecificMixin, models.Model):
|
|
|
3638
3771
|
return self.task_state_class or TaskState
|
|
3639
3772
|
|
|
3640
3773
|
def start(self, workflow_state, user=None):
|
|
3641
|
-
"""
|
|
3774
|
+
"""
|
|
3775
|
+
Start this task on the provided workflow state by creating an instance of TaskState.
|
|
3776
|
+
"""
|
|
3642
3777
|
task_state = self.get_task_state_class()(workflow_state=workflow_state)
|
|
3643
3778
|
task_state.status = TaskState.STATUS_IN_PROGRESS
|
|
3644
3779
|
task_state.revision = workflow_state.content_object.get_latest_revision()
|
|
@@ -3653,39 +3788,50 @@ class Task(SpecificMixin, models.Model):
|
|
|
3653
3788
|
|
|
3654
3789
|
@transaction.atomic
|
|
3655
3790
|
def on_action(self, task_state, user, action_name, **kwargs):
|
|
3656
|
-
"""
|
|
3791
|
+
"""
|
|
3792
|
+
Performs an action on a task state determined by the ``action_name`` string passed.
|
|
3793
|
+
"""
|
|
3657
3794
|
if action_name == "approve":
|
|
3658
3795
|
task_state.approve(user=user, **kwargs)
|
|
3659
3796
|
elif action_name == "reject":
|
|
3660
3797
|
task_state.reject(user=user, **kwargs)
|
|
3661
3798
|
|
|
3662
3799
|
def user_can_access_editor(self, obj, user):
|
|
3663
|
-
"""
|
|
3664
|
-
|
|
3800
|
+
"""
|
|
3801
|
+
Returns ``True`` if a user who would not normally be able to access the editor for the
|
|
3802
|
+
object should be able to if the object is currently on this task.
|
|
3803
|
+
Note that returning ``False`` does not remove permissions from users who would otherwise have them.
|
|
3804
|
+
"""
|
|
3665
3805
|
return False
|
|
3666
3806
|
|
|
3667
3807
|
def locked_for_user(self, obj, user):
|
|
3668
3808
|
"""
|
|
3669
|
-
Returns True if the object should be locked to a given user's edits.
|
|
3809
|
+
Returns ``True`` if the object should be locked to a given user's edits.
|
|
3670
3810
|
This can be used to prevent editing by non-reviewers.
|
|
3671
3811
|
"""
|
|
3672
3812
|
return False
|
|
3673
3813
|
|
|
3674
3814
|
def user_can_lock(self, obj, user):
|
|
3675
|
-
"""
|
|
3676
|
-
|
|
3815
|
+
"""
|
|
3816
|
+
Returns ``True`` if a user who would not normally be able to lock the object should be able to
|
|
3817
|
+
if the object is currently on this task.
|
|
3818
|
+
Note that returning ``False`` does not remove permissions from users who would otherwise have them.
|
|
3819
|
+
"""
|
|
3677
3820
|
return False
|
|
3678
3821
|
|
|
3679
3822
|
def user_can_unlock(self, obj, user):
|
|
3680
|
-
"""
|
|
3681
|
-
|
|
3823
|
+
"""
|
|
3824
|
+
Returns ``True`` if a user who would not normally be able to unlock the object should be able to
|
|
3825
|
+
if the object is currently on this task.
|
|
3826
|
+
Note that returning ``False`` does not remove permissions from users who would otherwise have them.
|
|
3827
|
+
"""
|
|
3682
3828
|
return False
|
|
3683
3829
|
|
|
3684
3830
|
def get_actions(self, obj, user):
|
|
3685
3831
|
"""
|
|
3686
3832
|
Get the list of action strings (name, verbose_name, whether the action requires additional data - see
|
|
3687
3833
|
``get_form_for_action``) for actions the current user can perform for this task on the given object.
|
|
3688
|
-
These strings should be the same as those able to be passed to ``on_action
|
|
3834
|
+
These strings should be the same as those able to be passed to ``on_action``.
|
|
3689
3835
|
"""
|
|
3690
3836
|
return []
|
|
3691
3837
|
|
|
@@ -3701,12 +3847,16 @@ class Task(SpecificMixin, models.Model):
|
|
|
3701
3847
|
|
|
3702
3848
|
@classmethod
|
|
3703
3849
|
def get_description(cls):
|
|
3704
|
-
"""
|
|
3850
|
+
"""
|
|
3851
|
+
Returns the task description.
|
|
3852
|
+
"""
|
|
3705
3853
|
return ""
|
|
3706
3854
|
|
|
3707
3855
|
@transaction.atomic
|
|
3708
3856
|
def deactivate(self, user=None):
|
|
3709
|
-
"""
|
|
3857
|
+
"""
|
|
3858
|
+
Set ``active`` to False and cancel all in progress task states linked to this task.
|
|
3859
|
+
"""
|
|
3710
3860
|
self.active = False
|
|
3711
3861
|
self.save()
|
|
3712
3862
|
in_progress_states = TaskState.objects.filter(
|
|
@@ -3741,14 +3891,18 @@ class AbstractWorkflow(ClusterableModel):
|
|
|
3741
3891
|
|
|
3742
3892
|
@property
|
|
3743
3893
|
def tasks(self):
|
|
3744
|
-
"""
|
|
3894
|
+
"""
|
|
3895
|
+
Returns all ``Task`` instances linked to this workflow.
|
|
3896
|
+
"""
|
|
3745
3897
|
return Task.objects.filter(workflow_tasks__workflow=self).order_by(
|
|
3746
3898
|
"workflow_tasks__sort_order"
|
|
3747
3899
|
)
|
|
3748
3900
|
|
|
3749
3901
|
@transaction.atomic
|
|
3750
3902
|
def start(self, obj, user):
|
|
3751
|
-
"""
|
|
3903
|
+
"""
|
|
3904
|
+
Initiates a workflow by creating an instance of ``WorkflowState``.
|
|
3905
|
+
"""
|
|
3752
3906
|
state = WorkflowState(
|
|
3753
3907
|
content_type=obj.get_content_type(),
|
|
3754
3908
|
base_content_type=obj.get_base_content_type(),
|
|
@@ -3789,7 +3943,9 @@ class AbstractWorkflow(ClusterableModel):
|
|
|
3789
3943
|
|
|
3790
3944
|
@transaction.atomic
|
|
3791
3945
|
def deactivate(self, user=None):
|
|
3792
|
-
"""
|
|
3946
|
+
"""
|
|
3947
|
+
Sets the workflow as inactive, and cancels all in progress instances of ``WorkflowState`` linked to this workflow.
|
|
3948
|
+
"""
|
|
3793
3949
|
self.active = False
|
|
3794
3950
|
in_progress_states = WorkflowState.objects.filter(
|
|
3795
3951
|
workflow=self, status=WorkflowState.STATUS_IN_PROGRESS
|
|
@@ -3915,7 +4071,7 @@ class GroupApprovalTask(AbstractGroupApprovalTask):
|
|
|
3915
4071
|
class WorkflowStateQuerySet(models.QuerySet):
|
|
3916
4072
|
def active(self):
|
|
3917
4073
|
"""
|
|
3918
|
-
Filters to only STATUS_IN_PROGRESS and STATUS_NEEDS_CHANGES WorkflowStates
|
|
4074
|
+
Filters to only ``STATUS_IN_PROGRESS`` and ``STATUS_NEEDS_CHANGES`` WorkflowStates.
|
|
3919
4075
|
"""
|
|
3920
4076
|
return self.filter(
|
|
3921
4077
|
Q(status=WorkflowState.STATUS_IN_PROGRESS)
|
|
@@ -3924,7 +4080,7 @@ class WorkflowStateQuerySet(models.QuerySet):
|
|
|
3924
4080
|
|
|
3925
4081
|
def for_instance(self, instance):
|
|
3926
4082
|
"""
|
|
3927
|
-
Filters to only WorkflowStates for the given instance
|
|
4083
|
+
Filters to only WorkflowStates for the given instance.
|
|
3928
4084
|
"""
|
|
3929
4085
|
try:
|
|
3930
4086
|
# Use RevisionMixin.get_base_content_type() if available
|
|
@@ -4106,8 +4262,10 @@ class WorkflowState(models.Model):
|
|
|
4106
4262
|
)
|
|
4107
4263
|
|
|
4108
4264
|
def update(self, user=None, next_task=None):
|
|
4109
|
-
"""
|
|
4110
|
-
|
|
4265
|
+
"""
|
|
4266
|
+
Checks the status of the current task, and progresses (or ends) the workflow if appropriate.
|
|
4267
|
+
If the workflow progresses, next_task will be used to start a specific task next if provided.
|
|
4268
|
+
"""
|
|
4111
4269
|
if self.status != self.STATUS_IN_PROGRESS:
|
|
4112
4270
|
# Updating a completed or cancelled workflow should have no effect
|
|
4113
4271
|
return
|
|
@@ -4156,7 +4314,9 @@ class WorkflowState(models.Model):
|
|
|
4156
4314
|
return successful_task_states
|
|
4157
4315
|
|
|
4158
4316
|
def get_next_task(self):
|
|
4159
|
-
"""
|
|
4317
|
+
"""
|
|
4318
|
+
Returns the next active task, which has not been either approved or skipped.
|
|
4319
|
+
"""
|
|
4160
4320
|
|
|
4161
4321
|
return (
|
|
4162
4322
|
Task.objects.filter(workflow_tasks__workflow=self.workflow, active=True)
|
|
@@ -4202,7 +4362,9 @@ class WorkflowState(models.Model):
|
|
|
4202
4362
|
|
|
4203
4363
|
@transaction.atomic
|
|
4204
4364
|
def finish(self, user=None):
|
|
4205
|
-
"""
|
|
4365
|
+
"""
|
|
4366
|
+
Finishes a successful in progress workflow, marking it as approved and performing the ``on_finish`` action.
|
|
4367
|
+
"""
|
|
4206
4368
|
if self.status != self.STATUS_IN_PROGRESS:
|
|
4207
4369
|
raise PermissionDenied
|
|
4208
4370
|
self.status = self.STATUS_APPROVED
|
|
@@ -4211,7 +4373,9 @@ class WorkflowState(models.Model):
|
|
|
4211
4373
|
workflow_approved.send(sender=self.__class__, instance=self, user=user)
|
|
4212
4374
|
|
|
4213
4375
|
def copy_approved_task_states_to_revision(self, revision):
|
|
4214
|
-
"""
|
|
4376
|
+
"""
|
|
4377
|
+
Creates copies of previously approved task states with revision set to a different revision.
|
|
4378
|
+
"""
|
|
4215
4379
|
approved_states = TaskState.objects.filter(
|
|
4216
4380
|
workflow_state=self, status=TaskState.STATUS_APPROVED
|
|
4217
4381
|
)
|
|
@@ -4219,7 +4383,9 @@ class WorkflowState(models.Model):
|
|
|
4219
4383
|
state.copy(update_attrs={"revision": revision})
|
|
4220
4384
|
|
|
4221
4385
|
def revisions(self):
|
|
4222
|
-
"""
|
|
4386
|
+
"""
|
|
4387
|
+
Returns all revisions associated with task states linked to the current workflow state.
|
|
4388
|
+
"""
|
|
4223
4389
|
return Revision.objects.filter(
|
|
4224
4390
|
base_content_type_id=self.base_content_type_id,
|
|
4225
4391
|
object_id=self.object_id,
|
|
@@ -4227,7 +4393,9 @@ class WorkflowState(models.Model):
|
|
|
4227
4393
|
).defer("content")
|
|
4228
4394
|
|
|
4229
4395
|
def _get_applicable_task_states(self):
|
|
4230
|
-
"""
|
|
4396
|
+
"""
|
|
4397
|
+
Returns the set of task states whose status applies to the current revision.
|
|
4398
|
+
"""
|
|
4231
4399
|
|
|
4232
4400
|
task_states = TaskState.objects.filter(workflow_state_id=self.id)
|
|
4233
4401
|
# If WAGTAIL_WORKFLOW_REQUIRE_REAPPROVAL_ON_EDIT=True, this is only task states created on the current revision
|
|
@@ -4245,8 +4413,8 @@ class WorkflowState(models.Model):
|
|
|
4245
4413
|
"""
|
|
4246
4414
|
Returns a list of Task objects that are linked with this workflow state's
|
|
4247
4415
|
workflow. The status of that task in this workflow state is annotated in the
|
|
4248
|
-
|
|
4249
|
-
|
|
4416
|
+
``.status`` field. And a displayable version of that status is annotated in the
|
|
4417
|
+
``.status_display`` field.
|
|
4250
4418
|
|
|
4251
4419
|
This is different to querying TaskState as it also returns tasks that haven't
|
|
4252
4420
|
been started yet (so won't have a TaskState).
|
|
@@ -4308,7 +4476,9 @@ class WorkflowState(models.Model):
|
|
|
4308
4476
|
|
|
4309
4477
|
@property
|
|
4310
4478
|
def is_at_final_task(self):
|
|
4311
|
-
"""
|
|
4479
|
+
"""
|
|
4480
|
+
Returns the next active task, which has not been either approved or skipped.
|
|
4481
|
+
"""
|
|
4312
4482
|
|
|
4313
4483
|
last_task = (
|
|
4314
4484
|
Task.objects.filter(workflow_tasks__workflow=self.workflow, active=True)
|
|
@@ -4458,7 +4628,9 @@ class TaskState(SpecificMixin, models.Model):
|
|
|
4458
4628
|
|
|
4459
4629
|
@transaction.atomic
|
|
4460
4630
|
def approve(self, user=None, update=True, comment=""):
|
|
4461
|
-
"""
|
|
4631
|
+
"""
|
|
4632
|
+
Approve the task state and update the workflow state.
|
|
4633
|
+
"""
|
|
4462
4634
|
if self.status != self.STATUS_IN_PROGRESS:
|
|
4463
4635
|
raise PermissionDenied
|
|
4464
4636
|
self.status = self.STATUS_APPROVED
|
|
@@ -4477,7 +4649,9 @@ class TaskState(SpecificMixin, models.Model):
|
|
|
4477
4649
|
|
|
4478
4650
|
@transaction.atomic
|
|
4479
4651
|
def reject(self, user=None, update=True, comment=""):
|
|
4480
|
-
"""
|
|
4652
|
+
"""
|
|
4653
|
+
Reject the task state and update the workflow state.
|
|
4654
|
+
"""
|
|
4481
4655
|
if self.status != self.STATUS_IN_PROGRESS:
|
|
4482
4656
|
raise PermissionDenied
|
|
4483
4657
|
self.status = self.STATUS_REJECTED
|
|
@@ -4497,7 +4671,9 @@ class TaskState(SpecificMixin, models.Model):
|
|
|
4497
4671
|
|
|
4498
4672
|
@cached_property
|
|
4499
4673
|
def task_type_started_at(self):
|
|
4500
|
-
"""
|
|
4674
|
+
"""
|
|
4675
|
+
Finds the first chronological started_at for successive TaskStates - ie started_at if the task had not been restarted.
|
|
4676
|
+
"""
|
|
4501
4677
|
task_states = (
|
|
4502
4678
|
TaskState.objects.filter(workflow_state=self.workflow_state)
|
|
4503
4679
|
.order_by("-started_at")
|
|
@@ -4513,8 +4689,11 @@ class TaskState(SpecificMixin, models.Model):
|
|
|
4513
4689
|
|
|
4514
4690
|
@transaction.atomic
|
|
4515
4691
|
def cancel(self, user=None, resume=False, comment=""):
|
|
4516
|
-
"""
|
|
4517
|
-
|
|
4692
|
+
"""
|
|
4693
|
+
Cancel the task state and update the workflow state.
|
|
4694
|
+
If ``resume`` is set to True, then upon update the workflow state is passed the current task as ``next_task``,
|
|
4695
|
+
causing it to start a new task state on the current task if possible.
|
|
4696
|
+
"""
|
|
4518
4697
|
self.status = self.STATUS_CANCELLED
|
|
4519
4698
|
self.finished_at = timezone.now()
|
|
4520
4699
|
self.comment = comment
|
|
@@ -4530,8 +4709,10 @@ class TaskState(SpecificMixin, models.Model):
|
|
|
4530
4709
|
return self
|
|
4531
4710
|
|
|
4532
4711
|
def copy(self, update_attrs=None, exclude_fields=None):
|
|
4533
|
-
"""
|
|
4534
|
-
|
|
4712
|
+
"""
|
|
4713
|
+
Copy this task state, excluding the attributes in the ``exclude_fields`` list and updating any attributes
|
|
4714
|
+
to values specified in the ``update_attrs`` dictionary of ``attribute``: ``new value`` pairs.
|
|
4715
|
+
"""
|
|
4535
4716
|
exclude_fields = (
|
|
4536
4717
|
self.default_exclude_fields_in_copy
|
|
4537
4718
|
+ self.exclude_fields_in_copy
|
|
@@ -4777,7 +4958,7 @@ class Comment(ClusterableModel):
|
|
|
4777
4958
|
def has_valid_contentpath(self, page):
|
|
4778
4959
|
"""
|
|
4779
4960
|
Return True if this comment's contentpath corresponds to a valid field or
|
|
4780
|
-
StreamField block on the given page object
|
|
4961
|
+
StreamField block on the given page object.
|
|
4781
4962
|
"""
|
|
4782
4963
|
field_name, *remainder = self.contentpath.split(".")
|
|
4783
4964
|
try:
|