Coverage for opt/mealie/lib/python3.12/site-packages/mealie/db/models/recipe/nutrition.py: 100%

31 statements  

« prev     ^ index     » next       coverage.py v7.15.2, created at 2026-10-07 03:04 +0000

1import sqlalchemy as sa 

2from sqlalchemy.orm import Mapped, mapped_column 

3 

4from mealie.db.models._model_base import SqlAlchemyBase 

5from mealie.db.models._model_utils.guid import GUID 

6 

7 

8class Nutrition(SqlAlchemyBase): 

9 __tablename__ = "recipe_nutrition" 

10 id: Mapped[int] = mapped_column(sa.Integer, primary_key=True) 

11 recipe_id: Mapped[GUID | None] = mapped_column(GUID, sa.ForeignKey("recipes.id"), index=True) 

12 

13 calories: Mapped[str | None] = mapped_column(sa.String) 

14 carbohydrate_content: Mapped[str | None] = mapped_column(sa.String) 

15 cholesterol_content: Mapped[str | None] = mapped_column(sa.String) 

16 fat_content: Mapped[str | None] = mapped_column(sa.String) 

17 fiber_content: Mapped[str | None] = mapped_column(sa.String) 

18 protein_content: Mapped[str | None] = mapped_column(sa.String) 

19 saturated_fat_content: Mapped[str | None] = mapped_column(sa.String) 

20 

21 # `serving_size` is not a scaling factor, but a per-serving volume or mass 

22 # according to schema.org. E.g., "2 L", "500 g", "5 cups", etc. 

23 # 

24 # Ignoring for now because it's too difficult to work around variable units 

25 # in translation for the frontend. Also, it causes cognitive dissonance wrt 

26 # "servings" (i.e., "serves 2" etc.), which is an unrelated concept that 

27 # might cause confusion. 

28 # 

29 # serving_size: Mapped[str | None] = mapped_column(sa.String) 

30 

31 sodium_content: Mapped[str | None] = mapped_column(sa.String) 

32 sugar_content: Mapped[str | None] = mapped_column(sa.String) 

33 trans_fat_content: Mapped[str | None] = mapped_column(sa.String) 

34 unsaturated_fat_content: Mapped[str | None] = mapped_column(sa.String) 

35 

36 def __init__( 

37 self, 

38 calories=None, 

39 carbohydrate_content=None, 

40 cholesterol_content=None, 

41 fat_content=None, 

42 fiber_content=None, 

43 protein_content=None, 

44 saturated_fat_content=None, 

45 sodium_content=None, 

46 sugar_content=None, 

47 trans_fat_content=None, 

48 unsaturated_fat_content=None, 

49 ) -> None: 

50 self.calories = calories 

51 self.carbohydrate_content = carbohydrate_content 

52 self.cholesterol_content = cholesterol_content 

53 self.fat_content = fat_content 

54 self.fiber_content = fiber_content 

55 self.protein_content = protein_content 

56 self.saturated_fat_content = saturated_fat_content 

57 self.sodium_content = sodium_content 

58 self.sugar_content = sugar_content 

59 self.trans_fat_content = trans_fat_content 

60 self.unsaturated_fat_content = unsaturated_fat_content