mirror of
https://github.com/hay-kot/mealie.git
synced 2025-08-22 22:43:34 -07:00
Fixed food seed file to remove duplicate item. Added logic to food, label, and unit seeding to query all existing items and then only seed new ones, making it less likely to get duplicates from seeding. Updated messages on group data management page. Updated tests
This commit is contained in:
parent
74690f2466
commit
6e485060e0
4 changed files with 27 additions and 14 deletions
|
@ -1048,8 +1048,8 @@
|
||||||
"foods": {
|
"foods": {
|
||||||
"merge-dialog-text": "Combining the selected foods will merge the source food and target food into a single food. The source food will be deleted and all of the references to the source food will be updated to point to the target food.",
|
"merge-dialog-text": "Combining the selected foods will merge the source food and target food into a single food. The source food will be deleted and all of the references to the source food will be updated to point to the target food.",
|
||||||
"merge-food-example": "Merging {food1} into {food2}",
|
"merge-food-example": "Merging {food1} into {food2}",
|
||||||
"seed-dialog-text": "Seed the database with foods based on your local language. This will create 200+ common foods that can be used to organize your database. Foods are translated via a community effort.",
|
"seed-dialog-text": "Seed the database with foods based on your local language. This will create ~2700 common foods that can be used to organize your database. Foods are translated via a community effort.",
|
||||||
"seed-dialog-warning": "You have already have some items in your database. This action will not reconcile duplicates, you will have to manage them manually.",
|
"seed-dialog-warning": "You already have some items in your database. A new item will not be added if an item with the same name already exists.",
|
||||||
"combine-food": "Combine Food",
|
"combine-food": "Combine Food",
|
||||||
"source-food": "Source Food",
|
"source-food": "Source Food",
|
||||||
"target-food": "Target Food",
|
"target-food": "Target Food",
|
||||||
|
|
|
@ -10567,12 +10567,6 @@
|
||||||
"name": "wasabi pea",
|
"name": "wasabi pea",
|
||||||
"pluralName": "wasabi peas"
|
"pluralName": "wasabi peas"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"aliases": [],
|
|
||||||
"description": "",
|
|
||||||
"name": null,
|
|
||||||
"pluralName": "achiote seeds"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
"description": "",
|
"description": "",
|
||||||
|
|
|
@ -4,7 +4,12 @@ from collections.abc import Generator
|
||||||
from functools import cached_property
|
from functools import cached_property
|
||||||
|
|
||||||
from mealie.schema.labels import MultiPurposeLabelOut, MultiPurposeLabelSave
|
from mealie.schema.labels import MultiPurposeLabelOut, MultiPurposeLabelSave
|
||||||
from mealie.schema.recipe.recipe_ingredient import SaveIngredientFood, SaveIngredientUnit
|
from mealie.schema.recipe.recipe_ingredient import (
|
||||||
|
IngredientFood,
|
||||||
|
IngredientUnit,
|
||||||
|
SaveIngredientFood,
|
||||||
|
SaveIngredientUnit,
|
||||||
|
)
|
||||||
from mealie.services.group_services.labels_service import MultiPurposeLabelService
|
from mealie.services.group_services.labels_service import MultiPurposeLabelService
|
||||||
|
|
||||||
from ._abstract_seeder import AbstractSeeder
|
from ._abstract_seeder import AbstractSeeder
|
||||||
|
@ -21,11 +26,17 @@ class MultiPurposeLabelSeeder(AbstractSeeder):
|
||||||
locale_path = self.resources / "foods" / "locales" / f"{locale}.json"
|
locale_path = self.resources / "foods" / "locales" / f"{locale}.json"
|
||||||
return locale_path if locale_path.exists() else foods.en_US
|
return locale_path if locale_path.exists() else foods.en_US
|
||||||
|
|
||||||
|
def get_all_labels(self) -> list[MultiPurposeLabelOut]:
|
||||||
|
return self.repos.group_multi_purpose_labels.get_all()
|
||||||
|
|
||||||
def load_data(self, locale: str | None = None) -> Generator[MultiPurposeLabelSave, None, None]:
|
def load_data(self, locale: str | None = None) -> Generator[MultiPurposeLabelSave, None, None]:
|
||||||
file = self.get_file(locale)
|
file = self.get_file(locale)
|
||||||
|
|
||||||
label_names = set(json.loads(file.read_text(encoding="utf-8")).keys())
|
current_label_names = {label.name for label in self.get_all_labels()}
|
||||||
for label in label_names:
|
seed_label_names = set(json.loads(file.read_text(encoding="utf-8")).keys())
|
||||||
|
# only seed new labels
|
||||||
|
to_seed_labels = seed_label_names - current_label_names
|
||||||
|
for label in to_seed_labels:
|
||||||
yield MultiPurposeLabelSave(
|
yield MultiPurposeLabelSave(
|
||||||
name=label,
|
name=label,
|
||||||
group_id=self.repos.group_id,
|
group_id=self.repos.group_id,
|
||||||
|
@ -45,10 +56,13 @@ class IngredientUnitsSeeder(AbstractSeeder):
|
||||||
locale_path = self.resources / "units" / "locales" / f"{locale}.json"
|
locale_path = self.resources / "units" / "locales" / f"{locale}.json"
|
||||||
return locale_path if locale_path.exists() else units.en_US
|
return locale_path if locale_path.exists() else units.en_US
|
||||||
|
|
||||||
|
def get_all_units(self) -> list[IngredientUnit]:
|
||||||
|
return self.repos.ingredient_units.get_all()
|
||||||
|
|
||||||
def load_data(self, locale: str | None = None) -> Generator[SaveIngredientUnit, None, None]:
|
def load_data(self, locale: str | None = None) -> Generator[SaveIngredientUnit, None, None]:
|
||||||
file = self.get_file(locale)
|
file = self.get_file(locale)
|
||||||
|
|
||||||
seen_unit_names = set()
|
seen_unit_names = {unit.name for unit in self.get_all_units()}
|
||||||
for unit in json.loads(file.read_text(encoding="utf-8")).values():
|
for unit in json.loads(file.read_text(encoding="utf-8")).values():
|
||||||
if unit["name"] in seen_unit_names:
|
if unit["name"] in seen_unit_names:
|
||||||
continue
|
continue
|
||||||
|
@ -80,14 +94,19 @@ class IngredientFoodsSeeder(AbstractSeeder):
|
||||||
def get_label(self, value: str) -> MultiPurposeLabelOut | None:
|
def get_label(self, value: str) -> MultiPurposeLabelOut | None:
|
||||||
return self.repos.group_multi_purpose_labels.get_one(value, "name")
|
return self.repos.group_multi_purpose_labels.get_one(value, "name")
|
||||||
|
|
||||||
|
def get_all_foods(self) -> list[IngredientFood]:
|
||||||
|
return self.repos.ingredient_foods.get_all()
|
||||||
|
|
||||||
def load_data(self, locale: str | None = None) -> Generator[SaveIngredientFood, None, None]:
|
def load_data(self, locale: str | None = None) -> Generator[SaveIngredientFood, None, None]:
|
||||||
file = self.get_file(locale)
|
file = self.get_file(locale)
|
||||||
|
|
||||||
seed_foods_names = set()
|
# get all current unique foods
|
||||||
|
seed_foods_names = {food.name for food in self.get_all_foods()}
|
||||||
for label, value in json.loads(file.read_text(encoding="utf-8")).items():
|
for label, value in json.loads(file.read_text(encoding="utf-8")).items():
|
||||||
label_out = self.get_label(label)
|
label_out = self.get_label(label)
|
||||||
|
|
||||||
for food in value["foods"]:
|
for food in value["foods"]:
|
||||||
|
# don't seed foods that already exist, matched on food name
|
||||||
if food["name"] in seed_foods_names:
|
if food["name"] in seed_foods_names:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,7 @@ def test_seed_invalid_locale(api_client: TestClient, unique_user: TestUser):
|
||||||
|
|
||||||
|
|
||||||
def test_seed_foods(api_client: TestClient, unique_user: TestUser):
|
def test_seed_foods(api_client: TestClient, unique_user: TestUser):
|
||||||
CREATED_FOODS = 2694
|
CREATED_FOODS = 2687
|
||||||
database = unique_user.repos
|
database = unique_user.repos
|
||||||
|
|
||||||
# Check that the foods was created
|
# Check that the foods was created
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue