"""证书 Schema""" from pydantic import BaseModel, Field, field_validator from datetime import date, datetime from typing import Optional, List # ============ 证书分类 Schema ============ class CertificateCategoryBase(BaseModel): name: str = Field(..., max_length=50) icon: str = Field(default="medal", max_length=50) color: str = Field(default="#FFB7C5", max_length=20) sort_order: int = Field(default=0) class CertificateCategoryCreate(CertificateCategoryBase): pass class CertificateCategoryUpdate(BaseModel): name: Optional[str] = Field(None, max_length=50) icon: Optional[str] = Field(None, max_length=50) color: Optional[str] = Field(None, max_length=20) sort_order: Optional[int] = None class CertificateCategoryResponse(CertificateCategoryBase): id: int uuid: Optional[str] = None class Config: from_attributes = True # ============ 证书 Schema ============ class CertificateBase(BaseModel): title: str = Field(..., max_length=200) category_id: Optional[int] = None image: Optional[str] = None issuer: Optional[str] = Field(None, max_length=200) issue_date: Optional[date] = None expiry_date: Optional[date] = None description: Optional[str] = None sort_order: int = Field(default=0) class CertificateCreate(CertificateBase): pass class CertificateUpdate(BaseModel): title: Optional[str] = Field(None, max_length=200) category_id: Optional[int] = None image: Optional[str] = None issuer: Optional[str] = Field(None, max_length=200) issue_date: Optional[date] = None expiry_date: Optional[date] = None description: Optional[str] = None sort_order: Optional[int] = None @property def clearable_fields(self) -> set: return {"description", "category_id", "image", "issuer", "issue_date", "expiry_date"} class CertificateListResponse(CertificateBase): id: int uuid: Optional[str] = None created_at: datetime updated_at: datetime category: Optional[CertificateCategoryResponse] = None class Config: from_attributes = True class CertificateDetailResponse(CertificateListResponse): pass