Added endpoints for getting list of materials, etc

This commit is contained in:
Donkie
2023-08-26 11:08:57 +02:00
parent 9d51ee49ed
commit 557ea82171
4 changed files with 171 additions and 2 deletions

125
spoolman/api/v1/other.py Normal file
View File

@@ -0,0 +1,125 @@
"""Filament related endpoints."""
import logging
from typing import Annotated
from fastapi import APIRouter, Depends
from sqlalchemy.ext.asyncio import AsyncSession
from spoolman.database import filament, spool
from spoolman.database.database import get_db_session
logger = logging.getLogger(__name__)
router = APIRouter(
prefix="",
tags=["other"],
)
# ruff: noqa: D103, B008
@router.get(
"/material",
name="Find materials",
description="Get a list of all filament materials.",
response_model_exclude_none=True,
responses={
200: {
"description": "A list of all filament materials.",
"content": {
"application/json": {
"example": [
"PLA",
"ABS",
"PETG",
],
},
},
},
},
)
async def find_materials(
*,
db: Annotated[AsyncSession, Depends(get_db_session)],
) -> list[str]:
return await filament.find_materials(db=db)
@router.get(
"/article-number",
name="Find article numbers",
description="Get a list of all article numbers.",
response_model_exclude_none=True,
responses={
200: {
"description": "A list of all article numbers.",
"content": {
"application/json": {
"example": [
"123456",
"987654",
],
},
},
},
},
)
async def find_article_numbers(
*,
db: Annotated[AsyncSession, Depends(get_db_session)],
) -> list[str]:
return await filament.find_article_numbers(db=db)
@router.get(
"/lot-number",
name="Find lot numbers",
description="Get a list of all lot numbers.",
response_model_exclude_none=True,
responses={
200: {
"description": "A list of all lot numbers.",
"content": {
"application/json": {
"example": [
"123456",
"987654",
],
},
},
},
},
)
async def find_lot_numbers(
*,
db: Annotated[AsyncSession, Depends(get_db_session)],
) -> list[str]:
return await spool.find_lot_numbers(db=db)
@router.get(
"/locations",
name="Find locations",
description="Get a list of all spool locations.",
response_model_exclude_none=True,
responses={
200: {
"description": "A list of all spool locations.",
"content": {
"application/json": {
"example": [
"Printer 1",
"Printer 2",
"Storage Shelf A",
],
},
},
},
},
)
async def find_locations(
*,
db: Annotated[AsyncSession, Depends(get_db_session)],
) -> list[str]:
return await spool.find_locations(db=db)

View File

@@ -13,14 +13,13 @@ from spoolman import env
from spoolman.database.database import backup_global_db from spoolman.database.database import backup_global_db
from spoolman.exceptions import ItemNotFoundError from spoolman.exceptions import ItemNotFoundError
from . import filament, models, spool, vendor from . import filament, models, other, spool, vendor
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
app = FastAPI( app = FastAPI(
title="Spoolman REST API v1", title="Spoolman REST API v1",
version="1.0.0", version="1.0.0",
root_path_in_servers=False,
) )
@@ -76,3 +75,4 @@ async def backup(): # noqa: ANN201
app.include_router(filament.router) app.include_router(filament.router)
app.include_router(spool.router) app.include_router(spool.router)
app.include_router(vendor.router) app.include_router(vendor.router)
app.include_router(other.router)

View File

@@ -1,5 +1,6 @@
"""Helper functions for interacting with filament database objects.""" """Helper functions for interacting with filament database objects."""
import logging
from typing import Optional from typing import Optional
from sqlalchemy import select from sqlalchemy import select
@@ -143,3 +144,26 @@ async def delete(db: AsyncSession, filament_id: int) -> None:
except IntegrityError as exc: except IntegrityError as exc:
await db.rollback() await db.rollback()
raise ItemDeleteError("Failed to delete filament.") from exc raise ItemDeleteError("Failed to delete filament.") from exc
logger = logging.getLogger(__name__)
async def find_materials(
*,
db: AsyncSession,
) -> list[str]:
"""Find a list of filament materials by searching for distinct values in the filament table."""
stmt = select(models.Filament.material).distinct()
rows = await db.execute(stmt)
return [row[0] for row in rows.all() if row[0] is not None]
async def find_article_numbers(
*,
db: AsyncSession,
) -> list[str]:
"""Find a list of filament article numbers by searching for distinct values in the filament table."""
stmt = select(models.Filament.article_number).distinct()
rows = await db.execute(stmt)
return [row[0] for row in rows.all() if row[0] is not None]

View File

@@ -257,3 +257,23 @@ async def use_length(db: AsyncSession, spool_id: int, length: float) -> models.S
await db.commit() await db.commit()
return spool return spool
async def find_locations(
*,
db: AsyncSession,
) -> list[str]:
"""Find a list of spool locations by searching for distinct values in the spool table."""
stmt = sqlalchemy.select(models.Spool.location).distinct()
rows = await db.execute(stmt)
return [row[0] for row in rows.all() if row[0] is not None]
async def find_lot_numbers(
*,
db: AsyncSession,
) -> list[str]:
"""Find a list of spool lot numbers by searching for distinct values in the spool table."""
stmt = sqlalchemy.select(models.Spool.lot_nr).distinct()
rows = await db.execute(stmt)
return [row[0] for row in rows.all() if row[0] is not None]