From e68f88da2ad59f408e95b06344f22e2e3b4328f9 Mon Sep 17 00:00:00 2001 From: Matt Gerega Date: Tue, 26 Mar 2024 20:35:50 -0400 Subject: [PATCH] Added empty spool weight as an option field for the vendor --- ...-5f069e51bd89_vendor_empty_spool_weight.py | 31 +++++++++++++++++++ spoolman/database/filament.py | 3 ++ spoolman/database/models.py | 5 +-- spoolman/database/spool.py | 3 ++ 4 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 migrations/versions/2024_03_26_1507-5f069e51bd89_vendor_empty_spool_weight.py diff --git a/migrations/versions/2024_03_26_1507-5f069e51bd89_vendor_empty_spool_weight.py b/migrations/versions/2024_03_26_1507-5f069e51bd89_vendor_empty_spool_weight.py new file mode 100644 index 0000000..7403eaf --- /dev/null +++ b/migrations/versions/2024_03_26_1507-5f069e51bd89_vendor_empty_spool_weight.py @@ -0,0 +1,31 @@ +"""vendor empty spool weight. + +Revision ID: 5f069e51bd89 +Revises: 304a32906234 +Create Date: 2024-03-26 15:07:18.366290 +""" +import sqlalchemy as sa +from alembic import op + +# revision identifiers, used by Alembic. +revision = "5f069e51bd89" +down_revision = "304a32906234" +branch_labels = None +depends_on = None + + +def upgrade() -> None: + """Perform the upgrade.""" + # ### commands auto generated by Alembic - please adjust! ### + op.add_column( + "vendor", + sa.Column("empty_spool_weight", sa.Float(), nullable=True, comment="The weight of an empty spool."), + ) + # ### end Alembic commands ### + + +def downgrade() -> None: + """Perform the downgrade.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column("vendor", "empty_spool_weight") + # ### end Alembic commands ### diff --git a/spoolman/database/filament.py b/spoolman/database/filament.py index a87f27a..a8f472a 100644 --- a/spoolman/database/filament.py +++ b/spoolman/database/filament.py @@ -48,6 +48,9 @@ async def create( vendor_item: Optional[models.Vendor] = None if vendor_id is not None: vendor_item = await vendor.get_by_id(db, vendor_id) + # default spool weight from vendor + if spool_weight is None and vendor_item.empty_spool_weight is not None: + spool_weight = vendor_item.empty_spool_weight filament = models.Filament( name=name, diff --git a/spoolman/database/models.py b/spoolman/database/models.py index b009bdf..1a2d5bd 100644 --- a/spoolman/database/models.py +++ b/spoolman/database/models.py @@ -18,6 +18,7 @@ class Vendor(Base): id: Mapped[int] = mapped_column(Integer, primary_key=True, index=True) registered: Mapped[datetime] = mapped_column() name: Mapped[str] = mapped_column(String(64)) + empty_spool_weight: Mapped[Optional[float]] = mapped_column(comment="The weight of an empty spool.") comment: Mapped[Optional[str]] = mapped_column(String(1024)) filaments: Mapped[list["Filament"]] = relationship(back_populates="vendor") extra: Mapped[list["VendorField"]] = relationship( @@ -64,8 +65,8 @@ class Spool(Base): price: Mapped[Optional[float]] = mapped_column() filament_id: Mapped[int] = mapped_column(ForeignKey("filament.id")) filament: Mapped["Filament"] = relationship(back_populates="spools") - initial_weight: Mapped[float] = mapped_column() - empty_weight: Mapped[float] = mapped_column() + initial_weight: Mapped[Optional[float]] = mapped_column() + empty_weight: Mapped[Optional[float]] = mapped_column() used_weight: Mapped[float] = mapped_column() location: Mapped[Optional[str]] = mapped_column(String(64)) lot_nr: Mapped[Optional[str]] = mapped_column(String(64)) diff --git a/spoolman/database/spool.py b/spoolman/database/spool.py index 7da98ec..42d2e5e 100644 --- a/spoolman/database/spool.py +++ b/spoolman/database/spool.py @@ -235,6 +235,7 @@ async def use_weight_safe(db: AsyncSession, spool_id: int, weight: float) -> Non db (AsyncSession): Database session spool_id (int): Spool ID weight (float): Filament weight to consume, in grams + """ await db.execute( sqlalchemy.update(models.Spool) @@ -261,6 +262,7 @@ async def use_weight(db: AsyncSession, spool_id: int, weight: float) -> models.S Returns: models.Spool: Updated spool object + """ await use_weight_safe(db, spool_id, weight) @@ -288,6 +290,7 @@ async def use_length(db: AsyncSession, spool_id: int, length: float) -> models.S Returns: models.Spool: Updated spool object + """ # Get filament diameter and density result = await db.execute(