Fixed removing filament with spools

This commit is contained in:
Donkie
2023-04-03 20:12:29 +02:00
parent ada139844a
commit 497540511f
3 changed files with 29 additions and 5 deletions

View File

@@ -4,6 +4,7 @@ from typing import Annotated, Optional, Union
from fastapi import APIRouter, Depends from fastapi import APIRouter, Depends
from fastapi.exceptions import RequestValidationError from fastapi.exceptions import RequestValidationError
from fastapi.responses import JSONResponse
from pydantic import BaseModel, Field from pydantic import BaseModel, Field
from pydantic.error_wrappers import ErrorWrapper from pydantic.error_wrappers import ErrorWrapper
from sqlalchemy.ext.asyncio import AsyncSession 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.api.v1.models import Filament, Message
from spoolman.database import filament from spoolman.database import filament
from spoolman.database.database import get_db_session from spoolman.database.database import get_db_session
from spoolman.exceptions import ItemDeleteError
router = APIRouter( router = APIRouter(
prefix="/filament", prefix="/filament",
@@ -102,10 +104,22 @@ async def update(
return Filament.from_db(db_item) return Filament.from_db(db_item)
@router.delete("/{filament_id}") @router.delete(
async def delete( "/{filament_id}",
response_model=Message,
responses={
403: {"model": Message},
},
)
async def delete( # noqa: ANN201
db: Annotated[AsyncSession, Depends(get_db_session)], db: Annotated[AsyncSession, Depends(get_db_session)],
filament_id: int, 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!") return Message(message="Success!")

View File

@@ -3,9 +3,10 @@
from typing import Optional from typing import Optional
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.exc import IntegrityError
from spoolman.database import models, vendor from spoolman.database import models, vendor
from spoolman.exceptions import ItemNotFoundError from spoolman.exceptions import ItemDeleteError, ItemNotFoundError
async def create( async def create(
@@ -76,3 +77,8 @@ async def delete(db: AsyncSession, filament_id: int) -> None:
"""Delete a filament object.""" """Delete a filament object."""
filament = await get_by_id(db, filament_id) filament = await get_by_id(db, filament_id)
await db.delete(filament) 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

View File

@@ -5,5 +5,9 @@ class ItemNotFoundError(Exception):
pass pass
class ItemDeleteError(Exception):
pass
class ItemCreateError(Exception): class ItemCreateError(Exception):
pass pass