mirror of
https://github.com/mealie-recipes/mealie.git
synced 2025-12-08 19:35:14 -05:00
Feature: Shopping List Label Section Improvements (#2090)
* added backend for shopping list label config * updated codegen * refactored shopping list ops to service removed unique contraint removed label settings from main route/schema added new route for label settings * codegen * made sure label settings output in position order * implemented submenu for label order drag and drop * removed redundant label and tweaked formatting * added view by label to user preferences * made items draggable within each label section * moved reorder labels to its own button * made dialog scrollable * fixed broken model * refactored labels to use a service moved shopping list label logic to service modified label seeder to use service * added tests * fix for first label missing the tag icon * fixed wrong mapped type * added statement to create existing relationships * fix restore test, maybe
This commit is contained in:
45
mealie/services/group_services/labels_service.py
Normal file
45
mealie/services/group_services/labels_service.py
Normal file
@@ -0,0 +1,45 @@
|
||||
from pydantic import UUID4
|
||||
|
||||
from mealie.repos.repository_factory import AllRepositories
|
||||
from mealie.schema.group.group_shopping_list import ShoppingListMultiPurposeLabelCreate
|
||||
from mealie.schema.labels.multi_purpose_label import (
|
||||
MultiPurposeLabelCreate,
|
||||
MultiPurposeLabelOut,
|
||||
MultiPurposeLabelSave,
|
||||
)
|
||||
from mealie.schema.response.pagination import PaginationQuery
|
||||
|
||||
|
||||
class MultiPurposeLabelService:
|
||||
def __init__(self, repos: AllRepositories, group_id: UUID4):
|
||||
self.repos = repos
|
||||
self.group_id = group_id
|
||||
self.labels = repos.group_multi_purpose_labels
|
||||
|
||||
def _update_shopping_list_label_references(self, new_labels: list[MultiPurposeLabelOut]) -> None:
|
||||
shopping_lists_repo = self.repos.group_shopping_lists.by_group(self.group_id)
|
||||
shopping_list_multi_purpose_labels_repo = self.repos.shopping_list_multi_purpose_labels
|
||||
|
||||
shopping_lists = shopping_lists_repo.page_all(PaginationQuery(page=1, per_page=-1))
|
||||
new_shopping_list_labels: list[ShoppingListMultiPurposeLabelCreate] = []
|
||||
for label in new_labels:
|
||||
new_shopping_list_labels.extend(
|
||||
[
|
||||
ShoppingListMultiPurposeLabelCreate(
|
||||
shopping_list_id=shopping_list.id, label_id=label.id, position=len(shopping_list.label_settings)
|
||||
)
|
||||
for shopping_list in shopping_lists.items
|
||||
]
|
||||
)
|
||||
|
||||
shopping_list_multi_purpose_labels_repo.create_many(new_shopping_list_labels)
|
||||
|
||||
def create_one(self, data: MultiPurposeLabelCreate) -> MultiPurposeLabelOut:
|
||||
label = self.labels.create(data.cast(MultiPurposeLabelSave, group_id=self.group_id))
|
||||
self._update_shopping_list_label_references([label])
|
||||
return label
|
||||
|
||||
def create_many(self, data: list[MultiPurposeLabelCreate]) -> list[MultiPurposeLabelOut]:
|
||||
labels = self.labels.create_many([label.cast(MultiPurposeLabelSave, group_id=self.group_id) for label in data])
|
||||
self._update_shopping_list_label_references(labels)
|
||||
return labels
|
||||
@@ -6,6 +6,7 @@ from mealie.core.exceptions import UnexpectedNone
|
||||
from mealie.repos.repository_factory import AllRepositories
|
||||
from mealie.schema.group import ShoppingListItemCreate, ShoppingListOut
|
||||
from mealie.schema.group.group_shopping_list import (
|
||||
ShoppingListCreate,
|
||||
ShoppingListItemBase,
|
||||
ShoppingListItemOut,
|
||||
ShoppingListItemRecipeRefCreate,
|
||||
@@ -13,18 +14,23 @@ from mealie.schema.group.group_shopping_list import (
|
||||
ShoppingListItemsCollectionOut,
|
||||
ShoppingListItemUpdate,
|
||||
ShoppingListItemUpdateBulk,
|
||||
ShoppingListMultiPurposeLabelCreate,
|
||||
ShoppingListSave,
|
||||
)
|
||||
from mealie.schema.recipe.recipe_ingredient import (
|
||||
IngredientFood,
|
||||
IngredientUnit,
|
||||
RecipeIngredient,
|
||||
)
|
||||
from mealie.schema.response.pagination import PaginationQuery
|
||||
from mealie.schema.response.pagination import OrderDirection, PaginationQuery
|
||||
from mealie.schema.user.user import GroupInDB, PrivateUser
|
||||
|
||||
|
||||
class ShoppingListService:
|
||||
def __init__(self, repos: AllRepositories):
|
||||
def __init__(self, repos: AllRepositories, user: PrivateUser, 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
|
||||
self.list_item_refs = repos.group_shopping_list_item_references
|
||||
@@ -463,3 +469,18 @@ class ShoppingListService:
|
||||
break
|
||||
|
||||
return self.shopping_lists.get_one(shopping_list.id), items # type: ignore
|
||||
|
||||
def create_one_list(self, data: ShoppingListCreate):
|
||||
create_data = data.cast(ShoppingListSave, group_id=self.group.id)
|
||||
new_list = self.shopping_lists.create(create_data) # type: ignore
|
||||
|
||||
labels = self.repos.group_multi_purpose_labels.by_group(self.group.id).page_all(
|
||||
PaginationQuery(page=1, per_page=-1, order_by="name", order_direction=OrderDirection.asc)
|
||||
)
|
||||
label_settings = [
|
||||
ShoppingListMultiPurposeLabelCreate(shopping_list_id=new_list.id, label_id=label.id, position=i)
|
||||
for i, label in enumerate(labels.items)
|
||||
]
|
||||
|
||||
self.repos.shopping_list_multi_purpose_labels.create_many(label_settings)
|
||||
return self.shopping_lists.get_one(new_list.id)
|
||||
|
||||
Reference in New Issue
Block a user