f5ca91ee02
- Layout: mobile hamburger menu + overlay backdrop + close button; content area always full-width - Media browser: filter chips (default still+turntable); advanced toggle for GLB/STL; thumbnail_url previews for non-image types; video hover-play for turntable - Backend: asset_types multi-filter, thumbnail_url in MediaAssetOut, download proxy endpoint for MinIO/local files - Admin: "Import Existing Media" button → POST /api/admin/import-media-assets - Billing: fix invoice create 500 (MissingGreenlet — use selectinload after commit); PDF download uses axios blob instead of bare <a href> (auth header missing); fix storage.upload() accepting str|Path - SSE task logs: task_logs.py core + router, LiveRenderLog component - CadPreview: fix infinite loop when no gltf_geometry assets; loading screen before ThreeDViewer render - render-worker: add trimesh layer to Dockerfile Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
28 lines
731 B
Python
28 lines
731 B
Python
import uuid
|
|
from datetime import datetime
|
|
from pydantic import BaseModel
|
|
from app.domains.media.models import MediaAssetType
|
|
|
|
|
|
class MediaAssetOut(BaseModel):
|
|
id: uuid.UUID
|
|
tenant_id: uuid.UUID | None
|
|
product_id: uuid.UUID | None
|
|
cad_file_id: uuid.UUID | None
|
|
order_line_id: uuid.UUID | None
|
|
workflow_run_id: uuid.UUID | None
|
|
asset_type: MediaAssetType
|
|
storage_key: str
|
|
file_size_bytes: int | None
|
|
mime_type: str | None
|
|
width: int | None
|
|
height: int | None
|
|
duration_s: float | None
|
|
render_config: dict | None
|
|
is_archived: bool
|
|
created_at: datetime
|
|
download_url: str | None = None
|
|
thumbnail_url: str | None = None
|
|
|
|
model_config = {"from_attributes": True}
|