Skip to content

Commit

Permalink
fix: Language menu created twice
Browse files Browse the repository at this point in the history
  • Loading branch information
fsbraun committed Jan 28, 2025
1 parent 1824ca2 commit 26c4221
Show file tree
Hide file tree
Showing 5 changed files with 43 additions and 16 deletions.
5 changes: 4 additions & 1 deletion djangocms_versioning/cms_config.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import collections

from cms import __version__ as cms_version
from cms.app_base import CMSAppConfig, CMSAppExtension
from cms.extensions.models import BaseExtension
from cms.models import PageContent, Placeholder
Expand All @@ -22,6 +23,7 @@
from django.utils.encoding import force_str
from django.utils.functional import cached_property
from django.utils.translation import gettext_lazy as _
from packaging.version import Version as PackageVersion

from . import indicators
from .admin import VersioningAdminMixin
Expand Down Expand Up @@ -393,6 +395,7 @@ class VersioningCMSConfig(CMSAppConfig):
content_admin_mixin=VersioningCMSPageAdminMixin,
)
]
cms_toolbar_mixin = CMSToolbarVersioningMixin
if PackageVersion(cms_version) < PackageVersion("4.2"):
cms_toolbar_mixin = CMSToolbarVersioningMixin
PageContent.add_to_class("is_editable", is_editable)
PageContent.add_to_class("content_indicator", indicators.content_indicator)
34 changes: 28 additions & 6 deletions djangocms_versioning/cms_toolbars.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from cms import __version__ as cms_version
from cms.cms_toolbars import (
ADD_PAGE_LANGUAGE_BREAK,
BasicToolbar,
LANGUAGE_MENU_IDENTIFIER,
PageToolbar,
PlaceholderToolbar,
Expand Down Expand Up @@ -320,7 +321,6 @@ def populate(self):
self.page_content = self.get_page_content() if self.page else None
self.permissions_activated = get_cms_setting("PERMISSION")

self.override_language_menu()
self.change_admin_menu()
self.add_page_menu()
self.change_language_menu()
Expand Down Expand Up @@ -401,8 +401,9 @@ def change_language_menu(self):
url = add_url_parameters(translation_delete_url, language=code)
on_close = REFRESH_PAGE
if self.toolbar.get_object() == pagecontent and not disabled:
other_content = next((self.page.get_admin_content(lang)for lang in self.page.get_languages()
if lang != pagecontent.language and lang in languages), None)
other_content = next(
(self.page.get_admin_content(lang) for lang in self.page.get_languages()
if lang != pagecontent.language and lang in languages), None)
on_close = get_object_preview_url(other_content)
remove_plugins_menu.add_modal_item(name, url=url, disabled=disabled, on_close=on_close)

Expand Down Expand Up @@ -432,10 +433,30 @@ def change_language_menu(self):
)


class VersioningBasicToolbar(BasicToolbar):
def add_language_menu(self):

Check notice

Code scanning / CodeQL

Explicit returns mixed with implicit (fall through) returns Note

Mixing implicit and explicit returns may indicate an error as implicit returns always return None.
"""
Originally did override the default language menu for pages that are versioned.
Now creates the menu from scratch, since VersiongBasicToolbar prevents the
core from creating the too generic default language menu.
"""
if not settings.USE_I18N or not self.request.current_page:
# Only add if no page is shown
return super().add_language_menu()

language_menu = self.toolbar.get_or_create_menu(
LANGUAGE_MENU_IDENTIFIER, _('Language'), position=-1

Check failure on line 448 in djangocms_versioning/cms_toolbars.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (Q000)

djangocms_versioning/cms_toolbars.py:448:41: Q000 Single quotes found but double quotes preferred

Check failure on line 448 in djangocms_versioning/cms_toolbars.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (Q000)

djangocms_versioning/cms_toolbars.py:448:41: Q000 Single quotes found but double quotes preferred
)
for code, name in get_language_tuple(self.current_site.pk):
# Get the page content, it could be draft too!
page_content = self.page.get_admin_content(language=code)
if page_content:
url = get_object_preview_url(page_content, code)
language_menu.add_link_item(name, url=url, active=self.current_lang == code)


