diff --git a/wagtail/admin/views/pages.py b/wagtail/admin/views/pages.py index c19f251e2..d20e86eb4 100644 --- a/wagtail/admin/views/pages.py +++ b/wagtail/admin/views/pages.py @@ -343,7 +343,7 @@ def edit(request, page_id): form_class = edit_handler.get_form_class() user_has_lock = page.locked_by_id == request.user.id - page_locked = page.locked and not user_has_lock + page_locked = page_perms.page_locked() next_url = get_valid_next_url_from_request(request) diff --git a/wagtail/core/models.py b/wagtail/core/models.py index 586dbba1c..7e3c208f0 100644 --- a/wagtail/core/models.py +++ b/wagtail/core/models.py @@ -1845,7 +1845,16 @@ class PagePermissionTester: ) def page_locked(self): - return self.page.locked and self.page.locked_by_id is not self.user.id + if not self.page.locked: + # Page is not locked + return False + + if getattr(settings, 'WAGTAILADMIN_GLOBAL_PAGE_EDIT_LOCK', False): + # All locks are global + return True + else: + # Locked only if the current user was not the one who locked the page + return self.page.locked_by_id is not self.user.pk def can_add_subpage(self): if not self.user.is_active: diff --git a/wagtail/core/tests/test_page_permissions.py b/wagtail/core/tests/test_page_permissions.py index a486c03ff..e859c24e2 100644 --- a/wagtail/core/tests/test_page_permissions.py +++ b/wagtail/core/tests/test_page_permissions.py @@ -2,7 +2,8 @@ import json from django.contrib.auth import get_user_model from django.contrib.auth.models import Group -from django.test import Client, TestCase +from django.test import Client, TestCase, override_settings +from django.utils import timezone from wagtail.core.models import GroupPagePermission, Page, UserPagePermissionsProxy from wagtail.tests.testapp.models import ( @@ -517,6 +518,55 @@ class TestPagePermission(TestCase): self.assertFalse(perms.can_lock()) + def test_page_locked_for_unlocked_page(self): + user = get_user_model().objects.get(username='eventmoderator') + christmas_page = EventPage.objects.get(url_path='/home/events/christmas/') + + perms = UserPagePermissionsProxy(user).for_page(christmas_page) + + self.assertFalse(perms.page_locked()) + + def test_page_locked_for_locked_page(self): + user = get_user_model().objects.get(username='eventmoderator') + christmas_page = EventPage.objects.get(url_path='/home/events/christmas/') + + # Lock the page + christmas_page.locked = True + christmas_page.locked_by = user + christmas_page.locked_at = timezone.now() + christmas_page.save() + + perms = UserPagePermissionsProxy(user).for_page(christmas_page) + + # The user who locked the page shouldn't see the page as locked + self.assertFalse(perms.page_locked()) + + # Other users should see the page as locked + other_user = get_user_model().objects.get(username='eventeditor') + other_perms = UserPagePermissionsProxy(other_user).for_page(christmas_page) + self.assertTrue(other_perms.page_locked()) + + @override_settings(WAGTAILADMIN_GLOBAL_PAGE_EDIT_LOCK=True) + def test_page_locked_for_locked_page_with_global_lock_enabled(self): + user = get_user_model().objects.get(username='eventmoderator') + christmas_page = EventPage.objects.get(url_path='/home/events/christmas/') + + # Lock the page + christmas_page.locked = True + christmas_page.locked_by = user + christmas_page.locked_at = timezone.now() + christmas_page.save() + + perms = UserPagePermissionsProxy(user).for_page(christmas_page) + + # The user who locked the page should now also see the page as locked + self.assertTrue(perms.page_locked()) + + # Other users should see the page as locked, like before + other_user = get_user_model().objects.get(username='eventeditor') + other_perms = UserPagePermissionsProxy(other_user).for_page(christmas_page) + self.assertTrue(other_perms.page_locked()) + class TestPagePermissionTesterCanCopyTo(TestCase): """Tests PagePermissionTester.can_copy_to()"""