From 0ad5ce77c8c5eaebc4d88b324dfa12bfb20ed2cd Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Fri, 7 Aug 2026 03:18:54 +0800 Subject: [PATCH] "feat(auth): add RoleManager.CreatePermission - create permission with tenant-scoped code uniqueness check - returns (instance, created); existing code returns (None, False)" --- auth/__pycache__/managers.cpython-312.pyc | Bin 35546 -> 36694 bytes auth/managers.py | 30 ++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/auth/__pycache__/managers.cpython-312.pyc b/auth/__pycache__/managers.cpython-312.pyc index 8828a17958e9d212fb7caf7502360c874eee264d..136028d69ab593defe891d732daf75d7aa136f70 100644 GIT binary patch delta 3277 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 K9~szhP4eIJiD$V0 diff --git a/auth/managers.py b/auth/managers.py index 7141b2e..aea0b38 100644 --- a/auth/managers.py +++ b/auth/managers.py @@ -231,6 +231,36 @@ class RoleManager: return _apply() return _apply() + @staticmethod + def CreatePermission(PermCode, TenantUUID, PermName='', PermCategory='', + PermStatus=1, PermDesc=''): + """创建权限(同租户内权限码唯一) + + Args: + PermCode: 权限码 + TenantUUID: 租户 UUID(UUIDObj/str/bytes 均可) + PermName: 权限名称(为空时回退到权限码) + PermCategory: 权限分类 + PermStatus: 状态(1=启用) + PermDesc: 描述 + + Returns: + (Permission 实例, created: bool);权限码已存在返回 (None, False) + """ + if Permission.objects.filter(PermCode=PermCode, TenantUUID=TenantUUID).exists(): + return None, False + perm = Permission( + PermUUID=uuid.uuid4().bytes, + TenantUUID=TenantUUID, + PermCode=PermCode, + PermName=PermName or PermCode, + PermCategory=PermCategory, + PermStatus=PermStatus, + PermDesc=PermDesc, + ) + perm.save() + return perm, True + class PositionManager: """职务管理器——提供人事职务标签创建、岗位模板管理"""