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
« prev ^ index » next coverage.py v7.10.6, created at 2025-11-25 15:48 +0000
1from datetime import UTC, datetime, timedelta 1a
3from pydantic import UUID4, ConfigDict, Field 1a
4from sqlalchemy.orm import selectinload 1a
5from sqlalchemy.orm.interfaces import LoaderOption 1a
7from mealie.schema._mealie import MealieModel 1a
9from ...db.models.recipe import RecipeIngredientModel, RecipeInstruction, RecipeModel, RecipeShareTokenModel 1a
10from .recipe import Recipe 1a
13def defaut_expires_at_time() -> datetime: 1a
14 return datetime.now(UTC) + timedelta(days=30) 1bcdefghijkl
17class RecipeShareTokenCreate(MealieModel): 1a
18 recipe_id: UUID4 1a
19 expires_at: datetime = Field(default_factory=defaut_expires_at_time) 1a
21 @property 1a
22 def is_expired(self) -> bool: 1a
23 return self.expires_at < datetime.now(UTC)
26class RecipeShareTokenSave(RecipeShareTokenCreate): 1a
27 group_id: UUID4 1a
30class RecipeShareTokenSummary(RecipeShareTokenSave): 1a
31 id: UUID4 1a
32 created_at: datetime 1a
33 model_config = ConfigDict(from_attributes=True) 1a
36class RecipeShareToken(RecipeShareTokenSummary): 1a
37 recipe: Recipe 1a
38 model_config = ConfigDict(from_attributes=True) 1a
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 ]