import json from pydantic import BaseModel, field_validator from typing import Optional, Dict, Any, Literal, List from datetime import datetime class VasTicketBase(BaseModel): status: Optional[ Literal['pending', 'info_required', 'resolved', 'rejected'] ] = None admin_comment: Optional[str] = None extra_fields: Optional[Dict[str, Any]] = None @field_validator("extra_fields", mode="before") def normalize_json_field(cls, v): if v is None: return None if isinstance(v, str): try: return json.loads(v) except Exception: return {} return v class VasTicketCreate(BaseModel): order_id: str type: Literal['refund', 'dispute', 'change_request'] reason: Optional[str] class VasTicketOut(VasTicketBase): id: int order_id: str user_id: str type: str reason: Optional[str] created_at: datetime updated_at: datetime model_config = { "from_attributes": True } class VasTicketStatusUpdate(BaseModel): status: Literal["resolved", "info_required", "rejected"] comment: str class VasTicketMessageBase(BaseModel): ticket_id: int sender_type: Literal["user", "admin", "system"] sender_id: Optional[str] = None content: Optional[str] = None attachments: Optional[Dict[str, Any]] = None @field_validator("attachments", mode="before") def normalize_json_field(cls, v): if v is None: return None if isinstance(v, str): try: return json.loads(v) except Exception: return {} return v class VasTicketMessageCreate(BaseModel): content: str attachments: Optional[dict] = None class VasTicketMessageOut(VasTicketMessageBase): id: int created_at: datetime model_config = { "from_attributes": True }