1# -*- coding: utf-8 -*- 2from django.db.models import Model 3from django.contrib.auth.models import Permission 4from django.contrib.contenttypes.models import ContentType 5 6 7class ObjectPermissionBackend(object): 8 def has_perm(self, user_obj, perm, obj=None): 9 if user_obj and user_obj.is_superuser: 10 return True 11 elif obj is None or not isinstance(obj, Model) or \ 12 not user_obj.is_authenticated or not user_obj.is_active: 13 return False 14 if len(perm.split('.')) > 1: 15 app_label, perm = perm.split('.') 16 if app_label != obj._meta.app_label: 17 raise Exception("Passed perm has app label of '%s' and " 18 "given obj has '%s'" % (app_label, obj._meta.app_label)) 19 20 perm = perm.split('.')[-1] 21 return perm in self.get_perms(user_obj, obj) 22 23 def get_perms(self, user_obj, obj): 24 """ 25 Returns list of ``codename``'s of all permissions for given ``obj``. 26 """ 27 from cms.test_utils.project.objectpermissionsapp.models import UserObjectPermission 28 ctype = ContentType.objects.get_for_model(obj) 29 related_name = UserObjectPermission.permission.field.related_query_name() 30 user_filters = { 31 '%s__user' % related_name: user_obj, 32 '%s__content_type' % related_name: ctype, 33 '%s__object_pk' % related_name: obj.pk, 34 } 35 return Permission.objects.filter(content_type=ctype) \ 36 .filter(**user_filters) \ 37 .values_list("codename", flat=True) 38 39 def authenticate(self, request=None): 40 return True 41