Feature: Recording the nutritional and ice cream related values in the database

This commit is contained in:
2023-12-25 10:57:44 +05:30
parent efaaf9d431
commit cd6a5e129f
14 changed files with 391 additions and 8 deletions

View File

@ -0,0 +1,77 @@
"""nut
Revision ID: 2438cd581f00
Revises: ba0fff092981
Create Date: 2023-10-16 16:26:45.922654
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = "2438cd581f00"
down_revision = "ba0fff092981"
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.add_column(
"products", sa.Column("protein", sa.Numeric(precision=15, scale=5), server_default="0", nullable=False)
)
op.add_column(
"products", sa.Column("carbohydrate", sa.Numeric(precision=15, scale=5), server_default="0", nullable=False)
)
op.add_column(
"products", sa.Column("total_sugar", sa.Numeric(precision=15, scale=5), server_default="0", nullable=False)
)
op.add_column(
"products", sa.Column("added_sugar", sa.Numeric(precision=15, scale=5), server_default="0", nullable=False)
)
op.add_column(
"products", sa.Column("total_fat", sa.Numeric(precision=15, scale=5), server_default="0", nullable=False)
)
op.add_column(
"products", sa.Column("saturated_fat", sa.Numeric(precision=15, scale=5), server_default="0", nullable=False)
)
op.add_column(
"products", sa.Column("trans_fat", sa.Numeric(precision=15, scale=5), server_default="0", nullable=False)
)
op.add_column(
"products", sa.Column("cholestrol", sa.Numeric(precision=15, scale=5), server_default="0", nullable=False)
)
op.add_column(
"products", sa.Column("sodium", sa.Numeric(precision=15, scale=5), server_default="0", nullable=False)
)
op.add_column("products", sa.Column("msnf", sa.Numeric(precision=15, scale=5), server_default="0", nullable=False))
op.add_column(
"products", sa.Column("other_solids", sa.Numeric(precision=15, scale=5), server_default="0", nullable=False)
)
op.add_column(
"products", sa.Column("total_solids", sa.Numeric(precision=15, scale=5), server_default="0", nullable=False)
)
op.add_column("products", sa.Column("water", sa.Numeric(precision=15, scale=5), server_default="0", nullable=False))
op.add_column("product_groups", sa.Column("nutritional", sa.Boolean(), server_default=False, nullable=False))
op.add_column("product_groups", sa.Column("ice_cream", sa.Boolean(), server_default=False, nullable=False))
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_column("products", "water")
op.drop_column("products", "total_solids")
op.drop_column("products", "other_solids")
op.drop_column("products", "msnf")
op.drop_column("products", "sodium")
op.drop_column("products", "cholestrol")
op.drop_column("products", "trans_fat")
op.drop_column("products", "saturated_fat")
op.drop_column("products", "total_fat")
op.drop_column("products", "added_sugar")
op.drop_column("products", "total_sugar")
op.drop_column("products", "carbohydrate")
op.drop_column("products", "protein")
# ### end Alembic commands ###

View File

@ -1,8 +1,9 @@
import uuid
from decimal import Decimal
from typing import TYPE_CHECKING
from sqlalchemy import Boolean, ForeignKey, Integer, Text, Unicode, Uuid
from sqlalchemy import Boolean, ForeignKey, Integer, Numeric, Text, Unicode, Uuid
from sqlalchemy.orm import Mapped, mapped_column, relationship
from ..db.base_class import reg
@ -38,6 +39,20 @@ class Product:
product_group: Mapped["ProductGroup"] = relationship("ProductGroup", back_populates="products")
account: Mapped["Account"] = relationship("Account", back_populates="products")
protein: Mapped[Decimal] = mapped_column(Numeric(precision=15, scale=5), nullable=False)
carbohydrate: Mapped[Decimal] = mapped_column(Numeric(precision=15, scale=5), nullable=False)
total_sugar: Mapped[Decimal] = mapped_column(Numeric(precision=15, scale=5), nullable=False)
added_sugar: Mapped[Decimal] = mapped_column(Numeric(precision=15, scale=5), nullable=False)
total_fat: Mapped[Decimal] = mapped_column(Numeric(precision=15, scale=5), nullable=False)
saturated_fat: Mapped[Decimal] = mapped_column(Numeric(precision=15, scale=5), nullable=False)
trans_fat: Mapped[Decimal] = mapped_column(Numeric(precision=15, scale=5), nullable=False)
cholestrol: Mapped[Decimal] = mapped_column(Numeric(precision=15, scale=5), nullable=False)
sodium: Mapped[Decimal] = mapped_column(Numeric(precision=15, scale=5), nullable=False)
msnf: Mapped[Decimal] = mapped_column(Numeric(precision=15, scale=5), nullable=False)
other_solids: Mapped[Decimal] = mapped_column(Numeric(precision=15, scale=5), nullable=False)
total_solids: Mapped[Decimal] = mapped_column(Numeric(precision=15, scale=5), nullable=False)
water: Mapped[Decimal] = mapped_column(Numeric(precision=15, scale=5), nullable=False)
def __init__(
self,
name: str,
@ -47,6 +62,19 @@ class Product:
is_active: bool,
is_purchased: bool,
is_sold: bool,
protein: Decimal = 0,
carbohydrate: Decimal = 0,
total_sugar: Decimal = 0,
added_sugar: Decimal = 0,
total_fat: Decimal = 0,
saturated_fat: Decimal = 0,
trans_fat: Decimal = 0,
cholestrol: Decimal = 0,
sodium: Decimal = 0,
msnf: Decimal = 0,
other_solids: Decimal = 0,
total_solids: Decimal = 0,
water: Decimal = 0,
code: int | None = None,
id_: uuid.UUID | None = None,
is_fixture: bool | None = False,
@ -60,6 +88,21 @@ class Product:
self.is_active = is_active
self.is_purchased = is_purchased
self.is_sold = is_sold
self.protein = protein
self.carbohydrate = carbohydrate
self.total_sugar = total_sugar
self.added_sugar = added_sugar
self.total_fat = total_fat
self.saturated_fat = saturated_fat
self.trans_fat = trans_fat
self.cholestrol = cholestrol
self.sodium = sodium
self.msnf = msnf
self.other_solids = other_solids
self.total_solids = total_solids
self.water = water
if id_ is not None:
self.id = id_
if is_fixture is not None:

View File

@ -18,12 +18,24 @@ class ProductGroup:
id: Mapped[uuid.UUID] = mapped_column(Uuid, primary_key=True, insert_default=uuid.uuid4)
name: Mapped[str] = mapped_column(Unicode, unique=True, nullable=False)
nutritional: Mapped[bool] = mapped_column(Boolean, nullable=False)
ice_cream: Mapped[bool] = mapped_column(Boolean, nullable=False)
is_fixture: Mapped[bool] = mapped_column(Boolean, nullable=False)
is_fixture: Mapped[bool] = mapped_column(Boolean, nullable=False)
products: Mapped[list["Product"]] = relationship("Product", back_populates="product_group")
def __init__(self, name: str, id_: uuid.UUID | None = None, is_fixture: bool | None = False) -> None:
def __init__(
self,
name: str,
nutritional: bool = False,
ice_cream: bool = False,
id_: uuid.UUID | None = None,
is_fixture: bool | None = False,
) -> None:
self.name = name
self.nutritional = nutritional
self.ice_cream = ice_cream
if id_ is not None:
self.id = id_
if is_fixture is not None:

View File

@ -40,6 +40,19 @@ def save(
is_active=data.is_active,
is_purchased=data.is_purchased,
is_sold=data.is_sold,
protein=data.protein,
carbohydrate=data.carbohydrate,
total_sugar=data.total_sugar,
added_sugar=data.added_sugar,
total_fat=data.total_fat,
saturated_fat=data.saturated_fat,
trans_fat=data.trans_fat,
cholestrol=data.cholestrol,
sodium=data.sodium,
msnf=data.msnf,
other_solids=data.other_solids,
total_solids=data.total_solids,
water=data.water,
)
item.code = db.execute(select(func.coalesce(func.max(Product.code), 0) + 1)).scalar_one()
db.add(item)
@ -89,6 +102,21 @@ def update_route(
item.is_active = data.is_active
item.is_purchased = data.is_purchased
item.is_sold = data.is_sold
item.protein = data.protein
item.carbohydrate = data.carbohydrate
item.total_sugar = data.total_sugar
item.added_sugar = data.added_sugar
item.total_fat = data.total_fat
item.saturated_fat = data.saturated_fat
item.trans_fat = data.trans_fat
item.cholestrol = data.cholestrol
item.sodium = data.sodium
item.msnf = data.msnf
item.other_solids = data.other_solids
item.total_solids = data.total_solids
item.water = data.water
if not len(data.skus):
raise HTTPException(
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
@ -294,6 +322,19 @@ def product_info(product: Product) -> schemas.Product:
is_purchased=product.is_purchased,
is_sold=product.is_sold,
product_group=schemas.ProductGroupLink(id_=product.product_group.id, name=product.product_group.name),
protein=product.protein,
carbohydrate=product.carbohydrate,
total_sugar=product.total_sugar,
added_sugar=product.added_sugar,
total_fat=product.total_fat,
saturated_fat=product.saturated_fat,
trans_fat=product.trans_fat,
cholestrol=product.cholestrol,
sodium=product.sodium,
msnf=product.msnf,
other_solids=product.other_solids,
total_solids=product.total_solids,
water=product.water,
)
@ -306,6 +347,19 @@ def product_blank() -> schemas.ProductBlank:
is_purchased=True,
is_sold=False,
is_fixture=False,
protein=0,
carbohydrate=0,
total_sugar=0,
added_sugar=0,
total_fat=0,
saturated_fat=0,
trans_fat=0,
cholestrol=0,
sodium=0,
msnf=0,
other_solids=0,
total_solids=0,
water=0,
)

View File

@ -22,7 +22,7 @@ def save(
) -> schemas.ProductGroup:
try:
with SessionFuture() as db:
item = ProductGroup(name=data.name)
item = ProductGroup(name=data.name, nutritional=data.nutritional, ice_cream=data.ice_cream)
db.add(item)
db.commit()
return product_group_info(item)
@ -48,6 +48,8 @@ def update_route(
detail=f"{item.name} is a fixture and cannot be edited or deleted.",
)
item.name = data.name
item.nutritional = data.nutritional
item.ice_cream = data.ice_cream
db.commit()
return product_group_info(item)
except SQLAlchemyError as e:
@ -112,6 +114,8 @@ def product_group_info(item: ProductGroup) -> schemas.ProductGroup:
return schemas.ProductGroup(
id_=item.id,
name=item.name,
nutritional=item.nutritional,
ice_cream=item.ice_cream,
is_fixture=item.is_fixture,
)

View File

@ -1,5 +1,7 @@
import uuid
from decimal import Decimal
from pydantic import BaseModel, ConfigDict, Field
from . import to_camel
@ -21,6 +23,22 @@ class ProductIn(BaseModel):
is_active: bool
is_purchased: bool
is_sold: bool
protein: Decimal
carbohydrate: Decimal
total_sugar: Decimal
added_sugar: Decimal
total_fat: Decimal
saturated_fat: Decimal
trans_fat: Decimal
cholestrol: Decimal
sodium: Decimal
msnf: Decimal
other_solids: Decimal
total_solids: Decimal
water: Decimal
model_config = ConfigDict(str_strip_whitespace=True, alias_generator=to_camel, populate_by_name=True)

View File

@ -7,6 +7,9 @@ from . import to_camel
class ProductGroupIn(BaseModel):
name: str = Field(..., min_length=1)
nutritional: bool
ice_cream: bool
model_config = ConfigDict(str_strip_whitespace=True, alias_generator=to_camel, populate_by_name=True)
class ProductGroup(ProductGroupIn):