55 lines
1.3 KiB
Python
55 lines
1.3 KiB
Python
"""Ticket data model for the ticketing system."""
|
|
|
|
from dataclasses import dataclass, field, asdict
|
|
from datetime import datetime, timezone
|
|
from enum import Enum
|
|
from typing import Optional
|
|
|
|
|
|
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"
|
|
|
|
|
|
@dataclass
|
|
class Ticket:
|
|
title: str
|
|
description: str
|
|
priority: TicketPriority = TicketPriority.MEDIUM
|
|
status: TicketStatus = TicketStatus.OPEN
|
|
assignee: str = ""
|
|
project: str = ""
|
|
id: Optional[int] = None
|
|
created_at: str = ""
|
|
updated_at: str = ""
|
|
|
|
def __post_init__(self) -> None:
|
|
now = datetime.now(timezone.utc).isoformat()
|
|
if not self.created_at:
|
|
self.created_at = now
|
|
if not self.updated_at:
|
|
self.updated_at = now
|
|
|
|
def to_dict(self) -> dict:
|
|
data = asdict(self)
|
|
data["priority"] = self.priority.value
|
|
data["status"] = self.status.value
|
|
return data
|
|
|
|
@classmethod
|
|
def from_dict(cls, data: dict) -> "Ticket":
|
|
data = dict(data) # shallow copy
|
|
data["priority"] = TicketPriority(data["priority"])
|
|
data["status"] = TicketStatus(data["status"])
|
|
return cls(**data)
|
|
|