diff options
| author | Jorge C. Leitão <jorgecarleitao@gmail.com> | 2013-12-30 08:37:27 +0100 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2014-06-13 09:34:04 -0400 |
| commit | cc35bd461d35da2b03c0a1a8ff92123d716db9a9 (patch) | |
| tree | d7888fe76589fb3683250e4840c47962fb5e80c3 /django | |
| parent | 504c89e8008c557a1e83c45535b549f77a3503b2 (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.py | 43 |
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 |
