118 lines
3.8 KiB
Python
118 lines
3.8 KiB
Python
from django.contrib.postgres.fields import ArrayField
|
||
from django.db import models
|
||
|
||
from core.enums import PermissionModule, PermissionValueType
|
||
from core.models.base import TimeStampedModel
|
||
|
||
|
||
class PermissionDef(TimeStampedModel):
|
||
code = models.CharField(
|
||
max_length=150,
|
||
unique=True,
|
||
verbose_name="权限编码",
|
||
help_text='规则:{module}.{sub_module}.{action}[.{qualifier}]',
|
||
)
|
||
module = models.CharField(
|
||
max_length=50,
|
||
choices=PermissionModule.choices,
|
||
verbose_name="一级模块",
|
||
help_text="home/property/new_house/client/transaction/data/marketing/hr/contract/trinet/system/mobile/smart_store/recharge",
|
||
)
|
||
sub_module = models.CharField(
|
||
max_length=50,
|
||
blank=True,
|
||
default="",
|
||
verbose_name="二级模块",
|
||
help_text='如「二手&租赁」「商圈精耕」',
|
||
)
|
||
group_name = models.CharField(
|
||
max_length=100,
|
||
verbose_name="分组标题",
|
||
help_text='如「私客基础权限」「联系人基础权限」',
|
||
)
|
||
name = models.CharField(
|
||
max_length=200,
|
||
verbose_name="显示名称",
|
||
)
|
||
description = models.TextField(
|
||
blank=True,
|
||
default="",
|
||
verbose_name="权限作用描述",
|
||
)
|
||
value_type = models.CharField(
|
||
max_length=20,
|
||
choices=PermissionValueType.choices,
|
||
verbose_name="权限值类型",
|
||
help_text="BOOLEAN=开关型 / SCOPE=范围型 / INTEGER=数值型",
|
||
)
|
||
scope_choices = models.JSONField(
|
||
default=list,
|
||
blank=True,
|
||
verbose_name="可选范围",
|
||
help_text='仅 SCOPE 类型有效,可选枚举 code 列表,如 ["none","self","store","company"]',
|
||
)
|
||
integer_min = models.IntegerField(
|
||
null=True,
|
||
blank=True,
|
||
verbose_name="最小值",
|
||
help_text="仅 INTEGER 类型有效",
|
||
)
|
||
integer_max = models.IntegerField(
|
||
null=True,
|
||
blank=True,
|
||
verbose_name="最大值",
|
||
help_text="仅 INTEGER 类型有效;NULL=无上限(业务上 0 通常代表不限制)",
|
||
)
|
||
default_value = models.JSONField(
|
||
default=dict,
|
||
verbose_name="默认值",
|
||
help_text='系统最小默认值,格式 {"v": <value>}',
|
||
)
|
||
max_allowed_categories = ArrayField(
|
||
models.CharField(max_length=50),
|
||
default=list,
|
||
blank=True,
|
||
verbose_name="可配置角色类别",
|
||
help_text="允许配置此权限的角色类别列表,空数组=所有类别均可",
|
||
)
|
||
sort_order = models.PositiveIntegerField(
|
||
default=0,
|
||
verbose_name="排序顺序",
|
||
help_text="分组内排序",
|
||
)
|
||
is_active = models.BooleanField(
|
||
default=True,
|
||
verbose_name="是否启用",
|
||
help_text="下线权限项置 FALSE,历史记录保留",
|
||
)
|
||
is_deprecated = models.BooleanField(
|
||
default=False,
|
||
verbose_name="是否废弃",
|
||
help_text="不再推荐使用但保持兼容",
|
||
)
|
||
version = models.PositiveIntegerField(
|
||
default=1,
|
||
verbose_name="定义版本",
|
||
help_text="变更时递增,用于缓存失效",
|
||
)
|
||
|
||
class Meta:
|
||
db_table = "permission_defs"
|
||
verbose_name = "权限定义"
|
||
verbose_name_plural = "权限定义"
|
||
indexes = [
|
||
models.Index(
|
||
fields=["module", "sub_module", "sort_order"],
|
||
name="idx_perm_defs_module",
|
||
condition=models.Q(is_active=True),
|
||
),
|
||
models.Index(
|
||
fields=["is_active"],
|
||
name="idx_perm_defs_active",
|
||
condition=models.Q(is_active=True),
|
||
),
|
||
]
|
||
|
||
def __str__(self) -> str:
|
||
return f"{self.code} ({self.value_type})"
|