Coverage for opt/mealie/lib/python3.12/site-packages/mealie/db/models/household/household_to_recipe.py: 86%
43 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 03:04 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 03:04 +0000
1from datetime import datetime
2from typing import TYPE_CHECKING
4from sqlalchemy import Column, ForeignKey, UniqueConstraint, event
5from sqlalchemy.engine.base import Connection
6from sqlalchemy.ext.associationproxy import AssociationProxy, association_proxy
7from sqlalchemy.orm import Mapped, mapped_column, relationship
8from sqlalchemy.orm.session import Session
10from mealie.db.models._model_utils.datetime import NaiveDateTime
12from .._model_base import BaseMixins, SqlAlchemyBase
13from .._model_utils.auto_init import auto_init
14from .._model_utils.guid import GUID
16if TYPE_CHECKING: 16 ↛ 17line 16 didn't jump to line 17 because the condition on line 16 was never true
17 from ..recipe import RecipeModel
18 from .household import Household
21class HouseholdToRecipe(SqlAlchemyBase, BaseMixins):
22 __tablename__ = "households_to_recipes"
23 __table_args__ = (UniqueConstraint("household_id", "recipe_id", name="household_id_recipe_id_key"),)
24 id: Mapped[GUID] = mapped_column(GUID, primary_key=True, default=GUID.generate)
26 household: Mapped["Household"] = relationship("Household", viewonly=True)
27 household_id = Column(GUID, ForeignKey("households.id"), index=True, primary_key=True)
28 recipe: Mapped["RecipeModel"] = relationship("RecipeModel", viewonly=True)
29 recipe_id = Column(GUID, ForeignKey("recipes.id"), index=True, primary_key=True)
30 group_id: AssociationProxy[GUID] = association_proxy("household", "group_id")
32 last_made: Mapped[datetime | None] = mapped_column(NaiveDateTime)
34 @auto_init()
35 def __init__(self, **_) -> None:
36 pass
39def update_recipe_last_made(session: Session, target: HouseholdToRecipe):
40 if not target.last_made: 40 ↛ 41line 40 didn't jump to line 41 because the condition on line 40 was never true
41 return
43 from mealie.db.models.recipe.recipe import RecipeModel
45 recipe = session.query(RecipeModel).filter(RecipeModel.id == target.recipe_id).first()
46 if not recipe: 46 ↛ 47line 46 didn't jump to line 47 because the condition on line 46 was never true
47 return
49 recipe.last_made = recipe.last_made or target.last_made
50 recipe.last_made = max(recipe.last_made, target.last_made)
53@event.listens_for(HouseholdToRecipe, "after_insert")
54@event.listens_for(HouseholdToRecipe, "after_update")
55@event.listens_for(HouseholdToRecipe, "after_delete")
56def update_recipe_rating_on_insert_or_delete(_, connection: Connection, target: HouseholdToRecipe):
57 session = Session(bind=connection)
59 update_recipe_last_made(session, target)
60 session.commit()