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
|
@@ -2,6 +2,7 @@ import json
|
|
|
2
2
|
from datetime import date, datetime, timedelta
|
|
3
3
|
from io import StringIO
|
|
4
4
|
|
|
5
|
+
from django.contrib.auth.models import Permission
|
|
5
6
|
from django.core import management
|
|
6
7
|
from django.test import TestCase
|
|
7
8
|
from django.urls import reverse
|
|
@@ -172,7 +173,7 @@ class TestGetSearchPromotionsTemplateTag(TestCase):
|
|
|
172
173
|
|
|
173
174
|
class TestSearchPromotionsIndexView(WagtailTestUtils, TestCase):
|
|
174
175
|
def setUp(self):
|
|
175
|
-
self.login()
|
|
176
|
+
self.user = self.login()
|
|
176
177
|
|
|
177
178
|
def test_simple(self):
|
|
178
179
|
response = self.client.get(reverse("wagtailsearchpromotions:index"))
|
|
@@ -230,7 +231,7 @@ class TestSearchPromotionsIndexView(WagtailTestUtils, TestCase):
|
|
|
230
231
|
self.assertTemplateUsed(response, "wagtailsearchpromotions/index.html")
|
|
231
232
|
|
|
232
233
|
# Check that we got the correct page
|
|
233
|
-
self.assertEqual(response.context["
|
|
234
|
+
self.assertEqual(response.context["page_obj"].number, 2)
|
|
234
235
|
|
|
235
236
|
def test_pagination_invalid(self):
|
|
236
237
|
self.make_search_picks()
|
|
@@ -252,6 +253,41 @@ class TestSearchPromotionsIndexView(WagtailTestUtils, TestCase):
|
|
|
252
253
|
# Check response
|
|
253
254
|
self.assertEqual(response.status_code, 404)
|
|
254
255
|
|
|
256
|
+
def test_num_queries(self):
|
|
257
|
+
url = reverse("wagtailsearchpromotions:index")
|
|
258
|
+
self.make_search_picks()
|
|
259
|
+
# Warm up the cache
|
|
260
|
+
self.client.get(url)
|
|
261
|
+
|
|
262
|
+
# Number of queries with the current number of search picks
|
|
263
|
+
with self.assertNumQueries(11):
|
|
264
|
+
self.client.get(url)
|
|
265
|
+
|
|
266
|
+
# Add more SearchPromotions and QueryDailyHits to some of the queries
|
|
267
|
+
today = date.today()
|
|
268
|
+
for i in range(20):
|
|
269
|
+
query = Query.get("query " + str(i))
|
|
270
|
+
promos = [
|
|
271
|
+
SearchPromotion(
|
|
272
|
+
query=query,
|
|
273
|
+
page_id=j % 2 + 1,
|
|
274
|
+
sort_order=j,
|
|
275
|
+
description=f"Search pick {j}",
|
|
276
|
+
)
|
|
277
|
+
for j in range(5)
|
|
278
|
+
]
|
|
279
|
+
hits = [
|
|
280
|
+
QueryDailyHits(query=query, date=today - timedelta(days=j), hits=j)
|
|
281
|
+
for j in range(5)
|
|
282
|
+
]
|
|
283
|
+
SearchPromotion.objects.bulk_create(promos)
|
|
284
|
+
QueryDailyHits.objects.bulk_create(hits)
|
|
285
|
+
|
|
286
|
+
# Number of queries after the addition of more search picks and hits
|
|
287
|
+
# should remain the same (no N+1 queries)
|
|
288
|
+
with self.assertNumQueries(11):
|
|
289
|
+
self.client.get(url)
|
|
290
|
+
|
|
255
291
|
def test_results_are_ordered_alphabetically(self):
|
|
256
292
|
self.make_search_picks()
|
|
257
293
|
SearchPromotion.objects.create(
|
|
@@ -260,6 +296,13 @@ class TestSearchPromotionsIndexView(WagtailTestUtils, TestCase):
|
|
|
260
296
|
sort_order=0,
|
|
261
297
|
description="ooh, it's a snake",
|
|
262
298
|
)
|
|
299
|
+
# Add another one to make sure it's not ordered descending by pk
|
|
300
|
+
SearchPromotion.objects.create(
|
|
301
|
+
query=Query.get("beloved snake"),
|
|
302
|
+
page_id=1,
|
|
303
|
+
sort_order=0,
|
|
304
|
+
description="beloved snake goes ssSSSS",
|
|
305
|
+
)
|
|
263
306
|
|
|
264
307
|
response = self.client.get(reverse("wagtailsearchpromotions:index"))
|
|
265
308
|
|
|
@@ -269,6 +312,37 @@ class TestSearchPromotionsIndexView(WagtailTestUtils, TestCase):
|
|
|
269
312
|
|
|
270
313
|
# "aargh snake" should be the first result alphabetically
|
|
271
314
|
self.assertEqual(response.context["queries"][0].query_string, "aaargh snake")
|
|
315
|
+
self.assertEqual(response.context["queries"][1].query_string, "beloved snake")
|
|
316
|
+
|
|
317
|
+
def test_multiple_searchpromotions(self):
|
|
318
|
+
today = date.today()
|
|
319
|
+
for i in range(10):
|
|
320
|
+
Query.get("root page").add_hit(date=today - timedelta(days=i))
|
|
321
|
+
SearchPromotion.objects.create(
|
|
322
|
+
query=Query.get("root page"),
|
|
323
|
+
page_id=1,
|
|
324
|
+
sort_order=0,
|
|
325
|
+
description="First search pick",
|
|
326
|
+
)
|
|
327
|
+
SearchPromotion.objects.create(
|
|
328
|
+
query=Query.get("root page"),
|
|
329
|
+
page_id=2,
|
|
330
|
+
sort_order=0,
|
|
331
|
+
description="Second search pick",
|
|
332
|
+
)
|
|
333
|
+
response = self.client.get(reverse("wagtailsearchpromotions:index"))
|
|
334
|
+
|
|
335
|
+
self.assertContains(response, "<td>10</td>", html=True)
|
|
336
|
+
self.assertEqual(Query.get("root page").hits, 10)
|
|
337
|
+
|
|
338
|
+
soup = self.get_soup(response.content)
|
|
339
|
+
root_page_edit_url = reverse("wagtailadmin_pages:edit", args=(1,))
|
|
340
|
+
homepage_edit_url = reverse("wagtailadmin_pages:edit", args=(2,))
|
|
341
|
+
root_page_edit_link = soup.select_one(f'a[href="{root_page_edit_url}"]')
|
|
342
|
+
homepage_edit_link = soup.select_one(f'a[href="{homepage_edit_url}"]')
|
|
343
|
+
self.assertIsNotNone(root_page_edit_link)
|
|
344
|
+
self.assertIsNotNone(homepage_edit_link)
|
|
345
|
+
self.assertEqual(Query.get("root page").editors_picks.count(), 2)
|
|
272
346
|
|
|
273
347
|
def test_results_ordering(self):
|
|
274
348
|
self.make_search_picks()
|
|
@@ -310,29 +384,68 @@ class TestSearchPromotionsIndexView(WagtailTestUtils, TestCase):
|
|
|
310
384
|
# ordered by querystring (reversed)
|
|
311
385
|
response = self.client.get(url + "?ordering=-query_string")
|
|
312
386
|
self.assertEqual(response.status_code, 200)
|
|
313
|
-
self.assertEqual(response.context["
|
|
387
|
+
self.assertEqual(response.context["page_obj"][0].query_string, "zyzzyvas")
|
|
314
388
|
|
|
315
389
|
# last page, still ordered by query string (reversed)
|
|
316
390
|
response = self.client.get(url + "?ordering=-query_string&p=3")
|
|
317
391
|
self.assertEqual(response.status_code, 200)
|
|
318
|
-
self.assertEqual(response.context["
|
|
392
|
+
self.assertEqual(response.context["page_obj"][-1].query_string, "aardwolf")
|
|
319
393
|
|
|
320
394
|
# ordered by querystring (not reversed)
|
|
321
395
|
response = self.client.get(url + "?ordering=query_string")
|
|
322
396
|
self.assertEqual(response.status_code, 200)
|
|
323
|
-
self.assertEqual(response.context["
|
|
397
|
+
self.assertEqual(response.context["page_obj"][0].query_string, "aardwolf")
|
|
324
398
|
|
|
325
399
|
# ordered by sum of daily hits (reversed)
|
|
326
400
|
response = self.client.get(url + "?ordering=-views")
|
|
327
401
|
self.assertEqual(response.status_code, 200)
|
|
328
|
-
self.assertEqual(response.context["
|
|
329
|
-
self.assertEqual(response.context["
|
|
402
|
+
self.assertEqual(response.context["page_obj"][0].query_string, "optimal")
|
|
403
|
+
self.assertEqual(response.context["page_obj"][1].query_string, "suboptimal")
|
|
330
404
|
|
|
331
405
|
# ordered by sum of daily hits, last page (not reversed)
|
|
332
406
|
response = self.client.get(url + "?ordering=views&p=3")
|
|
333
407
|
self.assertEqual(response.status_code, 200)
|
|
334
|
-
self.assertEqual(response.context["
|
|
335
|
-
self.assertEqual(response.context["
|
|
408
|
+
self.assertEqual(response.context["page_obj"][-1].query_string, "optimal")
|
|
409
|
+
self.assertEqual(response.context["page_obj"][-2].query_string, "suboptimal")
|
|
410
|
+
|
|
411
|
+
def test_get_with_no_permission(self):
|
|
412
|
+
self.user.is_superuser = False
|
|
413
|
+
self.user.save()
|
|
414
|
+
# Only basic access_admin permission is given
|
|
415
|
+
self.user.user_permissions.add(
|
|
416
|
+
Permission.objects.get(
|
|
417
|
+
content_type__app_label="wagtailadmin",
|
|
418
|
+
codename="access_admin",
|
|
419
|
+
)
|
|
420
|
+
)
|
|
421
|
+
|
|
422
|
+
response = self.client.get(reverse("wagtailsearchpromotions:index"))
|
|
423
|
+
self.assertEqual(response.status_code, 302)
|
|
424
|
+
self.assertRedirects(response, reverse("wagtailadmin_home"))
|
|
425
|
+
|
|
426
|
+
def test_get_with_edit_permission_only(self):
|
|
427
|
+
self.user.is_superuser = False
|
|
428
|
+
self.user.save()
|
|
429
|
+
# Only basic access_admin permission is given
|
|
430
|
+
self.user.user_permissions.add(
|
|
431
|
+
Permission.objects.get(
|
|
432
|
+
content_type__app_label="wagtailadmin",
|
|
433
|
+
codename="access_admin",
|
|
434
|
+
),
|
|
435
|
+
Permission.objects.get(
|
|
436
|
+
content_type__app_label="wagtailsearchpromotions",
|
|
437
|
+
codename="change_searchpromotion",
|
|
438
|
+
),
|
|
439
|
+
)
|
|
440
|
+
|
|
441
|
+
response = self.client.get(reverse("wagtailsearchpromotions:index"))
|
|
442
|
+
self.assertEqual(response.status_code, 200)
|
|
443
|
+
self.assertTemplateUsed(response, "wagtailsearchpromotions/index.html")
|
|
444
|
+
|
|
445
|
+
soup = self.get_soup(response.content)
|
|
446
|
+
add_url = reverse("wagtailsearchpromotions:add")
|
|
447
|
+
# Should not render add link
|
|
448
|
+
self.assertIsNone(soup.select_one(f'a[href="{add_url}"]'))
|
|
336
449
|
|
|
337
450
|
|
|
338
451
|
class TestSearchPromotionsAddView(WagtailTestUtils, TestCase):
|
|
@@ -6,80 +6,81 @@ from django.shortcuts import get_object_or_404, redirect
|
|
|
6
6
|
from django.template.response import TemplateResponse
|
|
7
7
|
from django.urls import reverse
|
|
8
8
|
from django.utils.translation import gettext as _
|
|
9
|
-
from django.
|
|
9
|
+
from django.utils.translation import gettext_lazy
|
|
10
10
|
|
|
11
11
|
from wagtail.admin import messages
|
|
12
|
-
from wagtail.admin.auth import
|
|
12
|
+
from wagtail.admin.auth import permission_required
|
|
13
13
|
from wagtail.admin.forms.search import SearchForm
|
|
14
14
|
from wagtail.admin.modal_workflow import render_modal_workflow
|
|
15
|
+
from wagtail.admin.ui.tables import Column, RelatedObjectsColumn, TitleColumn
|
|
16
|
+
from wagtail.admin.views import generic
|
|
15
17
|
from wagtail.contrib.search_promotions import forms, models
|
|
16
|
-
from wagtail.contrib.search_promotions.models import Query
|
|
18
|
+
from wagtail.contrib.search_promotions.models import Query, SearchPromotion
|
|
17
19
|
from wagtail.log_actions import log
|
|
20
|
+
from wagtail.permission_policies.base import ModelPermissionPolicy
|
|
18
21
|
from wagtail.search.utils import normalise_query_string
|
|
19
22
|
|
|
20
23
|
|
|
21
|
-
|
|
22
|
-
"wagtailsearchpromotions.
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
)
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
)
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
},
|
|
82
|
-
)
|
|
24
|
+
class SearchPromotionColumn(RelatedObjectsColumn):
|
|
25
|
+
cell_template_name = "wagtailsearchpromotions/search_promotion_column.html"
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class IndexView(generic.IndexView):
|
|
29
|
+
model = Query
|
|
30
|
+
template_name = "wagtailsearchpromotions/index.html"
|
|
31
|
+
results_template_name = "wagtailsearchpromotions/index_results.html"
|
|
32
|
+
context_object_name = "queries"
|
|
33
|
+
page_title = gettext_lazy("Search Terms")
|
|
34
|
+
header_icon = "pick"
|
|
35
|
+
paginate_by = 20
|
|
36
|
+
permission_policy = ModelPermissionPolicy(SearchPromotion)
|
|
37
|
+
index_url_name = "wagtailsearchpromotions:index"
|
|
38
|
+
index_results_url_name = "wagtailsearchpromotions:index_results"
|
|
39
|
+
_show_breadcrumbs = True
|
|
40
|
+
search_fields = ["query_string"]
|
|
41
|
+
default_ordering = "query_string"
|
|
42
|
+
add_url_name = "wagtailsearchpromotions:add"
|
|
43
|
+
add_item_label = gettext_lazy("Add new promoted result")
|
|
44
|
+
columns = [
|
|
45
|
+
TitleColumn(
|
|
46
|
+
"query_string",
|
|
47
|
+
label=gettext_lazy("Search term(s)"),
|
|
48
|
+
width="40%",
|
|
49
|
+
url_name="wagtailsearchpromotions:edit",
|
|
50
|
+
sort_key="query_string",
|
|
51
|
+
),
|
|
52
|
+
SearchPromotionColumn(
|
|
53
|
+
"editors_picks",
|
|
54
|
+
label=gettext_lazy("Promoted results"),
|
|
55
|
+
width="40%",
|
|
56
|
+
),
|
|
57
|
+
Column(
|
|
58
|
+
"views",
|
|
59
|
+
label=gettext_lazy("Views (past week)"),
|
|
60
|
+
width="20%",
|
|
61
|
+
sort_key="views",
|
|
62
|
+
),
|
|
63
|
+
]
|
|
64
|
+
|
|
65
|
+
def get_base_queryset(self):
|
|
66
|
+
# Use a subquery to filter out the Query objects that do not have a
|
|
67
|
+
# SearchPromotion instead of using .filter(editors_picks__isnull=False).
|
|
68
|
+
# The latter would use a JOIN which would result in duplicate rows before
|
|
69
|
+
# the sum is calculated, causing the sum to be incorrect.
|
|
70
|
+
has_promotions = SearchPromotion.objects.values_list("query_id", flat=True)
|
|
71
|
+
queryset = self.model.objects.filter(pk__in=has_promotions)
|
|
72
|
+
|
|
73
|
+
# Prevent N+1 queries by annotating the sum instead of using the
|
|
74
|
+
# Query.hits property and prefetching the related editors_picks.
|
|
75
|
+
queryset = queryset.annotate(
|
|
76
|
+
views=functions.Coalesce(Sum("daily_hits__hits"), 0)
|
|
77
|
+
).prefetch_related("editors_picks", "editors_picks__page")
|
|
78
|
+
return queryset
|
|
79
|
+
|
|
80
|
+
def get_breadcrumbs_items(self):
|
|
81
|
+
breadcrumbs = super().get_breadcrumbs_items()
|
|
82
|
+
breadcrumbs[-1]["label"] = _("Promoted search results")
|
|
83
|
+
return breadcrumbs
|
|
83
84
|
|
|
84
85
|
|
|
85
86
|
def save_searchpicks(query, new_query, searchpicks_formset):
|
|
@@ -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"
|
|
@@ -48,11 +48,11 @@ msgstr ""
|
|
|
48
48
|
msgid "This setting could not be opened because there is no site defined."
|
|
49
49
|
msgstr ""
|
|
50
50
|
|
|
51
|
-
#: views.py:
|
|
51
|
+
#: views.py:83
|
|
52
52
|
msgid "The setting could not be saved due to errors."
|
|
53
53
|
msgstr ""
|
|
54
54
|
|
|
55
|
-
#: views.py:
|
|
55
|
+
#: views.py:149
|
|
56
56
|
#, python-format
|
|
57
57
|
msgid "%(setting_type)s updated."
|
|
58
58
|
msgstr ""
|
|
Binary file
|
|
@@ -20,8 +20,8 @@ msgstr ""
|
|
|
20
20
|
"Content-Type: text/plain; charset=UTF-8\n"
|
|
21
21
|
"Content-Transfer-Encoding: 8bit\n"
|
|
22
22
|
"Language: he_IL\n"
|
|
23
|
-
"Plural-Forms: nplurals=
|
|
24
|
-
"1 == 0) ? 1:
|
|
23
|
+
"Plural-Forms: nplurals=3; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % "
|
|
24
|
+
"1 == 0) ? 1: 2;\n"
|
|
25
25
|
|
|
26
26
|
msgid "default"
|
|
27
27
|
msgstr "ברירת מחדל"
|
|
Binary file
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
#
|
|
5
5
|
# Translators:
|
|
6
6
|
# Ahmet Sarıcan <asarican@gmail.com>, 2019
|
|
7
|
-
# Cihad GÜNDOĞDU <cihadgundogdu@gmail.com>, 2016,2019
|
|
7
|
+
# Cihad GÜNDOĞDU <cihadgundogdu@gmail.com>, 2016,2019,2024
|
|
8
8
|
# Fatih Koç koç <fatihinemaili@gmail.com>, 2021
|
|
9
9
|
# Halim Turan <halim_turan_61@hotmail.com>, 2022
|
|
10
10
|
# José Luis <alagunajs@gmail.com>, 2017
|
|
@@ -17,7 +17,7 @@ msgstr ""
|
|
|
17
17
|
"Report-Msgid-Bugs-To: \n"
|
|
18
18
|
"POT-Creation-Date: 2024-01-24 13:51+0000\n"
|
|
19
19
|
"PO-Revision-Date: 2016-03-01 19:20+0000\n"
|
|
20
|
-
"Last-Translator:
|
|
20
|
+
"Last-Translator: Cihad GÜNDOĞDU <cihadgundogdu@gmail.com>, 2016,2019,2024\n"
|
|
21
21
|
"Language-Team: Turkish (http://app.transifex.com/torchbox/wagtail/language/"
|
|
22
22
|
"tr/)\n"
|
|
23
23
|
"MIME-Version: 1.0\n"
|
|
@@ -29,6 +29,10 @@ msgstr ""
|
|
|
29
29
|
msgid "default"
|
|
30
30
|
msgstr "varsayılan"
|
|
31
31
|
|
|
32
|
+
#, python-format
|
|
33
|
+
msgid "%(site_setting)s for %(site)s"
|
|
34
|
+
msgstr "%(site)s için %(site_setting)s"
|
|
35
|
+
|
|
32
36
|
msgid "Site"
|
|
33
37
|
msgstr "Site"
|
|
34
38
|
|
|
@@ -67,12 +67,17 @@ class GenericSettingAdminURLFinder(ModelAdminURLFinder):
|
|
|
67
67
|
|
|
68
68
|
|
|
69
69
|
class Registry(list):
|
|
70
|
-
def
|
|
70
|
+
def __init__(self):
|
|
71
|
+
self._model_icons = {}
|
|
72
|
+
|
|
73
|
+
def register(self, model, icon="cog", **kwargs):
|
|
71
74
|
from .models import BaseGenericSetting, BaseSiteSetting
|
|
72
75
|
|
|
73
76
|
"""
|
|
74
77
|
Register a model as a setting, adding it to the wagtail admin menu
|
|
75
78
|
"""
|
|
79
|
+
if icon:
|
|
80
|
+
self._model_icons[model] = icon
|
|
76
81
|
|
|
77
82
|
# Don't bother registering this if it is already registered
|
|
78
83
|
if model in self:
|
|
@@ -82,7 +87,7 @@ class Registry(list):
|
|
|
82
87
|
# Register a new menu item in the settings menu
|
|
83
88
|
@hooks.register("register_settings_menu_item")
|
|
84
89
|
def menu_hook():
|
|
85
|
-
return SettingMenuItem(model, **kwargs)
|
|
90
|
+
return SettingMenuItem(model, icon=self._model_icons.get(model), **kwargs)
|
|
86
91
|
|
|
87
92
|
@hooks.register("register_permissions")
|
|
88
93
|
def permissions_hook():
|
|
@@ -113,13 +118,13 @@ class Registry(list):
|
|
|
113
118
|
|
|
114
119
|
return model
|
|
115
120
|
|
|
116
|
-
def register_decorator(self, model=None, **kwargs):
|
|
121
|
+
def register_decorator(self, model=None, icon="cog", **kwargs):
|
|
117
122
|
"""
|
|
118
123
|
Register a model as a setting in the Wagtail admin
|
|
119
124
|
"""
|
|
120
125
|
if model is None:
|
|
121
|
-
return lambda model: self.register(model, **kwargs)
|
|
122
|
-
return self.register(model, **kwargs)
|
|
126
|
+
return lambda model: self.register(model, icon=icon, **kwargs)
|
|
127
|
+
return self.register(model, icon=icon, **kwargs)
|
|
123
128
|
|
|
124
129
|
def get_by_natural_key(self, app_label, model_name):
|
|
125
130
|
"""
|
|
@@ -126,6 +126,15 @@ class TestGenericSettingEditView(BaseTestGenericSettingView):
|
|
|
126
126
|
)
|
|
127
127
|
self.assertEqual(response.status_code, 404)
|
|
128
128
|
|
|
129
|
+
def test_register_with_icon(self):
|
|
130
|
+
edit_url = reverse("wagtailsettings:edit", args=("tests", "IconGenericSetting"))
|
|
131
|
+
edit_response = self.client.get(edit_url, follow=True)
|
|
132
|
+
|
|
133
|
+
self.assertContains(
|
|
134
|
+
edit_response,
|
|
135
|
+
"""<svg class="icon icon-icon-setting-tag w-header__glyph" aria-hidden="true"><use href="#icon-icon-setting-tag"></use></svg>""",
|
|
136
|
+
)
|
|
137
|
+
|
|
129
138
|
def test_edit_invalid(self):
|
|
130
139
|
response = self.post(post_data={"foo": "bar"})
|
|
131
140
|
self.assertContains(response, "The setting could not be saved due to errors.")
|
|
@@ -120,12 +120,21 @@ class TestSiteSettingEditView(BaseTestSiteSettingView):
|
|
|
120
120
|
response = self.get()
|
|
121
121
|
self.assertEqual(response.status_code, 200)
|
|
122
122
|
|
|
123
|
-
def
|
|
123
|
+
def test_non_existent_model(self):
|
|
124
124
|
response = self.client.get(
|
|
125
125
|
reverse("wagtailsettings:edit", args=["test", "foo", 1])
|
|
126
126
|
)
|
|
127
127
|
self.assertEqual(response.status_code, 404)
|
|
128
128
|
|
|
129
|
+
def test_register_with_icon(self):
|
|
130
|
+
edit_url = reverse("wagtailsettings:edit", args=("tests", "IconGenericSetting"))
|
|
131
|
+
edit_response = self.client.get(edit_url, follow=True)
|
|
132
|
+
|
|
133
|
+
self.assertContains(
|
|
134
|
+
edit_response,
|
|
135
|
+
"""<svg class="icon icon-icon-setting-tag w-header__glyph" aria-hidden="true"><use href="#icon-icon-setting-tag"></use></svg>""",
|
|
136
|
+
)
|
|
137
|
+
|
|
129
138
|
def test_edit_invalid(self):
|
|
130
139
|
response = self.post(post_data={"foo": "bar"})
|
|
131
140
|
self.assertContains(response, "The setting could not be saved due to errors.")
|
|
@@ -74,7 +74,7 @@ class SettingModelTestCase(SiteSettingsTestMixin, TestCase):
|
|
|
74
74
|
def test_importantpages_object_is_pickleable(self):
|
|
75
75
|
obj = self._create_importantpagessitesetting_object()
|
|
76
76
|
# Triggers creation of the InvokeViaAttributeShortcut instance,
|
|
77
|
-
# and also gives us a value we can use for
|
|
77
|
+
# and also gives us a value we can use for comparison
|
|
78
78
|
signup_page_url = obj.page_url.sign_up_page
|
|
79
79
|
|
|
80
80
|
# Attempt to pickle ImportantPages instance
|
|
@@ -82,7 +82,7 @@ class SettingModelTestCase(SiteSettingsTestMixin, TestCase):
|
|
|
82
82
|
pickled = pickle.dumps(obj, -1)
|
|
83
83
|
except Exception as e: # noqa: BLE001
|
|
84
84
|
raise AssertionError(
|
|
85
|
-
f"An error
|
|
85
|
+
f"An error occurred when attempting to pickle {obj!r}: {e}"
|
|
86
86
|
)
|
|
87
87
|
|
|
88
88
|
# Now unpickle the pickled ImportantPages
|
|
@@ -90,7 +90,7 @@ class SettingModelTestCase(SiteSettingsTestMixin, TestCase):
|
|
|
90
90
|
unpickled = pickle.loads(pickled)
|
|
91
91
|
except Exception as e: # noqa: BLE001
|
|
92
92
|
raise AssertionError(
|
|
93
|
-
f"An error
|
|
93
|
+
f"An error occurred when attempting to unpickle {obj!r}: {e}"
|
|
94
94
|
)
|
|
95
95
|
|
|
96
96
|
# Using 'page_url' should create a new InvokeViaAttributeShortcut
|
|
@@ -174,7 +174,7 @@ class TestTemplateTag(TemplateTestCase):
|
|
|
174
174
|
|
|
175
175
|
self.assertEqual(template.render(context), "")
|
|
176
176
|
|
|
177
|
-
def
|
|
177
|
+
def test_get_settings_variable_assignment_use_default(self):
|
|
178
178
|
"""
|
|
179
179
|
Check that assigning the setting to a context variable with
|
|
180
180
|
{% get_settings use_default_site=True as wagtail_settings %} works.
|
|
@@ -80,7 +80,6 @@ def redirect_to_relevant_instance(request, app_name, model_name):
|
|
|
80
80
|
|
|
81
81
|
class EditView(generic.EditView):
|
|
82
82
|
template_name = "wagtailsettings/edit.html"
|
|
83
|
-
header_icon = "cogs"
|
|
84
83
|
error_message = gettext_lazy("The setting could not be saved due to errors.")
|
|
85
84
|
|
|
86
85
|
def setup(self, request, app_name, model_name, *args, **kwargs):
|
|
@@ -129,11 +128,14 @@ class EditView(generic.EditView):
|
|
|
129
128
|
|
|
130
129
|
media = form.media + edit_handler.media
|
|
131
130
|
|
|
131
|
+
header_icon = registry._model_icons.get(self.model)
|
|
132
|
+
|
|
132
133
|
context.update(
|
|
133
134
|
{
|
|
134
135
|
"edit_handler": edit_handler,
|
|
135
136
|
"site_switcher": site_switcher,
|
|
136
137
|
"media": media,
|
|
138
|
+
"header_icon": header_icon,
|
|
137
139
|
}
|
|
138
140
|
)
|
|
139
141
|
|
|
@@ -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"
|
|
@@ -160,7 +160,7 @@ class TestConstructSyncedPageTreeListHook(Utils):
|
|
|
160
160
|
# Login to access the admin
|
|
161
161
|
self.login()
|
|
162
162
|
|
|
163
|
-
# Make
|
|
163
|
+
# Make sure the French homepage is published/live
|
|
164
164
|
self.fr_homepage.live = True
|
|
165
165
|
self.fr_homepage.save()
|
|
166
166
|
self.assertTrue(self.en_homepage.live)
|
|
@@ -259,7 +259,7 @@ class TestMovingTranslatedPages(Utils):
|
|
|
259
259
|
self.assertEqual(self.en_blog_post.get_parent().id, self.en_blog_index.id)
|
|
260
260
|
|
|
261
261
|
# Confirm the fr and de blog post pages are under the blog index page
|
|
262
|
-
# We'll confirm these have not moved after
|
|
262
|
+
# We'll confirm these have not moved after the POST request.
|
|
263
263
|
original_translated_parent_ids = [
|
|
264
264
|
p.id for p in self.en_blog_index.get_translations()
|
|
265
265
|
]
|
|
@@ -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"
|
|
@@ -34,26 +34,26 @@ msgstr ""
|
|
|
34
34
|
msgid "Delete image"
|
|
35
35
|
msgstr ""
|
|
36
36
|
|
|
37
|
-
#: views.py:
|
|
37
|
+
#: views.py:110 wagtail_hooks.py:20
|
|
38
38
|
msgid "Styleguide"
|
|
39
39
|
msgstr ""
|
|
40
40
|
|
|
41
|
-
#: views.py:
|
|
41
|
+
#: views.py:118
|
|
42
42
|
msgid "Success message"
|
|
43
43
|
msgstr ""
|
|
44
44
|
|
|
45
|
-
#: views.py:
|
|
45
|
+
#: views.py:120 views.py:128 views.py:136
|
|
46
46
|
msgid "View live"
|
|
47
47
|
msgstr ""
|
|
48
48
|
|
|
49
|
-
#: views.py:
|
|
49
|
+
#: views.py:121 views.py:129 views.py:137
|
|
50
50
|
msgid "Edit"
|
|
51
51
|
msgstr ""
|
|
52
52
|
|
|
53
|
-
#: views.py:
|
|
53
|
+
#: views.py:126
|
|
54
54
|
msgid "Warning message"
|
|
55
55
|
msgstr ""
|
|
56
56
|
|
|
57
|
-
#: views.py:
|
|
57
|
+
#: views.py:134
|
|
58
58
|
msgid "Error message"
|
|
59
59
|
msgstr ""
|
|
Binary file
|
|
@@ -16,8 +16,8 @@ msgstr ""
|
|
|
16
16
|
"Content-Type: text/plain; charset=UTF-8\n"
|
|
17
17
|
"Content-Transfer-Encoding: 8bit\n"
|
|
18
18
|
"Language: he_IL\n"
|
|
19
|
-
"Plural-Forms: nplurals=
|
|
20
|
-
"1 == 0) ? 1:
|
|
19
|
+
"Plural-Forms: nplurals=3; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % "
|
|
20
|
+
"1 == 0) ? 1: 2;\n"
|
|
21
21
|
|
|
22
22
|
msgid "Save"
|
|
23
23
|
msgstr "שמור"
|
|
@@ -130,9 +130,9 @@ class TableBlock(FieldBlock):
|
|
|
130
130
|
"""
|
|
131
131
|
If value came from a table block stored before Wagtail 6.0, we need to set an appropriate
|
|
132
132
|
value for the header choice. I would really like to have this default to "" and force the
|
|
133
|
-
editor to reaffirm they don't want any headers, but that
|
|
133
|
+
editor to reaffirm they don't want any headers, but that would be a breaking change.
|
|
134
134
|
"""
|
|
135
|
-
if not value.get("table_header_choice", ""):
|
|
135
|
+
if value and not value.get("table_header_choice", ""):
|
|
136
136
|
if value.get("first_row_is_table_header", False) and value.get(
|
|
137
137
|
"first_col_is_header", False
|
|
138
138
|
):
|