10000 fix: Page settings raised an exception when `USE_I18N = False` by fsbraun · Pull Request #8236 · django-cms/django-cms · GitHub
[go: up one dir, main page]

Skip to content

fix: Page settings raised an exception when USE_I18N = False #8236

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 11 commits into from
May 22, 2025
Merged
1 change: 1 addition & 0 deletions cms/forms/validators.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
from cms.utils.urlutils import admin_reverse, relative_url_regex

if TYPE_CHECKING:
# Only needed for type hinting - avoid circular import
from cms.models.pagemodel import Page


Expand Down
2 changes: 1 addition & 1 deletion cms/models/contentmodels.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ class PageContent(models.Model):
(constants.X_FRAME_OPTIONS_ALLOW, _('Allow'))
)

template_choices = [(x, _(y)) for x, y in get_cms_setting('TEMPLATES')]
template_choices = get_cms_setting('TEMPLATES')

# These are the fields whose values are compared when saving
# a PageContent object to know if it has changed.
Expand Down
4 changes: 2 additions & 2 deletions cms/plugin_pool.py
Original file line number Diff line number Diff line change
Expand Up @@ -177,8 +177,8 @@ def get_all_plugins(
return plugins

def get_text_enabled_plugins(self, placeholder, page) -> list[type[CMSPluginBase]]:
plugins = set(self.get_all_plugins(placeholder, page))
plugins.update(self.get_all_plugins(placeholder, page, "text_only_plugins"))
plugins = set(self.get_all_plugins(placeholder, page, root_plugin=False))
plugins.update(self.get_all_plugins(placeholder, page, setting_key="text_only_plugins", root_plugin=False))
return sorted((p for p in plugins if p.text_enabled), key=attrgetter("module", "name"))

def get_plugin(self, name) -> type[CMSPluginBase]:
Expand Down
131 changes: 72 additions & 59 deletions cms/tests/test_no_i18n.py
Original file line number Diff line number Diff line change
@@ -1,46 +1,49 @@
from unittest.mock import patch

from django.contrib.auth import get_user_model
from django.template import Template
from django.test.utils import override_settings
from django.urls import clear_url_caches
from django.utils.translation import trans_null

from cms.api import create_page
from cms.models import CMSPlugin, Page
from cms.constants import TEMPLATE_INHERITANCE_MAGIC
from cms.models import CMSPlugin, Page, PageContent
from cms.test_utils.testcases import CMSTestCase

overrides = dict(
LANGUAGE_CODE='en-us',
LANGUAGE_CODE="en-us",
LANGUAGES=[],
CMS_LANGUAGES={},
USE_I18N=False,
ROOT_URLCONF='cms.test_utils.project.urls_no18n',
ROOT_URLCONF="cms.test_utils.project.urls_no18n",
TEMPLATE_CONTEXT_PROCESSORS=[
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
'django.core.context_processors.debug',
'django.core.context_processors.request',
'django.core.context_processors.media',
'django.core.context_processors.csrf',
'cms.context_processors.cms_settings',
'sekizai.context_processors.sekizai',
'django.core.context_processors.static',
"django.contrib.auth.context_processors.auth",
"django.contrib.messages.context_processors.messages",
"django.core.context_processors.debug",
"django.core.context_processors.request",
"django.core.context_processors.media",
"django.core.context_processors.csrf",
"cms.context_processors.cms_settings",
"sekizai.context_processors.sekizai",
"django.core.context_processors.static",
],
MIDDLEWARE=[
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.cache.FetchFromCacheMiddleware',
'cms.middleware.user.CurrentUserMiddleware',
'cms.middleware.page.CurrentPageMiddleware',
'cms.middleware.toolbar.ToolbarMiddleware',
]
"django.contrib.sessions.middleware.SessionMiddleware",
"django.contrib.auth.middleware.AuthenticationMiddleware",
"django.contrib.messages.middleware.MessageMiddleware",
"django.middleware.csrf.CsrfViewMiddleware",
"django.middleware.common.CommonMiddleware",
"django.middleware.cache.FetchFromCacheMiddleware",
"cms.middleware.user.CurrentUserMiddleware",
"cms.middleware.page.CurrentPageMiddleware",
"cms.middleware.toolbar.ToolbarMiddleware",
],
)


@override_settings(**overrides)
class TestNoI18N(CMSTestCase):

def setUp(self):
clear_url_caches()
super().setUp()
Expand All @@ -53,27 +56,27 @@ def test_language_chooser(self):
# test simple language chooser with default args
create_page("home", template="col_two.html", language="en-us")
context = self.get_context(path="/")
del context['request'].LANGUAGE_CODE
del context["request"].LANGUAGE_CODE
tpl = Template("{% load menu_tags %}{% language_chooser %}")
tpl.render(context)
self.assertEqual(len(context['languages']), 1)
self.assertEqual(len(context["languages"]), 1)
# try a different template and some different args
tpl = Template("{% load menu_tags %}{% language_chooser 'menu/test_language_chooser.html' %}")
tpl.render(context)
self.assertEqual(context['template'], 'menu/test_language_chooser.html')
self.assertEqual(context["template"], "menu/test_language_chooser.html")
tpl = Template("{% load menu_tags %}{% language_chooser 'short' 'menu/test_language_chooser.html' %}")
tpl.render(context)
self.assertEqual(context['template'], 'menu/test_language_chooser.html')
for lang in context['languages']:
self.assertEqual(context["template"], "menu/test_language_chooser.html")
for lang in context["languages"]:
self.assertEqual(*lang)

