fix: auto-fix code issues (cron)

- 修复重复导入/字段
- 修复异常处理
- 修复PEP8格式问题
- 添加类型注解
This commit is contained in:
OpenClaw Bot
2026-02-27 18:09:24 +08:00
parent 646b64daf7
commit 17bda3dbce
38 changed files with 1993 additions and 1972 deletions

View File

@@ -10,19 +10,19 @@ InsightFlow Phase 8 - 企业级功能管理模块
作者: InsightFlow Team
"""
import sqlite3
import json
import uuid
from datetime import datetime, timedelta
from typing import Optional, List, Dict, Any, Tuple
from dataclasses import dataclass
from enum import Enum
import logging
import sqlite3
import uuid
from dataclasses import dataclass
from datetime import datetime, timedelta
from enum import StrEnum
from typing import Any
logger = logging.getLogger(__name__)
class SSOProvider(str, Enum):
class SSOProvider(StrEnum):
"""SSO 提供商类型"""
WECHAT_WORK = "wechat_work" # 企业微信
@@ -34,7 +34,7 @@ class SSOProvider(str, Enum):
CUSTOM_SAML = "custom_saml" # 自定义 SAML
class SSOStatus(str, Enum):
class SSOStatus(StrEnum):
"""SSO 配置状态"""
DISABLED = "disabled" # 未启用
@@ -43,7 +43,7 @@ class SSOStatus(str, Enum):
ERROR = "error" # 配置错误
class SCIMSyncStatus(str, Enum):
class SCIMSyncStatus(StrEnum):
"""SCIM 同步状态"""
IDLE = "idle" # 空闲
@@ -52,7 +52,7 @@ class SCIMSyncStatus(str, Enum):
FAILED = "failed" # 同步失败
class AuditLogExportFormat(str, Enum):
class AuditLogExportFormat(StrEnum):
"""审计日志导出格式"""
JSON = "json"
@@ -61,7 +61,7 @@ class AuditLogExportFormat(str, Enum):
XLSX = "xlsx"
class DataRetentionAction(str, Enum):
class DataRetentionAction(StrEnum):
"""数据保留策略动作"""
ARCHIVE = "archive" # 归档
@@ -69,7 +69,7 @@ class DataRetentionAction(str, Enum):
ANONYMIZE = "anonymize" # 匿名化
class ComplianceStandard(str, Enum):
class ComplianceStandard(StrEnum):
"""合规标准"""
SOC2 = "soc2"
@@ -87,29 +87,29 @@ class SSOConfig:
tenant_id: str
provider: str # SSO 提供商
status: str # 状态
entity_id: Optional[str] # SAML Entity ID
sso_url: Optional[str] # SAML SSO URL
slo_url: Optional[str] # SAML SLO URL
certificate: Optional[str] # SAML 证书 (X.509)
metadata_url: Optional[str] # SAML 元数据 URL
metadata_xml: Optional[str] # SAML 元数据 XML
entity_id: str | None # SAML Entity ID
sso_url: str | None # SAML SSO URL
slo_url: str | None # SAML SLO URL
certificate: str | None # SAML 证书 (X.509)
metadata_url: str | None # SAML 元数据 URL
metadata_xml: str | None # SAML 元数据 XML
# OAuth/OIDC 配置
client_id: Optional[str]
client_secret: Optional[str]
authorization_url: Optional[str]
token_url: Optional[str]
userinfo_url: Optional[str]
scopes: List[str]
client_id: str | None
client_secret: str | None
authorization_url: str | None
token_url: str | None
userinfo_url: str | None
scopes: list[str]
# 属性映射
attribute_mapping: Dict[str, str] # 如 {"email": "user.mail", "name": "user.name"}
attribute_mapping: dict[str, str] # 如 {"email": "user.mail", "name": "user.name"}
# 其他配置
auto_provision: bool # 自动创建用户
default_role: str # 默认角色
domain_restriction: List[str] # 允许的邮箱域名
domain_restriction: list[str] # 允许的邮箱域名
created_at: datetime
updated_at: datetime
last_tested_at: Optional[datetime]
last_error: Optional[str]
last_tested_at: datetime | None
last_error: str | None
@dataclass
@@ -125,14 +125,14 @@ class SCIMConfig:
scim_token: str # SCIM 访问令牌
# 同步配置
sync_interval_minutes: int # 同步间隔(分钟)
last_sync_at: Optional[datetime]
last_sync_status: Optional[str]
last_sync_error: Optional[str]
last_sync_at: datetime | None
last_sync_status: str | None
last_sync_error: str | None
last_sync_users_count: int
# 属性映射
attribute_mapping: Dict[str, str]
attribute_mapping: dict[str, str]
# 同步规则
sync_rules: Dict[str, Any] # 过滤规则、转换规则等
sync_rules: dict[str, Any] # 过滤规则、转换规则等
created_at: datetime
updated_at: datetime
@@ -146,12 +146,12 @@ class SCIMUser:
external_id: str # 外部系统 ID
user_name: str
email: str
display_name: Optional[str]
given_name: Optional[str]
family_name: Optional[str]
display_name: str | None
given_name: str | None
family_name: str | None
active: bool
groups: List[str]
raw_data: Dict[str, Any] # 原始 SCIM 数据
groups: list[str]
raw_data: dict[str, Any] # 原始 SCIM 数据
synced_at: datetime
created_at: datetime
updated_at: datetime
@@ -166,20 +166,20 @@ class AuditLogExport:
export_format: str
start_date: datetime
end_date: datetime
filters: Dict[str, Any] # 过滤条件
compliance_standard: Optional[str]
filters: dict[str, Any] # 过滤条件
compliance_standard: str | None
status: str # pending/processing/completed/failed
file_path: Optional[str]
file_size: Optional[int]
record_count: Optional[int]
checksum: Optional[str] # 文件校验和
downloaded_by: Optional[str]
downloaded_at: Optional[datetime]
expires_at: Optional[datetime] # 文件过期时间
file_path: str | None
file_size: int | None
record_count: int | None
checksum: str | None # 文件校验和
downloaded_by: str | None
downloaded_at: datetime | None
expires_at: datetime | None # 文件过期时间
created_by: str
created_at: datetime
completed_at: Optional[datetime]
error_message: Optional[str]
completed_at: datetime | None
error_message: str | None
@dataclass
@@ -189,23 +189,23 @@ class DataRetentionPolicy:
id: str
tenant_id: str
name: str
description: Optional[str]
description: str | None
resource_type: str # project/transcript/entity/audit_log/user_data
retention_days: int # 保留天数
action: str # archive/delete/anonymize
# 条件
conditions: Dict[str, Any] # 触发条件
conditions: dict[str, Any] # 触发条件
# 执行配置
auto_execute: bool # 自动执行
execute_at: Optional[str] # 执行时间 (cron 表达式)
execute_at: str | None # 执行时间 (cron 表达式)
notify_before_days: int # 提前通知天数
# 归档配置
archive_location: Optional[str] # 归档位置
archive_location: str | None # 归档位置
archive_encryption: bool # 归档加密
# 状态
is_active: bool
last_executed_at: Optional[datetime]
last_execution_result: Optional[str]
last_executed_at: datetime | None
last_execution_result: str | None
created_at: datetime
updated_at: datetime
@@ -218,13 +218,13 @@ class DataRetentionJob:
policy_id: str
tenant_id: str
status: str # pending/running/completed/failed
started_at: Optional[datetime]
completed_at: Optional[datetime]
started_at: datetime | None
completed_at: datetime | None
affected_records: int
archived_records: int
deleted_records: int
error_count: int
details: Dict[str, Any]
details: dict[str, Any]
created_at: datetime
@@ -236,11 +236,11 @@ class SAMLAuthRequest:
tenant_id: str
sso_config_id: str
request_id: str # SAML Request ID
relay_state: Optional[str]
relay_state: str | None
created_at: datetime
expires_at: datetime
used: bool
used_at: Optional[datetime]
used_at: datetime | None
@dataclass
@@ -250,13 +250,13 @@ class SAMLAuthResponse:
id: str
request_id: str
tenant_id: str
user_id: Optional[str]
email: Optional[str]
name: Optional[str]
attributes: Dict[str, Any]
session_index: Optional[str]
user_id: str | None
email: str | None
name: str | None
attributes: dict[str, Any]
session_index: str | None
processed: bool
processed_at: Optional[datetime]
processed_at: datetime | None
created_at: datetime
@@ -548,22 +548,22 @@ class EnterpriseManager:
self,
tenant_id: str,
provider: str,
entity_id: Optional[str] = None,
sso_url: Optional[str] = None,
slo_url: Optional[str] = None,
certificate: Optional[str] = None,
metadata_url: Optional[str] = None,
metadata_xml: Optional[str] = None,
client_id: Optional[str] = None,
client_secret: Optional[str] = None,
authorization_url: Optional[str] = None,
token_url: Optional[str] = None,
userinfo_url: Optional[str] = None,
scopes: Optional[List[str]] = None,
attribute_mapping: Optional[Dict[str, str]] = None,
entity_id: str | None = None,
sso_url: str | None = None,
slo_url: str | None = None,
certificate: str | None = None,
metadata_url: str | None = None,
metadata_xml: str | None = None,
client_id: str | None = None,
client_secret: str | None = None,
authorization_url: str | None = None,
token_url: str | None = None,
userinfo_url: str | None = None,
scopes: list[str] | None = None,
attribute_mapping: dict[str, str] | None = None,
auto_provision: bool = True,
default_role: str = "member",
domain_restriction: Optional[List[str]] = None,
domain_restriction: list[str] | None = None,
) -> SSOConfig:
"""创建 SSO 配置"""
conn = self._get_connection()
@@ -649,7 +649,7 @@ class EnterpriseManager:
finally:
conn.close()
def get_sso_config(self, config_id: str) -> Optional[SSOConfig]:
def get_sso_config(self, config_id: str) -> SSOConfig | None:
"""获取 SSO 配置"""
conn = self._get_connection()
try:
@@ -664,7 +664,7 @@ class EnterpriseManager:
finally:
conn.close()
def get_tenant_sso_config(self, tenant_id: str, provider: Optional[str] = None) -> Optional[SSOConfig]:
def get_tenant_sso_config(self, tenant_id: str, provider: str | None = None) -> SSOConfig | None:
"""获取租户的 SSO 配置"""
conn = self._get_connection()
try:
@@ -698,7 +698,7 @@ class EnterpriseManager:
finally:
conn.close()
def update_sso_config(self, config_id: str, **kwargs) -> Optional[SSOConfig]:
def update_sso_config(self, config_id: str, **kwargs) -> SSOConfig | None:
"""更新 SSO 配置"""
conn = self._get_connection()
try:
@@ -772,7 +772,7 @@ class EnterpriseManager:
finally:
conn.close()
def list_sso_configs(self, tenant_id: str) -> List[SSOConfig]:
def list_sso_configs(self, tenant_id: str) -> list[SSOConfig]:
"""列出租户的所有 SSO 配置"""
conn = self._get_connection()
try:
@@ -835,7 +835,7 @@ class EnterpriseManager:
return metadata
def create_saml_auth_request(
self, tenant_id: str, config_id: str, relay_state: Optional[str] = None
self, tenant_id: str, config_id: str, relay_state: str | None = None
) -> SAMLAuthRequest:
"""创建 SAML 认证请求"""
conn = self._get_connection()
@@ -881,7 +881,7 @@ class EnterpriseManager:
finally:
conn.close()
def get_saml_auth_request(self, request_id: str) -> Optional[SAMLAuthRequest]:
def get_saml_auth_request(self, request_id: str) -> SAMLAuthRequest | None:
"""获取 SAML 认证请求"""
conn = self._get_connection()
try:
@@ -901,7 +901,7 @@ class EnterpriseManager:
finally:
conn.close()
def process_saml_response(self, request_id: str, saml_response: str) -> Optional[SAMLAuthResponse]:
def process_saml_response(self, request_id: str, saml_response: str) -> SAMLAuthResponse | None:
"""处理 SAML 响应"""
# 这里应该实现实际的 SAML 响应解析
# 简化实现:假设响应已经验证并解析
@@ -954,7 +954,7 @@ class EnterpriseManager:
finally:
conn.close()
def _parse_saml_response(self, saml_response: str) -> Dict[str, Any]:
def _parse_saml_response(self, saml_response: str) -> dict[str, Any]:
"""解析 SAML 响应(简化实现)"""
# 实际应该使用 python-saml 库解析
# 这里返回模拟数据
@@ -974,8 +974,8 @@ class EnterpriseManager:
scim_base_url: str,
scim_token: str,
sync_interval_minutes: int = 60,
attribute_mapping: Optional[Dict[str, str]] = None,
sync_rules: Optional[Dict[str, Any]] = None,
attribute_mapping: dict[str, str] | None = None,
sync_rules: dict[str, Any] | None = None,
) -> SCIMConfig:
"""创建 SCIM 配置"""
conn = self._get_connection()
@@ -1035,7 +1035,7 @@ class EnterpriseManager:
finally:
conn.close()
def get_scim_config(self, config_id: str) -> Optional[SCIMConfig]:
def get_scim_config(self, config_id: str) -> SCIMConfig | None:
"""获取 SCIM 配置"""
conn = self._get_connection()
try:
@@ -1050,7 +1050,7 @@ class EnterpriseManager:
finally:
conn.close()
def get_tenant_scim_config(self, tenant_id: str) -> Optional[SCIMConfig]:
def get_tenant_scim_config(self, tenant_id: str) -> SCIMConfig | None:
"""获取租户的 SCIM 配置"""
conn = self._get_connection()
try:
@@ -1071,7 +1071,7 @@ class EnterpriseManager:
finally:
conn.close()
def update_scim_config(self, config_id: str, **kwargs) -> Optional[SCIMConfig]:
def update_scim_config(self, config_id: str, **kwargs) -> SCIMConfig | None:
"""更新 SCIM 配置"""
conn = self._get_connection()
try:
@@ -1121,7 +1121,7 @@ class EnterpriseManager:
finally:
conn.close()
def sync_scim_users(self, config_id: str) -> Dict[str, Any]:
def sync_scim_users(self, config_id: str) -> dict[str, Any]:
"""执行 SCIM 用户同步"""
config = self.get_scim_config(config_id)
if not config:
@@ -1184,13 +1184,13 @@ class EnterpriseManager:
finally:
conn.close()
def _fetch_scim_users(self, config: SCIMConfig) -> List[Dict[str, Any]]:
def _fetch_scim_users(self, config: SCIMConfig) -> list[dict[str, Any]]:
"""从 SCIM 服务端获取用户(模拟实现)"""
# 实际应该使用 HTTP 请求获取
# GET {scim_base_url}/Users
return []
def _upsert_scim_user(self, conn: sqlite3.Connection, tenant_id: str, user_data: Dict[str, Any]):
def _upsert_scim_user(self, conn: sqlite3.Connection, tenant_id: str, user_data: dict[str, Any]):
"""插入或更新 SCIM 用户"""
cursor = conn.cursor()
@@ -1238,7 +1238,7 @@ class EnterpriseManager:
),
)
def list_scim_users(self, tenant_id: str, active_only: bool = True) -> List[SCIMUser]:
def list_scim_users(self, tenant_id: str, active_only: bool = True) -> list[SCIMUser]:
"""列出 SCIM 用户"""
conn = self._get_connection()
try:
@@ -1269,8 +1269,8 @@ class EnterpriseManager:
start_date: datetime,
end_date: datetime,
created_by: str,
filters: Optional[Dict[str, Any]] = None,
compliance_standard: Optional[str] = None,
filters: dict[str, Any] | None = None,
compliance_standard: str | None = None,
) -> AuditLogExport:
"""创建审计日志导出任务"""
conn = self._get_connection()
@@ -1337,7 +1337,7 @@ class EnterpriseManager:
finally:
conn.close()
def process_audit_export(self, export_id: str, db_manager=None) -> Optional[AuditLogExport]:
def process_audit_export(self, export_id: str, db_manager=None) -> AuditLogExport | None:
"""处理审计日志导出任务"""
export = self.get_audit_export(export_id)
if not export:
@@ -1401,8 +1401,8 @@ class EnterpriseManager:
conn.close()
def _fetch_audit_logs(
self, tenant_id: str, start_date: datetime, end_date: datetime, filters: Dict[str, Any], db_manager=None
) -> List[Dict[str, Any]]:
self, tenant_id: str, start_date: datetime, end_date: datetime, filters: dict[str, Any], db_manager=None
) -> list[dict[str, Any]]:
"""获取审计日志数据"""
if db_manager is None:
return []
@@ -1411,7 +1411,7 @@ class EnterpriseManager:
# 这里简化实现
return []
def _apply_compliance_filter(self, logs: List[Dict[str, Any]], standard: str) -> List[Dict[str, Any]]:
def _apply_compliance_filter(self, logs: list[dict[str, Any]], standard: str) -> list[dict[str, Any]]:
"""应用合规标准字段过滤"""
fields = self.COMPLIANCE_FIELDS.get(ComplianceStandard(standard), [])
@@ -1425,10 +1425,10 @@ class EnterpriseManager:
return filtered_logs
def _generate_export_file(self, export_id: str, logs: List[Dict[str, Any]], format: str) -> Tuple[str, int, str]:
def _generate_export_file(self, export_id: str, logs: list[dict[str, Any]], format: str) -> tuple[str, int, str]:
"""生成导出文件"""
import os
import hashlib
import os
export_dir = "/tmp/insightflow/exports"
os.makedirs(export_dir, exist_ok=True)
@@ -1461,7 +1461,7 @@ class EnterpriseManager:
return file_path, file_size, checksum
def get_audit_export(self, export_id: str) -> Optional[AuditLogExport]:
def get_audit_export(self, export_id: str) -> AuditLogExport | None:
"""获取审计日志导出记录"""
conn = self._get_connection()
try:
@@ -1476,7 +1476,7 @@ class EnterpriseManager:
finally:
conn.close()
def list_audit_exports(self, tenant_id: str, limit: int = 100) -> List[AuditLogExport]:
def list_audit_exports(self, tenant_id: str, limit: int = 100) -> list[AuditLogExport]:
"""列出审计日志导出记录"""
conn = self._get_connection()
try:
@@ -1524,12 +1524,12 @@ class EnterpriseManager:
resource_type: str,
retention_days: int,
action: str,
description: Optional[str] = None,
conditions: Optional[Dict[str, Any]] = None,
description: str | None = None,
conditions: dict[str, Any] | None = None,
auto_execute: bool = False,
execute_at: Optional[str] = None,
execute_at: str | None = None,
notify_before_days: int = 7,
archive_location: Optional[str] = None,
archive_location: str | None = None,
archive_encryption: bool = True,
) -> DataRetentionPolicy:
"""创建数据保留策略"""
@@ -1599,7 +1599,7 @@ class EnterpriseManager:
finally:
conn.close()
def get_retention_policy(self, policy_id: str) -> Optional[DataRetentionPolicy]:
def get_retention_policy(self, policy_id: str) -> DataRetentionPolicy | None:
"""获取数据保留策略"""
conn = self._get_connection()
try:
@@ -1614,7 +1614,7 @@ class EnterpriseManager:
finally:
conn.close()
def list_retention_policies(self, tenant_id: str, resource_type: Optional[str] = None) -> List[DataRetentionPolicy]:
def list_retention_policies(self, tenant_id: str, resource_type: str | None = None) -> list[DataRetentionPolicy]:
"""列出数据保留策略"""
conn = self._get_connection()
try:
@@ -1637,7 +1637,7 @@ class EnterpriseManager:
finally:
conn.close()
def update_retention_policy(self, policy_id: str, **kwargs) -> Optional[DataRetentionPolicy]:
def update_retention_policy(self, policy_id: str, **kwargs) -> DataRetentionPolicy | None:
"""更新数据保留策略"""
conn = self._get_connection()
try:
@@ -1818,7 +1818,7 @@ class EnterpriseManager:
def _retain_audit_logs(
self, conn: sqlite3.Connection, policy: DataRetentionPolicy, cutoff_date: datetime
) -> Dict[str, int]:
) -> dict[str, int]:
"""保留审计日志"""
cursor = conn.cursor()
@@ -1851,19 +1851,19 @@ class EnterpriseManager:
def _retain_projects(
self, conn: sqlite3.Connection, policy: DataRetentionPolicy, cutoff_date: datetime
) -> Dict[str, int]:
) -> dict[str, int]:
"""保留项目数据"""
# 简化实现
return {"affected": 0, "archived": 0, "deleted": 0, "errors": 0}
def _retain_transcripts(
self, conn: sqlite3.Connection, policy: DataRetentionPolicy, cutoff_date: datetime
) -> Dict[str, int]:
) -> dict[str, int]:
"""保留转录数据"""
# 简化实现
return {"affected": 0, "archived": 0, "deleted": 0, "errors": 0}
def get_retention_job(self, job_id: str) -> Optional[DataRetentionJob]:
def get_retention_job(self, job_id: str) -> DataRetentionJob | None:
"""获取数据保留任务"""
conn = self._get_connection()
try:
@@ -1878,7 +1878,7 @@ class EnterpriseManager:
finally:
conn.close()
def list_retention_jobs(self, policy_id: str, limit: int = 100) -> List[DataRetentionJob]:
def list_retention_jobs(self, policy_id: str, limit: int = 100) -> list[DataRetentionJob]:
"""列出数据保留任务"""
conn = self._get_connection()
try: