diff --git a/cms/tests/test_views.py b/cms/tests/test_views.py index 59994ca8679..09fb10b1b93 100644 --- a/cms/tests/test_views.py +++ b/cms/tests/test_views.py @@ -101,6 +101,28 @@ def test_apphook_not_hooked(self): self.assertEqual(response.status_code, 200) self.apphook_clear() + def test_redirect_preview_in_edit_mode(self): + + user = self.get_superuser() + page = create_page("page", "nav_playground.html", "fr") + page_content = create_page_content("en", "home", page, redirect="https://example.com") + + page.set_as_homepage() + + with self.login_user_context(user), force_language('fr'): + edit_url = get_object_edit_url(page_content, language='fr') + response = self.client.get(edit_url, follow=True) + + expected = f""" +
+
+

This page has no preview!

+

It is being redirected to: {page_content.redirect}

+
+
+ """ + self.assertContains(response, expected, count=1, html=True) + def test_external_redirect(self): # test external redirect redirect_one = 'https://www.django-cms.org/' diff --git a/cms/views.py b/cms/views.py index a9380c0d637..9b1b23cc0b6 100644 --- a/cms/views.py +++ b/cms/views.py @@ -85,7 +85,6 @@ def details(request, slug): # Get a Page model object from the request site = get_current_site() page = get_page_from_request(request, use_path=slug) - toolbar = get_toolbar_from_request(request) if not page and not slug and not Page.objects.on_site(site).exists(): # render the welcome page if the requested path is root "/" @@ -190,9 +189,7 @@ def details(request, slug): redirect_url = _clean_redirect_url(redirect_url, request_language) if redirect_url: - if request.user.is_staff and toolbar.edit_mode_active: - toolbar.redirect_url = redirect_url - elif redirect_url not in own_urls: + if redirect_url not in own_urls: if get_cms_setting('REDIRECT_PRESERVE_QUERY_PARAMS'): query_string = request.META.get('QUERY_STRING') if query_string: @@ -326,6 +323,11 @@ def render_object_endpoint(request, content_type_id, object_id, require_editable toolbar = get_toolbar_from_request(request) toolbar.set_object(content_type_obj) + if request.user.is_staff and toolbar.edit_mode_active: + redirect = getattr(content_type_obj, "redirect", None) + if isinstance(redirect, str): + toolbar.redirect_url = redirect + if require_editable and not toolbar.object_is_editable(): # If not editable, switch from edit to preview endpoint return HttpResponseRedirect(get_object_preview_url(content_type_obj))