98 lines
2.7 KiB
Python
98 lines
2.7 KiB
Python
"""
|
|
Ticket Schemas - ServiceManagerWeb
|
|
|
|
Pydantic schemas para gestión de tickets y comentarios.
|
|
"""
|
|
|
|
from pydantic import BaseModel, ConfigDict, model_validator
|
|
from typing import Optional, Literal
|
|
from datetime import datetime
|
|
|
|
|
|
class TicketCreate(BaseModel):
|
|
"""Schema para crear un ticket."""
|
|
subject: str
|
|
description: str
|
|
category_id: Optional[str] = None
|
|
affected_system_id: Optional[str] = None
|
|
priority: Literal["LOW", "MEDIUM", "HIGH", "URGENT"] = "MEDIUM"
|
|
contact_email: Optional[str] = None
|
|
contact_phone: Optional[str] = None
|
|
|
|
@model_validator(mode="before")
|
|
@classmethod
|
|
def _accept_legacy_fields(cls, data):
|
|
if not isinstance(data, dict):
|
|
return data
|
|
|
|
if "subject" not in data and "title" in data:
|
|
data["subject"] = data["title"]
|
|
|
|
if "affected_system_id" not in data and "system_id" in data:
|
|
data["affected_system_id"] = data["system_id"]
|
|
|
|
return data
|
|
|
|
|
|
class TicketUpdate(BaseModel):
|
|
"""Schema para actualizar un ticket."""
|
|
subject: Optional[str] = None
|
|
description: Optional[str] = None
|
|
status: Optional[str] = None
|
|
priority: Optional[str] = None
|
|
assigned_to: Optional[str] = None
|
|
|
|
|
|
class TicketResponse(BaseModel):
|
|
"""Schema de respuesta con todos los campos públicos del ticket."""
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
id: str
|
|
ticket_number: str
|
|
subject: str
|
|
title: str
|
|
description: str
|
|
status: str
|
|
priority: str
|
|
category_id: Optional[str] = None
|
|
category_name: Optional[str] = None
|
|
affected_system_id: Optional[str] = None
|
|
system_id: Optional[str] = None
|
|
affected_system_name: Optional[str] = None
|
|
contact_email: Optional[str] = None
|
|
contact_phone: Optional[str] = None
|
|
created_by: str
|
|
assigned_to: Optional[str] = None
|
|
assigned_to_name: Optional[str] = None
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
sla_response_due: Optional[datetime] = None
|
|
sla_resolution_due: Optional[datetime] = None
|
|
first_response_at: Optional[datetime] = None
|
|
resolved_at: Optional[datetime] = None
|
|
|
|
|
|
class TicketCloseRequest(BaseModel):
|
|
"""Schema para cerrar un ticket con resolución opcional."""
|
|
resolution: Optional[str] = None
|
|
|
|
|
|
class CommentCreate(BaseModel):
|
|
"""Schema para crear un comentario en un ticket."""
|
|
content: str
|
|
is_internal: bool = False
|
|
|
|
|
|
class CommentResponse(BaseModel):
|
|
"""Schema de respuesta de comentario."""
|
|
id: str
|
|
ticket_id: str
|
|
author_id: str
|
|
author_name: str
|
|
content: str
|
|
is_internal: bool
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
|
|
model_config = ConfigDict(from_attributes=True)
|