Coverage for opt/mealie/lib/python3.12/site-packages/mealie/schema/recipe/recipe_share_token.py: 96%

27 statements  

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

1from datetime import UTC, datetime, timedelta 

2 

3from pydantic import UUID4, ConfigDict, Field 

4from sqlalchemy.orm import selectinload 

5from sqlalchemy.orm.interfaces import LoaderOption 

6 

7from mealie.schema._mealie import MealieModel 

8 

9from ...db.models.recipe import RecipeIngredientModel, RecipeInstruction, RecipeModel, RecipeShareTokenModel 

10from .recipe import Recipe 

11 

12 

13def defaut_expires_at_time() -> datetime: 

14 return datetime.now(UTC) + timedelta(days=30) 

15 

16 

17class RecipeShareTokenCreate(MealieModel): 

18 recipe_id: UUID4 

19 expires_at: datetime = Field(default_factory=defaut_expires_at_time) 

20 

21 @property 

22 def is_expired(self) -> bool: 

23 return self.expires_at < datetime.now(UTC) 

24 

25 

26class RecipeShareTokenSave(RecipeShareTokenCreate): 

27 group_id: UUID4 

28 

29 

30class RecipeShareTokenSummary(RecipeShareTokenSave): 

31 id: UUID4 

32 created_at: datetime 

33 model_config = ConfigDict(from_attributes=True) 

34 

35 

36class RecipeShareToken(RecipeShareTokenSummary): 

37 recipe: Recipe 

38 model_config = ConfigDict(from_attributes=True) 

39 

40 @classmethod 

41 def loader_options(cls) -> list[LoaderOption]: 

42 return [ 

43 selectinload(RecipeShareTokenModel.recipe).joinedload(RecipeModel.recipe_category), 

44 selectinload(RecipeShareTokenModel.recipe).joinedload(RecipeModel.tags), 

45 selectinload(RecipeShareTokenModel.recipe).joinedload(RecipeModel.tools), 

46 selectinload(RecipeShareTokenModel.recipe).joinedload(RecipeModel.nutrition), 

47 selectinload(RecipeShareTokenModel.recipe).joinedload(RecipeModel.settings), 

48 selectinload(RecipeShareTokenModel.recipe).joinedload(RecipeModel.assets), 

49 selectinload(RecipeShareTokenModel.recipe).joinedload(RecipeModel.notes), 

50 selectinload(RecipeShareTokenModel.recipe).joinedload(RecipeModel.extras), 

51 selectinload(RecipeShareTokenModel.recipe).joinedload(RecipeModel.comments), 

52 selectinload(RecipeShareTokenModel.recipe) 

53 .joinedload(RecipeModel.recipe_instructions) 

54 .joinedload(RecipeInstruction.ingredient_references), 

55 selectinload(RecipeShareTokenModel.recipe) 

56 .joinedload(RecipeModel.recipe_ingredient) 

57 .joinedload(RecipeIngredientModel.unit), 

58 selectinload(RecipeShareTokenModel.recipe) 

59 .joinedload(RecipeModel.recipe_ingredient) 

60 .joinedload(RecipeIngredientModel.food), 

61 ]