wagtail 6.0.1__py3-none-any.whl → 6.1rc1__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/admin/checks.py +51 -0
- wagtail/admin/compare.py +1 -1
- wagtail/admin/filters.py +70 -1
- wagtail/admin/forms/account.py +1 -1
- wagtail/admin/forms/collections.py +15 -0
- wagtail/admin/forms/pages.py +49 -0
- wagtail/admin/locale/ca/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/ca/LC_MESSAGES/django.po +122 -0
- wagtail/admin/locale/de/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/de/LC_MESSAGES/django.po +5 -5
- wagtail/admin/locale/en/LC_MESSAGES/django.po +474 -385
- wagtail/admin/locale/en/LC_MESSAGES/djangojs.po +3 -3
- wagtail/admin/locale/es/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/es/LC_MESSAGES/django.po +6 -6
- wagtail/admin/locale/fr/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/fr/LC_MESSAGES/django.po +70 -3
- wagtail/admin/locale/he_IL/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/he_IL/LC_MESSAGES/django.po +2 -6
- wagtail/admin/locale/he_IL/LC_MESSAGES/djangojs.mo +0 -0
- wagtail/admin/locale/he_IL/LC_MESSAGES/djangojs.po +2 -2
- wagtail/admin/locale/hr_HR/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/hr_HR/LC_MESSAGES/django.po +4 -0
- wagtail/admin/locale/hu/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/hu/LC_MESSAGES/django.po +142 -2
- wagtail/admin/locale/it/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/it/LC_MESSAGES/django.po +80 -8
- wagtail/admin/locale/it/LC_MESSAGES/djangojs.mo +0 -0
- wagtail/admin/locale/it/LC_MESSAGES/djangojs.po +14 -2
- wagtail/admin/locale/lv/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/lv/LC_MESSAGES/django.po +154 -1
- wagtail/admin/locale/pt_PT/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/pt_PT/LC_MESSAGES/django.po +73 -2
- wagtail/admin/locale/ro/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/ro/LC_MESSAGES/django.po +3 -3
- wagtail/admin/locale/sl/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/sl/LC_MESSAGES/django.po +145 -2
- wagtail/admin/locale/sv/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/sv/LC_MESSAGES/django.po +77 -3
- wagtail/admin/locale/zh_Hant/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/zh_Hant/LC_MESSAGES/django.po +17 -1
- wagtail/admin/panels/comment_panel.py +1 -1
- wagtail/admin/panels/field_panel.py +1 -1
- wagtail/admin/rich_text/converters/editor_html.py +3 -1
- wagtail/admin/rich_text/editors/draftail/__init__.py +28 -2
- wagtail/admin/static/wagtailadmin/css/core.css +1 -1
- wagtail/admin/static/wagtailadmin/css/panels/draftail.css +1 -1
- wagtail/admin/static/wagtailadmin/images/favicon.ico +0 -0
- wagtail/admin/static/wagtailadmin/js/bulk-actions.js +1 -1
- wagtail/admin/static/wagtailadmin/js/chooser-modal.js +1 -1
- wagtail/admin/static/wagtailadmin/js/chooser-widget-telepath.js +1 -1
- wagtail/admin/static/wagtailadmin/js/chooser-widget.js +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 -1
- wagtail/admin/static/wagtailadmin/js/date-time-chooser.js +1 -1
- wagtail/admin/static/wagtailadmin/js/draftail.js +1 -1
- wagtail/admin/static/wagtailadmin/js/expanding-formset.js +1 -1
- wagtail/admin/static/wagtailadmin/js/filtered-select.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/page-chooser-telepath.js +1 -1
- wagtail/admin/static/wagtailadmin/js/page-chooser.js +1 -1
- wagtail/admin/static/wagtailadmin/js/preview-panel.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/task-chooser-modal.js +1 -1
- wagtail/admin/static/wagtailadmin/js/task-chooser.js +1 -1
- wagtail/admin/static/wagtailadmin/js/telepath/blocks.js +1 -1
- wagtail/admin/static/wagtailadmin/js/telepath/telepath.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/vendor.js +1 -1
- wagtail/admin/static/wagtailadmin/js/vendor.js.LICENSE.txt +4 -4
- wagtail/admin/static/wagtailadmin/js/wagtailadmin.js +1 -1
- wagtail/admin/static/wagtailadmin/js/workflow-action.js +1 -1
- wagtail/admin/staticfiles.py +1 -0
- wagtail/admin/templates/wagtailadmin/admin_base.html +1 -0
- wagtail/admin/templates/wagtailadmin/base.html +1 -0
- wagtail/admin/templates/wagtailadmin/collection_privacy/set_privacy.html +3 -1
- wagtail/admin/templates/wagtailadmin/collections/edit.html +0 -1
- wagtail/admin/templates/wagtailadmin/collections/index_results.html +10 -0
- wagtail/admin/templates/wagtailadmin/generic/base.html +1 -9
- wagtail/admin/templates/wagtailadmin/generic/form.html +4 -2
- wagtail/admin/templates/wagtailadmin/generic/history/action_cell.html +27 -0
- wagtail/admin/templates/wagtailadmin/generic/index_results.html +8 -0
- wagtail/admin/templates/wagtailadmin/home/workflow_objects_to_moderate.html +3 -4
- wagtail/admin/templates/wagtailadmin/icons/keyboard.svg +1 -0
- wagtail/admin/templates/wagtailadmin/page_privacy/set_privacy.html +3 -1
- wagtail/admin/templates/wagtailadmin/pages/_editor_js.html +0 -15
- wagtail/admin/templates/wagtailadmin/pages/action_menu/save_draft.html +3 -1
- wagtail/admin/templates/wagtailadmin/pages/choose_parent.html +17 -0
- wagtail/admin/templates/wagtailadmin/pages/explorable_index.html +8 -0
- wagtail/admin/templates/wagtailadmin/pages/history.html +1 -61
- wagtail/admin/templates/wagtailadmin/pages/index.html +1 -5
- wagtail/admin/templates/wagtailadmin/pages/listing/_locked_indicator.html +2 -2
- wagtail/admin/templates/wagtailadmin/pages/listing/_page_title_column_header.html +25 -27
- wagtail/admin/templates/wagtailadmin/pages/page_listing_header.html +2 -1
- wagtail/admin/templates/wagtailadmin/panels/multi_field_panel_child.html +1 -1
- wagtail/admin/templates/wagtailadmin/panels/publishing/schedule_publishing_panel.html +3 -1
- wagtail/admin/templates/wagtailadmin/panels/tabbed_interface.html +1 -1
- wagtail/admin/templates/wagtailadmin/shared/active_filters.html +2 -1
- wagtail/admin/templates/wagtailadmin/shared/breadcrumbs.html +8 -0
- wagtail/admin/templates/wagtailadmin/shared/forms/single_checkbox.html +1 -1
- wagtail/admin/templates/wagtailadmin/shared/headers/page_edit_header.html +1 -1
- wagtail/admin/templates/wagtailadmin/shared/headers/slim_header.html +21 -9
- wagtail/admin/templates/wagtailadmin/shared/human_readable_date.html +1 -1
- wagtail/admin/templates/wagtailadmin/shared/keyboard_shortcuts_dialog.html +29 -0
- wagtail/admin/templates/wagtailadmin/shared/side_panel_toggle.html +2 -1
- wagtail/admin/templates/wagtailadmin/skeleton.html +2 -1
- wagtail/admin/templates/wagtailadmin/tables/related_objects_cell.html +9 -0
- wagtail/admin/templates/wagtailadmin/tables/title_cell.html +9 -7
- wagtail/admin/templates/wagtailadmin/widgets/draftail_rich_text_area.html +1 -1
- wagtail/admin/templates/wagtailadmin/workflows/create.html +6 -23
- wagtail/admin/templates/wagtailadmin/workflows/create_task.html +6 -15
- wagtail/admin/templates/wagtailadmin/workflows/edit.html +6 -23
- wagtail/admin/templates/wagtailadmin/workflows/edit_task.html +6 -13
- wagtail/admin/templates/wagtailadmin/workflows/includes/task_usage_cell.html +4 -4
- wagtail/admin/templates/wagtailadmin/workflows/includes/workflow_tasks_cell.html +18 -0
- wagtail/admin/templates/wagtailadmin/workflows/includes/workflow_title_cell.html +7 -0
- wagtail/admin/templates/wagtailadmin/workflows/includes/workflow_used_by_cell.html +25 -0
- wagtail/admin/templates/wagtailadmin/workflows/index.html +0 -99
- wagtail/admin/templates/wagtailadmin/workflows/index_results.html +10 -0
- wagtail/admin/templates/wagtailadmin/workflows/task_index.html +0 -30
- wagtail/admin/templates/wagtailadmin/workflows/task_index_results.html +10 -0
- wagtail/admin/templates/wagtailadmin/workflows/usage.html +1 -1
- wagtail/admin/templatetags/wagtailadmin_tags.py +116 -39
- wagtail/admin/tests/api/test_pages.py +26 -10
- wagtail/admin/tests/pages/test_create_page.py +10 -4
- wagtail/admin/tests/pages/test_custom_listing.py +37 -0
- wagtail/admin/tests/pages/test_edit_page.py +6 -6
- wagtail/admin/tests/pages/test_explorer_view.py +19 -18
- wagtail/admin/tests/pages/test_move_page.py +1 -1
- wagtail/admin/tests/pages/test_page_usage.py +50 -2
- wagtail/admin/tests/pages/test_parent_page_chooser_view.py +119 -0
- wagtail/admin/tests/pages/test_preview.py +18 -4
- wagtail/admin/tests/test_account_management.py +20 -1
- wagtail/admin/tests/test_audit_log.py +172 -5
- wagtail/admin/tests/test_checks.py +92 -0
- wagtail/admin/tests/test_collections_views.py +19 -5
- wagtail/admin/tests/test_compare.py +6 -6
- wagtail/admin/tests/test_dashboard.py +404 -0
- wagtail/admin/tests/test_dbwhitelister.py +4 -5
- wagtail/admin/tests/test_edit_handlers.py +2 -2
- wagtail/admin/tests/test_keyboard_shortcuts.py +84 -0
- wagtail/admin/tests/test_page_chooser.py +31 -18
- wagtail/admin/tests/test_privacy.py +36 -2
- wagtail/admin/tests/test_rich_text.py +168 -23
- wagtail/admin/tests/test_templatetags.py +411 -43
- wagtail/admin/tests/test_views.py +4 -2
- wagtail/admin/tests/test_workflows.py +531 -9
- wagtail/admin/tests/tests.py +3 -1
- wagtail/admin/tests/ui/test_tables.py +48 -1
- wagtail/admin/tests/viewsets/test_model_viewset.py +130 -23
- wagtail/admin/ui/side_panels.py +3 -1
- wagtail/admin/ui/tables/__init__.py +13 -1
- wagtail/admin/ui/tables/pages.py +17 -6
- wagtail/admin/urls/__init__.py +8 -3
- wagtail/admin/urls/pages.py +5 -0
- wagtail/admin/urls/workflows.py +10 -0
- wagtail/admin/views/chooser.py +20 -24
- wagtail/admin/views/collections.py +17 -1
- wagtail/admin/views/generic/base.py +34 -4
- wagtail/admin/views/generic/history.py +220 -51
- wagtail/admin/views/generic/mixins.py +7 -4
- wagtail/admin/views/generic/models.py +54 -47
- wagtail/admin/views/generic/multiple_upload.py +17 -8
- wagtail/admin/views/generic/usage.py +17 -11
- wagtail/admin/views/home.py +15 -12
- wagtail/admin/views/mixins.py +30 -0
- wagtail/admin/views/pages/choose_parent.py +73 -0
- wagtail/admin/views/pages/history.py +54 -66
- wagtail/admin/views/pages/listing.py +187 -106
- wagtail/admin/views/pages/usage.py +6 -1
- wagtail/admin/views/pages/utils.py +70 -1
- wagtail/admin/views/workflows.py +150 -21
- wagtail/admin/viewsets/model.py +2 -2
- wagtail/admin/viewsets/pages.py +77 -0
- wagtail/admin/wagtail_hooks.py +40 -2
- wagtail/admin/widgets/button.py +10 -10
- wagtail/api/v2/filters.py +1 -1
- wagtail/api/v2/tests/test_pages.py +1 -1
- wagtail/blocks/base.py +18 -9
- wagtail/blocks/field_block.py +9 -7
- wagtail/blocks/list_block.py +16 -6
- wagtail/blocks/static_block.py +3 -0
- wagtail/blocks/stream_block.py +58 -23
- wagtail/blocks/struct_block.py +15 -9
- wagtail/contrib/forms/locale/en/LC_MESSAGES/django.po +39 -47
- wagtail/contrib/forms/locale/he_IL/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/forms/locale/he_IL/LC_MESSAGES/django.po +2 -2
- wagtail/contrib/forms/models.py +5 -5
- wagtail/contrib/forms/templates/wagtailforms/list_submissions.html +44 -33
- wagtail/contrib/forms/templates/wagtailforms/submissions_index.html +2 -63
- wagtail/contrib/forms/tests/test_models.py +26 -0
- wagtail/contrib/forms/urls.py +6 -0
- wagtail/contrib/forms/views.py +52 -49
- wagtail/contrib/redirects/locale/ca/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/ca/LC_MESSAGES/django.po +3 -3
- wagtail/contrib/redirects/locale/en/LC_MESSAGES/django.po +34 -42
- wagtail/contrib/redirects/locale/fr/LC_MESSAGES/django.po +2 -2
- wagtail/contrib/redirects/locale/he_IL/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/redirects/locale/he_IL/LC_MESSAGES/django.po +2 -2
- wagtail/contrib/redirects/signal_handlers.py +1 -1
- wagtail/contrib/redirects/templates/wagtailredirects/index.html +1 -36
- wagtail/contrib/redirects/templates/wagtailredirects/index_results.html +18 -0
- wagtail/contrib/redirects/templates/wagtailredirects/redirect_target_cell.html +8 -0
- wagtail/contrib/redirects/tests/test_import_command.py +1 -1
- wagtail/contrib/redirects/tests/test_redirects.py +79 -8
- wagtail/contrib/redirects/urls.py +2 -1
- wagtail/contrib/redirects/views.py +85 -55
- wagtail/contrib/search_promotions/admin_urls.py +2 -1
- wagtail/contrib/search_promotions/locale/en/LC_MESSAGES/django.po +41 -64
- wagtail/contrib/search_promotions/locale/fr/LC_MESSAGES/django.po +2 -2
- wagtail/contrib/search_promotions/locale/he_IL/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/he_IL/LC_MESSAGES/django.po +2 -2
- wagtail/contrib/search_promotions/locale/hr_HR/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/hr_HR/LC_MESSAGES/django.po +41 -2
- wagtail/contrib/search_promotions/locale/it/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/search_promotions/locale/it/LC_MESSAGES/django.po +9 -3
- wagtail/contrib/search_promotions/templates/wagtailsearchpromotions/index.html +1 -16
- wagtail/contrib/search_promotions/templates/wagtailsearchpromotions/index_results.html +11 -0
- wagtail/contrib/search_promotions/templates/wagtailsearchpromotions/list.html +0 -51
- wagtail/contrib/search_promotions/templates/wagtailsearchpromotions/results.html +3 -16
- wagtail/contrib/search_promotions/templates/wagtailsearchpromotions/search_promotion_column.html +15 -0
- wagtail/contrib/search_promotions/tests.py +122 -9
- wagtail/contrib/search_promotions/views.py +66 -65
- wagtail/contrib/settings/locale/en/LC_MESSAGES/django.po +3 -3
- wagtail/contrib/settings/locale/he_IL/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/settings/locale/he_IL/LC_MESSAGES/django.po +2 -2
- wagtail/contrib/settings/locale/tr/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/settings/locale/tr/LC_MESSAGES/django.po +6 -2
- wagtail/contrib/settings/registry.py +10 -5
- wagtail/contrib/settings/tests/generic/test_admin.py +9 -0
- wagtail/contrib/settings/tests/site_specific/test_admin.py +10 -1
- wagtail/contrib/settings/tests/site_specific/test_model.py +3 -3
- wagtail/contrib/settings/tests/site_specific/test_templates.py +1 -1
- wagtail/contrib/settings/views.py +3 -1
- wagtail/contrib/simple_translation/locale/en/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/simple_translation/tests/test_wagtail_hooks.py +2 -2
- wagtail/contrib/styleguide/locale/en/LC_MESSAGES/django.po +7 -7
- wagtail/contrib/styleguide/locale/he_IL/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/styleguide/locale/he_IL/LC_MESSAGES/django.po +2 -2
- wagtail/contrib/table_block/blocks.py +2 -2
- wagtail/contrib/table_block/locale/ca/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/table_block/locale/ca/LC_MESSAGES/django.po +27 -2
- wagtail/contrib/table_block/locale/en/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/table_block/locale/hu/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/table_block/locale/hu/LC_MESSAGES/django.po +27 -2
- wagtail/contrib/table_block/locale/it/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/table_block/locale/it/LC_MESSAGES/django.po +27 -2
- wagtail/contrib/table_block/static/table_block/js/table.js +1 -1
- wagtail/contrib/table_block/tests.py +6 -0
- wagtail/contrib/typed_table_block/locale/ca/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/typed_table_block/locale/ca/LC_MESSAGES/django.po +12 -2
- wagtail/contrib/typed_table_block/locale/en/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/typed_table_block/locale/hu/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/typed_table_block/locale/hu/LC_MESSAGES/django.po +12 -2
- wagtail/contrib/typed_table_block/locale/it/LC_MESSAGES/django.mo +0 -0
- wagtail/contrib/typed_table_block/locale/it/LC_MESSAGES/django.po +12 -2
- wagtail/contrib/typed_table_block/static/typed_table_block/js/typed_table_block.js +1 -1
- wagtail/coreutils.py +3 -2
- wagtail/documents/admin_urls.py +2 -2
- wagtail/documents/locale/en/LC_MESSAGES/django.po +22 -22
- wagtail/documents/locale/fr/LC_MESSAGES/django.po +2 -2
- wagtail/documents/locale/he_IL/LC_MESSAGES/django.mo +0 -0
- wagtail/documents/locale/he_IL/LC_MESSAGES/django.po +2 -2
- wagtail/documents/locale/hr_HR/LC_MESSAGES/django.mo +0 -0
- wagtail/documents/locale/hr_HR/LC_MESSAGES/django.po +19 -2
- wagtail/documents/locale/hu/LC_MESSAGES/django.mo +0 -0
- wagtail/documents/locale/hu/LC_MESSAGES/django.po +16 -2
- wagtail/documents/locale/it/LC_MESSAGES/django.mo +0 -0
- wagtail/documents/locale/it/LC_MESSAGES/django.po +19 -2
- wagtail/documents/migrations/0013_delete_uploadeddocument.py +16 -0
- wagtail/documents/models.py +1 -20
- wagtail/documents/rich_text/__init__.py +11 -7
- wagtail/documents/static/wagtaildocs/js/document-chooser-modal.js +1 -1
- wagtail/documents/static/wagtaildocs/js/document-chooser-telepath.js +1 -1
- wagtail/documents/static/wagtaildocs/js/document-chooser.js +1 -1
- wagtail/documents/templates/wagtaildocs/documents/index.html +0 -16
- wagtail/documents/tests/test_admin_views.py +155 -23
- wagtail/documents/tests/test_collection_privacy.py +55 -1
- wagtail/documents/tests/test_rich_text.py +14 -0
- wagtail/documents/views/documents.py +25 -22
- wagtail/documents/views/multiple.py +6 -7
- wagtail/documents/views/serve.py +16 -1
- wagtail/documents/wagtail_hooks.py +20 -15
- wagtail/embeds/blocks.py +5 -0
- wagtail/embeds/locale/en/LC_MESSAGES/django.po +2 -2
- wagtail/embeds/locale/fr/LC_MESSAGES/django.po +2 -2
- wagtail/embeds/locale/he_IL/LC_MESSAGES/django.mo +0 -0
- wagtail/embeds/locale/he_IL/LC_MESSAGES/django.po +2 -2
- wagtail/embeds/rich_text/__init__.py +1 -1
- wagtail/embeds/tests/test_rich_text.py +14 -0
- wagtail/embeds/wagtail_hooks.py +4 -14
- wagtail/fields.py +3 -48
- wagtail/images/admin_urls.py +2 -2
- wagtail/images/check_files/wagtail.jpg +0 -0
- wagtail/images/check_files/wagtail.png +0 -0
- wagtail/images/fields.py +2 -0
- wagtail/images/image_operations.py +1 -1
- wagtail/images/locale/ca/LC_MESSAGES/django.mo +0 -0
- wagtail/images/locale/ca/LC_MESSAGES/django.po +12 -0
- wagtail/images/locale/en/LC_MESSAGES/django.po +33 -45
- wagtail/images/locale/fr/LC_MESSAGES/django.po +2 -2
- wagtail/images/locale/he_IL/LC_MESSAGES/django.mo +0 -0
- wagtail/images/locale/he_IL/LC_MESSAGES/django.po +2 -2
- wagtail/images/locale/hu/LC_MESSAGES/django.mo +0 -0
- wagtail/images/locale/hu/LC_MESSAGES/django.po +28 -2
- wagtail/images/locale/it/LC_MESSAGES/django.mo +0 -0
- wagtail/images/locale/it/LC_MESSAGES/django.po +14 -2
- wagtail/images/locale/pt_PT/LC_MESSAGES/django.mo +0 -0
- wagtail/images/locale/pt_PT/LC_MESSAGES/django.po +4 -0
- wagtail/images/migrations/0026_delete_uploadedimage.py +16 -0
- wagtail/images/models.py +49 -43
- wagtail/images/rich_text/__init__.py +18 -8
- wagtail/images/static/wagtailimages/js/image-chooser-modal.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/templates/wagtailimages/images/image_listing_header.html +6 -0
- wagtail/images/templates/wagtailimages/images/index.html +11 -51
- wagtail/images/tests/test_admin_views.py +119 -62
- wagtail/images/tests/test_image_operations.py +10 -0
- wagtail/images/tests/test_models.py +35 -33
- wagtail/images/tests/test_rich_text.py +14 -0
- wagtail/images/tests/utils.py +1 -1
- wagtail/images/views/images.py +35 -64
- wagtail/images/views/multiple.py +6 -7
- wagtail/images/wagtail_hooks.py +4 -14
- wagtail/locale/en/LC_MESSAGES/django.po +150 -136
- wagtail/locale/es/LC_MESSAGES/django.mo +0 -0
- wagtail/locale/es/LC_MESSAGES/django.po +3 -2
- wagtail/locale/fr/LC_MESSAGES/django.po +2 -2
- wagtail/locale/he_IL/LC_MESSAGES/django.mo +0 -0
- wagtail/locale/he_IL/LC_MESSAGES/django.po +2 -2
- wagtail/locale/it/LC_MESSAGES/django.mo +0 -0
- wagtail/locale/it/LC_MESSAGES/django.po +5 -5
- wagtail/locale/sl/LC_MESSAGES/django.mo +0 -0
- wagtail/locale/sl/LC_MESSAGES/django.po +27 -2
- 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/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 +2 -2
- 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.mo +0 -0
- wagtail/locales/locale/he_IL/LC_MESSAGES/django.po +3 -3
- 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/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/locales/tests.py +18 -3
- wagtail/locales/views.py +0 -1
- wagtail/management/commands/rebuild_references_index.py +3 -1
- wagtail/migrations/0092_alter_collectionviewrestriction_password_and_more.py +33 -0
- wagtail/migrations/0093_uploadedfile.py +53 -0
- wagtail/models/__init__.py +147 -32
- wagtail/models/i18n.py +1 -1
- wagtail/models/{collections.py → media.py} +33 -2
- wagtail/models/reference_index.py +1 -1
- wagtail/models/view_restrictions.py +10 -3
- wagtail/project_template/project_name/settings/base.py +6 -0
- wagtail/project_template/requirements.txt +1 -1
- wagtail/rich_text/__init__.py +25 -8
- wagtail/rich_text/pages.py +19 -8
- wagtail/rich_text/rewriters.py +140 -68
- wagtail/search/backends/database/mysql/mysql.py +3 -3
- wagtail/search/backends/database/postgres/postgres.py +3 -3
- wagtail/search/backends/database/sqlite/sqlite.py +2 -2
- wagtail/search/backends/elasticsearch7.py +4 -0
- wagtail/search/locale/en/LC_MESSAGES/django.po +3 -3
- wagtail/search/tests/test_postgres_backend.py +50 -0
- wagtail/sites/locale/en/LC_MESSAGES/django.po +8 -8
- wagtail/sites/locale/he_IL/LC_MESSAGES/django.mo +0 -0
- wagtail/sites/locale/he_IL/LC_MESSAGES/django.po +2 -2
- wagtail/sites/locale/ro/LC_MESSAGES/django.mo +0 -0
- wagtail/sites/locale/ro/LC_MESSAGES/django.po +3 -2
- wagtail/sites/tests.py +35 -9
- wagtail/sites/views.py +3 -1
- wagtail/snippets/locale/de/LC_MESSAGES/django.mo +0 -0
- wagtail/snippets/locale/de/LC_MESSAGES/django.po +7 -8
- wagtail/snippets/locale/en/LC_MESSAGES/django.po +16 -56
- wagtail/snippets/locale/fr/LC_MESSAGES/django.po +2 -2
- wagtail/snippets/locale/he_IL/LC_MESSAGES/django.mo +0 -0
- wagtail/snippets/locale/he_IL/LC_MESSAGES/django.po +2 -2
- wagtail/snippets/locale/hr_HR/LC_MESSAGES/django.mo +0 -0
- wagtail/snippets/locale/hr_HR/LC_MESSAGES/django.po +6 -2
- wagtail/snippets/locale/lv/LC_MESSAGES/django.mo +0 -0
- wagtail/snippets/locale/lv/LC_MESSAGES/django.po +12 -0
- wagtail/snippets/locale/zh_Hant/LC_MESSAGES/django.mo +0 -0
- wagtail/snippets/locale/zh_Hant/LC_MESSAGES/django.po +4 -0
- wagtail/snippets/static/wagtailsnippets/js/snippet-chooser-telepath.js +1 -1
- wagtail/snippets/static/wagtailsnippets/js/snippet-chooser.js +1 -1
- wagtail/snippets/templates/wagtailsnippets/snippets/action_menu/publish.html +3 -1
- wagtail/snippets/templates/wagtailsnippets/snippets/action_menu/save.html +3 -1
- wagtail/snippets/templates/wagtailsnippets/snippets/create.html +2 -3
- wagtail/snippets/templates/wagtailsnippets/snippets/edit.html +2 -3
- wagtail/snippets/tests/test_preview.py +13 -2
- wagtail/snippets/tests/test_snippets.py +41 -16
- wagtail/snippets/tests/test_viewset.py +95 -18
- wagtail/snippets/tests/test_workflows.py +12 -0
- wagtail/snippets/views/snippets.py +1 -40
- wagtail/templatetags/wagtailcore_tags.py +1 -1
- wagtail/test/demosite/models.py +1 -1
- wagtail/test/middleware.py +14 -1
- wagtail/test/testapp/fixtures/test.json +20 -0
- wagtail/test/testapp/migrations/0001_squashed_0073_revisablechildmodel_secret_text.py +8 -8
- wagtail/test/testapp/migrations/0023_snippetchoosermodel_full_featured.py +1 -0
- wagtail/test/testapp/migrations/0034_custompermissionmodel.py +44 -0
- wagtail/test/testapp/migrations/0035_modelwithcustommanager.py +30 -0
- wagtail/test/testapp/migrations/0036_complexdefaultstreampage.py +28 -0
- wagtail/test/testapp/models.py +79 -2
- wagtail/test/testapp/templates/tests/custom_docs_password_required.html +10 -0
- wagtail/test/testapp/templates/tests/custom_page_password_required.html +10 -0
- wagtail/test/testapp/views.py +24 -2
- wagtail/test/testapp/wagtail_hooks.py +19 -0
- wagtail/test/utils/wagtail_tests.py +2 -2
- wagtail/tests/test_blocks.py +262 -1
- wagtail/tests/test_migrations.py +1 -1
- wagtail/tests/test_page_model.py +77 -0
- wagtail/tests/test_page_privacy.py +18 -1
- wagtail/tests/test_rich_text.py +95 -5
- wagtail/tests/test_streamfield.py +43 -0
- wagtail/tests/test_utils.py +8 -2
- wagtail/tests/test_views.py +52 -1
- wagtail/tests/test_whitelist.py +7 -7
- wagtail/users/forms.py +3 -1
- wagtail/users/locale/en/LC_MESSAGES/django.po +124 -96
- wagtail/users/locale/fr/LC_MESSAGES/django.po +2 -2
- wagtail/users/locale/he_IL/LC_MESSAGES/django.mo +0 -0
- wagtail/users/locale/he_IL/LC_MESSAGES/django.po +2 -2
- wagtail/users/locale/hr_HR/LC_MESSAGES/django.mo +0 -0
- wagtail/users/locale/hr_HR/LC_MESSAGES/django.po +13 -2
- wagtail/users/migrations/0013_userprofile_density.py +23 -0
- wagtail/users/models.py +14 -3
- wagtail/users/templates/wagtailusers/groups/create.html +1 -7
- wagtail/users/templates/wagtailusers/groups/edit.html +1 -13
- wagtail/users/templates/wagtailusers/groups/includes/formatted_permissions.html +46 -2
- wagtail/users/templates/wagtailusers/groups/includes/group_form_js.html +0 -3
- wagtail/users/templates/wagtailusers/users/create.html +1 -14
- wagtail/users/templates/wagtailusers/users/edit.html +1 -14
- wagtail/users/templates/wagtailusers/users/index.html +2 -5
- wagtail/users/templates/wagtailusers/users/index_results.html +3 -13
- wagtail/users/templates/wagtailusers/users/user_cell.html +9 -0
- wagtail/users/templatetags/wagtailusers_tags.py +107 -20
- wagtail/users/tests/test_admin_views.py +669 -90
- wagtail/users/views/groups.py +58 -61
- wagtail/users/views/users.py +211 -92
- wagtail/users/wagtail_hooks.py +6 -38
- wagtail/users/widgets.py +3 -5
- wagtail/utils/text.py +1 -1
- wagtail/views.py +5 -9
- wagtail/whitelist.py +1 -1
- {wagtail-6.0.1.dist-info → wagtail-6.1rc1.dist-info}/METADATA +5 -6
- {wagtail-6.0.1.dist-info → wagtail-6.1rc1.dist-info}/RECORD +496 -477
- wagtail/admin/static/wagtailadmin/js/page-editor.js +0 -1
- wagtail/admin/static/wagtailadmin/js/vendor/mousetrap.min.js +0 -1
- wagtail/admin/static/wagtailadmin/js/vendor/urlify.js +0 -1
- wagtail/admin/static/wagtailadmin/js/vendor/xregexp.min.js +0 -1
- wagtail/admin/templates/wagtailadmin/collections/index.html +0 -34
- wagtail/admin/templates/wagtailadmin/pages/revisions/_actions.html +0 -22
- wagtail/admin/templates/wagtailadmin/shared/page_breadcrumbs.html +0 -55
- wagtail/admin/tests/pages/test_dashboard.py +0 -172
- wagtail/contrib/redirects/templates/wagtailredirects/results.html +0 -23
- wagtail/documents/templates/wagtaildocs/documents/list.html +0 -2
- wagtail/search/tests/test_postgres_stemming.py +0 -40
- wagtail/sites/templates/wagtailsites/create.html +0 -7
- wagtail/sites/templates/wagtailsites/edit.html +0 -7
- wagtail/snippets/templates/wagtailsnippets/snippets/revisions/_actions.html +0 -36
- wagtail/users/templates/wagtailusers/users/list.html +0 -62
- wagtail/users/urls/users.py +0 -12
- {wagtail-6.0.1.dist-info → wagtail-6.1rc1.dist-info}/LICENSE +0 -0
- {wagtail-6.0.1.dist-info → wagtail-6.1rc1.dist-info}/WHEEL +0 -0
- {wagtail-6.0.1.dist-info → wagtail-6.1rc1.dist-info}/entry_points.txt +0 -0
- {wagtail-6.0.1.dist-info → wagtail-6.1rc1.dist-info}/top_level.txt +0 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
from django.contrib.auth.models import Group
|
|
2
|
-
from django.test import TestCase
|
|
2
|
+
from django.test import TestCase, override_settings
|
|
3
3
|
|
|
4
4
|
from wagtail.models import Page, PageViewRestriction
|
|
5
5
|
from wagtail.test.utils import WagtailTestUtils
|
|
@@ -79,6 +79,23 @@ class TestPagePrivacy(WagtailTestUtils, TestCase):
|
|
|
79
79
|
)
|
|
80
80
|
self.assertRedirects(response, "/")
|
|
81
81
|
|
|
82
|
+
@override_settings(
|
|
83
|
+
WAGTAIL_PASSWORD_REQUIRED_TEMPLATE="tests/custom_page_password_required.html"
|
|
84
|
+
)
|
|
85
|
+
def test_anonymous_user_must_authenticate_with_custom_password_required_template(
|
|
86
|
+
self
|
|
87
|
+
):
|
|
88
|
+
response = self.client.get("/secret-plans/")
|
|
89
|
+
|
|
90
|
+
self.assertNotEqual(
|
|
91
|
+
"wagtailcore/password_required.html",
|
|
92
|
+
response.templates[0].name,
|
|
93
|
+
)
|
|
94
|
+
self.assertEqual(
|
|
95
|
+
"tests/custom_page_password_required.html",
|
|
96
|
+
response.templates[0].name,
|
|
97
|
+
)
|
|
98
|
+
|
|
82
99
|
def test_view_restrictions_apply_to_subpages(self):
|
|
83
100
|
underpants_page = Page.objects.get(
|
|
84
101
|
url_path="/home/secret-plans/steal-underpants/"
|
wagtail/tests/test_rich_text.py
CHANGED
|
@@ -5,7 +5,7 @@ from django.test import TestCase, override_settings
|
|
|
5
5
|
from django.utils import translation
|
|
6
6
|
|
|
7
7
|
from wagtail.fields import RichTextField
|
|
8
|
-
from wagtail.models import Locale, Page
|
|
8
|
+
from wagtail.models import Locale, Page, Site
|
|
9
9
|
from wagtail.rich_text import RichText, RichTextMaxLengthValidator, expand_db_html
|
|
10
10
|
from wagtail.rich_text.feature_registry import FeatureRegistry
|
|
11
11
|
from wagtail.rich_text.pages import PageLinkHandler
|
|
@@ -82,16 +82,34 @@ class TestExtractAttrs(TestCase):
|
|
|
82
82
|
|
|
83
83
|
|
|
84
84
|
class TestExpandDbHtml(TestCase):
|
|
85
|
-
|
|
86
|
-
html = '<a id="1" linktype="document">foo</a>'
|
|
87
|
-
result = expand_db_html(html)
|
|
88
|
-
self.assertEqual(result, "<a>foo</a>")
|
|
85
|
+
fixtures = ["test.json"]
|
|
89
86
|
|
|
90
87
|
def test_expand_db_html_no_linktype(self):
|
|
91
88
|
html = '<a id="1">foo</a>'
|
|
92
89
|
result = expand_db_html(html)
|
|
93
90
|
self.assertEqual(result, '<a id="1">foo</a>')
|
|
94
91
|
|
|
92
|
+
def test_invalid_linktype_set_to_empty_link(self):
|
|
93
|
+
html = '<a id="1" linktype="invalid">foo</a>'
|
|
94
|
+
result = expand_db_html(html)
|
|
95
|
+
self.assertEqual(result, "<a>foo</a>")
|
|
96
|
+
|
|
97
|
+
def test_valid_linktype_and_reference(self):
|
|
98
|
+
html = '<a id="1" linktype="document">foo</a>'
|
|
99
|
+
result = expand_db_html(html)
|
|
100
|
+
self.assertEqual(result, '<a href="/documents/1/test.pdf">foo</a>')
|
|
101
|
+
|
|
102
|
+
def test_valid_linktype_invalid_reference_set_to_empty_link(self):
|
|
103
|
+
html = '<a id="9999" linktype="document">foo</a>'
|
|
104
|
+
result = expand_db_html(html)
|
|
105
|
+
self.assertEqual(result, "<a>foo</a>")
|
|
106
|
+
|
|
107
|
+
def test_no_embedtype_remove_tag(self):
|
|
108
|
+
self.assertEqual(expand_db_html('<embed id="1" />'), "")
|
|
109
|
+
|
|
110
|
+
def test_invalid_embedtype_remove_tag(self):
|
|
111
|
+
self.assertEqual(expand_db_html('<embed id="1" embedtype="invalid" />'), "")
|
|
112
|
+
|
|
95
113
|
@patch("wagtail.embeds.embeds.get_embed")
|
|
96
114
|
def test_expand_db_html_with_embed(self, get_embed):
|
|
97
115
|
from wagtail.embeds.models import Embed
|
|
@@ -101,6 +119,78 @@ class TestExpandDbHtml(TestCase):
|
|
|
101
119
|
result = expand_db_html(html)
|
|
102
120
|
self.assertIn("test html", result)
|
|
103
121
|
|
|
122
|
+
# Override CACHES so we don't generate any cache-related SQL queries
|
|
123
|
+
# for page site root paths (tests use DatabaseCache otherwise).
|
|
124
|
+
@override_settings(
|
|
125
|
+
CACHES={
|
|
126
|
+
"default": {
|
|
127
|
+
"BACKEND": "django.core.cache.backends.locmem.LocMemCache",
|
|
128
|
+
},
|
|
129
|
+
}
|
|
130
|
+
)
|
|
131
|
+
def test_expand_db_html_database_queries_pages(self):
|
|
132
|
+
Site.clear_site_root_paths_cache()
|
|
133
|
+
|
|
134
|
+
with self.assertNumQueries(5):
|
|
135
|
+
expand_db_html(
|
|
136
|
+
"""
|
|
137
|
+
This rich text has 8 page links, and this test verifies that the code uses the
|
|
138
|
+
minimal number of database queries (5) to expand them.
|
|
139
|
+
|
|
140
|
+
All of these pages should be retrieved with 4 queries, one to do the base
|
|
141
|
+
Page table lookup and then 1 each for the EventIndex, EventPage, and
|
|
142
|
+
SimplePage tables.
|
|
143
|
+
|
|
144
|
+
<a linktype="page" id="3">This links to an EventIndex page.</a>
|
|
145
|
+
<a linktype="page" id="4">This links to an EventPage page.</a>
|
|
146
|
+
<a linktype="page" id="5">This links to an EventPage page.</a>
|
|
147
|
+
<a linktype="page" id="6">This links to an EventPage page.</a>
|
|
148
|
+
<a linktype="page" id="9">This links to an EventPage page.</a>
|
|
149
|
+
<a linktype="page" id="12">This links to an EventPage page.</a>
|
|
150
|
+
<a linktype="page" id="7">This links to a SimplePage page.</a>
|
|
151
|
+
<a linktype="page" id="11">This links to a SimplePage page.</a>
|
|
152
|
+
|
|
153
|
+
Finally there's one additional query needed to do the Site root paths lookup.
|
|
154
|
+
"""
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
def test_expand_db_html_database_queries_documents(self):
|
|
158
|
+
with self.assertNumQueries(1):
|
|
159
|
+
expand_db_html(
|
|
160
|
+
html="""
|
|
161
|
+
This rich text has 2 document links, and this test verifies that the code uses
|
|
162
|
+
the minimal number of database queries (1) to expand them.
|
|
163
|
+
|
|
164
|
+
Both of these documents should be retrieved with 1 query:
|
|
165
|
+
|
|
166
|
+
<a linktype="document" id="1">This links to a document.</a>
|
|
167
|
+
<a linktype="document" id="2">This links to another document.</a>
|
|
168
|
+
"""
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
# Disable rendition cache that might be populated by other tests.
|
|
172
|
+
@override_settings(
|
|
173
|
+
CACHES={
|
|
174
|
+
"renditions": {
|
|
175
|
+
"BACKEND": "django.core.cache.backends.dummy.DummyCache",
|
|
176
|
+
},
|
|
177
|
+
}
|
|
178
|
+
)
|
|
179
|
+
def test_expand_db_html_database_queries_images(self):
|
|
180
|
+
with self.assertNumQueries(3):
|
|
181
|
+
expand_db_html(
|
|
182
|
+
"""
|
|
183
|
+
This rich text has 2 image links, and this test verifies that the code uses the
|
|
184
|
+
minimal number of database queries (3) to expand them.
|
|
185
|
+
|
|
186
|
+
Both of these images should be retrieved with 3 queries, one to fetch the
|
|
187
|
+
image objects in bulk and then one per image to fetch their renditions:
|
|
188
|
+
|
|
189
|
+
This is an image: <embed embedtype="image" id="1" format="left" />
|
|
190
|
+
This is another image: <embed embedtype="image" id="2" format="left" />
|
|
191
|
+
"""
|
|
192
|
+
)
|
|
193
|
+
|
|
104
194
|
|
|
105
195
|
class TestRichTextValue(TestCase):
|
|
106
196
|
fixtures = ["test.json"]
|
|
@@ -16,6 +16,7 @@ from wagtail.models import Page
|
|
|
16
16
|
from wagtail.rich_text import RichText
|
|
17
17
|
from wagtail.signal_handlers import disable_reference_index_auto_update
|
|
18
18
|
from wagtail.test.testapp.models import (
|
|
19
|
+
ComplexDefaultStreamPage,
|
|
19
20
|
JSONBlockCountsStreamModel,
|
|
20
21
|
JSONMinMaxCountStreamModel,
|
|
21
22
|
JSONStreamModel,
|
|
@@ -236,6 +237,48 @@ class TestStreamValueAccess(TestCase):
|
|
|
236
237
|
self.assertEqual(fetched_body[1].block_type, "text")
|
|
237
238
|
self.assertEqual(fetched_body[1].value, "bar")
|
|
238
239
|
|
|
240
|
+
def test_complex_assignment(self):
|
|
241
|
+
page = StreamPage(title="Test page", body=[])
|
|
242
|
+
page.body = [
|
|
243
|
+
("rich_text", "<h2>hello world</h2>"),
|
|
244
|
+
(
|
|
245
|
+
"books",
|
|
246
|
+
[
|
|
247
|
+
("title", "Great Expectations"),
|
|
248
|
+
("author", "Charles Dickens"),
|
|
249
|
+
],
|
|
250
|
+
),
|
|
251
|
+
]
|
|
252
|
+
self.assertEqual(page.body[0].block_type, "rich_text")
|
|
253
|
+
self.assertIsInstance(page.body[0].value, RichText)
|
|
254
|
+
self.assertEqual(page.body[0].value.source, "<h2>hello world</h2>")
|
|
255
|
+
self.assertEqual(page.body[1].block_type, "books")
|
|
256
|
+
self.assertIsInstance(page.body[1].value, StreamValue)
|
|
257
|
+
self.assertEqual(len(page.body[1].value), 2)
|
|
258
|
+
self.assertEqual(page.body[1].value[0].block_type, "title")
|
|
259
|
+
self.assertEqual(page.body[1].value[0].value, "Great Expectations")
|
|
260
|
+
self.assertEqual(page.body[1].value[1].block_type, "author")
|
|
261
|
+
self.assertEqual(page.body[1].value[1].value, "Charles Dickens")
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
class TestComplexDefault(TestCase):
|
|
265
|
+
def setUp(self):
|
|
266
|
+
self.page = ComplexDefaultStreamPage(title="Test page")
|
|
267
|
+
|
|
268
|
+
def test_default_value(self):
|
|
269
|
+
self.assertEqual(self.page.body[0].block_type, "rich_text")
|
|
270
|
+
self.assertIsInstance(self.page.body[0].value, RichText)
|
|
271
|
+
self.assertEqual(
|
|
272
|
+
self.page.body[0].value.source, "<p>My <i>lovely</i> books</p>"
|
|
273
|
+
)
|
|
274
|
+
self.assertEqual(self.page.body[1].block_type, "books")
|
|
275
|
+
self.assertIsInstance(self.page.body[1].value, StreamValue)
|
|
276
|
+
self.assertEqual(len(self.page.body[1].value), 2)
|
|
277
|
+
self.assertEqual(self.page.body[1].value[0].block_type, "title")
|
|
278
|
+
self.assertEqual(self.page.body[1].value[0].value, "The Great Gatsby")
|
|
279
|
+
self.assertEqual(self.page.body[1].value[1].block_type, "author")
|
|
280
|
+
self.assertEqual(self.page.body[1].value[1].value, "F. Scott Fitzgerald")
|
|
281
|
+
|
|
239
282
|
|
|
240
283
|
class TestStreamFieldRenderingBase(TestCase):
|
|
241
284
|
model = JSONStreamModel
|
wagtail/tests/test_utils.py
CHANGED
|
@@ -178,14 +178,14 @@ class TestInvokeViaAttributeShortcut(SimpleTestCase):
|
|
|
178
178
|
pickled = pickle.dumps(self.test_object, -1)
|
|
179
179
|
except Exception as e: # noqa: BLE001
|
|
180
180
|
raise AssertionError(
|
|
181
|
-
"An error
|
|
181
|
+
"An error occurred when attempting to pickle %r: %s"
|
|
182
182
|
% (self.test_object, e)
|
|
183
183
|
)
|
|
184
184
|
try:
|
|
185
185
|
self.test_object = pickle.loads(pickled)
|
|
186
186
|
except Exception as e: # noqa: BLE001
|
|
187
187
|
raise AssertionError(
|
|
188
|
-
"An error
|
|
188
|
+
"An error occurred when attempting to unpickle %r: %s"
|
|
189
189
|
% (self.test_object, e)
|
|
190
190
|
)
|
|
191
191
|
|
|
@@ -479,6 +479,12 @@ class TestGetDummyRequest(TestCase):
|
|
|
479
479
|
request = get_dummy_request(site=site)
|
|
480
480
|
self.assertEqual(request.get_host(), "other.example.com:8888")
|
|
481
481
|
|
|
482
|
+
def test_server_name_for_wildcard_allowed_hosts(self):
|
|
483
|
+
# Django's test runner adds "testserver" at the end of ALLOWED_HOSTS.
|
|
484
|
+
with self.settings(ALLOWED_HOSTS=["*", "testserver"]):
|
|
485
|
+
request = get_dummy_request()
|
|
486
|
+
self.assertEqual(request.get_host(), "example.com")
|
|
487
|
+
|
|
482
488
|
|
|
483
489
|
class TestDeepUpdate(TestCase):
|
|
484
490
|
def test_deep_update(self):
|
wagtail/tests/test_views.py
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
|
+
from unittest import mock
|
|
2
|
+
|
|
1
3
|
from django.test import TestCase
|
|
2
4
|
from django.urls import reverse
|
|
3
5
|
|
|
4
|
-
from wagtail.
|
|
6
|
+
from wagtail.coreutils import get_dummy_request
|
|
7
|
+
from wagtail.models import Page, Site
|
|
8
|
+
from wagtail.test.testapp.models import SimplePage
|
|
5
9
|
from wagtail.test.utils import WagtailTestUtils
|
|
10
|
+
from wagtail.views import serve
|
|
6
11
|
|
|
7
12
|
|
|
8
13
|
class TestLoginView(WagtailTestUtils, TestCase):
|
|
@@ -47,3 +52,49 @@ class TestLoginView(WagtailTestUtils, TestCase):
|
|
|
47
52
|
},
|
|
48
53
|
)
|
|
49
54
|
self.assertRedirects(response, self.events_index.url)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
@mock.patch("wagtail.hooks.get_hooks", mock.Mock(return_value=[]))
|
|
58
|
+
class TestServeView(TestCase):
|
|
59
|
+
fixtures = ["test.json"]
|
|
60
|
+
|
|
61
|
+
def test_serve_query_count(self):
|
|
62
|
+
request = get_dummy_request()
|
|
63
|
+
Site.find_for_request(request)
|
|
64
|
+
page, args, kwargs = Page.route_for_request(request, request.path)
|
|
65
|
+
with mock.patch.object(page, "serve", wraps=page.serve) as m:
|
|
66
|
+
with self.assertNumQueries(0):
|
|
67
|
+
serve(request, "/")
|
|
68
|
+
m.assert_called_once_with(request, *args, **kwargs)
|
|
69
|
+
|
|
70
|
+
def test_process_view_by_page_query_count(self):
|
|
71
|
+
expected_query_count = 3
|
|
72
|
+
site = Site.objects.get()
|
|
73
|
+
page = site.root_page.add_child(
|
|
74
|
+
instance=SimplePage(title="Simple page", slug="simple", content="Simple")
|
|
75
|
+
)
|
|
76
|
+
with mock.patch.object(
|
|
77
|
+
Page, "route_for_request", wraps=Page.route_for_request
|
|
78
|
+
) as m:
|
|
79
|
+
with self.modify_settings(
|
|
80
|
+
MIDDLEWARE={
|
|
81
|
+
"prepend": "wagtail.test.middleware.SimplePageViewInterceptorMiddleware"
|
|
82
|
+
}
|
|
83
|
+
):
|
|
84
|
+
with self.assertNumQueries(expected_query_count):
|
|
85
|
+
response_a = self.client.get("/simple/")
|
|
86
|
+
self.assertEqual(
|
|
87
|
+
response_a.content,
|
|
88
|
+
b'\n\n\n\n<!DOCTYPE HTML>\n<html lang="en" dir="ltr">\n <head>\n <title>Simple page</title>\n </head>\n <body>\n \n <h1>Simple page</h1>\n \n <h2>Simple page</h2>\n\n </body>\n</html>\n',
|
|
89
|
+
)
|
|
90
|
+
self.assertEqual(m.call_count, 2)
|
|
91
|
+
page.content = "Intercept me"
|
|
92
|
+
page.save_revision().publish()
|
|
93
|
+
m.reset_mock()
|
|
94
|
+
with self.assertNumQueries(expected_query_count):
|
|
95
|
+
# verify the same number of queries are used when the
|
|
96
|
+
# middleware activates to demonstrate Page.route_for_request()
|
|
97
|
+
# prevents extra database queries for serving pages
|
|
98
|
+
response_b = self.client.get("/simple/")
|
|
99
|
+
self.assertEqual(response_b.content, b"Intercepted")
|
|
100
|
+
self.assertEqual(m.call_count, 1)
|
wagtail/tests/test_whitelist.py
CHANGED
|
@@ -28,7 +28,7 @@ class TestCheckUrl(TestCase):
|
|
|
28
28
|
|
|
29
29
|
class TestAttributeRule(WagtailTestUtils, TestCase):
|
|
30
30
|
def setUp(self):
|
|
31
|
-
self.soup = self.get_soup('<b foo="bar">baz</b>'
|
|
31
|
+
self.soup = self.get_soup('<b foo="bar">baz</b>')
|
|
32
32
|
|
|
33
33
|
def test_no_rule_for_attr(self):
|
|
34
34
|
"""
|
|
@@ -88,7 +88,7 @@ class TestAttributeRule(WagtailTestUtils, TestCase):
|
|
|
88
88
|
attributes.
|
|
89
89
|
"""
|
|
90
90
|
soup = self.get_soup(
|
|
91
|
-
'<b foo="bar" baz="quux" snowman="barbecue"></b>',
|
|
91
|
+
'<b foo="bar" baz="quux" snowman="barbecue"></b>',
|
|
92
92
|
)
|
|
93
93
|
tag = soup.b
|
|
94
94
|
allow_without_attributes(tag)
|
|
@@ -103,7 +103,7 @@ class TestWhitelister(WagtailTestUtils, TestCase):
|
|
|
103
103
|
"""
|
|
104
104
|
Unknown node should remove a node from the parent document
|
|
105
105
|
"""
|
|
106
|
-
soup = self.get_soup("<foo><bar>baz</bar>quux</foo>"
|
|
106
|
+
soup = self.get_soup("<foo><bar>baz</bar>quux</foo>")
|
|
107
107
|
tag = soup.foo
|
|
108
108
|
self.whitelister.clean_unknown_node("", soup.bar)
|
|
109
109
|
self.assertEqual(str(tag), "<foo>quux</foo>")
|
|
@@ -113,7 +113,7 @@ class TestWhitelister(WagtailTestUtils, TestCase):
|
|
|
113
113
|
<b> tags are allowed without attributes. This remains true
|
|
114
114
|
when tags are nested.
|
|
115
115
|
"""
|
|
116
|
-
soup = self.get_soup('<b><b class="delete me">foo</b></b>'
|
|
116
|
+
soup = self.get_soup('<b><b class="delete me">foo</b></b>')
|
|
117
117
|
tag = soup.b
|
|
118
118
|
self.whitelister.clean_tag_node(tag, tag)
|
|
119
119
|
self.assertEqual(str(tag), "<b><b>foo</b></b>")
|
|
@@ -122,19 +122,19 @@ class TestWhitelister(WagtailTestUtils, TestCase):
|
|
|
122
122
|
"""
|
|
123
123
|
<foo> tags should be removed, even when nested.
|
|
124
124
|
"""
|
|
125
|
-
soup = self.get_soup("<b><foo>bar</foo></b>"
|
|
125
|
+
soup = self.get_soup("<b><foo>bar</foo></b>")
|
|
126
126
|
tag = soup.b
|
|
127
127
|
self.whitelister.clean_tag_node(tag, tag)
|
|
128
128
|
self.assertEqual(str(tag), "<b>bar</b>")
|
|
129
129
|
|
|
130
130
|
def test_clean_string_node_does_nothing(self):
|
|
131
|
-
soup = self.get_soup("<b>bar</b>"
|
|
131
|
+
soup = self.get_soup("<b>bar</b>")
|
|
132
132
|
string = soup.b.string
|
|
133
133
|
self.whitelister.clean_string_node(string, string)
|
|
134
134
|
self.assertEqual(str(string), "bar")
|
|
135
135
|
|
|
136
136
|
def test_clean_node_does_not_change_navigable_strings(self):
|
|
137
|
-
soup = self.get_soup("<b>bar</b>"
|
|
137
|
+
soup = self.get_soup("<b>bar</b>")
|
|
138
138
|
string = soup.b.string
|
|
139
139
|
self.whitelister.clean_node(string, string)
|
|
140
140
|
self.assertEqual(str(string), "bar")
|
wagtail/users/forms.py
CHANGED
|
@@ -297,7 +297,9 @@ class PagePermissionsForm(forms.Form):
|
|
|
297
297
|
content_type__app_label="wagtailcore",
|
|
298
298
|
content_type__model="page",
|
|
299
299
|
codename__in=PAGE_PERMISSION_CODENAMES,
|
|
300
|
-
)
|
|
300
|
+
)
|
|
301
|
+
.select_related("content_type")
|
|
302
|
+
.order_by("codename"),
|
|
301
303
|
# Use codename as the field to use for the option values rather than pk,
|
|
302
304
|
# to minimise the changes needed since we moved to the Permission model
|
|
303
305
|
# and to ease testing.
|