diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..dd3bfac --- /dev/null +++ b/.dockerignore @@ -0,0 +1 @@ +!negotiator/ diff --git a/fooder/controller/product.py b/fooder/controller/product.py index fc9df83..944df1b 100644 --- a/fooder/controller/product.py +++ b/fooder/controller/product.py @@ -17,6 +17,7 @@ class CreateProduct(AuthorizedController): content.carb, content.protein, content.fat, + content.fiber, ) return Product.from_orm(product) except AssertionError as e: diff --git a/fooder/domain/diary.py b/fooder/domain/diary.py index 55fce62..81094ca 100644 --- a/fooder/domain/diary.py +++ b/fooder/domain/diary.py @@ -52,6 +52,14 @@ class Diary(Base, CommonMixin): """ return sum(meal.fat for meal in self.meals) + @property + def fiber(self) -> float: + """fiber. + + :rtype: float + """ + return sum(meal.fat for meal in self.meals) + @classmethod def query(cls, user_id: int) -> Select: """get_all.""" diff --git a/fooder/domain/entry.py b/fooder/domain/entry.py index 983fe8e..2a91dc2 100644 --- a/fooder/domain/entry.py +++ b/fooder/domain/entry.py @@ -61,6 +61,14 @@ class Entry(Base, CommonMixin): """ return self.amount * self.product.fat + @property + def fiber(self) -> float: + """fiber. + + :rtype: float + """ + return self.amount * self.product.fiber + @classmethod async def create( cls, session: AsyncSession, meal_id: int, product_id: int, grams: float diff --git a/fooder/domain/meal.py b/fooder/domain/meal.py index 68ed136..0e262eb 100644 --- a/fooder/domain/meal.py +++ b/fooder/domain/meal.py @@ -51,6 +51,14 @@ class Meal(Base, CommonMixin): """ return sum(entry.fat for entry in self.entries) + @property + def fiber(self) -> float: + """fiber. + + :rtype: float + """ + return sum(entry.fiber for entry in self.entries) + @classmethod async def create( cls, diff --git a/fooder/domain/product.py b/fooder/domain/product.py index d7973f5..c1eb403 100644 --- a/fooder/domain/product.py +++ b/fooder/domain/product.py @@ -14,6 +14,7 @@ class Product(Base, CommonMixin): protein: Mapped[float] carb: Mapped[float] fat: Mapped[float] + fiber: Mapped[float] @property def calories(self) -> float: @@ -21,7 +22,7 @@ class Product(Base, CommonMixin): :rtype: float """ - return self.protein * 4 + self.carb * 4 + self.fat * 9 + return self.protein * 4 + self.carb * 4 + self.fat * 9 + self.fiber * 2 @classmethod async def list_all( @@ -39,15 +40,23 @@ class Product(Base, CommonMixin): @classmethod async def create( - cls, session: AsyncSession, name: str, carb: float, protein: float, fat: float + cls, + session: AsyncSession, + name: str, + carb: float, + protein: float, + fat: float, + fiber: float, ) -> "Product": # validation here assert carb <= 100, "carb must be less than 100" assert protein <= 100, "protein must be less than 100" assert fat <= 100, "fat must be less than 100" + assert fiber <= 100, "fiber must be less than 100" assert carb >= 0, "carb must be greater than 0" assert protein >= 0, "protein must be greater than 0" assert fat >= 0, "fat must be greater than 0" + assert fiber >= 0, "fiber must be greater than 0" assert carb + protein + fat <= 100, "total must be less than 100" # to avoid duplicates in the database keep name as lower diff --git a/fooder/model/diary.py b/fooder/model/diary.py index 0d67816..488fd39 100644 --- a/fooder/model/diary.py +++ b/fooder/model/diary.py @@ -15,6 +15,7 @@ class Diary(BaseModel): protein: float carb: float fat: float + fiber: float class Config: - orm_mode = True + from_attributes = True diff --git a/fooder/model/entry.py b/fooder/model/entry.py index cf2ac85..0909fcc 100644 --- a/fooder/model/entry.py +++ b/fooder/model/entry.py @@ -15,9 +15,10 @@ class Entry(BaseModel): protein: float carb: float fat: float + fiber: float class Config: - orm_mode = True + from_attributes = True class CreateEntryPayload(BaseModel): diff --git a/fooder/model/meal.py b/fooder/model/meal.py index 93419bb..cfdda00 100644 --- a/fooder/model/meal.py +++ b/fooder/model/meal.py @@ -13,11 +13,12 @@ class Meal(BaseModel): protein: float carb: float fat: float + fiber: float entries: List[Entry] diary_id: int class Config: - orm_mode = True + from_attributes = True class CreateMealPayload(BaseModel): diff --git a/fooder/model/product.py b/fooder/model/product.py index 0cdf1cd..15b81cc 100644 --- a/fooder/model/product.py +++ b/fooder/model/product.py @@ -11,9 +11,10 @@ class Product(BaseModel): protein: float carb: float fat: float + fiber: float class Config: - orm_mode = True + from_attributes = True class CreateProductPayload(BaseModel): @@ -23,6 +24,7 @@ class CreateProductPayload(BaseModel): protein: float carb: float fat: float + fiber: float class ListProductPayload(BaseModel): diff --git a/fooder/model/user.py b/fooder/model/user.py index 1f3017c..04aebb2 100644 --- a/fooder/model/user.py +++ b/fooder/model/user.py @@ -5,7 +5,7 @@ class User(BaseModel): username: str class Config: - orm_mode = True + from_attributes = True class CreateUserPayload(BaseModel): diff --git a/fooder/settings.py b/fooder/settings.py index 89b5688..0a322f6 100644 --- a/fooder/settings.py +++ b/fooder/settings.py @@ -1,4 +1,4 @@ -from pydantic import BaseSettings +from pydantic_settings import BaseSettings from typing import List diff --git a/requirements.txt b/requirements.txt index c8c7468..aae4f8a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,6 @@ fastapi pydantic +pydantic_settings sqlalchemy[postgresql_asyncpg] uvicorn[standard] asyncpg