add merge funcions for units (#1146)

This commit is contained in:
Hayden
2022-04-09 19:57:49 -08:00
committed by GitHub
parent b93dae109e
commit db095656e1
8 changed files with 172 additions and 25 deletions

View File

@@ -29,6 +29,7 @@ from mealie.db.models.users import LongLiveToken, User
from mealie.db.models.users.password_reset import PasswordResetModel
from mealie.repos.repository_foods import RepositoryFood
from mealie.repos.repository_meal_plan_rules import RepositoryMealPlanRules
from mealie.repos.repository_units import RepositoryUnit
from mealie.schema.cookbook.cookbook import ReadCookBook
from mealie.schema.group.group_events import GroupEventNotifierOut
from mealie.schema.group.group_exports import GroupDataExport
@@ -99,8 +100,8 @@ class AllRepositories:
return RepositoryFood(self.session, PK_ID, IngredientFoodModel, IngredientFood)
@cached_property
def ingredient_units(self) -> RepositoryGeneric[IngredientUnit, IngredientUnitModel]:
return RepositoryGeneric(self.session, PK_ID, IngredientUnitModel, IngredientUnit)
def ingredient_units(self) -> RepositoryUnit:
return RepositoryUnit(self.session, PK_ID, IngredientUnitModel, IngredientUnit)
@cached_property
def tools(self) -> RepositoryGeneric[RecipeTool, Tool]:

View File

@@ -0,0 +1,32 @@
from pydantic import UUID4
from mealie.db.models.recipe.ingredient import IngredientUnitModel
from mealie.schema.recipe.recipe_ingredient import IngredientUnit
from .repository_generic import RepositoryGeneric
class RepositoryUnit(RepositoryGeneric[IngredientUnit, IngredientUnitModel]):
def merge(self, from_unit: UUID4, to_unit: UUID4) -> IngredientUnit | None:
from_model: IngredientUnitModel = (
self.session.query(self.sql_model).filter_by(**self._filter_builder(**{"id": from_unit})).one()
)
to_model: IngredientUnitModel = (
self.session.query(self.sql_model).filter_by(**self._filter_builder(**{"id": to_unit})).one()
)
to_model.ingredients += from_model.ingredients
try:
self.session.delete(from_model)
self.session.commit()
except Exception as e:
self.session.rollback()
raise e
return self.get_one(to_unit)
def by_group(self, group_id: UUID4) -> "RepositoryUnit":
return super().by_group(group_id) # type: ignore

View File

@@ -8,12 +8,7 @@ from mealie.routes._base.controller import controller
from mealie.routes._base.mixins import CrudMixins
from mealie.schema import mapper
from mealie.schema.query import GetAll
from mealie.schema.recipe.recipe_ingredient import (
CreateIngredientFood,
IngredientFood,
IngredientMerge,
SaveIngredientFood,
)
from mealie.schema.recipe.recipe_ingredient import CreateIngredientFood, IngredientFood, MergeFood, SaveIngredientFood
from mealie.schema.response.responses import SuccessResponse
router = APIRouter(prefix="/foods", tags=["Recipes: Foods"])
@@ -34,7 +29,7 @@ class IngredientFoodsController(BaseUserController):
)
@router.put("/merge", response_model=SuccessResponse)
def merge_one(self, data: IngredientMerge):
def merge_one(self, data: MergeFood):
try:
self.repo.merge(data.from_food, data.to_food)
return SuccessResponse.respond("Successfully merged foods")

View File

@@ -1,6 +1,6 @@
from functools import cached_property
from fastapi import APIRouter, Depends
from fastapi import APIRouter, Depends, HTTPException
from pydantic import UUID4
from mealie.routes._base.abc_controller import BaseUserController
@@ -8,7 +8,8 @@ from mealie.routes._base.controller import controller
from mealie.routes._base.mixins import CrudMixins
from mealie.schema import mapper
from mealie.schema.query import GetAll
from mealie.schema.recipe.recipe_ingredient import CreateIngredientUnit, IngredientUnit, SaveIngredientUnit
from mealie.schema.recipe.recipe_ingredient import CreateIngredientUnit, IngredientUnit, MergeUnit, SaveIngredientUnit
from mealie.schema.response.responses import SuccessResponse
router = APIRouter(prefix="/units", tags=["Recipes: Units"])
@@ -27,6 +28,15 @@ class IngredientUnitsController(BaseUserController):
self.registered_exceptions,
)
@router.put("/merge", response_model=SuccessResponse)
def merge_one(self, data: MergeUnit):
try:
self.repo.merge(data.from_unit, data.to_unit)
return SuccessResponse.respond("Successfully merged units")
except Exception as e:
self.deps.logger.error(e)
raise HTTPException(500, "Failed to merge units") from e
@router.get("", response_model=list[IngredientUnit])
def get_all(self, q: GetAll = Depends(GetAll)):
return self.repo.get_all(start=q.start, limit=q.limit)

View File

@@ -95,11 +95,16 @@ class IngredientRequest(MealieModel):
ingredient: str
class IngredientMerge(MealieModel):
class MergeFood(MealieModel):
from_food: UUID4
to_food: UUID4
class MergeUnit(MealieModel):
from_unit: UUID4
to_unit: UUID4
from mealie.schema.labels.multi_purpose_label import MultiPurposeLabelSummary
IngredientFood.update_forward_refs()