scheme.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  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. # 新增:用于指定要更新哪个结果图片路径的枚举
  13. class ResultImagePathType(str, Enum):
  14. detection = "detection"
  15. modified = "modified"
  16. # "图片类型和计算分数分数类型映射表"
  17. IMAGE_TYPE_TO_SCORE_TYPE = {
  18. "front_face": "front_face",
  19. "back_face": "back_face",
  20. "front_edge": "front_corner_edge",
  21. "back_edge": "back_corner_edge",
  22. }
  23. # --- Pydantic 数据模型 ---
  24. class CardImageResponse(BaseModel):
  25. """用于API响应的图片数据模型 (主键为 id)"""
  26. id: int
  27. card_id: int
  28. image_type: str
  29. image_name: Optional[str] = None
  30. image_path: str
  31. detection_image_path: Optional[str] = None
  32. modified_image_path: Optional[str] = None
  33. detection_json: Dict[str, Any]
  34. modified_json: Optional[Dict[str, Any]] = None
  35. created_at: datetime
  36. updated_at: datetime
  37. class Config:
  38. from_attributes = True
  39. @field_validator('detection_json', 'modified_json', mode='before')
  40. @classmethod
  41. def parse_json_string(cls, v):
  42. if v is None:
  43. return None
  44. if isinstance(v, str):
  45. try:
  46. return json.loads(v)
  47. except json.JSONDecodeError:
  48. raise ValueError("Invalid JSON string in database")
  49. return v
  50. class CardDetailResponse(BaseModel):
  51. """用于响应单个卡牌详细信息的模型 (主键为 id)"""
  52. id: int
  53. card_name: Optional[str] = None
  54. created_at: datetime
  55. updated_at: datetime
  56. detection_score: Optional[float] = None
  57. modified_score: Optional[float] = None
  58. detection_score_detail: Optional[Dict[str, Any]] = None
  59. modified_score_detail: Optional[Dict[str, Any]] = None
  60. images: List[CardImageResponse] = []
  61. class Config:
  62. from_attributes = True
  63. class ImageJsonPairResponse(BaseModel):
  64. """用于获取单个图片两个JSON数据的响应模型 (主键为 id)"""
  65. id: int
  66. detection_json: Dict[str, Any]
  67. modified_json: Optional[Dict[str, Any]] = None
  68. class Config:
  69. from_attributes = True
  70. @field_validator('detection_json', 'modified_json', mode='before')
  71. @classmethod
  72. def parse_json_string(cls, v):
  73. if v is None:
  74. return None
  75. if isinstance(v, str):
  76. try:
  77. return json.loads(v)
  78. except json.JSONDecodeError:
  79. raise ValueError("Invalid JSON string in database")
  80. return v
  81. class CardListDetailResponse(BaseModel):
  82. """为新的卡牌列表接口定义的响应模型 (主键为 id)"""
  83. id: int
  84. card_name: Optional[str] = None
  85. created_at: datetime
  86. updated_at: datetime
  87. class Config:
  88. from_attributes = True