Files
fonrey/apps/permission/models/permission_def.py

118 lines
3.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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})"