mirror of
https://github.com/mealie-recipes/mealie.git
synced 2026-05-27 12:10:25 -04:00
Compare commits
1 Commits
v3.19.0
...
fix/6853-l
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f644ee1879 |
@@ -26,7 +26,7 @@ from mealie.schema.recipe.recipe import RecipePagination, RecipeSummary, create_
|
|||||||
from mealie.schema.recipe.recipe_ingredient import IngredientFood
|
from mealie.schema.recipe.recipe_ingredient import IngredientFood
|
||||||
from mealie.schema.recipe.recipe_suggestion import RecipeSuggestionQuery, RecipeSuggestionResponseItem
|
from mealie.schema.recipe.recipe_suggestion import RecipeSuggestionQuery, RecipeSuggestionResponseItem
|
||||||
from mealie.schema.recipe.recipe_tool import RecipeToolOut
|
from mealie.schema.recipe.recipe_tool import RecipeToolOut
|
||||||
from mealie.schema.response.pagination import PaginationQuery
|
from mealie.schema.response.pagination import OrderByNullPosition, OrderDirection, PaginationQuery
|
||||||
from mealie.services.query_filter.builder import QueryFilterBuilder
|
from mealie.services.query_filter.builder import QueryFilterBuilder
|
||||||
|
|
||||||
from ..db.models._model_base import SqlAlchemyBase
|
from ..db.models._model_base import SqlAlchemyBase
|
||||||
@@ -92,6 +92,20 @@ class RepositoryRecipes(HouseholdRepositoryGeneric[Recipe, RecipeModel]):
|
|||||||
)
|
)
|
||||||
return sa.cast(effective_rating, sa.Float)
|
return sa.cast(effective_rating, sa.Float)
|
||||||
|
|
||||||
|
def add_order_attr_to_query(
|
||||||
|
self,
|
||||||
|
query: sa.Select,
|
||||||
|
order_attr: orm.InstrumentedAttribute,
|
||||||
|
order_dir: OrderDirection,
|
||||||
|
order_by_null: OrderByNullPosition | None,
|
||||||
|
) -> sa.Select:
|
||||||
|
# Sort recipe names by their normalized (accent-folded, lowercased) form so that
|
||||||
|
# accented and umlaut characters sort next to their base letter (e.g. "Über" near
|
||||||
|
# "U") instead of after "Z" by raw code point. See GH #6853.
|
||||||
|
if order_attr is RecipeModel.name:
|
||||||
|
order_attr = RecipeModel.name_normalized
|
||||||
|
return super().add_order_attr_to_query(query, order_attr, order_dir, order_by_null)
|
||||||
|
|
||||||
def create(self, document: Recipe) -> Recipe: # type: ignore
|
def create(self, document: Recipe) -> Recipe: # type: ignore
|
||||||
max_retries = 10
|
max_retries = 10
|
||||||
original_name: str = document.name # type: ignore
|
original_name: str = document.name # type: ignore
|
||||||
|
|||||||
@@ -647,6 +647,40 @@ def test_order_by_last_made(unique_user: TestUser, h2_user: TestUser):
|
|||||||
assert [item.id for item in h2_query.items] == [recipe_2.id, recipe_1.id]
|
assert [item.id for item in h2_query.items] == [recipe_2.id, recipe_1.id]
|
||||||
|
|
||||||
|
|
||||||
|
def test_order_by_name_is_accent_folded(unique_user: TestUser):
|
||||||
|
# Names chosen so that raw code-point sorting (the previous behavior) would place the
|
||||||
|
# umlaut/accented entries after "Zebra". Accent-folded sorting must instead place them
|
||||||
|
# next to their base letter: "ärtsoppa" near "a", "Über" near "u". See GH #6853.
|
||||||
|
names = ["Zebra", "ärtsoppa", "Apple", "Über"]
|
||||||
|
recipes = [
|
||||||
|
unique_user.repos.recipes.create(Recipe(user_id=unique_user.user_id, group_id=unique_user.group_id, name=name))
|
||||||
|
for name in names
|
||||||
|
]
|
||||||
|
recipe_ids = ", ".join(str(recipe.id) for recipe in recipes)
|
||||||
|
|
||||||
|
ascending = unique_user.repos.recipes.page_all(
|
||||||
|
PaginationQuery(
|
||||||
|
page=1,
|
||||||
|
per_page=-1,
|
||||||
|
order_by="name",
|
||||||
|
order_direction=OrderDirection.asc,
|
||||||
|
query_filter=f"id IN [{recipe_ids}]",
|
||||||
|
)
|
||||||
|
)
|
||||||
|
assert [item.name for item in ascending.items] == ["Apple", "ärtsoppa", "Über", "Zebra"]
|
||||||
|
|
||||||
|
descending = unique_user.repos.recipes.page_all(
|
||||||
|
PaginationQuery(
|
||||||
|
page=1,
|
||||||
|
per_page=-1,
|
||||||
|
order_by="name",
|
||||||
|
order_direction=OrderDirection.desc,
|
||||||
|
query_filter=f"id IN [{recipe_ids}]",
|
||||||
|
)
|
||||||
|
)
|
||||||
|
assert [item.name for item in descending.items] == ["Zebra", "Über", "ärtsoppa", "Apple"]
|
||||||
|
|
||||||
|
|
||||||
def test_coalesce_last_made(unique_user: TestUser):
|
def test_coalesce_last_made(unique_user: TestUser):
|
||||||
dt = datetime.now(UTC)
|
dt = datetime.now(UTC)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user