140 lines
4.5 KiB
Python
140 lines
4.5 KiB
Python
|
|
"""Pydantic schemas for Epic model"""
|
||
|
|
from datetime import datetime
|
||
|
|
from typing import Any, Dict, List, Optional
|
||
|
|
|
||
|
|
from pydantic import BaseModel, ConfigDict, Field
|
||
|
|
|
||
|
|
|
||
|
|
class EpicCreateRequest(BaseModel):
|
||
|
|
"""Schema for creating a new epic"""
|
||
|
|
|
||
|
|
model_config = ConfigDict(
|
||
|
|
json_schema_extra={
|
||
|
|
"example": {
|
||
|
|
"name": "User Authentication",
|
||
|
|
"description": "Implement login and registration",
|
||
|
|
"content": [
|
||
|
|
{"type": "paragraph", "children": [{"text": "Details..."}]}
|
||
|
|
],
|
||
|
|
"color": "#3b82f6",
|
||
|
|
"pos": 1.0,
|
||
|
|
"depth_limit": 5,
|
||
|
|
"parent_epic_id": None,
|
||
|
|
"completed_list_id": 5,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
)
|
||
|
|
|
||
|
|
name: str = Field(..., min_length=1, max_length=200, description="Epic name")
|
||
|
|
description: Optional[str] = Field(None, description="Epic description")
|
||
|
|
content: Optional[Any] = Field(None, description="Rich text content")
|
||
|
|
color: Optional[str] = Field(None, max_length=7, description="Hex color code")
|
||
|
|
pos: Optional[float] = Field(None, description="Position for ordering")
|
||
|
|
depth_limit: Optional[int] = Field(
|
||
|
|
None, ge=1, le=10, description="Maximum depth for hierarchy"
|
||
|
|
)
|
||
|
|
parent_epic_id: Optional[int] = Field(
|
||
|
|
None, description="Parent epic ID for nesting"
|
||
|
|
)
|
||
|
|
completed_list_id: Optional[int] = Field(
|
||
|
|
None, description="List ID that marks cards as completed"
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
class EpicResponse(BaseModel):
|
||
|
|
"""Schema for epic response"""
|
||
|
|
|
||
|
|
model_config = ConfigDict(
|
||
|
|
from_attributes=True,
|
||
|
|
json_schema_extra={
|
||
|
|
"example": {
|
||
|
|
"id": 1,
|
||
|
|
"name": "User Authentication",
|
||
|
|
"description": "Implement login and registration",
|
||
|
|
"content": [
|
||
|
|
{"type": "paragraph", "children": [{"text": "Details..."}]}
|
||
|
|
],
|
||
|
|
"color": "#3b82f6",
|
||
|
|
"closed": False,
|
||
|
|
"pos": 1.0,
|
||
|
|
"depth_limit": 5,
|
||
|
|
"board_id": 1,
|
||
|
|
"parent_epic_id": None,
|
||
|
|
"metrics": {"card_count": 5, "progress": 60},
|
||
|
|
"date_last_activity": "2024-01-15T10:30:00",
|
||
|
|
"created_at": "2024-01-01T10:00:00",
|
||
|
|
"updated_at": "2024-01-15T10:30:00",
|
||
|
|
}
|
||
|
|
},
|
||
|
|
)
|
||
|
|
|
||
|
|
id: int
|
||
|
|
name: str
|
||
|
|
description: Optional[str] = None
|
||
|
|
content: Optional[Any] = None
|
||
|
|
color: Optional[str] = None
|
||
|
|
closed: bool
|
||
|
|
pos: Optional[float] = None
|
||
|
|
depth_limit: Optional[int] = None
|
||
|
|
board_id: int
|
||
|
|
parent_epic_id: Optional[int] = None
|
||
|
|
completed_list_id: Optional[int] = None
|
||
|
|
metrics: Optional[Dict[str, Any]] = None
|
||
|
|
date_last_activity: Optional[datetime] = None
|
||
|
|
created_at: Optional[datetime] = None
|
||
|
|
updated_at: Optional[datetime] = None
|
||
|
|
|
||
|
|
|
||
|
|
class EpicUpdateRequest(BaseModel):
|
||
|
|
"""Schema for updating an epic"""
|
||
|
|
|
||
|
|
model_config = ConfigDict(
|
||
|
|
json_schema_extra={
|
||
|
|
"example": {
|
||
|
|
"name": "Updated Epic Name",
|
||
|
|
"description": "Updated description",
|
||
|
|
"content": [
|
||
|
|
{"type": "paragraph", "children": [{"text": "Updated..."}]}
|
||
|
|
],
|
||
|
|
"color": "#ef4444",
|
||
|
|
"closed": True,
|
||
|
|
"pos": 2.0,
|
||
|
|
"depth_limit": 3,
|
||
|
|
"parent_epic_id": 2,
|
||
|
|
"completed_list_id": 5,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
)
|
||
|
|
|
||
|
|
name: Optional[str] = Field(None, min_length=1, max_length=200)
|
||
|
|
description: Optional[str] = None
|
||
|
|
content: Optional[Any] = None
|
||
|
|
color: Optional[str] = Field(None, max_length=7)
|
||
|
|
closed: Optional[bool] = None
|
||
|
|
pos: Optional[float] = None
|
||
|
|
depth_limit: Optional[int] = Field(None, ge=1, le=10)
|
||
|
|
parent_epic_id: Optional[int] = None
|
||
|
|
completed_list_id: Optional[int] = None
|
||
|
|
|
||
|
|
|
||
|
|
class EpicWithCardsResponse(BaseModel):
|
||
|
|
"""Schema for epic response with cards"""
|
||
|
|
|
||
|
|
model_config = ConfigDict(from_attributes=True)
|
||
|
|
|
||
|
|
id: int
|
||
|
|
name: str
|
||
|
|
description: Optional[str] = None
|
||
|
|
content: Optional[Any] = None
|
||
|
|
color: Optional[str] = None
|
||
|
|
closed: bool
|
||
|
|
pos: Optional[float] = None
|
||
|
|
depth_limit: Optional[int] = None
|
||
|
|
board_id: int
|
||
|
|
parent_epic_id: Optional[int] = None
|
||
|
|
metrics: Optional[Dict[str, Any]] = None
|
||
|
|
date_last_activity: Optional[datetime] = None
|
||
|
|
created_at: Optional[datetime] = None
|
||
|
|
updated_at: Optional[datetime] = None
|
||
|
|
cards: List[Dict[str, Any]] = Field(default_factory=list)
|