Allow global locks to be re-enabled with a setting

This commit is contained in:
Karl Hobley 2019-10-17 12:19:43 +01:00
parent f4a1467b7e
commit ec2feb24c5
3 changed files with 62 additions and 3 deletions

View file

@ -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)

View file

@ -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:

View file

@ -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()"""