85 lines
2.3 KiB
Python
85 lines
2.3 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 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
|
|
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]
|