fix: auto-fix code issues (cron)

- 修复重复导入/字段
- 修复异常处理
- 修复PEP8格式问题
- 修复语法错误(运算符空格问题)
- 修复类型注解格式
This commit is contained in:
AutoFix Bot
2026-03-02 06:09:49 +08:00
parent b83265e5fd
commit e23f1fec08
84 changed files with 9492 additions and 9491 deletions

View File

@@ -15,29 +15,29 @@ from typing import Any
class SharePermission(Enum):
"""分享权限级别"""
READ_ONLY = "read_only" # 只读
COMMENT = "comment" # 可评论
EDIT = "edit" # 可编辑
ADMIN = "admin" # 管理员
READ_ONLY = "read_only" # 只读
COMMENT = "comment" # 可评论
EDIT = "edit" # 可编辑
ADMIN = "admin" # 管理员
class CommentTargetType(Enum):
"""评论目标类型"""
ENTITY = "entity" # 实体评论
RELATION = "relation" # 关系评论
TRANSCRIPT = "transcript" # 转录文本评论
PROJECT = "project" # 项目级评论
ENTITY = "entity" # 实体评论
RELATION = "relation" # 关系评论
TRANSCRIPT = "transcript" # 转录文本评论
PROJECT = "project" # 项目级评论
class ChangeType(Enum):
"""变更类型"""
CREATE = "create" # 创建
UPDATE = "update" # 更新
DELETE = "delete" # 删除
MERGE = "merge" # 合并
SPLIT = "split" # 拆分
CREATE = "create" # 创建
UPDATE = "update" # 更新
DELETE = "delete" # 删除
MERGE = "merge" # 合并
SPLIT = "split" # 拆分
@dataclass
@@ -136,10 +136,10 @@ class TeamSpace:
class CollaborationManager:
"""协作管理主类"""
def __init__(self, db_manager=None):
self.db = db_manager
self._shares_cache: dict[str, ProjectShare] = {}
self._comments_cache: dict[str, list[Comment]] = {}
def __init__(self, db_manager = None) -> None:
self.db = db_manager
self._shares_cache: dict[str, ProjectShare] = {}
self._comments_cache: dict[str, list[Comment]] = {}
# ============ 项目分享 ============
@@ -147,57 +147,57 @@ class CollaborationManager:
self,
project_id: str,
created_by: str,
permission: str = "read_only",
expires_in_days: int | None = None,
max_uses: int | None = None,
password: str | None = None,
allow_download: bool = False,
allow_export: bool = False,
permission: str = "read_only",
expires_in_days: int | None = None,
max_uses: int | None = None,
password: str | None = None,
allow_download: bool = False,
allow_export: bool = False,
) -> ProjectShare:
"""创建项目分享链接"""
share_id = str(uuid.uuid4())
token = self._generate_share_token(project_id)
share_id = str(uuid.uuid4())
token = self._generate_share_token(project_id)
now = datetime.now().isoformat()
expires_at = None
now = datetime.now().isoformat()
expires_at = None
if expires_in_days:
expires_at = (datetime.now() + timedelta(days=expires_in_days)).isoformat()
expires_at = (datetime.now() + timedelta(days = expires_in_days)).isoformat()
password_hash = None
password_hash = None
if password:
password_hash = hashlib.sha256(password.encode()).hexdigest()
password_hash = hashlib.sha256(password.encode()).hexdigest()
share = ProjectShare(
id=share_id,
project_id=project_id,
token=token,
permission=permission,
created_by=created_by,
created_at=now,
expires_at=expires_at,
max_uses=max_uses,
use_count=0,
password_hash=password_hash,
is_active=True,
allow_download=allow_download,
allow_export=allow_export,
share = ProjectShare(
id = share_id,
project_id = project_id,
token = token,
permission = permission,
created_by = created_by,
created_at = now,
expires_at = expires_at,
max_uses = max_uses,
use_count = 0,
password_hash = password_hash,
is_active = True,
allow_download = allow_download,
allow_export = allow_export,
)
# 保存到数据库
if self.db:
self._save_share_to_db(share)
self._shares_cache[token] = share
self._shares_cache[token] = share
return share
def _generate_share_token(self, project_id: str) -> str:
"""生成分享令牌"""
data = f"{project_id}:{datetime.now().timestamp()}:{uuid.uuid4()}"
data = f"{project_id}:{datetime.now().timestamp()}:{uuid.uuid4()}"
return hashlib.sha256(data.encode()).hexdigest()[:32]
def _save_share_to_db(self, share: ProjectShare) -> None:
"""保存分享记录到数据库"""
cursor = self.db.conn.cursor()
cursor = self.db.conn.cursor()
cursor.execute(
"""
INSERT INTO project_shares
@@ -224,12 +224,12 @@ class CollaborationManager:
)
self.db.conn.commit()
def validate_share_token(self, token: str, password: str | None = None) -> ProjectShare | None:
def validate_share_token(self, token: str, password: str | None = None) -> ProjectShare | None:
"""验证分享令牌"""
# 从缓存或数据库获取
share = self._shares_cache.get(token)
share = self._shares_cache.get(token)
if not share and self.db:
share = self._get_share_from_db(token)
share = self._get_share_from_db(token)
if not share:
return None
@@ -250,7 +250,7 @@ class CollaborationManager:
if share.password_hash:
if not password:
return None
password_hash = hashlib.sha256(password.encode()).hexdigest()
password_hash = hashlib.sha256(password.encode()).hexdigest()
if password_hash != share.password_hash:
return None
@@ -258,63 +258,63 @@ class CollaborationManager:
def _get_share_from_db(self, token: str) -> ProjectShare | None:
"""从数据库获取分享记录"""
cursor = self.db.conn.cursor()
cursor = self.db.conn.cursor()
cursor.execute(
"""
SELECT * FROM project_shares WHERE token = ?
SELECT * FROM project_shares WHERE token = ?
""",
(token,),
(token, ),
)
row = cursor.fetchone()
row = cursor.fetchone()
if not row:
return None
return ProjectShare(
id=row[0],
project_id=row[1],
token=row[2],
permission=row[3],
created_by=row[4],
created_at=row[5],
expires_at=row[6],
max_uses=row[7],
use_count=row[8],
password_hash=row[9],
is_active=bool(row[10]),
allow_download=bool(row[11]),
allow_export=bool(row[12]),
id = row[0],
project_id = row[1],
token = row[2],
permission = row[3],
created_by = row[4],
created_at = row[5],
expires_at = row[6],
max_uses = row[7],
use_count = row[8],
password_hash = row[9],
is_active = bool(row[10]),
allow_download = bool(row[11]),
allow_export = bool(row[12]),
)
def increment_share_usage(self, token: str) -> None:
"""增加分享链接使用次数"""
share = self._shares_cache.get(token)
share = self._shares_cache.get(token)
if share:
share.use_count += 1
if self.db:
cursor = self.db.conn.cursor()
cursor = self.db.conn.cursor()
cursor.execute(
"""
UPDATE project_shares
SET use_count = use_count + 1
WHERE token = ?
SET use_count = use_count + 1
WHERE token = ?
""",
(token,),
(token, ),
)
self.db.conn.commit()
def revoke_share_link(self, share_id: str, revoked_by: str) -> bool:
"""撤销分享链接"""
if self.db:
cursor = self.db.conn.cursor()
cursor = self.db.conn.cursor()
cursor.execute(
"""
UPDATE project_shares
SET is_active = 0
WHERE id = ?
SET is_active = 0
WHERE id = ?
""",
(share_id,),
(share_id, ),
)
self.db.conn.commit()
return cursor.rowcount > 0
@@ -325,33 +325,33 @@ class CollaborationManager:
if not self.db:
return []
cursor = self.db.conn.cursor()
cursor = self.db.conn.cursor()
cursor.execute(
"""
SELECT * FROM project_shares
WHERE project_id = ?
WHERE project_id = ?
ORDER BY created_at DESC
""",
(project_id,),
(project_id, ),
)
shares = []
shares = []
for row in cursor.fetchall():
shares.append(
ProjectShare(
id=row[0],
project_id=row[1],
token=row[2],
permission=row[3],
created_by=row[4],
created_at=row[5],
expires_at=row[6],
max_uses=row[7],
use_count=row[8],
password_hash=row[9],
is_active=bool(row[10]),
allow_download=bool(row[11]),
allow_export=bool(row[12]),
id = row[0],
project_id = row[1],
token = row[2],
permission = row[3],
created_by = row[4],
created_at = row[5],
expires_at = row[6],
max_uses = row[7],
use_count = row[8],
password_hash = row[9],
is_active = bool(row[10]),
allow_download = bool(row[11]),
allow_export = bool(row[12]),
)
)
return shares
@@ -366,46 +366,46 @@ class CollaborationManager:
author: str,
author_name: str,
content: str,
parent_id: str | None = None,
mentions: list[str] | None = None,
attachments: list[dict] | None = None,
parent_id: str | None = None,
mentions: list[str] | None = None,
attachments: list[dict] | None = None,
) -> Comment:
"""添加评论"""
comment_id = str(uuid.uuid4())
now = datetime.now().isoformat()
comment_id = str(uuid.uuid4())
now = datetime.now().isoformat()
comment = Comment(
id=comment_id,
project_id=project_id,
target_type=target_type,
target_id=target_id,
parent_id=parent_id,
author=author,
author_name=author_name,
content=content,
created_at=now,
updated_at=now,
resolved=False,
resolved_by=None,
resolved_at=None,
mentions=mentions or [],
attachments=attachments or [],
comment = Comment(
id = comment_id,
project_id = project_id,
target_type = target_type,
target_id = target_id,
parent_id = parent_id,
author = author,
author_name = author_name,
content = content,
created_at = now,
updated_at = now,
resolved = False,
resolved_by = None,
resolved_at = None,
mentions = mentions or [],
attachments = attachments or [],
)
if self.db:
self._save_comment_to_db(comment)
# 更新缓存
key = f"{target_type}:{target_id}"
key = f"{target_type}:{target_id}"
if key not in self._comments_cache:
self._comments_cache[key] = []
self._comments_cache[key] = []
self._comments_cache[key].append(comment)
return comment
def _save_comment_to_db(self, comment: Comment) -> None:
"""保存评论到数据库"""
cursor = self.db.conn.cursor()
cursor = self.db.conn.cursor()
cursor.execute(
"""
INSERT INTO comments
@@ -435,18 +435,18 @@ class CollaborationManager:
self.db.conn.commit()
def get_comments(
self, target_type: str, target_id: str, include_resolved: bool = True
self, target_type: str, target_id: str, include_resolved: bool = True
) -> list[Comment]:
"""获取评论列表"""
if not self.db:
return []
cursor = self.db.conn.cursor()
cursor = self.db.conn.cursor()
if include_resolved:
cursor.execute(
"""
SELECT * FROM comments
WHERE target_type = ? AND target_id = ?
WHERE target_type = ? AND target_id = ?
ORDER BY created_at ASC
""",
(target_type, target_id),
@@ -455,13 +455,13 @@ class CollaborationManager:
cursor.execute(
"""
SELECT * FROM comments
WHERE target_type = ? AND target_id = ? AND resolved = 0
WHERE target_type = ? AND target_id = ? AND resolved = 0
ORDER BY created_at ASC
""",
(target_type, target_id),
)
comments = []
comments = []
for row in cursor.fetchall():
comments.append(self._row_to_comment(row))
return comments
@@ -469,21 +469,21 @@ class CollaborationManager:
def _row_to_comment(self, row) -> Comment:
"""将数据库行转换为Comment对象"""
return Comment(
id=row[0],
project_id=row[1],
target_type=row[2],
target_id=row[3],
parent_id=row[4],
author=row[5],
author_name=row[6],
content=row[7],
created_at=row[8],
updated_at=row[9],
resolved=bool(row[10]),
resolved_by=row[11],
resolved_at=row[12],
mentions=json.loads(row[13]) if row[13] else [],
attachments=json.loads(row[14]) if row[14] else [],
id = row[0],
project_id = row[1],
target_type = row[2],
target_id = row[3],
parent_id = row[4],
author = row[5],
author_name = row[6],
content = row[7],
created_at = row[8],
updated_at = row[9],
resolved = bool(row[10]),
resolved_by = row[11],
resolved_at = row[12],
mentions = json.loads(row[13]) if row[13] else [],
attachments = json.loads(row[14]) if row[14] else [],
)
def update_comment(self, comment_id: str, content: str, updated_by: str) -> Comment | None:
@@ -491,13 +491,13 @@ class CollaborationManager:
if not self.db:
return None
now = datetime.now().isoformat()
cursor = self.db.conn.cursor()
now = datetime.now().isoformat()
cursor = self.db.conn.cursor()
cursor.execute(
"""
UPDATE comments
SET content = ?, updated_at = ?
WHERE id = ? AND author = ?
SET content = ?, updated_at = ?
WHERE id = ? AND author = ?
""",
(content, now, comment_id, updated_by),
)
@@ -509,9 +509,9 @@ class CollaborationManager:
def _get_comment_by_id(self, comment_id: str) -> Comment | None:
"""根据ID获取评论"""
cursor = self.db.conn.cursor()
cursor.execute("SELECT * FROM comments WHERE id = ?", (comment_id,))
row = cursor.fetchone()
cursor = self.db.conn.cursor()
cursor.execute("SELECT * FROM comments WHERE id = ?", (comment_id, ))
row = cursor.fetchone()
if row:
return self._row_to_comment(row)
return None
@@ -521,13 +521,13 @@ class CollaborationManager:
if not self.db:
return False
now = datetime.now().isoformat()
cursor = self.db.conn.cursor()
now = datetime.now().isoformat()
cursor = self.db.conn.cursor()
cursor.execute(
"""
UPDATE comments
SET resolved = 1, resolved_by = ?, resolved_at = ?
WHERE id = ?
SET resolved = 1, resolved_by = ?, resolved_at = ?
WHERE id = ?
""",
(resolved_by, now, comment_id),
)
@@ -539,13 +539,13 @@ class CollaborationManager:
if not self.db:
return False
cursor = self.db.conn.cursor()
cursor = self.db.conn.cursor()
# 只允许作者或管理员删除
cursor.execute(
"""
DELETE FROM comments
WHERE id = ? AND (author = ? OR ? IN (
SELECT created_by FROM projects WHERE id = comments.project_id
WHERE id = ? AND (author = ? OR ? IN (
SELECT created_by FROM projects WHERE id = comments.project_id
))
""",
(comment_id, deleted_by, deleted_by),
@@ -554,24 +554,24 @@ class CollaborationManager:
return cursor.rowcount > 0
def get_project_comments(
self, project_id: str, limit: int = 50, offset: int = 0
self, project_id: str, limit: int = 50, offset: int = 0
) -> list[Comment]:
"""获取项目下的所有评论"""
if not self.db:
return []
cursor = self.db.conn.cursor()
cursor = self.db.conn.cursor()
cursor.execute(
"""
SELECT * FROM comments
WHERE project_id = ?
WHERE project_id = ?
ORDER BY created_at DESC
LIMIT ? OFFSET ?
""",
(project_id, limit, offset),
)
comments = []
comments = []
for row in cursor.fetchall():
comments.append(self._row_to_comment(row))
return comments
@@ -587,32 +587,32 @@ class CollaborationManager:
entity_name: str,
changed_by: str,
changed_by_name: str,
old_value: dict | None = None,
new_value: dict | None = None,
description: str = "",
session_id: str | None = None,
old_value: dict | None = None,
new_value: dict | None = None,
description: str = "",
session_id: str | None = None,
) -> ChangeRecord:
"""记录变更"""
record_id = str(uuid.uuid4())
now = datetime.now().isoformat()
record_id = str(uuid.uuid4())
now = datetime.now().isoformat()
record = ChangeRecord(
id=record_id,
project_id=project_id,
change_type=change_type,
entity_type=entity_type,
entity_id=entity_id,
entity_name=entity_name,
changed_by=changed_by,
changed_by_name=changed_by_name,
changed_at=now,
old_value=old_value,
new_value=new_value,
description=description,
session_id=session_id,
reverted=False,
reverted_at=None,
reverted_by=None,
record = ChangeRecord(
id = record_id,
project_id = project_id,
change_type = change_type,
entity_type = entity_type,
entity_id = entity_id,
entity_name = entity_name,
changed_by = changed_by,
changed_by_name = changed_by_name,
changed_at = now,
old_value = old_value,
new_value = new_value,
description = description,
session_id = session_id,
reverted = False,
reverted_at = None,
reverted_by = None,
)
if self.db:
@@ -622,7 +622,7 @@ class CollaborationManager:
def _save_change_to_db(self, record: ChangeRecord) -> None:
"""保存变更记录到数据库"""
cursor = self.db.conn.cursor()
cursor = self.db.conn.cursor()
cursor.execute(
"""
INSERT INTO change_history
@@ -655,22 +655,22 @@ class CollaborationManager:
def get_change_history(
self,
project_id: str,
entity_type: str | None = None,
entity_id: str | None = None,
limit: int = 50,
offset: int = 0,
entity_type: str | None = None,
entity_id: str | None = None,
limit: int = 50,
offset: int = 0,
) -> list[ChangeRecord]:
"""获取变更历史"""
if not self.db:
return []
cursor = self.db.conn.cursor()
cursor = self.db.conn.cursor()
if entity_type and entity_id:
cursor.execute(
"""
SELECT * FROM change_history
WHERE project_id = ? AND entity_type = ? AND entity_id = ?
WHERE project_id = ? AND entity_type = ? AND entity_id = ?
ORDER BY changed_at DESC
LIMIT ? OFFSET ?
""",
@@ -680,7 +680,7 @@ class CollaborationManager:
cursor.execute(
"""
SELECT * FROM change_history
WHERE project_id = ? AND entity_type = ?
WHERE project_id = ? AND entity_type = ?
ORDER BY changed_at DESC
LIMIT ? OFFSET ?
""",
@@ -690,14 +690,14 @@ class CollaborationManager:
cursor.execute(
"""
SELECT * FROM change_history
WHERE project_id = ?
WHERE project_id = ?
ORDER BY changed_at DESC
LIMIT ? OFFSET ?
""",
(project_id, limit, offset),
)
records = []
records = []
for row in cursor.fetchall():
records.append(self._row_to_change_record(row))
return records
@@ -705,22 +705,22 @@ class CollaborationManager:
def _row_to_change_record(self, row) -> ChangeRecord:
"""将数据库行转换为ChangeRecord对象"""
return ChangeRecord(
id=row[0],
project_id=row[1],
change_type=row[2],
entity_type=row[3],
entity_id=row[4],
entity_name=row[5],
changed_by=row[6],
changed_by_name=row[7],
changed_at=row[8],
old_value=json.loads(row[9]) if row[9] else None,
new_value=json.loads(row[10]) if row[10] else None,
description=row[11],
session_id=row[12],
reverted=bool(row[13]),
reverted_at=row[14],
reverted_by=row[15],
id = row[0],
project_id = row[1],
change_type = row[2],
entity_type = row[3],
entity_id = row[4],
entity_name = row[5],
changed_by = row[6],
changed_by_name = row[7],
changed_at = row[8],
old_value = json.loads(row[9]) if row[9] else None,
new_value = json.loads(row[10]) if row[10] else None,
description = row[11],
session_id = row[12],
reverted = bool(row[13]),
reverted_at = row[14],
reverted_by = row[15],
)
def get_entity_version_history(self, entity_type: str, entity_id: str) -> list[ChangeRecord]:
@@ -728,17 +728,17 @@ class CollaborationManager:
if not self.db:
return []
cursor = self.db.conn.cursor()
cursor = self.db.conn.cursor()
cursor.execute(
"""
SELECT * FROM change_history
WHERE entity_type = ? AND entity_id = ?
WHERE entity_type = ? AND entity_id = ?
ORDER BY changed_at ASC
""",
(entity_type, entity_id),
)
records = []
records = []
for row in cursor.fetchall():
records.append(self._row_to_change_record(row))
return records
@@ -748,13 +748,13 @@ class CollaborationManager:
if not self.db:
return False
now = datetime.now().isoformat()
cursor = self.db.conn.cursor()
now = datetime.now().isoformat()
cursor = self.db.conn.cursor()
cursor.execute(
"""
UPDATE change_history
SET reverted = 1, reverted_at = ?, reverted_by = ?
WHERE id = ? AND reverted = 0
SET reverted = 1, reverted_at = ?, reverted_by = ?
WHERE id = ? AND reverted = 0
""",
(now, reverted_by, record_id),
)
@@ -766,49 +766,49 @@ class CollaborationManager:
if not self.db:
return {}
cursor = self.db.conn.cursor()
cursor = self.db.conn.cursor()
# 总变更数
cursor.execute(
"""
SELECT COUNT(*) FROM change_history WHERE project_id = ?
SELECT COUNT(*) FROM change_history WHERE project_id = ?
""",
(project_id,),
(project_id, ),
)
total_changes = cursor.fetchone()[0]
total_changes = cursor.fetchone()[0]
# 按类型统计
cursor.execute(
"""
SELECT change_type, COUNT(*) FROM change_history
WHERE project_id = ? GROUP BY change_type
WHERE project_id = ? GROUP BY change_type
""",
(project_id,),
(project_id, ),
)
type_counts = {row[0]: row[1] for row in cursor.fetchall()}
type_counts = {row[0]: row[1] for row in cursor.fetchall()}
# 按实体类型统计
cursor.execute(
"""
SELECT entity_type, COUNT(*) FROM change_history
WHERE project_id = ? GROUP BY entity_type
WHERE project_id = ? GROUP BY entity_type
""",
(project_id,),
(project_id, ),
)
entity_type_counts = {row[0]: row[1] for row in cursor.fetchall()}
entity_type_counts = {row[0]: row[1] for row in cursor.fetchall()}
# 最近活跃的用户
cursor.execute(
"""
SELECT changed_by_name, COUNT(*) as count FROM change_history
WHERE project_id = ?
WHERE project_id = ?
GROUP BY changed_by_name
ORDER BY count DESC
LIMIT 5
""",
(project_id,),
(project_id, ),
)
top_contributors = [{"name": row[0], "changes": row[1]} for row in cursor.fetchall()]
top_contributors = [{"name": row[0], "changes": row[1]} for row in cursor.fetchall()]
return {
"total_changes": total_changes,
@@ -827,27 +827,27 @@ class CollaborationManager:
user_email: str,
role: str,
invited_by: str,
permissions: list[str] | None = None,
permissions: list[str] | None = None,
) -> TeamMember:
"""添加团队成员"""
member_id = str(uuid.uuid4())
now = datetime.now().isoformat()
member_id = str(uuid.uuid4())
now = datetime.now().isoformat()
# 根据角色设置默认权限
if permissions is None:
permissions = self._get_default_permissions(role)
permissions = self._get_default_permissions(role)
member = TeamMember(
id=member_id,
project_id=project_id,
user_id=user_id,
user_name=user_name,
user_email=user_email,
role=role,
joined_at=now,
invited_by=invited_by,
last_active_at=None,
permissions=permissions,
member = TeamMember(
id = member_id,
project_id = project_id,
user_id = user_id,
user_name = user_name,
user_email = user_email,
role = role,
joined_at = now,
invited_by = invited_by,
last_active_at = None,
permissions = permissions,
)
if self.db:
@@ -857,7 +857,7 @@ class CollaborationManager:
def _get_default_permissions(self, role: str) -> list[str]:
"""获取角色的默认权限"""
permissions_map = {
permissions_map = {
"owner": ["read", "write", "delete", "share", "admin", "export"],
"admin": ["read", "write", "delete", "share", "export"],
"editor": ["read", "write", "export"],
@@ -868,7 +868,7 @@ class CollaborationManager:
def _save_member_to_db(self, member: TeamMember) -> None:
"""保存成员到数据库"""
cursor = self.db.conn.cursor()
cursor = self.db.conn.cursor()
cursor.execute(
"""
INSERT INTO team_members
@@ -896,16 +896,16 @@ class CollaborationManager:
if not self.db:
return []
cursor = self.db.conn.cursor()
cursor = self.db.conn.cursor()
cursor.execute(
"""
SELECT * FROM team_members WHERE project_id = ?
SELECT * FROM team_members WHERE project_id = ?
ORDER BY joined_at ASC
""",
(project_id,),
(project_id, ),
)
members = []
members = []
for row in cursor.fetchall():
members.append(self._row_to_team_member(row))
return members
@@ -913,16 +913,16 @@ class CollaborationManager:
def _row_to_team_member(self, row) -> TeamMember:
"""将数据库行转换为TeamMember对象"""
return TeamMember(
id=row[0],
project_id=row[1],
user_id=row[2],
user_name=row[3],
user_email=row[4],
role=row[5],
joined_at=row[6],
invited_by=row[7],
last_active_at=row[8],
permissions=json.loads(row[9]) if row[9] else [],
id = row[0],
project_id = row[1],
user_id = row[2],
user_name = row[3],
user_email = row[4],
role = row[5],
joined_at = row[6],
invited_by = row[7],
last_active_at = row[8],
permissions = json.loads(row[9]) if row[9] else [],
)
def update_member_role(self, member_id: str, new_role: str, updated_by: str) -> bool:
@@ -930,13 +930,13 @@ class CollaborationManager:
if not self.db:
return False
permissions = self._get_default_permissions(new_role)
cursor = self.db.conn.cursor()
permissions = self._get_default_permissions(new_role)
cursor = self.db.conn.cursor()
cursor.execute(
"""
UPDATE team_members
SET role = ?, permissions = ?
WHERE id = ?
SET role = ?, permissions = ?
WHERE id = ?
""",
(new_role, json.dumps(permissions), member_id),
)
@@ -948,8 +948,8 @@ class CollaborationManager:
if not self.db:
return False
cursor = self.db.conn.cursor()
cursor.execute("DELETE FROM team_members WHERE id = ?", (member_id,))
cursor = self.db.conn.cursor()
cursor.execute("DELETE FROM team_members WHERE id = ?", (member_id, ))
self.db.conn.commit()
return cursor.rowcount > 0
@@ -958,20 +958,20 @@ class CollaborationManager:
if not self.db:
return False
cursor = self.db.conn.cursor()
cursor = self.db.conn.cursor()
cursor.execute(
"""
SELECT permissions FROM team_members
WHERE project_id = ? AND user_id = ?
WHERE project_id = ? AND user_id = ?
""",
(project_id, user_id),
)
row = cursor.fetchone()
row = cursor.fetchone()
if not row:
return False
permissions = json.loads(row[0]) if row[0] else []
permissions = json.loads(row[0]) if row[0] else []
return permission in permissions or "admin" in permissions
def update_last_active(self, project_id: str, user_id: str) -> None:
@@ -979,13 +979,13 @@ class CollaborationManager:
if not self.db:
return
now = datetime.now().isoformat()
cursor = self.db.conn.cursor()
now = datetime.now().isoformat()
cursor = self.db.conn.cursor()
cursor.execute(
"""
UPDATE team_members
SET last_active_at = ?
WHERE project_id = ? AND user_id = ?
SET last_active_at = ?
WHERE project_id = ? AND user_id = ?
""",
(now, project_id, user_id),
)
@@ -993,12 +993,12 @@ class CollaborationManager:
# 全局协作管理器实例
_collaboration_manager = None
_collaboration_manager = None
def get_collaboration_manager(db_manager=None) -> None:
def get_collaboration_manager(db_manager = None) -> None:
"""获取协作管理器单例"""
global _collaboration_manager
if _collaboration_manager is None:
_collaboration_manager = CollaborationManager(db_manager)
_collaboration_manager = CollaborationManager(db_manager)
return _collaboration_manager