1
0
Fork 0
mirror of https://github.com/mealie-recipes/mealie.git synced 2025-08-03 04:25:24 +02:00

feat: Move "on hand" and "last made" to household (#4616)

Co-authored-by: Kuchenpirat <24235032+Kuchenpirat@users.noreply.github.com>
This commit is contained in:
Michael Genson 2025-01-13 10:19:49 -06:00 committed by GitHub
parent e565b919df
commit e9892aba89
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
53 changed files with 1618 additions and 400 deletions

View file

@ -33,6 +33,7 @@ from mealie.schema.response.pagination import (
OrderDirection,
PaginationQuery,
)
from mealie.schema.user.user import UserRatingUpdate
from mealie.services.seeder.seeder_service import SeederService
from tests.utils import api_routes
from tests.utils.factories import random_int, random_string
@ -1320,3 +1321,105 @@ def test_pagination_filter_nested(api_client: TestClient, user_tuple: list[TestU
recipe_id = event_data["recipeId"]
assert recipe_id in recipe_ids[i]
assert recipe_id not in recipe_ids[(i + 1) % len(user_tuple)]
def test_pagination_filter_by_custom_last_made(api_client: TestClient, unique_user: TestUser, h2_user: TestUser):
recipe_1, recipe_2 = (
unique_user.repos.recipes.create(
Recipe(user_id=unique_user.user_id, group_id=unique_user.group_id, name=random_string())
)
for _ in range(2)
)
dt_1 = "2023-02-25"
dt_2 = "2023-03-25"
r = api_client.patch(
api_routes.recipes_slug_last_made(recipe_1.slug),
json={"timestamp": dt_1},
headers=unique_user.token,
)
assert r.status_code == 200
r = api_client.patch(
api_routes.recipes_slug_last_made(recipe_2.slug),
json={"timestamp": dt_2},
headers=unique_user.token,
)
assert r.status_code == 200
r = api_client.patch(
api_routes.recipes_slug_last_made(recipe_1.slug),
json={"timestamp": dt_2},
headers=h2_user.token,
)
assert r.status_code == 200
r = api_client.patch(
api_routes.recipes_slug_last_made(recipe_2.slug),
json={"timestamp": dt_1},
headers=h2_user.token,
)
assert r.status_code == 200
params = {"page": 1, "perPage": -1, "queryFilter": "lastMade > 2023-03-01"}
# User 1 should fetch Recipe 2
response = api_client.get(api_routes.recipes, params=params, headers=unique_user.token)
assert response.status_code == 200
recipes_data = response.json()["items"]
assert len(recipes_data) == 1
assert recipes_data[0]["id"] == str(recipe_2.id)
# User 2 should fetch Recipe 1
response = api_client.get(api_routes.recipes, params=params, headers=h2_user.token)
assert response.status_code == 200
recipes_data = response.json()["items"]
assert len(recipes_data) == 1
assert recipes_data[0]["id"] == str(recipe_1.id)
def test_pagination_filter_by_custom_rating(api_client: TestClient, user_tuple: list[TestUser]):
user_1, user_2 = user_tuple
recipe_1, recipe_2 = (
user_1.repos.recipes.create(Recipe(user_id=user_1.user_id, group_id=user_1.group_id, name=random_string()))
for _ in range(2)
)
r = api_client.post(
api_routes.users_id_ratings_slug(user_1.user_id, recipe_1.slug),
json=UserRatingUpdate(rating=5).model_dump(),
headers=user_1.token,
)
assert r.status_code == 200
r = api_client.post(
api_routes.users_id_ratings_slug(user_1.user_id, recipe_2.slug),
json=UserRatingUpdate(rating=1).model_dump(),
headers=user_1.token,
)
assert r.status_code == 200
r = api_client.post(
api_routes.users_id_ratings_slug(user_2.user_id, recipe_1.slug),
json=UserRatingUpdate(rating=1).model_dump(),
headers=user_2.token,
)
assert r.status_code == 200
r = api_client.post(
api_routes.users_id_ratings_slug(user_2.user_id, recipe_2.slug),
json=UserRatingUpdate(rating=5).model_dump(),
headers=user_2.token,
)
assert r.status_code == 200
qf = "rating > 3"
params = {"page": 1, "perPage": -1, "queryFilter": qf}
# User 1 should fetch Recipe 1
response = api_client.get(api_routes.recipes, params=params, headers=user_1.token)
assert response.status_code == 200
recipes_data = response.json()["items"]
assert len(recipes_data) == 1
assert recipes_data[0]["id"] == str(recipe_1.id)
# User 2 should fetch Recipe 2
response = api_client.get(api_routes.recipes, params=params, headers=user_2.token)
assert response.status_code == 200
recipes_data = response.json()["items"]
assert len(recipes_data) == 1
assert recipes_data[0]["id"] == str(recipe_2.id)

View file

@ -1,4 +1,4 @@
from datetime import UTC, datetime
from datetime import UTC, datetime, timedelta
from typing import cast
from uuid import UUID
@ -8,7 +8,7 @@ from sqlalchemy.orm import Session
from mealie.repos.all_repositories import get_repositories
from mealie.repos.repository_factory import AllRepositories
from mealie.repos.repository_recipes import RepositoryRecipes
from mealie.schema.household.household import HouseholdCreate
from mealie.schema.household.household import HouseholdCreate, HouseholdRecipeCreate
from mealie.schema.recipe import RecipeIngredient, SaveIngredientFood
from mealie.schema.recipe.recipe import Recipe, RecipeCategory, RecipeSummary
from mealie.schema.recipe.recipe_category import CategoryOut, CategorySave, TagSave
@ -706,6 +706,63 @@ def test_random_order_recipe_search(
assert not all(i == random_ordered[0] for i in random_ordered)
def test_order_by_last_made(unique_user: TestUser, h2_user: TestUser):
dt_1 = datetime.now(UTC)
dt_2 = dt_1 + timedelta(days=2)
recipe_1, recipe_2 = (
unique_user.repos.recipes.create(
Recipe(user_id=unique_user.user_id, group_id=unique_user.group_id, name=random_string())
)
for _ in range(2)
)
# In ascending order:
# unique_user: recipe_1, recipe_2
# h2_user: recipe_2, recipe_1
unique_user.repos.household_recipes.create(
HouseholdRecipeCreate(recipe_id=recipe_1.id, household_id=unique_user.household_id, last_made=dt_1)
)
h2_user.repos.household_recipes.create(
HouseholdRecipeCreate(recipe_id=recipe_1.id, household_id=h2_user.household_id, last_made=dt_2)
)
unique_user.repos.household_recipes.create(
HouseholdRecipeCreate(recipe_id=recipe_2.id, household_id=unique_user.household_id, last_made=dt_2)
)
h2_user.repos.household_recipes.create(
HouseholdRecipeCreate(recipe_id=recipe_2.id, household_id=h2_user.household_id, last_made=dt_1)
)
h1_recipes = get_repositories(
unique_user.repos.session, group_id=unique_user.group_id, household_id=None
).recipes.by_user(unique_user.user_id)
h2_recipes = get_repositories(h2_user.repos.session, group_id=h2_user.group_id, household_id=None).recipes.by_user(
h2_user.user_id
)
h1_query = h1_recipes.page_all(
PaginationQuery(
page=1,
per_page=-1,
order_by="last_made",
order_direction=OrderDirection.asc,
query_filter=f"id IN [{recipe_1.id}, {recipe_2.id}]",
)
)
assert [item.id for item in h1_query.items] == [recipe_1.id, recipe_2.id]
h2_query = h2_recipes.page_all(
PaginationQuery(
page=1,
per_page=-1,
order_by="lastMade",
order_direction=OrderDirection.asc,
query_filter=f"id IN [{recipe_1.id}, {recipe_2.id}]",
)
)
assert [item.id for item in h2_query.items] == [recipe_2.id, recipe_1.id]
def test_order_by_rating(user_tuple: tuple[TestUser, TestUser]):
user_1, user_2 = user_tuple
database = user_1.repos