From dc125f6446d9d96c681693ffa85baba586b17671 Mon Sep 17 00:00:00 2001 From: Fabian Braun Date: Thu, 11 Jan 2024 18:34:25 +0100 Subject: [PATCH 1/8] Add redirection after creating a new page content object (also to be reusable for other toolbar objects) --- cms/admin/forms.py | 5 +++++ cms/admin/pageadmin.py | 11 +++++++++++ cms/constants.py | 2 ++ cms/static/cms/js/modules/cms.modal.js | 14 ++++++++++++++ 4 files changed, 32 insertions(+) diff --git a/cms/admin/forms.py b/cms/admin/forms.py index 30d3827a120..e8edbf361eb 100644 --- a/cms/admin/forms.py +++ b/cms/admin/forms.py @@ -247,6 +247,11 @@ class AddPageForm(BasePageContentForm): required=False, widget=forms.HiddenInput(), ) + edit = forms.IntegerField( + # Got to edit/preview mode after adding + required=False, + widget=forms.HiddenInput(), + ) content_defaults = { 'in_navigation': True, } diff --git a/cms/admin/pageadmin.py b/cms/admin/pageadmin.py index 652652a1109..3eb170065c0 100644 --- a/cms/admin/pageadmin.py +++ b/cms/admin/pageadmin.py @@ -50,6 +50,7 @@ ) from cms.admin.permissionadmin import PERMISSION_ADMIN_INLINES from cms.cache.permissions import clear_permission_cache +from cms.constants import MODAL_HTML_REDIRECT from cms.models import ( CMSPlugin, EmptyPageContent, @@ -65,6 +66,7 @@ ) from cms.plugin_pool import plugin_pool from cms.signals.apphook import set_restart_trigger +from cms.toolbar.utils import get_object_edit_url from cms.utils import get_current_site, page_permissions, permissions from cms.utils.admin import jsonify_request from cms.utils.conf import get_cms_setting @@ -990,6 +992,15 @@ def change_view(self, request, object_id, form_url='', extra_context=None): return super().change_view(request, object_id, form_url=form_url, extra_context=context) + def response_add(self, request, obj): + redirect = request.POST.get("edit", False) + if redirect == "1": + # redirect to the edit view if added from the toolbar + url = get_object_edit_url(obj) # Redirects to preview if necessary + return HttpResponse(MODAL_HTML_REDIRECT.format(url=url)) + return super().response_add(request, obj) + + def get_filled_languages(self, request, page): site_id = get_site(request).pk filled_languages = page.get_languages() diff --git a/cms/constants.py b/cms/constants.py index 8aecb688948..7ecb64b38d1 100644 --- a/cms/constants.py +++ b/cms/constants.py @@ -78,3 +78,5 @@ SCRIPT_USERNAME = 'script' CMS_CONFIG_NAME = 'cms_config' + +MODAL_HTML_REDIRECT = 'Redirecting...' diff --git a/cms/static/cms/js/modules/cms.modal.js b/cms/static/cms/js/modules/cms.modal.js index 011cc757239..139e427718f 100644 --- a/cms/static/cms/js/modules/cms.modal.js +++ b/cms/static/cms/js/modules/cms.modal.js @@ -910,6 +910,20 @@ class Modal { return; } + // check if we are redirected - should only happen after successful form submission + var redirect = body.find('a.cms-view-new-object'); + console.log(body.html() + " - " + redirect.attr('href') + " - " + redirect.length); + if (redirect.length > 0) { + var url = redirect.attr('href'); + console.log("Url: " + url); + if (url) { + Helpers.reloadBrowser(redirect.attr('href'), false); + return true; + } + } + + + // tabindex is required for keyboard navigation // body.attr('tabindex', '0'); iframe.on('focus', function() { From faa71b768d838ef365c632f6b08b677be7a78eab Mon Sep 17 00:00:00 2001 From: Fabian Braun Date: Thu, 11 Jan 2024 18:37:31 +0100 Subject: [PATCH 2/8] Remove cosole.logs --- cms/static/cms/js/modules/cms.modal.js | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/cms/static/cms/js/modules/cms.modal.js b/cms/static/cms/js/modules/cms.modal.js index 139e427718f..a1a0af5111c 100644 --- a/cms/static/cms/js/modules/cms.modal.js +++ b/cms/static/cms/js/modules/cms.modal.js @@ -911,15 +911,10 @@ class Modal { } // check if we are redirected - should only happen after successful form submission - var redirect = body.find('a.cms-view-new-object'); - console.log(body.html() + " - " + redirect.attr('href') + " - " + redirect.length); - if (redirect.length > 0) { - var url = redirect.attr('href'); - console.log("Url: " + url); - if (url) { - Helpers.reloadBrowser(redirect.attr('href'), false); - return true; - } + var redirect = body.find('a.cms-view-new-object').attr("href"); + if (redirect) { + Helpers.reloadBrowser(redirect, false); + return true; } From 0ccb4fc5ac733f805def08f8f6a4860e5dc642eb Mon Sep 17 00:00:00 2001 From: Jacob Rief Date: Mon, 5 Feb 2024 13:06:21 +0100 Subject: [PATCH 3/8] attempt to fix #7804: invalidate cache after adding sub-page --- cms/admin/pageadmin.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cms/admin/pageadmin.py b/cms/admin/pageadmin.py index 3eb170065c0..d7ccaecf7ab 100644 --- a/cms/admin/pageadmin.py +++ b/cms/admin/pageadmin.py @@ -995,6 +995,10 @@ def change_view(self, request, object_id, form_url='', extra_context=None): def response_add(self, request, obj): redirect = request.POST.get("edit", False) if redirect == "1": + from django.core.cache import cache + from cms.cache.permissions import get_cache_key, get_cache_permission_version + cache.delete(get_cache_key(request.user, 'change_page'), version=get_cache_permission_version()) + # redirect to the edit view if added from the toolbar url = get_object_edit_url(obj) # Redirects to preview if necessary return HttpResponse(MODAL_HTML_REDIRECT.format(url=url)) From 814ea110c8ff0aa3693c846e459f10374cd5ea21 Mon Sep 17 00:00:00 2001 From: Jacob Rief Date: Wed, 28 Feb 2024 16:55:10 +0100 Subject: [PATCH 4/8] fix #7826 --- cms/cms_toolbars.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cms/cms_toolbars.py b/cms/cms_toolbars.py index 167e294246e..c31e160c805 100644 --- a/cms/cms_toolbars.py +++ b/cms/cms_toolbars.py @@ -499,7 +499,9 @@ def change_language_menu(self): page_add_url = admin_reverse('cms_pagecontent_add') for code, name in add: - url = add_url_parameters(page_add_url, cms_page=self.page.pk, language=code) + url = add_url_parameters( + page_add_url, cms_page=self.page.pk, parent_node=self.page.node.id, language=code + ) add_plugins_menu.add_modal_item(name, url=url) if remove: From bb63ecf06b46e748ae39e5708d5374251d57978a Mon Sep 17 00:00:00 2001 From: Fabian Braun Date: Tue, 2 Apr 2024 17:45:36 +0200 Subject: [PATCH 5/8] Fix js linting --- cms/static/cms/js/modules/cms.modal.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/cms/static/cms/js/modules/cms.modal.js b/cms/static/cms/js/modules/cms.modal.js index a1a0af5111c..7fe59a5def3 100644 --- a/cms/static/cms/js/modules/cms.modal.js +++ b/cms/static/cms/js/modules/cms.modal.js @@ -911,14 +911,13 @@ class Modal { } // check if we are redirected - should only happen after successful form submission - var redirect = body.find('a.cms-view-new-object').attr("href"); + var redirect = body.find('a.cms-view-new-object').attr('href'); + if (redirect) { Helpers.reloadBrowser(redirect, false); return true; } - - // tabindex is required for keyboard navigation // body.attr('tabindex', '0'); iframe.on('focus', function() { From a1fb5eaac8e7361d3a1aa3eb6445eafcf5ae2b22 Mon Sep 17 00:00:00 2001 From: Fabian Braun Date: Tue, 2 Apr 2024 17:48:13 +0200 Subject: [PATCH 6/8] Fix python linting --- cms/admin/pageadmin.py | 1 + 1 file changed, 1 insertion(+) diff --git a/cms/admin/pageadmin.py b/cms/admin/pageadmin.py index d7ccaecf7ab..cd1a28ac072 100644 --- a/cms/admin/pageadmin.py +++ b/cms/admin/pageadmin.py @@ -996,6 +996,7 @@ def response_add(self, request, obj): redirect = request.POST.get("edit", False) if redirect == "1": from django.core.cache import cache + from cms.cache.permissions import get_cache_key, get_cache_permission_version cache.delete(get_cache_key(request.user, 'change_page'), version=get_cache_permission_version()) From 4bfadf99607b16952094ec468707fc6d88402918 Mon Sep 17 00:00:00 2001 From: Fabian Braun Date: Tue, 2 Apr 2024 23:01:17 +0200 Subject: [PATCH 7/8] Add `get_pagecontent_obj` to CMSTestCase` --- cms/test_utils/testcases.py | 10 ++++ cms/tests/test_admin.py | 2 +- cms/tests/test_cache.py | 2 +- cms/tests/test_extensions.py | 2 +- cms/tests/test_page_admin.py | 25 +++++++- cms/tests/test_placeholder.py | 6 +- cms/tests/test_plugins.py | 2 +- cms/tests/test_rendering.py | 4 +- cms/tests/test_templatetags.py | 10 ++-- cms/tests/test_toolbar.py | 106 ++++++++++++++++----------------- cms/tests/test_toolbar_pool.py | 2 +- 11 files changed, 100 insertions(+), 71 deletions(-) diff --git a/cms/test_utils/testcases.py b/cms/test_utils/testcases.py index ea3bbc9777a..2bb3387fbd3 100644 --- a/cms/test_utils/testcases.py +++ b/cms/test_utils/testcases.py @@ -152,6 +152,16 @@ def add_page_permission(self, user, page, **kwargs): return pp def get_page_title_obj(self, page, language="en"): + import warnings + + warnings.warn( + "get_page_title_obj is deprecated, use get_pagecontent_obj instead", + DeprecationWarning, + stacklevel=2, + ) + return PageContent.objects.get(page=page, language=language) + + def get_pagecontent_obj(self, page, language="en"): return PageContent.objects.get(page=page, language=language) def _create_user(self, username, is_staff=False, is_superuser=False, diff --git a/cms/tests/test_admin.py b/cms/tests/test_admin.py index 7f8254dfabb..faf818e0dd7 100644 --- a/cms/tests/test_admin.py +++ b/cms/tests/test_admin.py @@ -372,7 +372,7 @@ def get_page(self): def test_change_innavigation(self): page = self.get_page() - content = self.get_page_title_obj(page, 'en') + content = self.get_pagecontent_obj(page, 'en') permless = self.get_permless() admin_user = self.get_admin() pagecontent_admin = self.pagecontent_admin_class diff --git a/cms/tests/test_cache.py b/cms/tests/test_cache.py index 1380f69f62b..2783590c1ee 100644 --- a/cms/tests/test_cache.py +++ b/cms/tests/test_cache.py @@ -449,7 +449,7 @@ def test_no_page_cache_on_toolbar_edit(self): superuser = self.get_superuser() # Create a test page page = create_page('test page 1', 'nav_playground.html', 'en') - page_content = self.get_page_title_obj(page) + page_content = self.get_pagecontent_obj(page) page_url = page.get_absolute_url() page_edit_url = get_object_edit_url(page_content) diff --git a/cms/tests/test_extensions.py b/cms/tests/test_extensions.py index 91def2d7c8b..34907e2524b 100644 --- a/cms/tests/test_extensions.py +++ b/cms/tests/test_extensions.py @@ -288,7 +288,7 @@ def setUp(self): def test_duplicate_extensions(self): with self.login_user_context(self.admin): - content = self.get_page_title_obj(self.page, 'en') + content = self.get_pagecontent_obj(self.page, 'en') # create page copy page_data = { 'title': 'type1', 'slug': 'type1', '_save': 1, 'template': 'nav_playground.html', diff --git a/cms/tests/test_page_admin.py b/cms/tests/test_page_admin.py index 11b1d982b98..2ccd8962fd0 100644 --- a/cms/tests/test_page_admin.py +++ b/cms/tests/test_page_admin.py @@ -1313,7 +1313,7 @@ def test_form_url_page_change(self): with self.login_user_context(superuser): content_admin = PageContentAdmin(PageContent, admin.site) page = self.get_page() - content = self.get_page_title_obj(page, 'en') + content = self.get_pagecontent_obj(page, 'en') form_url = self.get_page_change_uri('en', page) # Middleware is needed to correctly setup the environment for the admin request = self.get_request() @@ -1561,6 +1561,25 @@ def test_page_tree_render_localized_page_ids(self): self.assertEqual(response.status_code, 200) +class PageActionsTestCase(PageTestBase): + def test_add_page(self): + with self.login_user_context(self.admin): + content = self.get_pagecontent_obj(self.page, 'en') + # create page copy + page_data = { + 'title': 'type1', 'slug': 'type1', '_save': 1, 'template': 'nav_playground.html', + 'site': 1, 'language': 'en', 'source': self.page.pk, + } + self.assertEqual(Page.objects.all().count(), 2) + response = self.client.post( + self.get_admin_url(PageContent, 'duplicate', content.pk), + data=page_data, + ) + # Check that page and its extensions have been copied + self.assertRedirects(response, self.get_pages_admin_list_uri('en')) + self.assertEqual(Page.objects.all().count(), 3) + + class PermissionsTestCase(PageTestBase): def _add_translation_to_page(self, page): @@ -2915,7 +2934,7 @@ def test_user_can_copy_plugins_to_language(self): """ page = self.get_permissions_test_page() staff_user = self.get_staff_user_with_no_permissions() - source_translation = self.get_page_title_obj(page, 'en') + source_translation = self.get_pagecontent_obj(page, 'en') target_translation = self._add_translation_to_page(page) endpoint = self.get_admin_url(PageContent, 'copy_language', source_translation.pk) plugins = [ @@ -4323,7 +4342,7 @@ def test_user_can_copy_plugins_to_language(self): """ page = self._permissions_page staff_user = self.get_staff_user_with_no_permissions() - source_translation = self.get_page_title_obj(page, 'en') + source_translation = self.get_pagecontent_obj(page, 'en') target_translation = self._add_translation_to_page(page) endpoint = self.get_admin_url(PageContent, 'copy_language', source_translation.pk) plugins = [ diff --git a/cms/tests/test_placeholder.py b/cms/tests/test_placeholder.py index 8f87875a3e3..fccfbacc6b8 100644 --- a/cms/tests/test_placeholder.py +++ b/cms/tests/test_placeholder.py @@ -879,7 +879,7 @@ def test_sets_source_when_title_is_created(self): page = create_page('test page en', 'col_two.html', 'en') # check for en - page_content_en = self.get_page_title_obj(page) + page_content_en = self.get_pagecontent_obj(page) self.assertQuerySetEqual( Placeholder.objects.get_for_obj(page_content_en), page_content_en.get_placeholders(), @@ -906,8 +906,8 @@ def test_sets_source_when_title_is_copied(self): with self.login_user_context(self.get_superuser()): new_page = self.copy_page(page, page, position=1) - page_content = self.get_page_title_obj(page) - new_page_content = self.get_page_title_obj(new_page) + page_content = self.get_pagecontent_obj(page) + new_page_content = self.get_pagecontent_obj(new_page) page_content_plhs = Placeholder.objects.get_for_obj(page_content) new_page_content_plhs = Placeholder.objects.get_for_obj(new_page_content) self.assertEqual(page_content_plhs.count(), new_page_content_plhs.count()) diff --git a/cms/tests/test_plugins.py b/cms/tests/test_plugins.py index a342e2e78a4..8d8a332179f 100644 --- a/cms/tests/test_plugins.py +++ b/cms/tests/test_plugins.py @@ -823,7 +823,7 @@ def test_plugin_toolbar_struct(self): def test_plugin_toolbar_struct_permissions(self): page = self.get_permissions_test_page() - page_content = self.get_page_title_obj(page) + page_content = self.get_pagecontent_obj(page) page_edit_url = get_object_edit_url(page_content) staff_user = self.get_staff_user_with_no_permissions() placeholder = page.get_placeholders('en').get(slot='body') diff --git a/cms/tests/test_rendering.py b/cms/tests/test_rendering.py index 138b64d238e..9db2959eab4 100644 --- a/cms/tests/test_rendering.py +++ b/cms/tests/test_rendering.py @@ -721,7 +721,7 @@ def test_render_placeholder_toolbar(self): placeholder.pk = placeholder.id = 99 with self.login_user_context(self.get_superuser()): - page_content = self.get_page_title_obj(self.test_page) + page_content = self.get_pagecontent_obj(self.test_page) request = self.get_request(get_object_edit_url(page_content)) request.session = {} request.toolbar = CMSToolbar(request) @@ -758,7 +758,7 @@ def test_render_plugin_toolbar_markup(self): ] with self.login_user_context(self.get_superuser()): - page_content = self.get_page_title_obj(page) + page_content = self.get_pagecontent_obj(page) request = self.get_request(get_object_edit_url(page_content)) request.session = {} request.toolbar = CMSToolbar(request) diff --git a/cms/tests/test_templatetags.py b/cms/tests/test_templatetags.py index 23f02c88e23..b4b25b97246 100644 --- a/cms/tests/test_templatetags.py +++ b/cms/tests/test_templatetags.py @@ -462,7 +462,7 @@ def test_render_plugin_editable(self): from django.core.cache import cache cache.clear() page = create_page('Test', 'col_two.html', 'en') - page_content = self.get_page_title_obj(page) + page_content = self.get_pagecontent_obj(page) placeholder = page.get_placeholders('en')[0] plugin = add_plugin(placeholder, TextPlugin, 'en', body='Test') template = "{% load cms_tags %}{% render_plugin plugin %}" @@ -500,7 +500,7 @@ def test_render_plugin_not_editable(self): def test_render_plugin_no_context(self): page = create_page('Test', 'col_two.html', 'en') - page_content = self.get_page_title_obj(page) + page_content = self.get_pagecontent_obj(page) placeholder = Placeholder.objects.create(slot='test') plugin = add_plugin(placeholder, TextPlugin, 'en', body='Test') superuser = self.get_superuser() @@ -557,7 +557,7 @@ def test_render_model_with_deferred_fields(self): Category.objects.create(name='foo', depth=1) cache.clear() page = create_page('Test', 'col_two.html', 'en') - page_content = self.get_page_title_obj(page) + page_content = self.get_pagecontent_obj(page) template = "{% load cms_tags %}{% render_model category 'name' %}" user = self._create_user("admin", True, True) request = RequestFactory().get(get_object_edit_url(page_content)) @@ -589,7 +589,7 @@ def test_render_model_add(self): cache.clear() page = create_page('Test', 'col_two.html', 'en') - page_content = self.get_page_title_obj(page) + page_content = self.get_pagecontent_obj(page) template = "{% load cms_tags %}{% render_model_add category %}" user = self._create_user("admin", True, True) request = RequestFactory().get(get_object_edit_url(page_content)) @@ -627,7 +627,7 @@ def test_render_model_add_block(self): cache.clear() page = create_page('Test', 'col_two.html', 'en') - page_content = self.get_page_title_obj(page) + page_content = self.get_pagecontent_obj(page) template = "{% load cms_tags %}{% render_model_add_block category %}wrapped{% endrender_model_add_block %}" user = self._create_user("admin", True, True) request = RequestFactory().get(get_object_edit_url(page_content)) diff --git a/cms/tests/test_toolbar.py b/cms/tests/test_toolbar.py index acac3a84cb7..5818df1e899 100644 --- a/cms/tests/test_toolbar.py +++ b/cms/tests/test_toolbar.py @@ -200,7 +200,7 @@ def test_toolbar_media(self): old_pool = toolbar_pool.toolbars toolbar_pool.clear() cms_page = create_page("toolbar-page", "col_two.html", "en") - page_content = self.get_page_title_obj(cms_page) + page_content = self.get_pagecontent_obj(cms_page) endpoint = get_object_edit_url(page_content) with self.login_user_context(self.get_superuser()): @@ -215,7 +215,7 @@ def test_toolbar_media(self): def test_toolbar_request_endpoint_validation(self): endpoint = self.get_admin_url(UserSettings, 'get_toolbar') cms_page = create_page("toolbar-page", "col_two.html", "en") - page_content = self.get_page_title_obj(cms_page) + page_content = self.get_pagecontent_obj(cms_page) with self.login_user_context(self.get_superuser()): response = self.client.get( @@ -344,7 +344,7 @@ def test_nonstaff(self): @override_settings(CMS_PERMISSION=True) def test_template_change_permission(self): page = create_page('test', 'nav_playground.html', 'en') - page_content = self.get_page_title_obj(page) + page_content = self.get_pagecontent_obj(page) edit_url = get_object_edit_url(page_content) # Staff user with change page permissions only @@ -383,7 +383,7 @@ def test_template_change_permission(self): def test_markup(self): page = create_page("toolbar-page", "nav_playground.html", "en") - page_content = self.get_page_title_obj(page) + page_content = self.get_pagecontent_obj(page) page_edit_url = get_object_edit_url(page_content) superuser = self.get_superuser() @@ -436,7 +436,7 @@ def test_placeholder_buttons_on_app_page(self): def test_markup_generic_module(self): page = create_page("toolbar-page", "col_two.html", "en") - page_content = self.get_page_title_obj(page) + page_content = self.get_pagecontent_obj(page) page_structure_url = get_object_structure_url(page_content) superuser = self.get_superuser() @@ -449,7 +449,7 @@ def test_markup_generic_module(self): def test_markup_link_custom_module(self): superuser = self.get_superuser() page = create_page("toolbar-page", "col_two.html", "en") - page_content = self.get_page_title_obj(page) + page_content = self.get_pagecontent_obj(page) page_structure_url = get_object_structure_url(page_content) with self.login_user_context(superuser): @@ -465,7 +465,7 @@ def test_markup_link_custom_module(self): def test_placeholder_menu_items(self): superuser = self.get_superuser() page = create_page("toolbar-page", "col_two.html", "en") - page_content = self.get_page_title_obj(page) + page_content = self.get_pagecontent_obj(page) page_structure_url = get_object_structure_url(page_content) placeholders = page_content.get_placeholders() self.assertEqual(len(placeholders), 2) # we get two placeholders @@ -495,7 +495,7 @@ def test_placeholder_menu_items(self): def test_markup_plugin_template(self): page = create_page("toolbar-page-1", "col_two.html", "en") - page_content = self.get_page_title_obj(page) + page_content = self.get_pagecontent_obj(page) page_edit_url = get_object_edit_url(page_content) plugin_1 = add_plugin( page.get_placeholders("en").get(slot='col_left'), language='en', @@ -564,7 +564,7 @@ def get_delete_url(pk): def test_show_toolbar_staff(self): page = create_page("toolbar-page", "nav_playground.html", "en") - page_content = self.get_page_title_obj(page) + page_content = self.get_pagecontent_obj(page) edit_url = get_object_edit_url(page_content) request = self.get_page_request(page, self.get_staff(), edit_url) toolbar = CMSToolbar(request) @@ -572,7 +572,7 @@ def test_show_toolbar_staff(self): def test_hide_toolbar_non_staff(self): page = create_page("toolbar-page", "nav_playground.html", "en") - page_content = self.get_page_title_obj(page) + page_content = self.get_pagecontent_obj(page) edit_url = get_object_edit_url(page_content) request = self.get_page_request(page, self.get_nonstaff(), edit_url) toolbar = CMSToolbar(request) @@ -588,7 +588,7 @@ def test_hide_toolbar_disabled(self): def test_show_disabled_toolbar_with_edit(self): page = create_page("toolbar-page", "nav_playground.html", "en") - page_content = self.get_page_title_obj(page) + page_content = self.get_pagecontent_obj(page) edit_url = get_object_edit_url(page_content) request = self.get_page_request(page, self.get_staff(), edit_url, disable=True) self.assertFalse(request.session.get('cms_toolbar_disabled')) @@ -641,7 +641,7 @@ def test_show_toolbar_without_edit(self): def test_no_change_button(self): page = create_page('test', 'nav_playground.html', 'en') - page_content = self.get_page_title_obj(page) + page_content = self.get_pagecontent_obj(page) edit_url = get_object_edit_url(page_content) user = self.get_staff() user.user_permissions.all().delete() @@ -665,7 +665,7 @@ def test_button_consistency_staff(self): """ user = self.get_staff() cms_page = create_page('test-en', 'nav_playground.html', 'en') - page_content_en = self.get_page_title_obj(cms_page) + page_content_en = self.get_pagecontent_obj(cms_page) edit_url_en = get_object_edit_url(page_content_en) page_content_de = create_page_content('de', 'test-de', cms_page) edit_url_de = get_object_edit_url(page_content_de) @@ -694,7 +694,7 @@ def test_double_menus(self): for code, verbose in get_language_tuple(): if code != "en": create_page_content(code, f"test {code}", page) - page_content = self.get_page_title_obj(page) + page_content = self.get_pagecontent_obj(page) edit_url = get_object_edit_url(page_content) en_request = self.get_page_request(None, user, edit_url) toolbar = CMSToolbar(en_request) @@ -716,7 +716,7 @@ def test_double_menus(self): def test_placeholder_name(self): superuser = self.get_superuser() page = create_page("toolbar-page", "col_two.html", "en") - page_content = self.get_page_title_obj(page) + page_content = self.get_pagecontent_obj(page) page_edit_url = get_object_edit_url(page_content) with self.login_user_context(superuser): @@ -732,7 +732,7 @@ def test_user_settings(self): def test_remove_lang(self): page = create_page('test', 'nav_playground.html', 'en') - page_content = self.get_page_title_obj(page) + page_content = self.get_pagecontent_obj(page) page_edit_url = get_object_edit_url(page_content) superuser = self.get_superuser() with self.login_user_context(superuser): @@ -827,7 +827,7 @@ def test_remove_language(self): ) create_page_content(title="de page", language="de", page=page) create_page_content(title="fr page", language="fr", page=page) - page_content_en = self.get_page_title_obj(page) + page_content_en = self.get_pagecontent_obj(page) edit_url_en = get_object_edit_url(page_content_en) request = self.get_page_request(page, self.get_staff(), edit_url_en) @@ -860,7 +860,7 @@ def test_remove_language(self): def test_add_language(self): page = create_page("tbp", "nav_playground.html", "en") - page_content = self.get_page_title_obj(page) + page_content = self.get_pagecontent_obj(page) edit_url = get_object_edit_url(page_content) request = self.get_page_request(page, self.get_staff(), edit_url) self.assertMenuItems( @@ -877,7 +877,7 @@ def test_add_language(self): def test_copy_plugins(self): page = create_page("tbp", "nav_playground.html", "en") - title_en = self.get_page_title_obj(page) + title_en = self.get_pagecontent_obj(page) edit_url_en = get_object_edit_url(title_en) title_de = create_page_content('de', 'de page', page, template='nav_playground.html') edit_url_de = get_object_edit_url(title_de) @@ -926,7 +926,7 @@ def test_toolbar_logout(self): superuser.save() page = create_page("home", "nav_playground.html", "en") - page_content = self.get_page_title_obj(page) + page_content = self.get_pagecontent_obj(page) page_edit_url = get_object_edit_url(page_content) self.get_page_request(page, superuser, '/') # @@ -948,7 +948,7 @@ def test_toolbar_logout(self): superuser.save() # Sanity check... self.get_page_request(page, superuser, '/') - page_content = self.get_page_title_obj(page) + page_content = self.get_pagecontent_obj(page) page_edit_url = get_object_edit_url(page_content) with self.login_user_context(superuser): response = self.client.get(page_edit_url) @@ -969,16 +969,16 @@ def test_toolbar_logout_redirect(self): page0 = create_page("home", "nav_playground.html", "en") page1 = create_page("internal", "nav_playground.html", "en", parent=page0) - page1_content = self.get_page_title_obj(page1) + page1_content = self.get_pagecontent_obj(page1) page1_edit_url = get_object_edit_url(page1_content) create_page("unpublished", "nav_playground.html", "en", parent=page0) page3 = create_page("login_restricted", "nav_playground.html", "en", parent=page0, login_required=True) - page3_content = self.get_page_title_obj(page3) + page3_content = self.get_pagecontent_obj(page3) page3_edit_url = get_object_edit_url(page3_content) page4 = create_page("view_restricted", "nav_playground.html", "en", parent=page0) - page4_content = self.get_page_title_obj(page4) + page4_content = self.get_pagecontent_obj(page4) page4_edit_url = get_object_edit_url(page4_content) PagePermission.objects.create(page=page4, can_view=True, user=superuser) @@ -1016,7 +1016,7 @@ def tearDown(self): def test_markup_toolbar_url_model(self): superuser = self.get_superuser() page = create_page('Test', 'col_two.html', 'en') - page_content = self.get_page_title_obj(page) + page_content = self.get_pagecontent_obj(page) edit_url = get_object_edit_url(page_content) preview_url = get_object_preview_url(page_content) ex1 = self._get_example_obj() @@ -1053,7 +1053,7 @@ def test_noedit(self): def test_edit(self): user = self.get_staff() page = create_page('Test', 'col_two.html', 'en') - page_content = self.get_page_title_obj(page) + page_content = self.get_pagecontent_obj(page) edit_url = get_object_edit_url(page_content) ex1 = self._get_example_obj() @@ -1072,7 +1072,7 @@ def test_edit(self): def test_invalid_item(self): user = self.get_staff() page = create_page('Test', 'col_two.html', 'en') - page_content = self.get_page_title_obj(page) + page_content = self.get_pagecontent_obj(page) edit_url = get_object_edit_url(page_content) ex1 = self._get_example_obj() @@ -1095,7 +1095,7 @@ def test_invalid_item(self): def test_as_varname(self): user = self.get_staff() page = create_page('Test', 'col_two.html', 'en') - page_content = self.get_page_title_obj(page) + page_content = self.get_pagecontent_obj(page) edit_url = get_object_edit_url(page_content) ex1 = self._get_example_obj() @@ -1121,7 +1121,7 @@ def test_edit_render_placeholder(self): """ user = self.get_staff() page = create_page('Test', 'col_two.html', 'en') - page_content = self.get_page_title_obj(page) + page_content = self.get_pagecontent_obj(page) edit_url = get_object_edit_url(page_content) ex1 = self._get_example_obj() @@ -1180,7 +1180,7 @@ def test_edit_render_placeholder(self): def test_filters(self): user = self.get_staff() page = create_page('Test', 'col_two.html', 'en') - page_content = self.get_page_title_obj(page) + page_content = self.get_pagecontent_obj(page) edit_url = get_object_edit_url(page_content) ex1 = Example1(char_1="char_1,

hello

,

hello

,

hello

,

hello

", char_2="char_2", char_3="char_3", @@ -1232,7 +1232,7 @@ def test_setting_override(self): ''' user = self.get_staff() page = create_page('Test', 'col_two.html', 'en') - page_content = self.get_page_title_obj(page) + page_content = self.get_pagecontent_obj(page) edit_url = get_object_edit_url(page_content) ex1 = Example1(char_1="char_1,

hello

,

hello

,

hello

,

hello

", char_2="char_2", char_3="char_3", @@ -1255,7 +1255,7 @@ def test_filters_date(self): with self.settings(USE_L10N=False, DATE_FORMAT="M. d, Y"): user = self.get_staff() page = create_page('Test', 'col_two.html', 'en') - page_content = self.get_page_title_obj(page) + page_content = self.get_pagecontent_obj(page) edit_url = get_object_edit_url(page_content) ex1 = Example1(char_1="char_1,

hello

,

hello

,

hello

,

hello

", char_2="char_2", @@ -1379,7 +1379,7 @@ def test_no_cms(self): def test_icon_tag(self): user = self.get_staff() page = create_page('Test', 'col_two.html', 'en') - page_content = self.get_page_title_obj(page) + page_content = self.get_pagecontent_obj(page) edit_url = get_object_edit_url(page_content) ex1 = self._get_example_obj() template_text = '''{% extends "base.html" %} @@ -1404,7 +1404,7 @@ def test_icon_tag(self): def test_icon_followed_by_render_model_block_tag(self): user = self.get_staff() page = create_page('Test', 'col_two.html', 'en') - page_content = self.get_page_title_obj(page) + page_content = self.get_pagecontent_obj(page) edit_url = get_object_edit_url(page_content) ex1 = self._get_example_obj() template_text = '''{% extends "base.html" %} @@ -1436,7 +1436,7 @@ def test_icon_followed_by_render_model_block_tag(self): def test_add_tag(self): user = self.get_staff() page = create_page('Test', 'col_two.html', 'en') - page_content = self.get_page_title_obj(page) + page_content = self.get_pagecontent_obj(page) edit_url = get_object_edit_url(page_content) ex1 = self._get_example_obj() template_text = '''{% extends "base.html" %} @@ -1461,7 +1461,7 @@ def test_add_tag(self): def test_add_tag_class(self): user = self.get_staff() page = create_page('Test', 'col_two.html', 'en') - page_content = self.get_page_title_obj(page) + page_content = self.get_pagecontent_obj(page) edit_url = get_object_edit_url(page_content) ex1 = self._get_example_obj() template_text = '''{% extends "base.html" %} @@ -1486,7 +1486,7 @@ def test_add_tag_class(self): def test_add_tag_classview(self): user = self.get_staff() page = create_page('Test', 'col_two.html', 'en') - page_content = self.get_page_title_obj(page) + page_content = self.get_pagecontent_obj(page) edit_url = get_object_edit_url(page_content) ex1 = self._get_example_obj() template_text = '''{% extends "base.html" %} @@ -1512,7 +1512,7 @@ def test_add_tag_classview(self): def test_block_tag(self): user = self.get_staff() page = create_page('Test', 'col_two.html', 'en') - page_content = self.get_page_title_obj(page) + page_content = self.get_pagecontent_obj(page) edit_url = get_object_edit_url(page_content) ex1 = Example1(char_1="char_1", char_2="char_2", char_3="char_3", char_4="char_4", date_field=datetime.date(2012, 1, 1)) @@ -1640,7 +1640,7 @@ def test_block_tag(self): def test_invalid_attribute(self): user = self.get_staff() page = create_page('Test', 'col_two.html', 'en') - page_content = self.get_page_title_obj(page) + page_content = self.get_pagecontent_obj(page) edit_url = get_object_edit_url(page_content) ex1 = self._get_example_obj() template_text = '''{% extends "base.html" %} @@ -1687,7 +1687,7 @@ def test_invalid_attribute(self): def test_callable_item(self): user = self.get_staff() page = create_page('Test', 'col_two.html', 'en') - page_content = self.get_page_title_obj(page) + page_content = self.get_pagecontent_obj(page) edit_url = get_object_edit_url(page_content) ex1 = self._get_example_obj() template_text = '''{% extends "base.html" %} @@ -1712,7 +1712,7 @@ def test_callable_item(self): def test_view_method(self): user = self.get_staff() page = create_page('Test', 'col_two.html', 'en') - page_content = self.get_page_title_obj(page) + page_content = self.get_pagecontent_obj(page) edit_url = get_object_edit_url(page_content) ex1 = self._get_example_obj() template_text = '''{% extends "base.html" %} @@ -1730,7 +1730,7 @@ def test_view_method(self): def test_view_url(self): user = self.get_staff() page = create_page('Test', 'col_two.html', 'en') - page_content = self.get_page_title_obj(page) + page_content = self.get_pagecontent_obj(page) edit_url = get_object_edit_url(page_content) ex1 = self._get_example_obj() template_text = '''{% extends "base.html" %} @@ -1749,7 +1749,7 @@ def test_view_url(self): def test_method_attribute(self): user = self.get_staff() page = create_page('Test', 'col_two.html', 'en') - page_content = self.get_page_title_obj(page) + page_content = self.get_pagecontent_obj(page) edit_url = get_object_edit_url(page_content) ex1 = self._get_example_obj() template_text = '''{% extends "base.html" %} @@ -1776,7 +1776,7 @@ def test_method_attribute(self): def test_admin_url(self): user = self.get_staff() page = create_page('Test', 'col_two.html', 'en') - page_content = self.get_page_title_obj(page) + page_content = self.get_pagecontent_obj(page) edit_url = get_object_edit_url(page_content) ex1 = self._get_example_obj() template_text = '''{% extends "base.html" %} @@ -1800,7 +1800,7 @@ def test_admin_url(self): def test_admin_url_extra_field(self): user = self.get_staff() page = create_page('Test', 'col_two.html', 'en') - page_content = self.get_page_title_obj(page) + page_content = self.get_pagecontent_obj(page) edit_url = get_object_edit_url(page_content) ex1 = self._get_example_obj() template_text = '''{% extends "base.html" %} @@ -1828,7 +1828,7 @@ def test_admin_url_extra_field(self): def test_admin_url_multiple_fields(self): user = self.get_staff() page = create_page('Test', 'col_two.html', 'en') - page_content = self.get_page_title_obj(page) + page_content = self.get_pagecontent_obj(page) edit_url = get_object_edit_url(page_content) ex1 = self._get_example_obj() template_text = '''{% extends "base.html" %} @@ -1857,7 +1857,7 @@ def test_admin_url_multiple_fields(self): def test_instance_method(self): user = self.get_staff() page = create_page('Test', 'col_two.html', 'en') - page_content = self.get_page_title_obj(page) + page_content = self.get_pagecontent_obj(page) edit_url = get_object_edit_url(page_content) ex1 = self._get_example_obj() template_text = '''{% extends "base.html" %} @@ -1883,7 +1883,7 @@ def test_instance_method(self): def test_item_from_context(self): user = self.get_staff() page = create_page('Test', 'col_two.html', 'en') - page_content = self.get_page_title_obj(page) + page_content = self.get_pagecontent_obj(page) edit_url = get_object_edit_url(page_content) ex1 = self._get_example_obj() template_text = '''{% extends "base.html" %} @@ -1913,7 +1913,7 @@ def test_edit_field(self): exadmin = site._registry[Example1] user = self.get_superuser() page = create_page('Test', 'col_two.html', 'en') - page_content = self.get_page_title_obj(page) + page_content = self.get_pagecontent_obj(page) edit_url = get_object_edit_url(page_content) ex1 = self._get_example_obj() @@ -1929,7 +1929,7 @@ def test_edit_field_not_allowed(self): exadmin = site._registry[Example1] user = self.get_superuser() page = create_page('Test', 'col_two.html', 'en') - page_content = self.get_page_title_obj(page) + page_content = self.get_pagecontent_obj(page) edit_url = get_object_edit_url(page_content) ex1 = self._get_example_obj() @@ -2102,7 +2102,7 @@ def test_add_live_url_querystring_param_handles_wrong_content_type(self): def test_get_object_for_language_one_language(self): page = create_page('Test', 'col_two.html', 'en') - page_content = self.get_page_title_obj(page, "en") + page_content = self.get_pagecontent_obj(page, "en") self.assertEqual(page_content, get_object_for_language(page_content, "en")) self.assertTrue(not hasattr(page_content, "_sibling_objects_for_language_cache")) @@ -2117,7 +2117,7 @@ def test_get_object_for_language_multiple_languages(self): create_page(f"Not this page ({verbose})", "col_two.html", code) page_content = { - "en": self.get_page_title_obj(page, "en") + "en": self.get_pagecontent_obj(page, "en") } for code, verbose in get_language_tuple(): if code != "en": @@ -2170,7 +2170,7 @@ def test_view_numeric_pk(self): (i.e.: no NoReverseMatch is raised) with numeric pks """ page = create_page('Test', 'col_two.html', 'en') - page_content = self.get_page_title_obj(page) + page_content = self.get_pagecontent_obj(page) edit_url = get_object_edit_url(page_content) ex = self._get_example_obj() superuser = self.get_superuser() diff --git a/cms/tests/test_toolbar_pool.py b/cms/tests/test_toolbar_pool.py index 830655949b4..7286f3d97fd 100644 --- a/cms/tests/test_toolbar_pool.py +++ b/cms/tests/test_toolbar_pool.py @@ -58,7 +58,7 @@ def test_settings(self): toolbar_pool.register(TestToolbar) self.assertEqual(len(list(pool.get_toolbars().keys())), 2) page = api.create_page("home", "simple.html", "en") - page_content = self.get_page_title_obj(page) + page_content = self.get_pagecontent_obj(page) page_edit_url_on = get_object_edit_url(page_content) with self.login_user_context(self.get_superuser()): From a954588739c91fe169f7feec9901c8c0fa2a2371 Mon Sep 17 00:00:00 2001 From: Fabian Braun Date: Wed, 3 Apr 2024 00:02:51 +0200 Subject: [PATCH 8/8] Add tests --- cms/test_utils/testcases.py | 4 ++- cms/tests/test_page_admin.py | 47 ++++++++++++++++++++++++++++-------- 2 files changed, 40 insertions(+), 11 deletions(-) diff --git a/cms/test_utils/testcases.py b/cms/test_utils/testcases.py index e2f6a6308ac..ddcef4407ef 100644 --- a/cms/test_utils/testcases.py +++ b/cms/test_utils/testcases.py @@ -155,9 +155,11 @@ def add_page_permission(self, user, page, **kwargs): def get_page_title_obj(self, page, language="en"): import warnings + from cms.utils.compat.warnings import RemovedInDjangoCMS42Warning + warnings.warn( "get_page_title_obj is deprecated, use get_pagecontent_obj instead", - DeprecationWarning, + RemovedInDjangoCMS42Warning, stacklevel=2, ) return PageContent.objects.get(page=page, language=language) diff --git a/cms/tests/test_page_admin.py b/cms/tests/test_page_admin.py index 67e812108b9..350d02e5629 100644 --- a/cms/tests/test_page_admin.py +++ b/cms/tests/test_page_admin.py @@ -32,6 +32,7 @@ LanguageOverride, UserLoginContext, ) +from cms.toolbar.utils import get_object_edit_url from cms.utils.compat import DJANGO_4_2 from cms.utils.compat.dj import installed_apps from cms.utils.conf import get_cms_setting @@ -1559,23 +1560,49 @@ def test_page_tree_render_localized_page_ids(self): class PageActionsTestCase(PageTestBase): - def test_add_page(self): + def setUp(self): + self.admin = self.get_superuser() + self.site = Site.objects.get(pk=1) + self.page = create_page( + 'My Page', 'nav_playground.html', 'en', + slug="ok", + site=self.site, created_by=self.admin) + + def test_add_page_redirect(self): + """When adding the edit parameter to the add page form, the user should be redirected to the edit endpoint + of the new page.""" with self.login_user_context(self.admin): - content = self.get_pagecontent_obj(self.page, 'en') - # create page copy + # add page page_data = { - 'title': 'type1', 'slug': 'type1', '_save': 1, 'template': 'nav_playground.html', - 'site': 1, 'language': 'en', 'source': self.page.pk, + 'title': 'another page', 'slug': 'type1', 'template': 'nav_playground.html', + 'language': 'en', + 'edit': 1, } - self.assertEqual(Page.objects.all().count(), 2) + self.assertEqual(Page.objects.all().count(), 1) response = self.client.post( - self.get_admin_url(PageContent, 'duplicate', content.pk), + self.get_admin_url(PageContent, 'add'), data=page_data, ) - # Check that page and its extensions have been copied - self.assertRedirects(response, self.get_pages_admin_list_uri('en')) - self.assertEqual(Page.objects.all().count(), 3) + redirect_url = get_object_edit_url(PageContent.objects.get(title='another page')) + self.assertContains(response, f'href="{redirect_url}"') + self.assertEqual(Page.objects.all().count(), 2) + def test_add_page_no_redirect(self): + with self.login_user_context(self.admin): + # add page + page_data = { + 'title': 'another page', 'slug': 'type1', 'template': 'nav_playground.html', + 'language': 'en', + 'edit': 0, + } + self.assertEqual(Page.objects.all().count(), 1) + response = self.client.post( + self.get_admin_url(PageContent, 'add'), + data=page_data, + ) + redirect_url = self.get_admin_url(PageContent, 'changelist') + "?language=en" + self.assertRedirects(response, redirect_url) + self.assertEqual(Page.objects.all().count(), 2) class PermissionsTestCase(PageTestBase):