55 lines
1.4 KiB
Python
55 lines
1.4 KiB
Python
"""Project schemas."""
|
|||
|
|
from pydantic import BaseModel, Field
|
||
|
|
from typing import Optional, List
|
||
|
|
from datetime import datetime
|
||
|
|
|
||
|
|
|
||
|
|
class ProjectCreate(BaseModel):
|
||
|
|
name: str = Field(..., min_length=1, max_length=300)
|
||
|
|
description: str = ""
|
||
|
|
start_date: Optional[datetime] = None
|
||
|
|
end_date: Optional[datetime] = None
|
||
|
|
budget_limit_cents: Optional[int] = None
|
||
|
|
acceptance_criteria: str = ""
|
||
|
|
tags: str = ""
|
||
|
|
|
||
|
|
|
||
|
|
class ProjectUpdate(BaseModel):
|
||
|
|
name: Optional[str] = None
|
||
|
|
description: Optional[str] = None
|
||
|
|
status: Optional[str] = None
|
||
|
|
start_date: Optional[datetime] = None
|
||
|
|
end_date: Optional[datetime] = None
|
||
|
|
budget_limit_cents: Optional[int] = None
|
||
|
|
acceptance_criteria: Optional[str] = None
|
||
|
|
tags: Optional[str] = None
|
||
|
|
|
||
|
|
|
||
|
|
class ProjectResponse(BaseModel):
|
||
|
|
id: int
|
||
|
|
name: str
|
||
|
|
description: str
|
||
|
|
status: str
|
||
|
|
owner_id: int
|
||
|
|
tenant_id: int
|
||
|
|
start_date: Optional[datetime] = None
|
||
|
|
end_date: Optional[datetime] = None
|
||
|
|
budget_limit_cents: Optional[int] = None
|
||
|
|
acceptance_criteria: str = ""
|
||
|
|
tags: str = ""
|
||
|
|
created_at: datetime
|
||
|
|
updated_at: datetime
|
||
|
|
|
||
|
|
model_config = {"from_attributes": True}
|
||
|
|
|
||
|
|
|
||
|
|
class ProjectStats(BaseModel):
|
||
|
|
"""Project-level statistics for dashboard."""
|
||
|
|
total_tasks: int = 0
|
||
|
|
pending_tasks: int = 0
|
||
|
|
in_progress_tasks: int = 0
|
||
|
|
review_tasks: int = 0
|
||
|
|
done_tasks: int = 0
|
||
|
|
total_cost_cents: int = 0
|
||
|
|
total_artifacts: int = 0
|
||
|
|
pending_reviews: int = 0
|