8000 fix: Redirects to newly created object (#7864) · django-cms/django-cms@0b43a43 · GitHub
[go: up one dir, main page]

Skip to content

Commit 0b43a43

Browse files
authored
fix: Redirects to newly created object (#7864)
1 parent 1344853 commit 0b43a43

16 files changed

+163
-72
lines changed

cms/admin/forms.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,11 @@ class AddPageForm(BasePageContentForm):
252252
required=False,
253253
widget=forms.HiddenInput(),
254254
)
255+
edit = forms.IntegerField(
256+
# Got to edit/preview mode after adding
257+
required=False,
258+
widget=forms.HiddenInput(),
259+
)
255260
content_defaults = {
256261
"in_navigation": True,
257262
}

cms/admin/pageadmin.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
)
5151
from cms.admin.permissionadmin import PERMISSION_ADMIN_INLINES
5252
from cms.cache.permissions import clear_permission_cache
53+
from cms.constants import MODAL_HTML_REDIRECT
5354
from cms.models import (
5455
CMSPlugin,
5556
EmptyPageContent,
@@ -65,6 +66,7 @@
6566
)
6667
from cms.plugin_pool import plugin_pool
6768
from cms.signals.apphook import set_restart_trigger
69+
from cms.toolbar.utils import get_object_edit_url
6870
from cms.utils import get_current_site, page_permissions, permissions
6971
from cms.utils.admin import jsonify_request
7072
from cms.utils.conf import get_cms_setting
@@ -980,6 +982,20 @@ def change_view(self, request, object_id, form_url='', extra_context=None):
980982

981983
return super().change_view(request, object_id, form_url=form_url, extra_context=context)
982984

985+
def response_add(self, request, obj):
986+
redirect = request.POST.get("edit", False)
987+
if redirect == "1":
988+
from django.core.cache import cache
989+
990+
from cms.cache.permissions import get_cache_key, get_cache_permission_version
991+
cache.delete(get_cache_key(request.user, 'change_page'), version=get_cache_permission_version())
992+
993+
# redirect to the edit view if added from the toolbar
994+
url = get_object_edit_url(obj) # Redirects to preview if necessary
995+
return HttpResponse(MODAL_HTML_REDIRECT.format(url=url))
996+
return super().response_add(request, obj)
997+
998+
983999
def get_filled_languages(self, request, page):
9841000
site_id = get_site(request).pk
9851001
filled_languages = page.get_languages()

cms/cms_toolbars.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -499,7 +499,9 @@ def change_language_menu(self):
499499
page_add_url = admin_reverse('cms_pagecontent_add')
500500

501501
for code, name in add:
502-
url = add_url_parameters(page_add_url, cms_page=self.page.pk, language=code)
502+
url = add_url_parameters(
503+
page_add_url, cms_page=self.page.pk, parent_node=self.page.node.id, language=code
504+
)
503505
add_plugins_menu.add_modal_item(name, url=url)
504506

505507
if remove:

cms/constants.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,3 +78,5 @@
7878
SCRIPT_USERNAME = 'script'
7979

8080
CMS_CONFIG_NAME = 'cms_config'
81+
82+
MODAL_HTML_REDIRECT = '<body><a class="cms-view-new-object" target="_top" href="{url}">Redirecting...</a></body>'

cms/static/cms/js/modules/cms.modal.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -910,6 +910,14 @@ class Modal {
910910
return;
911911
}
912912

