import uuid from datetime import datetime from typing import Literal from pydantic import BaseModel from app.domains.rendering.schemas import RenderPositionOut class ProductCreate(BaseModel): pim_id: str name: str | None = None category_key: str | None = None ebene1: str | None = None ebene2: str | None = None baureihe: str | None = None produkt_baureihe: str | None = None lagertyp: str | None = None name_cad_modell: str | None = None gewuenschte_bildnummer: str | None = None medias_rendering: bool | None = None components: list[dict] = [] cad_part_materials: list[dict] = [] notes: str | None = None is_active: bool = True source_excel: str | None = None class ProductPatch(BaseModel): name: str | None = None category_key: str | None = None ebene1: str | None = None ebene2: str | None = None baureihe: str | None = None produkt_baureihe: str | None = None lagertyp: str | None = None name_cad_modell: str | None = None gewuenschte_bildnummer: str | None = None medias_rendering: bool | None = None components: list[dict] | None = None cad_part_materials: list[dict] | None = None notes: str | None = None is_active: bool | None = None class ProductOut(BaseModel): id: uuid.UUID pim_id: str name: str | None category_key: str | None ebene1: str | None ebene2: str | None baureihe: str | None produkt_baureihe: str | None lagertyp: str | None name_cad_modell: str | None gewuenschte_bildnummer: str | None medias_rendering: bool | None components: list[dict] cad_part_materials: list[dict] cad_file_id: uuid.UUID | None thumbnail_url: str | None = None render_image_url: str | None = None processing_status: str | None = None cad_parsed_objects: list[str] | None = None cad_mesh_attributes: dict | None = None arbeitspaket: str | None = None cad_render_log: dict | None = None notes: str | None is_active: bool source_excel: str | None render_positions: list[RenderPositionOut] = [] created_at: datetime updated_at: datetime model_config = {"from_attributes": True} class PartEntry(BaseModel): part_key: str source_name: str prim_path: str | None = None effective_material: str | None assignment_provenance: Literal["manual", "auto", "source", "default"] is_unassigned: bool class SceneManifest(BaseModel): cad_file_id: str parts: list[PartEntry] unmatched_source_rows: list[str] unassigned_parts: list[str]