Skip to content

Commit 68aa0b3

Browse files
fsbraunvinitkumar
andauthored
fix: Page settings raised an exception when USE_I18N = False (#8236)
* fix: Remove circular import in `cms.forms.validators` (#8225) * Remove circular import * Fix linting * Update cms/forms/validators.py * fix: Do not assume page url cache is filled * fix: Structure board update sometimes failed to add all interactive elements (#8227) * fix: Scan plugin data after structure mode Xhr load * Fix test * fix js linting issues * fix: Empty plugin selectors in all but first placeholder * fix: Show all text-enabled plugins (#8229) * fix: Adjust checks for GrouperAdmin to allow for `prepopulated_fields` * fix: Page settings raised an exception when `USE_I18N = False` * update ruff check * Fix pk reference --------- Co-authored-by: Vinit Kumar <mail@vinitkumar.me>
1 parent 0e99c42 commit 68aa0b3

File tree

5 files changed

+78
-63
lines changed

5 files changed

+78
-63
lines changed

cms/forms/validators.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from cms.utils.urlutils import admin_reverse, relative_url_regex
99

1010
if TYPE_CHECKING:
11+
# Only needed for type hinting - avoid circular import
1112
from cms.models.pagemodel import Page
1213

1314

cms/models/contentmodels.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ class PageContent(models.Model):
2525
(constants.X_FRAME_OPTIONS_ALLOW, _('Allow'))
2626
)
2727

28-
template_choices = [(x, _(y)) for x, y in get_cms_setting('TEMPLATES')]
28+
template_choices = get_cms_setting('TEMPLATES')
2929

3030
# These are the fields whose values are compared when saving
3131
# a PageContent object to know if it has changed.

cms/plugin_pool.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -177,8 +177,8 @@ def get_all_plugins(
177177
return plugins
178178

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

184184
def get_plugin(self, name) -> type[CMSPluginBase]:

cms/tests/test_no_i18n.py

Lines changed: 72 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,49 @@
1+
from unittest.mock import patch
2+
13
from django.contrib.auth import get_user_model
24
from django.template import Template
35
from django.test.utils import override_settings
46
from django.urls import clear_url_caches
7+
from django.utils.translation import trans_null
58

69
from cms.api import create_page
7-
from cms.models import CMSPlugin, Page
10+
from cms.constants import TEMPLATE_INHERITANCE_MAGIC
11+
from cms.models import CMSPlugin, Page, PageContent
812
from cms.test_utils.testcases import CMSTestCase
913

1014
overrides = dict(
11-
LANGUAGE_CODE='en-us',
15+
LANGUAGE_CODE="en-us",
1216
LANGUAGES=[],
1317
CMS_LANGUAGES={},
1418
USE_I18N=False,
15-
ROOT_URLCONF='cms.test_utils.project.urls_no18n',
19+
ROOT_URLCONF="cms.test_utils.project.urls_no18n",
1620
TEMPLATE_CONTEXT_PROCESSORS=[
17-
'django.contrib.auth.context_processors.auth',
18-
'django.contrib.messages.context_processors.messages',
19-
'django.core.context_processors.debug',
20-
'django.core.context_processors.request',
21-
'django.core.context_processors.media',
22-
'django.core.context_processors.csrf',
23-
'cms.context_processors.cms_settings',
24-
'sekizai.context_processors.sekizai',
25-
'django.core.context_processors.static',
21+
"django.contrib.auth.context_processors.auth",
22+
"django.contrib.messages.context_processors.messages",
23+
"django.core.context_processors.debug",
24+
"django.core.context_processors.request",
25+
"django.core.context_processors.media",
26+
"django.core.context_processors.csrf",
27+
"cms.context_processors.cms_settings",
28+
"sekizai.context_processors.sekizai",
29+
"django.core.context_processors.static",
2630
],
2731
MIDDLEWARE=[
28-
'django.contrib.sessions.middleware.SessionMiddleware',
29-
'django.contrib.auth.middleware.AuthenticationMiddleware',
30-
'django.contrib.messages.middleware.MessageMiddleware',
31-
'django.middleware.csrf.CsrfViewMiddleware',
32-
'django.middleware.common.CommonMiddleware',
33-
'django.middleware.cache.FetchFromCacheMiddleware',
34-
'cms.middleware.user.CurrentUserMiddleware',
35-
'cms.middleware.page.CurrentPageMiddleware',
36-
'cms.middleware.toolbar.ToolbarMiddleware',
37-
]
32+
"django.contrib.sessions.middleware.SessionMiddleware",
33+
"django.contrib.auth.middleware.AuthenticationMiddleware",
34+
"django.contrib.messages.middleware.MessageMiddleware",
35+
"django.middleware.csrf.CsrfViewMiddleware",
36+
"django.middleware.common.CommonMiddleware",
37+
"django.middleware.cache.FetchFromCacheMiddleware",
38+
"cms.middleware.user.CurrentUserMiddleware",
39+
"cms.middleware.page.CurrentPageMiddleware",
40+
"cms.middleware.toolbar.ToolbarMiddleware",
41+
],
3842
)
3943

4044

4145
@override_settings(**overrides)
4246
class TestNoI18N(CMSTestCase):
43-
4447
def setUp(self):
4548
clear_url_caches()
4649
super().setUp()
@@ -53,27 +56,27 @@ def test_language_chooser(self):
5356
# test simple language chooser with default args
5457
create_page("home", template="col_two.html", language="en-us")
5558
context = self.get_context(path="/")
56-
del context['request'].LANGUAGE_CODE
59+
del context["request"].LANGUAGE_CODE
5760
tpl = Template("{% load menu_tags %}{% language_chooser %}")
5861
tpl.render(context)
59-
self.assertEqual(len(context['languages']), 1)
62+
self.assertEqual(len(context["languages"]), 1)
6063
# try a different template and some different args
6164
tpl = Template("{% load menu_tags %}{% language_chooser 'menu/test_language_chooser.html' %}")
6265
tpl.render(context)
63-
self.assertEqual(context['template'], 'menu/test_language_chooser.html')
66+
self.assertEqual(context["template"], "menu/test_language_chooser.html")
6467
tpl = Template("{% load menu_tags %}{% language_chooser 'short' 'menu/test_language_chooser.html' %}")
6568
tpl.render(context)
66-
self.assertEqual(context['template'], 'menu/test_language_chooser.html')
67-
for lang in context['languages']:
69+
self.assertEqual(context["template"], "menu/test_language_chooser.html")
70+
for lang in context["languages"]:
6871
self.assertEqual(*lang)
6972

7073
def test_page_language_url(self):
71-
with self.settings(ROOT_URLCONF='cms.test_utils.project.urls_no18n'):
74+
with self.settings(ROOT_URLCONF="cms.test_utils.project.urls_no18n"):
7275
create_page("home", template="col_two.html", language="en-us")
7376
path = "/"
7477
context = self.get_context(path=path)
75-
del context['request'].LANGUAGE_CODE
76-
context['request'].urlconf = "cms.test_utils.project.urls_no18n"
78+
del context["request"].LANGUAGE_CODE
79+
context["request"].urlconf = "cms.test_utils.project.urls_no18n"
7780
tpl = Template("{%% load menu_tags %%}{%% page_language_url '%s' %%}" % "en-us")
7881
url = tpl.render(context)
7982
self.assertEqual(url, "%s" % path)
@@ -82,51 +85,53 @@ def test_url_redirect(self):
8285
overrides = dict(
8386
USE_I18N=True,
8487
CMS_LANGUAGES={1: []},
85-
LANGUAGES=[('en-us', 'English')],
88+
LANGUAGES=[("en-us", "English")],
8689
MIDDLEWARE=[
87-
'django.contrib.sessions.middleware.SessionMiddleware',
88-
'django.contrib.auth.middleware.AuthenticationMiddleware',
89-
'django.contrib.messages.middleware.MessageMiddleware',
90-
'django.middleware.csrf.CsrfViewMiddleware',
91-
'django.middleware.locale.LocaleMiddleware',
92-
'django.middleware.common.CommonMiddleware',
93-
'django.middleware.cache.FetchFromCacheMiddleware',
94-
'cms.middleware.user.CurrentUserMiddleware',
95-
'cms.middleware.page.CurrentPageMiddleware',
96-
'cms.middleware.toolbar.ToolbarMiddleware',
97-
]
90+
"django.contrib.sessions.middleware.SessionMiddleware",
91+
"django.contrib.auth.middleware.AuthenticationMiddleware",
92+
"django.contrib.messages.middleware.MessageMiddleware",
93+
"django.middleware.csrf.CsrfViewMiddleware",
94+
"django.middleware.locale.LocaleMiddleware",
95+
"django.middleware.common.CommonMiddleware",
96+
"django.middleware.cache.FetchFromCacheMiddleware",
97+
"cms.middleware.user.CurrentUserMiddleware",
98+
"cms.middleware.page.CurrentPageMiddleware",
99+
"cms.middleware.toolbar.ToolbarMiddleware",
100+
],
98101
)
99102
with self.settings(**overrides):
100103
homepage = create_page(
101104
"home",
102105
template="col_two.html",
103106
language="en-us",
104-
redirect='/foobar/',
107+
redirect="/foobar/",
105108
)
106109
homepage.set_as_homepage()
107-
response = self.client.get('/', follow=False)
110+
response = self.client.get("/", follow=False)
108111
self.assertTrue(response.status_code, 302) # Needs to redirect
109-
self.assertTrue(response['Location'].endswith("/foobar/")) # to /foobar/
112+
self.assertTrue(response["Location"].endswith("/foobar/")) # to /foobar/
110113

