38 lines
1.3 KiB
Python
38 lines
1.3 KiB
Python
from pydantic import BaseModel, Field, validator
|
|
from typing import Optional, Literal, Dict, Any
|
|
|
|
class QuoteRequest(BaseModel):
|
|
# File STL (base64 or path)
|
|
file_path: Optional[str] = None
|
|
file_base64: Optional[str] = None
|
|
|
|
# Parametri slicing
|
|
machine: str = Field(default="bambu_a1", description="Machine type")
|
|
filament: str = Field(default="pla_basic", description="Filament type")
|
|
quality: Literal["draft", "standard", "fine"] = Field(default="standard")
|
|
|
|
# Parametri opzionali
|
|
layer_height: Optional[float] = Field(None, ge=0.08, le=0.32)
|
|
infill_density: Optional[int] = Field(None, ge=0, le=100)
|
|
support_enabled: Optional[bool] = None
|
|
print_speed: Optional[int] = Field(None, ge=20, le=300)
|
|
|
|
# Pricing overrides
|
|
filament_cost_override: Optional[float] = None
|
|
|
|
@validator('machine')
|
|
def validate_machine(cls, v):
|
|
# This list should ideally be dynamic, but for validation purposes we start with known ones.
|
|
# Logic in ProfileManager can be looser or strict.
|
|
# For now, we allow the string through and let ProfileManager validate availability.
|
|
return v
|
|
|
|
@validator('filament')
|
|
def validate_filament(cls, v):
|
|
return v
|
|
|
|
class QuoteResponse(BaseModel):
|
|
success: bool
|
|
data: Optional[Dict[str, Any]] = None
|
|
error: Optional[str] = None
|