def replace_toolbar(old, new):
"""Replace `old` toolbar class with `new` class,
while keeping its position in toolbar_pool.
"""
"""Replace `old` toolbar class with `new` class, while keeping its position in toolbar_pool."""
new_name = ".".join((new.__module__, new.__name__))
old_name = ".".join((old.__module__, old.__name__))
toolbar_pool.toolbars = OrderedDict(
Expand All @@ -446,3 +467,4 @@ def replace_toolbar(old, new):

replace_toolbar(PageToolbar, VersioningPageToolbar)
replace_toolbar(PlaceholderToolbar, VersioningToolbar)
replace_toolbar(BasicToolbar, VersioningBasicToolbar)
3 changes: 1 addition & 2 deletions djangocms_versioning/datastructures.py
Original file line number Diff line number Diff line change
Expand Up @@ -176,8 +176,7 @@ def content_types(self):


class PolymorphicVersionableItem(VersionableItem):
"""VersionableItem for use by base polymorphic class
(for example filer.File).
"""VersionableItem for use by base polymorphic class (for example filer.File).
"""

def _get_content_types(self):
Expand Down
7 changes: 4 additions & 3 deletions tests/test_integration_with_core.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from cms.toolbar.toolbar import CMSToolbar
from cms.utils.urlutils import admin_reverse
from django.template import Context
from packaging.version import Version as PackageVersion

from djangocms_versioning import constants
from djangocms_versioning.plugin_rendering import CMSToolbarVersioningMixin, VersionContentRenderer
Expand All @@ -18,6 +19,7 @@
)


@skipIf(PackageVersion(cms_version) >= PackageVersion("4.2"), "Toolbar integration not necessary for django CMS 4.2+")
class CMSToolbarTestCase(CMSTestCase):
def test_content_renderer(self):
"""Test that cms.toolbar.toolbar.CMSToolbar.content_renderer
Expand All @@ -39,7 +41,6 @@ def test_cmstoolbar_mixin(self):


class PageContentAdminTestCase(CMSTestCase):

def test_get_admin_model_object(self):
"""
PageContent normally won't be able to fetch objects in draft. Test if the RequestToolbarForm
Expand Down Expand Up @@ -71,7 +72,6 @@ def test_get_title_cache(self):


class PageAdminCopyLanguageTestCase(CMSTestCase):

def setUp(self):
self.user = self.get_superuser()
page = PageFactory()
Expand Down Expand Up @@ -281,7 +281,8 @@ def setUp(self):
self.page.save()


@skipIf(cms_version < "4.1.4", "Bug only fixed in django CMS 4.1.4")
@skipIf(PackageVersion(cms_version) < PackageVersion("4.1.4"),
"Bug only fixed in django CMS 4.1.4")
def test_get_admin_url_for_language(self):
"""Regression fixed that made unpublished and archived versions invisible to get_admin_url_for_language
template tag. See: https://github.com/django-cms/django-cms/pull/7967"""
Expand Down
10 changes: 6 additions & 4 deletions tests/test_toolbars.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
from cms.toolbar.utils import get_object_edit_url, get_object_preview_url
from cms.utils.urlutils import admin_reverse
from django.contrib.auth.models import Permission
from django.test import override_settings
from django.utils.text import slugify
from packaging.version import Version

Expand Down Expand Up @@ -669,6 +670,7 @@ def test_change_language_menu_page_toolbar_language_selector_version_link(self):
self.assertEqual(de_item.url, de_preview_url)
self.assertEqual(it_item.url, it_preview_url)

@override_settings(USE_I18N=False)
def test_page_toolbar_wo_language_menu(self):
from django.utils.translation import gettext as _

Expand All @@ -681,13 +683,13 @@ def test_page_toolbar_wo_language_menu(self):
user=self.get_superuser(),
)
# Remove language menu from request's toolbar
del request.toolbar.menus[LANGUAGE_MENU_IDENTIFIER]
self.assertNotIn(LANGUAGE_MENU_IDENTIFIER, request.toolbar.menus)

# find VersioningPageToolbar
# find VersioningBasicToolbar
for cls, toolbar in request.toolbar.toolbars.items():
if cls == "djangocms_versioning.cms_toolbars.VersioningPageToolbar":
if cls == "djangocms_versioning.cms_toolbars.VersioningBasicToolbar":
# and call override_language_menu
toolbar.override_language_menu()
toolbar.add_language_menu()
break

language_menu = request.toolbar.get_menu(LANGUAGE_MENU_IDENTIFIER, _("Language"))
Expand Down

0 comments on commit 26c4221

Please sign in to comment.