67 lines
1.5 KiB
Python
67 lines
1.5 KiB
Python
from pydantic import BaseModel, Field
|
|
from typing import Optional, List
|
|
from datetime import datetime
|
|
from enum import Enum
|
|
|
|
class TicketStatus(str, Enum):
|
|
OPEN = "open"
|
|
IN_PROGRESS = "in_progress"
|
|
RESOLVED = "resolved"
|
|
CLOSED = "closed"
|
|
|
|
class TicketPriority(str, Enum):
|
|
LOW = "low"
|
|
MEDIUM = "medium"
|
|
HIGH = "high"
|
|
CRITICAL = "critical"
|
|
|
|
class ProjectCreate(BaseModel):
|
|
name: str
|
|
key: str = Field(..., pattern="^[A-Z]{2,10}$")
|
|
description: Optional[str] = None
|
|
webhook_url: Optional[str] = None
|
|
|
|
class Project(ProjectCreate):
|
|
id: int
|
|
created_at: datetime
|
|
ticket_count: int = 0
|
|
|
|
class TicketCreate(BaseModel):
|
|
project_id: int
|
|
title: str
|
|
description: str
|
|
priority: TicketPriority = TicketPriority.MEDIUM
|
|
labels: List[str] = []
|
|
|
|
class Ticket(TicketCreate):
|
|
id: int
|
|
key: str # e.g., "PROJ-123"
|
|
status: TicketStatus = TicketStatus.OPEN
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
|
|
class TicketUpdate(BaseModel):
|
|
title: Optional[str] = None
|
|
description: Optional[str] = None
|
|
status: Optional[TicketStatus] = None
|
|
priority: Optional[TicketPriority] = None
|
|
labels: Optional[List[str]] = None
|
|
|
|
class Comment(BaseModel):
|
|
id: int
|
|
ticket_id: int
|
|
author: str
|
|
content: str
|
|
created_at: datetime
|
|
|
|
class CommentCreate(BaseModel):
|
|
author: str = "system"
|
|
content: str
|
|
|
|
class WebhookConfig(BaseModel):
|
|
id: int
|
|
project_id: int
|
|
url: str
|
|
events: List[str] = ["ticket.created", "ticket.updated", "comment.added"]
|
|
active: bool = True
|