def test_page_language_url(self):
with self.settings(ROOT_URLCONF='cms.test_utils.project.urls_no18n'):
with self.settings(ROOT_URLCONF="cms.test_utils.project.urls_no18n"):
create_page("home", template="col_two.html", language="en-us")
path = "/"
context = self.get_context(path=path)
del context['request'].LANGUAGE_CODE
context['request'].urlconf = "cms.test_utils.project.urls_no18n"
del context["request"].LANGUAGE_CODE
context["request"].urlconf = "cms.test_utils.project.urls_no18n"
tpl = Template("{%% load menu_tags %%}{%% page_language_url '%s' %%}" % "en-us")
url = tpl.render(context)
self.assertEqual(url, "%s" % path)
Expand All @@ -82,51 +85,53 @@ def test_url_redirect(self):
overrides = dict(
USE_I18N=True,
CMS_LANGUAGES={1: []},
LANGUAGES=[('en-us', 'English')],
LANGUAGES=[("en-us", "English")],
MIDDLEWARE=[
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.cache.FetchFromCacheMiddleware',
'cms.middleware.user.CurrentUserMiddleware',
'cms.middleware.page.CurrentPageMiddleware',
'cms.middleware.toolbar.ToolbarMiddleware',
]
"django.contrib.sessions.middleware.SessionMiddleware",
"django.contrib.auth.middleware.AuthenticationMiddleware",
"django.contrib.messages.middleware.MessageMiddleware",
"django.middleware.csrf.CsrfViewMiddleware",
"django.middleware.locale.LocaleMiddleware",
"django.middleware.common.CommonMiddleware",
"django.middleware.cache.FetchFromCacheMiddleware",
"cms.middleware.user.CurrentUserMiddleware",
"cms.middleware.page.CurrentPageMiddleware",
"cms.middleware.toolbar.ToolbarMiddleware",
],
)
with self.settings(**overrides):
homepage = create_page(
"home",
template="col_two.html",
language="en-us",
redirect='/foobar/',
redirect="/foobar/",
)
homepage.set_as_homepage()
response = self.client.get('/', follow=False)
response = self.client.get("/", follow=False)
self.assertTrue(response.status_code, 302) # Needs to redirect
self.assertTrue(response['Location'].endswith("/foobar/")) # to /foobar/
self.assertTrue(response["Location"].endswith("/foobar/")) # to /foobar/

def test_plugin_add_edit(self):
page_data = {
'title': 'test page 1',
'slug': 'test-page1',
'language': "en-us",
'parent': '',
"title": "test page 1",
"slug": "test-page1",
"language": "en-us",
"parent": "",
}
# required only if user haves can_change_permission
self.super_user = self._create_user("test", True, True)
self.client.login(username=getattr(self.super_user, get_user_model().USERNAME_FIELD),
password=getattr(self.super_user, get_user_model().USERNAME_FIELD))
self.client.login(
username=getattr(self.super_user, get_user_model().USERNAME_FIELD),
password=getattr(self.super_user, get_user_model().USERNAME_FIELD),
)

self.client.post(self.get_page_add_uri('en'), page_data)
self.client.post(self.get_page_add_uri("en"), page_data)
page = Page.objects.first()
self.client.post(self.get_page_change_template_uri('en-us', page)[3:], page_data)
self.client.post(self.get_page_change_template_uri("en-us", page)[3:], page_data)
page = Page.objects.first()
placeholder = page.get_placeholders("en-us").latest('id')
data = {'name': 'Hello', 'external_link': 'http://www.example.org/'}
add_url = self.get_add_plugin_uri(placeholder, 'LinkPlugin', 'en-us')
placeholder = page.get_placeholders("en-us").latest("id")
data = {"name": "Hello", "external_link": "http://www.example.org/"}
add_url = self.get_add_plugin_uri(placeholder, "LinkPlugin", "en-us")

response = self.client.post(add_url, data)
self.assertEqual(response.status_code, 200)
Expand All @@ -135,9 +140,17 @@ def test_plugin_add_edit(self):
edit_url = self.get_change_plugin_uri(created_plugin)
response = self.client.get(edit_url)
self.assertEqual(response.status_code, 200)
data['name'] = 'Hello World'
data["name"] = "Hello World"
response = self.client.post(edit_url, data)
self.assertEqual(response.status_code, 200)
Link = self.get_plugin_model('LinkPlugin')
Link = self.get_plugin_model("LinkPlugin")
link = Link.objects.get(pk=created_plugin.pk)
self.assertEqual("Hello World", link.name)

@patch("django.utils.translation._trans", new=trans_null)
def test_inherit_label(self):
page = create_page("test", "nav_playground.html", "en-us", published=True)
with self.login_user_context(self.get_superuser()):
endpoint = self.get_admin_url(PageContent, "change", page.get_content_obj("en-us").pk)
response = self.client.get(endpoint)
self.assertContains(response, '<option value="%s">' % TEMPLATE_INHERITANCE_MAGIC)
3 changes: 2 additions & 1 deletion cms/utils/conf.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import os
from functools import update_wrapper
from typing import Any
from urllib.parse import urljoin

from django.conf import settings
Expand Down Expand Up @@ -133,7 +134,7 @@ def get_toolbar_url__enable():
return get_cms_setting('TOOLBAR_URL__ENABLE')


def get_templates():
def get_templates() -> list[tuple[str, Any]]:
if getattr(settings, 'CMS_TEMPLATES_DIR', False):
tpldir = getattr(settings, 'CMS_TEMPLATES_DIR', False)
# CMS_TEMPLATES_DIR can either be a string pointing to the templates directory
Expand Down
Loading
0