111114
def test_plugin_add_edit(self):
112115
page_data = {
113-
'title': 'test page 1',
114-
'slug': 'test-page1',
115-
'language': "en-us",
116-
'parent': '',
116+
"title": "test page 1",
117+
"slug": "test-page1",
118+
"language": "en-us",
119+
"parent": "",
117120
}
118121
# required only if user haves can_change_permission
119122
self.super_user = self._create_user("test", True, True)
120-
self.client.login(username=getattr(self.super_user, get_user_model().USERNAME_FIELD),
121-
password=getattr(self.super_user, get_user_model().USERNAME_FIELD))
123+
self.client.login(
124+
username=getattr(self.super_user, get_user_model().USERNAME_FIELD),
125+
password=getattr(self.super_user, get_user_model().USERNAME_FIELD),
126+
)
122127

123-
self.client.post(self.get_page_add_uri('en'), page_data)
128+
self.client.post(self.get_page_add_uri("en"), page_data)
124129
page = Page.objects.first()
125-
self.client.post(self.get_page_change_template_uri('en-us', page)[3:], page_data)
130+
self.client.post(self.get_page_change_template_uri("en-us", page)[3:], page_data)
126131
page = Page.objects.first()
127-
placeholder = page.get_placeholders("en-us").latest('id')
128-
data = {'name': 'Hello', 'external_link': 'http://www.example.org/'}
129-
add_url = self.get_add_plugin_uri(placeholder, 'LinkPlugin', 'en-us')
132+
placeholder = page.get_placeholders("en-us").latest("id")
133+
data = {"name": "Hello", "external_link": "http://www.example.org/"}
134+
add_url = self.get_add_plugin_uri(placeholder, "LinkPlugin", "en-us")
130135

