feat: more shopping list enhancements (#2587)

* fix new position calculataion

* ensure consistent list item ordering

* fix recipe ref overflow on small screens

* added recipe ref elevation

* tweaked line height (for long notes)

* removed unused user dependency

* remove old shopping list items when there's >100

* 🤷

* cleaned up function generator

* fixed test

* fix potential type error

* made max position calc more efficient
This commit is contained in:
Michael Genson
2023-10-07 16:06:00 -05:00
committed by GitHub
parent f35bc77a7d
commit b153ddf858
9 changed files with 189 additions and 8 deletions

View File

@@ -19,13 +19,12 @@ from mealie.schema.group.group_shopping_list import (
)
from mealie.schema.recipe.recipe_ingredient import IngredientFood, IngredientUnit, RecipeIngredient
from mealie.schema.response.pagination import OrderDirection, PaginationQuery
from mealie.schema.user.user import GroupInDB, PrivateUser
from mealie.schema.user.user import GroupInDB
class ShoppingListService:
def __init__(self, repos: AllRepositories, user: PrivateUser, group: GroupInDB):
def __init__(self, repos: AllRepositories, group: GroupInDB):
self.repos = repos
self.user = user
self.group = group
self.shopping_lists = repos.group_shopping_lists
self.list_items = repos.group_shopping_list_item

View File

@@ -1,4 +1,5 @@
from .create_timeline_events import create_mealplan_timeline_events
from .delete_old_checked_shopping_list_items import delete_old_checked_list_items
from .post_webhooks import post_group_webhooks
from .purge_group_exports import purge_group_data_exports
from .purge_password_reset import purge_password_reset_tokens
@@ -7,6 +8,7 @@ from .reset_locked_users import locked_user_reset
__all__ = [
"create_mealplan_timeline_events",
"delete_old_checked_list_items",
"post_group_webhooks",
"purge_password_reset_tokens",
"purge_group_data_exports",

View File

@@ -0,0 +1,70 @@
from collections.abc import Callable
from pydantic import UUID4
from mealie.db.db_setup import session_context
from mealie.repos.all_repositories import get_repositories
from mealie.routes.groups.controller_shopping_lists import publish_list_item_events
from mealie.schema.response.pagination import OrderDirection, PaginationQuery
from mealie.schema.user.user import DEFAULT_INTEGRATION_ID
from mealie.services.event_bus_service.event_bus_service import EventBusService
from mealie.services.event_bus_service.event_types import EventDocumentDataBase, EventTypes
from mealie.services.group_services.shopping_lists import ShoppingListService
MAX_CHECKED_ITEMS = 100
def _create_publish_event(event_bus_service: EventBusService, group_id: UUID4):
def publish_event(event_type: EventTypes, document_data: EventDocumentDataBase, message: str = ""):
event_bus_service.dispatch(
integration_id=DEFAULT_INTEGRATION_ID,
group_id=group_id,
event_type=event_type,
document_data=document_data,
message=message,
)
return publish_event
def _trim_list_items(shopping_list_service: ShoppingListService, shopping_list_id: UUID4, event_publisher: Callable):
pagination = PaginationQuery(
page=1,
per_page=-1,
query_filter=f'shopping_list_id="{shopping_list_id}" AND checked=true',
order_by="update_at",
order_direction=OrderDirection.desc,
)
query = shopping_list_service.list_items.page_all(pagination)
if len(query.items) <= MAX_CHECKED_ITEMS:
return
items_to_delete = query.items[MAX_CHECKED_ITEMS:]
items_response = shopping_list_service.bulk_delete_items([item.id for item in items_to_delete])
publish_list_item_events(event_publisher, items_response)
def delete_old_checked_list_items(group_id: UUID4 | None = None):
with session_context() as session:
repos = get_repositories(session)
if group_id is None:
# if not specified, we check all groups
groups = repos.groups.page_all(PaginationQuery(page=1, per_page=-1)).items
else:
group = repos.groups.get_one(group_id)
if not group:
raise Exception(f'Group not found: "{group_id}"')
groups = [group]
for group in groups:
event_bus_service = EventBusService(session=session, group_id=group.id)
shopping_list_service = ShoppingListService(repos, group)
shopping_list_data = repos.group_shopping_lists.by_group(group.id).page_all(
PaginationQuery(page=1, per_page=-1)
)
for shopping_list in shopping_list_data.items:
_trim_list_items(
shopping_list_service, shopping_list.id, _create_publish_event(event_bus_service, group.id)
)