ticket.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import json
  2. from pydantic import BaseModel, field_validator
  3. from typing import Optional, Dict, Any, Literal, List
  4. from datetime import datetime
  5. class VasTicketBase(BaseModel):
  6. status: Optional[
  7. Literal['pending', 'info_required', 'resolved', 'rejected']
  8. ] = None
  9. admin_comment: Optional[str] = None
  10. extra_fields: Optional[Dict[str, Any]] = None
  11. @field_validator("extra_fields", mode="before")
  12. def normalize_json_field(cls, v):
  13. if v is None:
  14. return None
  15. if isinstance(v, str):
  16. try:
  17. return json.loads(v)
  18. except Exception:
  19. return {}
  20. return v
  21. class VasTicketCreate(BaseModel):
  22. order_id: str
  23. type: Literal['refund', 'dispute', 'change_request']
  24. reason: Optional[str]
  25. class VasTicketOut(VasTicketBase):
  26. id: int
  27. order_id: str
  28. user_id: str
  29. type: str
  30. reason: Optional[str]
  31. created_at: datetime
  32. updated_at: datetime
  33. model_config = {
  34. "from_attributes": True
  35. }
  36. class VasTicketStatusUpdate(BaseModel):
  37. status: Literal["resolved", "info_required", "rejected"]
  38. comment: str
  39. class VasTicketMessageBase(BaseModel):
  40. ticket_id: int
  41. sender_type: Literal["user", "admin", "system"]
  42. sender_id: Optional[str] = None
  43. content: Optional[str] = None
  44. attachments: Optional[Dict[str, Any]] = None
  45. @field_validator("attachments", mode="before")
  46. def normalize_json_field(cls, v):
  47. if v is None:
  48. return None
  49. if isinstance(v, str):
  50. try:
  51. return json.loads(v)
  52. except Exception:
  53. return {}
  54. return v
  55. class VasTicketMessageCreate(BaseModel):
  56. content: str
  57. attachments: Optional[dict] = None
  58. class VasTicketMessageOut(VasTicketMessageBase):
  59. id: int
  60. created_at: datetime
  61. model_config = {
  62. "from_attributes": True
  63. }