utils.models.permission 源代码
from django.db import models
__all__ = ['BasePermission', 'PermissionModelBase']
[文档]
class BasePermission(models.TextChoices):
'''权限基类
用于定义权限,继承此类后,可以在对应类中定义权限,如::
class UserPermission(BasePermission):
MANAGE = choice('manage_user', '管理用户')
AUDIT = choice('audit_user', '审核用户')
...
user.has_perm(UserPermission.MANAGE.perm)
Attributes:
perm: 权限字符串,格式为`app_label.codename`,可直接用于`has_perm`判断
'''
@property
def perm(self):
return f'{self._meta.app_label}.{self.value}'
[文档]
class PermissionModelBase(models.base.ModelBase):
'''权限模型元类
用于自动将`Model.Permission`转换为`Model.Meta.permissions`,以便迁移和产生权限
同时提供Permission模型属性,以便插入应用数据,生成完整的权限名称
Example::
class User(models.Model, metaclass=PermissionModelBase):
class Permission(BasePermission):
MANAGE = choice('manage_user', '管理用户')
AUDIT = choice('audit_user', '审核用户')
...
class Meta:
# 无需定义permissions
pass
assert(User.Permission.MAKE.perm == 'APP_LABEL.manage_user')
Warning:
Permission类必须定义在Model类中,且必须命名为`Permission`
Note:
在模型中定义Meta和Permission类时无需在意顺序
'''
def __new__(cls, name, bases, attrs, **kwargs):
Permission = attrs.get('Permission')
if Permission:
attrs['Meta'].permissions = Permission.choices
clz = super().__new__(cls, name, bases, attrs, **kwargs)
clz.Permission._meta = clz._meta # type: ignore
return clz