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

27 statements  

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

1from datetime import UTC, datetime, timedelta 1a

2 

3from pydantic import UUID4, ConfigDict, Field 1a

4from sqlalchemy.orm import selectinload 1a

5from sqlalchemy.orm.interfaces import LoaderOption 1a

6 

7from mealie.schema._mealie import MealieModel 1a

8 

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

10from .recipe import Recipe 1a

11 

12 

13def defaut_expires_at_time() -> datetime: 1a

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

15 

16 

17class RecipeShareTokenCreate(MealieModel): 1a

18 recipe_id: UUID4 1a

19 expires_at: datetime = Field(default_factory=defaut_expires_at_time) 1a

20 

21 @property 1a

22 def is_expired(self) -> bool: 1a

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

24 

25 

26class RecipeShareTokenSave(RecipeShareTokenCreate): 1a

27 group_id: UUID4 1a

28 

29 

30class RecipeShareTokenSummary(RecipeShareTokenSave): 1a

31 id: UUID4 1a

32 created_at: datetime 1a

33 model_config = ConfigDict(from_attributes=True) 1a

34 

35 

36class RecipeShareToken(RecipeShareTokenSummary): 1a

37 recipe: Recipe 1a

38 model_config = ConfigDict(from_attributes=True) 1a

39 

40 @classmethod 1a

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

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 ]