scheme.py 2.7 KB

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