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