8000 fix: show_placeholder did not respect edit/preview mode and failed lo… · django-cms/django-cms@b2c9b97 · GitHub
[go: up one dir, main page]

Skip to content

Commit b2c9b97

Browse files
authored
fix: show_placeholder did not respect edit/preview mode and failed loudly (#8272)
* fix: show_placeholder tag * Add test * Use current_content * fix: test names switched * Better naming inside test * fix: docs * Update docs/requirements.txt * Fix django_settings for docs
1 parent a1ba9c2 commit b2c9b97

File tree

7 files changed

+31
-20
lines changed

7 files changed

+31
-20
lines changed

cms/admin/utils.py

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -737,11 +737,6 @@ def __init__(self, *args, **kwargs):
737737
# Will be set on admin model save
738738
self.fields[CONTENT_PREFIX + self._admin.grouper_field_name].required = False
739739
self.update_labels(self._content_fields)
740-
if hasattr(self._admin, "can_change_content") and False:
741-
if not self._admin.can_change_content(self._request, self._content_instance):
742-
# Only allow content object fields to be edited if user can change them
743-
for field in self._additional_content_fields:
744-
self.fields[field].disabled = True
745740

746741
def update_labels(self, fields: list[str]) -> None:
747742
"""Adds a language indicator to field labels"""

cms/models/pagemodel.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -872,10 +872,14 @@ def get_menu_title(self, language=None, fallback=True, force_reload=False):
872872
return self.get_title(language, True, force_reload)
873873
return menu_title
874874

875-
def get_placeholders(self, language):
875+
def get_placeholders(self, language: str, admin_manager: bool = False) -> models.QuerySet:
876876
from cms.models import PageContent, Placeholder
877877

878-
page_content = PageContent.objects.get(language=language, page=self)
878+
if admin_manager:
879+
# Use the admin manager to get the current content (i.e. potentially not yet published content)
880+
page_content = PageContent.admin_manager.current_content().get(language=language, page=self)
881+
else:
882+
page_content = PageContent.objects.get(language=language, page=self)
879883
return Placeholder.objects.get_for_obj(page_content)
880884

881885
def get_changed_date(self, language=None, fallback=True, force_reload=False):

cms/templatetags/cms_tags.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
from cms.models import (
3939
CMSPlugin,
4040
Page,
41+
PageContent,
4142
Placeholder as PlaceholderModel,
4243
)
4344
from cms.plugin_pool import plugin_pool
@@ -121,8 +122,10 @@ def _show_placeholder_by_id(context, placeholder_name, reverse_id, lang=None, si
121122
lang = renderer.request_language
122123

123124
try:
124-
placeholder = page.get_placeholders(lang).get(slot=placeholder_name)
125-
except PlaceholderModel.DoesNotExist:
125+
toolbar = get_toolbar_from_request(request)
126+
admin_manager = toolbar.edit_mode_active or toolbar.preview_mode_active
127+
placeholder = page.get_placeholders(lang, admin_manager=admin_manager).get(slot=placeholder_name)
128+
except (PlaceholderModel.DoesNotExist, PageContent.DoesNotExist):
126129
if settings.DEBUG:
127130
raise
128131
return ""

cms/tests/test_templatetags.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,22 @@ def test_get_page_by_untyped_arg_fail(self):
285285
request = self.get_request("/")
286286
self.assertRaises(TypeError, _get_page_by_untyped_arg, [], request, 1)
287287

288+
def test_show_placeholder_for_page_content_does_not_exist(self):
289+
"""
290+
Verify ``show_placeholder`` correctly handles being given an
291+
invalid page content (language).
292+
"""
293+
294+
with self.settings(DEBUG=True):
295+
context = self.get_context("/")
296+
297+
self.assertRaises(
298+
PageContent.DoesNotExist, _show_placeholder_by_id, context, "content", "myreverseid", lang="does_not_exist"
299+
)
300+
with self.settings(DEBUG=False):
301+
content = _show_placeholder_by_id(context, "content", "myreverseid", lang="does_not_exist")
302+
self.assertEqual(content, "")
303+
288304
def test_show_placeholder_for_page_placeholder_does_not_exist(self):
289305
67E6 """
290306
Verify ``show_placeholder`` correctly handles being given an

docs/django_settings.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
'django.contrib.auth',
99
'django.contrib.contenttypes',
1010
'django.contrib.sessions',
11-
'djangocms_admin_style',
1211
'django.contrib.admin',
1312
'django.contrib.sites',
1413
'django.contrib.staticfiles',

docs/requirements.in

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ sphinx-autobuild
1010
datetime
1111
coverage
1212
django~=4.2
13-
git+https://github.com/django-cms/django-cms@release/build
13+
git+https://github.com/django-cms/django-cms@main
1414
codespell
1515
pip-tools
1616
docstrfmt

docs/requirements.txt

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#
2-
# This file is autogenerated by pip-compile with Python 3.11
2+
# This file is autogenerated by pip-compile with Python 3.13
33
# by the following command:
44
#
55
# pip-compile --output-file=requirements.txt requirements.in
@@ -46,21 +46,18 @@ django==4.2.22
4646
# django-formtools
4747
# django-sekizai
4848
# django-treebeard
49-
# djangocms-admin-style
5049
django-classy-tags==4.1.0
5150
# via
5251
# django-cms
5352
# django-sekizai
54-
django-cms @ git+https://github.com/django-cms/django-cms@release/build
53+
django-cms @ git+https://github.com/django-cms/django-cms@main
5554
# via -r requirements.in
5655
django-formtools==2.5.1
5756
# via django-cms
5857
django-sekizai==4.1.0
5958
# via django-cms
6059
django-treebeard==4.7.1
6160
# via django-cms
62-
djangocms-admin-style==3.3.1
63-
# via django-cms
6461
djangocms-ecosystem @ git+https://github.com/django-cms/djangocms-ecosystem
6562
# via -r requirements.in
6663
docstrfmt==1.10.0
@@ -93,7 +90,6 @@ packaging==24.2
9390
# via
9491
# black
9592
# build
96-
# django-cms
9793
# sphinx
9894
pathspec==0.12.1
9995
# via black
@@ -173,9 +169,7 @@ tabulate==0.9.0
173169
toml==0.10.2
174170
# via docstrfmt
175171
typing-extensions==4.12.2
176-
# via
177-
# anyio
178-
# beautifulsoup4
172+
# via beautifulsoup4
179173
urllib3==2.5.0
180174
# via requests
181175
uvicorn==0.34.0

0 commit comments

Comments
 (0)
0