# -*- coding = utf-8 -*- # @Time : 2025/2/13 下午5:01 # @File : schema.py # @Software : PyCharm # @Author : xingc # @Desc : import re from typing import Optional, Dict from pydantic import BaseModel, constr, condecimal, field_validator from core.base.schema import SupportPlatformType, PlatformSourceType, CardCategoryType class CardPrice(BaseModel): front_picture: Optional[str] = None reverse_picture: Optional[str] = None # 自定义校验规则 @field_validator('front_picture', 'reverse_picture') def check_length(cls, value): if value is not None: if not re.match(r'^http.*\.jpg$', value): raise ValueError('链接不合法') return value class Card(BaseModel): cert_number: str card_year: Optional[constr(pattern=r'^\d{4}([-~]\d{1,4})?$')] card_brand: Optional[str] = None card_score: Optional[float] = None auto_score: Optional[float] = None card_name: str card_number: Optional[str] = None card_type: Optional[str] = None card_picture: Optional[CardPrice] = {} card_spare_picture: Optional[dict] = {} source: SupportPlatformType class CardIn(Card): category: CardCategoryType reward: Optional[bool] = False class UpdateCard(BaseModel): purchase_price: condecimal(max_digits=10, decimal_places=2) display_price: condecimal(max_digits=10, decimal_places=2) class CardVisitOut(Card, UpdateCard): source: PlatformSourceType class CardOut(CardVisitOut): id: Optional[int] = None purchase_price: Optional[condecimal(max_digits=10, decimal_places=2)] = None display_price: Optional[condecimal(max_digits=10, decimal_places=2)] = None class DeleteCardIn(BaseModel): card_ids: list[int]