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