From 16f1a44969b8c9bd547285ecc9ac342e99fa3b42 Mon Sep 17 00:00:00 2001 From: Nick Smith Date: Fri, 20 Jun 2014 15:07:36 +0100 Subject: [PATCH] Add extra UserPagePermissionsProxy methods: - can_edit_pages - publishable_pages - can_publish_pages --- wagtail/wagtailcore/models.py | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/wagtail/wagtailcore/models.py b/wagtail/wagtailcore/models.py index 6b273e4b6..a97182c9a 100644 --- a/wagtail/wagtailcore/models.py +++ b/wagtail/wagtailcore/models.py @@ -827,6 +827,41 @@ class UserPagePermissionsProxy(object): else: return Page.objects.none() + def can_edit_pages(self): + """Return True if the user has permission to edit any pages""" + return True if self.editable_pages().count() else False + + def publishable_pages(self): + """Return a queryset of the pages that this user has permission to publish""" + # Deal with the trivial cases first... + if not self.user.is_active: + return Page.objects.none() + if self.user.is_superuser: + return Page.objects.all() + + # Translate each of the user's permission rules into a Q-expression + q_expressions = [] + for perm in self.permissions: + if perm.permission_type == 'publish': + # user has publish permission on any subpage of perm.page + # (including perm.page itself) that is owned by them + q_expressions.append( + Q(path__startswith=perm.page.path, owner=self.user) + ) + + if q_expressions: + all_rules = q_expressions[0] + for expr in q_expressions[1:]: + all_rules = all_rules | expr + return Page.objects.filter(all_rules) + else: + return Page.objects.none() + + def can_publish_pages(self): + """Return True if the user has permission to publish any pages""" + return True if self.publishable_pages().count() else False + + class PagePermissionTester(object): def __init__(self, user_perms, page): self.user = user_perms.user