Skip to content

Commit

Permalink
fix: Render structure view in toolbar object's language (#7846)
Browse files Browse the repository at this point in the history
* Fix: User language setting does not affect the language of the rendered structure view plugins

* Fix ruff lint errors
  • Loading branch information
fsbraun committed Mar 21, 2024
1 parent 21d6a6d commit d123d11
Show file tree
Hide file tree
Showing 7 changed files with 47 additions and 43 deletions.
9 changes: 1 addition & 8 deletions cms/cache/placeholder.py
Expand Up @@ -96,14 +96,7 @@ def _get_placeholder_cache_key(placeholder, lang, site_id, request, soft=False):
"""
prefix = get_cms_setting('CACHE_PREFIX')
version, vary_on_list = _get_placeholder_cache_version(placeholder, lang, site_id)
main_key = '{prefix}|render_placeholder|id:{id}|lang:{lang}|site:{site}|tz:{tz}|v:{version}'.format(
prefix=prefix,
id=placeholder.pk,
lang=lang,
site=site_id,
tz=get_timezone_name(),
version=version,
)
main_key = f'{prefix}|render_placeholder|id:{placeholder.pk}|lang:{lang}|site:{site_id}|tz:{get_timezone_name()}|v:{version}'

if not soft:
# We are about to write to the cache, so we want to get the latest
Expand Down
8 changes: 1 addition & 7 deletions cms/models/placeholdermodel.py
Expand Up @@ -53,13 +53,7 @@ def __str__(self):
return self.slot

def __repr__(self):
display = "<{module}.{class_name} id={id} slot='{slot}' object at {location}>".format(
module=self.__module__,
class_name=self.__class__.__name__,
id=self.pk,
slot=self.slot,
location=hex(id(self)),
)
display = f"<{self.__module__}.{self.__class__.__name__} id={self.pk} slot='{self.slot}' object at {hex(id(self))}>"
return display

def clear(self, language=None):
Expand Down
8 changes: 1 addition & 7 deletions cms/models/pluginmodel.py
Expand Up @@ -186,13 +186,7 @@ def __str__(self):
return force_str(self.pk)

def __repr__(self):
display = "<{module}.{class_name} id={id} plugin_type='{plugin_type}' object at {location}>".format(
module=self.__module__,
class_name=self.__class__.__name__,
id=self.pk,
plugin_type=(self.plugin_type),
location=hex(id(self)),
)
display = f"<{self.__module__}.{self.__class__.__name__} id={self.pk} plugin_type='{self.plugin_type}' object at {hex(id(self))}>"
return display

def get_plugin_name(self):
Expand Down
10 changes: 7 additions & 3 deletions cms/templatetags/cms_js_tags.py
Expand Up @@ -30,17 +30,21 @@ def bool(value):
return 'false'


@register.simple_tag()
def render_cms_structure_js(renderer, obj):
@register.simple_tag(takes_context=True)
def render_cms_structure_js(context, renderer, obj):
markup_bits = []
obj_placeholders_by_slot = rescan_placeholders_for_obj(obj)
declared_placeholders = get_declared_placeholders_for_obj(obj)
try:
lang = context["request"].toolbar.request_language
except AttributeError:
lang = None

for placeholder_node in declared_placeholders:
obj_placeholder = obj_placeholders_by_slot.get(placeholder_node.slot)

if obj_placeholder:
placeholder_js = renderer.render_placeholder(obj_placeholder, language=None, page=obj)
placeholder_js = renderer.render_placeholder(obj_placeholder, language=lang, page=obj)
markup_bits.append(placeholder_js)

return mark_safe('\n'.join(markup_bits))
Expand Down
20 changes: 8 additions & 12 deletions cms/tests/test_toolbar.py
Expand Up @@ -1952,23 +1952,19 @@ def test_edit_page(self):
response.render()
self.assertContains(
response,
'<template class="cms-plugin cms-plugin-start cms-plugin-cms-page-get_page_title-{0} cms-render-model">'
f'<template class="cms-plugin cms-plugin-start cms-plugin-cms-page-get_page_title-{page.pk} cms-render-model">'
'</template>'
f'{page.get_page_title(language)}'
f'<template class="cms-plugin cms-plugin-end cms-plugin-cms-page-get_page_title-{page.pk} cms-render-model">'
'</template>'
'{1}'
'<template class="cms-plugin cms-plugin-end cms-plugin-cms-page-get_page_title-{0} cms-render-model">'
'</template>'.format(
page.pk, page.get_page_title(language)
)
)
self.assertContains(
response,
'<template class="cms-plugin cms-plugin-start cms-plugin-cms-page-get_menu_title-{0} cms-render-model">'
f'<template class="cms-plugin cms-plugin-start cms-plugin-cms-page-get_menu_title-{page.pk} cms-render-model">'
'</template>'
f'{page.get_menu_title(language)}'
f'<template class="cms-plugin cms-plugin-end cms-plugin-cms-page-get_menu_title-{page.pk} cms-render-model">'
'</template>'
'{1}'
'<template class="cms-plugin cms-plugin-end cms-plugin-cms-page-get_menu_title-{0} cms-render-model">'
'</template>'.format(
page.pk, page.get_menu_title(language)
)
)
self.assertContains(
response,
Expand Down
30 changes: 28 additions & 2 deletions cms/tests/test_views.py
Expand Up @@ -12,6 +12,7 @@
from django.urls import clear_url_caches, reverse
from django.utils.translation import override as force_language

from cms import api
from cms.api import create_page, create_page_content
from cms.middleware.toolbar import ToolbarMiddleware
from cms.models import PageContent, PagePermission, Placeholder, UserSettings
Expand All @@ -25,6 +26,7 @@
)
from cms.utils.conf import get_cms_setting
from cms.utils.page import get_page_from_request
from cms.utils.urlutils import admin_reverse
from cms.views import details, login, render_object_structure
from menus.menu_pool import menu_pool

Expand Down Expand Up @@ -413,8 +415,11 @@ class EndpointTests(CMSTestCase):
def setUp(self) -> None:
page_template = "simple.html"
self.page = self.create_homepage("page", page_template, "en")
self.page_content = self.page.get_content_obj()

self.page_content_en = self.page.get_content_obj()
self.page_content_fr = create_page_content("fr", "french home", self.page)
self.content_type = ContentType.objects.get_for_model(PageContent)

self.client.force_login(self.get_superuser())

def tearDown(self) -> None:
Expand All @@ -425,7 +430,28 @@ def test_render_object_structure(self):
request.user = self.get_superuser()
mid = ToolbarMiddleware(lambda req: HttpResponse(""))
mid(request)
response = render_object_structure(request, self.content_type.id, self.page_content.pk)
response = render_object_structure(request, self.content_type.id, self.page_content_en.pk)

self.assertEqual(request.current_page, self.page)
self.assertContains(response, '<div class="cms-toolbar">')

def test_render_object_structure_i18n(self):
"""Structure view shows the page content's language not the request's language."""
placeholder = self.page.get_placeholders("fr").first()
self._add_plugin_to_placeholder(placeholder, "TextPlugin", language="fr")
with force_language("fr"):
setting, _ = UserSettings.objects.get_or_create(user=self.get_superuser())
setting.language="fr"
setting.save()
structure_endpoint_url = admin_reverse(
"cms_placeholder_render_object_structure",
args=(self.content_type.id, self.page_content_fr.pk,)
)
response = self.client.get(structure_endpoint_url)
self.assertContains(response, '<strong>Texte</strong>')

setting.language = "en"
setting.save()

response = self.client.get(structure_endpoint_url)
self.assertContains(response, '<strong>Text</strong>')
5 changes: 1 addition & 4 deletions cms/utils/apphook_reload.py
Expand Up @@ -89,10 +89,7 @@ def reload_urlconf(urlconf=None, new_revision=None):


def log_reloading_apphook(global_revision, local_revision):
debug_msg = " New revision!!!! RELOAD!\n {0} ({1})\n -> {2} ({3})".format(
global_revision, type(global_revision),
local_revision, type(local_revision),
)
debug_msg = f" New revision!!!! RELOAD!\n {global_revision} ({type(global_revision)})\n -> {local_revision} ({type(local_revision)})"
logger.debug(debug_msg)


Expand Down

0 comments on commit d123d11

Please sign in to comment.