@@ -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
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -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")
|
||||||
@@ -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,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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())
|
||||||
|
|||||||
Reference in New Issue
Block a user