from django.db.models import Q from django.utils.translation import ugettext_lazy as _ from django.contrib.auth.models import Permission as DjangoPermission from django.contrib.auth.models import ContentType as DjangoContentType from .. import const Scope = const.Scope __all__ = ['Permission', 'ContentType'] class ContentType(DjangoContentType): class Meta: proxy = True class Permission(DjangoPermission): """ 权限类 """ class Meta: proxy = True verbose_name = _('Permission') @classmethod def to_perms(cls, queryset): perms = queryset.values_list( 'content_type__app_label', 'codename' ) perms = list(set(["%s.%s" % (ct, codename) for ct, codename in perms])) return sorted(perms) @property def app_label_codename(self): return '%s.%s' % (self.content_type.app_label, self.codename) @classmethod def get_define_permissions_q(cls, defines): """ :param defines: [(app, model, codename),] :return: """ if not defines: return None q = Q() for define in defines: app_label, model, actions, resource, *args = list(define) kwargs = {} if app_label != '*': kwargs['content_type__app_label'] = app_label if model != '*': kwargs['content_type__model'] = model actions_list = [a.strip() for a in actions.split(',')] actions_regex = '|'.join(actions_list) if actions == '*' and resource == '*': pass elif actions == '*' and resource != '*': kwargs['codename__iregex'] = r'[a-z]+_{}'.format(resource) elif actions != '*' and resource == '*': kwargs['codename__iregex'] = r'({})_\w+'.format(actions_regex) else: kwargs['codename__iregex'] = r'({})_{}'.format(actions_regex, resource) q |= Q(**kwargs) return q @staticmethod def create_tree_nodes(permissions, scope, check_disabled=False): from ..ztree.tree import ZTree ztree = ZTree(permissions, scope, check_disabled) tree_nodes = ztree.get_tree_nodes() return tree_nodes @classmethod def get_permissions(cls, scope): permissions = cls.objects.all() permissions = cls.clean_permissions(permissions, scope=scope) return permissions @classmethod def clean_permissions(cls, permissions, scope=Scope.system): from ..ztree.tree import ZTree perms_app_label_codename = ZTree.get_permissions_app_label_codename(scope) q = Q() for app_label_codename in perms_app_label_codename: app_label, codename = app_label_codename.split('.') q |= Q(**{'content_type__app_label': app_label, 'codename': codename}) permissions = permissions.filter(q) return permissions