8000 fix: Detect page when getting toolbar for endpoint (#8137) · django-cms/django-cms@76cb708 · GitHub
[go: up one dir, main page]

Skip to content

Commit 76cb708

Browse files
authored
fix: Detect page when getting toolbar for endpoint (#8137)
1 parent 01fd09b commit 76cb708

File tree

3 files changed

+102
-72
lines changed

3 files changed

+102
-72
lines changed

cms/admin/forms.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1497,7 +1497,9 @@ def clean(self):
14971497

14981498
try:
14991499
# Use admin manager if available for the toolbar form
1500-
if hasattr(model_class, "admin_manager"):
1500+
if issubclass(model_class, PageContent):
1501+
generic_obj = model_class.admin_manager.select_related("page").get(pk=obj_id)
1502+
elif hasattr(model_class, "admin_manager"):
15011503
generic_obj = model_class.admin_manager.get(pk=obj_id)
15021504
else:
15031505
generic_obj = model_class.objects.get(pk=obj_id)

cms/admin/settingsadmin.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
from cms.admin.forms import RequestToolbarForm
2121
from cms.models import UserSettings
22+
from cms.models.contentmodels import PageContent
2223
from cms.utils.page import get_page_from_request
2324
from cms.utils.urlutils import admin_reverse
2425

@@ -80,10 +81,10 @@ def get_toolbar(self, request):
8081
cms_path = form_data.get('cms_path') or request.path_info
8182
origin_url = urlparse(cms_path)
8283
attached_obj = form_data.get('attached_obj')
83-
current_page = get_page_from_request(request, use_path=origin_url.path, clean_path=True)
84-
85-
if attached_obj and current_page and not (attached_obj == current_page):
86-
return HttpResponseBadRequest('Generic object does not match current page')
84+
if isinstance(attached_obj, PageContent):
85+
current_page = attached_obj.page
86+
else:
87+
current_page = get_page_from_request(request, use_path=origin_url.path, clean_path=True)
8788

8889
data = QueryDict(query_string=origin_url.query, mutable=True)
8990
placeholders = request.GET.getlist("placeholders[]")

cms/tests/test_placeholder_admin.py

Lines changed: 94 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,20 @@
1010

1111

1212
class PlaceholderAdminTestCase(CMSTestCase):
13-
1413
def test_add_plugin_endpoint(self):
1514
"""
1615
The Placeholder admin add_plugin endpoint works
1716
"""
1817
superuser = self.get_superuser()
19-
placeholder = Placeholder.objects.create(slot='test')
20-
plugins = placeholder.get_plugins('en').filter(plugin_type='LinkPlugin')
18+
placeholder = Placeholder.objects.create(slot="test")
19+
plugins = placeholder.get_plugins("en").filter(plugin_type="LinkPlugin")
2120
uri = self.get_add_plugin_uri(
2221
placeholder=placeholder,
23-
plugin_type='LinkPlugin',
24-
language='en',
22+
plugin_type="LinkPlugin",
23+
language="en",
2524
)
2625
with self.login_user_context(superuser):
27-
data = {'name': 'A Link', 'external_link': 'https://www.django-cms.org'}
26+
data = {"name": "A Link", "external_link": "https://www.django-cms.org"}
2827
response = self.client.post(uri, data)
2928

3029
self.assertEqual(response.status_code, 200)
@@ -35,28 +34,23 @@ def test_add_plugins_from_placeholder(self):
3534
User can copy plugins from one placeholder to another
3635
"""
3736
superuser = self.get_superuser()
38-
source_placeholder = Placeholder.objects.create(slot='source')
39-
target_placeholder = Placeholder.objects.create(slot='target')
37+
source_placeholder = Placeholder.objects.create(slot="source")
38+
target_placeholder = Placeholder.objects.create(slot="target")
4039
source_plugin = self._add_plugin_to_placeholder(source_placeholder)
4140
endpoint = self.get_copy_plugin_uri(source_plugin)
4241
with self.login_user_context(superuser):
4342
data = {
44-
'source_language': "en",
45-
'source_placeholder_id': source_placeholder.pk,
46-
'target_language': "en",
47-
'target_placeholder_id': target_placeholder.pk,
43+
"source_language": "en",
44+
"source_placeholder_id": source_placeholder.pk,
45+
"target_language": "en",
46+
"target_placeholder_id": target_placeholder.pk,
4847
}
4948
response = self.client.post(endpoint, data)
5049

5150
# Test that the target placeholder has the plugin copied from the source placeholder
5251
self.assertEqual(response.status_code, 200)
53-
self.assertTrue(source_placeholder.get_plugins('en').filter(pk=source_plugin.pk).exists())
54-
self.assertTrue(
55-
target_placeholder
56-
.get_plugins('en')
57-
.filter(plugin_type=source_plugin.plugin_type)
58-
.exists()
59-
)
52+
self.assertTrue(source_placeholder.get_plugins("en").filter(pk=source_plugin.pk).exists())
53+
self.assertTrue(target_placeholder.get_plugins("en").filter(plugin_type=source_plugin.plugin_type).exists())
6054

6155
def test_copy_plugins_to_clipboard(self):
6256
"""
@@ -68,27 +62,24 @@ def test_copy_plugins_to_clipboard(self):
6862
user=superuser,
6963
clipboard=Placeholder.objects.create(),
7064
)
71-
source_placeholder = Placeholder.objects.create(slot='source')
65+
source_placeholder = Placeholder.objects.create(slot="source")
7266
source_plugin = self._add_plugin_to_placeholder(source_placeholder)
7367
endpoint = self.get_copy_plugin_uri(source_plugin)
7468
with self.login_user_context(superuser):
7569
data = {
76-
'source_language': "en",
77-
'source_placeholder_id': source_placeholder.pk,
78-
'source_plugin_id': source_plugin.pk,
79-
'target_language': "en",
80-
'target_placeholder_id': user_settings.clipboard.pk,
70+
"source_language": "en",
71+
"source_placeholder_id": source_placeholder.pk,
72+
"source_plugin_id": source_plugin.pk,
73+
"target_language": "en",
74+
"target_placeholder_id": user_settings.clipboard.pk,
8175
}
8276
response = self.client.post(endpoint, data)
8377

8478
# Test that the target placeholder has the plugin copied from the source placeholder (clipboard)
8579
self.assertEqual(response.status_code, 200)
86-
self.assertTrue(source_placeholder.get_plugins('en').filter(pk=source_plugin.pk).exists())
80+
self.assertTrue(source_placeholder.get_plugins("en").filter(pk=source_plugin.pk).exists())
8781
self.assertTrue(
88-
user_settings.clipboard
89-
.get_plugins('en')
90-
.filter(plugin_type=source_plugin.plugin_type)
91-
.exists()
82+
user_settings.clipboard.get_plugins("en").filter(plugin_type=source_plugin.plugin_type).exists()
9283
)
9384

9485
def test_copy_placeholder_to_clipboard(self):
@@ -101,54 +92,49 @@ def test_copy_placeholder_to_clipboard(self):
10192
user=superuser,
10293
clipboard=Placeholder.objects.create(),
10394
)
104-
source_placeholder = Placeholder.objects.create(slot='source')
95+
source_placeholder = Placeholder.objects.create(slot="source")
10596
source_plugin = self._add_plugin_to_placeholder(source_placeholder)
10697
endpoint = self.get_copy_plugin_uri(source_plugin)
10798
with self.login_user_context(superuser):
10899
data = {
109-
'source_language': "en",
110-
'source_placeholder_id': source_placeholder.pk,
111-
'target_language': "en",
112-
'target_placeholder_id': user_settings.clipboard.pk,
100+
"source_language": "en",
101+
"source_placeholder_id": source_placeholder.pk,
102+
"target_language": "en",
103+
"target_placeholder_id": user_settings.clipboard.pk,
113104
}
114105
response = self.client.post(endpoint, data)
115106

