Files
X25020501_card_book/core/routers/card/schema.py
2025-08-18 01:59:01 +08:00

90 lines
2.4 KiB
Python

# -*- 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 CardPicture(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[condecimal(max_digits=10, decimal_places=1)] = None
auto_score: Optional[condecimal(max_digits=10, decimal_places=1)] = None
card_name: str
card_number: Optional[str] = None
card_type: Optional[str] = None
card_picture: Optional[CardPicture] = CardPicture()
card_spare_picture: Optional[dict] = CardPicture()
source: SupportPlatformType
@field_validator("card_year", mode="before")
@classmethod
def convert_to_str(cls, v):
if isinstance(v, int):
v = str(v)
return v
class CardIn(Card):
category: CardCategoryType
source: PlatformSourceType
diy_source: Optional[constr(max_length=50)] = None
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 PlatformSessionsIn(BaseModel):
data: dict
class SearchCardOut(Card):
pass
class CardVisitOut(Card):
source: PlatformSourceType
display_price: Optional[condecimal(max_digits=10, decimal_places=2)] = None
class CardOut(CardVisitOut):
id: Optional[int] = None
card_id: Optional[int] = None
card_year: str | None
category: CardCategoryType
purchase_price: Optional[condecimal(max_digits=10, decimal_places=2)] = None
displayed: Optional[bool] = False
diy_source: Optional[str] = None
class DisplayCardIn(BaseModel):
card_ids: list[int]
class DeleteCardIn(BaseModel):
card_ids: list[int]