scheme.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. import json
  2. from datetime import datetime
  3. from pathlib import Path
  4. from typing import Optional, Dict, Any, List
  5. from pydantic import BaseModel, field_validator
  6. from enum import Enum
  7. class ImageType(str, Enum):
  8. front_face = "front_face"
  9. back_face = "back_face"
  10. front_edge = "front_edge"
  11. back_edge = "back_edge"
  12. class CardType(str, Enum):
  13. pokemon = "pokemon"
  14. basketball = "basketball"
  15. baseball = "baseball"
  16. # 用于指定要更新哪个结果图片路径的枚举
  17. class ResultImagePathType(str, Enum):
  18. detection = "detection"
  19. modified = "modified"
  20. # 用于排序的
  21. class SortBy(str, Enum): # NEW
  22. card_name = "card_name"
  23. created_at = "created_at"
  24. updated_at = "updated_at"
  25. detection_score = "detection_score"
  26. modified_score = "modified_score"
  27. class SortOrder(str, Enum): # NEW
  28. asc = "ASC"
  29. desc = "DESC"
  30. # "图片类型和计算分数分数类型映射表"
  31. IMAGE_TYPE_TO_SCORE_TYPE = {
  32. "front_face": "front_face",
  33. "back_face": "back_face",
  34. "front_edge": "front_corner_edge",
  35. "back_edge": "back_corner_edge",
  36. }
  37. # --- Pydantic 数据模型 ---
  38. class CardImageResponse(BaseModel):
  39. """用于API响应的图片数据模型 (主键为 id)"""
  40. id: int
  41. card_id: int
  42. image_type: str
  43. image_name: Optional[str] = None
  44. image_path: str
  45. detection_image_path: Optional[str] = None
  46. modified_image_path: Optional[str] = None
  47. detection_json: Dict[str, Any]
  48. modified_json: Optional[Dict[str, Any]] = None
  49. created_at: datetime
  50. updated_at: datetime
  51. class Config:
  52. from_attributes = True
  53. @field_validator('detection_json', 'modified_json', mode='before')
  54. @classmethod
  55. def parse_json_string(cls, v):
  56. if v is None:
  57. return None
  58. if isinstance(v, str):
  59. try:
  60. return json.loads(v)
  61. except json.JSONDecodeError:
  62. raise ValueError("Invalid JSON string in database")
  63. return v
  64. class CardDetailResponse(BaseModel):
  65. """用于响应单个卡牌详细信息的模型 (主键为 id)"""
  66. id: int
  67. card_name: Optional[str] = None
  68. created_at: datetime
  69. updated_at: datetime
  70. card_type: str
  71. is_edited: bool
  72. detection_score: Optional[float] = None
  73. modified_score: Optional[float] = None
  74. detection_score_detail: Optional[Dict[str, Any]] = None
  75. modified_score_detail: Optional[Dict[str, Any]] = None
  76. images: List[CardImageResponse] = []
  77. class Config:
  78. from_attributes = True
  79. class ImageJsonPairResponse(BaseModel):
  80. """用于获取单个图片两个JSON数据的响应模型 (主键为 id)"""
  81. id: int
  82. detection_json: Dict[str, Any]
  83. modified_json: Optional[Dict[str, Any]] = None
  84. class Config:
  85. from_attributes = True
  86. @field_validator('detection_json', 'modified_json', mode='before')
  87. @classmethod
  88. def parse_json_string(cls, v):
  89. if v is None:
  90. return None
  91. if isinstance(v, str):
  92. try:
  93. return json.loads(v)
  94. except json.JSONDecodeError:
  95. raise ValueError("Invalid JSON string in database")
  96. return v
  97. class CardImageInListResponse(BaseModel):
  98. """为卡牌列表接口定义的简化版图片响应模型"""
  99. id: int
  100. image_type: str
  101. image_path: str
  102. detection_image_path: Optional[str] = None
  103. modified_image_path: Optional[str] = None
  104. class Config:
  105. from_attributes = True
  106. class CardListDetailResponse(BaseModel):
  107. """为新的卡牌列表接口定义的响应模型"""
  108. id: int
  109. card_name: Optional[str] = None
  110. card_type: str
  111. detection_score: Optional[float] = None
  112. modified_score: Optional[float] = None
  113. is_edited: bool
  114. created_at: datetime
  115. updated_at: datetime
  116. images: List[CardImageInListResponse] = []
  117. class Config:
  118. from_attributes = True