from pydantic import BaseModel, Field from typing import Optional from datetime import datetime # Brand Schemas class BrandBase(BaseModel): name: str = Field(..., min_length=1, max_length=100, description="品牌名称") class BrandCreate(BrandBase): pass class BrandUpdate(BaseModel): name: Optional[str] = Field(None, min_length=1, max_length=100, description="品牌名称") class BrandResponse(BrandBase): id: int class Config: from_attributes = True # Model Schemas class ModelBase(BaseModel): brand_name: str = Field(..., min_length=1, max_length=100, description="品牌名称") name: str = Field(..., min_length=1, max_length=100, description="型号名称") form: Optional[str] = Field(None, max_length=100, description="形式") rig: Optional[str] = Field(None, max_length=100, description="阻抗") source: Optional[str] = Field(None, max_length=100, description="来源") eq_key: Optional[str] = Field(None, max_length=255, description="EQ 键") class ModelCreate(ModelBase): pass class ModelUpdate(BaseModel): brand_name: Optional[str] = Field(None, min_length=1, max_length=100, description="品牌名称") name: Optional[str] = Field(None, min_length=1, max_length=100, description="型号名称") form: Optional[str] = Field(None, max_length=100, description="形式") rig: Optional[str] = Field(None, max_length=100, description="阻抗") source: Optional[str] = Field(None, max_length=100, description="来源") eq_key: Optional[str] = Field(None, max_length=255, description="EQ 键") class ModelResponse(ModelBase): id: int create_at: datetime class Config: from_attributes = True # OTA Schemas class OtaBase(BaseModel): verCode: int = Field(..., description="版本号(整数)") verName: str = Field(..., min_length=1, max_length=20, description="版本名称") url: str = Field(..., max_length=255, description="升级包 URL") md5: str = Field(..., min_length=32, max_length=32, description="升级包 MD5") force: Optional[int] = Field(0, ge=0, le=1, description="是否强升;0-否") desc: Optional[str] = Field(None, max_length=255, description="描述") model: Optional[str] = Field(None, max_length=100, description="对应的设备型号") hw: Optional[int] = Field(0, description="硬件版本号") target: Optional[int] = Field(0, ge=0, le=1, description="是否定向,1-是,0-否") beta: Optional[int] = Field(0, ge=0, le=1, description="是否灰度,1-是,0-否") pawVerCode: Optional[int] = Field(0, description="配对版本号") pawVerName: Optional[str] = Field("", max_length=20, description="配对版本名称") pawUrl: Optional[str] = Field("", max_length=255, description="配对版本 URL") pawMd5: Optional[str] = Field("", min_length=32, max_length=32, description="配对版本 MD5") startTime: Optional[datetime] = Field(None, description="升级开始时间") endTime: Optional[datetime] = Field(None, description="升级结束时间") status: Optional[int] = Field(1, ge=0, le=1, description="是否可用") class OtaCreate(OtaBase): pass class OtaUpdate(BaseModel): verCode: Optional[int] = Field(None, description="版本号(整数)") verName: Optional[str] = Field(None, min_length=1, max_length=20, description="版本名称") url: Optional[str] = Field(None, max_length=255, description="升级包 URL") md5: Optional[str] = Field(None, min_length=32, max_length=32, description="升级包 MD5") force: Optional[int] = Field(None, ge=0, le=1, description="是否强升;0-否") desc: Optional[str] = Field(None, max_length=255, description="描述") model: Optional[str] = Field(None, max_length=100, description="对应的设备型号") hw: Optional[int] = Field(None, description="硬件版本号") target: Optional[int] = Field(None, ge=0, le=1, description="是否定向,1-是,0-否") beta: Optional[int] = Field(None, ge=0, le=1, description="是否灰度,1-是,0-否") pawVerCode: Optional[int] = Field(None, description="配对版本号") pawVerName: Optional[str] = Field(None, max_length=20, description="配对版本名称") pawUrl: Optional[str] = Field(None, max_length=255, description="配对版本 URL") pawMd5: Optional[str] = Field(None, min_length=32, max_length=32, description="配对版本 MD5") startTime: Optional[datetime] = Field(None, description="升级开始时间") endTime: Optional[datetime] = Field(None, description="升级结束时间") status: Optional[int] = Field(None, ge=0, le=1, description="是否可用") class OtaResponse(OtaBase): id: int class Config: from_attributes = True