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
|
@@ -4,6 +4,7 @@ import urllib
|
|
|
4
4
|
|
|
5
5
|
from django.conf import settings
|
|
6
6
|
from django.contrib.auth.models import Group, Permission
|
|
7
|
+
from django.contrib.contenttypes.models import ContentType
|
|
7
8
|
from django.core.files.uploadedfile import SimpleUploadedFile, TemporaryUploadedFile
|
|
8
9
|
from django.template.defaultfilters import filesizeformat
|
|
9
10
|
from django.template.loader import render_to_string
|
|
@@ -16,12 +17,12 @@ from django.utils.safestring import mark_safe
|
|
|
16
17
|
|
|
17
18
|
from wagtail.admin.admin_url_finder import AdminURLFinder
|
|
18
19
|
from wagtail.images import get_image_model
|
|
19
|
-
from wagtail.images.models import UploadedImage
|
|
20
20
|
from wagtail.images.utils import generate_signature
|
|
21
21
|
from wagtail.models import (
|
|
22
22
|
Collection,
|
|
23
23
|
GroupCollectionPermission,
|
|
24
24
|
Page,
|
|
25
|
+
UploadedFile,
|
|
25
26
|
get_root_collection_id,
|
|
26
27
|
)
|
|
27
28
|
from wagtail.test.testapp.models import (
|
|
@@ -31,6 +32,7 @@ from wagtail.test.testapp.models import (
|
|
|
31
32
|
VariousOnDeleteModel,
|
|
32
33
|
)
|
|
33
34
|
from wagtail.test.utils import WagtailTestUtils
|
|
35
|
+
from wagtail.test.utils.timestamps import local_datetime
|
|
34
36
|
|
|
35
37
|
from .utils import Image, get_test_image_file, get_test_image_file_svg
|
|
36
38
|
|
|
@@ -44,12 +46,10 @@ class TestImageIndexView(WagtailTestUtils, TestCase):
|
|
|
44
46
|
self.kitten_image = Image.objects.create(
|
|
45
47
|
title="a cute kitten",
|
|
46
48
|
file=get_test_image_file(size=(1, 1)),
|
|
47
|
-
created_at=datetime.datetime(2020, 1, 1),
|
|
48
49
|
)
|
|
49
50
|
self.puppy_image = Image.objects.create(
|
|
50
51
|
title="a cute puppy",
|
|
51
52
|
file=get_test_image_file(size=(1, 1)),
|
|
52
|
-
created_at=datetime.datetime(2022, 2, 2),
|
|
53
53
|
)
|
|
54
54
|
|
|
55
55
|
def get(self, params={}):
|
|
@@ -85,12 +85,6 @@ class TestImageIndexView(WagtailTestUtils, TestCase):
|
|
|
85
85
|
response = self.get({"p": 9999})
|
|
86
86
|
self.assertEqual(response.status_code, 404)
|
|
87
87
|
|
|
88
|
-
def test_per_page(self):
|
|
89
|
-
response = self.get({"entries_per_page": 60})
|
|
90
|
-
self.assertContains(
|
|
91
|
-
response, '<option value="60" selected="selected">60</option>', html=True
|
|
92
|
-
)
|
|
93
|
-
|
|
94
88
|
def test_pagination_preserves_other_params(self):
|
|
95
89
|
root_collection = Collection.get_first_root_node()
|
|
96
90
|
evil_plans_collection = root_collection.add_child(name="Evil plans")
|
|
@@ -151,41 +145,40 @@ class TestImageIndexView(WagtailTestUtils, TestCase):
|
|
|
151
145
|
self.assertEqual(context["page_obj"].object_list[0], self.puppy_image)
|
|
152
146
|
self.assertEqual(context["page_obj"].object_list[1], self.kitten_image)
|
|
153
147
|
|
|
148
|
+
@override_settings(WAGTAILIMAGES_INDEX_PAGE_SIZE=15)
|
|
154
149
|
def test_default_entries_per_page(self):
|
|
155
|
-
|
|
156
|
-
|
|
150
|
+
images = [
|
|
151
|
+
Image(
|
|
157
152
|
title="Test image %i" % i,
|
|
158
153
|
file=get_test_image_file(size=(1, 1)),
|
|
159
154
|
)
|
|
155
|
+
for i in range(1, 33)
|
|
156
|
+
]
|
|
157
|
+
Image.objects.bulk_create(images)
|
|
160
158
|
|
|
161
159
|
response = self.get()
|
|
162
160
|
self.assertEqual(response.status_code, 200)
|
|
163
161
|
|
|
164
162
|
object_list = response.context["page_obj"].object_list
|
|
165
|
-
# The
|
|
166
|
-
self.assertEqual(len(object_list),
|
|
167
|
-
|
|
168
|
-
response = self.get({"entries_per_page": 10})
|
|
169
|
-
self.assertEqual(response.status_code, 200)
|
|
170
|
-
|
|
171
|
-
object_list = response.context["page_obj"].object_list
|
|
172
|
-
self.assertEqual(len(object_list), 10)
|
|
163
|
+
# The number of images shown is 15
|
|
164
|
+
self.assertEqual(len(object_list), 15)
|
|
173
165
|
|
|
174
166
|
def test_default_entries_per_page_uses_default(self):
|
|
175
|
-
|
|
176
|
-
|
|
167
|
+
images = [
|
|
168
|
+
Image(
|
|
177
169
|
title="Test image %i" % i,
|
|
178
170
|
file=get_test_image_file(size=(1, 1)),
|
|
179
171
|
)
|
|
172
|
+
for i in range(1, 33)
|
|
173
|
+
]
|
|
174
|
+
Image.objects.bulk_create(images)
|
|
180
175
|
|
|
181
176
|
default_num_entries_per_page = 30
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
response = self.get({"entries_per_page": value})
|
|
185
|
-
self.assertEqual(response.status_code, 200)
|
|
177
|
+
response = self.get()
|
|
178
|
+
self.assertEqual(response.status_code, 200)
|
|
186
179
|
|
|
187
|
-
|
|
188
|
-
|
|
180
|
+
object_list = response.context["page_obj"].object_list
|
|
181
|
+
self.assertEqual(len(object_list), default_num_entries_per_page)
|
|
189
182
|
|
|
190
183
|
def test_collection_order(self):
|
|
191
184
|
root_collection = Collection.get_first_root_node()
|
|
@@ -193,8 +186,16 @@ class TestImageIndexView(WagtailTestUtils, TestCase):
|
|
|
193
186
|
root_collection.add_child(name="Good plans")
|
|
194
187
|
|
|
195
188
|
response = self.get()
|
|
189
|
+
soup = self.get_soup(response.content)
|
|
190
|
+
collection_options = soup.select(
|
|
191
|
+
'select[name="collection_id"] option[value]:not(option[value=""])'
|
|
192
|
+
)
|
|
193
|
+
|
|
196
194
|
self.assertEqual(
|
|
197
|
-
[
|
|
195
|
+
[
|
|
196
|
+
collection.get_text(strip=True).lstrip("↳ ")
|
|
197
|
+
for collection in collection_options
|
|
198
|
+
],
|
|
198
199
|
["Root", "Evil plans", "Good plans"],
|
|
199
200
|
)
|
|
200
201
|
|
|
@@ -234,13 +235,14 @@ class TestImageIndexView(WagtailTestUtils, TestCase):
|
|
|
234
235
|
response = self.get()
|
|
235
236
|
self.assertEqual(response.status_code, 200)
|
|
236
237
|
|
|
237
|
-
|
|
238
|
-
|
|
238
|
+
soup = self.get_soup(response.content)
|
|
239
|
+
current_tags = soup.select("input[name=tag][checked]")
|
|
240
|
+
self.assertFalse(current_tags)
|
|
239
241
|
|
|
240
|
-
tags =
|
|
241
|
-
self.
|
|
242
|
-
[
|
|
243
|
-
|
|
242
|
+
tags = soup.select("#id_tag label")
|
|
243
|
+
self.assertCountEqual(
|
|
244
|
+
[tags.get_text(strip=True) for tags in tags],
|
|
245
|
+
["one", "two"],
|
|
244
246
|
)
|
|
245
247
|
|
|
246
248
|
def test_tag_filtering(self):
|
|
@@ -261,10 +263,16 @@ class TestImageIndexView(WagtailTestUtils, TestCase):
|
|
|
261
263
|
)
|
|
262
264
|
image_two_tags.tags.add("one", "two")
|
|
263
265
|
|
|
266
|
+
image_unrelated_tag = Image.objects.create(
|
|
267
|
+
title="Test image with a different tag",
|
|
268
|
+
file=get_test_image_file(),
|
|
269
|
+
)
|
|
270
|
+
image_unrelated_tag.tags.add("unrelated")
|
|
271
|
+
|
|
264
272
|
# no filtering
|
|
265
273
|
response = self.get()
|
|
266
|
-
#
|
|
267
|
-
self.assertEqual(response.context["page_obj"].paginator.count,
|
|
274
|
+
# four images created above plus the two untagged ones created in setUp()
|
|
275
|
+
self.assertEqual(response.context["page_obj"].paginator.count, 6)
|
|
268
276
|
|
|
269
277
|
# filter all images with tag 'one'
|
|
270
278
|
response = self.get({"tag": "one"})
|
|
@@ -274,6 +282,30 @@ class TestImageIndexView(WagtailTestUtils, TestCase):
|
|
|
274
282
|
response = self.get({"tag": "two"})
|
|
275
283
|
self.assertEqual(response.context["page_obj"].paginator.count, 1)
|
|
276
284
|
|
|
285
|
+
# filter all images with tag 'one' or 'unrelated'
|
|
286
|
+
response = self.get({"tag": ["one", "unrelated"]})
|
|
287
|
+
self.assertEqual(response.context["page_obj"].paginator.count, 3)
|
|
288
|
+
|
|
289
|
+
soup = self.get_soup(response.content)
|
|
290
|
+
|
|
291
|
+
# Should check the 'one' and 'unrelated' tags checkboxes
|
|
292
|
+
tags = soup.select("#id_tag label")
|
|
293
|
+
self.assertCountEqual(
|
|
294
|
+
[
|
|
295
|
+
tag.get_text(strip=True)
|
|
296
|
+
for tag in tags
|
|
297
|
+
if tag.select_one("input[checked]") is not None
|
|
298
|
+
],
|
|
299
|
+
["one", "unrelated"],
|
|
300
|
+
)
|
|
301
|
+
|
|
302
|
+
# Should render the active filter pills separately for each tag
|
|
303
|
+
active_filters = soup.select('[data-w-active-filter-id="id_tag"]')
|
|
304
|
+
self.assertCountEqual(
|
|
305
|
+
[filter.get_text(separator=" ", strip=True) for filter in active_filters],
|
|
306
|
+
["Tag: one", "Tag: unrelated"],
|
|
307
|
+
)
|
|
308
|
+
|
|
277
309
|
def test_tag_filtering_preserves_other_params(self):
|
|
278
310
|
for i in range(1, 130):
|
|
279
311
|
image = Image.objects.create(
|
|
@@ -301,7 +333,7 @@ class TestImageIndexView(WagtailTestUtils, TestCase):
|
|
|
301
333
|
def test_search_form_rendered(self):
|
|
302
334
|
response = self.get()
|
|
303
335
|
html = response.content.decode()
|
|
304
|
-
search_url = reverse("wagtailimages:
|
|
336
|
+
search_url = reverse("wagtailimages:index_results")
|
|
305
337
|
|
|
306
338
|
# Search form in the header should be rendered.
|
|
307
339
|
self.assertTagInHTML(
|
|
@@ -348,13 +380,17 @@ class TestImageIndexViewSearch(WagtailTestUtils, TransactionTestCase):
|
|
|
348
380
|
self.kitten_image = Image.objects.create(
|
|
349
381
|
title="a cute kitten",
|
|
350
382
|
file=get_test_image_file(size=(1, 1)),
|
|
351
|
-
created_at=datetime.datetime(2020, 1, 1),
|
|
352
383
|
)
|
|
353
384
|
self.puppy_image = Image.objects.create(
|
|
354
385
|
title="a cute puppy",
|
|
355
386
|
file=get_test_image_file(size=(1, 1)),
|
|
356
|
-
created_at=datetime.datetime(2022, 2, 2),
|
|
357
387
|
)
|
|
388
|
+
# The created_at field uses auto_now_add, so changing it needs to be
|
|
389
|
+
# done after the image is created.
|
|
390
|
+
self.kitten_image.created_at = local_datetime(2020, 1, 1)
|
|
391
|
+
self.kitten_image.save()
|
|
392
|
+
self.puppy_image.created_at = local_datetime(2022, 2, 2)
|
|
393
|
+
self.puppy_image.save()
|
|
358
394
|
|
|
359
395
|
def get(self, params={}):
|
|
360
396
|
return self.client.get(reverse("wagtailimages:index"), params)
|
|
@@ -405,9 +441,29 @@ class TestImageIndexViewSearch(WagtailTestUtils, TransactionTestCase):
|
|
|
405
441
|
url = reverse("wagtailimages:add_multiple")
|
|
406
442
|
self.assertContains(
|
|
407
443
|
response,
|
|
408
|
-
f'<a href="{url}?
|
|
444
|
+
f'<a href="{url}?collection_id={child_collection[0].pk}"',
|
|
409
445
|
)
|
|
410
446
|
|
|
447
|
+
def test_search_and_order_by_created_at(self):
|
|
448
|
+
old_image = Image.objects.create(
|
|
449
|
+
title="decades old cute tortoise",
|
|
450
|
+
file=get_test_image_file(size=(1, 1)),
|
|
451
|
+
)
|
|
452
|
+
old_image.created_at = local_datetime(2000, 1, 1)
|
|
453
|
+
old_image.save()
|
|
454
|
+
response = self.get({"q": "cute", "ordering": "created_at"})
|
|
455
|
+
self.assertEqual(response.status_code, 200)
|
|
456
|
+
self.assertEqual(response.context["query_string"], "cute")
|
|
457
|
+
self.assertEqual(
|
|
458
|
+
list(response.context["page_obj"].object_list),
|
|
459
|
+
[old_image, self.kitten_image, self.puppy_image],
|
|
460
|
+
)
|
|
461
|
+
soup = self.get_soup(response.content)
|
|
462
|
+
option = soup.select_one('select[name="ordering"] option[selected]')
|
|
463
|
+
self.assertIsNotNone(option)
|
|
464
|
+
self.assertEqual(option["value"], "created_at")
|
|
465
|
+
self.assertEqual(option.get_text(strip=True), "Oldest")
|
|
466
|
+
|
|
411
467
|
def test_tag_filtering_with_search_term(self):
|
|
412
468
|
Image.objects.create(
|
|
413
469
|
title="Test image with no tags",
|
|
@@ -426,10 +482,10 @@ class TestImageIndexViewSearch(WagtailTestUtils, TransactionTestCase):
|
|
|
426
482
|
)
|
|
427
483
|
image_two_tags.tags.add("one", "two")
|
|
428
484
|
|
|
429
|
-
# The tag
|
|
430
|
-
#
|
|
485
|
+
# The tag shouldn't be ignored, so the result should be the images
|
|
486
|
+
# that have the "one" tag and "test" in the title.
|
|
431
487
|
response = self.get({"tag": "one", "q": "test"})
|
|
432
|
-
self.assertEqual(response.context["page_obj"].paginator.count,
|
|
488
|
+
self.assertEqual(response.context["page_obj"].paginator.count, 2)
|
|
433
489
|
|
|
434
490
|
|
|
435
491
|
class TestImageListingResultsView(WagtailTestUtils, TransactionTestCase):
|
|
@@ -2886,7 +2942,7 @@ class TestMultipleImageUploaderWithCustomImageModel(WagtailTestUtils, TestCase):
|
|
|
2886
2942
|
|
|
2887
2943
|
def test_unique_together_validation_error(self):
|
|
2888
2944
|
"""
|
|
2889
|
-
If unique_together validation fails, create an
|
|
2945
|
+
If unique_together validation fails, create an UploadedFile and return a form so the
|
|
2890
2946
|
user can fix it
|
|
2891
2947
|
"""
|
|
2892
2948
|
root_collection = Collection.get_first_root_node()
|
|
@@ -2895,7 +2951,7 @@ class TestMultipleImageUploaderWithCustomImageModel(WagtailTestUtils, TestCase):
|
|
|
2895
2951
|
self.image.save()
|
|
2896
2952
|
|
|
2897
2953
|
image_count_before = CustomImage.objects.count()
|
|
2898
|
-
uploaded_image_count_before =
|
|
2954
|
+
uploaded_image_count_before = UploadedFile.objects.count()
|
|
2899
2955
|
|
|
2900
2956
|
response = self.client.post(
|
|
2901
2957
|
reverse("wagtailimages:add_multiple"),
|
|
@@ -2908,9 +2964,9 @@ class TestMultipleImageUploaderWithCustomImageModel(WagtailTestUtils, TestCase):
|
|
|
2908
2964
|
)
|
|
2909
2965
|
|
|
2910
2966
|
image_count_after = CustomImage.objects.count()
|
|
2911
|
-
uploaded_image_count_after =
|
|
2967
|
+
uploaded_image_count_after = UploadedFile.objects.count()
|
|
2912
2968
|
|
|
2913
|
-
# an
|
|
2969
|
+
# an UploadedFile should have been created now, but not a CustomImage
|
|
2914
2970
|
self.assertEqual(image_count_after, image_count_before)
|
|
2915
2971
|
self.assertEqual(uploaded_image_count_after, uploaded_image_count_before + 1)
|
|
2916
2972
|
|
|
@@ -3034,8 +3090,9 @@ class TestMultipleImageUploaderWithCustomRequiredFields(WagtailTestUtils, TestCa
|
|
|
3034
3090
|
def setUp(self):
|
|
3035
3091
|
self.user = self.login()
|
|
3036
3092
|
|
|
3037
|
-
# Create an
|
|
3038
|
-
self.uploaded_image =
|
|
3093
|
+
# Create an UploadedFile for running tests on
|
|
3094
|
+
self.uploaded_image = UploadedFile.objects.create(
|
|
3095
|
+
for_content_type=ContentType.objects.get_for_model(get_image_model()),
|
|
3039
3096
|
file=get_test_image_file(),
|
|
3040
3097
|
uploaded_by_user=self.user,
|
|
3041
3098
|
)
|
|
@@ -3053,11 +3110,11 @@ class TestMultipleImageUploaderWithCustomRequiredFields(WagtailTestUtils, TestCa
|
|
|
3053
3110
|
|
|
3054
3111
|
def test_add_post(self):
|
|
3055
3112
|
"""
|
|
3056
|
-
A POST request to the add view should create an
|
|
3113
|
+
A POST request to the add view should create an UploadedFile rather than an image,
|
|
3057
3114
|
as we do not have enough data to pass CustomImageWithAuthor's validation yet
|
|
3058
3115
|
"""
|
|
3059
3116
|
image_count_before = CustomImageWithAuthor.objects.count()
|
|
3060
|
-
uploaded_image_count_before =
|
|
3117
|
+
uploaded_image_count_before = UploadedFile.objects.count()
|
|
3061
3118
|
|
|
3062
3119
|
response = self.client.post(
|
|
3063
3120
|
reverse("wagtailimages:add_multiple"),
|
|
@@ -3069,9 +3126,9 @@ class TestMultipleImageUploaderWithCustomRequiredFields(WagtailTestUtils, TestCa
|
|
|
3069
3126
|
)
|
|
3070
3127
|
|
|
3071
3128
|
image_count_after = CustomImageWithAuthor.objects.count()
|
|
3072
|
-
uploaded_image_count_after =
|
|
3129
|
+
uploaded_image_count_after = UploadedFile.objects.count()
|
|
3073
3130
|
|
|
3074
|
-
# an
|
|
3131
|
+
# an UploadedFile should have been created now, but not a CustomImageWithAuthor
|
|
3075
3132
|
self.assertEqual(image_count_after, image_count_before)
|
|
3076
3133
|
self.assertEqual(uploaded_image_count_after, uploaded_image_count_before + 1)
|
|
3077
3134
|
|
|
@@ -3137,10 +3194,10 @@ class TestMultipleImageUploaderWithCustomRequiredFields(WagtailTestUtils, TestCa
|
|
|
3137
3194
|
def test_create_from_upload_invalid_post(self):
|
|
3138
3195
|
"""
|
|
3139
3196
|
Posting an invalid form to the create_from_uploaded_image view throws a validation error and leaves the
|
|
3140
|
-
|
|
3197
|
+
UploadedFile intact
|
|
3141
3198
|
"""
|
|
3142
3199
|
image_count_before = CustomImageWithAuthor.objects.count()
|
|
3143
|
-
uploaded_image_count_before =
|
|
3200
|
+
uploaded_image_count_before = UploadedFile.objects.count()
|
|
3144
3201
|
|
|
3145
3202
|
# Send request
|
|
3146
3203
|
response = self.client.post(
|
|
@@ -3156,9 +3213,9 @@ class TestMultipleImageUploaderWithCustomRequiredFields(WagtailTestUtils, TestCa
|
|
|
3156
3213
|
)
|
|
3157
3214
|
|
|
3158
3215
|
image_count_after = CustomImageWithAuthor.objects.count()
|
|
3159
|
-
uploaded_image_count_after =
|
|
3216
|
+
uploaded_image_count_after = UploadedFile.objects.count()
|
|
3160
3217
|
|
|
3161
|
-
# no changes to image /
|
|
3218
|
+
# no changes to image / UploadedFile count
|
|
3162
3219
|
self.assertEqual(image_count_after, image_count_before)
|
|
3163
3220
|
self.assertEqual(uploaded_image_count_after, uploaded_image_count_before)
|
|
3164
3221
|
|
|
@@ -3194,7 +3251,7 @@ class TestMultipleImageUploaderWithCustomRequiredFields(WagtailTestUtils, TestCa
|
|
|
3194
3251
|
Posting a valid form to the create_from_uploaded_image view will create the image
|
|
3195
3252
|
"""
|
|
3196
3253
|
image_count_before = CustomImageWithAuthor.objects.count()
|
|
3197
|
-
uploaded_image_count_before =
|
|
3254
|
+
uploaded_image_count_before = UploadedFile.objects.count()
|
|
3198
3255
|
|
|
3199
3256
|
# Send request
|
|
3200
3257
|
response = self.client.post(
|
|
@@ -3212,7 +3269,7 @@ class TestMultipleImageUploaderWithCustomRequiredFields(WagtailTestUtils, TestCa
|
|
|
3212
3269
|
)
|
|
3213
3270
|
|
|
3214
3271
|
image_count_after = CustomImageWithAuthor.objects.count()
|
|
3215
|
-
uploaded_image_count_after =
|
|
3272
|
+
uploaded_image_count_after = UploadedFile.objects.count()
|
|
3216
3273
|
|
|
3217
3274
|
# Check response
|
|
3218
3275
|
self.assertEqual(response.status_code, 200)
|
|
@@ -3223,7 +3280,7 @@ class TestMultipleImageUploaderWithCustomRequiredFields(WagtailTestUtils, TestCa
|
|
|
3223
3280
|
self.assertIn("image_id", response_json)
|
|
3224
3281
|
self.assertTrue(response_json["success"])
|
|
3225
3282
|
|
|
3226
|
-
# Image should have been created,
|
|
3283
|
+
# Image should have been created, UploadedFile deleted
|
|
3227
3284
|
self.assertEqual(image_count_after, image_count_before + 1)
|
|
3228
3285
|
self.assertEqual(uploaded_image_count_after, uploaded_image_count_before - 1)
|
|
3229
3286
|
|
|
@@ -3239,7 +3296,7 @@ class TestMultipleImageUploaderWithCustomRequiredFields(WagtailTestUtils, TestCa
|
|
|
3239
3296
|
|
|
3240
3297
|
def test_delete_uploaded_image(self):
|
|
3241
3298
|
"""
|
|
3242
|
-
This tests that a POST request to the delete view deletes the
|
|
3299
|
+
This tests that a POST request to the delete view deletes the UploadedFile
|
|
3243
3300
|
"""
|
|
3244
3301
|
# Send request
|
|
3245
3302
|
response = self.client.post(
|
|
@@ -3254,7 +3311,7 @@ class TestMultipleImageUploaderWithCustomRequiredFields(WagtailTestUtils, TestCa
|
|
|
3254
3311
|
|
|
3255
3312
|
# Make sure the image is deleted
|
|
3256
3313
|
self.assertFalse(
|
|
3257
|
-
|
|
3314
|
+
UploadedFile.objects.filter(id=self.uploaded_image.id).exists()
|
|
3258
3315
|
)
|
|
3259
3316
|
|
|
3260
3317
|
# Check JSON
|
|
@@ -683,6 +683,16 @@ class TestFormatFilter(TestCase):
|
|
|
683
683
|
|
|
684
684
|
self.assertEqual(out.format_name, "webp")
|
|
685
685
|
|
|
686
|
+
def test_ico(self):
|
|
687
|
+
fil = Filter(spec="width-400|format-ico")
|
|
688
|
+
image = Image.objects.create(
|
|
689
|
+
title="Test image",
|
|
690
|
+
file=get_test_image_file(),
|
|
691
|
+
)
|
|
692
|
+
out = fil.run(image, BytesIO())
|
|
693
|
+
|
|
694
|
+
self.assertEqual(out.format_name, "ico")
|
|
695
|
+
|
|
686
696
|
def test_webp_lossless(self):
|
|
687
697
|
fil = Filter(spec="width-400|format-webp-lossless")
|
|
688
698
|
image = Image.objects.create(
|
|
@@ -4,7 +4,7 @@ from django.conf import settings
|
|
|
4
4
|
from django.contrib.auth.models import Group, Permission
|
|
5
5
|
from django.core.cache import caches
|
|
6
6
|
from django.core.files import File
|
|
7
|
-
from django.core.files.storage import
|
|
7
|
+
from django.core.files.storage import Storage, default_storage, storages
|
|
8
8
|
from django.core.files.uploadedfile import SimpleUploadedFile
|
|
9
9
|
from django.db.models import Prefetch
|
|
10
10
|
from django.db.utils import IntegrityError
|
|
@@ -38,8 +38,7 @@ from .utils import (
|
|
|
38
38
|
|
|
39
39
|
|
|
40
40
|
class CustomStorage(Storage):
|
|
41
|
-
|
|
42
|
-
super().__init__()
|
|
41
|
+
pass
|
|
43
42
|
|
|
44
43
|
|
|
45
44
|
class TestImage(TestCase):
|
|
@@ -668,7 +667,7 @@ class TestRenditions(TestCase):
|
|
|
668
667
|
self._test_get_renditions_performance(1)
|
|
669
668
|
|
|
670
669
|
# ATTEMPT 3
|
|
671
|
-
# If the existing renditions are prefetched, no
|
|
670
|
+
# If the existing renditions are prefetched, no further queries should
|
|
672
671
|
# be needed, whether that's with prefetch_related("renditions") or
|
|
673
672
|
# prefetch_renditions()
|
|
674
673
|
self._test_get_renditions_performance(0, prefetch_all=True)
|
|
@@ -856,39 +855,42 @@ class TestRenditions(TestCase):
|
|
|
856
855
|
rendition.background_position_style, "background-position: 50% 50%;"
|
|
857
856
|
)
|
|
858
857
|
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
"""
|
|
863
|
-
# when setting is not set, instance.get_storage() returns DefaultStorage
|
|
864
|
-
from django.conf import settings
|
|
865
|
-
|
|
866
|
-
bkp = settings
|
|
867
|
-
|
|
858
|
+
@override_settings()
|
|
859
|
+
def test_rendition_storage_setting_absent(self):
|
|
860
|
+
del settings.WAGTAILIMAGES_RENDITION_STORAGE
|
|
868
861
|
self.assertFalse(hasattr(settings, "WAGTAILIMAGES_RENDITION_STORAGE"))
|
|
869
|
-
|
|
870
|
-
self.assertIsInstance(rendition1.image.file.storage, DefaultStorage)
|
|
871
|
-
|
|
872
|
-
# when setting is set to a path
|
|
873
|
-
setattr(
|
|
874
|
-
settings,
|
|
875
|
-
"WAGTAILIMAGES_RENDITION_STORAGE",
|
|
876
|
-
"wagtail.images.tests.test_models.CustomStorage",
|
|
877
|
-
)
|
|
878
|
-
backend = get_rendition_storage()
|
|
879
|
-
self.assertIsInstance(backend, CustomStorage)
|
|
862
|
+
self.assertEqual(get_rendition_storage(), default_storage)
|
|
880
863
|
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
864
|
+
@override_settings(
|
|
865
|
+
WAGTAILIMAGES_RENDITION_STORAGE="wagtail.images.tests.test_models.CustomStorage"
|
|
866
|
+
)
|
|
867
|
+
def test_rendition_storage_setting_given_dotted_path(self):
|
|
868
|
+
self.assertIsInstance(get_rendition_storage(), CustomStorage)
|
|
885
869
|
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
self.
|
|
870
|
+
@override_settings(WAGTAILIMAGES_RENDITION_STORAGE=CustomStorage())
|
|
871
|
+
def test_rendition_storage_setting_given_storage_instance(self):
|
|
872
|
+
self.assertEqual(
|
|
873
|
+
get_rendition_storage(), settings.WAGTAILIMAGES_RENDITION_STORAGE
|
|
874
|
+
)
|
|
889
875
|
|
|
890
|
-
|
|
891
|
-
|
|
876
|
+
@override_settings(
|
|
877
|
+
STORAGES={
|
|
878
|
+
"default": {
|
|
879
|
+
"BACKEND": "django.core.files.storage.FileSystemStorage",
|
|
880
|
+
},
|
|
881
|
+
"staticfiles": {
|
|
882
|
+
"BACKEND": "django.contrib.staticfiles.storage.StaticFilesStorage",
|
|
883
|
+
},
|
|
884
|
+
"custom_storage": {
|
|
885
|
+
"BACKEND": "wagtail.images.tests.test_models.CustomStorage",
|
|
886
|
+
},
|
|
887
|
+
},
|
|
888
|
+
WAGTAILIMAGES_RENDITION_STORAGE="custom_storage",
|
|
889
|
+
)
|
|
890
|
+
def test_rendition_storage_setting_given_storage_alias(self):
|
|
891
|
+
self.assertEqual(
|
|
892
|
+
get_rendition_storage(), storages[settings.WAGTAILIMAGES_RENDITION_STORAGE]
|
|
893
|
+
)
|
|
892
894
|
|
|
893
895
|
|
|
894
896
|
@override_settings(
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
from django.test import TestCase
|
|
2
|
+
from django.urls import reverse_lazy
|
|
2
3
|
|
|
3
4
|
from wagtail.fields import RichTextField
|
|
4
5
|
from wagtail.images.rich_text import ImageEmbedHandler as FrontendImageEmbedHandler
|
|
5
6
|
from wagtail.images.rich_text.editor_html import (
|
|
6
7
|
ImageEmbedHandler as EditorHtmlImageEmbedHandler,
|
|
7
8
|
)
|
|
9
|
+
from wagtail.rich_text.feature_registry import FeatureRegistry
|
|
8
10
|
from wagtail.test.utils import WagtailTestUtils
|
|
9
11
|
|
|
10
12
|
from .utils import Image, get_test_image_file
|
|
@@ -140,3 +142,15 @@ class TestExtractReferencesWithImage(WagtailTestUtils, TestCase):
|
|
|
140
142
|
),
|
|
141
143
|
[(Image, "52", "", "")],
|
|
142
144
|
)
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
class TestEntityFeatureChooserUrls(TestCase):
|
|
148
|
+
def test_chooser_urls_exist(self):
|
|
149
|
+
features = FeatureRegistry()
|
|
150
|
+
image = features.get_editor_plugin("draftail", "image")
|
|
151
|
+
|
|
152
|
+
self.assertIsNotNone(image.data.get("chooserUrls"))
|
|
153
|
+
self.assertEqual(
|
|
154
|
+
image.data["chooserUrls"]["imageChooser"],
|
|
155
|
+
reverse_lazy("wagtailimages_chooser:choose"),
|
|
156
|
+
)
|
wagtail/images/tests/utils.py
CHANGED
|
@@ -73,7 +73,7 @@ def get_test_image_file_svg(
|
|
|
73
73
|
|
|
74
74
|
|
|
75
75
|
def get_test_bad_image():
|
|
76
|
-
# Create an image with a missing file, by deserializing
|
|
76
|
+
# Create an image with a missing file, by deserializing from a python object
|
|
77
77
|
# (which bypasses FileField's attempt to read the file)
|
|
78
78
|
return list(
|
|
79
79
|
serializers.deserialize(
|