116107
self.assertEqual(response.status_code, 200)
117-
self.assertTrue(source_placeholder.get_plugins('en').filter(pk=source_plugin.pk).exists())
118-
self.assertTrue(
119-
user_settings.clipboard
120-
.get_plugins('en')
121-
.filter(plugin_type='PlaceholderPlugin')
122-
.exists()
123-
)
108+
self.assertTrue(source_placeholder.get_plugins("en").filter(pk=source_plugin.pk).exists())
109+
self.assertTrue(user_settings.clipboard.get_plugins("en").filter(plugin_type="PlaceholderPlugin").exists())
124110

125111
def test_edit_plugin_endpoint(self):
126112
"""
127113
The Placeholder admin edit_plugins endpoint works
128114
"""
129115
superuser = self.get_superuser()
130-
placeholder = Placeholder.objects.create(slot='edit_plugin_placeholder')
116+
placeholder = Placeholder.objects.create(slot="edit_plugin_placeholder")
131117
plugin = self._add_plugin_to_placeholder(placeholder)
132118
endpoint = self.get_change_plugin_uri(plugin)
133119
with self.login_user_context(superuser):
134-
data = model_to_dict(plugin, fields=['name', 'external_link'])
135-
data['name'] = 'Contents modified'
120+
data = model_to_dict(plugin, fields=["name", "external_link"])
121+
data["name"] = "Contents modified"
136122
response = self.client.post(endpoint, data)
137123
plugin.refresh_from_db()
138124

