wagtail 6.0.2__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/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/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/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/base.html +1 -0
- wagtail/admin/templates/wagtailadmin/collection_privacy/set_privacy.html +3 -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 +3 -2
- wagtail/admin/templates/wagtailadmin/generic/history/action_cell.html +27 -0
- wagtail/admin/templates/wagtailadmin/home/workflow_objects_to_moderate.html +3 -3
- 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 -14
- 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 -3
- 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/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 +126 -29
- 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 +31 -4
- wagtail/admin/views/generic/history.py +220 -51
- wagtail/admin/views/generic/mixins.py +7 -4
- wagtail/admin/views/generic/models.py +54 -38
- 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 -9
- 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/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/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/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/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/table_block/blocks.py +1 -1
- wagtail/contrib/table_block/locale/en/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/table_block/static/table_block/js/table.js +1 -1
- wagtail/contrib/typed_table_block/locale/en/LC_MESSAGES/django.po +1 -1
- 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/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/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/en/LC_MESSAGES/django.po +33 -45
- 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/locales/locale/en/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/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 +5 -6
- wagtail/snippets/locale/en/LC_MESSAGES/django.po +16 -56
- 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 +1 -1
- wagtail/snippets/templates/wagtailsnippets/snippets/edit.html +1 -1
- wagtail/snippets/tests/test_preview.py +13 -2
- wagtail/snippets/tests/test_snippets.py +41 -16
- wagtail/snippets/tests/test_viewset.py +63 -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/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 -2
- wagtail/users/templates/wagtailusers/users/create.html +1 -9
- wagtail/users/templates/wagtailusers/users/edit.html +1 -9
- 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.2.dist-info → wagtail-6.1rc1.dist-info}/METADATA +4 -5
- {wagtail-6.0.2.dist-info → wagtail-6.1rc1.dist-info}/RECORD +339 -320
- 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 -6
- wagtail/sites/templates/wagtailsites/edit.html +0 -6
- 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.2.dist-info → wagtail-6.1rc1.dist-info}/LICENSE +0 -0
- {wagtail-6.0.2.dist-info → wagtail-6.1rc1.dist-info}/WHEEL +0 -0
- {wagtail-6.0.2.dist-info → wagtail-6.1rc1.dist-info}/entry_points.txt +0 -0
- {wagtail-6.0.2.dist-info → wagtail-6.1rc1.dist-info}/top_level.txt +0 -0
wagtail/rich_text/pages.py
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
from typing import List
|
|
2
|
+
|
|
3
|
+
from django.db.models import Model
|
|
1
4
|
from django.utils.html import escape
|
|
2
5
|
|
|
3
6
|
from wagtail.models import Page
|
|
@@ -12,16 +15,24 @@ class PageLinkHandler(LinkHandler):
|
|
|
12
15
|
return Page
|
|
13
16
|
|
|
14
17
|
@classmethod
|
|
15
|
-
def
|
|
16
|
-
|
|
18
|
+
def get_many(cls, attrs_list: List[dict]) -> List[Model]:
|
|
19
|
+
# Override LinkHandler.get_many to reduce database queries through the
|
|
20
|
+
# use of PageQuerySet.specific() instead of QuerySet.in_bulk().
|
|
21
|
+
instance_ids = [attrs.get("id") for attrs in attrs_list]
|
|
22
|
+
qs = Page.objects.filter(id__in=instance_ids).defer_streamfields().specific()
|
|
23
|
+
pages_by_str_id = {str(page.id): page for page in qs}
|
|
24
|
+
return [pages_by_str_id.get(str(id_)) for id_ in instance_ids]
|
|
25
|
+
|
|
26
|
+
@classmethod
|
|
27
|
+
def expand_db_attributes(cls, attrs: dict) -> str:
|
|
28
|
+
return cls.expand_db_attributes_many([attrs])[0]
|
|
17
29
|
|
|
18
30
|
@classmethod
|
|
19
|
-
def
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
return "<a>"
|
|
31
|
+
def expand_db_attributes_many(cls, attrs_list: List[dict]) -> List[str]:
|
|
32
|
+
return [
|
|
33
|
+
'<a href="%s">' % escape(page.localized.url) if page else "<a>"
|
|
34
|
+
for page in cls.get_many(attrs_list)
|
|
35
|
+
]
|
|
25
36
|
|
|
26
37
|
@classmethod
|
|
27
38
|
def extract_references(self, attrs):
|
wagtail/rich_text/rewriters.py
CHANGED
|
@@ -3,13 +3,16 @@ Utility classes for rewriting elements of HTML-like strings
|
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
5
|
import re
|
|
6
|
+
from collections import defaultdict
|
|
7
|
+
from itertools import chain
|
|
8
|
+
from typing import Callable, Tuple
|
|
6
9
|
|
|
7
10
|
FIND_A_TAG = re.compile(r"<a(\b[^>]*)>")
|
|
8
11
|
FIND_EMBED_TAG = re.compile(r"<embed(\b[^>]*)/>")
|
|
9
12
|
FIND_ATTRS = re.compile(r'([\w-]+)\="([^"]*)"')
|
|
10
13
|
|
|
11
14
|
|
|
12
|
-
def extract_attrs(attr_string):
|
|
15
|
+
def extract_attrs(attr_string: str) -> dict:
|
|
13
16
|
"""
|
|
14
17
|
helper method to extract tag attributes, as a dict of un-escaped strings
|
|
15
18
|
"""
|
|
@@ -25,101 +28,170 @@ def extract_attrs(attr_string):
|
|
|
25
28
|
return attributes
|
|
26
29
|
|
|
27
30
|
|
|
28
|
-
class
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
returns the HTML fragment.
|
|
33
|
-
"""
|
|
34
|
-
|
|
35
|
-
def __init__(self, embed_rules, reference_extractors=None):
|
|
36
|
-
self.embed_rules = embed_rules
|
|
31
|
+
class TagRewriter:
|
|
32
|
+
def __init__(self, rules=None, bulk_rules=None, reference_extractors=None):
|
|
33
|
+
self.rules = rules or {}
|
|
34
|
+
self.bulk_rules = bulk_rules or {}
|
|
37
35
|
self.reference_extractors = reference_extractors or {}
|
|
38
36
|
|
|
39
|
-
def
|
|
40
|
-
|
|
41
|
-
try:
|
|
42
|
-
rule = self.embed_rules[attrs["embedtype"]]
|
|
43
|
-
except KeyError:
|
|
44
|
-
# silently drop any tags with an unrecognised or missing embedtype attribute
|
|
45
|
-
return ""
|
|
46
|
-
return rule(attrs)
|
|
37
|
+
def get_opening_tag_regex(self):
|
|
38
|
+
raise NotImplementedError
|
|
47
39
|
|
|
48
|
-
def
|
|
49
|
-
|
|
40
|
+
def get_tag_type_from_attrs(self, attrs):
|
|
41
|
+
raise NotImplementedError
|
|
42
|
+
|
|
43
|
+
def get_tag_replacements(self, tag_type, attrs_list):
|
|
44
|
+
# Note: return an empty list for cases when you don't want any replacements made
|
|
45
|
+
raise NotImplementedError
|
|
46
|
+
|
|
47
|
+
def __call__(self, html: str) -> str:
|
|
48
|
+
matches_by_tag_type, attrs_by_tag_type = self.extract_tags(html)
|
|
49
|
+
|
|
50
|
+
replacements = [
|
|
51
|
+
self.get_tag_replacements(tag_type, attrs_list)
|
|
52
|
+
for tag_type, attrs_list in attrs_by_tag_type.items()
|
|
53
|
+
]
|
|
54
|
+
|
|
55
|
+
offset = 0
|
|
56
|
+
for match, replacement in zip(
|
|
57
|
+
chain(*matches_by_tag_type.values()), chain(*replacements)
|
|
58
|
+
):
|
|
59
|
+
html = (
|
|
60
|
+
html[: match.start() + offset]
|
|
61
|
+
+ replacement
|
|
62
|
+
+ html[match.end() + offset :]
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
offset += len(replacement) - match.end() + match.start()
|
|
66
|
+
|
|
67
|
+
return html
|
|
68
|
+
|
|
69
|
+
def extract_tags(self, html: str) -> Tuple[dict, dict]:
|
|
70
|
+
"""Helper method to extract and group HTML tags and their attributes.
|
|
71
|
+
|
|
72
|
+
Returns the full list of regex matches grouped by tag type as well as
|
|
73
|
+
the tag attribute dictionaries grouped by tag type.
|
|
74
|
+
"""
|
|
75
|
+
matches_by_tag_type = defaultdict(list)
|
|
76
|
+
attrs_by_tag_type = defaultdict(list)
|
|
77
|
+
|
|
78
|
+
# Regex used to match <tag ...> tags in the HTML.
|
|
79
|
+
re_pattern = self.get_opening_tag_regex()
|
|
80
|
+
|
|
81
|
+
for match in re_pattern.finditer(html):
|
|
82
|
+
attrs = extract_attrs(match.group(1))
|
|
83
|
+
tag_type = self.get_tag_type_from_attrs(attrs)
|
|
84
|
+
|
|
85
|
+
matches_by_tag_type[tag_type].append(match)
|
|
86
|
+
attrs_by_tag_type[tag_type].append(attrs)
|
|
87
|
+
|
|
88
|
+
return matches_by_tag_type, attrs_by_tag_type
|
|
89
|
+
|
|
90
|
+
def convert_rule_to_bulk_rule(self, rule: Callable) -> Callable:
|
|
91
|
+
def bulk_rule(args):
|
|
92
|
+
return list(map(rule, args))
|
|
93
|
+
|
|
94
|
+
return bulk_rule
|
|
50
95
|
|
|
51
96
|
def extract_references(self, html):
|
|
52
|
-
|
|
97
|
+
re_pattern = self.get_opening_tag_regex()
|
|
98
|
+
for match in re_pattern.findall(html):
|
|
53
99
|
attrs = extract_attrs(match)
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
):
|
|
100
|
+
tag_type = self.get_tag_type_from_attrs(attrs)
|
|
101
|
+
|
|
102
|
+
if tag_type not in self.reference_extractors:
|
|
58
103
|
continue
|
|
59
104
|
|
|
60
|
-
yield from self.reference_extractors[
|
|
105
|
+
yield from self.reference_extractors[tag_type](attrs)
|
|
106
|
+
|
|
107
|
+
return []
|
|
61
108
|
|
|
62
109
|
|
|
63
|
-
class
|
|
110
|
+
class EmbedRewriter(TagRewriter):
|
|
64
111
|
"""
|
|
65
|
-
Rewrites <
|
|
66
|
-
rule for 'foo'. Each
|
|
67
|
-
|
|
112
|
+
Rewrites <embed embedtype="foo" /> tags within rich text into the HTML
|
|
113
|
+
fragment given by the embed rule for 'foo'. Each embed rule is a function
|
|
114
|
+
that takes a dict of attributes and returns the HTML fragment.
|
|
68
115
|
"""
|
|
69
116
|
|
|
70
|
-
def
|
|
71
|
-
|
|
72
|
-
|
|
117
|
+
def get_opening_tag_regex(self):
|
|
118
|
+
return FIND_EMBED_TAG
|
|
119
|
+
|
|
120
|
+
def get_tag_type_from_attrs(self, attrs):
|
|
121
|
+
return attrs.get("embedtype")
|
|
73
122
|
|
|
74
|
-
def
|
|
75
|
-
attrs = extract_attrs(match.group(1))
|
|
123
|
+
def get_tag_replacements(self, tag_type, attrs_list):
|
|
76
124
|
try:
|
|
77
|
-
|
|
125
|
+
rule = self.bulk_rules[tag_type]
|
|
126
|
+
except KeyError:
|
|
127
|
+
rule = None
|
|
128
|
+
|
|
129
|
+
if not rule:
|
|
130
|
+
try:
|
|
131
|
+
rule = self.rules[tag_type]
|
|
132
|
+
except KeyError:
|
|
133
|
+
pass
|
|
134
|
+
else:
|
|
135
|
+
rule = self.convert_rule_to_bulk_rule(rule)
|
|
136
|
+
|
|
137
|
+
# Silently drop any tags with an unrecognised or missing embedtype attribute.
|
|
138
|
+
return rule(attrs_list) if rule else [""] * len(attrs_list)
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
class LinkRewriter(TagRewriter):
|
|
142
|
+
"""
|
|
143
|
+
Rewrites <a linktype="foo"> tags within rich text into the HTML fragment
|
|
144
|
+
given by the rule for 'foo'. Each link rule is a function that takes a dict
|
|
145
|
+
of attributes and returns the HTML fragment for the opening tag (only).
|
|
146
|
+
"""
|
|
147
|
+
|
|
148
|
+
def get_opening_tag_regex(self):
|
|
149
|
+
return FIND_A_TAG
|
|
150
|
+
|
|
151
|
+
def get_tag_type_from_attrs(self, attrs):
|
|
152
|
+
try:
|
|
153
|
+
return attrs["linktype"]
|
|
78
154
|
except KeyError:
|
|
79
|
-
link_type = None
|
|
80
155
|
href = attrs.get("href", None)
|
|
81
156
|
if href:
|
|
82
157
|
# From href attribute we try to detect only the linktypes that we
|
|
83
158
|
# currently support (`external` & `email`, `page` has a default handler)
|
|
84
159
|
# from the link chooser.
|
|
85
160
|
if href.startswith(("http:", "https:")):
|
|
86
|
-
|
|
161
|
+
return "external"
|
|
87
162
|
elif href.startswith("mailto:"):
|
|
88
|
-
|
|
163
|
+
return "email"
|
|
89
164
|
elif href.startswith("#"):
|
|
90
|
-
|
|
165
|
+
return "anchor"
|
|
91
166
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
167
|
+
def get_tag_replacements(self, tag_type, attrs_list):
|
|
168
|
+
if not tag_type:
|
|
169
|
+
# We want to leave links without a linktype attribute unchanged,
|
|
170
|
+
# for example <a name="important-anchor">, so we return an empty
|
|
171
|
+
# list here so that no tag replacements are made.
|
|
172
|
+
return []
|
|
95
173
|
|
|
96
174
|
try:
|
|
97
|
-
rule = self.
|
|
175
|
+
rule = self.bulk_rules[tag_type]
|
|
98
176
|
except KeyError:
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
):
|
|
118
|
-
continue
|
|
119
|
-
|
|
120
|
-
yield from self.reference_extractors[attrs["linktype"]](attrs)
|
|
121
|
-
|
|
122
|
-
return []
|
|
177
|
+
rule = None
|
|
178
|
+
|
|
179
|
+
if not rule:
|
|
180
|
+
try:
|
|
181
|
+
rule = self.rules[tag_type]
|
|
182
|
+
except KeyError:
|
|
183
|
+
if tag_type in ["email", "external", "anchor"]:
|
|
184
|
+
# We also want to leave links with certain known linktype
|
|
185
|
+
# attributes alone even if there are no richtext rules
|
|
186
|
+
# registered for those types, for example
|
|
187
|
+
# <a href="https://wagtail.org">, so we return an empty
|
|
188
|
+
# list here so that no tag replacements are made.
|
|
189
|
+
return []
|
|
190
|
+
else:
|
|
191
|
+
rule = self.convert_rule_to_bulk_rule(rule)
|
|
192
|
+
|
|
193
|
+
# Replace unrecognised link types with an empty link.
|
|
194
|
+
return rule(attrs_list) if rule else ["<a>"] * len(attrs_list)
|
|
123
195
|
|
|
124
196
|
|
|
125
197
|
class MultiRuleRewriter:
|
|
@@ -276,10 +276,10 @@ class Index:
|
|
|
276
276
|
update_method(content_type_pk, indexers)
|
|
277
277
|
|
|
278
278
|
def delete_item(self, item):
|
|
279
|
-
item.index_entries.using
|
|
279
|
+
item.index_entries.all()._raw_delete(using=self.db_alias)
|
|
280
280
|
|
|
281
281
|
def __str__(self):
|
|
282
|
-
return self.
|
|
282
|
+
return self.name
|
|
283
283
|
|
|
284
284
|
|
|
285
285
|
class MySQLSearchQueryCompiler(BaseSearchQueryCompiler):
|
|
@@ -662,7 +662,7 @@ class MySQLSearchBackend(BaseSearchBackend):
|
|
|
662
662
|
for connection in connections.all()
|
|
663
663
|
if connection.vendor == "mysql"
|
|
664
664
|
]:
|
|
665
|
-
IndexEntry._default_manager.using
|
|
665
|
+
IndexEntry._default_manager.all()._raw_delete(using=connection.alias)
|
|
666
666
|
|
|
667
667
|
def add_type(self, model):
|
|
668
668
|
pass # Not needed.
|
|
@@ -353,7 +353,7 @@ class Index:
|
|
|
353
353
|
update_method(content_type_pk, indexers)
|
|
354
354
|
|
|
355
355
|
def delete_item(self, item):
|
|
356
|
-
item.index_entries.using
|
|
356
|
+
item.index_entries.all()._raw_delete(using=self.db_alias)
|
|
357
357
|
|
|
358
358
|
def __str__(self):
|
|
359
359
|
return self.name
|
|
@@ -434,7 +434,7 @@ class PostgresSearchQueryCompiler(BaseSearchQueryCompiler):
|
|
|
434
434
|
return SearchQuery(lexemes, search_type="raw", config=config)
|
|
435
435
|
|
|
436
436
|
elif isinstance(query, Phrase):
|
|
437
|
-
return SearchQuery(query.query_string, search_type="phrase")
|
|
437
|
+
return SearchQuery(query.query_string, search_type="phrase", config=config)
|
|
438
438
|
|
|
439
439
|
elif isinstance(query, Boost):
|
|
440
440
|
# Not supported
|
|
@@ -762,7 +762,7 @@ class PostgresSearchBackend(BaseSearchBackend):
|
|
|
762
762
|
for connection in connections.all()
|
|
763
763
|
if connection.vendor == "postgresql"
|
|
764
764
|
]:
|
|
765
|
-
IndexEntry._default_manager.using
|
|
765
|
+
IndexEntry._default_manager.all()._raw_delete(using=connection.alias)
|
|
766
766
|
|
|
767
767
|
def add_type(self, model):
|
|
768
768
|
pass # Not needed.
|
|
@@ -270,7 +270,7 @@ class Index:
|
|
|
270
270
|
update_method(content_type_pk, indexers)
|
|
271
271
|
|
|
272
272
|
def delete_item(self, item):
|
|
273
|
-
item.index_entries.using
|
|
273
|
+
item.index_entries.all()._raw_delete(using=self.db_alias)
|
|
274
274
|
|
|
275
275
|
def __str__(self):
|
|
276
276
|
return self.name
|
|
@@ -685,7 +685,7 @@ class SQLiteSearchBackend(BaseSearchBackend):
|
|
|
685
685
|
for connection in connections.all()
|
|
686
686
|
if connection.vendor == "sqlite"
|
|
687
687
|
]:
|
|
688
|
-
IndexEntry._default_manager.using
|
|
688
|
+
IndexEntry._default_manager.all()._raw_delete(using=connection.alias)
|
|
689
689
|
|
|
690
690
|
def add_type(self, model):
|
|
691
691
|
pass # Not needed.
|
|
@@ -52,6 +52,8 @@ class Elasticsearch7Mapping:
|
|
|
52
52
|
|
|
53
53
|
type_map = {
|
|
54
54
|
"AutoField": "integer",
|
|
55
|
+
"SmallAutoField": "integer",
|
|
56
|
+
"BigAutoField": "long",
|
|
55
57
|
"BinaryField": "binary",
|
|
56
58
|
"BooleanField": "boolean",
|
|
57
59
|
"CharField": "string",
|
|
@@ -69,10 +71,12 @@ class Elasticsearch7Mapping:
|
|
|
69
71
|
"NullBooleanField": "boolean",
|
|
70
72
|
"PositiveIntegerField": "integer",
|
|
71
73
|
"PositiveSmallIntegerField": "integer",
|
|
74
|
+
"PositiveBigIntegerField": "long",
|
|
72
75
|
"SlugField": "string",
|
|
73
76
|
"SmallIntegerField": "integer",
|
|
74
77
|
"TextField": "string",
|
|
75
78
|
"TimeField": "date",
|
|
79
|
+
"URLField": "string",
|
|
76
80
|
}
|
|
77
81
|
|
|
78
82
|
keyword_type = "keyword"
|
|
@@ -8,7 +8,7 @@ msgid ""
|
|
|
8
8
|
msgstr ""
|
|
9
9
|
"Project-Id-Version: PACKAGE VERSION\n"
|
|
10
10
|
"Report-Msgid-Bugs-To: \n"
|
|
11
|
-
"POT-Creation-Date: 2024-
|
|
11
|
+
"POT-Creation-Date: 2024-04-18 17:28+0100\n"
|
|
12
12
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
|
13
13
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
|
14
14
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
|
@@ -22,10 +22,10 @@ msgstr ""
|
|
|
22
22
|
msgid "Wagtail search"
|
|
23
23
|
msgstr ""
|
|
24
24
|
|
|
25
|
-
#: models.py:
|
|
25
|
+
#: models.py:65
|
|
26
26
|
msgid "index entry"
|
|
27
27
|
msgstr ""
|
|
28
28
|
|
|
29
|
-
#: models.py:
|
|
29
|
+
#: models.py:66
|
|
30
30
|
msgid "index entries"
|
|
31
31
|
msgstr ""
|
|
@@ -4,6 +4,7 @@ from django.db import connection
|
|
|
4
4
|
from django.test import TestCase
|
|
5
5
|
from django.test.utils import override_settings
|
|
6
6
|
|
|
7
|
+
from wagtail.search.query import Phrase
|
|
7
8
|
from wagtail.search.tests.test_backends import BackendTests
|
|
8
9
|
from wagtail.test.search import models
|
|
9
10
|
|
|
@@ -172,3 +173,52 @@ class TestPostgresSearchBackend(BackendTests, TestCase):
|
|
|
172
173
|
[r.title for r in results],
|
|
173
174
|
["JavaScript: The good parts", "JavaScript: The Definitive Guide"],
|
|
174
175
|
)
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
@unittest.skipUnless(
|
|
179
|
+
connection.vendor == "postgresql", "The current database is not PostgreSQL"
|
|
180
|
+
)
|
|
181
|
+
@override_settings(
|
|
182
|
+
WAGTAILSEARCH_BACKENDS={
|
|
183
|
+
"default": {
|
|
184
|
+
"BACKEND": "wagtail.search.backends.database.postgres.postgres",
|
|
185
|
+
"SEARCH_CONFIG": "dutch",
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
)
|
|
189
|
+
class TestPostgresLanguageTextSearch(TestCase):
|
|
190
|
+
backend_path = "wagtail.search.backends.database.postgres.postgres"
|
|
191
|
+
|
|
192
|
+
def setUp(self):
|
|
193
|
+
# get search backend by backend_path
|
|
194
|
+
BackendTests.setUp(self)
|
|
195
|
+
|
|
196
|
+
book = models.Book.objects.create(
|
|
197
|
+
title="Nu is beter dan nooit",
|
|
198
|
+
publication_date="1999-05-01",
|
|
199
|
+
number_of_pages=333,
|
|
200
|
+
)
|
|
201
|
+
self.backend.add(book)
|
|
202
|
+
self.book = book
|
|
203
|
+
|
|
204
|
+
def test_search_language_plain_text(self):
|
|
205
|
+
results = self.backend.search("Nu is beter dan nooit", models.Book)
|
|
206
|
+
self.assertEqual(list(results), [self.book])
|
|
207
|
+
|
|
208
|
+
results = self.backend.search("is beter", models.Book)
|
|
209
|
+
self.assertEqual(list(results), [self.book])
|
|
210
|
+
|
|
211
|
+
# search deals even with variations
|
|
212
|
+
results = self.backend.search("zijn beter", models.Book)
|
|
213
|
+
self.assertEqual(list(results), [self.book])
|
|
214
|
+
|
|
215
|
+
# search deals even when there are minor typos
|
|
216
|
+
results = self.backend.search("zij beter dan", models.Book)
|
|
217
|
+
self.assertEqual(list(results), [self.book])
|
|
218
|
+
|
|
219
|
+
def test_search_language_phrase_text(self):
|
|
220
|
+
results = self.backend.search(Phrase("Nu is beter"), models.Book)
|
|
221
|
+
self.assertEqual(list(results), [self.book])
|
|
222
|
+
|
|
223
|
+
results = self.backend.search(Phrase("Nu zijn beter"), models.Book)
|
|
224
|
+
self.assertEqual(list(results), [self.book])
|
|
@@ -8,7 +8,7 @@ msgid ""
|
|
|
8
8
|
msgstr ""
|
|
9
9
|
"Project-Id-Version: PACKAGE VERSION\n"
|
|
10
10
|
"Report-Msgid-Bugs-To: \n"
|
|
11
|
-
"POT-Creation-Date: 2024-
|
|
11
|
+
"POT-Creation-Date: 2024-04-18 17:28+0100\n"
|
|
12
12
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
|
13
13
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
|
14
14
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
|
@@ -50,33 +50,33 @@ msgstr ""
|
|
|
50
50
|
msgid "Default"
|
|
51
51
|
msgstr ""
|
|
52
52
|
|
|
53
|
-
#: views.py:
|
|
53
|
+
#: views.py:36
|
|
54
54
|
msgid "Add site"
|
|
55
55
|
msgstr ""
|
|
56
56
|
|
|
57
|
-
#: views.py:
|
|
57
|
+
#: views.py:37
|
|
58
58
|
#, python-format
|
|
59
59
|
msgid "Site '%(object)s' created."
|
|
60
60
|
msgstr ""
|
|
61
61
|
|
|
62
|
-
#: views.py:
|
|
62
|
+
#: views.py:38 views.py:43
|
|
63
63
|
msgid "The site could not be saved due to errors."
|
|
64
64
|
msgstr ""
|
|
65
65
|
|
|
66
|
-
#: views.py:
|
|
66
|
+
#: views.py:42
|
|
67
67
|
#, python-format
|
|
68
68
|
msgid "Site '%(object)s' updated."
|
|
69
69
|
msgstr ""
|
|
70
70
|
|
|
71
|
-
#: views.py:
|
|
71
|
+
#: views.py:44 views.py:50
|
|
72
72
|
msgid "Delete site"
|
|
73
73
|
msgstr ""
|
|
74
74
|
|
|
75
|
-
#: views.py:
|
|
75
|
+
#: views.py:49
|
|
76
76
|
#, python-format
|
|
77
77
|
msgid "Site '%(object)s' deleted."
|
|
78
78
|
msgstr ""
|
|
79
79
|
|
|
80
|
-
#: views.py:
|
|
80
|
+
#: views.py:51
|
|
81
81
|
msgid "Are you sure you want to delete this site?"
|
|
82
82
|
msgstr ""
|
wagtail/sites/tests.py
CHANGED
|
@@ -20,7 +20,25 @@ class TestSiteIndexView(AdminTemplateTestUtils, WagtailTestUtils, TestCase):
|
|
|
20
20
|
response = self.get()
|
|
21
21
|
self.assertEqual(response.status_code, 200)
|
|
22
22
|
self.assertTemplateUsed(response, "wagtailadmin/generic/index.html")
|
|
23
|
-
self.
|
|
23
|
+
self.assertBreadcrumbsItemsRendered(
|
|
24
|
+
[{"url": "", "label": "Sites"}],
|
|
25
|
+
response.content,
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
def test_num_queries(self):
|
|
29
|
+
# Warm up the cache
|
|
30
|
+
self.get()
|
|
31
|
+
with self.assertNumQueries(9):
|
|
32
|
+
self.get()
|
|
33
|
+
|
|
34
|
+
sites = [
|
|
35
|
+
Site(hostname=f"host {i}", port=f"800{i}", root_page_id=2)
|
|
36
|
+
for i in range(10)
|
|
37
|
+
]
|
|
38
|
+
Site.objects.bulk_create(sites)
|
|
39
|
+
|
|
40
|
+
with self.assertNumQueries(9):
|
|
41
|
+
self.get()
|
|
24
42
|
|
|
25
43
|
|
|
26
44
|
class TestSiteCreateView(AdminTemplateTestUtils, WagtailTestUtils, TestCase):
|
|
@@ -56,8 +74,13 @@ class TestSiteCreateView(AdminTemplateTestUtils, WagtailTestUtils, TestCase):
|
|
|
56
74
|
def test_simple(self):
|
|
57
75
|
response = self.get()
|
|
58
76
|
self.assertEqual(response.status_code, 200)
|
|
59
|
-
self.
|
|
60
|
-
|
|
77
|
+
self.assertBreadcrumbsItemsRendered(
|
|
78
|
+
[
|
|
79
|
+
{"label": "Sites", "url": "/admin/sites/"},
|
|
80
|
+
{"label": "New: Site", "url": ""},
|
|
81
|
+
],
|
|
82
|
+
response.content,
|
|
83
|
+
)
|
|
61
84
|
|
|
62
85
|
def test_create(self):
|
|
63
86
|
response = self.post(
|
|
@@ -201,14 +224,19 @@ class TestSiteEditView(AdminTemplateTestUtils, WagtailTestUtils, TestCase):
|
|
|
201
224
|
def test_simple(self):
|
|
202
225
|
response = self.get()
|
|
203
226
|
self.assertEqual(response.status_code, 200)
|
|
204
|
-
self.
|
|
205
|
-
|
|
227
|
+
self.assertBreadcrumbsItemsRendered(
|
|
228
|
+
[
|
|
229
|
+
{"url": "/admin/sites/", "label": "Sites"},
|
|
230
|
+
{"url": "", "label": str(self.localhost)},
|
|
231
|
+
],
|
|
232
|
+
response.content,
|
|
233
|
+
)
|
|
206
234
|
|
|
207
235
|
url_finder = AdminURLFinder(self.user)
|
|
208
236
|
expected_url = "/admin/sites/edit/%d/" % self.localhost.id
|
|
209
237
|
self.assertEqual(url_finder.get_edit_url(self.localhost), expected_url)
|
|
210
238
|
|
|
211
|
-
def
|
|
239
|
+
def test_nonexistent_redirect(self):
|
|
212
240
|
self.assertEqual(self.get(site_id=100000).status_code, 404)
|
|
213
241
|
|
|
214
242
|
def test_edit(self):
|
|
@@ -357,7 +385,7 @@ class TestSiteDeleteView(AdminTemplateTestUtils, WagtailTestUtils, TestCase):
|
|
|
357
385
|
self.assertTemplateUsed(response, "wagtailadmin/generic/confirm_delete.html")
|
|
358
386
|
self.assertBreadcrumbsNotRendered(response.content)
|
|
359
387
|
|
|
360
|
-
def
|
|
388
|
+
def test_nonexistent_redirect(self):
|
|
361
389
|
self.assertEqual(self.get(site_id=100000).status_code, 404)
|
|
362
390
|
|
|
363
391
|
def test_posting_deletes_site(self):
|
|
@@ -396,7 +424,6 @@ class TestLimitedPermissions(WagtailTestUtils, TestCase):
|
|
|
396
424
|
def test_get_create_view(self):
|
|
397
425
|
response = self.client.get(reverse("wagtailsites:add"))
|
|
398
426
|
self.assertEqual(response.status_code, 200)
|
|
399
|
-
self.assertTemplateUsed(response, "wagtailsites/create.html")
|
|
400
427
|
|
|
401
428
|
def test_create(self):
|
|
402
429
|
response = self.client.post(
|
|
@@ -418,7 +445,6 @@ class TestLimitedPermissions(WagtailTestUtils, TestCase):
|
|
|
418
445
|
edit_url = reverse("wagtailsites:edit", args=(self.localhost.id,))
|
|
419
446
|
response = self.client.get(edit_url)
|
|
420
447
|
self.assertEqual(response.status_code, 200)
|
|
421
|
-
self.assertTemplateUsed(response, "wagtailsites/edit.html")
|
|
422
448
|
|
|
423
449
|
def test_edit(self):
|
|
424
450
|
edit_url = reverse("wagtailsites:edit", args=(self.localhost.id,))
|
wagtail/sites/views.py
CHANGED
|
@@ -28,6 +28,9 @@ class IndexView(generic.IndexView):
|
|
|
28
28
|
),
|
|
29
29
|
]
|
|
30
30
|
|
|
31
|
+
def get_base_queryset(self):
|
|
32
|
+
return super().get_base_queryset().select_related("root_page")
|
|
33
|
+
|
|
31
34
|
|
|
32
35
|
class CreateView(generic.CreateView):
|
|
33
36
|
page_title = _("Add site")
|
|
@@ -53,7 +56,6 @@ class SiteViewSet(ModelViewSet):
|
|
|
53
56
|
model = Site
|
|
54
57
|
permission_policy = site_permission_policy
|
|
55
58
|
add_to_reference_index = False
|
|
56
|
-
_show_breadcrumbs = False
|
|
57
59
|
|
|
58
60
|
index_view_class = IndexView
|
|
59
61
|
add_view_class = CreateView
|
|
Binary file
|