from datetime import datetime from typing import List from fastapi import APIRouter, Depends, HTTPException, status from sqlmodel import Session, select from app.database import get_session from app.models.planting import Planting, PlantingEvent router = APIRouter(tags=["plantations"]) @router.get("/plantings", response_model=List[Planting]) def list_plantings(session: Session = Depends(get_session)): return session.exec(select(Planting)).all() @router.post("/plantings", response_model=Planting, status_code=status.HTTP_201_CREATED) def create_planting(p: Planting, session: Session = Depends(get_session)): session.add(p) session.commit() session.refresh(p) return p @router.get("/plantings/{id}", response_model=Planting) def get_planting(id: int, session: Session = Depends(get_session)): p = session.get(Planting, id) if not p: raise HTTPException(status_code=404, detail="Plantation introuvable") return p @router.put("/plantings/{id}", response_model=Planting) def update_planting(id: int, data: Planting, session: Session = Depends(get_session)): p = session.get(Planting, id) if not p: raise HTTPException(status_code=404, detail="Plantation introuvable") for k, v in data.model_dump(exclude_unset=True, exclude={"id", "created_at"}).items(): setattr(p, k, v) p.updated_at = datetime.utcnow() session.add(p) session.commit() session.refresh(p) return p @router.delete("/plantings/{id}", status_code=status.HTTP_204_NO_CONTENT) def delete_planting(id: int, session: Session = Depends(get_session)): p = session.get(Planting, id) if not p: raise HTTPException(status_code=404, detail="Plantation introuvable") session.delete(p) session.commit() @router.get("/plantings/{id}/events", response_model=List[PlantingEvent]) def list_events(id: int, session: Session = Depends(get_session)): return session.exec(select(PlantingEvent).where(PlantingEvent.planting_id == id)).all() @router.post("/plantings/{id}/events", response_model=PlantingEvent, status_code=status.HTTP_201_CREATED) def create_event(id: int, e: PlantingEvent, session: Session = Depends(get_session)): e.planting_id = id session.add(e) session.commit() session.refresh(e) return e