139125
self.assertEqual(response.status_code, 200)
140-
self.assertEqual(plugin.name, data['name'])
126+
self.assertEqual(plugin.name, data["name"])
141127

142128
def test_delete_plugin_endpoint(self):
143129
"""
144130
The Placeholder admin delete_plugin endpoint works
145131
"""
146132
superuser = self.get_superuser()
147-
placeholder = Placeholder.objects.create(slot='source')
133+
placeholder = Placeholder.objects.create(slot="source")
148134
plugin = self._add_plugin_to_placeholder(placeholder)
149135
endpoint = self.get_delete_plugin_uri(plugin)
150136
with self.login_user_context(superuser):
151-
data = {'post': True}
137+
data = {"post": True}
152138
response = self.client.post(endpoint, data)
153139

154140
self.assertEqual(response.status_code, 302)
@@ -159,14 +145,14 @@ def test_clear_placeholder_endpoint(self):
159145
The Placeholder admin delete_plugin endpoint works
160146
"""
161147
superuser = self.get_superuser()
162-
placeholder = Placeholder.objects.create(slot='source')
148+
placeholder = Placeholder.objects.create(slot="source")
163149
self._add_plugin_to_placeholder(placeholder)
164150
endpoint = self.get_clear_placeholder_url(placeholder)
165151
with self.login_user_context(superuser):
166-
response = self.client.post(endpoint, {'test': 0})
152+
response = self.client.post(endpoint, {"test": 0})
167153

168154
self.assertEqual(response.status_code, 302)
169-
self.assertEqual(placeholder.get_plugins('en').count(), 0)
155+
self.assertEqual(placeholder.get_plugins("en").count(), 0)
170156

171157
def _fill_page_body(self, page, lang):
172158
ph_en = page.get_placeholders(lang).get(slot="placeholder")
@@ -183,19 +169,29 @@ def _fill_page_body(self, page, lang):
183169
add_plugin(ph_en, "LinkPlugin", lang, target=col4, name="A Link", external_link="https://www.django-cms.org")
184170
add_plugin(ph_en, "StylePlugin", lang, target=col4, tag_type="div")
185171

186-
@override_settings(CMS_PLACEHOLDER_CONF={
187-
'simple.html': {'excluded_plugins': ['InheritPlugin']},
188-
})
172+
@override_settings(
173+
CMS_PLACEHOLDER_CONF={
174+
"simple.html": {"excluded_plugins": ["InheritPlugin"]},
175+
}
176+
)
189177
def test_object_edit_endpoint(self):
190-
page = create_page('Page 1', 'simple.html', 'en')
191-
self._fill_page_body(page, 'en')
178+
page = create_page("Page 1", "simple.html", "en")
179+
self._fill_page_body(page, "en")
192180
content = page.get_content_obj()
193-
content_type = ContentType.objects.get(app_label='cms', model='pagecontent')
181+
content_type = ContentType.objects.get(app_label="cms", model="pagecontent")
194182
user = self.get_superuser()
195-
settings = UserSettings.objects.create(language="en", user=user, clipboard=Placeholder.objects.create(slot='clipboard'))
183+
settings = UserSettings.objects.create(
184+
language="en", user=user, clipboard=Placeholder.objects.create(slot="clipboard")
185+
)
196186
settings.clipboard.source = settings
197187
settings.clipboard.save()
198-
endpoint = admin_reverse('cms_placeholder_render_object_edit', args=(content_type.pk, content.pk,))
188+
endpoint = admin_reverse(
189+
"cms_placeholder_render_object_edit",
190+
args=(
191+
content_type.pk,
192+
content.pk,
193+
),
194+
)
199195
with self.login_user_context(user):
200196
with CaptureQueriesContext(connection) as queries:
201197
response = self.client.get(endpoint)
@@ -218,20 +214,30 @@ def test_object_edit_endpoint(self):
218214
# 14. SELECT "cms_cmsplugin"."id", "cms_cmsplugin"."placeholder_id", "cms_cmsplugin"."parent_id", "cms_cmsplugin"."position", "cms_cmsplugin"."language", "cms_cmsplugin"."plugin_type", "cms_cmsplugin"."creation_date", "cms_cmsplugin"."changed_date", "link_link"."cmsplugin_ptr_id", "link_link"."name", "link_link"."external_link" FROM "link_link" INNER JOIN "cms_cmsplugin" ON ("link_link"."cmsplugin_ptr_id" = "cms_cmsplugin"."id") WHERE "link_link"."cmsplugin_ptr_id" IN (7) ORDER BY "cms_cmsplugin"."position" ASC
219215
# 15. SELECT "cms_cmsplugin"."id", "cms_cmsplugin"."placeholder_id", "cms_cmsplugin"."parent_id", "cms_cmsplugin"."position", "cms_cmsplugin"."language", "cms_cmsplugin"."plugin_type", "cms_cmsplugin"."creation_date", "cms_cmsplugin"."changed_date", "style_style"."cmsplugin_ptr_id", "style_style"."label", "style_style"."tag_type", "style_style"."class_name", "style_style"."additional_classes" FROM "style_style" INNER JOIN "cms_cmsplugin" ON ("style_style"."cmsplugin_ptr_id" = "cms_cmsplugin"."id") WHERE "style_style"."cmsplugin_ptr_id" IN (9) ORDER BY "cms_cmsplugin"."position" ASC
220216

221-
@override_settings(CMS_PLACEHOLDER_CONF={
222-
'simple.html': {'excluded_plugins': ['InheritPlugin']},
223-
})
217+
@override_settings(
218+
CMS_PLACEHOLDER_CONF={
219+
"simple.html": {"excluded_plugins": ["InheritPlugin"]},
220+
}
221+
)
224222
def test_object_structure_endpoint(self):
225-
page = create_page('Page 1', 'simple.html', 'en')
226-
self._fill_page_body(page, 'en')
223+
page = create_page("Page 1", "simple.html", "en")
224+
self._fill_page_body(page, "en")
227225
content = page.get_content_obj()
228-
content_type = ContentType.objects.get(app_label='cms', model='pagecontent')
226+
content_type = ContentType.objects.get(app_label="cms", model="pagecontent")
229227
user = self.get_superuser()
230-
settings = UserSettings.objects.create(language="en", user=user, clipboard=Placeholder.objects.create(slot='clipboard'))
228+
settings = UserSettings.objects.create(
229+
language="en", user=user, clipboard=Placeholder.objects.create(slot="clipboard")
230+
)
231231
settings.clipboard.source = settings
232232
settings.clipboard.save()
233233

234-
endpoint = admin_reverse('cms_placeholder_render_object_structure', args=(content_type.pk, content.pk,))
234+
endpoint = admin_reverse(
235+
"cms_placeholder_render_object_structure",
236+
args=(
237+
content_type.pk,
238+
content.pk,
239+
),
240+
)
235241
with self.login_user_context(user):
236242
with CaptureQueriesContext(connection) as queries:
237243
response = self.client.get(endpoint)
@@ -255,3 +261,24 @@ def test_object_structure_endpoint(self):
255261
# 15. SELECT "cms_cmsplugin"."id", "cms_cmsplugin"."placeholder_id", "cms_cmsplugin"."parent_id", "cms_cmsplugin"."position", "cms_cmsplugin"."language", "cms_cmsplugin"."plugin_type", "cms_cmsplugin"."creation_date", "cms_cmsplugin"."changed_date", "link_link"."cmsplugin_ptr_id", "link_link"."name", "link_link"."external_link" FROM "link_link" INNER JOIN "cms_cmsplugin" ON ("link_link"."cmsplugin_ptr_id" = "cms_cmsplugin"."id") WHERE "link_link"."cmsplugin_ptr_id" IN (7) ORDER BY "cms_cmsplugin"."position" ASC
256262
# 16. SELECT "cms_cmsplugin"."language" AS "language" FROM "cms_cmsplugin" WHERE "cms_cmsplugin"."placeholder_id" = 1 ORDER BY "cms_cmsplugin"."position" ASC
257263
# 17. SELECT "cms_cmsplugin"."id", "cms_cmsplugin"."placeholder_id", "cms_cmsplugin"."parent_id", "cms_cmsplugin"."position", "cms_cmsplugin"."language", "cms_cmsplugin"."plugin_type", "cms_cmsplugin"."creation_date", "cms_cmsplugin"."changed_date", "style_style"."cmsplugin_ptr_id", "style_style"."label", "style_style"."tag_type", "style_style"."class_name", "style_style"."additional_classes" FROM "style_style" INNER JOIN "cms_cmsplugin" ON ("style_style"."cmsplugin_ptr_id" = "cms_cmsplugin"."id") WHERE "style_style"."cmsplugin_ptr_id" IN (9) ORDER BY "cms_cmsplugin"."position" ASC
264+
265+
def test_get_toolbar_endpoint(self):
266+
"""Toolbar endpoint returns the toolbar including the page menu when called from the edit endpoint"""
267+
page = create_page("Page 1", "simple.html", "en")
268+
self._fill_page_body(page, "en")
269+
content = page.get_content_obj()
270+
content_type = ContentType.objects.get(app_label="cms", model="pagecontent")
271+
user = self.get_superuser()
272+
toolbar_endpoint = admin_reverse("cms_usersettings_get_toolbar")
273+
edit_endpoint = admin_reverse(
274+
"cms_placeholder_render_object_edit",
275+
args=(
276+
content_type.pk,
277+
content.pk,
278+
),
279+
)
280+
281+
with self.login_user_context(user):
282+
response = self.client.get(f"{toolbar_endpoint}?obj_id={content.id}&obj_type=cms.pagecontent&cms_path={edit_endpoint}")
283+
284+
self.assertContains(response, '<span>Page<span class="cms-icon cms-icon-arrow"></span></span>') # Contains page menu

0 commit comments

Comments
 (0)
0