fix: auto-fix code issues (cron)
- 修复重复导入/字段 - 修复异常处理 - 修复PEP8格式问题 - 添加类型注解
This commit is contained in:
@@ -11,16 +11,16 @@ InsightFlow Phase 8 - 多租户 SaaS 架构管理模块
|
||||
作者: InsightFlow Team
|
||||
"""
|
||||
|
||||
import sqlite3
|
||||
import json
|
||||
import uuid
|
||||
import hashlib
|
||||
import re
|
||||
from datetime import datetime
|
||||
from typing import Optional, List, Dict, Any, Tuple
|
||||
from dataclasses import dataclass, asdict
|
||||
from enum import Enum
|
||||
import json
|
||||
import logging
|
||||
import re
|
||||
import sqlite3
|
||||
import uuid
|
||||
from dataclasses import asdict, dataclass
|
||||
from datetime import datetime
|
||||
from enum import StrEnum
|
||||
from typing import Any
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -44,7 +44,7 @@ class TenantLimits:
|
||||
UNLIMITED = -1
|
||||
|
||||
|
||||
class TenantStatus(str, Enum):
|
||||
class TenantStatus(StrEnum):
|
||||
"""租户状态"""
|
||||
ACTIVE = "active" # 活跃
|
||||
SUSPENDED = "suspended" # 暂停
|
||||
@@ -53,14 +53,14 @@ class TenantStatus(str, Enum):
|
||||
PENDING = "pending" # 待激活
|
||||
|
||||
|
||||
class TenantTier(str, Enum):
|
||||
class TenantTier(StrEnum):
|
||||
"""租户订阅层级"""
|
||||
FREE = "free" # 免费版
|
||||
PRO = "pro" # 专业版
|
||||
ENTERPRISE = "enterprise" # 企业版
|
||||
|
||||
|
||||
class TenantRole(str, Enum):
|
||||
class TenantRole(StrEnum):
|
||||
"""租户角色"""
|
||||
OWNER = "owner" # 所有者
|
||||
ADMIN = "admin" # 管理员
|
||||
@@ -68,7 +68,7 @@ class TenantRole(str, Enum):
|
||||
VIEWER = "viewer" # 查看者
|
||||
|
||||
|
||||
class DomainStatus(str, Enum):
|
||||
class DomainStatus(StrEnum):
|
||||
"""域名状态"""
|
||||
PENDING = "pending" # 待验证
|
||||
VERIFIED = "verified" # 已验证
|
||||
@@ -82,16 +82,16 @@ class Tenant:
|
||||
id: str
|
||||
name: str
|
||||
slug: str # URL 友好的唯一标识
|
||||
description: Optional[str]
|
||||
description: str | None
|
||||
tier: str # free/pro/enterprise
|
||||
status: str # active/suspended/trial/expired/pending
|
||||
owner_id: str # 所有者用户ID
|
||||
created_at: datetime
|
||||
updated_at: datetime
|
||||
expires_at: Optional[datetime] # 订阅过期时间
|
||||
settings: Dict[str, Any] # 租户级设置
|
||||
resource_limits: Dict[str, Any] # 资源限制
|
||||
metadata: Dict[str, Any] # 元数据
|
||||
expires_at: datetime | None # 订阅过期时间
|
||||
settings: dict[str, Any] # 租户级设置
|
||||
resource_limits: dict[str, Any] # 资源限制
|
||||
metadata: dict[str, Any] # 元数据
|
||||
|
||||
|
||||
@dataclass
|
||||
@@ -103,12 +103,12 @@ class TenantDomain:
|
||||
status: str # pending/verified/failed/expired
|
||||
verification_token: str # 验证令牌
|
||||
verification_method: str # dns/file
|
||||
verified_at: Optional[datetime]
|
||||
verified_at: datetime | None
|
||||
created_at: datetime
|
||||
updated_at: datetime
|
||||
is_primary: bool # 是否主域名
|
||||
ssl_enabled: bool # SSL 是否启用
|
||||
ssl_expires_at: Optional[datetime]
|
||||
ssl_expires_at: datetime | None
|
||||
|
||||
|
||||
@dataclass
|
||||
@@ -116,14 +116,14 @@ class TenantBranding:
|
||||
"""租户品牌配置数据类"""
|
||||
id: str
|
||||
tenant_id: str
|
||||
logo_url: Optional[str] # Logo URL
|
||||
favicon_url: Optional[str] # Favicon URL
|
||||
primary_color: Optional[str] # 主题主色
|
||||
secondary_color: Optional[str] # 主题次色
|
||||
custom_css: Optional[str] # 自定义 CSS
|
||||
custom_js: Optional[str] # 自定义 JS
|
||||
login_page_bg: Optional[str] # 登录页背景
|
||||
email_template: Optional[str] # 邮件模板
|
||||
logo_url: str | None # Logo URL
|
||||
favicon_url: str | None # Favicon URL
|
||||
primary_color: str | None # 主题主色
|
||||
secondary_color: str | None # 主题次色
|
||||
custom_css: str | None # 自定义 CSS
|
||||
custom_js: str | None # 自定义 JS
|
||||
login_page_bg: str | None # 登录页背景
|
||||
email_template: str | None # 邮件模板
|
||||
created_at: datetime
|
||||
updated_at: datetime
|
||||
|
||||
@@ -136,11 +136,11 @@ class TenantMember:
|
||||
user_id: str
|
||||
email: str
|
||||
role: str # owner/admin/member/viewer
|
||||
permissions: List[str] # 具体权限列表
|
||||
invited_by: Optional[str] # 邀请者
|
||||
permissions: list[str] # 具体权限列表
|
||||
invited_by: str | None # 邀请者
|
||||
invited_at: datetime
|
||||
joined_at: Optional[datetime]
|
||||
last_active_at: Optional[datetime]
|
||||
joined_at: datetime | None
|
||||
last_active_at: datetime | None
|
||||
status: str # active/pending/suspended
|
||||
|
||||
|
||||
@@ -151,10 +151,10 @@ class TenantPermission:
|
||||
tenant_id: str
|
||||
name: str # 权限名称
|
||||
code: str # 权限代码
|
||||
description: Optional[str]
|
||||
description: str | None
|
||||
resource_type: str # project/entity/api/etc
|
||||
actions: List[str] # create/read/update/delete/etc
|
||||
conditions: Optional[Dict] # 条件限制
|
||||
actions: list[str] # create/read/update/delete/etc
|
||||
conditions: dict | None # 条件限制
|
||||
created_at: datetime
|
||||
|
||||
|
||||
@@ -381,8 +381,8 @@ class TenantManager:
|
||||
|
||||
def create_tenant(self, name: str, owner_id: str,
|
||||
tier: str = "free",
|
||||
description: Optional[str] = None,
|
||||
settings: Optional[Dict] = None) -> Tenant:
|
||||
description: str | None = None,
|
||||
settings: dict | None = None) -> Tenant:
|
||||
"""创建新租户"""
|
||||
conn = self._get_connection()
|
||||
try:
|
||||
@@ -436,7 +436,7 @@ class TenantManager:
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
def get_tenant(self, tenant_id: str) -> Optional[Tenant]:
|
||||
def get_tenant(self, tenant_id: str) -> Tenant | None:
|
||||
"""获取租户信息"""
|
||||
conn = self._get_connection()
|
||||
try:
|
||||
@@ -451,7 +451,7 @@ class TenantManager:
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
def get_tenant_by_slug(self, slug: str) -> Optional[Tenant]:
|
||||
def get_tenant_by_slug(self, slug: str) -> Tenant | None:
|
||||
"""通过 slug 获取租户"""
|
||||
conn = self._get_connection()
|
||||
try:
|
||||
@@ -466,7 +466,7 @@ class TenantManager:
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
def get_tenant_by_domain(self, domain: str) -> Optional[Tenant]:
|
||||
def get_tenant_by_domain(self, domain: str) -> Tenant | None:
|
||||
"""通过自定义域名获取租户"""
|
||||
conn = self._get_connection()
|
||||
try:
|
||||
@@ -486,11 +486,11 @@ class TenantManager:
|
||||
conn.close()
|
||||
|
||||
def update_tenant(self, tenant_id: str,
|
||||
name: Optional[str] = None,
|
||||
description: Optional[str] = None,
|
||||
tier: Optional[str] = None,
|
||||
status: Optional[str] = None,
|
||||
settings: Optional[Dict] = None) -> Optional[Tenant]:
|
||||
name: str | None = None,
|
||||
description: str | None = None,
|
||||
tier: str | None = None,
|
||||
status: str | None = None,
|
||||
settings: dict | None = None) -> Tenant | None:
|
||||
"""更新租户信息"""
|
||||
conn = self._get_connection()
|
||||
try:
|
||||
@@ -548,9 +548,9 @@ class TenantManager:
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
def list_tenants(self, status: Optional[str] = None,
|
||||
tier: Optional[str] = None,
|
||||
limit: int = 100, offset: int = 0) -> List[Tenant]:
|
||||
def list_tenants(self, status: str | None = None,
|
||||
tier: str | None = None,
|
||||
limit: int = 100, offset: int = 0) -> list[Tenant]:
|
||||
"""列出租户"""
|
||||
conn = self._get_connection()
|
||||
try:
|
||||
@@ -689,7 +689,7 @@ class TenantManager:
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
def get_domain_verification_instructions(self, domain_id: str) -> Dict[str, Any]:
|
||||
def get_domain_verification_instructions(self, domain_id: str) -> dict[str, Any]:
|
||||
"""获取域名验证指导"""
|
||||
conn = self._get_connection()
|
||||
try:
|
||||
@@ -739,7 +739,7 @@ class TenantManager:
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
def list_domains(self, tenant_id: str) -> List[TenantDomain]:
|
||||
def list_domains(self, tenant_id: str) -> list[TenantDomain]:
|
||||
"""列出租户的所有域名"""
|
||||
conn = self._get_connection()
|
||||
try:
|
||||
@@ -758,7 +758,7 @@ class TenantManager:
|
||||
|
||||
# ==================== 品牌白标管理 ====================
|
||||
|
||||
def get_branding(self, tenant_id: str) -> Optional[TenantBranding]:
|
||||
def get_branding(self, tenant_id: str) -> TenantBranding | None:
|
||||
"""获取租户品牌配置"""
|
||||
conn = self._get_connection()
|
||||
try:
|
||||
@@ -774,14 +774,14 @@ class TenantManager:
|
||||
conn.close()
|
||||
|
||||
def update_branding(self, tenant_id: str,
|
||||
logo_url: Optional[str] = None,
|
||||
favicon_url: Optional[str] = None,
|
||||
primary_color: Optional[str] = None,
|
||||
secondary_color: Optional[str] = None,
|
||||
custom_css: Optional[str] = None,
|
||||
custom_js: Optional[str] = None,
|
||||
login_page_bg: Optional[str] = None,
|
||||
email_template: Optional[str] = None) -> TenantBranding:
|
||||
logo_url: str | None = None,
|
||||
favicon_url: str | None = None,
|
||||
primary_color: str | None = None,
|
||||
secondary_color: str | None = None,
|
||||
custom_css: str | None = None,
|
||||
custom_js: str | None = None,
|
||||
login_page_bg: str | None = None,
|
||||
email_template: str | None = None) -> TenantBranding:
|
||||
"""更新租户品牌配置"""
|
||||
conn = self._get_connection()
|
||||
try:
|
||||
@@ -890,7 +890,7 @@ class TenantManager:
|
||||
# ==================== 成员与权限管理 ====================
|
||||
|
||||
def invite_member(self, tenant_id: str, email: str, role: str,
|
||||
invited_by: str, permissions: Optional[List[str]] = None) -> TenantMember:
|
||||
invited_by: str, permissions: list[str] | None = None) -> TenantMember:
|
||||
"""邀请成员加入租户"""
|
||||
conn = self._get_connection()
|
||||
try:
|
||||
@@ -967,7 +967,7 @@ class TenantManager:
|
||||
conn.close()
|
||||
|
||||
def update_member_role(self, tenant_id: str, member_id: str,
|
||||
role: str, permissions: Optional[List[str]] = None) -> bool:
|
||||
role: str, permissions: list[str] | None = None) -> bool:
|
||||
"""更新成员角色"""
|
||||
conn = self._get_connection()
|
||||
try:
|
||||
@@ -988,7 +988,7 @@ class TenantManager:
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
def list_members(self, tenant_id: str, status: Optional[str] = None) -> List[TenantMember]:
|
||||
def list_members(self, tenant_id: str, status: str | None = None) -> list[TenantMember]:
|
||||
"""列出租户成员"""
|
||||
conn = self._get_connection()
|
||||
try:
|
||||
@@ -1042,7 +1042,7 @@ class TenantManager:
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
def get_user_tenants(self, user_id: str) -> List[Dict[str, Any]]:
|
||||
def get_user_tenants(self, user_id: str) -> list[dict[str, Any]]:
|
||||
"""获取用户所属的所有租户"""
|
||||
conn = self._get_connection()
|
||||
try:
|
||||
@@ -1108,8 +1108,8 @@ class TenantManager:
|
||||
conn.close()
|
||||
|
||||
def get_usage_stats(self, tenant_id: str,
|
||||
start_date: Optional[datetime] = None,
|
||||
end_date: Optional[datetime] = None) -> Dict[str, Any]:
|
||||
start_date: datetime | None = None,
|
||||
end_date: datetime | None = None) -> dict[str, Any]:
|
||||
"""获取使用统计"""
|
||||
conn = self._get_connection()
|
||||
try:
|
||||
@@ -1165,7 +1165,7 @@ class TenantManager:
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
def check_resource_limit(self, tenant_id: str, resource_type: str) -> Tuple[bool, int, int]:
|
||||
def check_resource_limit(self, tenant_id: str, resource_type: str) -> tuple[bool, int, int]:
|
||||
"""检查资源是否超限
|
||||
|
||||
Returns:
|
||||
@@ -1288,7 +1288,7 @@ class TenantManager:
|
||||
|
||||
def _add_member_internal(self, conn: sqlite3.Connection, tenant_id: str,
|
||||
user_id: str, email: str, role: TenantRole,
|
||||
invited_by: Optional[str]):
|
||||
invited_by: str | None):
|
||||
"""内部方法:添加成员"""
|
||||
cursor = conn.cursor()
|
||||
member_id = str(uuid.uuid4())
|
||||
@@ -1416,8 +1416,8 @@ class TenantManager:
|
||||
class TenantContext:
|
||||
"""租户上下文管理器 - 用于请求级别的租户隔离"""
|
||||
|
||||
_current_tenant_id: Optional[str] = None
|
||||
_current_user_id: Optional[str] = None
|
||||
_current_tenant_id: str | None = None
|
||||
_current_user_id: str | None = None
|
||||
|
||||
@classmethod
|
||||
def set_current_tenant(cls, tenant_id: str):
|
||||
@@ -1425,7 +1425,7 @@ class TenantContext:
|
||||
cls._current_tenant_id = tenant_id
|
||||
|
||||
@classmethod
|
||||
def get_current_tenant(cls) -> Optional[str]:
|
||||
def get_current_tenant(cls) -> str | None:
|
||||
"""获取当前租户ID"""
|
||||
return cls._current_tenant_id
|
||||
|
||||
@@ -1435,7 +1435,7 @@ class TenantContext:
|
||||
cls._current_user_id = user_id
|
||||
|
||||
@classmethod
|
||||
def get_current_user(cls) -> Optional[str]:
|
||||
def get_current_user(cls) -> str | None:
|
||||
"""获取当前用户ID"""
|
||||
return cls._current_user_id
|
||||
|
||||
|
||||
Reference in New Issue
Block a user