This commit is contained in:
雷雨
2025-12-15 22:05:56 +08:00
commit 8635b84b2d
230 changed files with 53888 additions and 0 deletions

View File

@@ -0,0 +1,159 @@
"""
项目数据模型
"""
from typing import Optional, List, Dict, Any
from .base import BaseModel
from .task import Task
class Project(BaseModel):
"""项目数据模型"""
def __init__(
self,
name: str,
color: str = "#FFD324",
group_id: Optional[str] = None,
tasks: Optional[List[Task]] = None,
in_all: bool = True,
kind: str = "TASK",
view_mode: str = "list",
**kwargs
):
"""
初始化项目实例
Args:
name: 项目名称
color: 项目颜色
group_id: 所属分组ID
tasks: 项目下的任务列表
in_all: 是否显示在所有项目中
kind: 项目类型
view_mode: 视图模式
**kwargs: 其他属性
"""
self.name = name
self.color = color
self.group_id = group_id
self.tasks = tasks or []
self.in_all = in_all
self.kind = kind
self.view_mode = view_mode
super().__init__(**kwargs)
@classmethod
def from_dict(cls, data: Dict[str, Any]) -> 'Project':
"""
从API响应数据创建项目实例
Args:
data: API响应数据
Returns:
Project: 项目实例
"""
# 处理布尔值响应
if isinstance(data, bool):
return None
# 处理任务列表
tasks = []
if isinstance(data.get('tasks'), list):
tasks = [
Task.from_dict(task_data)
for task_data in data['tasks']
]
return cls(
name=data.get('name', ''),
color=data.get('color', '#FFD324'),
group_id=data.get('groupId'),
tasks=tasks,
id=data.get('id'),
view_mode=data.get('viewMode', 'list'),
sort_order=data.get('sortOrder'),
sort_type=data.get('sortType'),
in_all=data.get('inAll', True),
kind=data.get('kind', 'TASK')
)
def to_dict(self) -> Dict[str, Any]:
"""
将项目转换为API请求数据
Returns:
Dict: API请求数据
"""
# 只包含必要的字段
data = {
'name': self.name,
'color': self.color,
'inAll': self.in_all,
'kind': self.kind,
'viewMode': self.view_mode
}
# 只在有值时添加可选字段
if self.group_id:
data['groupId'] = self.group_id
if hasattr(self, 'id') and self.id:
data['id'] = self.id
if hasattr(self, 'sortOrder'):
data['sortOrder'] = self.sortOrder
return data
def add_task(self, task: Task):
"""
添加任务到项目
Args:
task: 任务实例
"""
task.project_id = getattr(self, 'id', None)
self.tasks.append(task)
def remove_task(self, task_id: str):
"""
从项目中移除任务
Args:
task_id: 任务ID
"""
self.tasks = [
task for task in self.tasks
if getattr(task, 'id', None) != task_id
]
def get_task(self, task_id: str) -> Optional[Task]:
"""
获取项目中的特定任务
Args:
task_id: 任务ID
Returns:
Task: 任务实例如果未找到则返回None
"""
for task in self.tasks:
if getattr(task, 'id', None) == task_id:
return task
return None
def get_completed_tasks(self) -> List[Task]:
"""
获取项目中已完成的任务
Returns:
List[Task]: 已完成的任务列表
"""
return [task for task in self.tasks if task.is_completed]
def get_uncompleted_tasks(self) -> List[Task]:
"""
获取项目中未完成的任务
Returns:
List[Task]: 未完成的任务列表
"""
return [task for task in self.tasks if not task.is_completed]