8000 Fixed #6336 -- request.current_page should always respect draft/live … · django-cms/django-cms@fe29ed6 · GitHub
[go: up one dir, main page]

Skip to content 65E9

Commit fe29ed6

Browse files
authored
Fixed #6336 -- request.current_page should always respect draft/live state (#6350)
1 parent c5780a0 commit fe29ed6

File tree

3 files changed

+108
-4
lines changed

3 files changed

+108
-4
lines changed

cms/appresolver.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
from cms.models.pagemodel import Page
1515
from cms.utils import get_current_site
1616
from cms.utils.i18n import get_language_list
17+
from cms.utils.moderator import use_draft
1718

1819
APP_RESOLVERS = []
1920

@@ -37,6 +38,9 @@ def applications_page_check(request, current_page=None, path=None):
3738
for lang in get_language_list():
3839
if path.startswith(lang + "/"):
3940
path = path[len(lang + "/"):]
41+
42+
use_public = not use_draft(request)
43+
4044
for resolver in APP_RESOLVERS:
4145
try:
4246
page_id = resolver.resolve_page_id(path)
@@ -45,7 +49,7 @@ def applications_page_check(request, current_page=None, path=None):
4549
# If current page was matched, then we have some override for
4650
# content from cms, but keep current page. Otherwise return page
4751
# to which was application assigned.
48-
return page
52+
return page if use_public else page.publisher_public
4953
except Resolver404:
5054
# Raised if the page is not managed by an apphook
5155
pass

cms/test_utils/project/sampleapp/cms_apps.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,13 @@
1111
from .models import SampleAppConfig
1212

1313

14+
class AppWithNoMenu(CMSApp):
15+
app_name = 'app_with_no_menu'
16+
17+
def get_urls(self, page=None, language=None, **kwargs):
18+
return ["cms.test_utils.project.sampleapp.urls"]
19+
20+
1421
class SampleApp(CMSApp):
1522
name = _("Sample App")
1623
permissions = True

cms/tests/test_apphooks.py

Lines changed: 96 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
from cms.appresolver import applications_page_check, clear_app_resolvers, get_app_patterns
2121
from cms.constants import PUBLISHER_STATE_DIRTY
2222
from cms.models import Title, Page
23+
from cms.middleware.page import get_page
2324
from cms.test_utils.project.placeholderapp.models import Example1
2425
from cms.test_utils.testcases import CMSTestCase
2526
from cms.tests.test_menu_utils import DumbPageLanguageUrl
@@ -325,20 +326,33 @@ def test_get_page_for_apphook_on_preview_or_edit(self):
325326

326327
public_page = page.get_public_object()
327328

329+
with force_language("en"):
330+
path = reverse('sample-settings')
331+
request = self.get_request(path)
332+
request.LANGUAGE_CODE = 'en'
333+
attached_to_page = applications_page_check(request, path=path[1:]) # strip leading slash
334+
self.assertEqual(attached_to_page.pk, public_page.pk)
335+
336+
with force_language("de"):
337+
path = reverse('sample-settings')
338+
request = self.get_request(path)
339+
request.LANGUAGE_CODE = 'de'
340+
attached_to_page = applications_page_check(request, path=path[1:]) # strip leading slash
341+
self.assertEqual(attached_to_page.pk, public_page.pk)
342+
328343
with self.login_user_context(superuser):
329344
with force_language("en"):
330345
path = reverse('sample-settings')
331346
request = self.get_request(path + '?%s' % get_cms_setting('CMS_TOOLBAR_URL__EDIT_ON'))
332347
request.LANGUAGE_CODE = 'en'
333348
attached_to_page = applications_page_check(request, path=path[1:]) # strip leading slash
334-
response = self.client.get(path+"?edit")
335-
self.assertContains(response, '?redirect=')
349+
self.assertEqual(attached_to_page.pk, page.pk)
336350
with force_language("de"):
337351
path = reverse('sample-settings')
338352
request = self.get_request(path + '?%s' % get_cms_setting('CMS_TOOLBAR_URL__EDIT_ON'))
339353
request.LANGUAGE_CODE = 'de'
340354
attached_to_page = applications_page_check(request, path=path[1:]) # strip leading slash
341-
self.assertEqual(attached_to_page.pk, public_page.pk)
355+
self.assertEqual(attached_to_page.pk, page.pk)
342356

