from datetime import datetime from pydantic import BaseModel, ConfigDict, field_validator from app.schemas.manufacturer import ManufacturerRead from app.schemas.part_colour import PartColourRead from app.schemas.part_type import PartTypeRead from app.schemas.scope_model import ScopeModelRead from app.schemas.sub_part_type import SubPartTypeRead class AugmentedPartNoteCreate(BaseModel): body: str @field_validator("body") @classmethod def validate_body(cls, v: str) -> str: if not v.strip(): raise ValueError("body must not be blank") return v.strip() class AugmentedPartNoteRead(BaseModel): model_config = ConfigDict(from_attributes=True) id: int augmented_part_id: int user_id: int | None username: str body: str created_at: datetime class AugmentedPartBase(BaseModel): sku: str | None = None description: str colour_id: int manufacturer_id: int scope_model_id: int | None = None part_type_id: int sub_part_type_id: int | None = None class AugmentedPartCreate(AugmentedPartBase): pass class AugmentedPartUpdate(BaseModel): sku: str | None = None description: str | None = None colour_id: int | None = None manufacturer_id: int | None = None scope_model_id: int | None = None part_type_id: int | None = None sub_part_type_id: int | None = None archived: bool | None = None class AugmentedPartSyncResult(BaseModel): created: int updated: int archived: int skipped: int class AugmentedPartRead(AugmentedPartBase): model_config = ConfigDict(from_attributes=True) id: int archived: bool uac_diameter_range_mm: str | None colour: PartColourRead manufacturer: ManufacturerRead scope_model: ScopeModelRead | None part_type: PartTypeRead sub_part_type: SubPartTypeRead | None notes: list[AugmentedPartNoteRead] = []