Skip to content

Commit 07222a4

Browse files
authored
fix: get_page_content retrieved non page-content objects from the toolbar (#423)
* fix: get_page_content retrieved non page-content objects from the toolbar * Fix: Lint error * Add regression test * Same test but simpler
1 parent ac763d9 commit 07222a4

File tree

3 files changed

+23
-4
lines changed

3 files changed

+23
-4
lines changed

djangocms_versioning/cms_toolbars.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -295,16 +295,18 @@ def __init__(self, *args, **kwargs):
295295
super().__init__(*args, **kwargs)
296296

297297
def get_page_content(self, language: Optional[str] = None) -> PageContent:
298+
# This method overwrites the method in django CMS core. Not necessary
299+
# for django CMS 4.2+
298300
if not language:
299301
language = self.current_lang
300302

301-
if self.page_content and self.page_content.language == language:
303+
if isinstance(self.page_content, PageContent) and self.page_content.language == language:
302304
# Already known - no need to query it again
303305
return self.page_content
304306
toolbar_obj = self.toolbar.get_object()
305-
if toolbar_obj and toolbar_obj.language == language:
307+
if isinstance(toolbar_obj, PageContent) and toolbar_obj.language == language:
306308
# Already in the toolbar, then use it!
307-
return self.toolbar.get_object()
309+
return toolbar_obj
308310
else:
309311
# Get it from the DB
310312
return get_latest_admin_viewable_content(self.page, language=language)

djangocms_versioning/test_utils/test_helpers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ def get_toolbar(content_obj, user=None, **kwargs):
2020
request = kwargs.get("request", RequestFactory().get("/"))
2121
request.user = user
2222
request.session = kwargs.get("session", {})
23-
request.current_page = getattr(content_obj, "page", None)
23+
request.current_page = kwargs.get("current_page", getattr(content_obj, "page", None))
2424
request.toolbar = CMSToolbar(request)
2525
# Set the toolbar class
2626
if kwargs.get("toolbar_class", False):

tests/test_toolbars.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,14 @@
66
from django.utils.text import slugify
77

88
from djangocms_versioning.cms_config import VersioningCMSConfig
9+
from djangocms_versioning.cms_toolbars import VersioningPageToolbar
910
from djangocms_versioning.constants import ARCHIVED, DRAFT, PUBLISHED
1011
from djangocms_versioning.helpers import version_list_url
1112
from djangocms_versioning.test_utils.factories import (
1213
BlogPostVersionFactory,
1314
FancyPollFactory,
1415
PageContentWithVersionFactory,
16+
PageFactory,
1517
PageUrlFactory,
1618
PageVersionFactory,
1719
PollVersionFactory,
@@ -615,3 +617,18 @@ def test_page_toolbar_wo_language_menu(self):
615617

616618
language_menu = request.toolbar.get_menu(LANGUAGE_MENU_IDENTIFIER, _("Language"))
617619
self.assertIsNone(language_menu)
620+
621+
def test_toolbar_only_catches_page_content_objects(self):
622+
"""Regression test to ensure that the toolbar only catches PageContent objects and not
623+
other toolbar objects."""
624+
625+
version = PollVersionFactory() # Not a page content model
626+
page = PageFactory() # Get a page, e.g. where an apphook is configured
627+
toolbar = get_toolbar(version.content, edit_mode=True, toolbar_class=VersioningPageToolbar, current_page=page)
628+
629+
# Did page get detected? Otherwise, page_content never will be detected
630+
self.assertIs(toolbar.page, page)
631+
# Check regression does not happen
632+
self.assertNotIsInstance(toolbar.page_content, version.content.__class__)
633+
# Check for correct result
634+
self.assertIsNone(toolbar.page_content)

0 commit comments

Comments
 (0)