summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorJorge C. Leitão <jorgecarleitao@gmail.com>2013-12-30 08:37:27 +0100
committerTim Graham <timograham@gmail.com>2014-06-13 09:34:04 -0400
commitcc35bd461d35da2b03c0a1a8ff92123d716db9a9 (patch)
treed7888fe76589fb3683250e4840c47962fb5e80c3 /django
parent504c89e8008c557a1e83c45535b549f77a3503b2 (diff)
Fixed #7599 -- Added get_user_permissions to ModelBackend.
Thanks to @gdub for the report and intial patch and @charettes and @timgraham for the review.
Diffstat (limited to 'django')
-rw-r--r--django/contrib/auth/backends.py43
1 files changed, 33 insertions, 10 deletions
diff --git a/django/contrib/auth/backends.py b/django/contrib/auth/backends.py
index 7d452971ee..5220526af5 100644
--- a/django/contrib/auth/backends.py
+++ b/django/contrib/auth/backends.py
@@ -21,29 +21,52 @@ class ModelBackend(object):
# difference between an existing and a non-existing user (#20760).
UserModel().set_password(password)
- def get_group_permissions(self, user_obj, obj=None):
+ def _get_user_permissions(self, user_obj):
+ return user_obj.user_permissions.all()
+
+ def _get_group_permissions(self, user_obj):
+ user_groups_field = get_user_model()._meta.get_field('groups')
+ user_groups_query = 'group__%s' % user_groups_field.related_query_name()
+ return Permission.objects.filter(**{user_groups_query: user_obj})
+
+ def _get_permissions(self, user_obj, obj, from_name):
"""
- Returns a set of permission strings that this user has through his/her
- groups.
+ Returns the permissions of `user_obj` from `from_name`. `from_name` can
+ be either "group" or "user" to return permissions from
+ `_get_group_permissions` or `_get_user_permissions` respectively.
"""
if user_obj.is_anonymous() or obj is not None:
return set()
- if not hasattr(user_obj, '_group_perm_cache'):
+
+ perm_cache_name = '_%s_perm_cache' % from_name
+ if not hasattr(user_obj, perm_cache_name):
if user_obj.is_superuser:
perms = Permission.objects.all()
else:
- user_groups_field = get_user_model()._meta.get_field('groups')
- user_groups_query = 'group__%s' % user_groups_field.related_query_name()
- perms = Permission.objects.filter(**{user_groups_query: user_obj})
+ perms = getattr(self, '_get_%s_permissions' % from_name)(user_obj)
perms = perms.values_list('content_type__app_label', 'codename').order_by()
- user_obj._group_perm_cache = set("%s.%s" % (ct, name) for ct, name in perms)
- return user_obj._group_perm_cache
+ setattr(user_obj, perm_cache_name, set("%s.%s" % (ct, name) for ct, name in perms))
+ return getattr(user_obj, perm_cache_name)
+
+ def get_user_permissions(self, user_obj, obj=None):
+ """
+ Returns a set of permission strings the user `user_obj` has from their
+ `user_permissions`.
+ """
+ return self._get_permissions(user_obj, obj, 'user')
+
+ def get_group_permissions(self, user_obj, obj=None):
+ """
+ Returns a set of permission strings the user `user_obj` has from the
+ groups they belong.
+ """
+ return self._get_permissions(user_obj, obj, 'group')
def get_all_permissions(self, user_obj, obj=None):
if user_obj.is_anonymous() or obj is not None:
return set()
if not hasattr(user_obj, '_perm_cache'):
- user_obj._perm_cache = set("%s.%s" % (p.content_type.app_label, p.codename) for p in user_obj.user_permissions.select_related())
+ user_obj._perm_cache = self.get_user_permissions(user_obj)
user_obj._perm_cache.update(self.get_group_permissions(user_obj))
return user_obj._perm_cache