Added archived field to spools

Resolves #13
This commit is contained in:
Donkie
2023-07-14 14:19:57 +02:00
parent 061061cd31
commit f89cf8ecd4
6 changed files with 42 additions and 1 deletions

View File

@@ -2,5 +2,6 @@
Creating a new version: Creating a new version:
```bash ```bash
alembic revision -m "some title" --autogenerate python -m spoolman.main
pdm run alembic revision -m "some title" --autogenerate
``` ```

View File

@@ -0,0 +1,24 @@
"""add spool archived field.
Revision ID: 92186a5f7b0f
Revises: db385b808a20
Create Date: 2023-07-14 12:17:13.162618
"""
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision = "92186a5f7b0f"
down_revision = "db385b808a20"
branch_labels = None
depends_on = None
def upgrade() -> None:
"""Perform the upgrade."""
op.add_column("spool", sa.Column("archived", sa.Boolean(), nullable=True))
def downgrade() -> None:
"""Perform the downgrade."""
op.drop_column("spool", "archived")

View File

@@ -150,6 +150,7 @@ class Spool(BaseModel):
description="Free text comment about this specific spool.", description="Free text comment about this specific spool.",
example="", example="",
) )
archived: bool = Field(description="Whether this spool is archived and should not be used anymore.")
@staticmethod @staticmethod
def from_db(item: models.Spool) -> "Spool": def from_db(item: models.Spool) -> "Spool":
@@ -185,6 +186,7 @@ class Spool(BaseModel):
location=item.location, location=item.location,
lot_nr=item.lot_nr, lot_nr=item.lot_nr,
comment=item.comment, comment=item.comment,
archived=item.archived if item.archived is not None else False,
) )

View File

@@ -49,6 +49,7 @@ class SpoolParameters(BaseModel):
description="Free text comment about this specific spool.", description="Free text comment about this specific spool.",
example="", example="",
) )
archived: bool = Field(default=False, description="Whether this spool is archived and should not be used anymore.")
class SpoolUpdateParameters(SpoolParameters): class SpoolUpdateParameters(SpoolParameters):
@@ -104,6 +105,11 @@ async def find(
title="Lot/Batch Number", title="Lot/Batch Number",
description="Partial case-insensitive search term for the spool lot number.", description="Partial case-insensitive search term for the spool lot number.",
), ),
allow_archived: bool = Query(
default=False,
title="Allow Archived",
description="Whether to include archived spools in the search results.",
),
) -> list[Spool]: ) -> list[Spool]:
db_items = await spool.find( db_items = await spool.find(
db=db, db=db,
@@ -114,6 +120,7 @@ async def find(
vendor_id=vendor_id, vendor_id=vendor_id,
location=location, location=location,
lot_nr=lot_nr, lot_nr=lot_nr,
allow_archived=allow_archived,
) )
return [Spool.from_db(db_item) for db_item in db_items] return [Spool.from_db(db_item) for db_item in db_items]
@@ -168,6 +175,7 @@ async def create( # noqa: ANN201
location=body.location, location=body.location,
lot_nr=body.lot_nr, lot_nr=body.lot_nr,
comment=body.comment, comment=body.comment,
archived=body.archived,
) )
return Spool.from_db(db_item) return Spool.from_db(db_item)
except ItemCreateError: except ItemCreateError:

View File

@@ -57,3 +57,4 @@ class Spool(Base):
location: Mapped[Optional[str]] = mapped_column(String(64)) location: Mapped[Optional[str]] = mapped_column(String(64))
lot_nr: Mapped[Optional[str]] = mapped_column(String(64)) lot_nr: Mapped[Optional[str]] = mapped_column(String(64))
comment: Mapped[Optional[str]] = mapped_column(String(1024)) comment: Mapped[Optional[str]] = mapped_column(String(1024))
archived: Mapped[Optional[bool]] = mapped_column()

View File

@@ -30,6 +30,7 @@ async def create(
location: Optional[str] = None, location: Optional[str] = None,
lot_nr: Optional[str] = None, lot_nr: Optional[str] = None,
comment: Optional[str] = None, comment: Optional[str] = None,
archived: bool = False,
) -> models.Spool: ) -> models.Spool:
"""Add a new spool to the database. Leave weight empty to assume full spool.""" """Add a new spool to the database. Leave weight empty to assume full spool."""
filament_item = await filament.get_by_id(db, filament_id) filament_item = await filament.get_by_id(db, filament_id)
@@ -55,6 +56,7 @@ async def create(
location=location, location=location,
lot_nr=lot_nr, lot_nr=lot_nr,
comment=comment, comment=comment,
archived=archived,
) )
db.add(db_item) db.add(db_item)
await db.flush() await db.flush()
@@ -83,6 +85,7 @@ async def find(
vendor_id: Optional[int] = None, vendor_id: Optional[int] = None,
location: Optional[str] = None, location: Optional[str] = None,
lot_nr: Optional[str] = None, lot_nr: Optional[str] = None,
allow_archived: bool = False,
) -> list[models.Spool]: ) -> list[models.Spool]:
"""Find a list of spool objects by search criteria.""" """Find a list of spool objects by search criteria."""
stmt = ( stmt = (
@@ -105,6 +108,8 @@ async def find(
stmt = stmt.where(models.Spool.location.ilike(f"%{location}%")) stmt = stmt.where(models.Spool.location.ilike(f"%{location}%"))
if lot_nr is not None: if lot_nr is not None:
stmt = stmt.where(models.Spool.lot_nr.ilike(f"%{lot_nr}%")) stmt = stmt.where(models.Spool.lot_nr.ilike(f"%{lot_nr}%"))
if not allow_archived:
stmt = stmt.where(models.Spool.archived != True) # noqa: E712
rows = await db.execute(stmt) rows = await db.execute(stmt)
return list(rows.scalars().all()) return list(rows.scalars().all())