159 lines
4.2 KiB
Python
159 lines
4.2 KiB
Python
"""
|
||
项目数据模型
|
||
"""
|
||
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] |