8000 fix: Accept legacy action names for page permission check (#8021) · django-cms/django-cms@9a1e178 · GitHub
[go: up one dir, main page]

Skip to content

Commit 9a1e178

Browse files
fsbraunGithub Release Action
andauthored
fix: Accept legacy action names for page permission check (#8021)
* Fix: Accept legacy action names for page permission check * Add: Warnings test, collect compatibility code at one place * Fix: replace `assertWarns` by `failUnlessWarns` in existing tests --------- Co-authored-by: Github Release Action <info@django-cms.org>
1 parent 1f864af commit 9a1e178

File tree

11 files changed

+49
-10
lines changed

11 files changed

+49
-10
lines changed

cms/admin/pageadmin.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -571,7 +571,7 @@ def get_permissions(self, request, page_id):
571571
if can_change_global_permissions:
572572
can_change = True
573573
else:
574-
page_path = permission.page.node.path
574+
page_path = permission.page.path
575575
can_change = any(perm_tuple.contains(page_path) for perm_tuple in allowed_pages)
576576

577577
row = PermissionRow(

cms/models/permissionmodels.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -277,8 +277,7 @@ def clean(self):
277277
raise ValidationError(message)
278278

279279
def get_page_permission_tuple(self):
280-
node = self.page.node
281-
return PermissionTuple((self.grant_on, node.path))
280+
return PermissionTuple((self.grant_on, self.page.path))
282281

283282
def get_page_ids(self):
284283
import warnings

cms/test_utils/testcases.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -476,8 +476,6 @@ def failUnlessWarns(self, category, message, f, *args, **kwargs):
476476
self.fail(f"Warning {message} not given.")
477477
return result
478478

479-
assertWarns = failUnlessWarns
480-
481479
def load_template_from_string(self, template):
482480
return engines['django'].from_string(template)
483481

cms/tests/test_extensions.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -435,7 +435,7 @@ def populate(self):
435435

436436
message = "get_title_extension_admin has been deprecated and replaced by get_page_content_extension_admin"
437437
with self.login_user_context(self.admin):
438-
self.assertWarns(
438+
self.failUnlessWarns(
439439
RemovedInDjangoCMS43Warning,
440440
message,
441441
lambda: self.client.get(self.page.get_absolute_url()),

cms/tests/test_permissions.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,10 @@
99
)
1010
from cms.models.permissionmodels import ACCESS_PAGE_AND_DESCENDANTS, GlobalPagePermission
1111
from cms.test_utils.testcases import CMSTestCase
12+
from cms.utils.compat.warnings import RemovedInDjangoCMS43Warning
1213
from cms.utils.page_permissions import (
1314
get_change_perm_tuples,
15+
has_generic_permission,
1416
user_can_publish_page,
1517
)
1618

@@ -88,3 +90,24 @@ def test_cached_permission_precedence(self):
8890
Site.objects.get_current(),
8991
)
9092
self.assertTrue(can_publish)
93+
94+
def test_has_generic_permissions_compatibiltiy(self):
95+
from cms.utils.permissions import has_page_permission
96+
97+
page_b = create_page("page_b", "nav_playground.html", "en",
98+
created_by=self.user_super)
99+
assign_user_to_page(page_b, self.user_normal, can_view=True,
100+
can_change=True)
101+
102+
self.assertTrue(has_generic_permission(page_b, self.user_normal, "change_page"))
103+
self.assertFalse(has_generic_permission(page_b, self.user_normal, "publish_page"))
104+
105+
message = ("has_page_permission is deprecated and will be removed in django CMS 4.3. "
106+
"Use cms.utils.page_permissions.has_generic_permission instead.")
107+
# Backwards compatibility: check if the old permission names work
108+
with self.assertWarns(RemovedInDjangoCMS43Warning) as w:
109+
self.assertTrue(has_page_permission(self.user_normal, page_b, "change"))
110+
self.assertEqual(str(w.warning), message)
111+
with self.assertWarns(RemovedInDjangoCMS43Warning) as w:
112+
self.assertFalse(has_page_permission(self.user_normal, page_b, "publish"))
113+
self.assertEqual(str(w.warning), message)

cms/tests/test_placeholder.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ def test_placeholder_scanning_nested(self):
109109
self.assertEqual(sorted(placeholders), sorted(['new_one', 'new_two', 'new_three']))
110110

111111
def test_placeholder_scanning_duplicate(self):
112-
placeholders = self.assertWarns(
112+
placeholders = self.failUnlessWarns(
113113
DuplicatePlaceholderWarning,
114114
'Duplicate {% placeholder "one" %} in template placeholder_tests/test_seven.html.',
115115
_get_placeholder_slots, 'placeholder_tests/test_seven.html'

cms/tests/test_plugins.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -693,7 +693,7 @@ def test_page_attribute_warns(self):
693693
def get_page(plugin):
694694
return plugin.page
695695

696-
self.assertWarns(
696+
self.failUnlessWarns(
697697
DontUsePageAttributeWarning,
698698
"Don't use the page attribute on CMSPlugins! "
699699
"CMSPlugins are not guaranteed to have a page associated with them!",

cms/tests/test_views.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,7 @@ def test_context_current_page(self):
406406
template = Variable('CMS_TEMPLATE').resolve(response.context)
407407
self.assertEqual(template, page_template)
408408

409+
409410
class EndpointTests(CMSTestCase):
410411

411412
def setUp(self) -> None:
@@ -437,7 +438,7 @@ def test_render_object_structure_i18n(self):
437438
self._add_plugin_to_placeholder(placeholder, "TextPlugin", language="fr")
438439
with force_language("fr"):
439440
setting, _ = UserSettings.objects.get_or_create(user=self.get_superuser())
440-
setting.language="fr"
441+
setting.language = "fr"
441442
setting.save()
442443
structure_endpoint_url = admin_reverse(
443444
"cms_placeholder_render_object_structure",

cms/utils/page_permissions.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -537,7 +537,7 @@ def has_generic_permission(page, user, action, site=None, check_global=True, use
537537
if site is None:
538538
site = get_current_site()
539539

540-
page_path = page.node.path
540+
page_path = page.path
541541
actions_map = {
542542
'add_page': get_add_perm_tuples,
543543
'change_page': get_change_perm_tuples,

cms/utils/permissions.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,17 @@ def has_page_permission(user, page, action, use_cache=True):
223223
"Use cms.utils.page_permissions.has_generic_permission instead.",
224224
RemovedInDjangoCMS43Warning, stacklevel=2)
225225

226+
action_map = {
227+
"change": "change_page",
228+
"add": "add_page",
229+
"move": "move_page",
230+
"publish": "publish_page",
231+
"delete": "delete_page",
232+
"view": "view_page",
233+
}
234+
if action in action_map:
235+
action = action_map[action]
236+
226237
return has_generic_permission(page, user, action, site=page.site, check_global=False, use_cache=use_cache)
227238

228239

docs/upgrade/4.2.0.rst

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,13 @@ Miscellaneous
9595
on page content objects. Use ``cms.cms_menus.get_visible_page_contents``
9696
instead.
9797

98+
* The ``cms.test_utils.testcases.CMSTestCase`` class's ``assertWarns`` has been
99+
removed since it was an alias of ``CMSTestCase.failUnlessWarns`` and shadows
100+
Python's ``assertWarns``. In your test cases, use
101+
Python's ``assertWarns`` instead, or use the ``failUnlessWarns`` method
102+
of ``CMSTestCase`` which retains the syntax of the original method.
103+
104+
98105
Features deprecated in 4.2.0
99106
============================
100107

0 commit comments

Comments
 (0)
0