72 lines
2.6 KiB
Python
72 lines
2.6 KiB
Python
"""
|
|
Ticket Model - ServiceManagerWeb
|
|
"""
|
|
from sqlalchemy import String, ForeignKey, Text
|
|
from sqlalchemy.orm import Mapped, mapped_column, relationship
|
|
from sqlalchemy.dialects.postgresql import UUID, ENUM
|
|
from typing import Optional, TYPE_CHECKING
|
|
import enum
|
|
import uuid
|
|
|
|
from app.core.database import Base
|
|
from .tenant import Tenant
|
|
from .system import System
|
|
from .user import User
|
|
|
|
if TYPE_CHECKING:
|
|
from app.models.category import Category
|
|
|
|
class TicketStatus(str, enum.Enum):
|
|
NEW = "NEW"
|
|
TRIAGE = "TRIAGE"
|
|
IN_PROGRESS = "IN_PROGRESS"
|
|
WAITING_FOR_CLIENT = "WAITING_FOR_CLIENT"
|
|
RESOLVED = "RESOLVED"
|
|
CLOSED = "CLOSED"
|
|
REOPENED = "REOPENED"
|
|
|
|
class TicketPriority(str, enum.Enum):
|
|
LOW = "LOW"
|
|
MEDIUM = "MEDIUM"
|
|
HIGH = "HIGH"
|
|
URGENT = "URGENT"
|
|
|
|
class Ticket(Base):
|
|
__tablename__ = "tickets"
|
|
|
|
# Note: id, created_at, updated_at are inherited from Base
|
|
|
|
tenant_id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), ForeignKey("tenants.id", ondelete="CASCADE"), nullable=False)
|
|
|
|
ticket_number: Mapped[str] = mapped_column(String(20), nullable=False)
|
|
subject: Mapped[str] = mapped_column(String(255), nullable=False)
|
|
description: Mapped[str] = mapped_column(Text, nullable=False)
|
|
|
|
status: Mapped[TicketStatus] = mapped_column(ENUM(TicketStatus, name="ticket_status_enum", create_type=False), default=TicketStatus.NEW)
|
|
priority: Mapped[TicketPriority] = mapped_column(ENUM(TicketPriority, name="ticket_priority_enum", create_type=False), default=TicketPriority.MEDIUM)
|
|
|
|
# Foreign Keys
|
|
created_by: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), ForeignKey("users.id"), nullable=False)
|
|
assigned_to: Mapped[Optional[uuid.UUID]] = mapped_column(UUID(as_uuid=True), ForeignKey("users.id"), nullable=True)
|
|
|
|
affected_system_id: Mapped[Optional[uuid.UUID]] = mapped_column(UUID(as_uuid=True), ForeignKey("systems.id"), nullable=True)
|
|
category_id: Mapped[Optional[uuid.UUID]] = mapped_column(UUID(as_uuid=True), ForeignKey("categories.id"), nullable=True)
|
|
|
|
# Relationships
|
|
tenant: Mapped["Tenant"] = relationship("Tenant", back_populates="tickets")
|
|
|
|
system: Mapped["System"] = relationship("System", back_populates="tickets")
|
|
category: Mapped["Category"] = relationship("Category", back_populates="tickets")
|
|
|
|
created_by_user: Mapped["User"] = relationship(
|
|
"User",
|
|
foreign_keys=[created_by],
|
|
back_populates="created_tickets"
|
|
)
|
|
|
|
assigned_to_user: Mapped[Optional["User"]] = relationship(
|
|
"User",
|
|
foreign_keys=[assigned_to],
|
|
back_populates="assigned_tickets"
|
|
)
|