from typing import List, Optional from fastapi import APIRouter, Depends, status from pydantic import BaseModel, ConfigDict, PositiveFloat, field_validator from sqlalchemy.orm import Session from models.production_output import ProductionOutput from routes.dependencies import get_db router = APIRouter(prefix="/api/production", tags=["Production"]) class ProductionOutputBase(BaseModel): scenario_id: int amount: PositiveFloat description: Optional[str] = None unit_name: Optional[str] = None unit_symbol: Optional[str] = None @field_validator("unit_name", "unit_symbol") @classmethod def _normalize_text(cls, value: Optional[str]) -> Optional[str]: if value is None: return None stripped = value.strip() return stripped or None class ProductionOutputCreate(ProductionOutputBase): pass class ProductionOutputRead(ProductionOutputBase): id: int model_config = ConfigDict(from_attributes=True) @router.post( "/", response_model=ProductionOutputRead, status_code=status.HTTP_201_CREATED, ) def create_production( item: ProductionOutputCreate, db: Session = Depends(get_db) ): db_item = ProductionOutput(**item.model_dump()) db.add(db_item) db.commit() db.refresh(db_item) return db_item @router.get("/", response_model=List[ProductionOutputRead]) def list_production(db: Session = Depends(get_db)): return db.query(ProductionOutput).all()