From 497540511f1b2c67a80b39013e388c0f03139bbe Mon Sep 17 00:00:00 2001 From: Donkie Date: Mon, 3 Apr 2023 20:12:29 +0200 Subject: [PATCH] Fixed removing filament with spools --- spoolman/api/v1/filament.py | 22 ++++++++++++++++++---- spoolman/database/filament.py | 8 +++++++- spoolman/exceptions.py | 4 ++++ 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/spoolman/api/v1/filament.py b/spoolman/api/v1/filament.py index 08ee936..0c80a8e 100644 --- a/spoolman/api/v1/filament.py +++ b/spoolman/api/v1/filament.py @@ -4,6 +4,7 @@ from typing import Annotated, Optional, Union from fastapi import APIRouter, Depends from fastapi.exceptions import RequestValidationError +from fastapi.responses import JSONResponse from pydantic import BaseModel, Field from pydantic.error_wrappers import ErrorWrapper from sqlalchemy.ext.asyncio import AsyncSession @@ -11,6 +12,7 @@ from sqlalchemy.ext.asyncio import AsyncSession from spoolman.api.v1.models import Filament, Message from spoolman.database import filament from spoolman.database.database import get_db_session +from spoolman.exceptions import ItemDeleteError router = APIRouter( prefix="/filament", @@ -102,10 +104,22 @@ async def update( return Filament.from_db(db_item) -@router.delete("/{filament_id}") -async def delete( +@router.delete( + "/{filament_id}", + response_model=Message, + responses={ + 403: {"model": Message}, + }, +) +async def delete( # noqa: ANN201 db: Annotated[AsyncSession, Depends(get_db_session)], filament_id: int, -) -> Message: - await filament.delete(db, filament_id) +): + try: + await filament.delete(db, filament_id) + except ItemDeleteError as exc: + return JSONResponse( + status_code=403, + content={"message": str(exc)}, + ) return Message(message="Success!") diff --git a/spoolman/database/filament.py b/spoolman/database/filament.py index 3c30c2d..cc698ac 100644 --- a/spoolman/database/filament.py +++ b/spoolman/database/filament.py @@ -3,9 +3,10 @@ from typing import Optional from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy.exc import IntegrityError from spoolman.database import models, vendor -from spoolman.exceptions import ItemNotFoundError +from spoolman.exceptions import ItemDeleteError, ItemNotFoundError async def create( @@ -76,3 +77,8 @@ async def delete(db: AsyncSession, filament_id: int) -> None: """Delete a filament object.""" filament = await get_by_id(db, filament_id) await db.delete(filament) + try: + await db.flush() # Flush immediately so any errors are propagated in this request. + except IntegrityError as exc: + await db.rollback() + raise ItemDeleteError("Failed to delete filament.") from exc diff --git a/spoolman/exceptions.py b/spoolman/exceptions.py index 97baeda..9a1e642 100644 --- a/spoolman/exceptions.py +++ b/spoolman/exceptions.py @@ -5,5 +5,9 @@ class ItemNotFoundError(Exception): pass +class ItemDeleteError(Exception): + pass + + class ItemCreateError(Exception): pass