""" 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" )