brewman/brewman/brewman/models/recipe_item.py

52 lines
1.8 KiB
Python

import uuid
from decimal import Decimal
from typing import TYPE_CHECKING, Optional
from sqlalchemy import Column, ForeignKey, Numeric, UniqueConstraint
from sqlalchemy.dialects.postgresql import UUID
from sqlalchemy.orm import Mapped, relationship
from .meta import Base
if TYPE_CHECKING:
# if the target of the relationship is in another module
# that cannot normally be imported at runtime
from .product import Product
from .recipe import Recipe
class RecipeItem(Base):
__tablename__ = "recipe_items"
__table_args__ = (UniqueConstraint("recipe_id", "product_id"),)
id: uuid.UUID = Column("recipe_item_id", UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
recipe_id: uuid.UUID = Column("recipe_id", UUID(as_uuid=True), ForeignKey("recipes.id"), nullable=False)
product_id: uuid.UUID = Column("product_id", UUID(as_uuid=True), ForeignKey("products.id"), nullable=False)
quantity: Decimal = Column("quantity", Numeric(precision=15, scale=2), nullable=False)
price: Decimal = Column("price", Numeric(precision=15, scale=5), nullable=False)
recipe: Mapped["Recipe"] = relationship("Recipe", back_populates="items")
product: Mapped["Product"] = relationship("Product")
def __init__(
self,
product_id: uuid.UUID,
quantity: Decimal,
price: Decimal,
recipe: Optional["Recipe"] = None,
recipe_id: Optional[uuid.UUID] = None,
id_: Optional[uuid.UUID] = None,
) -> None:
if recipe_id is not None:
self.recipe_id = recipe_id
self.product_id = product_id
self.quantity = quantity
self.price = price
if recipe is not None:
self.recipe_id = recipe.id
self.recipe = recipe
if id_ is not None:
self.id = id_