131136
response = self.client.post(add_url, data)
132137
self.assertEqual(response.status_code, 200)
@@ -135,9 +140,17 @@ def test_plugin_add_edit(self):
135140
edit_url = self.get_change_plugin_uri(created_plugin)
136141
response = self.client.get(edit_url)
137142
self.assertEqual(response.status_code, 200)
138-
data['name'] = 'Hello World'
143+
data["name"] = "Hello World"
139144
response = self.client.post(edit_url, data)
140145
self.assertEqual(response.status_code, 200)
141-
Link = self.get_plugin_model('LinkPlugin')
146+
Link = self.get_plugin_model("LinkPlugin")
142147
link = Link.objects.get(pk=created_plugin.pk)
143148
self.assertEqual("Hello World", link.name)
149+
150+
@patch("django.utils.translation._trans", new=trans_null)
151+
def test_inherit_label(self):
152+
page = create_page("test", "nav_playground.html", "en-us", published=True)
153+
with self.login_user_context(self.get_superuser()):
154+
endpoint = self.get_admin_url(PageContent, "change", page.get_content_obj("en-us").pk)
155+
response = self.client.get(endpoint)
156+
self.assertContains(response, '<option value="%s">' % TEMPLATE_INHERITANCE_MAGIC)

cms/utils/conf.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import os
22
from functools import update_wrapper
3+
from typing import Any
34
from urllib.parse import urljoin
45

56
from django.conf import settings
@@ -133,7 +134,7 @@ def get_toolbar_url__enable():
133134
return get_cms_setting('TOOLBAR_URL__ENABLE')
134135

135136

136-
def get_templates():
137+
def get_templates() -> list[tuple[str, Any]]:
137138
if getattr(settings, 'CMS_TEMPLATES_DIR', False):
138139
tpldir = getattr(settings, 'CMS_TEMPLATES_DIR', False)
139140
# CMS_TEMPLATES_DIR can either be a string pointing to the templates directory

0 commit comments

Comments
 (0)