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

37 statements  

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

1from typing import TYPE_CHECKING, Optional 

2 

3from sqlalchemy import Boolean, ForeignKey, Integer, String, UniqueConstraint, orm 

4from sqlalchemy.orm import Mapped, mapped_column 

5 

6from .._model_base import BaseMixins, SqlAlchemyBase 

7from .._model_utils import guid 

8from .._model_utils.auto_init import auto_init 

9from ..recipe.category import Category, cookbooks_to_categories 

10from ..recipe.tag import Tag, cookbooks_to_tags 

11from ..recipe.tool import Tool, cookbooks_to_tools 

12 

13if TYPE_CHECKING: 13 ↛ 14line 13 didn't jump to line 14 because the condition on line 13 was never true

14 from ..group import Group 

15 from .household import Household 

16 

17 

18class CookBook(SqlAlchemyBase, BaseMixins): 

19 __tablename__ = "cookbooks" 

20 __table_args__: tuple[UniqueConstraint, ...] = ( 

21 UniqueConstraint("slug", "group_id", name="cookbook_slug_group_id_key"), 

22 ) 

23 

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

25 position: Mapped[int] = mapped_column(Integer, nullable=False, default=1) 

26 

27 group_id: Mapped[guid.GUID | None] = mapped_column(guid.GUID, ForeignKey("groups.id"), index=True) 

28 group: Mapped[Optional["Group"]] = orm.relationship("Group", back_populates="cookbooks") 

29 household_id: Mapped[guid.GUID | None] = mapped_column(guid.GUID, ForeignKey("households.id"), index=True) 

30 household: Mapped[Optional["Household"]] = orm.relationship("Household", back_populates="cookbooks") 

31 

32 name: Mapped[str] = mapped_column(String, nullable=False) 

33 slug: Mapped[str] = mapped_column(String, nullable=False, index=True) 

34 description: Mapped[str | None] = mapped_column(String, default="") 

35 public: Mapped[str | None] = mapped_column(Boolean, default=False) 

36 query_filter_string: Mapped[str] = mapped_column(String, nullable=False, default="") 

37 

38 # Old filters - deprecated in favor of query filter strings 

39 categories: Mapped[list[Category]] = orm.relationship( 

40 Category, secondary=cookbooks_to_categories, single_parent=True 

41 ) 

42 require_all_categories: Mapped[bool | None] = mapped_column(Boolean, default=True) 

43 

44 tags: Mapped[list[Tag]] = orm.relationship(Tag, secondary=cookbooks_to_tags, single_parent=True) 

45 require_all_tags: Mapped[bool | None] = mapped_column(Boolean, default=True) 

46 

47 tools: Mapped[list[Tool]] = orm.relationship(Tool, secondary=cookbooks_to_tools, single_parent=True) 

48 require_all_tools: Mapped[bool | None] = mapped_column(Boolean, default=True) 

49 

50 @auto_init() 

51 def __init__(self, **_) -> None: 

52 pass 

53 

54 def update(self, *args, **kwarg): 

55 self.__init__(*args, **kwarg)