343357
@override_settings(ROOT_URLCONF='cms.test_utils.project.second_urls_for_apphook_tests')
344358
def test_get_root_page_for_apphook_with_instance_namespace(self):
@@ -869,6 +883,85 @@ def test_get_menus(self):
869883

870884
self.apphook_clear()
871885

886+
@override_settings(
887+
CMS_APPHOOKS=['cms.test_utils.project.sampleapp.cms_apps.AppWithNoMenu'],
888+
)
889+
def test_menu_node_is_selected_on_app_root(self):
890+
"""
891+
If a user requests a page with an apphook,
892+
the menu should mark the node for that page as selected.
893+
"""
894+
defaults = {
895+
'language': 'en',
896+
'published': True,
897+
'in_navigation': True,
898+
'template': 'nav_playground.html',
899+
}
900+
homepage = create_page('EN-P1', **defaults)
901+
homepage.set_as_homepage()
902+
app_root = create_page('EN-P2', apphook='AppWithNoMenu', apphook_namespace='app_with_no_menu', **defaults)
903+
904+
# Public version
905+
request = self.get_request(self.get_edit_on_url('/en/en-p2/'))
906+
request.current_page = get_page(request)
907+
menu_nodes = menu_pool.get_renderer(request).get_nodes()
908+
self.assertEqual(len(menu_nodes), 2)
909+
self.assertEqual(menu_nodes[0].id, homepage.publisher_public_id)
910+
self.assertEqual(menu_nodes[0].selected, False)
911+
self.assertEqual(menu_nodes[1].id, app_root.publisher_public_id)
912+
self.assertEqual(menu_nodes[1].selected, True)
913+
914+
# Draft version
915+
with self.login_user_context(self.get_superuser()):
916+
request = self.get_request(self.get_edit_on_url('/en/en-p2/'))
917+
request.current_page = get_page(request)
918+
menu_nodes = menu_pool.get_renderer(request).get_nodes()
919+
self.assertEqual(len(menu_nodes), 2)
920+
self.assertEqual(menu_nodes[0].id, homepage.pk)
921+
self.assertEqual(menu_nodes[0].selected, False)
922+
self.assertEqual(menu_nodes[1].id, app_root.pk)
923+
self.assertEqual(menu_nodes[1].selected, True)
924+
925+
@override_settings(
926+
CMS_APPHOOKS=['cms.test_utils.project.sampleapp.cms_apps.AppWithNoMenu'],
927+
)
928+
def test_menu_node_is_selected_on_app_sub_path(self):
929+
"""
930+
If a user requests a path belonging to an apphook,
931+
the menu should mark the node for the apphook page as selected.
932+
"""
933+
# Refs - https://github.com/divio/django-cms/issues/6336
934+
defaults = {
935+
'language': 'en',
936+
'published': True,
937+
'in_navigation': True,
938+
'template': 'nav_playground.html',
939+
}
940+
homepage = create_page('EN-P1', **defaults)
941+
homepage.set_as_homepage()
942+
app_root = create_page('EN-P2', apphook='AppWithNoMenu', apphook_namespace='app_with_no_menu', **defaults)
943+
944+
# Public version
945+
request = self.get_request(self.get_edit_on_url('/en/en-p2/settings/'))
946+
request.current_page = get_page(request)
947+
menu_nodes = menu_pool.get_renderer(request).get_nodes()
948+
self.assertEqual(len(menu_nodes), 2)
949+
self.assertEqual(menu_nodes[0].id, homepage.publisher_public_id)
950+
self.assertEqual(menu_nodes[0].selected, False)
951+
self.assertEqual(menu_nodes[1].id, app_root.publisher_public_id)
952+
self.assertEqual(menu_nodes[1].selected, True)
953+
954+
# Draft version
955+
with self.login_user_context(self.get_superuser()):
956+
request = self.get_request(self.get_edit_on_url('/en/en-p2/settings/'))
957+
request.current_page = get_page(request)
958+
menu_nodes = menu_pool.get_renderer(request).get_nodes()
959+
self.assertEqual(len(menu_nodes), 2)
960+
self.assertEqual(menu_nodes[0].id, homepage.pk)
961+
self.assertEqual(menu_nodes[0].selected, False)
962+
self.assertEqual(menu_nodes[1].id, app_root.pk)
963+
self.assertEqual(menu_nodes[1].selected, True)
964+
872965

873966
class ApphooksPageLanguageUrlTestCase(CMSTestCase):
874967
def setUp(self):

0 commit comments

Comments
 (0)
0