Skip to content

Commit 03c96c7

Browse files
authored
Merge 35eac8a into aee76b4
2 parents aee76b4 + 35eac8a commit 03c96c7

File tree

6 files changed

+76
-12
lines changed

6 files changed

+76
-12
lines changed

CHANGELOG.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
Features:
55
---------
66

7+
* Fixed a bug where menu link is outdated when page moved (#7558)
8+
* Fixed a bug where the preview button lead to the wrong languge (#7558)
79
* Graceful plugin exceptions (#7423)
810
* Reintroduce indicator menus (#7426)
911
* Add release scripts for develop-4 branch (#7466)

cms/models/pagemodel.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -438,7 +438,7 @@ def move_page(self, target_node, position='first-child'):
438438
if not self.is_home:
439439
self._update_url_path(language)
440440
self._update_url_path_recursive(language)
441-
self.clear_cache()
441+
self.clear_cache(menu=True)
442442
return self
443443

444444
def _clear_placeholders(self, language):
@@ -921,7 +921,7 @@ def get_fallback_language(page, language):
921921
for page_content in cached_page_content:
922922
self.page_content_cache[page_content.language] = page_content
923923

924-
# Reload if explicitly needed or language not in title cache
924+
# Reload if explicitly needed or language not in content cache
925925
if force_reload or language not in self.page_content_cache:
926926
for page_content in self.pagecontent_set.all():
927927
self.page_content_cache[page_content.language] = page_content

cms/templatetags/cms_admin.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,10 @@
1111
from django.utils.translation import get_language
1212
from django.utils.translation import gettext_lazy as _
1313

14+
from cms.models import Page
1415
from cms.models.contentmodels import PageContent
15-
from cms.utils import i18n
16+
from cms.toolbar.utils import get_object_preview_url
17+
from cms.utils import get_language_from_request, i18n
1618
from cms.utils.urlutils import admin_reverse
1719

1820
register = template.Library()
@@ -56,16 +58,14 @@ class GetPreviewUrl(AsTag):
5658
)
5759

5860
def get_value(self, context, page_content):
61+
if isinstance(page_content, Page):
62+
# Advanced settings wants a preview for a Page object.
63+
page_content = page_content.get_content_obj(
64+
language=get_language_from_request(context["request"])
65+
)
5966
if not page_content:
6067
return ""
61-
if GetPreviewUrl.page_content_type is None:
62-
# Use class as cache
63-
from django.contrib.contenttypes.models import ContentType
64-
65-
GetPreviewUrl.page_content_type = ContentType.objects.get_for_model(PageContent).pk
66-
67-
return admin_reverse('cms_placeholder_render_object_preview',
68-
args=[GetPreviewUrl.page_content_type, page_content.pk])
68+
return get_object_preview_url(page_content, language=page_content.language)
6969

7070

7171
register.tag(GetPreviewUrl.name, GetPreviewUrl)

cms/tests/test_menu.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,40 @@ def test_basic_cms_menu(self):
301301
[page.get_absolute_url() for page in pages],
302302
)
303303

304+
def test_show_page_in_menu_after_move_page(self):
305+
"""
306+
Test checks if the menu cache is cleaned after move page.
307+
"""
308+
page = create_page('page to move', 'nav_playground.html', 'en')
309+
310+
request = self.get_request('/')
311+
renderer = menu_pool.get_renderer(request)
312+
renderer.draft_mode_active = True
313+
nodes_before = renderer.get_nodes()
314+
index_before = [i for i, s in enumerate(nodes_before) if s.title == page.get_title()]
315+
self.assertEqual(CacheKey.objects.count(), 1)
316+
317+
with self.login_user_context(self.get_superuser()):
318+
# Moves the page to the second position in the tree
319+
data = {'id': page.pk, 'position': 1}
320+
endpoint = self.get_admin_url(Page, 'move_page', page.pk)
321+
response = self.client.post(endpoint, data)
322+
self.assertEqual(response.status_code, 200)
323+
self.assertEqual(CacheKey.objects.count(), 0)
324+
325+
request = self.get_request('/')
326+
renderer = menu_pool.get_renderer(request)
327+
renderer.draft_mode_active = True
328+
nodes_after = renderer.get_nodes()
329+
index_after = [i for i, s in enumerate(nodes_after) if s.title == page.get_title()]
330+
331+
self.assertEqual(CacheKey.objects.count(), 1)
332+
self.assertNotEqual(
333+
index_before,
334+
index_after,
335+
'Index should not be the same after move page in navigation'
336+
)
337+
304338
def test_cms_menu_public_with_multiple_languages(self):
305339
pages = self.get_all_pages().order_by('node__path')
306340

cms/tests/test_page_admin.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1284,6 +1284,20 @@ def test_advanced_settings_form_apphook_config(self):
12841284
del sys.modules['cms.test_utils.project.sampleapp.cms_apps']
12851285
self.apphook_clear()
12861286

1287+
def test_advanced_settings_view_on_site(self):
1288+
"""Advanced Page Settings `View on Site` object tool links to the Page's current language
1289+
content preview url"""
1290+
from cms.toolbar.utils import get_object_preview_url
1291+
superuser = self.get_superuser()
1292+
cms_page = create_page('app', 'nav_playground.html', 'en')
1293+
cms_page_content = cms_page.get_content_obj(language='en')
1294+
endpoint = self.get_admin_url(Page, 'advanced', cms_page.pk)
1295+
1296+
with self.login_user_context(superuser):
1297+
response = self.client.get(endpoint)
1298+
1299+
self.assertContains(response, get_object_preview_url(cms_page_content, language="en"))
1300+
12871301
def test_form_url_page_change(self):
12881302
superuser = self.get_superuser()
12891303
with self.login_user_context(superuser):

cms/tests/test_templatetags.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
PageUrl,
2828
Placeholder,
2929
)
30-
from cms.templatetags.cms_admin import get_page_display_name
30+
from cms.templatetags.cms_admin import GetPreviewUrl, get_page_display_name
3131
from cms.templatetags.cms_js_tags import json_filter
3232
from cms.templatetags.cms_tags import (
3333
_get_page_by_untyped_arg,
@@ -44,6 +44,20 @@
4444

4545
class TemplatetagTests(CMSTestCase):
4646

47+
def test_get_preview_url(self):
48+
"""The get_preview_url template tag returns the content preview url for its language:
49+
If a page is given, take the current language (en), if a page_content is given,
50+
take its language (de for this test)"""
51+
page = create_page("page_a", "nav_playground.html", "en")
52+
german_content = create_page_content("de", "Seite_a", page)
53+
54+
page_preview_url = GetPreviewUrl.get_value(None, context={"request": None}, page_content=page)
55+
german_content_preview_url = GetPreviewUrl.get_value(None, context={}, page_content=german_content)
56+
57+
self.assertIn("/en", page_preview_url)
58+
self.assertIn("/de/", german_content_preview_url)
59+
60+
4761
def test_get_admin_tree_title(self):
4862
page = create_page("page_a", "nav_playground.html", "en")
4963
self.assertEqual(get_page_display_name(page), 'page_a')

0 commit comments

Comments
 (0)