913+
// check if we are redirected - should only happen after successful form submission
914+
var redirect = body.find('a.cms-view-new-object').attr('href');
915+
916+
if (redirect) {
917+
Helpers.reloadBrowser(redirect, false);
918+
return true;
919+
}
920+
913921
// tabindex is required for keyboard navigation
914922
// body.attr('tabindex', '0');
915923
iframe.on('focus', function() {

cms/test_utils/testcases.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,18 @@ def add_page_permission(self, user, page, **kwargs):
153153
return pp
154154

155155
def get_page_title_obj(self, page, language="en"):
156+
import warnings
157+
158+
from cms.utils.compat.warnings import RemovedInDjangoCMS42Warning
159+
160+
warnings.warn(
161+
"get_page_title_obj is deprecated, use get_pagecontent_obj instead",
162+
RemovedInDjangoCMS42Warning,
163+
stacklevel=2,
164+
)
165+
return PageContent.objects.get(page=page, language=language)
166+
167+
def get_pagecontent_obj(self, page, language="en"):
156168
return PageContent.objects.get(page=page, language=language)
157169

158170
def _create_user(self, username, is_staff=False, is_superuser=False,

cms/tests/test_admin.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -371,7 +371,7 @@ def get_page(self):
371371

372372
def test_change_innavigation(self):
373373
page = self.get_page()
374-
content = self.get_page_title_obj(page, 'en')
374+
content = self.get_pagecontent_obj(page, 'en')
375375
permless = self.get_permless()
376376
admin_user = self.get_admin()
377377
pagecontent_admin = self.pagecontent_admin_class

cms/tests/test_cache.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -457,7 +457,7 @@ def test_no_page_cache_on_toolbar_edit(self):
457457
superuser = self.get_superuser()
458458
# Create a test page
459459
page = create_page("test page 1", "nav_playground.html", "en")
460-
page_content = self.get_page_title_obj(page)
460+
page_content = self.get_pagecontent_obj(page)
461461
page_url = page.get_absolute_url()
462462
page_edit_url = get_object_edit_url(page_content)
463463

cms/tests/test_extensions.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ def setUp(self):
289289

290290
def test_duplicate_extensions(self):
291291
with self.login_user_context(self.admin):
292-
content = self.get_page_title_obj(self.page, 'en')
292+
content = self.get_pagecontent_obj(self.page, 'en')
293293
# create page copy
294294
page_data = {
295295
'title': 'type1', 'slug': 'type1', '_save': 1, 'template': 'nav_playground.html',

cms/tests/test_page_admin.py

Lines changed: 49 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
LanguageOverride,
3333
UserLoginContext,
3434
)
35+
from cms.toolbar.utils import get_object_edit_url
3536
from cms.utils.compat import DJANGO_4_2
3637
from cms.utils.compat.dj import installed_apps
3738
from cms.utils.conf import get_cms_setting
@@ -1310,7 +1311,7 @@ def test_form_url_page_change(self):
13101311
with self.login_user_context(superuser):
13111312
content_admin = PageContentAdmin(PageContent, admin.site)
13121313
page = self.get_page()
1313-
content = self.get_page_title_obj(page, 'en')
1314+
content = self.get_pagecontent_obj(page, 'en')
13141315
form_url = self.get_page_change_uri('en', page)
13151316
# Middleware is needed to correctly setup the environment for the admin
13161317
request = self.get_request()
@@ -1558,6 +1559,51 @@ def test_page_tree_render_localized_page_ids(self):
15581559
self.assertEqual(response.status_code, 200)
15591560

15601561

1562+
class PageActionsTestCase(PageTestBase):
1563+
def setUp(self):
1564+
self.admin = self.get_superuser()
1565+
self.site = Site.objects.get(pk=1)
1566+
self.page = create_page(
1567+
'My Page', 'nav_playground.html', 'en',
1568+
slug="ok",
1569+
site=self.site, created_by=self.admin)
1570+
1571+
def test_add_page_redirect(self):
1572+
"""When adding the edit parameter to the add page form, the user should be redirected to the edit endpoint
1573+
of the new page."""
1574+
with self.login_user_context(self.admin):
1575+
# add page
1576+
page_data = {
1577+
'title': 'another page', 'slug': 'type1', 'template': 'nav_playground.html',
1578+
'language': 'en',
1579+
'edit': 1,
1580+
}
1581+
self.assertEqual(Page.objects.all().count(), 1)
1582+
response = self.client.post(
1583+
self.get_admin_url(PageContent, 'add'),
1584+
data=page_data,
1585+
)
1586+
redirect_url = get_object_edit_url(PageContent.objects.get(title='another page'))
1587+
self.assertContains(response, f'href="{redirect_url}"')
1588+
self.assertEqual(Page.objects.all().count(), 2)
1589+
1590+
def test_add_page_no_redirect(self):
1591+
with self.login_user_context(self.admin):
1592+
# add page
1593+
page_data = {
1594+
'title': 'another page', 'slug': 'type1', 'template': 'nav_playground.html',
1595+
'language': 'en',
1596+
'edit': 0,
1597+
}
1598+
self.assertEqual(Page.objects.all().count(), 1)
1599+
response = self.client.post(
1600+
self.get_admin_url(PageContent, 'add'),
1601+
data=page_data,
1602+
)
1603+
redirect_url = self.get_admin_url(PageContent, 'changelist') + "?language=en"
1604+
self.assertRedirects(response, redirect_url)
1605+
self.assertEqual(Page.objects.all().count(), 2)
1606+
15611607
class PermissionsTestCase(PageTestBase):
15621608

15631609
def _add_translation_to_page(self, page):
@@ -2912,7 +2958,7 @@ def test_user_can_copy_plugins_to_language(self):
29122958
"""
29132959
page = self.get_permissions_test_page()
29142960
staff_user = self.get_staff_user_with_no_permissions()
2915-
source_translation = self.get_page_title_obj(page, 'en')
2961+
source_translation = self.get_pagecontent_obj(page, 'en')
29162962
target_translation = self._add_translation_to_page(page)
29172963
endpoint = self.get_admin_url(PageContent, 'copy_language', source_translation.pk)
29182964
plugins = [
@@ -4320,7 +4366,7 @@ def test_user_can_copy_plugins_to_language(self):
43204366
"""
43214367
page = self._permissions_page
43224368
staff_user = self.get_staff_user_with_no_permissions()
4323-
source_translation = self.get_page_title_obj(page, 'en')
4369+
source_translation = self.get_pagecontent_obj(page, 'en')
43244370
target_translation = self._add_translation_to_page(page)
43254371
endpoint = self.get_admin_url(PageContent, 'copy_language', source_translation.pk)
43264372
plugins = [

cms/tests/test_placeholder.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -879,7 +879,7 @@ def test_sets_source_when_title_is_created(self):
879879
page = create_page('test page en', 'col_two.html', 'en')
880880

881881
# check for en
882-
page_content_en = self.get_page_title_obj(page)
882+
page_content_en = self.get_pagecontent_obj(page)
883883
self.assertQuerySetEqual(
884884
Placeholder.objects.get_for_obj(page_content_en),
885885
page_content_en.get_placeholders(),
@@ -906,8 +906,8 @@ def test_sets_source_when_title_is_copied(self):
906906
with self.login_user_context(self.get_superuser()):
907907
new_page = self.copy_page(page, page, position=1)
908908

909-
page_content = self.get_page_title_obj(page)
910-
new_page_content = self.get_page_title_obj(new_page)
909+
page_content = self.get_pagecontent_obj(page)
910+
new_page_content = self.get_pagecontent_obj(new_page)
911911
page_content_plhs = Placeholder.objects.get_for_obj(page_content)
912912
new_page_content_plhs = Placeholder.objects.get_for_obj(new_page_content)
913913
self.assertEqual(page_content_plhs.count(), new_page_content_plhs.count())

cms/tests/test_plugins.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -816,7 +816,7 @@ def test_plugin_toolbar_struct(self):
816816

817817
def test_plugin_toolbar_struct_permissions(self):
818818
page = self.get_permissions_test_page()
819-
page_content = self.get_page_title_obj(page)
819+
page_content = self.get_pagecontent_obj(page)
820820
page_edit_url = get_object_edit_url(page_content)
821821
staff_user = self.get_staff_user_with_no_permissions()
822822
placeholder = page.get_placeholders('en').get(slot='body')

cms/tests/test_rendering.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -734,7 +734,7 @@ def test_render_placeholder_toolbar(self):
734734
placeholder.pk = placeholder.id = 99
735735

736736
with self.login_user_context(self.get_superuser()):
737-
page_content = self.get_page_title_obj(self.test_page)
737+
page_content = self.get_pagecontent_obj(self.test_page)
738738
request = self.get_request(get_object_edit_url(page_content))
739739
request.session = {}
740740
request.toolbar = CMSToolbar(request)
@@ -771,7 +771,7 @@ def test_render_plugin_toolbar_markup(self):
771771
]
772772

773773
with self.login_user_context(self.get_superuser()):
774-
page_content = self.get_page_title_obj(page)
774+
page_content = self.get_pagecontent_obj(page)
775775
request = self.get_request(get_object_edit_url(page_content))
776776
request.session = {}
777777
request.toolbar = CMSToolbar(request)

cms/tests/test_templatetags.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -462,7 +462,7 @@ def test_render_plugin_editable(self):
462462
from django.core.cache import cache
463463
cache.clear()
464464
page = create_page('Test', 'col_two.html', 'en')
465-
page_content = self.get_page_title_obj(page)
465+
page_content = self.get_pagecontent_obj(page)
466466
placeholder = page.get_placeholders('en')[0]
467467
plugin = add_plugin(placeholder, TextPlugin, 'en', body='<b>Test</b>')
468468
template = "{% load cms_tags %}{% render_plugin plugin %}"
@@ -500,7 +500,7 @@ def test_render_plugin_not_editable(self):
500500

501501
def test_render_plugin_no_context(self):
502502
page = create_page('Test', 'col_two.html', 'en')
503-
page_content = self.get_page_title_obj(page)
503+
page_content = self.get_pagecontent_obj(page)
504504
placeholder = Placeholder.objects.create(slot='test')
505505
plugin = add_plugin(placeholder, TextPlugin, 'en', body='Test')
506506
superuser = self.get_superuser()
@@ -557,7 +557,7 @@ def test_render_model_with_deferred_fields(self):
557557
Category.objects.create(name='foo', depth=1)
558558
cache.clear()
559559
page = create_page('Test', 'col_two.html', 'en')
560-
page_content = self.get_page_title_obj(page)
560+
page_content = self.get_pagecontent_obj(page)
561561
template = "{% load cms_tags %}{% render_model category 'name' %}"
562562
user = self._create_user("admin", True, True)
563563
request = RequestFactory().get(get_object_edit_url(page_content))
@@ -589,7 +589,7 @@ def test_render_model_add(self):
589589

590590
cache.clear()
591591
page = create_page('Test', 'col_two.html', 'en')
592-
page_content = self.get_page_title_obj(page)
592+
page_content = self.get_pagecontent_obj(page)
593593
template = "{% load cms_tags %}{% render_model_add category %}"
594594
user = self._create_user("admin", True, True)
595595
request = RequestFactory().get(get_object_edit_url(page_content))
@@ -627,7 +627,7 @@ def test_render_model_add_block(self):
627627

628628
cache.clear()
629629
page = create_page('Test', 'col_two.html', 'en')
630-
page_content = self.get_page_title_obj(page)
630+
page_content = self.get_pagecontent_obj(page)
631631
template = "{% load cms_tags %}{% render_model_add_block category %}wrapped{% endrender_model_add_block %}"
632632
user = self._create_user("admin", True, True)
633633
request = RequestFactory().get(get_object_edit_url(page_content))

0 commit comments

Comments
 (0)
0