Coverage for opt/mealie/lib/python3.12/site-packages/mealie/db/models/household/household_to_recipe.py: 61%

43 statements  

« prev     ^ index     » next       coverage.py v7.10.6, created at 2025-11-25 17:29 +0000

1from datetime import datetime 1a

2from typing import TYPE_CHECKING 1a

3 

4from sqlalchemy import Column, ForeignKey, UniqueConstraint, event 1a

5from sqlalchemy.engine.base import Connection 1a

6from sqlalchemy.ext.associationproxy import AssociationProxy, association_proxy 1a

7from sqlalchemy.orm import Mapped, mapped_column, relationship 1a

8from sqlalchemy.orm.session import Session 1a

9 

10from mealie.db.models._model_utils.datetime import NaiveDateTime 1a

11 

12from .._model_base import BaseMixins, SqlAlchemyBase 1a

13from .._model_utils.auto_init import auto_init 1a

14from .._model_utils.guid import GUID 1a

15 

16if TYPE_CHECKING: 16 ↛ 17line 16 didn't jump to line 17 because the condition on line 16 was never true1a

17 from ..recipe import RecipeModel 

18 from .household import Household 

19 

20 

21class HouseholdToRecipe(SqlAlchemyBase, BaseMixins): 1a

22 __tablename__ = "households_to_recipes" 1a

23 __table_args__ = (UniqueConstraint("household_id", "recipe_id", name="household_id_recipe_id_key"),) 1a

24 id: Mapped[GUID] = mapped_column(GUID, primary_key=True, default=GUID.generate) 1a

25 

26 household: Mapped["Household"] = relationship("Household", viewonly=True) 1a

27 household_id = Column(GUID, ForeignKey("households.id"), index=True, primary_key=True) 1a

28 recipe: Mapped["RecipeModel"] = relationship("RecipeModel", viewonly=True) 1a

29 recipe_id = Column(GUID, ForeignKey("recipes.id"), index=True, primary_key=True) 1a

30 group_id: AssociationProxy[GUID] = association_proxy("household", "group_id") 1a

31 

32 last_made: Mapped[datetime | None] = mapped_column(NaiveDateTime) 1a

33 

34 @auto_init() 1a

35 def __init__(self, **_) -> None: 1a

36 pass 

37 

38 

39def update_recipe_last_made(session: Session, target: HouseholdToRecipe): 1a

40 if not target.last_made: 

41 return 

42 

43 from mealie.db.models.recipe.recipe import RecipeModel 

44 

45 recipe = session.query(RecipeModel).filter(RecipeModel.id == target.recipe_id).first() 

46 if not recipe: 

47 return 

48 

49 recipe.last_made = recipe.last_made or target.last_made 

50 recipe.last_made = max(recipe.last_made, target.last_made) 

51 

52 

53@event.listens_for(HouseholdToRecipe, "after_insert") 1a

54@event.listens_for(HouseholdToRecipe, "after_update") 1a

55@event.listens_for(HouseholdToRecipe, "after_delete") 1a

56def update_recipe_rating_on_insert_or_delete(_, connection: Connection, target: HouseholdToRecipe): 1a

57 session = Session(bind=connection) 

58 

59 update_recipe_last_made(session, target) 

60 session.commit()