summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorTobias Bengfort <tobias.bengfort@posteo.de>2019-03-24 00:40:44 +0100
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2019-06-05 13:56:37 +0200
commit581a0f45453f178b8abc0d09bd16ce06309ed33a (patch)
treeb9ac48689168b46346dbb6aabe726f3285f67531 /django
parent75337a60509fdfdd321a5caf8e30d57fff6b9518 (diff)
Refs #30226 -- Added User.get_user_permissions() method.
Added to mirror the existing User.get_group_permissions().
Diffstat (limited to 'django')
-rw-r--r--django/contrib/auth/backends.py13
-rw-r--r--django/contrib/auth/models.py28
2 files changed, 26 insertions, 15 deletions
diff --git a/django/contrib/auth/backends.py b/django/contrib/auth/backends.py
index d20987f8e1..f4b1722757 100644
--- a/django/contrib/auth/backends.py
+++ b/django/contrib/auth/backends.py
@@ -15,11 +15,17 @@ class BaseBackend:
def get_user(self, user_id):
return None
+ def get_user_permissions(self, user_obj, obj=None):
+ return set()
+
def get_group_permissions(self, user_obj, obj=None):
return set()
def get_all_permissions(self, user_obj, obj=None):
- return self.get_group_permissions(user_obj, obj=obj)
+ return {
+ *self.get_user_permissions(user_obj, obj=obj),
+ *self.get_group_permissions(user_obj, obj=obj),
+ }
def has_perm(self, user_obj, perm, obj=None):
return perm in self.get_all_permissions(user_obj, obj=obj)
@@ -96,10 +102,7 @@ class ModelBackend(BaseBackend):
if not user_obj.is_active or user_obj.is_anonymous or obj is not None:
return set()
if not hasattr(user_obj, '_perm_cache'):
- user_obj._perm_cache = {
- *self.get_user_permissions(user_obj),
- *self.get_group_permissions(user_obj),
- }
+ user_obj._perm_cache = super().get_all_permissions(user_obj)
return user_obj._perm_cache
def has_perm(self, user_obj, perm, obj=None):
diff --git a/django/contrib/auth/models.py b/django/contrib/auth/models.py
index 324faa6f3e..78fd7fbb5c 100644
--- a/django/contrib/auth/models.py
+++ b/django/contrib/auth/models.py
@@ -159,11 +159,12 @@ class UserManager(BaseUserManager):
# A few helper functions for common logic between User and AnonymousUser.
-def _user_get_all_permissions(user, obj):
+def _user_get_permissions(user, obj, from_name):
permissions = set()
+ name = 'get_%s_permissions' % from_name
for backend in auth.get_backends():
- if hasattr(backend, "get_all_permissions"):
- permissions.update(backend.get_all_permissions(user, obj))
+ if hasattr(backend, name):
+ permissions.update(getattr(backend, name)(user, obj))
return permissions
@@ -233,20 +234,24 @@ class PermissionsMixin(models.Model):
class Meta:
abstract = True
+ def get_user_permissions(self, obj=None):
+ """
+ Return a list of permission strings that this user has directly.
+ Query all available auth backends. If an object is passed in,
+ return only permissions matching this object.
+ """
+ return _user_get_permissions(self, obj, 'user')
+
def get_group_permissions(self, obj=None):
"""
Return a list of permission strings that this user has through their
groups. Query all available auth backends. If an object is passed in,
return only permissions matching this object.
"""
- permissions = set()
- for backend in auth.get_backends():
- if hasattr(backend, "get_group_permissions"):
- permissions.update(backend.get_group_permissions(self, obj))
- return permissions
+ return _user_get_permissions(self, obj, 'group')
def get_all_permissions(self, obj=None):
- return _user_get_all_permissions(self, obj)
+ return _user_get_permissions(self, obj, 'all')
def has_perm(self, perm, obj=None):
"""
@@ -403,11 +408,14 @@ class AnonymousUser:
def user_permissions(self):
return self._user_permissions
+ def get_user_permissions(self, obj=None):
+ return _user_get_permissions(self, obj, 'user')
+
def get_group_permissions(self, obj=None):
return set()
def get_all_permissions(self, obj=None):
- return _user_get_all_permissions(self, obj=obj)
+ return _user_get_permissions(self, obj, 'all')
def has_perm(self, perm, obj=None):
return _user_has_perm(self, perm, obj=obj)