feat(sdk): AuthManager 补 GetUserNames,CompanyManager 补 BelongsToTenant

GetUserNames:单次 __in 批量取用户名 {UUID字节: UserName},供列表页回填,替代调用方逐个查库造成 N+1。

BelongsToTenant:判断公司是否归属指定租户,替代视图层直接持有 Company ORM 做归属校验。
This commit is contained in:
TermiNexus committed 2026-09-14 15:46:46 +08:00
1 parent 13e800f473
commit f7ea30dba3
1 file changed
+43
+43
View File
@@ -1822,6 +1822,35 @@ class AuthManager:
User = _GetUserModel()
return User.objects.filter(UserUUID=UUIDObj(UserUUID).bytes).first()
@staticmethod
def GetUserNames(UserUUIDs):
"""批量取用户名:{UserUUID 字节: UserName}
单次 __in 查询,供列表页一次性回填用户名,避免逐个查库产生 N+1。
Args:
UserUUIDs: UUID 可迭代对象(bytes/str/UUIDObj 均可,无效项自动跳过)
Returns:
dict[bytes, str]:仅含查到的用户;用户名为空时该键值为空串
"""
names = {}
uuids = []
for value in UserUUIDs or []:
if not value:
continue
try:
uuids.append(UUIDObj(value).bytes)
except Exception:
continue
if not uuids:
return names
User = _GetUserModel()
for u in User.objects.filter(UserUUID__in=uuids):
if u.UserUUID:
names[UUIDObj(u.UserUUID).bytes] = u.UserName or ''
return names
@staticmethod
def CountUsers(UserUUIDs=None):
"""统计用户数量(可按 UUID 集合过滤;空集合返回 0)"""
@@ -2446,6 +2475,20 @@ class CompanyManager:
return None
return Company.objects.filter(CompanyName=CompanyName).first()
@staticmethod
def BelongsToTenant(CompanyUUID, TenantUUID):
"""判断公司是否归属指定租户(任一参数缺失或非法返回 False)"""
if not CompanyUUID or not TenantUUID:
return False
try:
comp_bytes = UUIDObj(CompanyUUID).bytes
tenant_bytes = UUIDObj(TenantUUID).bytes
except Exception:
return False
return Company.objects.filter(
CompanyUUID=comp_bytes, TenantUUID=tenant_bytes,
).exists()
@staticmethod
def GetCompanyUUIDs(TenantUUID):
"""获取租户下全部公司 UUID 列表