Skip to content

Commit 9b9d9a1

Browse files
committed
fix: Indicator menu respects correct permissions
1 parent b1bee98 commit 9b9d9a1

File tree

5 files changed

+41
-8
lines changed

5 files changed

+41
-8
lines changed

djangocms_versioning/admin.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1365,7 +1365,7 @@ def unlock_view(self, request, object_id):
13651365
raise Http404
13661366

13671367
# Check that the user has unlock permission
1368-
if not request.user.has_perm("djangocms_versioning.delete_versionlock"):
1368+
if not request.user.has_perm(f"{self.model._meta.app_label}.delete_versionlock"):
13691369
return HttpResponseForbidden(force_str(_("You do not have permission to remove the version lock")))
13701370

13711371
# Unlock the version

djangocms_versioning/cms_toolbars.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ def _add_unlock_button(self):
136136
f"admin:{proxy_model._meta.app_label}_{proxy_model.__name__.lower()}_unlock",
137137
args=(version.pk,),
138138
)
139-
can_unlock = self.request.user.has_perm("djangocms_versioning.delete_versionlock")
139+
can_unlock = self.request.user.has_perm(f"{version._meta.app_label}.delete_versionlock")
140140
if can_unlock:
141141
extra_classes = [
142142
"cms-btn-action",

djangocms_versioning/conditions.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ def inner(version, user):
8181
def user_can_unlock(message: str) -> callable:
8282
def inner(version, user):
8383
if conf.LOCK_VERSIONS:
84-
if user.has_perm("djangocms_versioning.delete_versionlock"):
84+
if user.has_perm(f"{version._meta.app_label}.delete_versionlock"):
8585
return
8686
draft_version = get_latest_draft_version(version)
8787
if draft_version and (draft_version.locked_by == user or draft_version.locked_by is None):

djangocms_versioning/indicators.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
from __future__ import annotations
22

33
from cms.utils.urlutils import admin_reverse
4-
from django.contrib.auth import get_permission_codename
54
from django.db import models
65
from django.utils.http import urlencode
76
from django.utils.translation import gettext_lazy as _
@@ -21,10 +20,13 @@ def _reverse_action(version, action, back=None):
2120
def content_indicator_menu(request, status, versions, back=""):
2221
from djangocms_versioning.helpers import version_list_url
2322

23+
has_change_perm =versions[0].has_change_permission(request.user)
24+
delete_versionlock_perm = f"{versions[0]._meta.app_label}.delete_versionlock"
25+
2426
menu = []
25-
if request.user.has_perm(f"cms.{get_permission_codename('change', versions[0]._meta)}"):
27+
if has_change_perm:
2628
if versions[0].check_unlock.as_bool(request.user):
27-
can_unlock = request.user.has_perm("djangocms_versioning.delete_versionlock")
29+
can_unlock = request.user.has_perm(delete_versionlock_perm)
2830
# disable if permissions are insufficient
2931
additional_class = "" if can_unlock else " cms-pagetree-dropdown-item-disabled"
3032
menu.append((

tests/test_indicators.py

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1+
from cms.models import GlobalPagePermission, Site
12
from cms.test_utils.testcases import CMSTestCase
23
from cms.utils.urlutils import admin_reverse
34

5+
from djangocms_versioning.constants import ARCHIVED, DRAFT, PUBLISHED
46
from djangocms_versioning.helpers import get_latest_admin_viewable_content
57
from djangocms_versioning.models import Version
68
from djangocms_versioning.test_utils.blogpost.admin import BlogContentAdmin
@@ -88,26 +90,50 @@ class TestVersionState(CMSTestCase):
8890
def test_page_indicators(self):
8991
"""The page content indicators render correctly"""
9092
page = PageFactory(node__depth=1) if TreeNode else PageFactory(depth=1)
93+
user = self._create_user(
94+
"albert",
95+
is_staff=True,
96+
is_superuser=False,
97+
permissions=["change_version", "change_page", "publish_page"]
98+
)
99+
gpp = GlobalPagePermission.objects.create(
100+
user=user,
101+
can_add=True,
102+
can_change=True,
103+
can_delete=True,
104+
can_publish=True,
105+
can_move_page=True,
106+
can_change_permissions=True,
107+
can_view=True,
108+
)
109+
gpp.sites.set([Site.objects.get_current()])
91110
version1 = PageVersionFactory(
92111
content__page=page,
93112
content__language="en",
113+
locked_by=None,
94114
)
95115
pk = version1.pk
96116

97117
page_tree = admin_reverse("cms_pagecontent_get_tree")
98-
with self.login_user_context(self.get_superuser()):
118+
with self.login_user_context(user):
99119
# New page has draft version, nothing else
100120
response = self.client.get(page_tree, {"language": "en"})
121+
# Check markers
101122
self.assertNotContains(response, "cms-pagetree-node-state-empty")
102123
self.assertContains(response, "cms-pagetree-node-state-draft")
103124
self.assertNotContains(response, "cms-pagetree-node-state-published")
104125
self.assertNotContains(response, "cms-pagetree-node-state-dirty")
105126
self.assertNotContains(response, "cms-pagetree-node-state-unpublished")
127+
# Check actions
128+
self.assertContains(response, "Manage Versions...")
129+
self.assertContains(response, "Publish")
106130

107131
# Now archive
108132
response = self.client.post(admin_reverse("djangocms_versioning_pagecontentversion_archive",
109133
args=(pk,)))
110134
self.assertEqual(response.status_code, 302) # Sends a redirect
135+
self.assertEqual(Version.objects.get(pk=pk).state, ARCHIVED)
136+
111137
# Is archived indicator? No draft indicator
112138
response = self.client.get(page_tree, {"language": "en"})
113139
self.assertContains(response, "cms-pagetree-node-state-archived")
@@ -117,21 +143,26 @@ def test_page_indicators(self):
117143
response = self.client.post(admin_reverse("djangocms_versioning_pagecontentversion_revert",
118144
args=(pk,)))
119145
self.assertEqual(response.status_code, 302) # Sends a redirect
146+
pk = Version.objects.filter_by_content_grouping_values(version1.content).order_by("-pk")[0].pk
147+
self.assertEqual(Version.objects.get(pk=pk).state, DRAFT)
148+
120149
# Is draft indicator? No archived indicator
121150
response = self.client.get(page_tree, {"language": "en"})
122151
self.assertContains(response, "cms-pagetree-node-state-draft")
123152
self.assertNotContains(response, "cms-pagetree-node-state-archived")
124153
# New draft was created, get new pk
125-
pk = Version.objects.filter_by_content_grouping_values(version1.content).order_by("-pk")[0].pk
126154

127155
# Now publish
128156
response = self.client.post(admin_reverse("djangocms_versioning_pagecontentversion_publish",
129157
args=(pk,)))
130158
self.assertEqual(response.status_code, 302) # Sends a redirect
159+
self.assertEqual(Version.objects.get(pk=pk).state, PUBLISHED)
131160
# Is published indicator? No draft indicator
132161
response = self.client.get(page_tree, {"language": "en"})
133162
self.assertContains(response, "cms-pagetree-node-state-published")
134163
self.assertNotContains(response, "cms-pagetree-node-state-draft")
164+
# Check actions
165+
self.assertContains(response, "Unpublish")
135166

136167
# Now unpublish
137168
response = self.client.post(admin_reverse("djangocms_versioning_pagecontentversion_unpublish",

0 commit comments

Comments
 (0)