From 0061af80a78601ce344f7b73386263700753ab43 Mon Sep 17 00:00:00 2001 From: Brian Choromanski Date: Fri, 30 Aug 2024 21:32:57 -0400 Subject: [PATCH 001/102] Added support for plural_name for foods --- .../seed/resources/foods/locales/en-US.json | 882 +++++++++++++----- mealie/repos/seed/seeders.py | 11 +- 2 files changed, 669 insertions(+), 224 deletions(-) diff --git a/mealie/repos/seed/resources/foods/locales/en-US.json b/mealie/repos/seed/resources/foods/locales/en-US.json index 807bdaaf694..44c93d13bf8 100644 --- a/mealie/repos/seed/resources/foods/locales/en-US.json +++ b/mealie/repos/seed/resources/foods/locales/en-US.json @@ -1,222 +1,662 @@ { - "acorn-squash": "acorn squash", - "alfalfa-sprouts": "alfalfa sprouts", - "anchovies": "anchovies", - "apples": "apples", - "artichoke": "artichoke", - "arugula": "arugula", - "asparagus": "asparagus", - "aubergine": "aubergine", - "avocado": "avocado", - "bacon": "bacon", - "baking-powder": "baking powder", - "baking-soda": "baking soda", - "baking-sugar": "baking sugar", - "bar-sugar": "bar sugar", - "basil": "basil", - "bell-peppers": "bell peppers", - "blackberries": "blackberries", - "brassicas": "brassicas", - "bok-choy": "bok choy", - "broccoflower": "broccoflower", - "broccoli": "broccoli", - "broccolini": "broccolini", - "broccoli-rabe": "broccoli rabe", - "brussels-sprouts": "brussels sprouts", - "cabbage": "cabbage", - "cauliflower": "cauliflower", - "chinese-leaves": "chinese leaves", - "collard-greens": "collard greens", - "kohlrabi": "kohlrabi", - "bread": "bread", - "breadfruit": "breadfruit", - "broad-beans": "broad beans", - "brown-sugar": "brown sugar", - "butter": "butter", - "butternut-pumpkin": "butternut pumpkin", - "butternut-squash": "butternut squash", - "cactus-edible": "cactus, edible", - "calabrese": "calabrese", - "cannabis": "cannabis", - "capsicum": "capsicum", - "caraway": "caraway", - "carrot": "carrot", - "castor-sugar": "castor sugar", - "cayenne-pepper": "cayenne pepper", - "celeriac": "celeriac", - "celery": "celery", - "cereal-grains": "cereal grains", - "rice": "rice", - "chard": "chard", - "cheese": "cheese", - "chicory": "chicory", - "chilli-peppers": "chilli peppers", - "chives": "chives", - "chocolate": "chocolate", - "cilantro": "cilantro", - "cinnamon": "cinnamon", - "clarified-butter": "clarified butter", - "coconut": "coconut", - "coconut-milk": "coconut milk", - "coffee": "coffee", - "confectioners-sugar": "confectioners' sugar", - "coriander": "coriander", - "corn": "corn", - "corn-syrup": "corn syrup", - "cottonseed-oil": "cottonseed oil", - "courgette": "courgette", - "cream-of-tartar": "cream of tartar", - "cucumber": "cucumber", - "cumin": "cumin", - "daikon": "daikon", - "dairy-products-and-dairy-substitutes": "dairy products and dairy substitutes", - "eggs": "eggs", - "ghee": "ghee", - "milk": "milk", - "dandelion": "dandelion", - "demerara-sugar": "demerara sugar", - "dough": "dough", - "edible-cactus": "edible cactus", - "eggplant": "eggplant", - "endive": "endive", - "fats": "fats", - "speck": "speck", - "fava-beans": "fava beans", - "fiddlehead": "fiddlehead", - "fish": "fish", - "catfish": "catfish ", - "cod": "cod", - "salt-cod": "salt cod", - "salmon": "salmon", - "skate": "skate", - "stockfish": "stockfish", - "trout": "trout", - "tuna": "tuna", - "five-spice-powder": "five spice powder", - "flour": "flour", - "frisee": "frisee", - "fructose": "fructose", - "fruit": "fruit", - "apple": "apple", - "oranges": "oranges", - "pear": "pear", - "tomato": "tomato ", - "fruit-sugar": "fruit sugar", - "garam-masala": "garam masala", - "garlic": "garlic", - "gem-squash": "gem squash", - "ginger": "ginger", - "giblets": "giblets", - "grains": "grains", - "maize": "maize", - "sweetcorn": "sweetcorn", - "teff": "teff", - "grape-seed-oil": "grape seed oil", - "green-onion": "green onion", - "heart-of-palm": "heart of palm", - "hemp": "hemp", - "herbs": "herbs", - "oregano": "oregano", - "parsley": "parsley", - "honey": "honey", - "icing-sugar": "icing sugar", - "isomalt": "isomalt", - "jackfruit": "jackfruit", - "jaggery": "jaggery", - "jams": "jams", - "jellies": "jellies", - "jerusalem-artichoke": "jerusalem artichoke", - "jicama": "jicama", - "kale": "kale", - "kumara": "kumara", - "leavening-agents": "leavening agents", - "leek": "leek", - "legumes": "legumes ", - "peas": "peas", - "beans": "beans", - "lentils": "lentils", - "lemongrass": "lemongrass", - "lettuce": "lettuce", - "liver": "liver", - "maple-syrup": "maple syrup", - "meat": "meat", - "mortadella": "mortadella", - "mushroom": "mushroom", - "white-mushroom": "white mushroom", - "mussels": "mussels", - "nori": "nori", - "nutmeg": "nutmeg", - "nutritional-yeast-flakes": "nutritional yeast flakes", - "nuts": "nuts", - "nanaimo-bar-mix": "nanaimo bar mix", - "octopuses": "octopuses", - "oils": "oils", - "olive-oil": "olive oil", - "okra": "okra", - "olive": "olive", - "onion-family": "onion family", - "onion": "onion", - "scallion": "scallion", - "shallot": "shallot", - "spring-onion": "spring onion", - "orange-blossom-water": "orange blossom water", - "oysters": "oysters", - "panch-puran": "panch puran", - "paprika": "paprika", - "parsnip": "parsnip", - "pepper": "pepper", - "peppers": "peppers", - "plantain": "plantain", - "pineapple": "pineapple", - "poppy-seeds": "poppy seeds", - "potatoes": "potatoes", - "poultry": "poultry", - "powdered-sugar": "powdered sugar", - "pumpkin": "pumpkin", - "pumpkin-seeds": "pumpkin seeds", - "radish": "radish", - "raw-sugar": "raw sugar", - "refined-sugar": "refined sugar", - "rice-flour": "rice flour", - "rock-sugar": "rock sugar", - "rum": "rum", - "salt": "salt", - "seafood": "seafood", - "seeds": "seeds", - "sesame-seeds": "sesame seeds", - "sunflower-seeds": "sunflower seeds", - "soda": "soda", - "soda-baking": "soda, baking", - "soybean": "soybean", - "spaghetti-squash": "spaghetti squash", - "spices": "spices", - "spinach": "spinach", - "squash-family": "squash family", - "squash": "squash", - "zucchini": "zucchini", - "sugar": "sugar", - "caster-sugar": "caster sugar", - "granulated-sugar": "granulated sugar", - "superfine-sugar": "superfine sugar", - "turbanado-sugar": "turbanado sugar", - "unrefined-sugar": "unrefined sugar", - "white-sugar": "white sugar", - "sweet-potato": "sweet potato", - "sweeteners": "sweeteners", - "cane-sugar": "cane sugar", - "tahini": "tahini", - "tubers": "tubers", - "potato": "potato", - "sunchoke": "sunchoke", - "taro": "taro", - "yam": "yam", - "turnip": "turnip", - "vanilla": "vanilla", - "vegetables": "vegetables", - "fiddlehead-fern": "fiddlehead fern", - "ful": "ful", - "watercress": "watercress", - "watermelon": "watermelon", - "xanthan-gum": "xanthan gum", - "yeast": "yeast" -} + "acorn-squash": { + "name": "acorn squash" + }, + "alfalfa-sprouts": { + "name": "alfalfa sprouts" + }, + "anchovies": { + "name": "anchovies" + }, + "apples": { + "name": "apples" + }, + "artichoke": { + "name": "artichoke" + }, + "arugula": { + "name": "arugula" + }, + "asparagus": { + "name": "asparagus" + }, + "aubergine": { + "name": "aubergine" + }, + "avocado": { + "name": "avocado" + }, + "bacon": { + "name": "bacon" + }, + "baking-powder": { + "name": "baking powder" + }, + "baking-soda": { + "name": "baking soda" + }, + "baking-sugar": { + "name": "baking sugar" + }, + "bar-sugar": { + "name": "bar sugar" + }, + "basil": { + "name": "basil" + }, + "bell-peppers": { + "name": "bell peppers" + }, + "blackberries": { + "name": "blackberries" + }, + "brassicas": { + "name": "brassicas" + }, + "bok-choy": { + "name": "bok choy" + }, + "broccoflower": { + "name": "broccoflower" + }, + "broccoli": { + "name": "broccoli" + }, + "broccolini": { + "name": "broccolini" + }, + "broccoli-rabe": { + "name": "broccoli rabe" + }, + "brussels-sprouts": { + "name": "brussels sprouts" + }, + "cabbage": { + "name": "cabbage" + }, + "cauliflower": { + "name": "cauliflower" + }, + "chinese-leaves": { + "name": "chinese leaves" + }, + "collard-greens": { + "name": "collard greens" + }, + "kohlrabi": { + "name": "kohlrabi" + }, + "bread": { + "name": "bread" + }, + "breadfruit": { + "name": "breadfruit" + }, + "broad-beans": { + "name": "broad beans" + }, + "brown-sugar": { + "name": "brown sugar" + }, + "butter": { + "name": "butter" + }, + "butternut-pumpkin": { + "name": "butternut pumpkin" + }, + "butternut-squash": { + "name": "butternut squash" + }, + "cactus-edible": { + "name": "cactus, edible" + }, + "calabrese": { + "name": "calabrese" + }, + "cannabis": { + "name": "cannabis" + }, + "capsicum": { + "name": "capsicum" + }, + "caraway": { + "name": "caraway" + }, + "carrot": { + "name": "carrot" + }, + "castor-sugar": { + "name": "castor sugar" + }, + "cayenne-pepper": { + "name": "cayenne pepper" + }, + "celeriac": { + "name": "celeriac" + }, + "celery": { + "name": "celery" + }, + "cereal-grains": { + "name": "cereal grains" + }, + "rice": { + "name": "rice" + }, + "chard": { + "name": "chard" + }, + "cheese": { + "name": "cheese" + }, + "chicory": { + "name": "chicory" + }, + "chilli-peppers": { + "name": "chilli peppers" + }, + "chives": { + "name": "chives" + }, + "chocolate": { + "name": "chocolate" + }, + "cilantro": { + "name": "cilantro" + }, + "cinnamon": { + "name": "cinnamon" + }, + "clarified-butter": { + "name": "clarified butter" + }, + "coconut": { + "name": "coconut" + }, + "coconut-milk": { + "name": "coconut milk" + }, + "coffee": { + "name": "coffee" + }, + "confectioners-sugar": { + "name": "confectioners' sugar" + }, + "coriander": { + "name": "coriander" + }, + "corn": { + "name": "corn" + }, + "corn-syrup": { + "name": "corn syrup" + }, + "cottonseed-oil": { + "name": "cottonseed oil" + }, + "courgette": { + "name": "courgette" + }, + "cream-of-tartar": { + "name": "cream of tartar" + }, + "cucumber": { + "name": "cucumber" + }, + "cumin": { + "name": "cumin" + }, + "daikon": { + "name": "daikon" + }, + "dairy-products-and-dairy-substitutes": { + "name": "dairy products and dairy substitutes" + }, + "eggs": { + "name": "eggs" + }, + "ghee": { + "name": "ghee" + }, + "milk": { + "name": "milk" + }, + "dandelion": { + "name": "dandelion" + }, + "demerara-sugar": { + "name": "demerara sugar" + }, + "dough": { + "name": "dough" + }, + "edible-cactus": { + "name": "edible cactus" + }, + "eggplant": { + "name": "eggplant" + }, + "endive": { + "name": "endive" + }, + "fats": { + "name": "fats" + }, + "speck": { + "name": "speck" + }, + "fava-beans": { + "name": "fava beans" + }, + "fiddlehead": { + "name": "fiddlehead" + }, + "fish": { + "name": "fish" + }, + "catfish": { + "name": "catfish " + }, + "cod": { + "name": "cod" + }, + "salt-cod": { + "name": "salt cod" + }, + "salmon": { + "name": "salmon" + }, + "skate": { + "name": "skate" + }, + "stockfish": { + "name": "stockfish" + }, + "trout": { + "name": "trout" + }, + "tuna": { + "name": "tuna" + }, + "five-spice-powder": { + "name": "five spice powder" + }, + "flour": { + "name": "flour" + }, + "frisee": { + "name": "frisee" + }, + "fructose": { + "name": "fructose" + }, + "fruit": { + "name": "fruit" + }, + "apple": { + "name": "apple" + }, + "oranges": { + "name": "oranges" + }, + "pear": { + "name": "pear" + }, + "tomato": { + "name": "tomato " + }, + "fruit-sugar": { + "name": "fruit sugar" + }, + "garam-masala": { + "name": "garam masala" + }, + "garlic": { + "name": "garlic" + }, + "gem-squash": { + "name": "gem squash" + }, + "ginger": { + "name": "ginger" + }, + "giblets": { + "name": "giblets" + }, + "grains": { + "name": "grains" + }, + "maize": { + "name": "maize" + }, + "sweetcorn": { + "name": "sweetcorn" + }, + "teff": { + "name": "teff" + }, + "grape-seed-oil": { + "name": "grape seed oil" + }, + "green-onion": { + "name": "green onion" + }, + "heart-of-palm": { + "name": "heart of palm" + }, + "hemp": { + "name": "hemp" + }, + "herbs": { + "name": "herbs" + }, + "oregano": { + "name": "oregano" + }, + "parsley": { + "name": "parsley" + }, + "honey": { + "name": "honey" + }, + "icing-sugar": { + "name": "icing sugar" + }, + "isomalt": { + "name": "isomalt" + }, + "jackfruit": { + "name": "jackfruit" + }, + "jaggery": { + "name": "jaggery" + }, + "jams": { + "name": "jams" + }, + "jellies": { + "name": "jellies" + }, + "jerusalem-artichoke": { + "name": "jerusalem artichoke" + }, + "jicama": { + "name": "jicama" + }, + "kale": { + "name": "kale" + }, + "kumara": { + "name": "kumara" + }, + "leavening-agents": { + "name": "leavening agents" + }, + "leek": { + "name": "leek" + }, + "legumes": { + "name": "legumes " + }, + "peas": { + "name": "peas" + }, + "beans": { + "name": "beans" + }, + "lentils": { + "name": "lentils" + }, + "lemongrass": { + "name": "lemongrass" + }, + "lettuce": { + "name": "lettuce" + }, + "liver": { + "name": "liver" + }, + "maple-syrup": { + "name": "maple syrup" + }, + "meat": { + "name": "meat" + }, + "mortadella": { + "name": "mortadella" + }, + "mushroom": { + "name": "mushroom" + }, + "white-mushroom": { + "name": "white mushroom" + }, + "mussels": { + "name": "mussels" + }, + "nori": { + "name": "nori" + }, + "nutmeg": { + "name": "nutmeg" + }, + "nutritional-yeast-flakes": { + "name": "nutritional yeast flakes" + }, + "nuts": { + "name": "nuts" + }, + "nanaimo-bar-mix": { + "name": "nanaimo bar mix" + }, + "octopuses": { + "name": "octopuses" + }, + "oils": { + "name": "oils" + }, + "olive-oil": { + "name": "olive oil" + }, + "okra": { + "name": "okra" + }, + "olive": { + "name": "olive" + }, + "onion-family": { + "name": "onion family" + }, + "onion": { + "name": "onion" + }, + "scallion": { + "name": "scallion" + }, + "shallot": { + "name": "shallot" + }, + "spring-onion": { + "name": "spring onion" + }, + "orange-blossom-water": { + "name": "orange blossom water" + }, + "oysters": { + "name": "oysters" + }, + "panch-puran": { + "name": "panch puran" + }, + "paprika": { + "name": "paprika" + }, + "parsnip": { + "name": "parsnip" + }, + "pepper": { + "name": "pepper" + }, + "peppers": { + "name": "peppers" + }, + "plantain": { + "name": "plantain" + }, + "pineapple": { + "name": "pineapple" + }, + "poppy-seeds": { + "name": "poppy seeds" + }, + "potatoes": { + "name": "potatoes" + }, + "poultry": { + "name": "poultry" + }, + "powdered-sugar": { + "name": "powdered sugar" + }, + "pumpkin": { + "name": "pumpkin" + }, + "pumpkin-seeds": { + "name": "pumpkin seeds" + }, + "radish": { + "name": "radish" + }, + "raw-sugar": { + "name": "raw sugar" + }, + "refined-sugar": { + "name": "refined sugar" + }, + "rice-flour": { + "name": "rice flour" + }, + "rock-sugar": { + "name": "rock sugar" + }, + "rum": { + "name": "rum" + }, + "salt": { + "name": "salt" + }, + "seafood": { + "name": "seafood" + }, + "seeds": { + "name": "seeds" + }, + "sesame-seeds": { + "name": "sesame seeds" + }, + "sunflower-seeds": { + "name": "sunflower seeds" + }, + "soda": { + "name": "soda" + }, + "soda-baking": { + "name": "soda, baking" + }, + "soybean": { + "name": "soybean" + }, + "spaghetti-squash": { + "name": "spaghetti squash" + }, + "spices": { + "name": "spices" + }, + "spinach": { + "name": "spinach" + }, + "squash-family": { + "name": "squash family" + }, + "squash": { + "name": "squash" + }, + "zucchini": { + "name": "zucchini" + }, + "sugar": { + "name": "sugar" + }, + "caster-sugar": { + "name": "caster sugar" + }, + "granulated-sugar": { + "name": "granulated sugar" + }, + "superfine-sugar": { + "name": "superfine sugar" + }, + "turbanado-sugar": { + "name": "turbanado sugar" + }, + "unrefined-sugar": { + "name": "unrefined sugar" + }, + "white-sugar": { + "name": "white sugar" + }, + "sweet-potato": { + "name": "sweet potato" + }, + "sweeteners": { + "name": "sweeteners" + }, + "cane-sugar": { + "name": "cane sugar" + }, + "tahini": { + "name": "tahini" + }, + "tubers": { + "name": "tubers" + }, + "potato": { + "name": "potato" + }, + "sunchoke": { + "name": "sunchoke" + }, + "taro": { + "name": "taro" + }, + "yam": { + "name": "yam" + }, + "turnip": { + "name": "turnip" + }, + "vanilla": { + "name": "vanilla" + }, + "vegetables": { + "name": "vegetables" + }, + "fiddlehead-fern": { + "name": "fiddlehead fern" + }, + "ful": { + "name": "ful" + }, + "watercress": { + "name": "watercress" + }, + "watermelon": { + "name": "watermelon" + }, + "xanthan-gum": { + "name": "xanthan gum" + }, + "yeast": { + "name": "yeast" + } +} \ No newline at end of file diff --git a/mealie/repos/seed/seeders.py b/mealie/repos/seed/seeders.py index 3d3cff111a2..0eb723bf4bd 100644 --- a/mealie/repos/seed/seeders.py +++ b/mealie/repos/seed/seeders.py @@ -83,11 +83,16 @@ def get_file(self, locale: str | None = None) -> pathlib.Path: def load_data(self, locale: str | None = None) -> Generator[SaveIngredientFood, None, None]: file = self.get_file(locale) - seed_foods: dict[str, str] = json.loads(file.read_text(encoding="utf-8")) - for food in set(seed_foods.values()): + seen_foods_names = set() + for food in json.loads(file.read_text(encoding="utf-8")).values(): + if food["name"] in seen_foods_names: + continue + + seen_foods_names.add(food["name"]) yield SaveIngredientFood( group_id=self.repos.group_id, - name=food, + name=food["name"], + plural_name=food.get("plural_name"), description="", ) From ef9955d5b8746765e7f13144dc5ab426932bd7e4 Mon Sep 17 00:00:00 2001 From: Brian Choromanski Date: Fri, 30 Aug 2024 21:55:20 -0400 Subject: [PATCH 002/102] Fixed some issues, and added plurals for all items that might be the unit --- .../seed/resources/foods/locales/en-US.json | 157 +++++++++++------- 1 file changed, 100 insertions(+), 57 deletions(-) diff --git a/mealie/repos/seed/resources/foods/locales/en-US.json b/mealie/repos/seed/resources/foods/locales/en-US.json index 44c93d13bf8..ac50530db14 100644 --- a/mealie/repos/seed/resources/foods/locales/en-US.json +++ b/mealie/repos/seed/resources/foods/locales/en-US.json @@ -9,7 +9,8 @@ "name": "anchovies" }, "apples": { - "name": "apples" + "name": "apple", + "plural_name": "apples" }, "artichoke": { "name": "artichoke" @@ -24,7 +25,8 @@ "name": "aubergine" }, "avocado": { - "name": "avocado" + "name": "avocado", + "plural_name": "avocado" }, "bacon": { "name": "bacon" @@ -45,7 +47,8 @@ "name": "basil" }, "bell-peppers": { - "name": "bell peppers" + "name": "bell peppers", + "plural_name": "bell peppers" }, "blackberries": { "name": "blackberries" @@ -72,10 +75,12 @@ "name": "brussels sprouts" }, "cabbage": { - "name": "cabbage" + "name": "cabbage", + "plural_name": "cabbages" }, "cauliflower": { - "name": "cauliflower" + "name": "cauliflower", + "plural_name": "cauliflowers" }, "chinese-leaves": { "name": "chinese leaves" @@ -123,7 +128,8 @@ "name": "caraway" }, "carrot": { - "name": "carrot" + "name": "carrot", + "plural_name": "carrots" }, "castor-sugar": { "name": "castor sugar" @@ -153,7 +159,8 @@ "name": "chicory" }, "chilli-peppers": { - "name": "chilli peppers" + "name": "chilli pepper", + "plural_name": "chilli peppers" }, "chives": { "name": "chives" @@ -171,7 +178,8 @@ "name": "clarified butter" }, "coconut": { - "name": "coconut" + "name": "coconut", + "plural_name": "coconuts" }, "coconut-milk": { "name": "coconut milk" @@ -186,7 +194,8 @@ "name": "coriander" }, "corn": { - "name": "corn" + "name": "corn", + "plural_name": "corns" }, "corn-syrup": { "name": "corn syrup" @@ -201,19 +210,22 @@ "name": "cream of tartar" }, "cucumber": { - "name": "cucumber" + "name": "cucumber", + "plural_name": "cucumbers" }, "cumin": { "name": "cumin" }, "daikon": { - "name": "daikon" + "name": "daikon", + "plural_name": "daikons" }, "dairy-products-and-dairy-substitutes": { "name": "dairy products and dairy substitutes" }, "eggs": { - "name": "eggs" + "name": "egg", + "plural_name": "eggs" }, "ghee": { "name": "ghee" @@ -234,10 +246,12 @@ "name": "edible cactus" }, "eggplant": { - "name": "eggplant" + "name": "eggplant", + "plural_name": "eggplants" }, "endive": { - "name": "endive" + "name": "endive", + "plural_name": "endives" }, "fats": { "name": "fats" @@ -255,7 +269,7 @@ "name": "fish" }, "catfish": { - "name": "catfish " + "name": "catfish" }, "cod": { "name": "cod" @@ -293,17 +307,17 @@ "fruit": { "name": "fruit" }, - "apple": { - "name": "apple" - }, "oranges": { - "name": "oranges" + "name": "orange", + "plural_name": "oranges" }, "pear": { - "name": "pear" + "name": "pear", + "plural_name": "pears" }, "tomato": { - "name": "tomato " + "name": "tomato", + "plural_name": "tomatoes" }, "fruit-sugar": { "name": "fruit sugar" @@ -312,7 +326,8 @@ "name": "garam masala" }, "garlic": { - "name": "garlic" + "name": "garlic", + "plural_name": "garlics" }, "gem-squash": { "name": "gem squash" @@ -330,7 +345,8 @@ "name": "maize" }, "sweetcorn": { - "name": "sweetcorn" + "name": "sweetcorn", + "plural_name": "sweetcorns" }, "teff": { "name": "teff" @@ -339,10 +355,12 @@ "name": "grape seed oil" }, "green-onion": { - "name": "green onion" + "name": "green onion", + "plural_name": "green onions" }, "heart-of-palm": { - "name": "heart of palm" + "name": "heart of palm", + "plural_name": "heart of palms" }, "hemp": { "name": "hemp" @@ -366,7 +384,8 @@ "name": "isomalt" }, "jackfruit": { - "name": "jackfruit" + "name": "jackfruit", + "plural_name": "jackfruits" }, "jaggery": { "name": "jaggery" @@ -393,10 +412,11 @@ "name": "leavening agents" }, "leek": { - "name": "leek" + "name": "leek", + "plural_name": "leeks" }, "legumes": { - "name": "legumes " + "name": "legumes" }, "peas": { "name": "peas" @@ -414,7 +434,8 @@ "name": "lettuce" }, "liver": { - "name": "liver" + "name": "liver", + "plural_name": "livers" }, "maple-syrup": { "name": "maple syrup" @@ -426,10 +447,12 @@ "name": "mortadella" }, "mushroom": { - "name": "mushroom" + "name": "mushroom", + "plural_name": "mushrooms" }, "white-mushroom": { - "name": "white mushroom" + "name": "white mushroom", + "plural_name": "white mushrooms" }, "mussels": { "name": "mussels" @@ -450,7 +473,8 @@ "name": "nanaimo bar mix" }, "octopuses": { - "name": "octopuses" + "name": "octopuse", + "plural_name": "octopuses" }, "oils": { "name": "oils" @@ -471,13 +495,16 @@ "name": "onion" }, "scallion": { - "name": "scallion" + "name": "scallion", + "plural_name": "scallions" }, "shallot": { - "name": "shallot" + "name": "shallot", + "plural_name": "shallots" }, "spring-onion": { - "name": "spring onion" + "name": "spring onion", + "plural_name": "spring onions" }, "orange-blossom-water": { "name": "orange blossom water" @@ -492,25 +519,27 @@ "name": "paprika" }, "parsnip": { - "name": "parsnip" + "name": "parsnip", + "plural_name": "parsnips" }, "pepper": { - "name": "pepper" - }, - "peppers": { - "name": "peppers" + "name": "pepper", + "plural_name": "peppers" }, "plantain": { - "name": "plantain" + "name": "plantain", + "plural_name": "plantains" }, "pineapple": { - "name": "pineapple" + "name": "pineapple", + "plural_name": "pineapples" }, "poppy-seeds": { "name": "poppy seeds" }, "potatoes": { - "name": "potatoes" + "name": "potatoe", + "plural_name": "potatoes" }, "poultry": { "name": "poultry" @@ -519,13 +548,15 @@ "name": "powdered sugar" }, "pumpkin": { - "name": "pumpkin" + "name": "pumpkin", + "plural_name": "pumpkins" }, "pumpkin-seeds": { "name": "pumpkin seeds" }, "radish": { - "name": "radish" + "name": "radish", + "plural_name": "radishes" }, "raw-sugar": { "name": "raw sugar" @@ -567,7 +598,8 @@ "name": "soybean" }, "spaghetti-squash": { - "name": "spaghetti squash" + "name": "spaghetti squash", + "plural_name": "spaghetti squashes" }, "spices": { "name": "spices" @@ -579,10 +611,12 @@ "name": "squash family" }, "squash": { - "name": "squash" + "name": "squash", + "plural_name": "squashes" }, "zucchini": { - "name": "zucchini" + "name": "zucchini", + "plural_name": "zucchinis" }, "sugar": { "name": "sugar" @@ -606,7 +640,8 @@ "name": "white sugar" }, "sweet-potato": { - "name": "sweet potato" + "name": "sweet potato", + "plural_name": "sweet potatoes" }, "sweeteners": { "name": "sweeteners" @@ -618,22 +653,28 @@ "name": "tahini" }, "tubers": { - "name": "tubers" + "name": "tuber", + "plural_name": "tubers" }, "potato": { - "name": "potato" + "name": "potato", + "plural_name": "potatoes" }, "sunchoke": { - "name": "sunchoke" + "name": "sunchoke", + "plural_name": "sunchokes" }, "taro": { - "name": "taro" + "name": "taro", + "plural_name": "taroes" }, "yam": { - "name": "yam" + "name": "yam", + "plural_name": "yams" }, "turnip": { - "name": "turnip" + "name": "turnip", + "plural_name": "turnips" }, "vanilla": { "name": "vanilla" @@ -642,7 +683,8 @@ "name": "vegetables" }, "fiddlehead-fern": { - "name": "fiddlehead fern" + "name": "fiddlehead fern", + "plural_name": "fiddlehead ferns" }, "ful": { "name": "ful" @@ -651,7 +693,8 @@ "name": "watercress" }, "watermelon": { - "name": "watermelon" + "name": "watermelon", + "plural_name": "watermelons" }, "xanthan-gum": { "name": "xanthan gum" From e9c0637d23a60f989b7f708f5024b2c57a4e9ebc Mon Sep 17 00:00:00 2001 From: Brian Choromanski Date: Fri, 30 Aug 2024 21:59:21 -0400 Subject: [PATCH 003/102] Sorted the foods --- .../seed/resources/foods/locales/en-US.json | 362 +++++++++--------- 1 file changed, 181 insertions(+), 181 deletions(-) diff --git a/mealie/repos/seed/resources/foods/locales/en-US.json b/mealie/repos/seed/resources/foods/locales/en-US.json index ac50530db14..b0d669eda05 100644 --- a/mealie/repos/seed/resources/foods/locales/en-US.json +++ b/mealie/repos/seed/resources/foods/locales/en-US.json @@ -46,6 +46,9 @@ "basil": { "name": "basil" }, + "beans": { + "name": "beans" + }, "bell-peppers": { "name": "bell peppers", "plural_name": "bell peppers" @@ -53,11 +56,20 @@ "blackberries": { "name": "blackberries" }, + "bok-choy": { + "name": "bok choy" + }, "brassicas": { "name": "brassicas" }, - "bok-choy": { - "name": "bok choy" + "bread": { + "name": "bread" + }, + "breadfruit": { + "name": "breadfruit" + }, + "broad-beans": { + "name": "broad beans" }, "broccoflower": { "name": "broccoflower" @@ -65,44 +77,18 @@ "broccoli": { "name": "broccoli" }, - "broccolini": { - "name": "broccolini" - }, "broccoli-rabe": { "name": "broccoli rabe" }, - "brussels-sprouts": { - "name": "brussels sprouts" - }, - "cabbage": { - "name": "cabbage", - "plural_name": "cabbages" - }, - "cauliflower": { - "name": "cauliflower", - "plural_name": "cauliflowers" - }, - "chinese-leaves": { - "name": "chinese leaves" - }, - "collard-greens": { - "name": "collard greens" - }, - "kohlrabi": { - "name": "kohlrabi" - }, - "bread": { - "name": "bread" - }, - "breadfruit": { - "name": "breadfruit" - }, - "broad-beans": { - "name": "broad beans" + "broccolini": { + "name": "broccolini" }, "brown-sugar": { "name": "brown sugar" }, + "brussels-sprouts": { + "name": "brussels sprouts" + }, "butter": { "name": "butter" }, @@ -112,12 +98,19 @@ "butternut-squash": { "name": "butternut squash" }, + "cabbage": { + "name": "cabbage", + "plural_name": "cabbages" + }, "cactus-edible": { "name": "cactus, edible" }, "calabrese": { "name": "calabrese" }, + "cane-sugar": { + "name": "cane sugar" + }, "cannabis": { "name": "cannabis" }, @@ -131,9 +124,19 @@ "name": "carrot", "plural_name": "carrots" }, + "caster-sugar": { + "name": "caster sugar" + }, "castor-sugar": { "name": "castor sugar" }, + "catfish": { + "name": "catfish" + }, + "cauliflower": { + "name": "cauliflower", + "plural_name": "cauliflowers" + }, "cayenne-pepper": { "name": "cayenne pepper" }, @@ -146,9 +149,6 @@ "cereal-grains": { "name": "cereal grains" }, - "rice": { - "name": "rice" - }, "chard": { "name": "chard" }, @@ -162,6 +162,9 @@ "name": "chilli pepper", "plural_name": "chilli peppers" }, + "chinese-leaves": { + "name": "chinese leaves" + }, "chives": { "name": "chives" }, @@ -184,9 +187,15 @@ "coconut-milk": { "name": "coconut milk" }, + "cod": { + "name": "cod" + }, "coffee": { "name": "coffee" }, + "collard-greens": { + "name": "collard greens" + }, "confectioners-sugar": { "name": "confectioners' sugar" }, @@ -223,16 +232,6 @@ "dairy-products-and-dairy-substitutes": { "name": "dairy products and dairy substitutes" }, - "eggs": { - "name": "egg", - "plural_name": "eggs" - }, - "ghee": { - "name": "ghee" - }, - "milk": { - "name": "milk" - }, "dandelion": { "name": "dandelion" }, @@ -249,6 +248,10 @@ "name": "eggplant", "plural_name": "eggplants" }, + "eggs": { + "name": "egg", + "plural_name": "eggs" + }, "endive": { "name": "endive", "plural_name": "endives" @@ -256,42 +259,19 @@ "fats": { "name": "fats" }, - "speck": { - "name": "speck" - }, "fava-beans": { "name": "fava beans" }, "fiddlehead": { "name": "fiddlehead" }, + "fiddlehead-fern": { + "name": "fiddlehead fern", + "plural_name": "fiddlehead ferns" + }, "fish": { "name": "fish" }, - "catfish": { - "name": "catfish" - }, - "cod": { - "name": "cod" - }, - "salt-cod": { - "name": "salt cod" - }, - "salmon": { - "name": "salmon" - }, - "skate": { - "name": "skate" - }, - "stockfish": { - "name": "stockfish" - }, - "trout": { - "name": "trout" - }, - "tuna": { - "name": "tuna" - }, "five-spice-powder": { "name": "five spice powder" }, @@ -307,21 +287,12 @@ "fruit": { "name": "fruit" }, - "oranges": { - "name": "orange", - "plural_name": "oranges" - }, - "pear": { - "name": "pear", - "plural_name": "pears" - }, - "tomato": { - "name": "tomato", - "plural_name": "tomatoes" - }, "fruit-sugar": { "name": "fruit sugar" }, + "ful": { + "name": "ful" + }, "garam-masala": { "name": "garam masala" }, @@ -332,24 +303,20 @@ "gem-squash": { "name": "gem squash" }, - "ginger": { - "name": "ginger" + "ghee": { + "name": "ghee" }, "giblets": { "name": "giblets" }, + "ginger": { + "name": "ginger" + }, "grains": { "name": "grains" }, - "maize": { - "name": "maize" - }, - "sweetcorn": { - "name": "sweetcorn", - "plural_name": "sweetcorns" - }, - "teff": { - "name": "teff" + "granulated-sugar": { + "name": "granulated sugar" }, "grape-seed-oil": { "name": "grape seed oil" @@ -368,12 +335,6 @@ "herbs": { "name": "herbs" }, - "oregano": { - "name": "oregano" - }, - "parsley": { - "name": "parsley" - }, "honey": { "name": "honey" }, @@ -405,6 +366,9 @@ "kale": { "name": "kale" }, + "kohlrabi": { + "name": "kohlrabi" + }, "kumara": { "name": "kumara" }, @@ -418,18 +382,12 @@ "legumes": { "name": "legumes" }, - "peas": { - "name": "peas" - }, - "beans": { - "name": "beans" + "lemongrass": { + "name": "lemongrass" }, "lentils": { "name": "lentils" }, - "lemongrass": { - "name": "lemongrass" - }, "lettuce": { "name": "lettuce" }, @@ -437,12 +395,18 @@ "name": "liver", "plural_name": "livers" }, + "maize": { + "name": "maize" + }, "maple-syrup": { "name": "maple syrup" }, "meat": { "name": "meat" }, + "milk": { + "name": "milk" + }, "mortadella": { "name": "mortadella" }, @@ -450,13 +414,12 @@ "name": "mushroom", "plural_name": "mushrooms" }, - "white-mushroom": { - "name": "white mushroom", - "plural_name": "white mushrooms" - }, "mussels": { "name": "mussels" }, + "nanaimo-bar-mix": { + "name": "nanaimo bar mix" + }, "nori": { "name": "nori" }, @@ -469,9 +432,6 @@ "nuts": { "name": "nuts" }, - "nanaimo-bar-mix": { - "name": "nanaimo bar mix" - }, "octopuses": { "name": "octopuse", "plural_name": "octopuses" @@ -479,36 +439,31 @@ "oils": { "name": "oils" }, - "olive-oil": { - "name": "olive oil" - }, "okra": { "name": "okra" }, "olive": { "name": "olive" }, - "onion-family": { - "name": "onion family" + "olive-oil": { + "name": "olive oil" }, "onion": { "name": "onion" }, - "scallion": { - "name": "scallion", - "plural_name": "scallions" - }, - "shallot": { - "name": "shallot", - "plural_name": "shallots" - }, - "spring-onion": { - "name": "spring onion", - "plural_name": "spring onions" + "onion-family": { + "name": "onion family" }, "orange-blossom-water": { "name": "orange blossom water" }, + "oranges": { + "name": "orange", + "plural_name": "oranges" + }, + "oregano": { + "name": "oregano" + }, "oysters": { "name": "oysters" }, @@ -518,25 +473,39 @@ "paprika": { "name": "paprika" }, + "parsley": { + "name": "parsley" + }, "parsnip": { "name": "parsnip", "plural_name": "parsnips" }, + "pear": { + "name": "pear", + "plural_name": "pears" + }, + "peas": { + "name": "peas" + }, "pepper": { "name": "pepper", "plural_name": "peppers" }, - "plantain": { - "name": "plantain", - "plural_name": "plantains" - }, "pineapple": { "name": "pineapple", "plural_name": "pineapples" }, + "plantain": { + "name": "plantain", + "plural_name": "plantains" + }, "poppy-seeds": { "name": "poppy seeds" }, + "potato": { + "name": "potato", + "plural_name": "potatoes" + }, "potatoes": { "name": "potatoe", "plural_name": "potatoes" @@ -564,6 +533,9 @@ "refined-sugar": { "name": "refined sugar" }, + "rice": { + "name": "rice" + }, "rice-flour": { "name": "rice flour" }, @@ -573,9 +545,19 @@ "rum": { "name": "rum" }, + "salmon": { + "name": "salmon" + }, "salt": { "name": "salt" }, + "salt-cod": { + "name": "salt cod" + }, + "scallion": { + "name": "scallion", + "plural_name": "scallions" + }, "seafood": { "name": "seafood" }, @@ -585,8 +567,12 @@ "sesame-seeds": { "name": "sesame seeds" }, - "sunflower-seeds": { - "name": "sunflower seeds" + "shallot": { + "name": "shallot", + "plural_name": "shallots" + }, + "skate": { + "name": "skate" }, "soda": { "name": "soda" @@ -601,94 +587,93 @@ "name": "spaghetti squash", "plural_name": "spaghetti squashes" }, + "speck": { + "name": "speck" + }, "spices": { "name": "spices" }, "spinach": { "name": "spinach" }, - "squash-family": { - "name": "squash family" + "spring-onion": { + "name": "spring onion", + "plural_name": "spring onions" }, "squash": { "name": "squash", "plural_name": "squashes" }, - "zucchini": { - "name": "zucchini", - "plural_name": "zucchinis" + "squash-family": { + "name": "squash family" + }, + "stockfish": { + "name": "stockfish" }, "sugar": { "name": "sugar" }, - "caster-sugar": { - "name": "caster sugar" + "sunchoke": { + "name": "sunchoke", + "plural_name": "sunchokes" }, - "granulated-sugar": { - "name": "granulated sugar" + "sunflower-seeds": { + "name": "sunflower seeds" }, "superfine-sugar": { "name": "superfine sugar" }, - "turbanado-sugar": { - "name": "turbanado sugar" - }, - "unrefined-sugar": { - "name": "unrefined sugar" - }, - "white-sugar": { - "name": "white sugar" - }, "sweet-potato": { "name": "sweet potato", "plural_name": "sweet potatoes" }, + "sweetcorn": { + "name": "sweetcorn", + "plural_name": "sweetcorns" + }, "sweeteners": { "name": "sweeteners" }, - "cane-sugar": { - "name": "cane sugar" - }, "tahini": { "name": "tahini" }, + "taro": { + "name": "taro", + "plural_name": "taroes" + }, + "teff": { + "name": "teff" + }, + "tomato": { + "name": "tomato", + "plural_name": "tomatoes" + }, + "trout": { + "name": "trout" + }, "tubers": { "name": "tuber", "plural_name": "tubers" }, - "potato": { - "name": "potato", - "plural_name": "potatoes" - }, - "sunchoke": { - "name": "sunchoke", - "plural_name": "sunchokes" - }, - "taro": { - "name": "taro", - "plural_name": "taroes" + "tuna": { + "name": "tuna" }, - "yam": { - "name": "yam", - "plural_name": "yams" + "turbanado-sugar": { + "name": "turbanado sugar" }, "turnip": { "name": "turnip", "plural_name": "turnips" }, + "unrefined-sugar": { + "name": "unrefined sugar" + }, "vanilla": { "name": "vanilla" }, "vegetables": { "name": "vegetables" }, - "fiddlehead-fern": { - "name": "fiddlehead fern", - "plural_name": "fiddlehead ferns" - }, - "ful": { - "name": "ful" - }, "watercress": { "name": "watercress" }, @@ -696,10 +681,25 @@ "name": "watermelon", "plural_name": "watermelons" }, + "white-mushroom": { + "name": "white mushroom", + "plural_name": "white mushrooms" + }, + "white-sugar": { + "name": "white sugar" + }, "xanthan-gum": { "name": "xanthan gum" }, + "yam": { + "name": "yam", + "plural_name": "yams" + }, "yeast": { "name": "yeast" + }, + "zucchini": { + "name": "zucchini", + "plural_name": "zucchinis" } } \ No newline at end of file From 4358b7aa8f5f7d01f2affebe8dcd8fbffc9666e9 Mon Sep 17 00:00:00 2001 From: Brian Choromanski Date: Fri, 30 Aug 2024 22:09:49 -0400 Subject: [PATCH 004/102] Removed UK language should be in en-UK, ignored Scallions, green onions & spring onions --- mealie/repos/seed/resources/foods/locales/en-US.json | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/mealie/repos/seed/resources/foods/locales/en-US.json b/mealie/repos/seed/resources/foods/locales/en-US.json index b0d669eda05..e9fcc147757 100644 --- a/mealie/repos/seed/resources/foods/locales/en-US.json +++ b/mealie/repos/seed/resources/foods/locales/en-US.json @@ -21,9 +21,6 @@ "asparagus": { "name": "asparagus" }, - "aubergine": { - "name": "aubergine" - }, "avocado": { "name": "avocado", "plural_name": "avocado" @@ -68,9 +65,6 @@ "breadfruit": { "name": "breadfruit" }, - "broad-beans": { - "name": "broad beans" - }, "broccoflower": { "name": "broccoflower" }, @@ -141,7 +135,7 @@ "name": "cayenne pepper" }, "celeriac": { - "name": "celeriac" + "name": "celery root" }, "celery": { "name": "celery" @@ -338,9 +332,6 @@ "honey": { "name": "honey" }, - "icing-sugar": { - "name": "icing sugar" - }, "isomalt": { "name": "isomalt" }, From aba04402710963e4b8df9aa115d6c3b9850e703b Mon Sep 17 00:00:00 2001 From: Brian Choromanski Date: Fri, 30 Aug 2024 22:15:42 -0400 Subject: [PATCH 005/102] Removed spacing for CI --- mealie/repos/seed/seeders.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mealie/repos/seed/seeders.py b/mealie/repos/seed/seeders.py index 0eb723bf4bd..e85df34c7a1 100644 --- a/mealie/repos/seed/seeders.py +++ b/mealie/repos/seed/seeders.py @@ -87,7 +87,7 @@ def load_data(self, locale: str | None = None) -> Generator[SaveIngredientFood, for food in json.loads(file.read_text(encoding="utf-8")).values(): if food["name"] in seen_foods_names: continue - + seen_foods_names.add(food["name"]) yield SaveIngredientFood( group_id=self.repos.group_id, From 544634f7ec19a9b58304a39e3922fa6ee66debbe Mon Sep 17 00:00:00 2001 From: Brian Choromanski Date: Fri, 30 Aug 2024 22:39:13 -0400 Subject: [PATCH 006/102] Updated test_seed_foods to reflect the new number of foods in the seed data --- tests/integration_tests/user_group_tests/test_group_seeder.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration_tests/user_group_tests/test_group_seeder.py b/tests/integration_tests/user_group_tests/test_group_seeder.py index 80eb47bd88d..0070d050533 100644 --- a/tests/integration_tests/user_group_tests/test_group_seeder.py +++ b/tests/integration_tests/user_group_tests/test_group_seeder.py @@ -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): - CREATED_FOODS = 220 + CREATED_FOODS = 215 database = unique_user.repos # Check that the foods was created From 592cdec5009fd0852b650af31919fbf4eb07ebb7 Mon Sep 17 00:00:00 2001 From: Brian Choromanski Date: Fri, 30 Aug 2024 22:40:59 -0400 Subject: [PATCH 007/102] Fixed comments in test_group_seeder.py --- .../user_group_tests/test_group_seeder.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/integration_tests/user_group_tests/test_group_seeder.py b/tests/integration_tests/user_group_tests/test_group_seeder.py index 0070d050533..4fb4f9ff603 100644 --- a/tests/integration_tests/user_group_tests/test_group_seeder.py +++ b/tests/integration_tests/user_group_tests/test_group_seeder.py @@ -15,14 +15,14 @@ def test_seed_foods(api_client: TestClient, unique_user: TestUser): CREATED_FOODS = 215 database = unique_user.repos - # Check that the foods was created + # Check that the foods were created foods = database.ingredient_foods.page_all(PaginationQuery(page=1, per_page=-1)).items assert len(foods) == 0 resp = api_client.post(api_routes.groups_seeders_foods, json={"locale": "en-US"}, headers=unique_user.token) assert resp.status_code == 200 - # Check that the foods was created + # Check that the foods were created foods = database.ingredient_foods.page_all(PaginationQuery(page=1, per_page=-1)).items assert len(foods) == CREATED_FOODS @@ -31,14 +31,14 @@ def test_seed_units(api_client: TestClient, unique_user: TestUser): CREATED_UNITS = 23 database = unique_user.repos - # Check that the foods was created + # Check that the units were created units = database.ingredient_units.page_all(PaginationQuery(page=1, per_page=-1)).items assert len(units) == 0 resp = api_client.post(api_routes.groups_seeders_units, json={"locale": "en-US"}, headers=unique_user.token) assert resp.status_code == 200 - # Check that the foods was created + # Check that the units were created units = database.ingredient_units.page_all(PaginationQuery(page=1, per_page=-1)).items assert len(units) == CREATED_UNITS @@ -47,13 +47,13 @@ def test_seed_labels(api_client: TestClient, unique_user: TestUser): CREATED_LABELS = 21 database = unique_user.repos - # Check that the foods was created + # Check that the labels were created labels = database.group_multi_purpose_labels.page_all(PaginationQuery(page=1, per_page=-1)).items assert len(labels) == 0 resp = api_client.post(api_routes.groups_seeders_labels, json={"locale": "en-US"}, headers=unique_user.token) assert resp.status_code == 200 - # Check that the foods was created + # Check that the labels were created labels = database.group_multi_purpose_labels.page_all(PaginationQuery(page=1, per_page=-1)).items assert len(labels) == CREATED_LABELS From 21981725e464bd37ea2d64ca79858e79f7476d95 Mon Sep 17 00:00:00 2001 From: Brian Choromanski Date: Fri, 30 Aug 2024 22:49:55 -0400 Subject: [PATCH 008/102] Removed exta potato that I missed --- mealie/repos/seed/resources/foods/locales/en-US.json | 4 ---- tests/integration_tests/user_group_tests/test_group_seeder.py | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/mealie/repos/seed/resources/foods/locales/en-US.json b/mealie/repos/seed/resources/foods/locales/en-US.json index e9fcc147757..356aa2abb86 100644 --- a/mealie/repos/seed/resources/foods/locales/en-US.json +++ b/mealie/repos/seed/resources/foods/locales/en-US.json @@ -497,10 +497,6 @@ "name": "potato", "plural_name": "potatoes" }, - "potatoes": { - "name": "potatoe", - "plural_name": "potatoes" - }, "poultry": { "name": "poultry" }, diff --git a/tests/integration_tests/user_group_tests/test_group_seeder.py b/tests/integration_tests/user_group_tests/test_group_seeder.py index 4fb4f9ff603..54e360eb892 100644 --- a/tests/integration_tests/user_group_tests/test_group_seeder.py +++ b/tests/integration_tests/user_group_tests/test_group_seeder.py @@ -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): - CREATED_FOODS = 215 + CREATED_FOODS = 214 database = unique_user.repos # Check that the foods were created From 996e9b17c798736ca92c9a5796695f4c0f5dfe13 Mon Sep 17 00:00:00 2001 From: Brian Choromanski Date: Mon, 2 Sep 2024 20:01:21 -0400 Subject: [PATCH 009/102] fix: PWA respects orientation lock (#4143) --- frontend/nuxt.config.js | 1 - 1 file changed, 1 deletion(-) diff --git a/frontend/nuxt.config.js b/frontend/nuxt.config.js index 8474a39d986..59cb9086417 100644 --- a/frontend/nuxt.config.js +++ b/frontend/nuxt.config.js @@ -492,7 +492,6 @@ export default { ], prefer_related_applications: false, handle_links: "preferred", - orientation: "any", categories: [ "food" ], From c0fe1cdcab8e815f6832b90c4df9862c5072cfbd Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 3 Sep 2024 13:56:25 -0500 Subject: [PATCH 010/102] fix(deps): update dependency sqlalchemy to v2.0.33 (#4149) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 52 ++-------------------------------------------------- 1 file changed, 2 insertions(+), 50 deletions(-) diff --git a/poetry.lock b/poetry.lock index debc196b9f4..28a0937681e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2919,60 +2919,12 @@ files = [ [[package]] name = "sqlalchemy" -version = "2.0.32" +version = "2.0.33" description = "Database Abstraction Library" optional = false python-versions = ">=3.7" files = [ - {file = "SQLAlchemy-2.0.32-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0c9045ecc2e4db59bfc97b20516dfdf8e41d910ac6fb667ebd3a79ea54084619"}, - {file = "SQLAlchemy-2.0.32-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1467940318e4a860afd546ef61fefb98a14d935cd6817ed07a228c7f7c62f389"}, - {file = "SQLAlchemy-2.0.32-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5954463675cb15db8d4b521f3566a017c8789222b8316b1e6934c811018ee08b"}, - {file = "SQLAlchemy-2.0.32-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:167e7497035c303ae50651b351c28dc22a40bb98fbdb8468cdc971821b1ae533"}, - {file = "SQLAlchemy-2.0.32-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b27dfb676ac02529fb6e343b3a482303f16e6bc3a4d868b73935b8792edb52d0"}, - {file = "SQLAlchemy-2.0.32-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bf2360a5e0f7bd75fa80431bf8ebcfb920c9f885e7956c7efde89031695cafb8"}, - {file = "SQLAlchemy-2.0.32-cp310-cp310-win32.whl", hash = "sha256:306fe44e754a91cd9d600a6b070c1f2fadbb4a1a257b8781ccf33c7067fd3e4d"}, - {file = "SQLAlchemy-2.0.32-cp310-cp310-win_amd64.whl", hash = "sha256:99db65e6f3ab42e06c318f15c98f59a436f1c78179e6a6f40f529c8cc7100b22"}, - {file = "SQLAlchemy-2.0.32-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:21b053be28a8a414f2ddd401f1be8361e41032d2ef5884b2f31d31cb723e559f"}, - {file = "SQLAlchemy-2.0.32-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b178e875a7a25b5938b53b006598ee7645172fccafe1c291a706e93f48499ff5"}, - {file = "SQLAlchemy-2.0.32-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:723a40ee2cc7ea653645bd4cf024326dea2076673fc9d3d33f20f6c81db83e1d"}, - {file = "SQLAlchemy-2.0.32-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:295ff8689544f7ee7e819529633d058bd458c1fd7f7e3eebd0f9268ebc56c2a0"}, - {file = "SQLAlchemy-2.0.32-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:49496b68cd190a147118af585173ee624114dfb2e0297558c460ad7495f9dfe2"}, - {file = "SQLAlchemy-2.0.32-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:acd9b73c5c15f0ec5ce18128b1fe9157ddd0044abc373e6ecd5ba376a7e5d961"}, - {file = "SQLAlchemy-2.0.32-cp311-cp311-win32.whl", hash = "sha256:9365a3da32dabd3e69e06b972b1ffb0c89668994c7e8e75ce21d3e5e69ddef28"}, - {file = "SQLAlchemy-2.0.32-cp311-cp311-win_amd64.whl", hash = "sha256:8bd63d051f4f313b102a2af1cbc8b80f061bf78f3d5bd0843ff70b5859e27924"}, - {file = "SQLAlchemy-2.0.32-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6bab3db192a0c35e3c9d1560eb8332463e29e5507dbd822e29a0a3c48c0a8d92"}, - {file = "SQLAlchemy-2.0.32-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:19d98f4f58b13900d8dec4ed09dd09ef292208ee44cc9c2fe01c1f0a2fe440e9"}, - {file = "SQLAlchemy-2.0.32-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cd33c61513cb1b7371fd40cf221256456d26a56284e7d19d1f0b9f1eb7dd7e8"}, - {file = "SQLAlchemy-2.0.32-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d6ba0497c1d066dd004e0f02a92426ca2df20fac08728d03f67f6960271feec"}, - {file = "SQLAlchemy-2.0.32-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2b6be53e4fde0065524f1a0a7929b10e9280987b320716c1509478b712a7688c"}, - {file = "SQLAlchemy-2.0.32-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:916a798f62f410c0b80b63683c8061f5ebe237b0f4ad778739304253353bc1cb"}, - {file = "SQLAlchemy-2.0.32-cp312-cp312-win32.whl", hash = "sha256:31983018b74908ebc6c996a16ad3690301a23befb643093fcfe85efd292e384d"}, - {file = "SQLAlchemy-2.0.32-cp312-cp312-win_amd64.whl", hash = "sha256:4363ed245a6231f2e2957cccdda3c776265a75851f4753c60f3004b90e69bfeb"}, - {file = "SQLAlchemy-2.0.32-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b8afd5b26570bf41c35c0121801479958b4446751a3971fb9a480c1afd85558e"}, - {file = "SQLAlchemy-2.0.32-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c750987fc876813f27b60d619b987b057eb4896b81117f73bb8d9918c14f1cad"}, - {file = "SQLAlchemy-2.0.32-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ada0102afff4890f651ed91120c1120065663506b760da4e7823913ebd3258be"}, - {file = "SQLAlchemy-2.0.32-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:78c03d0f8a5ab4f3034c0e8482cfcc415a3ec6193491cfa1c643ed707d476f16"}, - {file = "SQLAlchemy-2.0.32-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:3bd1cae7519283ff525e64645ebd7a3e0283f3c038f461ecc1c7b040a0c932a1"}, - {file = "SQLAlchemy-2.0.32-cp37-cp37m-win32.whl", hash = "sha256:01438ebcdc566d58c93af0171c74ec28efe6a29184b773e378a385e6215389da"}, - {file = "SQLAlchemy-2.0.32-cp37-cp37m-win_amd64.whl", hash = "sha256:4979dc80fbbc9d2ef569e71e0896990bc94df2b9fdbd878290bd129b65ab579c"}, - {file = "SQLAlchemy-2.0.32-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c742be912f57586ac43af38b3848f7688863a403dfb220193a882ea60e1ec3a"}, - {file = "SQLAlchemy-2.0.32-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:62e23d0ac103bcf1c5555b6c88c114089587bc64d048fef5bbdb58dfd26f96da"}, - {file = "SQLAlchemy-2.0.32-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:251f0d1108aab8ea7b9aadbd07fb47fb8e3a5838dde34aa95a3349876b5a1f1d"}, - {file = "SQLAlchemy-2.0.32-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ef18a84e5116340e38eca3e7f9eeaaef62738891422e7c2a0b80feab165905f"}, - {file = "SQLAlchemy-2.0.32-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:3eb6a97a1d39976f360b10ff208c73afb6a4de86dd2a6212ddf65c4a6a2347d5"}, - {file = "SQLAlchemy-2.0.32-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0c1c9b673d21477cec17ab10bc4decb1322843ba35b481585facd88203754fc5"}, - {file = "SQLAlchemy-2.0.32-cp38-cp38-win32.whl", hash = "sha256:c41a2b9ca80ee555decc605bd3c4520cc6fef9abde8fd66b1cf65126a6922d65"}, - {file = "SQLAlchemy-2.0.32-cp38-cp38-win_amd64.whl", hash = "sha256:8a37e4d265033c897892279e8adf505c8b6b4075f2b40d77afb31f7185cd6ecd"}, - {file = "SQLAlchemy-2.0.32-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:52fec964fba2ef46476312a03ec8c425956b05c20220a1a03703537824b5e8e1"}, - {file = "SQLAlchemy-2.0.32-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:328429aecaba2aee3d71e11f2477c14eec5990fb6d0e884107935f7fb6001632"}, - {file = "SQLAlchemy-2.0.32-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85a01b5599e790e76ac3fe3aa2f26e1feba56270023d6afd5550ed63c68552b3"}, - {file = "SQLAlchemy-2.0.32-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aaf04784797dcdf4c0aa952c8d234fa01974c4729db55c45732520ce12dd95b4"}, - {file = "SQLAlchemy-2.0.32-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:4488120becf9b71b3ac718f4138269a6be99a42fe023ec457896ba4f80749525"}, - {file = "SQLAlchemy-2.0.32-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:14e09e083a5796d513918a66f3d6aedbc131e39e80875afe81d98a03312889e6"}, - {file = "SQLAlchemy-2.0.32-cp39-cp39-win32.whl", hash = "sha256:0d322cc9c9b2154ba7e82f7bf25ecc7c36fbe2d82e2933b3642fc095a52cfc78"}, - {file = "SQLAlchemy-2.0.32-cp39-cp39-win_amd64.whl", hash = "sha256:7dd8583df2f98dea28b5cd53a1beac963f4f9d087888d75f22fcc93a07cf8d84"}, - {file = "SQLAlchemy-2.0.32-py3-none-any.whl", hash = "sha256:e567a8793a692451f706b363ccf3c45e056b67d90ead58c3bc9471af5d212202"}, - {file = "SQLAlchemy-2.0.32.tar.gz", hash = "sha256:c1b88cc8b02b6a5f0efb0345a03672d4c897dc7d92585176f88c67346f565ea8"}, + {file = "sqlalchemy-2.0.33.tar.gz", hash = "sha256:91c93333c2b37ff721dc83b37e28c29de4c502b5612f2d093468037b86aa2be0"}, ] [package.dependencies] From 66b31f9ae8ca2a46fead19311feb19c56cddd98b Mon Sep 17 00:00:00 2001 From: boc-the-git <3479092+boc-the-git@users.noreply.github.com> Date: Wed, 4 Sep 2024 08:08:39 +1000 Subject: [PATCH 011/102] feat: Automate release drafting (#4147) --- .github/release-drafter.yml | 57 +++++++++++++++++++++++++++ .github/workflows/release-drafter.yml | 21 ++++++++++ renovate.json | 3 ++ 3 files changed, 81 insertions(+) create mode 100644 .github/release-drafter.yml create mode 100644 .github/workflows/release-drafter.yml diff --git a/.github/release-drafter.yml b/.github/release-drafter.yml new file mode 100644 index 00000000000..b20f603c8d9 --- /dev/null +++ b/.github/release-drafter.yml @@ -0,0 +1,57 @@ +--- +name-template: "v$RESOLVED_VERSION" +tag-template: "v$RESOLVED_VERSION" +change-template: "- $TITLE @$AUTHOR (#$NUMBER)" +sort-direction: ascending + +categories: + - title: "🚨 Breaking changes" + labels: + - "breaking-change" + - "major" + - title: "✨ New features" + labels: + - "feature" + - "minor" + - title: "🐛 Bug fixes" + labels: + - "bugfix" + - title: "🧰 Maintenance" + collapse-after: 3 + labels: + - "ci" + - "chore" + - "l10n" + - title: "📚 Documentation" + labels: + - "documentation" + - title: "⬆️ Dependency updates" + collapse-after: 3 + labels: + - "dependencies" + +version-resolver: + major: + labels: + - "major" + - "breaking-change" + minor: + labels: + - "minor" + - "feature" + patch: + labels: + - "bugfix" + - "chore" + - "ci" + - "dependencies" + - "documentation" + - "l10n" + default: patch + +template: | + # 🍴🍴🍴🍴🍴🍴🍴🍴🍴🍴 + + $CHANGES + + # 🍴🍴🍴🍴🍴🍴🍴🍴🍴🍴 diff --git a/.github/workflows/release-drafter.yml b/.github/workflows/release-drafter.yml new file mode 100644 index 00000000000..1c8f998c904 --- /dev/null +++ b/.github/workflows/release-drafter.yml @@ -0,0 +1,21 @@ +--- +name: Release Drafter + +on: + push: + branches: + - mealie-next + workflow_dispatch: + +jobs: + update_release_draft: + permissions: + # write permission is required to create a github release + contents: write + name: ✏️ Draft release + runs-on: ubuntu-latest + steps: + - name: 🚀 Run Release Drafter + uses: release-drafter/release-drafter@v6.0.0 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/renovate.json b/renovate.json index 0866a74b62d..193449c7a07 100644 --- a/renovate.json +++ b/renovate.json @@ -5,5 +5,8 @@ ], "extends": [ "config:base" + ], + "addLabels": [ + "dependencies" ] } From 2e8922ad0d7aadcd375d60c4194e779ec5c2caa0 Mon Sep 17 00:00:00 2001 From: Hayden <64056131+hay-kot@users.noreply.github.com> Date: Wed, 4 Sep 2024 06:15:35 -0500 Subject: [PATCH 012/102] chore(l10n): New Crowdin updates (#4145) --- mealie/repos/seed/resources/foods/locales/el-GR.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mealie/repos/seed/resources/foods/locales/el-GR.json b/mealie/repos/seed/resources/foods/locales/el-GR.json index 26395840be9..9bfe62fa71f 100644 --- a/mealie/repos/seed/resources/foods/locales/el-GR.json +++ b/mealie/repos/seed/resources/foods/locales/el-GR.json @@ -64,7 +64,7 @@ "corn": "καλαμπόκι", "corn-syrup": "σιρόπι καλαμποκιού", "cottonseed-oil": "βαμβακέλαιο", - "courgette": "courgette", + "courgette": "κολοκύθι", "cream-of-tartar": "κρέμα ταρτάρ", "cucumber": "αγγούρι", "cumin": "κύμινο", @@ -154,7 +154,7 @@ "olive-oil": "ελαιόλαδο", "okra": "μπάμια", "olive": "ελιά", - "onion-family": "onion family", + "onion-family": "κρεμμυδοειδή", "onion": "κρεμμύδι", "scallion": "scallion", "shallot": "εσαλότ", From 4648e3d016f9b58cf2660487af351df518086a37 Mon Sep 17 00:00:00 2001 From: boc-the-git <3479092+boc-the-git@users.noreply.github.com> Date: Wed, 4 Sep 2024 23:58:07 +1000 Subject: [PATCH 013/102] chore: Set 'chore' label on PR (#4154) --- .github/workflows/scheduled-checks.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/scheduled-checks.yml b/.github/workflows/scheduled-checks.yml index af30b83c362..afd458a0f5d 100644 --- a/.github/workflows/scheduled-checks.yml +++ b/.github/workflows/scheduled-checks.yml @@ -26,7 +26,9 @@ jobs: with: commit-message: "Update pre-commit hooks" branch: "fix/update-pre-commit-hooks" + labels: | + chore delete-branch: true base: mealie-next - title: "fix(auto): Update pre-commit hooks" + title: "chore(auto): Update pre-commit hooks" body: "Auto-generated by `.github/workflows/scheduled-checks.yml`" From afa41ecda2790d5202590e964a9f1fb737031559 Mon Sep 17 00:00:00 2001 From: boc-the-git <3479092+boc-the-git@users.noreply.github.com> Date: Thu, 5 Sep 2024 00:06:30 +1000 Subject: [PATCH 014/102] chore: Set "documentation" label on PR (#4153) --- .github/workflows/release.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a9570dbc92f..9fbb398cc75 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -80,6 +80,8 @@ jobs: with: commit-message: "Update image tag, for release ${{ github.event.release.tag_name }}" branch: "docs/newrelease-update-version-${{ github.event.release.tag_name }}" + labels: | + documentation delete-branch: true base: mealie-next title: "docs(auto): Update image tag, for release ${{ github.event.release.tag_name }}" From dc8fe5ef312f8d6d27c9a0c05a7ddc11b9e9995e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 5 Sep 2024 09:08:13 -0500 Subject: [PATCH 015/102] fix(deps): update dependency fastapi to v0.112.3 (#4159) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 51 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index 28a0937681e..5cf3c42c542 100644 --- a/poetry.lock +++ b/poetry.lock @@ -637,13 +637,13 @@ cli = ["requests"] [[package]] name = "fastapi" -version = "0.112.2" +version = "0.112.3" description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" optional = false python-versions = ">=3.8" files = [ - {file = "fastapi-0.112.2-py3-none-any.whl", hash = "sha256:db84b470bd0e2b1075942231e90e3577e12a903c4dc8696f0d206a7904a7af1c"}, - {file = "fastapi-0.112.2.tar.gz", hash = "sha256:3d4729c038414d5193840706907a41839d839523da6ed0c2811f1168cac1798c"}, + {file = "fastapi-0.112.3-py3-none-any.whl", hash = "sha256:f28ef49eb91543f8419a0c9023498b5f311d6611067e2fae2bb218947c499d66"}, + {file = "fastapi-0.112.3.tar.gz", hash = "sha256:9b6b41ea59ba948a07142f09d6241bda975fdb86847413136f6e2a1675d3bf25"}, ] [package.dependencies] @@ -2924,6 +2924,54 @@ description = "Database Abstraction Library" optional = false python-versions = ">=3.7" files = [ + {file = "SQLAlchemy-2.0.33-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:63b7d9890f7958dabd95cf98a3f48740fbe2bb0493523aef590e82164fa68194"}, + {file = "SQLAlchemy-2.0.33-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:32a4f38d2efca066ec793451ef6852cb0d9086dc3d5479d88a5a25529d1d1861"}, + {file = "SQLAlchemy-2.0.33-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3926e4ed4a3e956c8b2b0f1140493378c8cd17cad123b4fc1e0f6ecd3e05b19"}, + {file = "SQLAlchemy-2.0.33-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2415824ec658891ac38d13a2f36b4ceb2033f034dee1c226f83917589a65f072"}, + {file = "SQLAlchemy-2.0.33-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:92249ac94279b8e5f0c0c8420e09b804d0a49d2269f52f549d4cb536c8382434"}, + {file = "SQLAlchemy-2.0.33-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c9f4f92eee7d06531cc6a5b814e603a0c7639876aab03638dcc70c420a3974f6"}, + {file = "SQLAlchemy-2.0.33-cp310-cp310-win32.whl", hash = "sha256:4f1c44c8d66101e6f627f330d8b5b3de5ad25eedb6df3ce39a2e6f92debbcf15"}, + {file = "SQLAlchemy-2.0.33-cp310-cp310-win_amd64.whl", hash = "sha256:3ad94634338d8c576b1d47a96c798be186650aa5282072053ce2d12c6f309f82"}, + {file = "SQLAlchemy-2.0.33-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:570ec43e8c3c020abac4f0720baa5fe5187334e3f1e8e1777183c041962b61cc"}, + {file = "SQLAlchemy-2.0.33-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81759e77a4985abdbac068762a0eaf0f11860fe041ad6da170aae7615ea72531"}, + {file = "SQLAlchemy-2.0.33-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:49541a43828e273325c520fbacf786615bd974dad63ff60b8ea1e1216e914d1a"}, + {file = "SQLAlchemy-2.0.33-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82c72da5be489c8d150deba70d5732398695418df5232bceb52ee323ddd9753b"}, + {file = "SQLAlchemy-2.0.33-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:31e56020832be602201fbf8189f379569cf5c3604cdc4ce79f10dbbfcbf8a0eb"}, + {file = "SQLAlchemy-2.0.33-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:30a3f55be76364b64c83788728faaba782ab282a24909e1994404c2146d39982"}, + {file = "SQLAlchemy-2.0.33-cp311-cp311-win32.whl", hash = "sha256:17d0c69f66392ad2db1609373a74d1f834b2e632f3f52d446747b8ec220aea53"}, + {file = "SQLAlchemy-2.0.33-cp311-cp311-win_amd64.whl", hash = "sha256:c5d5a733c6af7f392435e673d1b136f6bdf2366033abb35eed680400dc730840"}, + {file = "SQLAlchemy-2.0.33-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1d81e3aeab456fe24c3f0dcfd4f952a3a5ee45e9c14fc66d34c1d7a60cf7b698"}, + {file = "SQLAlchemy-2.0.33-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ca8788dc1baee100f09110f33a01d928cf9df4483d2bfb25a37be31a659d46bb"}, + {file = "SQLAlchemy-2.0.33-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:60c54b677d4f0a0b2df3b79e89e84d601fb931c720176641742efd66b50601f9"}, + {file = "SQLAlchemy-2.0.33-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:684aee5fd811091b2f48006fb3fe6c7f2de4a716ef8d294a2aab762099753133"}, + {file = "SQLAlchemy-2.0.33-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ee2b82b170591ccd19d463c9798a9caeea0cad967a8d2f3264de459f582696d5"}, + {file = "SQLAlchemy-2.0.33-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1109cc6dc5c9d1223c42186391e6a5509e6d4ab2c30fa629573c10184f742f2e"}, + {file = "SQLAlchemy-2.0.33-cp312-cp312-win32.whl", hash = "sha256:c633e2d2f8a7b88c06e276bbe16cb7e62fed815fcbeb69cd9752cea166ecb8e8"}, + {file = "SQLAlchemy-2.0.33-cp312-cp312-win_amd64.whl", hash = "sha256:77eaf8fdf305266b806a91ae4633edbf86ad37e13bd92ac85e305e7f654c19a5"}, + {file = "SQLAlchemy-2.0.33-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:67eb8e0ffbebd3d82ec5079ca5f807a661c574b482785483717857c2acab833a"}, + {file = "SQLAlchemy-2.0.33-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3da2371628e28ef279f3f756f5e58858fad7820de08508138c9f5f9e4d8f4ac"}, + {file = "SQLAlchemy-2.0.33-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7c82a7930126bb5ccfbb73fc1562d52942fbffb2fda2791fab49de249fc202a"}, + {file = "SQLAlchemy-2.0.33-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d004a623ad4aa8d2eb31b37e65b5e020c9f65a1852b8b9e6301f0e411aca5b9a"}, + {file = "SQLAlchemy-2.0.33-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:06b30bbc43c6dd8b7cdc509cd2e58f4f1dce867565642e1d1a65e32459c89bd0"}, + {file = "SQLAlchemy-2.0.33-cp37-cp37m-win32.whl", hash = "sha256:459099ab8dd43a5edbb99f58ba4730baec457df9c06ebc71434c6b4b78cc8cf9"}, + {file = "SQLAlchemy-2.0.33-cp37-cp37m-win_amd64.whl", hash = "sha256:3c64d58e83a68e228b1ae6ebac8721241e9d8cc5e0c0dd11ed5d89155477b243"}, + {file = "SQLAlchemy-2.0.33-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9d035a672d5b3e4793a4a8865c3274a7bbbac7fac67a47b415023b5539105087"}, + {file = "SQLAlchemy-2.0.33-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:61e9a2d68a5a8ca6a84cbc79aa7f2e430ae854d3351d6e9ceb3edf6798797b63"}, + {file = "SQLAlchemy-2.0.33-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:93efa4b72f7cb70555b0f66ee5e113ae40073c57054a72887e50b05bfd97baa4"}, + {file = "SQLAlchemy-2.0.33-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac252bafe8cbadfac7b1e8a74748ffd775e27325186d12b82600b652d9adcb86"}, + {file = "SQLAlchemy-2.0.33-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2b1e98507ec2aa200af980d592e936e9dac1c1ec50acc94330ae4b13c55d6fea"}, + {file = "SQLAlchemy-2.0.33-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:523ae689c023cbf0fe1613101254824515193f85f806ba04611dee83302660b5"}, + {file = "SQLAlchemy-2.0.33-cp38-cp38-win32.whl", hash = "sha256:7fd0a28bc24a75326f13735a58272247f65c9e8ee16205eacb2431d6ee94f44a"}, + {file = "SQLAlchemy-2.0.33-cp38-cp38-win_amd64.whl", hash = "sha256:0ea64443a86c3b5a0fd7c93363ad2f9465cb3af61f9920b7c75d1a7bebbeef8a"}, + {file = "SQLAlchemy-2.0.33-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9e5819822050e6e36e2aa41260d05074c026a1bbb9baa6869170b5ce64db7a4d"}, + {file = "SQLAlchemy-2.0.33-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8bef11d31a1c48f5943e577d1ef81085ec1550c37552bfc9bf8e5d184ce47142"}, + {file = "SQLAlchemy-2.0.33-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06504d9625e3ef114b39803ebca6f379133acad58a87c33117ddc5df66079915"}, + {file = "SQLAlchemy-2.0.33-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:454e9b4355f0051063daebc4060140251c19f33fc5d02151c347431860fd104b"}, + {file = "SQLAlchemy-2.0.33-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:28c0800c851955f5bd11c0b904638c1343002650d0c071c6fbf0d157cc78627d"}, + {file = "SQLAlchemy-2.0.33-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:816c927dd51e4951d6e79870c945340057a5d8e63543419dee0d247bd67a88f8"}, + {file = "SQLAlchemy-2.0.33-cp39-cp39-win32.whl", hash = "sha256:c40e0213beaf410a151e4329e30c73687838c251c998ba1b312975dbbcb2d05d"}, + {file = "SQLAlchemy-2.0.33-cp39-cp39-win_amd64.whl", hash = "sha256:751eaafa907a66dd9a328a9d15c3dcfdcba3ef8dd8f7f4a9771cdacdec45d9bf"}, + {file = "SQLAlchemy-2.0.33-py3-none-any.whl", hash = "sha256:ae294808afde1b14a1a69aa86a69cadfe391848bbb233a5332a8065e4081cabc"}, {file = "sqlalchemy-2.0.33.tar.gz", hash = "sha256:91c93333c2b37ff721dc83b37e28c29de4c502b5612f2d093468037b86aa2be0"}, ] From 92398c3e4c61d4df5430ca866873d4082fb52e5d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 5 Sep 2024 11:31:45 -0500 Subject: [PATCH 016/102] chore(deps): update dependency ruff to v0.6.4 (#4160) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/poetry.lock b/poetry.lock index 5cf3c42c542..1faffc18fc9 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2843,29 +2843,29 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] name = "ruff" -version = "0.6.3" +version = "0.6.4" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.6.3-py3-none-linux_armv6l.whl", hash = "sha256:97f58fda4e309382ad30ede7f30e2791d70dd29ea17f41970119f55bdb7a45c3"}, - {file = "ruff-0.6.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:3b061e49b5cf3a297b4d1c27ac5587954ccb4ff601160d3d6b2f70b1622194dc"}, - {file = "ruff-0.6.3-py3-none-macosx_11_0_arm64.whl", hash = "sha256:34e2824a13bb8c668c71c1760a6ac7d795ccbd8d38ff4a0d8471fdb15de910b1"}, - {file = "ruff-0.6.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bddfbb8d63c460f4b4128b6a506e7052bad4d6f3ff607ebbb41b0aa19c2770d1"}, - {file = "ruff-0.6.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ced3eeb44df75353e08ab3b6a9e113b5f3f996bea48d4f7c027bc528ba87b672"}, - {file = "ruff-0.6.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:47021dff5445d549be954eb275156dfd7c37222acc1e8014311badcb9b4ec8c1"}, - {file = "ruff-0.6.3-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:7d7bd20dc07cebd68cc8bc7b3f5ada6d637f42d947c85264f94b0d1cd9d87384"}, - {file = "ruff-0.6.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:500f166d03fc6d0e61c8e40a3ff853fa8a43d938f5d14c183c612df1b0d6c58a"}, - {file = "ruff-0.6.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:42844ff678f9b976366b262fa2d1d1a3fe76f6e145bd92c84e27d172e3c34500"}, - {file = "ruff-0.6.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70452a10eb2d66549de8e75f89ae82462159855e983ddff91bc0bce6511d0470"}, - {file = "ruff-0.6.3-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:65a533235ed55f767d1fc62193a21cbf9e3329cf26d427b800fdeacfb77d296f"}, - {file = "ruff-0.6.3-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:d2e2c23cef30dc3cbe9cc5d04f2899e7f5e478c40d2e0a633513ad081f7361b5"}, - {file = "ruff-0.6.3-py3-none-musllinux_1_2_i686.whl", hash = "sha256:d8a136aa7d228975a6aee3dd8bea9b28e2b43e9444aa678fb62aeb1956ff2351"}, - {file = "ruff-0.6.3-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:f92fe93bc72e262b7b3f2bba9879897e2d58a989b4714ba6a5a7273e842ad2f8"}, - {file = "ruff-0.6.3-py3-none-win32.whl", hash = "sha256:7a62d3b5b0d7f9143d94893f8ba43aa5a5c51a0ffc4a401aa97a81ed76930521"}, - {file = "ruff-0.6.3-py3-none-win_amd64.whl", hash = "sha256:746af39356fee2b89aada06c7376e1aa274a23493d7016059c3a72e3b296befb"}, - {file = "ruff-0.6.3-py3-none-win_arm64.whl", hash = "sha256:14a9528a8b70ccc7a847637c29e56fd1f9183a9db743bbc5b8e0c4ad60592a82"}, - {file = "ruff-0.6.3.tar.gz", hash = "sha256:183b99e9edd1ef63be34a3b51fee0a9f4ab95add123dbf89a71f7b1f0c991983"}, + {file = "ruff-0.6.4-py3-none-linux_armv6l.whl", hash = "sha256:c4b153fc152af51855458e79e835fb6b933032921756cec9af7d0ba2aa01a258"}, + {file = "ruff-0.6.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:bedff9e4f004dad5f7f76a9d39c4ca98af526c9b1695068198b3bda8c085ef60"}, + {file = "ruff-0.6.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d02a4127a86de23002e694d7ff19f905c51e338c72d8e09b56bfb60e1681724f"}, + {file = "ruff-0.6.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7862f42fc1a4aca1ea3ffe8a11f67819d183a5693b228f0bb3a531f5e40336fc"}, + {file = "ruff-0.6.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eebe4ff1967c838a1a9618a5a59a3b0a00406f8d7eefee97c70411fefc353617"}, + {file = "ruff-0.6.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:932063a03bac394866683e15710c25b8690ccdca1cf192b9a98260332ca93408"}, + {file = "ruff-0.6.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:50e30b437cebef547bd5c3edf9ce81343e5dd7c737cb36ccb4fe83573f3d392e"}, + {file = "ruff-0.6.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c44536df7b93a587de690e124b89bd47306fddd59398a0fb12afd6133c7b3818"}, + {file = "ruff-0.6.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ea086601b22dc5e7693a78f3fcfc460cceabfdf3bdc36dc898792aba48fbad6"}, + {file = "ruff-0.6.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b52387d3289ccd227b62102c24714ed75fbba0b16ecc69a923a37e3b5e0aaaa"}, + {file = "ruff-0.6.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:0308610470fcc82969082fc83c76c0d362f562e2f0cdab0586516f03a4e06ec6"}, + {file = "ruff-0.6.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:803b96dea21795a6c9d5bfa9e96127cc9c31a1987802ca68f35e5c95aed3fc0d"}, + {file = "ruff-0.6.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:66dbfea86b663baab8fcae56c59f190caba9398df1488164e2df53e216248baa"}, + {file = "ruff-0.6.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:34d5efad480193c046c86608dbba2bccdc1c5fd11950fb271f8086e0c763a5d1"}, + {file = "ruff-0.6.4-py3-none-win32.whl", hash = "sha256:f0f8968feea5ce3777c0d8365653d5e91c40c31a81d95824ba61d871a11b8523"}, + {file = "ruff-0.6.4-py3-none-win_amd64.whl", hash = "sha256:549daccee5227282289390b0222d0fbee0275d1db6d514550d65420053021a58"}, + {file = "ruff-0.6.4-py3-none-win_arm64.whl", hash = "sha256:ac4b75e898ed189b3708c9ab3fc70b79a433219e1e87193b4f2b77251d058d14"}, + {file = "ruff-0.6.4.tar.gz", hash = "sha256:ac3b5bfbee99973f80aa1b7cbd1c9cbce200883bdd067300c22a6cc1c7fba212"}, ] [[package]] From 10c6c706f067fb68968cbc27ff4280e6a92a5867 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 5 Sep 2024 16:44:13 +0000 Subject: [PATCH 017/102] fix(deps): update dependency fastapi to ^0.113.0 (#4161) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 8 ++++---- pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/poetry.lock b/poetry.lock index 1faffc18fc9..7d1b08cb455 100644 --- a/poetry.lock +++ b/poetry.lock @@ -637,13 +637,13 @@ cli = ["requests"] [[package]] name = "fastapi" -version = "0.112.3" +version = "0.113.0" description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" optional = false python-versions = ">=3.8" files = [ - {file = "fastapi-0.112.3-py3-none-any.whl", hash = "sha256:f28ef49eb91543f8419a0c9023498b5f311d6611067e2fae2bb218947c499d66"}, - {file = "fastapi-0.112.3.tar.gz", hash = "sha256:9b6b41ea59ba948a07142f09d6241bda975fdb86847413136f6e2a1675d3bf25"}, + {file = "fastapi-0.113.0-py3-none-any.whl", hash = "sha256:c8d364485b6361fb643d53920a18d58a696e189abcb901ec03b487e35774c476"}, + {file = "fastapi-0.113.0.tar.gz", hash = "sha256:b7cf9684dc154dfc93f8b718e5850577b529889096518df44defa41e73caf50f"}, ] [package.dependencies] @@ -3436,4 +3436,4 @@ pgsql = ["psycopg2-binary"] [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "bae5b9fbb3b3b4fa9acd45bfaf6bd364ff23355eef5fe3da1c556ff40b94d358" +content-hash = "71e3859f5c0f272a6f5c201774977c8969349a90bc769b4343522549a0141c62" diff --git a/pyproject.toml b/pyproject.toml index 743236ed0c2..a7a183b3447 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,7 +20,7 @@ appdirs = "1.4.4" apprise = "^1.4.5" bcrypt = "^4.0.1" extruct = "^0.17.0" -fastapi = "^0.112.0" +fastapi = "^0.113.0" httpx = "^0.27.0" lxml = "^5.0.0" orjson = "^3.8.0" From d1ead75ee258c399d90543c864f8689a157f8fa0 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 5 Sep 2024 14:54:14 -0500 Subject: [PATCH 018/102] fix(deps): update dependency pydantic to v2.9.0 (#4162) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 193 ++++++++++++++++++++++++++-------------------------- 1 file changed, 97 insertions(+), 96 deletions(-) diff --git a/poetry.lock b/poetry.lock index 7d1b08cb455..d4a00199d71 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2058,122 +2058,123 @@ files = [ [[package]] name = "pydantic" -version = "2.8.2" +version = "2.9.0" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.8.2-py3-none-any.whl", hash = "sha256:73ee9fddd406dc318b885c7a2eab8a6472b68b8fb5ba8150949fc3db939f23c8"}, - {file = "pydantic-2.8.2.tar.gz", hash = "sha256:6f62c13d067b0755ad1c21a34bdd06c0c12625a22b0fc09c6b149816604f7c2a"}, + {file = "pydantic-2.9.0-py3-none-any.whl", hash = "sha256:f66a7073abd93214a20c5f7b32d56843137a7a2e70d02111f3be287035c45370"}, + {file = "pydantic-2.9.0.tar.gz", hash = "sha256:c7a8a9fdf7d100afa49647eae340e2d23efa382466a8d177efcd1381e9be5598"}, ] [package.dependencies] annotated-types = ">=0.4.0" -pydantic-core = "2.20.1" +pydantic-core = "2.23.2" typing-extensions = [ - {version = ">=4.6.1", markers = "python_version < \"3.13\""}, {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, + {version = ">=4.6.1", markers = "python_version < \"3.13\""}, ] +tzdata = {version = "*", markers = "python_version >= \"3.9\""} [package.extras] email = ["email-validator (>=2.0.0)"] [[package]] name = "pydantic-core" -version = "2.20.1" +version = "2.23.2" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.20.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3acae97ffd19bf091c72df4d726d552c473f3576409b2a7ca36b2f535ffff4a3"}, - {file = "pydantic_core-2.20.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:41f4c96227a67a013e7de5ff8f20fb496ce573893b7f4f2707d065907bffdbd6"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f239eb799a2081495ea659d8d4a43a8f42cd1fe9ff2e7e436295c38a10c286a"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53e431da3fc53360db73eedf6f7124d1076e1b4ee4276b36fb25514544ceb4a3"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1f62b2413c3a0e846c3b838b2ecd6c7a19ec6793b2a522745b0869e37ab5bc1"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d41e6daee2813ecceea8eda38062d69e280b39df793f5a942fa515b8ed67953"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d482efec8b7dc6bfaedc0f166b2ce349df0011f5d2f1f25537ced4cfc34fd98"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e93e1a4b4b33daed65d781a57a522ff153dcf748dee70b40c7258c5861e1768a"}, - {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e7c4ea22b6739b162c9ecaaa41d718dfad48a244909fe7ef4b54c0b530effc5a"}, - {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4f2790949cf385d985a31984907fecb3896999329103df4e4983a4a41e13e840"}, - {file = "pydantic_core-2.20.1-cp310-none-win32.whl", hash = "sha256:5e999ba8dd90e93d57410c5e67ebb67ffcaadcea0ad973240fdfd3a135506250"}, - {file = "pydantic_core-2.20.1-cp310-none-win_amd64.whl", hash = "sha256:512ecfbefef6dac7bc5eaaf46177b2de58cdf7acac8793fe033b24ece0b9566c"}, - {file = "pydantic_core-2.20.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d2a8fa9d6d6f891f3deec72f5cc668e6f66b188ab14bb1ab52422fe8e644f312"}, - {file = "pydantic_core-2.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:175873691124f3d0da55aeea1d90660a6ea7a3cfea137c38afa0a5ffabe37b88"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37eee5b638f0e0dcd18d21f59b679686bbd18917b87db0193ae36f9c23c355fc"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25e9185e2d06c16ee438ed39bf62935ec436474a6ac4f9358524220f1b236e43"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:150906b40ff188a3260cbee25380e7494ee85048584998c1e66df0c7a11c17a6"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ad4aeb3e9a97286573c03df758fc7627aecdd02f1da04516a86dc159bf70121"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3f3ed29cd9f978c604708511a1f9c2fdcb6c38b9aae36a51905b8811ee5cbf1"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b0dae11d8f5ded51699c74d9548dcc5938e0804cc8298ec0aa0da95c21fff57b"}, - {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:faa6b09ee09433b87992fb5a2859efd1c264ddc37280d2dd5db502126d0e7f27"}, - {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9dc1b507c12eb0481d071f3c1808f0529ad41dc415d0ca11f7ebfc666e66a18b"}, - {file = "pydantic_core-2.20.1-cp311-none-win32.whl", hash = "sha256:fa2fddcb7107e0d1808086ca306dcade7df60a13a6c347a7acf1ec139aa6789a"}, - {file = "pydantic_core-2.20.1-cp311-none-win_amd64.whl", hash = "sha256:40a783fb7ee353c50bd3853e626f15677ea527ae556429453685ae32280c19c2"}, - {file = "pydantic_core-2.20.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:595ba5be69b35777474fa07f80fc260ea71255656191adb22a8c53aba4479231"}, - {file = "pydantic_core-2.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a4f55095ad087474999ee28d3398bae183a66be4823f753cd7d67dd0153427c9"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9aa05d09ecf4c75157197f27cdc9cfaeb7c5f15021c6373932bf3e124af029f"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e97fdf088d4b31ff4ba35db26d9cc472ac7ef4a2ff2badeabf8d727b3377fc52"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc633a9fe1eb87e250b5c57d389cf28998e4292336926b0b6cdaee353f89a237"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d573faf8eb7e6b1cbbcb4f5b247c60ca8be39fe2c674495df0eb4318303137fe"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26dc97754b57d2fd00ac2b24dfa341abffc380b823211994c4efac7f13b9e90e"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:33499e85e739a4b60c9dac710c20a08dc73cb3240c9a0e22325e671b27b70d24"}, - {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bebb4d6715c814597f85297c332297c6ce81e29436125ca59d1159b07f423eb1"}, - {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:516d9227919612425c8ef1c9b869bbbee249bc91912c8aaffb66116c0b447ebd"}, - {file = "pydantic_core-2.20.1-cp312-none-win32.whl", hash = "sha256:469f29f9093c9d834432034d33f5fe45699e664f12a13bf38c04967ce233d688"}, - {file = "pydantic_core-2.20.1-cp312-none-win_amd64.whl", hash = "sha256:035ede2e16da7281041f0e626459bcae33ed998cca6a0a007a5ebb73414ac72d"}, - {file = "pydantic_core-2.20.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:0827505a5c87e8aa285dc31e9ec7f4a17c81a813d45f70b1d9164e03a813a686"}, - {file = "pydantic_core-2.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:19c0fa39fa154e7e0b7f82f88ef85faa2a4c23cc65aae2f5aea625e3c13c735a"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa223cd1e36b642092c326d694d8bf59b71ddddc94cdb752bbbb1c5c91d833b"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c336a6d235522a62fef872c6295a42ecb0c4e1d0f1a3e500fe949415761b8a19"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7eb6a0587eded33aeefea9f916899d42b1799b7b14b8f8ff2753c0ac1741edac"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:70c8daf4faca8da5a6d655f9af86faf6ec2e1768f4b8b9d0226c02f3d6209703"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9fa4c9bf273ca41f940bceb86922a7667cd5bf90e95dbb157cbb8441008482c"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:11b71d67b4725e7e2a9f6e9c0ac1239bbc0c48cce3dc59f98635efc57d6dac83"}, - {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:270755f15174fb983890c49881e93f8f1b80f0b5e3a3cc1394a255706cabd203"}, - {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c81131869240e3e568916ef4c307f8b99583efaa60a8112ef27a366eefba8ef0"}, - {file = "pydantic_core-2.20.1-cp313-none-win32.whl", hash = "sha256:b91ced227c41aa29c672814f50dbb05ec93536abf8f43cd14ec9521ea09afe4e"}, - {file = "pydantic_core-2.20.1-cp313-none-win_amd64.whl", hash = "sha256:65db0f2eefcaad1a3950f498aabb4875c8890438bc80b19362cf633b87a8ab20"}, - {file = "pydantic_core-2.20.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:4745f4ac52cc6686390c40eaa01d48b18997cb130833154801a442323cc78f91"}, - {file = "pydantic_core-2.20.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a8ad4c766d3f33ba8fd692f9aa297c9058970530a32c728a2c4bfd2616d3358b"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41e81317dd6a0127cabce83c0c9c3fbecceae981c8391e6f1dec88a77c8a569a"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04024d270cf63f586ad41fff13fde4311c4fc13ea74676962c876d9577bcc78f"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eaad4ff2de1c3823fddf82f41121bdf453d922e9a238642b1dedb33c4e4f98ad"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:26ab812fa0c845df815e506be30337e2df27e88399b985d0bb4e3ecfe72df31c"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c5ebac750d9d5f2706654c638c041635c385596caf68f81342011ddfa1e5598"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2aafc5a503855ea5885559eae883978c9b6d8c8993d67766ee73d82e841300dd"}, - {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4868f6bd7c9d98904b748a2653031fc9c2f85b6237009d475b1008bfaeb0a5aa"}, - {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa2f457b4af386254372dfa78a2eda2563680d982422641a85f271c859df1987"}, - {file = "pydantic_core-2.20.1-cp38-none-win32.whl", hash = "sha256:225b67a1f6d602de0ce7f6c1c3ae89a4aa25d3de9be857999e9124f15dab486a"}, - {file = "pydantic_core-2.20.1-cp38-none-win_amd64.whl", hash = "sha256:6b507132dcfc0dea440cce23ee2182c0ce7aba7054576efc65634f080dbe9434"}, - {file = "pydantic_core-2.20.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:b03f7941783b4c4a26051846dea594628b38f6940a2fdc0df00b221aed39314c"}, - {file = "pydantic_core-2.20.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1eedfeb6089ed3fad42e81a67755846ad4dcc14d73698c120a82e4ccf0f1f9f6"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:635fee4e041ab9c479e31edda27fcf966ea9614fff1317e280d99eb3e5ab6fe2"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:77bf3ac639c1ff567ae3b47f8d4cc3dc20f9966a2a6dd2311dcc055d3d04fb8a"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ed1b0132f24beeec5a78b67d9388656d03e6a7c837394f99257e2d55b461611"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6514f963b023aeee506678a1cf821fe31159b925c4b76fe2afa94cc70b3222b"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10d4204d8ca33146e761c79f83cc861df20e7ae9f6487ca290a97702daf56006"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2d036c7187b9422ae5b262badb87a20a49eb6c5238b2004e96d4da1231badef1"}, - {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9ebfef07dbe1d93efb94b4700f2d278494e9162565a54f124c404a5656d7ff09"}, - {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6b9d9bb600328a1ce523ab4f454859e9d439150abb0906c5a1983c146580ebab"}, - {file = "pydantic_core-2.20.1-cp39-none-win32.whl", hash = "sha256:784c1214cb6dd1e3b15dd8b91b9a53852aed16671cc3fbe4786f4f1db07089e2"}, - {file = "pydantic_core-2.20.1-cp39-none-win_amd64.whl", hash = "sha256:d2fe69c5434391727efa54b47a1e7986bb0186e72a41b203df8f5b0a19a4f669"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a45f84b09ac9c3d35dfcf6a27fd0634d30d183205230a0ebe8373a0e8cfa0906"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d02a72df14dfdbaf228424573a07af10637bd490f0901cee872c4f434a735b94"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2b27e6af28f07e2f195552b37d7d66b150adbaa39a6d327766ffd695799780f"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:084659fac3c83fd674596612aeff6041a18402f1e1bc19ca39e417d554468482"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:242b8feb3c493ab78be289c034a1f659e8826e2233786e36f2893a950a719bb6"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:38cf1c40a921d05c5edc61a785c0ddb4bed67827069f535d794ce6bcded919fc"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e0bbdd76ce9aa5d4209d65f2b27fc6e5ef1312ae6c5333c26db3f5ade53a1e99"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:254ec27fdb5b1ee60684f91683be95e5133c994cc54e86a0b0963afa25c8f8a6"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:407653af5617f0757261ae249d3fba09504d7a71ab36ac057c938572d1bc9331"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:c693e916709c2465b02ca0ad7b387c4f8423d1db7b4649c551f27a529181c5ad"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b5ff4911aea936a47d9376fd3ab17e970cc543d1b68921886e7f64bd28308d1"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:177f55a886d74f1808763976ac4efd29b7ed15c69f4d838bbd74d9d09cf6fa86"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:964faa8a861d2664f0c7ab0c181af0bea66098b1919439815ca8803ef136fc4e"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:4dd484681c15e6b9a977c785a345d3e378d72678fd5f1f3c0509608da24f2ac0"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f6d6cff3538391e8486a431569b77921adfcdef14eb18fbf19b7c0a5294d4e6a"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a6d511cc297ff0883bc3708b465ff82d7560193169a8b93260f74ecb0a5e08a7"}, - {file = "pydantic_core-2.20.1.tar.gz", hash = "sha256:26ca695eeee5f9f1aeeb211ffc12f10bcb6f71e2989988fda61dabd65db878d4"}, + {file = "pydantic_core-2.23.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:7d0324a35ab436c9d768753cbc3c47a865a2cbc0757066cb864747baa61f6ece"}, + {file = "pydantic_core-2.23.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:276ae78153a94b664e700ac362587c73b84399bd1145e135287513442e7dfbc7"}, + {file = "pydantic_core-2.23.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:964c7aa318da542cdcc60d4a648377ffe1a2ef0eb1e996026c7f74507b720a78"}, + {file = "pydantic_core-2.23.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1cf842265a3a820ebc6388b963ead065f5ce8f2068ac4e1c713ef77a67b71f7c"}, + {file = "pydantic_core-2.23.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae90b9e50fe1bd115b24785e962b51130340408156d34d67b5f8f3fa6540938e"}, + {file = "pydantic_core-2.23.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ae65fdfb8a841556b52935dfd4c3f79132dc5253b12c0061b96415208f4d622"}, + {file = "pydantic_core-2.23.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c8aa40f6ca803f95b1c1c5aeaee6237b9e879e4dfb46ad713229a63651a95fb"}, + {file = "pydantic_core-2.23.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c53100c8ee5a1e102766abde2158077d8c374bee0639201f11d3032e3555dfbc"}, + {file = "pydantic_core-2.23.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d6b9dd6aa03c812017411734e496c44fef29b43dba1e3dd1fa7361bbacfc1354"}, + {file = "pydantic_core-2.23.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b18cf68255a476b927910c6873d9ed00da692bb293c5b10b282bd48a0afe3ae2"}, + {file = "pydantic_core-2.23.2-cp310-none-win32.whl", hash = "sha256:e460475719721d59cd54a350c1f71c797c763212c836bf48585478c5514d2854"}, + {file = "pydantic_core-2.23.2-cp310-none-win_amd64.whl", hash = "sha256:5f3cf3721eaf8741cffaf092487f1ca80831202ce91672776b02b875580e174a"}, + {file = "pydantic_core-2.23.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:7ce8e26b86a91e305858e018afc7a6e932f17428b1eaa60154bd1f7ee888b5f8"}, + {file = "pydantic_core-2.23.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7e9b24cca4037a561422bf5dc52b38d390fb61f7bfff64053ce1b72f6938e6b2"}, + {file = "pydantic_core-2.23.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:753294d42fb072aa1775bfe1a2ba1012427376718fa4c72de52005a3d2a22178"}, + {file = "pydantic_core-2.23.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:257d6a410a0d8aeb50b4283dea39bb79b14303e0fab0f2b9d617701331ed1515"}, + {file = "pydantic_core-2.23.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c8319e0bd6a7b45ad76166cc3d5d6a36c97d0c82a196f478c3ee5346566eebfd"}, + {file = "pydantic_core-2.23.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7a05c0240f6c711eb381ac392de987ee974fa9336071fb697768dfdb151345ce"}, + {file = "pydantic_core-2.23.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d5b0ff3218858859910295df6953d7bafac3a48d5cd18f4e3ed9999efd2245f"}, + {file = "pydantic_core-2.23.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:96ef39add33ff58cd4c112cbac076726b96b98bb8f1e7f7595288dcfb2f10b57"}, + {file = "pydantic_core-2.23.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0102e49ac7d2df3379ef8d658d3bc59d3d769b0bdb17da189b75efa861fc07b4"}, + {file = "pydantic_core-2.23.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a6612c2a844043e4d10a8324c54cdff0042c558eef30bd705770793d70b224aa"}, + {file = "pydantic_core-2.23.2-cp311-none-win32.whl", hash = "sha256:caffda619099cfd4f63d48462f6aadbecee3ad9603b4b88b60cb821c1b258576"}, + {file = "pydantic_core-2.23.2-cp311-none-win_amd64.whl", hash = "sha256:6f80fba4af0cb1d2344869d56430e304a51396b70d46b91a55ed4959993c0589"}, + {file = "pydantic_core-2.23.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:4c83c64d05ffbbe12d4e8498ab72bdb05bcc1026340a4a597dc647a13c1605ec"}, + {file = "pydantic_core-2.23.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6294907eaaccf71c076abdd1c7954e272efa39bb043161b4b8aa1cd76a16ce43"}, + {file = "pydantic_core-2.23.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a801c5e1e13272e0909c520708122496647d1279d252c9e6e07dac216accc41"}, + {file = "pydantic_core-2.23.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cc0c316fba3ce72ac3ab7902a888b9dc4979162d320823679da270c2d9ad0cad"}, + {file = "pydantic_core-2.23.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b06c5d4e8701ac2ba99a2ef835e4e1b187d41095a9c619c5b185c9068ed2a49"}, + {file = "pydantic_core-2.23.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:82764c0bd697159fe9947ad59b6db6d7329e88505c8f98990eb07e84cc0a5d81"}, + {file = "pydantic_core-2.23.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b1a195efd347ede8bcf723e932300292eb13a9d2a3c1f84eb8f37cbbc905b7f"}, + {file = "pydantic_core-2.23.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b7efb12e5071ad8d5b547487bdad489fbd4a5a35a0fc36a1941517a6ad7f23e0"}, + {file = "pydantic_core-2.23.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5dd0ec5f514ed40e49bf961d49cf1bc2c72e9b50f29a163b2cc9030c6742aa73"}, + {file = "pydantic_core-2.23.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:820f6ee5c06bc868335e3b6e42d7ef41f50dfb3ea32fbd523ab679d10d8741c0"}, + {file = "pydantic_core-2.23.2-cp312-none-win32.whl", hash = "sha256:3713dc093d5048bfaedbba7a8dbc53e74c44a140d45ede020dc347dda18daf3f"}, + {file = "pydantic_core-2.23.2-cp312-none-win_amd64.whl", hash = "sha256:e1895e949f8849bc2757c0dbac28422a04be031204df46a56ab34bcf98507342"}, + {file = "pydantic_core-2.23.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:da43cbe593e3c87d07108d0ebd73771dc414488f1f91ed2e204b0370b94b37ac"}, + {file = "pydantic_core-2.23.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:64d094ea1aa97c6ded4748d40886076a931a8bf6f61b6e43e4a1041769c39dd2"}, + {file = "pydantic_core-2.23.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:084414ffe9a85a52940b49631321d636dadf3576c30259607b75516d131fecd0"}, + {file = "pydantic_core-2.23.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:043ef8469f72609c4c3a5e06a07a1f713d53df4d53112c6d49207c0bd3c3bd9b"}, + {file = "pydantic_core-2.23.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3649bd3ae6a8ebea7dc381afb7f3c6db237fc7cebd05c8ac36ca8a4187b03b30"}, + {file = "pydantic_core-2.23.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6db09153d8438425e98cdc9a289c5fade04a5d2128faff8f227c459da21b9703"}, + {file = "pydantic_core-2.23.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5668b3173bb0b2e65020b60d83f5910a7224027232c9f5dc05a71a1deac9f960"}, + {file = "pydantic_core-2.23.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1c7b81beaf7c7ebde978377dc53679c6cba0e946426fc7ade54251dfe24a7604"}, + {file = "pydantic_core-2.23.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:ae579143826c6f05a361d9546446c432a165ecf1c0b720bbfd81152645cb897d"}, + {file = "pydantic_core-2.23.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:19f1352fe4b248cae22a89268720fc74e83f008057a652894f08fa931e77dced"}, + {file = "pydantic_core-2.23.2-cp313-none-win32.whl", hash = "sha256:e1a79ad49f346aa1a2921f31e8dbbab4d64484823e813a002679eaa46cba39e1"}, + {file = "pydantic_core-2.23.2-cp313-none-win_amd64.whl", hash = "sha256:582871902e1902b3c8e9b2c347f32a792a07094110c1bca6c2ea89b90150caac"}, + {file = "pydantic_core-2.23.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:743e5811b0c377eb830150d675b0847a74a44d4ad5ab8845923d5b3a756d8100"}, + {file = "pydantic_core-2.23.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6650a7bbe17a2717167e3e23c186849bae5cef35d38949549f1c116031b2b3aa"}, + {file = "pydantic_core-2.23.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56e6a12ec8d7679f41b3750ffa426d22b44ef97be226a9bab00a03365f217b2b"}, + {file = "pydantic_core-2.23.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:810ca06cca91de9107718dc83d9ac4d2e86efd6c02cba49a190abcaf33fb0472"}, + {file = "pydantic_core-2.23.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:785e7f517ebb9890813d31cb5d328fa5eda825bb205065cde760b3150e4de1f7"}, + {file = "pydantic_core-2.23.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ef71ec876fcc4d3bbf2ae81961959e8d62f8d74a83d116668409c224012e3af"}, + {file = "pydantic_core-2.23.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d50ac34835c6a4a0d456b5db559b82047403c4317b3bc73b3455fefdbdc54b0a"}, + {file = "pydantic_core-2.23.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:16b25a4a120a2bb7dab51b81e3d9f3cde4f9a4456566c403ed29ac81bf49744f"}, + {file = "pydantic_core-2.23.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:41ae8537ad371ec018e3c5da0eb3f3e40ee1011eb9be1da7f965357c4623c501"}, + {file = "pydantic_core-2.23.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:07049ec9306ec64e955b2e7c40c8d77dd78ea89adb97a2013d0b6e055c5ee4c5"}, + {file = "pydantic_core-2.23.2-cp38-none-win32.whl", hash = "sha256:086c5db95157dc84c63ff9d96ebb8856f47ce113c86b61065a066f8efbe80acf"}, + {file = "pydantic_core-2.23.2-cp38-none-win_amd64.whl", hash = "sha256:67b6655311b00581914aba481729971b88bb8bc7996206590700a3ac85e457b8"}, + {file = "pydantic_core-2.23.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:358331e21a897151e54d58e08d0219acf98ebb14c567267a87e971f3d2a3be59"}, + {file = "pydantic_core-2.23.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c4d9f15ffe68bcd3898b0ad7233af01b15c57d91cd1667f8d868e0eacbfe3f87"}, + {file = "pydantic_core-2.23.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0123655fedacf035ab10c23450163c2f65a4174f2bb034b188240a6cf06bb123"}, + {file = "pydantic_core-2.23.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e6e3ccebdbd6e53474b0bb7ab8b88e83c0cfe91484b25e058e581348ee5a01a5"}, + {file = "pydantic_core-2.23.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc535cb898ef88333cf317777ecdfe0faac1c2a3187ef7eb061b6f7ecf7e6bae"}, + {file = "pydantic_core-2.23.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aab9e522efff3993a9e98ab14263d4e20211e62da088298089a03056980a3e69"}, + {file = "pydantic_core-2.23.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05b366fb8fe3d8683b11ac35fa08947d7b92be78ec64e3277d03bd7f9b7cda79"}, + {file = "pydantic_core-2.23.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7568f682c06f10f30ef643a1e8eec4afeecdafde5c4af1b574c6df079e96f96c"}, + {file = "pydantic_core-2.23.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:cdd02a08205dc90238669f082747612cb3c82bd2c717adc60f9b9ecadb540f80"}, + {file = "pydantic_core-2.23.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1a2ab4f410f4b886de53b6bddf5dd6f337915a29dd9f22f20f3099659536b2f6"}, + {file = "pydantic_core-2.23.2-cp39-none-win32.whl", hash = "sha256:0448b81c3dfcde439551bb04a9f41d7627f676b12701865c8a2574bcea034437"}, + {file = "pydantic_core-2.23.2-cp39-none-win_amd64.whl", hash = "sha256:4cebb9794f67266d65e7e4cbe5dcf063e29fc7b81c79dc9475bd476d9534150e"}, + {file = "pydantic_core-2.23.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e758d271ed0286d146cf7c04c539a5169a888dd0b57026be621547e756af55bc"}, + {file = "pydantic_core-2.23.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:f477d26183e94eaafc60b983ab25af2a809a1b48ce4debb57b343f671b7a90b6"}, + {file = "pydantic_core-2.23.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da3131ef2b940b99106f29dfbc30d9505643f766704e14c5d5e504e6a480c35e"}, + {file = "pydantic_core-2.23.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:329a721253c7e4cbd7aad4a377745fbcc0607f9d72a3cc2102dd40519be75ed2"}, + {file = "pydantic_core-2.23.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7706e15cdbf42f8fab1e6425247dfa98f4a6f8c63746c995d6a2017f78e619ae"}, + {file = "pydantic_core-2.23.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:e64ffaf8f6e17ca15eb48344d86a7a741454526f3a3fa56bc493ad9d7ec63936"}, + {file = "pydantic_core-2.23.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:dd59638025160056687d598b054b64a79183f8065eae0d3f5ca523cde9943940"}, + {file = "pydantic_core-2.23.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:12625e69b1199e94b0ae1c9a95d000484ce9f0182f9965a26572f054b1537e44"}, + {file = "pydantic_core-2.23.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5d813fd871b3d5c3005157622ee102e8908ad6011ec915a18bd8fde673c4360e"}, + {file = "pydantic_core-2.23.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1eb37f7d6a8001c0f86dc8ff2ee8d08291a536d76e49e78cda8587bb54d8b329"}, + {file = "pydantic_core-2.23.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ce7eaf9a98680b4312b7cebcdd9352531c43db00fca586115845df388f3c465"}, + {file = "pydantic_core-2.23.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f087879f1ffde024dd2788a30d55acd67959dcf6c431e9d3682d1c491a0eb474"}, + {file = "pydantic_core-2.23.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6ce883906810b4c3bd90e0ada1f9e808d9ecf1c5f0b60c6b8831d6100bcc7dd6"}, + {file = "pydantic_core-2.23.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:a8031074a397a5925d06b590121f8339d34a5a74cfe6970f8a1124eb8b83f4ac"}, + {file = "pydantic_core-2.23.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:23af245b8f2f4ee9e2c99cb3f93d0e22fb5c16df3f2f643f5a8da5caff12a653"}, + {file = "pydantic_core-2.23.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c57e493a0faea1e4c38f860d6862ba6832723396c884fbf938ff5e9b224200e2"}, + {file = "pydantic_core-2.23.2.tar.gz", hash = "sha256:95d6bf449a1ac81de562d65d180af5d8c19672793c81877a2eda8fde5d08f2fd"}, ] [package.dependencies] @@ -2274,8 +2275,8 @@ files = [ astroid = ">=3.2.4,<=3.3.0-dev0" colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} dill = [ - {version = ">=0.2", markers = "python_version < \"3.11\""}, {version = ">=0.3.7", markers = "python_version >= \"3.12\""}, + {version = ">=0.2", markers = "python_version < \"3.11\""}, {version = ">=0.3.6", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, ] isort = ">=4.2.5,<5.13.0 || >5.13.0,<6" From 1423b630ce85404f2b7c616642644e8f2791f4c7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 5 Sep 2024 20:07:24 +0000 Subject: [PATCH 019/102] fix(deps): update dependency openai to v1.43.1 (#4164) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/poetry.lock b/poetry.lock index d4a00199d71..3fc260b2f48 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1591,13 +1591,13 @@ signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] [[package]] name = "openai" -version = "1.43.0" +version = "1.43.1" description = "The official Python library for the openai API" optional = false python-versions = ">=3.7.1" files = [ - {file = "openai-1.43.0-py3-none-any.whl", hash = "sha256:1a748c2728edd3a738a72a0212ba866f4fdbe39c9ae03813508b267d45104abe"}, - {file = "openai-1.43.0.tar.gz", hash = "sha256:e607aff9fc3e28eade107e5edd8ca95a910a4b12589336d3cbb6bfe2ac306b3c"}, + {file = "openai-1.43.1-py3-none-any.whl", hash = "sha256:23ed3aa71e89cf644c911f7ab80087d08c0bf46ce6b75d9a811fc7942cff85c2"}, + {file = "openai-1.43.1.tar.gz", hash = "sha256:b64843711b7c92ded36795062ea1f8cad84ec6c2848646f2a786ac4617a6b9f5"}, ] [package.dependencies] @@ -2071,8 +2071,8 @@ files = [ annotated-types = ">=0.4.0" pydantic-core = "2.23.2" typing-extensions = [ - {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, {version = ">=4.6.1", markers = "python_version < \"3.13\""}, + {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, ] tzdata = {version = "*", markers = "python_version >= \"3.9\""} @@ -2275,8 +2275,8 @@ files = [ astroid = ">=3.2.4,<=3.3.0-dev0" colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} dill = [ - {version = ">=0.3.7", markers = "python_version >= \"3.12\""}, {version = ">=0.2", markers = "python_version < \"3.11\""}, + {version = ">=0.3.7", markers = "python_version >= \"3.12\""}, {version = ">=0.3.6", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, ] isort = ">=4.2.5,<5.13.0 || >5.13.0,<6" From 0a68661081a06af2c5b0e0b844a054afee995c6c Mon Sep 17 00:00:00 2001 From: Michael Genson <71845777+michael-genson@users.noreply.github.com> Date: Fri, 6 Sep 2024 07:09:19 -0500 Subject: [PATCH 020/102] docs: OpenAI Documentation (#4165) --- .../installation/backend-config.md | 2 +- .../getting-started/installation/open-ai.md | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 docs/docs/documentation/getting-started/installation/open-ai.md diff --git a/docs/docs/documentation/getting-started/installation/backend-config.md b/docs/docs/documentation/getting-started/installation/backend-config.md index e5fdc0912e8..5ad9fc3ba44 100644 --- a/docs/docs/documentation/getting-started/installation/backend-config.md +++ b/docs/docs/documentation/getting-started/installation/backend-config.md @@ -104,7 +104,7 @@ For usage, see [Usage - OpenID Connect](../authentication/oidc.md) :octicons-tag-24: v1.7.0 -Mealie supports various integrations using OpenAI. To enable OpenAI, [you must provide your OpenAI API key](https://platform.openai.com/api-keys). You can tweak how OpenAI is used using these backend settings. Please note that while OpenAI usage is optimized to reduce API costs, you're unlikely to be able to use OpenAI features with the free tier limits. +Mealie supports various integrations using OpenAI. For more information, check out our [OpenAI documentation](./open-ai.md). | Variables | Default | Description | | ---------------------------- | :-----: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | diff --git a/docs/docs/documentation/getting-started/installation/open-ai.md b/docs/docs/documentation/getting-started/installation/open-ai.md new file mode 100644 index 00000000000..740064c5220 --- /dev/null +++ b/docs/docs/documentation/getting-started/installation/open-ai.md @@ -0,0 +1,18 @@ +# OpenAI Integration + +:octicons-tag-24: v1.7.0 + +Mealie's OpenAI integration enables several features and enhancements throughout the application. To enable OpenAI features, you must have an account with OpenAI and configure Mealie to use the OpenAI API key (for more information, check out the [backend configuration](./backend-config.md#openai)). + +## Configuration + +For most users, supplying the OpenAI API key is all you need to do; you will use the regular OpenAI service with the default language model. Note that while OpenAI has a free tier, it's not sufficiently capable for Mealie (or most other production use cases). For more information, check out [OpenAI's rate limits](https://platform.openai.com/docs/guides/rate-limits). If you deposit $5 into your OpenAI account, you will be permanently bumped up to Tier 1, which is sufficient for Mealie. Cost per-request is dependant on many factors, but Mealie tries to keep token counts conservative. + +Alternatively, if you have another service you'd like to use in-place of OpenAI, you can configure Mealie to use that instead, as long as it has an OpenAI-compatible API. For instance, a common self-hosted alternative to OpenAI is [Ollama](https://ollama.com/). To use Ollama with Mealie, change your `OPENAI_BASE_URL` to `http://localhost:11434/v1` (where `http://localhost:11434` is wherever you're hosting Ollama, and `/v1` enables the OpenAI-compatible endpoints). Note that you *must* provide an API key, even though it is ultimately ignored by Ollama. + +If you wish to disable image recognition features (to save costs, or because your custom model doesn't support them) you can set `OPENAI_ENABLE_IMAGE_SERVICES` to `False`. For more information on what configuration options are available, check out the [backend configuration](./backend-config.md#openai). + +## OpenAI Features +- The OpenAI Ingredient Parser can be used as an alternative to the NLP and Brute Force parsers. Simply choose the OpenAI parser while parsing ingredients (:octicons-tag-24: v1.7.0) +- When importing a recipe via URL, if the default recipe scraper is unable to read the recipe data from a webpage, the webpage contents will be parsed by OpenAI (:octicons-tag-24: v1.9.0) +- You can import an image of a written recipe, which is sent to OpenAI and imported into Mealie. The recipe can be hand-written or typed, as long as the text is in the picture. You can also optionally have OpenAI translate the recipe into your own language (:octicons-tag-24: v1.12.0) From ef488bee46efb8e6dd0327947902bae707235dec Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 6 Sep 2024 09:32:28 -0500 Subject: [PATCH 021/102] fix(deps): update dependency sqlalchemy to v2.0.34 (#4156) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 100 ++++++++++++++++++++++++++-------------------------- 1 file changed, 50 insertions(+), 50 deletions(-) diff --git a/poetry.lock b/poetry.lock index 3fc260b2f48..a46a543b3dd 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2920,60 +2920,60 @@ files = [ [[package]] name = "sqlalchemy" -version = "2.0.33" +version = "2.0.34" description = "Database Abstraction Library" optional = false python-versions = ">=3.7" files = [ - {file = "SQLAlchemy-2.0.33-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:63b7d9890f7958dabd95cf98a3f48740fbe2bb0493523aef590e82164fa68194"}, - {file = "SQLAlchemy-2.0.33-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:32a4f38d2efca066ec793451ef6852cb0d9086dc3d5479d88a5a25529d1d1861"}, - {file = "SQLAlchemy-2.0.33-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3926e4ed4a3e956c8b2b0f1140493378c8cd17cad123b4fc1e0f6ecd3e05b19"}, - {file = "SQLAlchemy-2.0.33-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2415824ec658891ac38d13a2f36b4ceb2033f034dee1c226f83917589a65f072"}, - {file = "SQLAlchemy-2.0.33-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:92249ac94279b8e5f0c0c8420e09b804d0a49d2269f52f549d4cb536c8382434"}, - {file = "SQLAlchemy-2.0.33-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c9f4f92eee7d06531cc6a5b814e603a0c7639876aab03638dcc70c420a3974f6"}, - {file = "SQLAlchemy-2.0.33-cp310-cp310-win32.whl", hash = "sha256:4f1c44c8d66101e6f627f330d8b5b3de5ad25eedb6df3ce39a2e6f92debbcf15"}, - {file = "SQLAlchemy-2.0.33-cp310-cp310-win_amd64.whl", hash = "sha256:3ad94634338d8c576b1d47a96c798be186650aa5282072053ce2d12c6f309f82"}, - {file = "SQLAlchemy-2.0.33-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:570ec43e8c3c020abac4f0720baa5fe5187334e3f1e8e1777183c041962b61cc"}, - {file = "SQLAlchemy-2.0.33-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81759e77a4985abdbac068762a0eaf0f11860fe041ad6da170aae7615ea72531"}, - {file = "SQLAlchemy-2.0.33-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:49541a43828e273325c520fbacf786615bd974dad63ff60b8ea1e1216e914d1a"}, - {file = "SQLAlchemy-2.0.33-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82c72da5be489c8d150deba70d5732398695418df5232bceb52ee323ddd9753b"}, - {file = "SQLAlchemy-2.0.33-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:31e56020832be602201fbf8189f379569cf5c3604cdc4ce79f10dbbfcbf8a0eb"}, - {file = "SQLAlchemy-2.0.33-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:30a3f55be76364b64c83788728faaba782ab282a24909e1994404c2146d39982"}, - {file = "SQLAlchemy-2.0.33-cp311-cp311-win32.whl", hash = "sha256:17d0c69f66392ad2db1609373a74d1f834b2e632f3f52d446747b8ec220aea53"}, - {file = "SQLAlchemy-2.0.33-cp311-cp311-win_amd64.whl", hash = "sha256:c5d5a733c6af7f392435e673d1b136f6bdf2366033abb35eed680400dc730840"}, - {file = "SQLAlchemy-2.0.33-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1d81e3aeab456fe24c3f0dcfd4f952a3a5ee45e9c14fc66d34c1d7a60cf7b698"}, - {file = "SQLAlchemy-2.0.33-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ca8788dc1baee100f09110f33a01d928cf9df4483d2bfb25a37be31a659d46bb"}, - {file = "SQLAlchemy-2.0.33-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:60c54b677d4f0a0b2df3b79e89e84d601fb931c720176641742efd66b50601f9"}, - {file = "SQLAlchemy-2.0.33-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:684aee5fd811091b2f48006fb3fe6c7f2de4a716ef8d294a2aab762099753133"}, - {file = "SQLAlchemy-2.0.33-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ee2b82b170591ccd19d463c9798a9caeea0cad967a8d2f3264de459f582696d5"}, - {file = "SQLAlchemy-2.0.33-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1109cc6dc5c9d1223c42186391e6a5509e6d4ab2c30fa629573c10184f742f2e"}, - {file = "SQLAlchemy-2.0.33-cp312-cp312-win32.whl", hash = "sha256:c633e2d2f8a7b88c06e276bbe16cb7e62fed815fcbeb69cd9752cea166ecb8e8"}, - {file = "SQLAlchemy-2.0.33-cp312-cp312-win_amd64.whl", hash = "sha256:77eaf8fdf305266b806a91ae4633edbf86ad37e13bd92ac85e305e7f654c19a5"}, - {file = "SQLAlchemy-2.0.33-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:67eb8e0ffbebd3d82ec5079ca5f807a661c574b482785483717857c2acab833a"}, - {file = "SQLAlchemy-2.0.33-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3da2371628e28ef279f3f756f5e58858fad7820de08508138c9f5f9e4d8f4ac"}, - {file = "SQLAlchemy-2.0.33-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7c82a7930126bb5ccfbb73fc1562d52942fbffb2fda2791fab49de249fc202a"}, - {file = "SQLAlchemy-2.0.33-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d004a623ad4aa8d2eb31b37e65b5e020c9f65a1852b8b9e6301f0e411aca5b9a"}, - {file = "SQLAlchemy-2.0.33-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:06b30bbc43c6dd8b7cdc509cd2e58f4f1dce867565642e1d1a65e32459c89bd0"}, - {file = "SQLAlchemy-2.0.33-cp37-cp37m-win32.whl", hash = "sha256:459099ab8dd43a5edbb99f58ba4730baec457df9c06ebc71434c6b4b78cc8cf9"}, - {file = "SQLAlchemy-2.0.33-cp37-cp37m-win_amd64.whl", hash = "sha256:3c64d58e83a68e228b1ae6ebac8721241e9d8cc5e0c0dd11ed5d89155477b243"}, - {file = "SQLAlchemy-2.0.33-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9d035a672d5b3e4793a4a8865c3274a7bbbac7fac67a47b415023b5539105087"}, - {file = "SQLAlchemy-2.0.33-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:61e9a2d68a5a8ca6a84cbc79aa7f2e430ae854d3351d6e9ceb3edf6798797b63"}, - {file = "SQLAlchemy-2.0.33-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:93efa4b72f7cb70555b0f66ee5e113ae40073c57054a72887e50b05bfd97baa4"}, - {file = "SQLAlchemy-2.0.33-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac252bafe8cbadfac7b1e8a74748ffd775e27325186d12b82600b652d9adcb86"}, - {file = "SQLAlchemy-2.0.33-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2b1e98507ec2aa200af980d592e936e9dac1c1ec50acc94330ae4b13c55d6fea"}, - {file = "SQLAlchemy-2.0.33-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:523ae689c023cbf0fe1613101254824515193f85f806ba04611dee83302660b5"}, - {file = "SQLAlchemy-2.0.33-cp38-cp38-win32.whl", hash = "sha256:7fd0a28bc24a75326f13735a58272247f65c9e8ee16205eacb2431d6ee94f44a"}, - {file = "SQLAlchemy-2.0.33-cp38-cp38-win_amd64.whl", hash = "sha256:0ea64443a86c3b5a0fd7c93363ad2f9465cb3af61f9920b7c75d1a7bebbeef8a"}, - {file = "SQLAlchemy-2.0.33-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9e5819822050e6e36e2aa41260d05074c026a1bbb9baa6869170b5ce64db7a4d"}, - {file = "SQLAlchemy-2.0.33-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8bef11d31a1c48f5943e577d1ef81085ec1550c37552bfc9bf8e5d184ce47142"}, - {file = "SQLAlchemy-2.0.33-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06504d9625e3ef114b39803ebca6f379133acad58a87c33117ddc5df66079915"}, - {file = "SQLAlchemy-2.0.33-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:454e9b4355f0051063daebc4060140251c19f33fc5d02151c347431860fd104b"}, - {file = "SQLAlchemy-2.0.33-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:28c0800c851955f5bd11c0b904638c1343002650d0c071c6fbf0d157cc78627d"}, - {file = "SQLAlchemy-2.0.33-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:816c927dd51e4951d6e79870c945340057a5d8e63543419dee0d247bd67a88f8"}, - {file = "SQLAlchemy-2.0.33-cp39-cp39-win32.whl", hash = "sha256:c40e0213beaf410a151e4329e30c73687838c251c998ba1b312975dbbcb2d05d"}, - {file = "SQLAlchemy-2.0.33-cp39-cp39-win_amd64.whl", hash = "sha256:751eaafa907a66dd9a328a9d15c3dcfdcba3ef8dd8f7f4a9771cdacdec45d9bf"}, - {file = "SQLAlchemy-2.0.33-py3-none-any.whl", hash = "sha256:ae294808afde1b14a1a69aa86a69cadfe391848bbb233a5332a8065e4081cabc"}, - {file = "sqlalchemy-2.0.33.tar.gz", hash = "sha256:91c93333c2b37ff721dc83b37e28c29de4c502b5612f2d093468037b86aa2be0"}, + {file = "SQLAlchemy-2.0.34-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:95d0b2cf8791ab5fb9e3aa3d9a79a0d5d51f55b6357eecf532a120ba3b5524db"}, + {file = "SQLAlchemy-2.0.34-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:243f92596f4fd4c8bd30ab8e8dd5965afe226363d75cab2468f2c707f64cd83b"}, + {file = "SQLAlchemy-2.0.34-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ea54f7300553af0a2a7235e9b85f4204e1fc21848f917a3213b0e0818de9a24"}, + {file = "SQLAlchemy-2.0.34-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:173f5f122d2e1bff8fbd9f7811b7942bead1f5e9f371cdf9e670b327e6703ebd"}, + {file = "SQLAlchemy-2.0.34-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:196958cde924a00488e3e83ff917be3b73cd4ed8352bbc0f2989333176d1c54d"}, + {file = "SQLAlchemy-2.0.34-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bd90c221ed4e60ac9d476db967f436cfcecbd4ef744537c0f2d5291439848768"}, + {file = "SQLAlchemy-2.0.34-cp310-cp310-win32.whl", hash = "sha256:3166dfff2d16fe9be3241ee60ece6fcb01cf8e74dd7c5e0b64f8e19fab44911b"}, + {file = "SQLAlchemy-2.0.34-cp310-cp310-win_amd64.whl", hash = "sha256:6831a78bbd3c40f909b3e5233f87341f12d0b34a58f14115c9e94b4cdaf726d3"}, + {file = "SQLAlchemy-2.0.34-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7db3db284a0edaebe87f8f6642c2b2c27ed85c3e70064b84d1c9e4ec06d5d84"}, + {file = "SQLAlchemy-2.0.34-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:430093fce0efc7941d911d34f75a70084f12f6ca5c15d19595c18753edb7c33b"}, + {file = "SQLAlchemy-2.0.34-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79cb400c360c7c210097b147c16a9e4c14688a6402445ac848f296ade6283bbc"}, + {file = "SQLAlchemy-2.0.34-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb1b30f31a36c7f3fee848391ff77eebdd3af5750bf95fbf9b8b5323edfdb4ec"}, + {file = "SQLAlchemy-2.0.34-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8fddde2368e777ea2a4891a3fb4341e910a056be0bb15303bf1b92f073b80c02"}, + {file = "SQLAlchemy-2.0.34-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:80bd73ea335203b125cf1d8e50fef06be709619eb6ab9e7b891ea34b5baa2287"}, + {file = "SQLAlchemy-2.0.34-cp311-cp311-win32.whl", hash = "sha256:6daeb8382d0df526372abd9cb795c992e18eed25ef2c43afe518c73f8cccb721"}, + {file = "SQLAlchemy-2.0.34-cp311-cp311-win_amd64.whl", hash = "sha256:5bc08e75ed11693ecb648b7a0a4ed80da6d10845e44be0c98c03f2f880b68ff4"}, + {file = "SQLAlchemy-2.0.34-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:53e68b091492c8ed2bd0141e00ad3089bcc6bf0e6ec4142ad6505b4afe64163e"}, + {file = "SQLAlchemy-2.0.34-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bcd18441a49499bf5528deaa9dee1f5c01ca491fc2791b13604e8f972877f812"}, + {file = "SQLAlchemy-2.0.34-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:165bbe0b376541092bf49542bd9827b048357f4623486096fc9aaa6d4e7c59a2"}, + {file = "SQLAlchemy-2.0.34-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3330415cd387d2b88600e8e26b510d0370db9b7eaf984354a43e19c40df2e2b"}, + {file = "SQLAlchemy-2.0.34-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:97b850f73f8abbffb66ccbab6e55a195a0eb655e5dc74624d15cff4bfb35bd74"}, + {file = "SQLAlchemy-2.0.34-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7cee4c6917857fd6121ed84f56d1dc78eb1d0e87f845ab5a568aba73e78adf83"}, + {file = "SQLAlchemy-2.0.34-cp312-cp312-win32.whl", hash = "sha256:fbb034f565ecbe6c530dff948239377ba859420d146d5f62f0271407ffb8c580"}, + {file = "SQLAlchemy-2.0.34-cp312-cp312-win_amd64.whl", hash = "sha256:707c8f44931a4facd4149b52b75b80544a8d824162602b8cd2fe788207307f9a"}, + {file = "SQLAlchemy-2.0.34-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:24af3dc43568f3780b7e1e57c49b41d98b2d940c1fd2e62d65d3928b6f95f021"}, + {file = "SQLAlchemy-2.0.34-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e60ed6ef0a35c6b76b7640fe452d0e47acc832ccbb8475de549a5cc5f90c2c06"}, + {file = "SQLAlchemy-2.0.34-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:413c85cd0177c23e32dee6898c67a5f49296640041d98fddb2c40888fe4daa2e"}, + {file = "SQLAlchemy-2.0.34-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:25691f4adfb9d5e796fd48bf1432272f95f4bbe5f89c475a788f31232ea6afba"}, + {file = "SQLAlchemy-2.0.34-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:526ce723265643dbc4c7efb54f56648cc30e7abe20f387d763364b3ce7506c82"}, + {file = "SQLAlchemy-2.0.34-cp37-cp37m-win32.whl", hash = "sha256:13be2cc683b76977a700948411a94c67ad8faf542fa7da2a4b167f2244781cf3"}, + {file = "SQLAlchemy-2.0.34-cp37-cp37m-win_amd64.whl", hash = "sha256:e54ef33ea80d464c3dcfe881eb00ad5921b60f8115ea1a30d781653edc2fd6a2"}, + {file = "SQLAlchemy-2.0.34-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:43f28005141165edd11fbbf1541c920bd29e167b8bbc1fb410d4fe2269c1667a"}, + {file = "SQLAlchemy-2.0.34-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b68094b165a9e930aedef90725a8fcfafe9ef95370cbb54abc0464062dbf808f"}, + {file = "SQLAlchemy-2.0.34-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a1e03db964e9d32f112bae36f0cc1dcd1988d096cfd75d6a588a3c3def9ab2b"}, + {file = "SQLAlchemy-2.0.34-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:203d46bddeaa7982f9c3cc693e5bc93db476ab5de9d4b4640d5c99ff219bee8c"}, + {file = "SQLAlchemy-2.0.34-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ae92bebca3b1e6bd203494e5ef919a60fb6dfe4d9a47ed2453211d3bd451b9f5"}, + {file = "SQLAlchemy-2.0.34-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:9661268415f450c95f72f0ac1217cc6f10256f860eed85c2ae32e75b60278ad8"}, + {file = "SQLAlchemy-2.0.34-cp38-cp38-win32.whl", hash = "sha256:895184dfef8708e15f7516bd930bda7e50ead069280d2ce09ba11781b630a434"}, + {file = "SQLAlchemy-2.0.34-cp38-cp38-win_amd64.whl", hash = "sha256:6e7cde3a2221aa89247944cafb1b26616380e30c63e37ed19ff0bba5e968688d"}, + {file = "SQLAlchemy-2.0.34-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dbcdf987f3aceef9763b6d7b1fd3e4ee210ddd26cac421d78b3c206d07b2700b"}, + {file = "SQLAlchemy-2.0.34-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ce119fc4ce0d64124d37f66a6f2a584fddc3c5001755f8a49f1ca0a177ef9796"}, + {file = "SQLAlchemy-2.0.34-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a17d8fac6df9835d8e2b4c5523666e7051d0897a93756518a1fe101c7f47f2f0"}, + {file = "SQLAlchemy-2.0.34-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ebc11c54c6ecdd07bb4efbfa1554538982f5432dfb8456958b6d46b9f834bb7"}, + {file = "SQLAlchemy-2.0.34-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2e6965346fc1491a566e019a4a1d3dfc081ce7ac1a736536367ca305da6472a8"}, + {file = "SQLAlchemy-2.0.34-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:220574e78ad986aea8e81ac68821e47ea9202b7e44f251b7ed8c66d9ae3f4278"}, + {file = "SQLAlchemy-2.0.34-cp39-cp39-win32.whl", hash = "sha256:b75b00083e7fe6621ce13cfce9d4469c4774e55e8e9d38c305b37f13cf1e874c"}, + {file = "SQLAlchemy-2.0.34-cp39-cp39-win_amd64.whl", hash = "sha256:c29d03e0adf3cc1a8c3ec62d176824972ae29b67a66cbb18daff3062acc6faa8"}, + {file = "SQLAlchemy-2.0.34-py3-none-any.whl", hash = "sha256:7286c353ee6475613d8beff83167374006c6b3e3f0e6491bfe8ca610eb1dec0f"}, + {file = "sqlalchemy-2.0.34.tar.gz", hash = "sha256:10d8f36990dd929690666679b0f42235c159a7051534adb135728ee52828dd22"}, ] [package.dependencies] From 200706d4a6ba060f03987dd026f029e4c6cc7e25 Mon Sep 17 00:00:00 2001 From: Michael Genson <71845777+michael-genson@users.noreply.github.com> Date: Fri, 6 Sep 2024 11:38:55 -0500 Subject: [PATCH 022/102] docs: Added OpenAI Page to mkdocs (#4167) --- docs/mkdocs.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index d1d881a2b24..236f6a4935f 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -74,6 +74,7 @@ nav: - Backend Configuration: "documentation/getting-started/installation/backend-config.md" - Security: "documentation/getting-started/installation/security.md" - Logs: "documentation/getting-started/installation/logs.md" + - OpenAI: "documentation/getting-started/installation/openai.md" - Usage: - Backup and Restoring: "documentation/getting-started/usage/backups-and-restoring.md" - Permissions and Public Access: "documentation/getting-started/usage/permissions-and-public-access.md" From 777e9e7580463a7a0bf55bbcab40843d9d8148a9 Mon Sep 17 00:00:00 2001 From: paaff Date: Fri, 6 Sep 2024 21:03:05 +0200 Subject: [PATCH 023/102] docs: add keep screen alive entry (#4116) Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com> --- docs/docs/documentation/getting-started/faq.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/docs/documentation/getting-started/faq.md b/docs/docs/documentation/getting-started/faq.md index 9da52d40351..78473d3cba2 100644 --- a/docs/docs/documentation/getting-started/faq.md +++ b/docs/docs/documentation/getting-started/faq.md @@ -149,3 +149,11 @@ As to why we need a database? - **Developer Experience:** Without a database, a lot of the work to maintain your data is taken on by the developer instead of a battle-tested platform for storing data. - **Multi User Support:** With a solid database as backend storage for your data, Mealie can better support multi-user sites and avoid read/write access errors when multiple actions are taken at the same time. + +## Why is there no "Keep Screen Alive" button when I access a recipe? +You've perhaps visited the Mealie Demo and noticed that it had a "Keep Screen Alive" button, but it doesn't show up in your own Mealie instance. +There are typically two possible reasons for this: +1. You're accessing your Mealie instance without using HTTPS. The Wake Lock API is only available if HTTPS is used. Read more here: https://developer.mozilla.org/en-US/docs/Web/API/Screen_Wake_Lock_API +2. You're accessing your Mealie instance on a browser which doesn't support the API. You can test this here: https://vueuse.org/core/useWakeLock/#demo + +Solving the above points will most likely resolve your issues. However, if you're still having problems, you are welcome to create an issue. Just remember to add that you've tried the above two options first in your description. From 63709a3f71e71f929d6481dea6de66a5677b2096 Mon Sep 17 00:00:00 2001 From: Michael Genson <71845777+michael-genson@users.noreply.github.com> Date: Fri, 6 Sep 2024 20:35:10 -0500 Subject: [PATCH 024/102] docs: Fix OpenAI docs link (#4168) --- docs/mkdocs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index 236f6a4935f..2369a9a89e8 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -74,7 +74,7 @@ nav: - Backend Configuration: "documentation/getting-started/installation/backend-config.md" - Security: "documentation/getting-started/installation/security.md" - Logs: "documentation/getting-started/installation/logs.md" - - OpenAI: "documentation/getting-started/installation/openai.md" + - OpenAI: "documentation/getting-started/installation/open-ai.md" - Usage: - Backup and Restoring: "documentation/getting-started/usage/backups-and-restoring.md" - Permissions and Public Access: "documentation/getting-started/usage/permissions-and-public-access.md" From e8cec9a142eaf2265150915a59a20db63b480ee0 Mon Sep 17 00:00:00 2001 From: Vlad Shulcz Date: Sat, 7 Sep 2024 05:37:42 +0300 Subject: [PATCH 025/102] feat: Added feature to limit mealplan data by date range (#4111) Co-authored-by: Kuchenpirat <24235032+Kuchenpirat@users.noreply.github.com> --- mealie/repos/repository_meals.py | 12 + .../event_bus_service/event_bus_listeners.py | 18 +- .../scheduler/tasks/test_post_webhook.py | 226 ++++++++++++++++++ 3 files changed, 250 insertions(+), 6 deletions(-) diff --git a/mealie/repos/repository_meals.py b/mealie/repos/repository_meals.py index da26bf6cfdb..34187e35fb4 100644 --- a/mealie/repos/repository_meals.py +++ b/mealie/repos/repository_meals.py @@ -19,3 +19,15 @@ def get_today(self) -> list[ReadPlanEntry]: ) plans = self.session.execute(stmt).scalars().all() return [self.schema.model_validate(x) for x in plans] + + def get_meals_by_date_range(self, start_date: datetime, end_date: datetime) -> list[ReadPlanEntry]: + if not self.household_id: + raise Exception("household_id not set") + + stmt = select(GroupMealPlan).filter( + GroupMealPlan.date >= start_date.date(), + GroupMealPlan.date <= end_date.date(), + GroupMealPlan.household_id == self.household_id, + ) + plans = self.session.execute(stmt).scalars().all() + return [self.schema.model_validate(x) for x in plans] diff --git a/mealie/services/event_bus_service/event_bus_listeners.py b/mealie/services/event_bus_service/event_bus_listeners.py index 6443dbe956e..dd19992d9e3 100644 --- a/mealie/services/event_bus_service/event_bus_listeners.py +++ b/mealie/services/event_bus_service/event_bus_listeners.py @@ -16,7 +16,6 @@ from mealie.repos.repository_factory import AllRepositories from mealie.schema.household.group_events import GroupEventNotifierPrivate from mealie.schema.household.webhook import ReadWebhook -from mealie.schema.response.pagination import PaginationQuery from .event_types import Event, EventDocumentType, EventTypes, EventWebhookData from .publisher import ApprisePublisher, PublisherLike, WebhookPublisher @@ -123,7 +122,14 @@ def merge_query_parameters(url: str, params: dict): @staticmethod def is_custom_url(url: str): - return url.split(":", 1)[0].lower() in ["form", "forms", "json", "jsons", "xml", "xmls"] + return url.split(":", 1)[0].lower() in [ + "form", + "forms", + "json", + "jsons", + "xml", + "xmls", + ] class WebhookEventListener(EventListenerBase): @@ -143,12 +149,12 @@ def get_subscribers(self, event: Event) -> list[ReadWebhook]: def publish_to_subscribers(self, event: Event, subscribers: list[ReadWebhook]) -> None: with self.ensure_repos(self.group_id, self.household_id) as repos: if event.document_data.document_type == EventDocumentType.mealplan: - # TODO: limit mealplan data to a date range instead of returning all mealplans + webhook_data = cast(EventWebhookData, event.document_data) meal_repo = repos.meals - meal_pagination_data = meal_repo.page_all(pagination=PaginationQuery(page=1, per_page=-1)) - meal_data = meal_pagination_data.items + meal_data = meal_repo.get_meals_by_date_range( + webhook_data.webhook_start_dt, webhook_data.webhook_end_dt + ) if meal_data: - webhook_data = cast(EventWebhookData, event.document_data) webhook_data.webhook_body = meal_data self.publisher.publish(event, [webhook.url for webhook in subscribers]) diff --git a/tests/unit_tests/services_tests/scheduler/tasks/test_post_webhook.py b/tests/unit_tests/services_tests/scheduler/tasks/test_post_webhook.py index 9a6bd1eacd5..6a218d32202 100644 --- a/tests/unit_tests/services_tests/scheduler/tasks/test_post_webhook.py +++ b/tests/unit_tests/services_tests/scheduler/tasks/test_post_webhook.py @@ -5,6 +5,13 @@ from mealie.schema.household.webhook import SaveWebhook, WebhookType from mealie.services.event_bus_service.event_bus_listeners import WebhookEventListener +from mealie.services.event_bus_service.event_types import ( + Event, + EventBusMessage, + EventDocumentType, + EventTypes, + EventWebhookData, +) from tests.utils import random_string from tests.utils.factories import random_bool from tests.utils.fixture_schemas import TestUser @@ -69,3 +76,222 @@ def test_get_scheduled_webhooks_filter_query(unique_user: TestUser): if result.name == expected_item.name: # Names are uniquely generated so we can use this to compare assert result.enabled == expected_item.enabled break + + +def test_event_listener_get_meals_by_date_range(unique_user: TestUser): + """ + Test that WebhookEventListener correctly uses the get_meals_by_date_range method + to retrieve meals and publish the webhook event. + """ + meal_repo = unique_user.repos.meals + + start_date = datetime.now(timezone.utc) - timedelta(days=7) + end_date = datetime.now(timezone.utc) + + meal_1 = meal_repo.create( + { + "date": start_date + timedelta(days=1), + "entry_type": "lunch", + "title": "Meal 1", + "text": "Test meal 1", + "group_id": unique_user.group_id, + "household_id": unique_user.household_id, + "user_id": unique_user.user_id, + } + ) + meal_2 = meal_repo.create( + { + "date": start_date + timedelta(days=3), + "entry_type": "dinner", + "title": "Meal 2", + "text": "Test meal 2", + "group_id": unique_user.group_id, + "household_id": unique_user.household_id, + "user_id": unique_user.user_id, + } + ) + + webhook_data = EventWebhookData( + webhook_start_dt=start_date, + webhook_end_dt=end_date, + document_type=EventDocumentType.mealplan, + operation="create", + ) + event = Event( + event_type=EventTypes.webhook_task, + document_data=webhook_data, + message=EventBusMessage(title="Test event message"), + integration_id="00000000-0000-0000-0000-000000000000", + ) + + event_bus_listener = WebhookEventListener(UUID(unique_user.group_id), UUID(unique_user.household_id)) + subscribers = event_bus_listener.get_scheduled_webhooks(start_date, end_date) + + event_bus_listener.publish_to_subscribers(event, subscribers) + + assert event.document_data.webhook_body is not None + meals = event.document_data.webhook_body + assert len(meals) == 2 + + assert any(meal.title == "Meal 1" for meal in meals) + assert any(meal.title == "Meal 2" for meal in meals) + + try: + assert event.document_data.webhook_body is not None + meals = event.document_data.webhook_body + assert len(meals) == 2 + + assert any(meal.title == "Meal 1" for meal in meals) + assert any(meal.title == "Meal 2" for meal in meals) + + finally: + meal_repo.delete(meal_1.id) + meal_repo.delete(meal_2.id) + + +def test_get_meals_by_date_range(unique_user: TestUser): + meal_repo = unique_user.repos.meals + + start_date = datetime.now(timezone.utc) - timedelta(days=7) + end_date = datetime.now(timezone.utc) + + meal_1 = meal_repo.create( + { + "date": start_date + timedelta(days=1), + "entry_type": "breakfast", + "title": "Meal 1", + "text": "Test meal 1", + "group_id": unique_user.group_id, + "household_id": unique_user.household_id, + "user_id": unique_user.user_id, + } + ) + meal_2 = meal_repo.create( + { + "date": start_date + timedelta(days=3), + "entry_type": "lunch", + "title": "Meal 2", + "text": "Test meal 2", + "group_id": unique_user.group_id, + "household_id": unique_user.household_id, + "user_id": unique_user.user_id, + } + ) + meal_3 = meal_repo.create( + { + "date": start_date - timedelta(days=10), + "entry_type": "dinner", + "title": "Meal 3", + "text": "Test meal 3", + "group_id": unique_user.group_id, + "household_id": unique_user.household_id, + "user_id": unique_user.user_id, + } + ) + + try: + meals_in_range = meal_repo.get_meals_by_date_range(start_date, end_date) + + assert len(meals_in_range) == 2 + assert any(meal.title == "Meal 1" for meal in meals_in_range) + assert any(meal.title == "Meal 2" for meal in meals_in_range) + + assert all(meal.title != "Meal 3" for meal in meals_in_range) + + finally: + meal_repo.delete(meal_1.id) + meal_repo.delete(meal_2.id) + meal_repo.delete(meal_3.id) + + +def test_get_meals_by_date_range_no_meals(unique_user: TestUser): + """ + Test that get_meals_by_date_range returns an empty list when there are no meals in the given date range. + """ + meal_repo = unique_user.repos.meals + + start_date = datetime.now(timezone.utc) - timedelta(days=7) + end_date = datetime.now(timezone.utc) + + meals_in_range = meal_repo.get_meals_by_date_range(start_date, end_date) + + assert len(meals_in_range) == 0 + + +def test_get_meals_by_date_range_single_day(unique_user: TestUser): + """ + Test that get_meals_by_date_range returns meals correctly when start_date and end_date are the same. + """ + meal_repo = unique_user.repos.meals + + single_day = datetime.now(timezone.utc) + + meal_1 = meal_repo.create( + { + "date": single_day, + "entry_type": "breakfast", + "title": "Single Day Meal", + "text": "Test meal for a single day", + "group_id": unique_user.group_id, + "household_id": unique_user.household_id, + "user_id": unique_user.user_id, + } + ) + + try: + meals_in_range = meal_repo.get_meals_by_date_range(single_day, single_day) + + assert len(meals_in_range) == 1 + assert meals_in_range[0].title == "Single Day Meal" + assert meals_in_range[0].date == single_day.date() + + finally: + meal_repo.delete(meal_1.id) + + +def test_get_meals_by_date_range_no_overlap(unique_user: TestUser): + """ + Test that get_meals_by_date_range returns an empty list when there are no meals that overlap with the date range. + """ + meal_repo = unique_user.repos.meals + + start_date = datetime.now(timezone.utc) + timedelta(days=1) + end_date = datetime.now(timezone.utc) + timedelta(days=10) + + meal_1 = meal_repo.create( + { + "date": datetime.now(timezone.utc) - timedelta(days=5), + "entry_type": "dinner", + "title": "Meal Outside Range", + "text": "This meal is outside the tested date range", + "group_id": unique_user.group_id, + "household_id": unique_user.household_id, + "user_id": unique_user.user_id, + } + ) + + meals_in_range = meal_repo.get_meals_by_date_range(start_date, end_date) + + assert len(meals_in_range) == 0 + + try: + meals_in_range = meal_repo.get_meals_by_date_range(start_date, end_date) + + assert len(meals_in_range) == 0 + + finally: + meal_repo.delete(meal_1.id) + + +def test_get_meals_by_date_range_invalid_date_range(unique_user: TestUser): + """ + Test that get_meals_by_date_range raises an exception or returns empty when start_date is greater than end_date. + """ + meal_repo = unique_user.repos.meals + + start_date = datetime.now(timezone.utc) + end_date = start_date - timedelta(days=1) + + meals_in_range = meal_repo.get_meals_by_date_range(start_date, end_date) + + assert len(meals_in_range) == 0 From b8aa92c6077c36b6a61b825d64e47965cccf5f97 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 6 Sep 2024 21:57:57 -0500 Subject: [PATCH 026/102] fix(deps): update dependency fastapi to ^0.114.0 (#4169) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 8 ++++---- pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/poetry.lock b/poetry.lock index a46a543b3dd..ff828cbbdce 100644 --- a/poetry.lock +++ b/poetry.lock @@ -637,13 +637,13 @@ cli = ["requests"] [[package]] name = "fastapi" -version = "0.113.0" +version = "0.114.0" description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" optional = false python-versions = ">=3.8" files = [ - {file = "fastapi-0.113.0-py3-none-any.whl", hash = "sha256:c8d364485b6361fb643d53920a18d58a696e189abcb901ec03b487e35774c476"}, - {file = "fastapi-0.113.0.tar.gz", hash = "sha256:b7cf9684dc154dfc93f8b718e5850577b529889096518df44defa41e73caf50f"}, + {file = "fastapi-0.114.0-py3-none-any.whl", hash = "sha256:fee75aa1b1d3d73f79851c432497e4394e413e1dece6234f68d3ce250d12760a"}, + {file = "fastapi-0.114.0.tar.gz", hash = "sha256:9908f2a5cc733004de6ca5e1412698f35085cefcbfd41d539245b9edf87b73c1"}, ] [package.dependencies] @@ -3437,4 +3437,4 @@ pgsql = ["psycopg2-binary"] [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "71e3859f5c0f272a6f5c201774977c8969349a90bc769b4343522549a0141c62" +content-hash = "56ba1c022f27506ca044a9736690a1ad7d328d348785aa088e2f8784f046af22" diff --git a/pyproject.toml b/pyproject.toml index a7a183b3447..c45d06668a9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,7 +20,7 @@ appdirs = "1.4.4" apprise = "^1.4.5" bcrypt = "^4.0.1" extruct = "^0.17.0" -fastapi = "^0.113.0" +fastapi = "^0.114.0" httpx = "^0.27.0" lxml = "^5.0.0" orjson = "^3.8.0" From ad31b0906eaf4d63de6ab43d384c868b35da69ab Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 7 Sep 2024 03:09:50 +0000 Subject: [PATCH 027/102] fix(deps): update dependency openai to v1.44.0 (#4170) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index ff828cbbdce..94478e047b2 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1591,13 +1591,13 @@ signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] [[package]] name = "openai" -version = "1.43.1" +version = "1.44.0" description = "The official Python library for the openai API" optional = false python-versions = ">=3.7.1" files = [ - {file = "openai-1.43.1-py3-none-any.whl", hash = "sha256:23ed3aa71e89cf644c911f7ab80087d08c0bf46ce6b75d9a811fc7942cff85c2"}, - {file = "openai-1.43.1.tar.gz", hash = "sha256:b64843711b7c92ded36795062ea1f8cad84ec6c2848646f2a786ac4617a6b9f5"}, + {file = "openai-1.44.0-py3-none-any.whl", hash = "sha256:99a12bbda15f9c632ee911851e101669a82ee34992fbfd658a9db27d90dc0a9c"}, + {file = "openai-1.44.0.tar.gz", hash = "sha256:acde74598976ec85bc477e9abb94eeb17f6efd998914d5685eeb46a69116894a"}, ] [package.dependencies] From a0773a57143b726c26b6e16f9047375149891081 Mon Sep 17 00:00:00 2001 From: Hayden <64056131+hay-kot@users.noreply.github.com> Date: Sat, 7 Sep 2024 08:37:51 -0500 Subject: [PATCH 028/102] chore(l10n): New Crowdin updates (#4171) --- mealie/repos/seed/resources/units/locales/fr-FR.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mealie/repos/seed/resources/units/locales/fr-FR.json b/mealie/repos/seed/resources/units/locales/fr-FR.json index a652b217fe3..f902fac4617 100644 --- a/mealie/repos/seed/resources/units/locales/fr-FR.json +++ b/mealie/repos/seed/resources/units/locales/fr-FR.json @@ -42,7 +42,7 @@ "abbreviation": "gal" }, "milliliter": { - "name": "mililitre", + "name": "millilitre", "plural_name": "millilitres", "description": "", "abbreviation": "mL" From 9890135694dcc6c4c7e6aa2843c350189026b749 Mon Sep 17 00:00:00 2001 From: Hayden <64056131+hay-kot@users.noreply.github.com> Date: Sun, 8 Sep 2024 08:44:57 -0500 Subject: [PATCH 029/102] chore(l10n): New Crowdin updates (#4176) --- frontend/lang/messages/da-DK.json | 38 +++++++++---------- frontend/lang/messages/es-ES.json | 28 +++++++------- .../seed/resources/foods/locales/el-GR.json | 30 +++++++-------- .../seed/resources/units/locales/da-DK.json | 4 +- 4 files changed, 50 insertions(+), 50 deletions(-) diff --git a/frontend/lang/messages/da-DK.json b/frontend/lang/messages/da-DK.json index 0ffe1d54693..363b86f0e36 100644 --- a/frontend/lang/messages/da-DK.json +++ b/frontend/lang/messages/da-DK.json @@ -8,7 +8,7 @@ "database-type": "Database-type", "database-url": "Database-url", "default-group": "Standardgruppe", - "default-household": "Default Household", + "default-household": "Standard Husholdning", "demo": "Demo", "demo-status": "Demo status", "development": "Udvikling", @@ -270,27 +270,27 @@ "admin-group-management": "Administrationsgruppe Håndtering", "admin-group-management-text": "Ændringer i denne gruppe vil træde i kraft øjeblikkeligt.", "group-id-value": "Gruppe-ID: {0}", - "total-households": "Total Households" + "total-households": "Husholdninger i Alt" }, "household": { - "household": "Household", - "households": "Households", - "user-household": "User Household", - "create-household": "Create Household", - "household-name": "Household Name", - "household-group": "Household Group", - "household-management": "Household Management", - "manage-households": "Manage Households", - "admin-household-management": "Admin Household Management", - "admin-household-management-text": "Changes to this household will be reflected immediately.", - "household-id-value": "Household Id: {0}", - "private-household": "Private Household", + "household": "Husholdning", + "households": "Husholdninger", + "user-household": "Bruger Husholdning", + "create-household": "Opret Husholdning", + "household-name": "Husholdningens Navn", + "household-group": "Husholdnings Gruppe", + "household-management": "Husholdnings Administration", + "manage-households": "Administrer Husholdninger", + "admin-household-management": "Admin Husholdnings Administration", + "admin-household-management-text": "Ændringer ved denne husholdning vil træde i kraft øjeblikkeligt.", + "household-id-value": "Husholdning Id: {0}", + "private-household": "Privat Husholdning", "private-household-description": "Setting your household to private will default all public view options to default. This overrides any individual recipes public view settings.", - "household-recipe-preferences": "Household Recipe Preferences", + "household-recipe-preferences": "Husholdnings Opskrift Præferencer", "default-recipe-preferences-description": "These are the default settings when a new recipe is created in your household. These can be changed for individual recipes in the recipe settings menu.", "allow-users-outside-of-your-household-to-see-your-recipes": "Allow users outside of your household to see your recipes", "allow-users-outside-of-your-household-to-see-your-recipes-description": "When enabled you can use a public share link to share specific recipes without authorizing the user. When disabled, you can only share recipes with users who are in your household or with a pre-generated private link", - "household-preferences": "Household Preferences" + "household-preferences": "Husholdnings Præferencer" }, "meal-plan": { "create-a-new-meal-plan": "Opret en ny madplan", @@ -1252,7 +1252,7 @@ "account-summary-description": "Her er en oversigt over din gruppes oplysninger.", "group-statistics": "Gruppestatistik", "group-statistics-description": "Din gruppestatistik giver indsigt i, hvordan du bruger Mealie.", - "household-statistics": "Household Statistics", + "household-statistics": "Husholdnings Statistikker", "household-statistics-description": "Your Household Statistics provide some insight how you're using Mealie.", "storage-capacity": "Lagerkapacitet", "storage-capacity-description": "Din lagerkapacitet er en beregning af de billeder og elementer, du har uploadet.", @@ -1265,7 +1265,7 @@ "group-settings": "Gruppeindstillinger", "group-settings-description": "Manage your common group settings, like privacy settings.", "household-description": "These items are shared within your household. Editing one of them will change it for the whole household!", - "household-settings": "Household Settings", + "household-settings": "Husholdnings Indstillinger", "household-settings-description": "Manage your household settings, like mealplan and privacy settings.", "cookbooks-description": "Administrer en samling af kategorier og generer sider for dem.", "members": "Medlemmer", @@ -1304,7 +1304,7 @@ "require-all-tools": "Kræv Alle Værktøjer", "cookbook-name": "Navn på kogebog", "cookbook-with-name": "Kogebog {0}", - "household-cookbook-name": "{0} Cookbook {1}", + "household-cookbook-name": "{0} Kogebog {1}", "create-a-cookbook": "Opret en ny kogebog", "cookbook": "Kogebog" } diff --git a/frontend/lang/messages/es-ES.json b/frontend/lang/messages/es-ES.json index 151c6724763..7366526be58 100644 --- a/frontend/lang/messages/es-ES.json +++ b/frontend/lang/messages/es-ES.json @@ -8,7 +8,7 @@ "database-type": "Tipo de base de datos", "database-url": "URL de base de datos", "default-group": "Grupo Predeterminado", - "default-household": "Default Household", + "default-household": "Casa predeterminada", "demo": "Versión Demo", "demo-status": "Modo Demo", "development": "Desarrollo", @@ -239,7 +239,7 @@ "keep-my-recipes-private-description": "Establece su grupo y todas las recetas por defecto como privadas. Puede cambiarlo más tarde." }, "manage-members": "Gestionar miembros", - "manage-members-description": "Manage the permissions of the members in your household. {manage} allows the user to access the data-management page, and {invite} allows the user to generate invitation links for other users. Group owners cannot change their own permissions.", + "manage-members-description": "Gestione los permisos de los miembros de su hogar. {manage} permite al usuario acceder a la página de administración de datos, y {invite} permite al usuario generar enlaces de invitación para otros usuarios. Los propietarios de los grupos no pueden cambiar sus propios permisos.", "manage": "Gestionar", "invite": "Invitar", "looking-to-update-your-profile": "¿Buscas actualizar tu perfil?", @@ -261,7 +261,7 @@ "disable-users-from-commenting-on-recipes": "Desactivar los comentarios de los usuarios", "disable-users-from-commenting-on-recipes-description": "Oculta la sección de comentarios en la página de recetas y desactiva los comentarios", "disable-organizing-recipe-ingredients-by-units-and-food": "Deshabilita la organización de ingredientes de recetas por unidades y alimentos", - "disable-organizing-recipe-ingredients-by-units-and-food-description": "Hides the Food, Unit, and Amount fields for ingredients and treats ingredients as plain text fields", + "disable-organizing-recipe-ingredients-by-units-and-food-description": "Oculta los campos de comida, unidad y cantidad de ingredientes y trata los ingredientes como campos de texto plano", "general-preferences": "Opciones generales", "group-recipe-preferences": "Preferencias de grupo de las recetas", "report": "Informe", @@ -270,21 +270,21 @@ "admin-group-management": "Gestión del grupo administrador", "admin-group-management-text": "Los cambios en este grupo se reflejarán inmediatamente.", "group-id-value": "Id del Grupo: {0}", - "total-households": "Total Households" + "total-households": "Total de Casas" }, "household": { - "household": "Household", - "households": "Households", - "user-household": "User Household", - "create-household": "Create Household", - "household-name": "Household Name", - "household-group": "Household Group", - "household-management": "Household Management", - "manage-households": "Manage Households", - "admin-household-management": "Admin Household Management", + "household": "Casa", + "households": "Casas", + "user-household": "Casa del Usuario", + "create-household": "Crear Casa", + "household-name": "Nombre de la Casa", + "household-group": "Grupo Familiar", + "household-management": "Gestión de la Casa", + "manage-households": "Administrar Casas", + "admin-household-management": "Administración de la Casa", "admin-household-management-text": "Changes to this household will be reflected immediately.", "household-id-value": "Household Id: {0}", - "private-household": "Private Household", + "private-household": "Casa Privada", "private-household-description": "Setting your household to private will default all public view options to default. This overrides any individual recipes public view settings.", "household-recipe-preferences": "Household Recipe Preferences", "default-recipe-preferences-description": "These are the default settings when a new recipe is created in your household. These can be changed for individual recipes in the recipe settings menu.", diff --git a/mealie/repos/seed/resources/foods/locales/el-GR.json b/mealie/repos/seed/resources/foods/locales/el-GR.json index 9bfe62fa71f..8c5c23cefa1 100644 --- a/mealie/repos/seed/resources/foods/locales/el-GR.json +++ b/mealie/repos/seed/resources/foods/locales/el-GR.json @@ -1,6 +1,6 @@ { "acorn-squash": "βελανίδι σκουός", - "alfalfa-sprouts": "alfalfa sprouts", + "alfalfa-sprouts": "φύτρα σπόρων αλφάλφα", "anchovies": "αντζούγιες", "apples": "μήλα", "artichoke": "αγκινάρα", @@ -20,13 +20,13 @@ "bok-choy": "μποκ τσόι", "broccoflower": "ρομανέσκο", "broccoli": "μπρόκολο", - "broccolini": "broccolini", + "broccolini": "μπροκολίνι", "broccoli-rabe": "ραπίνι", "brussels-sprouts": "λαχανάκια Βρυξελλών", "cabbage": "λάχανο", "cauliflower": "κουνουπίδι", "chinese-leaves": "κινέζικα φύλλα", - "collard-greens": "collard greens", + "collard-greens": "λαχανίδες", "kohlrabi": "λαχανόριζα", "bread": "ψωμί", "breadfruit": "αρτόκαρπος", @@ -59,7 +59,7 @@ "coconut": "καρύδα", "coconut-milk": "γάλα καρύδας", "coffee": "καφές", - "confectioners-sugar": "confectioners' sugar", + "confectioners-sugar": "ζάχαρη άχνη", "coriander": "κόλιανδρος", "corn": "καλαμπόκι", "corn-syrup": "σιρόπι καλαμποκιού", @@ -80,9 +80,9 @@ "eggplant": "μελιτζάνα", "endive": "αντίδι", "fats": "λιπαρά", - "speck": "speck", + "speck": "σπεκ", "fava-beans": "κουκιά", - "fiddlehead": "fiddlehead", + "fiddlehead": "βλαστάρια φτέρης", "fish": "ψάρι", "catfish": "γατόψαρο ", "cod": "μπακαλιάρος", @@ -119,7 +119,7 @@ "oregano": "ρίγανη", "parsley": "μαϊντανός", "honey": "μέλι", - "icing-sugar": "icing sugar", + "icing-sugar": "ζάχαρη άχνη", "isomalt": "ισομαλτόζη", "jackfruit": "τζάκφρουτ", "jaggery": "ζάχαρη jaggery", @@ -129,7 +129,7 @@ "jicama": "χίκαμα", "kale": "λαχανίδα", "kumara": "κούμαρα", - "leavening-agents": "leavening agents", + "leavening-agents": "διογκωτικά", "leek": "πράσο", "legumes": "όσπρια ", "peas": "αρακάς", @@ -146,8 +146,8 @@ "mussels": "μύδια", "nori": "νόρι", "nutmeg": "μοσχοκάρυδο", - "nutritional-yeast-flakes": "nutritional yeast flakes", - "nuts": "nuts", + "nutritional-yeast-flakes": "νιφάδες μαγιάς", + "nuts": "ξηροί καρποί", "nanaimo-bar-mix": "nanaimo bar mix", "octopuses": "χταπόδια", "oils": "λάδια", @@ -156,9 +156,9 @@ "olive": "ελιά", "onion-family": "κρεμμυδοειδή", "onion": "κρεμμύδι", - "scallion": "scallion", + "scallion": "φρέσκο κρεμμυδάκι", "shallot": "εσαλότ", - "spring-onion": "spring onion", + "spring-onion": "φρέσκο κρεμμυδάκι", "orange-blossom-water": "νερό από άνθη πορτοκαλιάς", "oysters": "στρείδια", "panch-puran": "panch puran", @@ -191,14 +191,14 @@ "spaghetti-squash": "μακαρόνια κολοκύθας", "spices": "μπαχαρικά", "spinach": "σπανάκι", - "squash-family": "squash family", - "squash": "squash", + "squash-family": "κολοκυθοειδή", + "squash": "κολοκύθα", "zucchini": "κολοκύθι", "sugar": "ζάχαρη", "caster-sugar": "άχνη ζάχαρη", "granulated-sugar": "ζάχαρη σε κόκκους", "superfine-sugar": "υπερλεπτή ζάχαρη", - "turbanado-sugar": "turbanado sugar", + "turbanado-sugar": "ακατέργαστη ζάχαρη", "unrefined-sugar": "αραφινάριστη ζάχαρη", "white-sugar": "λευκή ζάχαρη", "sweet-potato": "γλυκοπατάτα", diff --git a/mealie/repos/seed/resources/units/locales/da-DK.json b/mealie/repos/seed/resources/units/locales/da-DK.json index 41ca71fe1b3..3d71b22d65c 100644 --- a/mealie/repos/seed/resources/units/locales/da-DK.json +++ b/mealie/repos/seed/resources/units/locales/da-DK.json @@ -19,7 +19,7 @@ }, "fluid-ounce": { "name": "flydende ounce", - "plural_name": "fluid ounces", + "plural_name": "flydende ounces", "description": "", "abbreviation": "fl oz" }, @@ -92,7 +92,7 @@ }, "dash": { "name": "knivspids", - "plural_name": "dashes", + "plural_name": "strejfer", "description": "", "abbreviation": "" }, From 8eb1cc606a8a5a50abbf0358d2dbe7953e0c07c1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 9 Sep 2024 20:57:20 +1000 Subject: [PATCH 030/102] fix(deps): update dependency pydantic to v2.9.1 (#4180) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 196 ++++++++++++++++++++++++++-------------------------- 1 file changed, 98 insertions(+), 98 deletions(-) diff --git a/poetry.lock b/poetry.lock index 94478e047b2..133a77240de 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2058,123 +2058,123 @@ files = [ [[package]] name = "pydantic" -version = "2.9.0" +version = "2.9.1" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.9.0-py3-none-any.whl", hash = "sha256:f66a7073abd93214a20c5f7b32d56843137a7a2e70d02111f3be287035c45370"}, - {file = "pydantic-2.9.0.tar.gz", hash = "sha256:c7a8a9fdf7d100afa49647eae340e2d23efa382466a8d177efcd1381e9be5598"}, + {file = "pydantic-2.9.1-py3-none-any.whl", hash = "sha256:7aff4db5fdf3cf573d4b3c30926a510a10e19a0774d38fc4967f78beb6deb612"}, + {file = "pydantic-2.9.1.tar.gz", hash = "sha256:1363c7d975c7036df0db2b4a61f2e062fbc0aa5ab5f2772e0ffc7191a4f4bce2"}, ] [package.dependencies] -annotated-types = ">=0.4.0" -pydantic-core = "2.23.2" +annotated-types = ">=0.6.0" +pydantic-core = "2.23.3" typing-extensions = [ - {version = ">=4.6.1", markers = "python_version < \"3.13\""}, {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, + {version = ">=4.6.1", markers = "python_version < \"3.13\""}, ] -tzdata = {version = "*", markers = "python_version >= \"3.9\""} [package.extras] email = ["email-validator (>=2.0.0)"] +timezone = ["tzdata"] [[package]] name = "pydantic-core" -version = "2.23.2" +version = "2.23.3" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.23.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:7d0324a35ab436c9d768753cbc3c47a865a2cbc0757066cb864747baa61f6ece"}, - {file = "pydantic_core-2.23.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:276ae78153a94b664e700ac362587c73b84399bd1145e135287513442e7dfbc7"}, - {file = "pydantic_core-2.23.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:964c7aa318da542cdcc60d4a648377ffe1a2ef0eb1e996026c7f74507b720a78"}, - {file = "pydantic_core-2.23.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1cf842265a3a820ebc6388b963ead065f5ce8f2068ac4e1c713ef77a67b71f7c"}, - {file = "pydantic_core-2.23.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae90b9e50fe1bd115b24785e962b51130340408156d34d67b5f8f3fa6540938e"}, - {file = "pydantic_core-2.23.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ae65fdfb8a841556b52935dfd4c3f79132dc5253b12c0061b96415208f4d622"}, - {file = "pydantic_core-2.23.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c8aa40f6ca803f95b1c1c5aeaee6237b9e879e4dfb46ad713229a63651a95fb"}, - {file = "pydantic_core-2.23.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c53100c8ee5a1e102766abde2158077d8c374bee0639201f11d3032e3555dfbc"}, - {file = "pydantic_core-2.23.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d6b9dd6aa03c812017411734e496c44fef29b43dba1e3dd1fa7361bbacfc1354"}, - {file = "pydantic_core-2.23.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b18cf68255a476b927910c6873d9ed00da692bb293c5b10b282bd48a0afe3ae2"}, - {file = "pydantic_core-2.23.2-cp310-none-win32.whl", hash = "sha256:e460475719721d59cd54a350c1f71c797c763212c836bf48585478c5514d2854"}, - {file = "pydantic_core-2.23.2-cp310-none-win_amd64.whl", hash = "sha256:5f3cf3721eaf8741cffaf092487f1ca80831202ce91672776b02b875580e174a"}, - {file = "pydantic_core-2.23.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:7ce8e26b86a91e305858e018afc7a6e932f17428b1eaa60154bd1f7ee888b5f8"}, - {file = "pydantic_core-2.23.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7e9b24cca4037a561422bf5dc52b38d390fb61f7bfff64053ce1b72f6938e6b2"}, - {file = "pydantic_core-2.23.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:753294d42fb072aa1775bfe1a2ba1012427376718fa4c72de52005a3d2a22178"}, - {file = "pydantic_core-2.23.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:257d6a410a0d8aeb50b4283dea39bb79b14303e0fab0f2b9d617701331ed1515"}, - {file = "pydantic_core-2.23.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c8319e0bd6a7b45ad76166cc3d5d6a36c97d0c82a196f478c3ee5346566eebfd"}, - {file = "pydantic_core-2.23.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7a05c0240f6c711eb381ac392de987ee974fa9336071fb697768dfdb151345ce"}, - {file = "pydantic_core-2.23.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d5b0ff3218858859910295df6953d7bafac3a48d5cd18f4e3ed9999efd2245f"}, - {file = "pydantic_core-2.23.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:96ef39add33ff58cd4c112cbac076726b96b98bb8f1e7f7595288dcfb2f10b57"}, - {file = "pydantic_core-2.23.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0102e49ac7d2df3379ef8d658d3bc59d3d769b0bdb17da189b75efa861fc07b4"}, - {file = "pydantic_core-2.23.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a6612c2a844043e4d10a8324c54cdff0042c558eef30bd705770793d70b224aa"}, - {file = "pydantic_core-2.23.2-cp311-none-win32.whl", hash = "sha256:caffda619099cfd4f63d48462f6aadbecee3ad9603b4b88b60cb821c1b258576"}, - {file = "pydantic_core-2.23.2-cp311-none-win_amd64.whl", hash = "sha256:6f80fba4af0cb1d2344869d56430e304a51396b70d46b91a55ed4959993c0589"}, - {file = "pydantic_core-2.23.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:4c83c64d05ffbbe12d4e8498ab72bdb05bcc1026340a4a597dc647a13c1605ec"}, - {file = "pydantic_core-2.23.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6294907eaaccf71c076abdd1c7954e272efa39bb043161b4b8aa1cd76a16ce43"}, - {file = "pydantic_core-2.23.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a801c5e1e13272e0909c520708122496647d1279d252c9e6e07dac216accc41"}, - {file = "pydantic_core-2.23.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cc0c316fba3ce72ac3ab7902a888b9dc4979162d320823679da270c2d9ad0cad"}, - {file = "pydantic_core-2.23.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b06c5d4e8701ac2ba99a2ef835e4e1b187d41095a9c619c5b185c9068ed2a49"}, - {file = "pydantic_core-2.23.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:82764c0bd697159fe9947ad59b6db6d7329e88505c8f98990eb07e84cc0a5d81"}, - {file = "pydantic_core-2.23.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b1a195efd347ede8bcf723e932300292eb13a9d2a3c1f84eb8f37cbbc905b7f"}, - {file = "pydantic_core-2.23.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b7efb12e5071ad8d5b547487bdad489fbd4a5a35a0fc36a1941517a6ad7f23e0"}, - {file = "pydantic_core-2.23.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5dd0ec5f514ed40e49bf961d49cf1bc2c72e9b50f29a163b2cc9030c6742aa73"}, - {file = "pydantic_core-2.23.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:820f6ee5c06bc868335e3b6e42d7ef41f50dfb3ea32fbd523ab679d10d8741c0"}, - {file = "pydantic_core-2.23.2-cp312-none-win32.whl", hash = "sha256:3713dc093d5048bfaedbba7a8dbc53e74c44a140d45ede020dc347dda18daf3f"}, - {file = "pydantic_core-2.23.2-cp312-none-win_amd64.whl", hash = "sha256:e1895e949f8849bc2757c0dbac28422a04be031204df46a56ab34bcf98507342"}, - {file = "pydantic_core-2.23.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:da43cbe593e3c87d07108d0ebd73771dc414488f1f91ed2e204b0370b94b37ac"}, - {file = "pydantic_core-2.23.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:64d094ea1aa97c6ded4748d40886076a931a8bf6f61b6e43e4a1041769c39dd2"}, - {file = "pydantic_core-2.23.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:084414ffe9a85a52940b49631321d636dadf3576c30259607b75516d131fecd0"}, - {file = "pydantic_core-2.23.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:043ef8469f72609c4c3a5e06a07a1f713d53df4d53112c6d49207c0bd3c3bd9b"}, - {file = "pydantic_core-2.23.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3649bd3ae6a8ebea7dc381afb7f3c6db237fc7cebd05c8ac36ca8a4187b03b30"}, - {file = "pydantic_core-2.23.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6db09153d8438425e98cdc9a289c5fade04a5d2128faff8f227c459da21b9703"}, - {file = "pydantic_core-2.23.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5668b3173bb0b2e65020b60d83f5910a7224027232c9f5dc05a71a1deac9f960"}, - {file = "pydantic_core-2.23.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1c7b81beaf7c7ebde978377dc53679c6cba0e946426fc7ade54251dfe24a7604"}, - {file = "pydantic_core-2.23.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:ae579143826c6f05a361d9546446c432a165ecf1c0b720bbfd81152645cb897d"}, - {file = "pydantic_core-2.23.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:19f1352fe4b248cae22a89268720fc74e83f008057a652894f08fa931e77dced"}, - {file = "pydantic_core-2.23.2-cp313-none-win32.whl", hash = "sha256:e1a79ad49f346aa1a2921f31e8dbbab4d64484823e813a002679eaa46cba39e1"}, - {file = "pydantic_core-2.23.2-cp313-none-win_amd64.whl", hash = "sha256:582871902e1902b3c8e9b2c347f32a792a07094110c1bca6c2ea89b90150caac"}, - {file = "pydantic_core-2.23.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:743e5811b0c377eb830150d675b0847a74a44d4ad5ab8845923d5b3a756d8100"}, - {file = "pydantic_core-2.23.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6650a7bbe17a2717167e3e23c186849bae5cef35d38949549f1c116031b2b3aa"}, - {file = "pydantic_core-2.23.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56e6a12ec8d7679f41b3750ffa426d22b44ef97be226a9bab00a03365f217b2b"}, - {file = "pydantic_core-2.23.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:810ca06cca91de9107718dc83d9ac4d2e86efd6c02cba49a190abcaf33fb0472"}, - {file = "pydantic_core-2.23.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:785e7f517ebb9890813d31cb5d328fa5eda825bb205065cde760b3150e4de1f7"}, - {file = "pydantic_core-2.23.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ef71ec876fcc4d3bbf2ae81961959e8d62f8d74a83d116668409c224012e3af"}, - {file = "pydantic_core-2.23.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d50ac34835c6a4a0d456b5db559b82047403c4317b3bc73b3455fefdbdc54b0a"}, - {file = "pydantic_core-2.23.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:16b25a4a120a2bb7dab51b81e3d9f3cde4f9a4456566c403ed29ac81bf49744f"}, - {file = "pydantic_core-2.23.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:41ae8537ad371ec018e3c5da0eb3f3e40ee1011eb9be1da7f965357c4623c501"}, - {file = "pydantic_core-2.23.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:07049ec9306ec64e955b2e7c40c8d77dd78ea89adb97a2013d0b6e055c5ee4c5"}, - {file = "pydantic_core-2.23.2-cp38-none-win32.whl", hash = "sha256:086c5db95157dc84c63ff9d96ebb8856f47ce113c86b61065a066f8efbe80acf"}, - {file = "pydantic_core-2.23.2-cp38-none-win_amd64.whl", hash = "sha256:67b6655311b00581914aba481729971b88bb8bc7996206590700a3ac85e457b8"}, - {file = "pydantic_core-2.23.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:358331e21a897151e54d58e08d0219acf98ebb14c567267a87e971f3d2a3be59"}, - {file = "pydantic_core-2.23.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c4d9f15ffe68bcd3898b0ad7233af01b15c57d91cd1667f8d868e0eacbfe3f87"}, - {file = "pydantic_core-2.23.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0123655fedacf035ab10c23450163c2f65a4174f2bb034b188240a6cf06bb123"}, - {file = "pydantic_core-2.23.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e6e3ccebdbd6e53474b0bb7ab8b88e83c0cfe91484b25e058e581348ee5a01a5"}, - {file = "pydantic_core-2.23.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc535cb898ef88333cf317777ecdfe0faac1c2a3187ef7eb061b6f7ecf7e6bae"}, - {file = "pydantic_core-2.23.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aab9e522efff3993a9e98ab14263d4e20211e62da088298089a03056980a3e69"}, - {file = "pydantic_core-2.23.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05b366fb8fe3d8683b11ac35fa08947d7b92be78ec64e3277d03bd7f9b7cda79"}, - {file = "pydantic_core-2.23.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7568f682c06f10f30ef643a1e8eec4afeecdafde5c4af1b574c6df079e96f96c"}, - {file = "pydantic_core-2.23.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:cdd02a08205dc90238669f082747612cb3c82bd2c717adc60f9b9ecadb540f80"}, - {file = "pydantic_core-2.23.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1a2ab4f410f4b886de53b6bddf5dd6f337915a29dd9f22f20f3099659536b2f6"}, - {file = "pydantic_core-2.23.2-cp39-none-win32.whl", hash = "sha256:0448b81c3dfcde439551bb04a9f41d7627f676b12701865c8a2574bcea034437"}, - {file = "pydantic_core-2.23.2-cp39-none-win_amd64.whl", hash = "sha256:4cebb9794f67266d65e7e4cbe5dcf063e29fc7b81c79dc9475bd476d9534150e"}, - {file = "pydantic_core-2.23.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e758d271ed0286d146cf7c04c539a5169a888dd0b57026be621547e756af55bc"}, - {file = "pydantic_core-2.23.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:f477d26183e94eaafc60b983ab25af2a809a1b48ce4debb57b343f671b7a90b6"}, - {file = "pydantic_core-2.23.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da3131ef2b940b99106f29dfbc30d9505643f766704e14c5d5e504e6a480c35e"}, - {file = "pydantic_core-2.23.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:329a721253c7e4cbd7aad4a377745fbcc0607f9d72a3cc2102dd40519be75ed2"}, - {file = "pydantic_core-2.23.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7706e15cdbf42f8fab1e6425247dfa98f4a6f8c63746c995d6a2017f78e619ae"}, - {file = "pydantic_core-2.23.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:e64ffaf8f6e17ca15eb48344d86a7a741454526f3a3fa56bc493ad9d7ec63936"}, - {file = "pydantic_core-2.23.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:dd59638025160056687d598b054b64a79183f8065eae0d3f5ca523cde9943940"}, - {file = "pydantic_core-2.23.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:12625e69b1199e94b0ae1c9a95d000484ce9f0182f9965a26572f054b1537e44"}, - {file = "pydantic_core-2.23.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5d813fd871b3d5c3005157622ee102e8908ad6011ec915a18bd8fde673c4360e"}, - {file = "pydantic_core-2.23.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1eb37f7d6a8001c0f86dc8ff2ee8d08291a536d76e49e78cda8587bb54d8b329"}, - {file = "pydantic_core-2.23.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ce7eaf9a98680b4312b7cebcdd9352531c43db00fca586115845df388f3c465"}, - {file = "pydantic_core-2.23.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f087879f1ffde024dd2788a30d55acd67959dcf6c431e9d3682d1c491a0eb474"}, - {file = "pydantic_core-2.23.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6ce883906810b4c3bd90e0ada1f9e808d9ecf1c5f0b60c6b8831d6100bcc7dd6"}, - {file = "pydantic_core-2.23.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:a8031074a397a5925d06b590121f8339d34a5a74cfe6970f8a1124eb8b83f4ac"}, - {file = "pydantic_core-2.23.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:23af245b8f2f4ee9e2c99cb3f93d0e22fb5c16df3f2f643f5a8da5caff12a653"}, - {file = "pydantic_core-2.23.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c57e493a0faea1e4c38f860d6862ba6832723396c884fbf938ff5e9b224200e2"}, - {file = "pydantic_core-2.23.2.tar.gz", hash = "sha256:95d6bf449a1ac81de562d65d180af5d8c19672793c81877a2eda8fde5d08f2fd"}, + {file = "pydantic_core-2.23.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:7f10a5d1b9281392f1bf507d16ac720e78285dfd635b05737c3911637601bae6"}, + {file = "pydantic_core-2.23.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3c09a7885dd33ee8c65266e5aa7fb7e2f23d49d8043f089989726391dd7350c5"}, + {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6470b5a1ec4d1c2e9afe928c6cb37eb33381cab99292a708b8cb9aa89e62429b"}, + {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9172d2088e27d9a185ea0a6c8cebe227a9139fd90295221d7d495944d2367700"}, + {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86fc6c762ca7ac8fbbdff80d61b2c59fb6b7d144aa46e2d54d9e1b7b0e780e01"}, + {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0cb80fd5c2df4898693aa841425ea1727b1b6d2167448253077d2a49003e0ed"}, + {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03667cec5daf43ac4995cefa8aaf58f99de036204a37b889c24a80927b629cec"}, + {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:047531242f8e9c2db733599f1c612925de095e93c9cc0e599e96cf536aaf56ba"}, + {file = "pydantic_core-2.23.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5499798317fff7f25dbef9347f4451b91ac2a4330c6669821c8202fd354c7bee"}, + {file = "pydantic_core-2.23.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bbb5e45eab7624440516ee3722a3044b83fff4c0372efe183fd6ba678ff681fe"}, + {file = "pydantic_core-2.23.3-cp310-none-win32.whl", hash = "sha256:8b5b3ed73abb147704a6e9f556d8c5cb078f8c095be4588e669d315e0d11893b"}, + {file = "pydantic_core-2.23.3-cp310-none-win_amd64.whl", hash = "sha256:2b603cde285322758a0279995b5796d64b63060bfbe214b50a3ca23b5cee3e83"}, + {file = "pydantic_core-2.23.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:c889fd87e1f1bbeb877c2ee56b63bb297de4636661cc9bbfcf4b34e5e925bc27"}, + {file = "pydantic_core-2.23.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ea85bda3189fb27503af4c45273735bcde3dd31c1ab17d11f37b04877859ef45"}, + {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7f7f72f721223f33d3dc98a791666ebc6a91fa023ce63733709f4894a7dc611"}, + {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b2b55b0448e9da68f56b696f313949cda1039e8ec7b5d294285335b53104b61"}, + {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c24574c7e92e2c56379706b9a3f07c1e0c7f2f87a41b6ee86653100c4ce343e5"}, + {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2b05e6ccbee333a8f4b8f4d7c244fdb7a979e90977ad9c51ea31261e2085ce0"}, + {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2c409ce1c219c091e47cb03feb3c4ed8c2b8e004efc940da0166aaee8f9d6c8"}, + {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d965e8b325f443ed3196db890d85dfebbb09f7384486a77461347f4adb1fa7f8"}, + {file = "pydantic_core-2.23.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f56af3a420fb1ffaf43ece3ea09c2d27c444e7c40dcb7c6e7cf57aae764f2b48"}, + {file = "pydantic_core-2.23.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5b01a078dd4f9a52494370af21aa52964e0a96d4862ac64ff7cea06e0f12d2c5"}, + {file = "pydantic_core-2.23.3-cp311-none-win32.whl", hash = "sha256:560e32f0df04ac69b3dd818f71339983f6d1f70eb99d4d1f8e9705fb6c34a5c1"}, + {file = "pydantic_core-2.23.3-cp311-none-win_amd64.whl", hash = "sha256:c744fa100fdea0d000d8bcddee95213d2de2e95b9c12be083370b2072333a0fa"}, + {file = "pydantic_core-2.23.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:e0ec50663feedf64d21bad0809f5857bac1ce91deded203efc4a84b31b2e4305"}, + {file = "pydantic_core-2.23.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:db6e6afcb95edbe6b357786684b71008499836e91f2a4a1e55b840955b341dbb"}, + {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98ccd69edcf49f0875d86942f4418a4e83eb3047f20eb897bffa62a5d419c8fa"}, + {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a678c1ac5c5ec5685af0133262103defb427114e62eafeda12f1357a12140162"}, + {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:01491d8b4d8db9f3391d93b0df60701e644ff0894352947f31fff3e52bd5c801"}, + {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fcf31facf2796a2d3b7fe338fe8640aa0166e4e55b4cb108dbfd1058049bf4cb"}, + {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7200fd561fb3be06827340da066df4311d0b6b8eb0c2116a110be5245dceb326"}, + {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dc1636770a809dee2bd44dd74b89cc80eb41172bcad8af75dd0bc182c2666d4c"}, + {file = "pydantic_core-2.23.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:67a5def279309f2e23014b608c4150b0c2d323bd7bccd27ff07b001c12c2415c"}, + {file = "pydantic_core-2.23.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:748bdf985014c6dd3e1e4cc3db90f1c3ecc7246ff5a3cd4ddab20c768b2f1dab"}, + {file = "pydantic_core-2.23.3-cp312-none-win32.whl", hash = "sha256:255ec6dcb899c115f1e2a64bc9ebc24cc0e3ab097775755244f77360d1f3c06c"}, + {file = "pydantic_core-2.23.3-cp312-none-win_amd64.whl", hash = "sha256:40b8441be16c1e940abebed83cd006ddb9e3737a279e339dbd6d31578b802f7b"}, + {file = "pydantic_core-2.23.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:6daaf5b1ba1369a22c8b050b643250e3e5efc6a78366d323294aee54953a4d5f"}, + {file = "pydantic_core-2.23.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d015e63b985a78a3d4ccffd3bdf22b7c20b3bbd4b8227809b3e8e75bc37f9cb2"}, + {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3fc572d9b5b5cfe13f8e8a6e26271d5d13f80173724b738557a8c7f3a8a3791"}, + {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f6bd91345b5163ee7448bee201ed7dd601ca24f43f439109b0212e296eb5b423"}, + {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc379c73fd66606628b866f661e8785088afe2adaba78e6bbe80796baf708a63"}, + {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbdce4b47592f9e296e19ac31667daed8753c8367ebb34b9a9bd89dacaa299c9"}, + {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc3cf31edf405a161a0adad83246568647c54404739b614b1ff43dad2b02e6d5"}, + {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8e22b477bf90db71c156f89a55bfe4d25177b81fce4aa09294d9e805eec13855"}, + {file = "pydantic_core-2.23.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:0a0137ddf462575d9bce863c4c95bac3493ba8e22f8c28ca94634b4a1d3e2bb4"}, + {file = "pydantic_core-2.23.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:203171e48946c3164fe7691fc349c79241ff8f28306abd4cad5f4f75ed80bc8d"}, + {file = "pydantic_core-2.23.3-cp313-none-win32.whl", hash = "sha256:76bdab0de4acb3f119c2a4bff740e0c7dc2e6de7692774620f7452ce11ca76c8"}, + {file = "pydantic_core-2.23.3-cp313-none-win_amd64.whl", hash = "sha256:37ba321ac2a46100c578a92e9a6aa33afe9ec99ffa084424291d84e456f490c1"}, + {file = "pydantic_core-2.23.3-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d063c6b9fed7d992bcbebfc9133f4c24b7a7f215d6b102f3e082b1117cddb72c"}, + {file = "pydantic_core-2.23.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6cb968da9a0746a0cf521b2b5ef25fc5a0bee9b9a1a8214e0a1cfaea5be7e8a4"}, + {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edbefe079a520c5984e30e1f1f29325054b59534729c25b874a16a5048028d16"}, + {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cbaaf2ef20d282659093913da9d402108203f7cb5955020bd8d1ae5a2325d1c4"}, + {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fb539d7e5dc4aac345846f290cf504d2fd3c1be26ac4e8b5e4c2b688069ff4cf"}, + {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7e6f33503c5495059148cc486867e1d24ca35df5fc064686e631e314d959ad5b"}, + {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:04b07490bc2f6f2717b10c3969e1b830f5720b632f8ae2f3b8b1542394c47a8e"}, + {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:03795b9e8a5d7fda05f3873efc3f59105e2dcff14231680296b87b80bb327295"}, + {file = "pydantic_core-2.23.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c483dab0f14b8d3f0df0c6c18d70b21b086f74c87ab03c59250dbf6d3c89baba"}, + {file = "pydantic_core-2.23.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8b2682038e255e94baf2c473dca914a7460069171ff5cdd4080be18ab8a7fd6e"}, + {file = "pydantic_core-2.23.3-cp38-none-win32.whl", hash = "sha256:f4a57db8966b3a1d1a350012839c6a0099f0898c56512dfade8a1fe5fb278710"}, + {file = "pydantic_core-2.23.3-cp38-none-win_amd64.whl", hash = "sha256:13dd45ba2561603681a2676ca56006d6dee94493f03d5cadc055d2055615c3ea"}, + {file = "pydantic_core-2.23.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:82da2f4703894134a9f000e24965df73cc103e31e8c31906cc1ee89fde72cbd8"}, + {file = "pydantic_core-2.23.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dd9be0a42de08f4b58a3cc73a123f124f65c24698b95a54c1543065baca8cf0e"}, + {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89b731f25c80830c76fdb13705c68fef6a2b6dc494402987c7ea9584fe189f5d"}, + {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c6de1ec30c4bb94f3a69c9f5f2182baeda5b809f806676675e9ef6b8dc936f28"}, + {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb68b41c3fa64587412b104294b9cbb027509dc2f6958446c502638d481525ef"}, + {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c3980f2843de5184656aab58698011b42763ccba11c4a8c35936c8dd6c7068c"}, + {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94f85614f2cba13f62c3c6481716e4adeae48e1eaa7e8bac379b9d177d93947a"}, + {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:510b7fb0a86dc8f10a8bb43bd2f97beb63cffad1203071dc434dac26453955cd"}, + {file = "pydantic_core-2.23.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1eba2f7ce3e30ee2170410e2171867ea73dbd692433b81a93758ab2de6c64835"}, + {file = "pydantic_core-2.23.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4b259fd8409ab84b4041b7b3f24dcc41e4696f180b775961ca8142b5b21d0e70"}, + {file = "pydantic_core-2.23.3-cp39-none-win32.whl", hash = "sha256:40d9bd259538dba2f40963286009bf7caf18b5112b19d2b55b09c14dde6db6a7"}, + {file = "pydantic_core-2.23.3-cp39-none-win_amd64.whl", hash = "sha256:5a8cd3074a98ee70173a8633ad3c10e00dcb991ecec57263aacb4095c5efb958"}, + {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f399e8657c67313476a121a6944311fab377085ca7f490648c9af97fc732732d"}, + {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:6b5547d098c76e1694ba85f05b595720d7c60d342f24d5aad32c3049131fa5c4"}, + {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0dda0290a6f608504882d9f7650975b4651ff91c85673341789a476b1159f211"}, + {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65b6e5da855e9c55a0c67f4db8a492bf13d8d3316a59999cfbaf98cc6e401961"}, + {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:09e926397f392059ce0afdcac920df29d9c833256354d0c55f1584b0b70cf07e"}, + {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:87cfa0ed6b8c5bd6ae8b66de941cece179281239d482f363814d2b986b79cedc"}, + {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e61328920154b6a44d98cabcb709f10e8b74276bc709c9a513a8c37a18786cc4"}, + {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ce3317d155628301d649fe5e16a99528d5680af4ec7aa70b90b8dacd2d725c9b"}, + {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e89513f014c6be0d17b00a9a7c81b1c426f4eb9224b15433f3d98c1a071f8433"}, + {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:4f62c1c953d7ee375df5eb2e44ad50ce2f5aff931723b398b8bc6f0ac159791a"}, + {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2718443bc671c7ac331de4eef9b673063b10af32a0bb385019ad61dcf2cc8f6c"}, + {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0d90e08b2727c5d01af1b5ef4121d2f0c99fbee692c762f4d9d0409c9da6541"}, + {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2b676583fc459c64146debea14ba3af54e540b61762dfc0613dc4e98c3f66eeb"}, + {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:50e4661f3337977740fdbfbae084ae5693e505ca2b3130a6d4eb0f2281dc43b8"}, + {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:68f4cf373f0de6abfe599a38307f4417c1c867ca381c03df27c873a9069cda25"}, + {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:59d52cf01854cb26c46958552a21acb10dd78a52aa34c86f284e66b209db8cab"}, + {file = "pydantic_core-2.23.3.tar.gz", hash = "sha256:3cb0f65d8b4121c1b015c60104a685feb929a29d7cf204387c7f2688c7974690"}, ] [package.dependencies] @@ -2275,8 +2275,8 @@ files = [ astroid = ">=3.2.4,<=3.3.0-dev0" colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} dill = [ - {version = ">=0.2", markers = "python_version < \"3.11\""}, {version = ">=0.3.7", markers = "python_version >= \"3.12\""}, + {version = ">=0.2", markers = "python_version < \"3.11\""}, {version = ">=0.3.6", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, ] isort = ">=4.2.5,<5.13.0 || >5.13.0,<6" From 042e91c74ca250b065813e7f6531aa87417dcf9a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 9 Sep 2024 14:14:42 +0000 Subject: [PATCH 031/102] chore(auto): Update pre-commit hooks (#4179) Co-authored-by: boc-the-git <3479092+boc-the-git@users.noreply.github.com> Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 10a2b262804..b6565ecab82 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -12,7 +12,7 @@ repos: exclude: ^tests/data/ - repo: https://github.com/astral-sh/ruff-pre-commit # Ruff version. - rev: v0.6.3 + rev: v0.6.4 hooks: - id: ruff - id: ruff-format From b23cd34d37c93ea6b90e3ff16899540ff3ab1610 Mon Sep 17 00:00:00 2001 From: Hayden <64056131+hay-kot@users.noreply.github.com> Date: Mon, 9 Sep 2024 09:23:07 -0500 Subject: [PATCH 032/102] chore(l10n): New Crowdin updates (#4181) --- frontend/lang/messages/de-DE.json | 2 +- frontend/lang/messages/fr-CA.json | 82 +++++++++---------- mealie/lang/messages/fr-CA.json | 30 +++---- .../seed/resources/foods/locales/de-DE.json | 2 +- .../seed/resources/foods/locales/fr-CA.json | 2 +- .../seed/resources/labels/locales/fr-CA.json | 2 +- .../seed/resources/units/locales/fr-CA.json | 60 +++++++------- 7 files changed, 90 insertions(+), 90 deletions(-) diff --git a/frontend/lang/messages/de-DE.json b/frontend/lang/messages/de-DE.json index f3bb43f1862..e0792ce91d6 100644 --- a/frontend/lang/messages/de-DE.json +++ b/frontend/lang/messages/de-DE.json @@ -6,7 +6,7 @@ "api-port": "API-Port", "application-mode": "Anwendungsmodus", "database-type": "Datenbanktyp", - "database-url": "Datenbank URL", + "database-url": "Datenbank-URL", "default-group": "Standardgruppe", "default-household": "Standardhaushalt", "demo": "Demo", diff --git a/frontend/lang/messages/fr-CA.json b/frontend/lang/messages/fr-CA.json index 7a709aec4c4..6543e59d9f0 100644 --- a/frontend/lang/messages/fr-CA.json +++ b/frontend/lang/messages/fr-CA.json @@ -8,7 +8,7 @@ "database-type": "Type de base de données", "database-url": "URL de la base de données", "default-group": "Groupe par défaut", - "default-household": "Default Household", + "default-household": "Foyer par défaut", "demo": "Démo", "demo-status": "Mode démo", "development": "Développement", @@ -45,7 +45,7 @@ "category-filter": "Filtre par catégories", "category-update-failed": "La mise à jour de la catégorie a échoué", "category-updated": "Catégorie mise à jour", - "uncategorized-count": "{count} non catégorisée|{count} non catégorisées", + "uncategorized-count": "{count} sans catégorie", "create-a-category": "Créer une catégorie", "category-name": "Nom de la catégorie", "category": "Catégorie" @@ -239,7 +239,7 @@ "keep-my-recipes-private-description": "Définit votre groupe et toutes les recettes par défaut sur privé. Vous pouvez toujours changer cela plus tard." }, "manage-members": "Gestion des membres", - "manage-members-description": "Manage the permissions of the members in your household. {manage} allows the user to access the data-management page, and {invite} allows the user to generate invitation links for other users. Group owners cannot change their own permissions.", + "manage-members-description": "Gérer les permissions des membres de votre foyer. {manage} permet à l'utilisateur d'accéder à la page de gestion des données, et {invite} permet à l'utilisateur de générer des liens d'invitation pour d'autres utilisateurs. Les propriétaires du groupe ne peuvent pas modifier leurs propres permissions.", "manage": "Gérer", "invite": "Inviter", "looking-to-update-your-profile": "Vous cherchez à mettre à jour votre profil ?", @@ -247,7 +247,7 @@ "default-recipe-preferences": "Préférences de recette par défaut", "group-preferences": "Préférences du groupe", "private-group": "Groupe privé", - "private-group-description": "Setting your group to private will default all public view options to default. This overrides any individual households or recipes public view settings.", + "private-group-description": "Rendre votre groupe privé va réinitialiser toutes les options de vue publique à leur valeur par défaut. Cela écrase les paramètres individuels de vue publique de tous les foyers ou recettes.", "enable-public-access": "Permettre l'accès public", "enable-public-access-description": "Les recettes de groupes deviennent publiques par défaut, cela permet aux visiteurs de les voir sans s’identifier", "allow-users-outside-of-your-group-to-see-your-recipes": "Autoriser les utilisateurs en dehors de votre groupe à voir vos recettes", @@ -261,7 +261,7 @@ "disable-users-from-commenting-on-recipes": "Désactiver les commentaires utilisateur sur les recettes", "disable-users-from-commenting-on-recipes-description": "Masque la section commentaires sur la page de recette et désactive les commentaires", "disable-organizing-recipe-ingredients-by-units-and-food": "Désactiver l'organisation des ingrédients de recette par unité et aliment", - "disable-organizing-recipe-ingredients-by-units-and-food-description": "Hides the Food, Unit, and Amount fields for ingredients and treats ingredients as plain text fields", + "disable-organizing-recipe-ingredients-by-units-and-food-description": "Masque les champs Aliment, Unité et Quantité pour les ingrédients et considère les ingrédients comme des champs de texte simple", "general-preferences": "Préférences générales", "group-recipe-preferences": "Préférences de recette du groupe", "report": "Rapport", @@ -270,27 +270,27 @@ "admin-group-management": "Administration des groupes", "admin-group-management-text": "Les modifications apportées à ce groupe seront immédiatement prises en compte.", "group-id-value": "ID groupe : {0}", - "total-households": "Total Households" + "total-households": "Nombre de foyers" }, "household": { - "household": "Household", - "households": "Households", - "user-household": "User Household", - "create-household": "Create Household", - "household-name": "Household Name", - "household-group": "Household Group", - "household-management": "Household Management", - "manage-households": "Manage Households", - "admin-household-management": "Admin Household Management", - "admin-household-management-text": "Changes to this household will be reflected immediately.", - "household-id-value": "Household Id: {0}", - "private-household": "Private Household", - "private-household-description": "Setting your household to private will default all public view options to default. This overrides any individual recipes public view settings.", - "household-recipe-preferences": "Household Recipe Preferences", - "default-recipe-preferences-description": "These are the default settings when a new recipe is created in your household. These can be changed for individual recipes in the recipe settings menu.", - "allow-users-outside-of-your-household-to-see-your-recipes": "Allow users outside of your household to see your recipes", - "allow-users-outside-of-your-household-to-see-your-recipes-description": "When enabled you can use a public share link to share specific recipes without authorizing the user. When disabled, you can only share recipes with users who are in your household or with a pre-generated private link", - "household-preferences": "Household Preferences" + "household": "Foyer", + "households": "Foyers", + "user-household": "Utilisateur du foyer", + "create-household": "Créer un foyer", + "household-name": "Nom du foyer", + "household-group": "Groupe du foyer", + "household-management": "Gestion du foyer", + "manage-households": "Gérer les foyers", + "admin-household-management": "Administration du foyer", + "admin-household-management-text": "Les changements apportés à ce foyer seront appliqués immédiatement.", + "household-id-value": "Identifiant du foyer : {0}", + "private-household": "Foyer privé", + "private-household-description": "Rendre votre foyer privé va réinitialiser toutes les options de vue publique à leur valeur par défaut. Cela écrase les paramètres individuels de vue publique d'une recette.", + "household-recipe-preferences": "Préférences de recette du foyer", + "default-recipe-preferences-description": "Ce sont les paramètres par défaut utilisés pour la création d’une nouvelle recette dans votre foyer. Ils peuvent être modifiés individuellement dans le menu de configuration des recettes.", + "allow-users-outside-of-your-household-to-see-your-recipes": "Autoriser les utilisateurs en dehors de votre foyer à voir vos recettes", + "allow-users-outside-of-your-household-to-see-your-recipes-description": "Lorsque cette option est activée, vous pouvez utiliser un lien de partage public pour partager des recettes spécifiques sans autoriser l'utilisateur. Lorsque cette option est désactivée, vous ne pouvez partager des recettes qu'avec les utilisateurs qui sont dans votre foyer ou avec un lien privé pré-généré", + "household-preferences": "Préférences du foyer" }, "meal-plan": { "create-a-new-meal-plan": "Créer un nouveau menu", @@ -475,7 +475,7 @@ "insert-below": "Insérer en dessous", "instructions": "Instructions", "key-name-required": "Un nom de clé est requis", - "landscape-view-coming-soon": "Vue paysage (bientôt disponible)", + "landscape-view-coming-soon": "Vue paysage", "milligrams": "milligrammes", "new-key-name": "Nouveau nom de clé", "no-white-space-allowed": "Aucun espace blanc autorisé", @@ -536,11 +536,11 @@ "toggle-section": "Activer/désactiver la section", "see-original-text": "Afficher le texte original", "original-text-with-value": "Texte original: {originalText}", - "ingredient-linker": "Liaison d’ingrédients", + "ingredient-linker": "Association d’ingrédients", "linked-to-other-step": "Lié à une autre étape", "auto": "Auto", "cook-mode": "Mode Cuisine", - "link-ingredients": "Ingrédients du lien", + "link-ingredients": "Associer des ingrédients", "merge-above": "Fusionner avec au-dessus", "move-to-bottom": "Déplacer à la fin", "move-to-top": "Déplacer au début", @@ -584,11 +584,11 @@ "create-recipes": "Créer des recettes", "import-with-zip": "Importer un .zip", "create-recipe-from-an-image": "Créer une recette à partir d’une image", - "create-recipe-from-an-image-description": "Créez une recette en téléchargeant une image de celle-ci. Mealie utilisera l’IA pour tenter d’extraire le texte et de créer une recette.", - "crop-and-rotate-the-image": "Rogner et pivoter l’image pour que seul le texte soit visible, et qu’il soit dans la bonne orientation.", + "create-recipe-from-an-image-description": "Créez une recette en téléversant une image de celle-ci. Mealie utilisera l’IA pour tenter d’extraire le texte et de créer une recette.", + "crop-and-rotate-the-image": "Rogner et pivoter l’image pour que seul le texte soit visible et qu’il soit dans la bonne orientation.", "create-from-image": "Créer à partir d’une image", "should-translate-description": "Traduire la recette dans ma langue", - "please-wait-image-procesing": "Veuillez patienter, l’image est en cours de traitement. Cela peut prendre du temps.", + "please-wait-image-procesing": "Veuillez patienter, l'image est en cours de traitement. Cela peut prendre un certain temps.", "bulk-url-import": "Importation en masse d'URL", "debug-scraper": "Déboguer le récupérateur", "create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Créer une recette en fournissant le nom. Toutes les recettes doivent avoir des noms uniques.", @@ -614,7 +614,7 @@ "recipe-debugger": "Débogueur de recette", "recipe-debugger-description": "Récupérez l'URL de la recette que vous voulez déboguer et collez-la ici. La recette sera analysée et les résultats seront affichés. Si vous ne voyez aucune donnée retournée, le site que vous essayez de récupérer n'est pas pris en charge par Mealie.", "use-openai": "Utiliser OpenAI", - "recipe-debugger-use-openai-description": "Utilisez OpenAI pour analyser les résultats au lieu de la bibliothèque d’extraction. Lors de la création d'une recette via une URL, cela se fait automatiquement si la bibliothèque d’extraction échoue, mais vous pouvez le tester manuellement ici.", + "recipe-debugger-use-openai-description": "Utilisez OpenAI pour analyser les résultats au lieu de la librairie d’extraction. Lors de la création d'une recette via une URL, cela se fait automatiquement si la librairie d’extraction échoue, mais vous pouvez le tester manuellement ici.", "debug": "Déboguer", "tree-view": "Vue en arborescence", "recipe-yield": "Nombre de parts", @@ -1017,7 +1017,7 @@ "food-data": "Données de l'aliment", "example-food-singular": "ex : Oignon", "example-food-plural": "ex : Oignons", - "label-overwrite-warning": "Ceci affectera l’étiquette choisie à tous les aliments sélectionnés et remplacera potentiellement vos étiquettes existantes.", + "label-overwrite-warning": "L’étiquette choisie sera assignée à tous les aliments sélectionnés et remplacera potentiellement vos étiquettes existantes.", "on-hand-checkbox-label": "Appliquer cet attribut décochera cet aliment par défaut lorsqu'il est ajouté à une liste de courses." }, "units": { @@ -1047,7 +1047,7 @@ "edit-label": "Modifier l’étiquette", "new-label": "Nouvelle étiquette", "labels": "Étiquettes", - "assign-label": "Affecter une étiquette" + "assign-label": "Assigner une étiquette" }, "recipes": { "purge-exports": "Purger les exports", @@ -1252,8 +1252,8 @@ "account-summary-description": "Voici un résumé des informations de votre groupe.", "group-statistics": "Statistiques du groupe", "group-statistics-description": "Les statistiques de votre groupe vous donnent un aperçu de la façon dont vous utilisez Mealie.", - "household-statistics": "Household Statistics", - "household-statistics-description": "Your Household Statistics provide some insight how you're using Mealie.", + "household-statistics": "Statistiques du foyer", + "household-statistics-description": "Vos statistiques du foyer fournissent un aperçu sur la façon dont vous utilisez Mealie.", "storage-capacity": "Capacité de stockage", "storage-capacity-description": "Votre capacité de stockage est un calcul des images et des ressources que vous avez téléchargées.", "personal": "Personnel", @@ -1263,13 +1263,13 @@ "api-tokens-description": "Gérez vos jetons d'API pour accéder à partir d'applications externes.", "group-description": "Ces éléments sont partagés au sein de votre groupe. Un changement impactera l'ensemble du groupe !", "group-settings": "Paramètres de groupe", - "group-settings-description": "Manage your common group settings, like privacy settings.", - "household-description": "These items are shared within your household. Editing one of them will change it for the whole household!", - "household-settings": "Household Settings", - "household-settings-description": "Manage your household settings, like mealplan and privacy settings.", + "group-settings-description": "Gérez vos paramètres communs au groupe, comme les paramètres de confidentialité.", + "household-description": "Ces éléments sont partagés au sein de votre foyer. Un changement impactera l’ensemble du foyer!", + "household-settings": "Paramètres du foyer", + "household-settings-description": "Gérez les paramètres de votre foyer, comme les paramètres de menu ou de confidentialité.", "cookbooks-description": "Gérez une collection de catégories de recettes et générez des pages.", "members": "Membres", - "members-description": "See who's in your household and manage their permissions.", + "members-description": "Voyez les membres de votre foyer et gérez leurs permissions.", "webhooks-description": "Configurez les webhooks qui se déclenchent les jours où il y a un plan au menu.", "notifiers": "Notifications", "notifiers-description": "Configurer les courriels et les notifications push qui se déclenchent sur des événements spécifiques.", @@ -1304,7 +1304,7 @@ "require-all-tools": "Nécessite tous les ustensiles", "cookbook-name": "Nom du livre de recettes", "cookbook-with-name": "Livre de recettes {0}", - "household-cookbook-name": "{0} Cookbook {1}", + "household-cookbook-name": "{0} Livre de cuisine {1}", "create-a-cookbook": "Créer un nouveau livre de recettes", "cookbook": "Livre de recettes" } diff --git a/mealie/lang/messages/fr-CA.json b/mealie/lang/messages/fr-CA.json index 1686fc65271..b40f85ffdd6 100644 --- a/mealie/lang/messages/fr-CA.json +++ b/mealie/lang/messages/fr-CA.json @@ -47,25 +47,25 @@ }, "emails": { "password": { - "subject": "Mealie Forgot Password", - "header_text": "Forgot Password", - "message_top": "You have requested to reset your password.", - "message_bottom": "Please click the button above to reset your password.", - "button_text": "Reset Password" + "subject": "Mot de passe oublié pour Mealie", + "header_text": "Mot de passe oublié", + "message_top": "Vous avez demandé de réinitialiser votre mot de passe.", + "message_bottom": "Veuillez cliquer sur le bouton ci-dessus pour réinitialiser votre mot de passe.", + "button_text": "Réinitialiser le mot de passe" }, "invitation": { - "subject": "Invitation to join Mealie", - "header_text": "You're Invited!", - "message_top": "You have been invited to join Mealie.", - "message_bottom": "Please click the button above to accept the invitation.", - "button_text": "Accept Invitation" + "subject": "Invitation à rejoindre Mealie", + "header_text": "Vous êtes invité!", + "message_top": "Vous avez été invité à rejoindre Mealie.", + "message_bottom": "Veuillez cliquer sur le bouton ci-dessus pour accepter l'invitation.", + "button_text": "Accepter l'invitation" }, "test": { - "subject": "Mealie Test Email", - "header_text": "Test Email", - "message_top": "This is a test email.", - "message_bottom": "Please click the button above to test the email.", - "button_text": "Open Mealie" + "subject": "Email de test Mealie", + "header_text": "Email de test", + "message_top": "Ceci est un email de test.", + "message_bottom": "Veuillez cliquer sur le bouton ci-dessus pour tester l'email.", + "button_text": "Ouvrir Mealie" } } } diff --git a/mealie/repos/seed/resources/foods/locales/de-DE.json b/mealie/repos/seed/resources/foods/locales/de-DE.json index 365b30639d1..3112c7249be 100644 --- a/mealie/repos/seed/resources/foods/locales/de-DE.json +++ b/mealie/repos/seed/resources/foods/locales/de-DE.json @@ -42,7 +42,7 @@ "caraway": "Kümmel", "carrot": "Karotte", "castor-sugar": "Zucker", - "cayenne-pepper": "Cayenne Pfeffer", + "cayenne-pepper": "Cayennepfeffer", "celeriac": "Sellerie", "celery": "Sellerie", "cereal-grains": "Getreidekörner", diff --git a/mealie/repos/seed/resources/foods/locales/fr-CA.json b/mealie/repos/seed/resources/foods/locales/fr-CA.json index 91dd3c8bc8f..87fd8892d69 100644 --- a/mealie/repos/seed/resources/foods/locales/fr-CA.json +++ b/mealie/repos/seed/resources/foods/locales/fr-CA.json @@ -128,7 +128,7 @@ "jerusalem-artichoke": "topinambour", "jicama": "igname", "kale": "chou frisé", - "kumara": "kumara", + "kumara": "kumura", "leavening-agents": "levure", "leek": "poireau", "legumes": "légumineuses ", diff --git a/mealie/repos/seed/resources/labels/locales/fr-CA.json b/mealie/repos/seed/resources/labels/locales/fr-CA.json index a9f8efa9bcd..d98befb0d63 100644 --- a/mealie/repos/seed/resources/labels/locales/fr-CA.json +++ b/mealie/repos/seed/resources/labels/locales/fr-CA.json @@ -39,7 +39,7 @@ "name": "Aliments congelés" }, { - "name": "Produits healthy" + "name": "Aliments Santé" }, { "name": "Foyer" diff --git a/mealie/repos/seed/resources/units/locales/fr-CA.json b/mealie/repos/seed/resources/units/locales/fr-CA.json index e6693981654..12f7ed80a77 100644 --- a/mealie/repos/seed/resources/units/locales/fr-CA.json +++ b/mealie/repos/seed/resources/units/locales/fr-CA.json @@ -1,31 +1,31 @@ { "teaspoon": { "name": "cuillère à thé", - "plural_name": "teaspoons", + "plural_name": "cuillères à thé", "description": "", "abbreviation": "càc" }, "tablespoon": { "name": "cuillère à soupe", - "plural_name": "tablespoons", + "plural_name": "cuillères à soupe", "description": "", - "abbreviation": "càS" + "abbreviation": "càs" }, "cup": { "name": "tasse", - "plural_name": "cups", + "plural_name": "tasses", "description": "", - "abbreviation": "c" + "abbreviation": "t" }, "fluid-ounce": { - "name": "centilitre", - "plural_name": "fluid ounces", + "name": "once fluide", + "plural_name": "onces liquides", "description": "", - "abbreviation": "cL" + "abbreviation": "fl oz" }, "pint": { "name": "pinte", - "plural_name": "pints", + "plural_name": "pintes", "description": "", "abbreviation": "pt" }, @@ -42,99 +42,99 @@ "abbreviation": "gal" }, "milliliter": { - "name": "mililitre", - "plural_name": "milliliters", + "name": "millilitre", + "plural_name": "millilitres", "description": "", "abbreviation": "ml" }, "liter": { "name": "litre", - "plural_name": "liters", + "plural_name": "litres", "description": "", - "abbreviation": "L" + "abbreviation": "l" }, "pound": { "name": "livre", - "plural_name": "pounds", + "plural_name": "livres", "description": "", "abbreviation": "lb", "plural_abbreviation": "lbs" }, "ounce": { "name": "once", - "plural_name": "ounces", + "plural_name": "onces", "description": "", "abbreviation": "oz" }, "gram": { "name": "gramme", - "plural_name": "grams", + "plural_name": "grammes", "description": "", "abbreviation": "g" }, "kilogram": { "name": "kilogramme", - "plural_name": "kilograms", + "plural_name": "kilogrammes", "description": "", "abbreviation": "kg" }, "milligram": { "name": "milligramme", - "plural_name": "milligrams", + "plural_name": "milligrammes", "description": "", "abbreviation": "mg" }, "splash": { "name": "éclaboussure", - "plural_name": "splashes", + "plural_name": "gouttes", "description": "", "abbreviation": "" }, "dash": { "name": "trait", - "plural_name": "dashes", + "plural_name": "gouttes", "description": "", "abbreviation": "" }, "serving": { "name": "part", - "plural_name": "servings", + "plural_name": "portions", "description": "", "abbreviation": "" }, "head": { "name": "tête", - "plural_name": "heads", + "plural_name": "têtes", "description": "", "abbreviation": "" }, "clove": { "name": "gousse", - "plural_name": "cloves", + "plural_name": "gousses", "description": "", "abbreviation": "" }, "can": { "name": "boîte", - "plural_name": "cans", + "plural_name": "cannes", "description": "", "abbreviation": "" }, "bunch": { - "name": "bunch", - "plural_name": "bunches", + "name": "bouquet", + "plural_name": "bouquets", "description": "", "abbreviation": "" }, "pack": { - "name": "pack", - "plural_name": "packs", + "name": "paquet", + "plural_name": "paquets", "description": "", "abbreviation": "" }, "pinch": { - "name": "pinch", - "plural_name": "pinches", + "name": "pincée", + "plural_name": "pincées", "description": "", "abbreviation": "" } From 7b64664092c9b224da7000baabcdcab246a89870 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 9 Sep 2024 20:33:43 +0000 Subject: [PATCH 033/102] fix(deps): update dependency openai to v1.44.1 (#4185) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/poetry.lock b/poetry.lock index 133a77240de..5dfc4ad7365 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1591,13 +1591,13 @@ signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] [[package]] name = "openai" -version = "1.44.0" +version = "1.44.1" description = "The official Python library for the openai API" optional = false python-versions = ">=3.7.1" files = [ - {file = "openai-1.44.0-py3-none-any.whl", hash = "sha256:99a12bbda15f9c632ee911851e101669a82ee34992fbfd658a9db27d90dc0a9c"}, - {file = "openai-1.44.0.tar.gz", hash = "sha256:acde74598976ec85bc477e9abb94eeb17f6efd998914d5685eeb46a69116894a"}, + {file = "openai-1.44.1-py3-none-any.whl", hash = "sha256:07e2c2758d1c94151c740b14dab638ba0d04bcb41a2e397045c90e7661cdf741"}, + {file = "openai-1.44.1.tar.gz", hash = "sha256:e0ffdab601118329ea7529e684b606a72c6c9d4f05be9ee1116255fcf5593874"}, ] [package.dependencies] @@ -2071,8 +2071,8 @@ files = [ annotated-types = ">=0.6.0" pydantic-core = "2.23.3" typing-extensions = [ - {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, {version = ">=4.6.1", markers = "python_version < \"3.13\""}, + {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, ] [package.extras] @@ -2275,8 +2275,8 @@ files = [ astroid = ">=3.2.4,<=3.3.0-dev0" colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} dill = [ - {version = ">=0.3.7", markers = "python_version >= \"3.12\""}, {version = ">=0.2", markers = "python_version < \"3.11\""}, + {version = ">=0.3.7", markers = "python_version >= \"3.12\""}, {version = ">=0.3.6", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, ] isort = ">=4.2.5,<5.13.0 || >5.13.0,<6" From 0f35803196247f5cba7549b38b0f4d029909026b Mon Sep 17 00:00:00 2001 From: boc-the-git <3479092+boc-the-git@users.noreply.github.com> Date: Wed, 11 Sep 2024 00:23:23 +1000 Subject: [PATCH 034/102] feat: Add autolabeler functionality for PRs (#4188) --- .github/release-drafter.yml | 18 ++++++++++++++++-- .github/workflows/release-drafter.yml | 9 +++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/.github/release-drafter.yml b/.github/release-drafter.yml index b20f603c8d9..1801337a5a9 100644 --- a/.github/release-drafter.yml +++ b/.github/release-drafter.yml @@ -50,8 +50,22 @@ version-resolver: default: patch template: | - # 🍴🍴🍴🍴🍴🍴🍴🍴🍴🍴 + # 🍴🍴🍴🍴🍴🍴 $CHANGES - # 🍴🍴🍴🍴🍴🍴🍴🍴🍴🍴 + # 🍴🍴🍴🍴🍴🍴 + +autolabeler: + - label: 'feature' + title: + - '/feat/i' + - label: 'bugfix' + title: + - '/fix/i' + - label: 'documentation' + title: + - '/docs/i' + - label: 'chore' + title: + - '/chore/i' diff --git a/.github/workflows/release-drafter.yml b/.github/workflows/release-drafter.yml index 1c8f998c904..10fd8a7285e 100644 --- a/.github/workflows/release-drafter.yml +++ b/.github/workflows/release-drafter.yml @@ -5,6 +5,12 @@ on: push: branches: - mealie-next + # pull_request event is required for autolabeler + pull_request: + types: [opened, labeled, unlabeled, reopened, synchronize] + # pull_request_target event is required for autolabeler to support PRs from forks + pull_request_target: + types: [opened, labeled, unlabeled, reopened, synchronize] workflow_dispatch: jobs: @@ -12,6 +18,9 @@ jobs: permissions: # write permission is required to create a github release contents: write + # write permission is required for autolabeler + # otherwise, read permission is required at least + pull-requests: write name: ✏️ Draft release runs-on: ubuntu-latest steps: From 07ccaf022ad23d29bdeef5506e04a903ac90f38a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 10 Sep 2024 14:32:50 +0000 Subject: [PATCH 035/102] chore(deps): update dependency pytest to v8.3.3 (#4189) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index 5dfc4ad7365..4d1b1d45257 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2338,13 +2338,13 @@ rdflib = "*" [[package]] name = "pytest" -version = "8.3.2" +version = "8.3.3" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" files = [ - {file = "pytest-8.3.2-py3-none-any.whl", hash = "sha256:4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5"}, - {file = "pytest-8.3.2.tar.gz", hash = "sha256:c132345d12ce551242c87269de812483f5bcc87cdbb4722e48487ba194f9fdce"}, + {file = "pytest-8.3.3-py3-none-any.whl", hash = "sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2"}, + {file = "pytest-8.3.3.tar.gz", hash = "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181"}, ] [package.dependencies] From 6d5c8522d76ee6887f5542fd811293e9c39bec6f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 10 Sep 2024 14:44:50 +0000 Subject: [PATCH 036/102] chore(deps): update dependency rich to v13.8.1 (#4190) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index 4d1b1d45257..d9057a48096 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2826,13 +2826,13 @@ rsa = ["oauthlib[signedtoken] (>=3.0.0)"] [[package]] name = "rich" -version = "13.8.0" +version = "13.8.1" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" optional = false python-versions = ">=3.7.0" files = [ - {file = "rich-13.8.0-py3-none-any.whl", hash = "sha256:2e85306a063b9492dffc86278197a60cbece75bcb766022f3436f567cae11bdc"}, - {file = "rich-13.8.0.tar.gz", hash = "sha256:a5ac1f1cd448ade0d59cc3356f7db7a7ccda2c8cbae9c7a90c28ff463d3e91f4"}, + {file = "rich-13.8.1-py3-none-any.whl", hash = "sha256:1760a3c0848469b97b558fc61c85233e3dafb69c7a071b4d60c38099d3cd4c06"}, + {file = "rich-13.8.1.tar.gz", hash = "sha256:8260cda28e3db6bf04d2d1ef4dbc03ba80a824c88b0e7668a0f23126a424844a"}, ] [package.dependencies] From 1cbfdbe4cf2b0d39436cc7d1b106c25efa4d0c8a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 10 Sep 2024 10:38:45 -0500 Subject: [PATCH 037/102] fix(deps): update dependency pydantic-settings to v2.5.0 (#4191) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index d9057a48096..f62953bf21c 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2182,13 +2182,13 @@ typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" [[package]] name = "pydantic-settings" -version = "2.4.0" +version = "2.5.0" description = "Settings management using Pydantic" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_settings-2.4.0-py3-none-any.whl", hash = "sha256:bb6849dc067f1687574c12a639e231f3a6feeed0a12d710c1382045c5db1c315"}, - {file = "pydantic_settings-2.4.0.tar.gz", hash = "sha256:ed81c3a0f46392b4d7c0a565c05884e6e54b3456e6f0fe4d8814981172dc9a88"}, + {file = "pydantic_settings-2.5.0-py3-none-any.whl", hash = "sha256:eae04a3dd9adf521a4c959dcefb984e0f3b1d841999daf02f961dcc4d31d2f7f"}, + {file = "pydantic_settings-2.5.0.tar.gz", hash = "sha256:204828c02481a2e7135466b26a7d65d9e15a17d52d1d8f59cacdf9ad625e1140"}, ] [package.dependencies] From 4ee292a1bcc3e971d4b334e147388e58676e547b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 11 Sep 2024 20:01:23 +1000 Subject: [PATCH 038/102] fix(deps): update dependency fastapi to v0.114.1 (#4194) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index f62953bf21c..a7640bfa0e6 100644 --- a/poetry.lock +++ b/poetry.lock @@ -637,13 +637,13 @@ cli = ["requests"] [[package]] name = "fastapi" -version = "0.114.0" +version = "0.114.1" description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" optional = false python-versions = ">=3.8" files = [ - {file = "fastapi-0.114.0-py3-none-any.whl", hash = "sha256:fee75aa1b1d3d73f79851c432497e4394e413e1dece6234f68d3ce250d12760a"}, - {file = "fastapi-0.114.0.tar.gz", hash = "sha256:9908f2a5cc733004de6ca5e1412698f35085cefcbfd41d539245b9edf87b73c1"}, + {file = "fastapi-0.114.1-py3-none-any.whl", hash = "sha256:5d4746f6e4b7dff0b4f6b6c6d5445645285f662fe75886e99af7ee2d6b58bb3e"}, + {file = "fastapi-0.114.1.tar.gz", hash = "sha256:1d7bbbeabbaae0acb0c22f0ab0b040f642d3093ca3645f8c876b6f91391861d8"}, ] [package.dependencies] From 4400be1956241276077d66709838d43226be9908 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 11 Sep 2024 10:12:35 +0000 Subject: [PATCH 039/102] fix(deps): update dependency pydantic-settings to v2.5.2 (#4195) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index a7640bfa0e6..49180e7aaad 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2182,13 +2182,13 @@ typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" [[package]] name = "pydantic-settings" -version = "2.5.0" +version = "2.5.2" description = "Settings management using Pydantic" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_settings-2.5.0-py3-none-any.whl", hash = "sha256:eae04a3dd9adf521a4c959dcefb984e0f3b1d841999daf02f961dcc4d31d2f7f"}, - {file = "pydantic_settings-2.5.0.tar.gz", hash = "sha256:204828c02481a2e7135466b26a7d65d9e15a17d52d1d8f59cacdf9ad625e1140"}, + {file = "pydantic_settings-2.5.2-py3-none-any.whl", hash = "sha256:2c912e55fd5794a59bf8c832b9de832dcfdf4778d79ff79b708744eed499a907"}, + {file = "pydantic_settings-2.5.2.tar.gz", hash = "sha256:f90b139682bee4d2065273d5185d71d37ea46cfe57e1b5ae184fc6a0b2484ca0"}, ] [package.dependencies] From 3480d11d19833c1af51dc4809d35b9b7aef04dc1 Mon Sep 17 00:00:00 2001 From: boc-the-git <3479092+boc-the-git@users.noreply.github.com> Date: Thu, 12 Sep 2024 00:03:17 +1000 Subject: [PATCH 040/102] feat: Change autolabeler regex to include : (#4196) --- .github/release-drafter.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/release-drafter.yml b/.github/release-drafter.yml index 1801337a5a9..dfbb3bd1050 100644 --- a/.github/release-drafter.yml +++ b/.github/release-drafter.yml @@ -62,10 +62,10 @@ autolabeler: - '/feat/i' - label: 'bugfix' title: - - '/fix/i' + - '/fix:/i' - label: 'documentation' title: - - '/docs/i' + - '/docs:/i' - label: 'chore' title: - - '/chore/i' + - '/chore:/i' From a4869ca4749c0447bfd4dc1cf556d0458f362099 Mon Sep 17 00:00:00 2001 From: Ryan Breen Date: Wed, 11 Sep 2024 18:47:40 -0400 Subject: [PATCH 041/102] docs: boolean value in docker-compose examples not deserializable in env variables (#4130) Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com> --- .../docs/documentation/getting-started/installation/postgres.md | 2 +- docs/docs/documentation/getting-started/installation/sqlite.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/docs/documentation/getting-started/installation/postgres.md b/docs/docs/documentation/getting-started/installation/postgres.md index 27473d23491..cb5dda152e1 100644 --- a/docs/docs/documentation/getting-started/installation/postgres.md +++ b/docs/docs/documentation/getting-started/installation/postgres.md @@ -20,7 +20,7 @@ services: - mealie-data:/app/data/ environment: # Set Backend ENV Variables Here - ALLOW_SIGNUP: false + ALLOW_SIGNUP: "false" PUID: 1000 PGID: 1000 TZ: America/Anchorage diff --git a/docs/docs/documentation/getting-started/installation/sqlite.md b/docs/docs/documentation/getting-started/installation/sqlite.md index 129974fc63c..2b38280c834 100644 --- a/docs/docs/documentation/getting-started/installation/sqlite.md +++ b/docs/docs/documentation/getting-started/installation/sqlite.md @@ -24,7 +24,7 @@ services: - mealie-data:/app/data/ environment: # Set Backend ENV Variables Here - ALLOW_SIGNUP: false + ALLOW_SIGNUP: "false" PUID: 1000 PGID: 1000 TZ: America/Anchorage From b15d68b8d2445c8938f2778389176576ab91972e Mon Sep 17 00:00:00 2001 From: Michael Genson <71845777+michael-genson@users.noreply.github.com> Date: Wed, 11 Sep 2024 17:59:15 -0500 Subject: [PATCH 042/102] fix: Tweak recipe card height to be consistent (#4150) Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com> --- .../Domain/Recipe/RecipeCardMobile.vue | 162 +++++++++--------- .../Domain/Recipe/RecipeCardSection.vue | 1 - 2 files changed, 84 insertions(+), 79 deletions(-) diff --git a/frontend/components/Domain/Recipe/RecipeCardMobile.vue b/frontend/components/Domain/Recipe/RecipeCardMobile.vue index 1f9b281adeb..6fa5b8354e8 100644 --- a/frontend/components/Domain/Recipe/RecipeCardMobile.vue +++ b/frontend/components/Domain/Recipe/RecipeCardMobile.vue @@ -1,83 +1,85 @@ - diff --git a/frontend/components/Domain/Recipe/RecipeCard.vue b/frontend/components/Domain/Recipe/RecipeCard.vue index aa22437e3e5..b6c627c60d3 100644 --- a/frontend/components/Domain/Recipe/RecipeCard.vue +++ b/frontend/components/Domain/Recipe/RecipeCard.vue @@ -50,7 +50,7 @@ :recipe-id="recipeId" :use-items="{ delete: false, - edit: true, + edit: false, download: true, mealplanner: true, shoppingList: true, diff --git a/frontend/components/Domain/Recipe/RecipeCardMobile.vue b/frontend/components/Domain/Recipe/RecipeCardMobile.vue index 6fa5b8354e8..3d064126948 100644 --- a/frontend/components/Domain/Recipe/RecipeCardMobile.vue +++ b/frontend/components/Domain/Recipe/RecipeCardMobile.vue @@ -62,7 +62,7 @@ :recipe-id="recipeId" :use-items="{ delete: false, - edit: true, + edit: false, download: true, mealplanner: true, shoppingList: true, diff --git a/frontend/components/Domain/Recipe/RecipePage/RecipePageParts/RecipePageHeader.vue b/frontend/components/Domain/Recipe/RecipePage/RecipePageParts/RecipePageHeader.vue index 18915641ae2..69853821a79 100644 --- a/frontend/components/Domain/Recipe/RecipePage/RecipePageParts/RecipePageHeader.vue +++ b/frontend/components/Domain/Recipe/RecipePage/RecipePageParts/RecipePageHeader.vue @@ -69,7 +69,8 @@ import RecipeRating from "~/components/Domain/Recipe/RecipeRating.vue"; import RecipeLastMade from "~/components/Domain/Recipe/RecipeLastMade.vue"; import RecipeActionMenu from "~/components/Domain/Recipe/RecipeActionMenu.vue"; import RecipeTimeCard from "~/components/Domain/Recipe/RecipeTimeCard.vue"; -import { useStaticRoutes } from "~/composables/api"; +import { useStaticRoutes, useUserApi } from "~/composables/api"; +import { HouseholdSummary } from "~/lib/api/types/household"; import { Recipe } from "~/lib/api/types/recipe"; import { NoUndefinedField } from "~/lib/api/types/non-generated"; import { usePageState, usePageUser, PageMode, EditorMode } from "~/composables/recipe-page/shared-state"; @@ -100,7 +101,15 @@ export default defineComponent({ const { imageKey, pageMode, editMode, setMode, toggleEditMode, isEditMode } = usePageState(props.recipe.slug); const { user } = usePageUser(); const { isOwnGroup } = useLoggedInState(); - const { canEditRecipe } = useRecipePermissions(props.recipe, user); + + const recipeHousehold = ref(); + if (user) { + const userApi = useUserApi(); + userApi.groups.fetchHousehold(props.recipe.householdId).then(({ data }) => { + recipeHousehold.value = data || undefined; + }); + } + const { canEditRecipe } = useRecipePermissions(props.recipe, recipeHousehold, user); function printRecipe() { window.print(); diff --git a/frontend/composables/recipes/use-recipe-permissions.test.ts b/frontend/composables/recipes/use-recipe-permissions.test.ts index 6dedeb32b37..a962d7af34d 100644 --- a/frontend/composables/recipes/use-recipe-permissions.test.ts +++ b/frontend/composables/recipes/use-recipe-permissions.test.ts @@ -1,5 +1,7 @@ import { describe, test, expect } from "vitest"; +import { ref, Ref } from "@nuxtjs/composition-api"; import { useRecipePermissions } from "./use-recipe-permissions"; +import { HouseholdSummary } from "~/lib/api/types/household"; import { Recipe } from "~/lib/api/types/recipe"; import { UserOut } from "~/lib/api/types/user"; @@ -32,35 +34,76 @@ describe("test use recipe permissions", () => { ...overrides, }); + const createRecipeHousehold = (overrides: Partial, lockRecipeEdits = false): Ref => ( + ref({ + id: commonHouseholdId, + groupId: commonGroupId, + name: "My Household", + slug: "my-household", + preferences: { + id: "my-household-preferences-id", + lockRecipeEditsFromOtherHouseholds: lockRecipeEdits, + }, + ...overrides, + }) + ); + test("when user is null, cannot edit", () => { - const result = useRecipePermissions(createRecipe({}), null); + const result = useRecipePermissions(createRecipe({}), createRecipeHousehold({}), null); expect(result.canEditRecipe.value).toBe(false); }); test("when user is recipe owner, can edit", () => { - const result = useRecipePermissions(createRecipe({}), createUser({})); + const result = useRecipePermissions(createRecipe({}), ref(), createUser({})); expect(result.canEditRecipe.value).toBe(true); }); - test("when user is not recipe owner, is correct group and household, and recipe is unlocked, can edit", () => { + test( + "when user is not recipe owner, is correct group and household, recipe is unlocked, and household is unlocked, can edit", + () => { + const result = useRecipePermissions( + createRecipe({}), + createRecipeHousehold({}), + createUser({ id: "other-user-id" }), + ); + expect(result.canEditRecipe.value).toBe(true); + } + ); + + test( + "when user is not recipe owner, is correct group and household, recipe is unlocked, but household is locked, can edit", + () => { + const result = useRecipePermissions( + createRecipe({}), + createRecipeHousehold({}, true), + createUser({ id: "other-user-id" }), + ); + expect(result.canEditRecipe.value).toBe(true); + } + ); + + test("when user is not recipe owner, and user is other group, cannot edit", () => { const result = useRecipePermissions( createRecipe({}), - createUser({ id: "other-user-id" }), + createRecipeHousehold({}), + createUser({ id: "other-user-id", groupId: "other-group-id"}), ); - expect(result.canEditRecipe.value).toBe(true); + expect(result.canEditRecipe.value).toBe(false); }); - test("when user is not recipe owner, and user is other group, cannot edit", () => { + test("when user is not recipe owner, and user is other household, and household is unlocked, can edit", () => { const result = useRecipePermissions( createRecipe({}), - createUser({ id: "other-user-id", groupId: "other-group-id"}), + createRecipeHousehold({}), + createUser({ id: "other-user-id", householdId: "other-household-id" }), ); - expect(result.canEditRecipe.value).toBe(false); + expect(result.canEditRecipe.value).toBe(true); }); - test("when user is not recipe owner, and user is other household, cannot edit", () => { + test("when user is not recipe owner, and user is other household, and household is locked, cannot edit", () => { const result = useRecipePermissions( createRecipe({}), + createRecipeHousehold({}, true), createUser({ id: "other-user-id", householdId: "other-household-id" }), ); expect(result.canEditRecipe.value).toBe(false); @@ -69,13 +112,14 @@ describe("test use recipe permissions", () => { test("when user is not recipe owner, and recipe is locked, cannot edit", () => { const result = useRecipePermissions( createRecipe({}, true), + createRecipeHousehold({}), createUser({ id: "other-user-id"}), ); expect(result.canEditRecipe.value).toBe(false); }); - test("when user is recipe owner, and recipe is locked, can edit", () => { - const result = useRecipePermissions(createRecipe({}, true), createUser({})); + test("when user is recipe owner, and recipe is locked, and household is locked, can edit", () => { + const result = useRecipePermissions(createRecipe({}, true), createRecipeHousehold({}, true), createUser({})); expect(result.canEditRecipe.value).toBe(true); }); }); diff --git a/frontend/composables/recipes/use-recipe-permissions.ts b/frontend/composables/recipes/use-recipe-permissions.ts index bd3af98dca1..d4efbfd058b 100644 --- a/frontend/composables/recipes/use-recipe-permissions.ts +++ b/frontend/composables/recipes/use-recipe-permissions.ts @@ -1,34 +1,44 @@ -import { computed } from "@nuxtjs/composition-api"; +import { computed, Ref } from "@nuxtjs/composition-api"; import { Recipe } from "~/lib/api/types/recipe"; +import { HouseholdSummary } from "~/lib/api/types/household"; import { UserOut } from "~/lib/api/types/user"; -export function useRecipePermissions(recipe: Recipe, user: UserOut | null) { - const canEditRecipe = computed(() => { - // Check recipe owner - if (!user?.id) { - return false; - } - if (user.id === recipe.userId) { - return true; - } +export function useRecipePermissions( + recipe: Recipe, + recipeHousehold: Ref, + user: UserOut | null, +) { + const canEditRecipe = computed(() => { + // Check recipe owner + if (!user?.id) { + return false; + } + if (user.id === recipe.userId) { + return true; + } - // Check group and household - if (user.groupId !== recipe.groupId) { - return false; - } - if (user.householdId !== recipe.householdId) { - return false; - } + // Check group and household + if (user.groupId !== recipe.groupId) { + return false; + } + if (user.householdId !== recipe.householdId) { + if (!recipeHousehold.value?.preferences) { + return false; + } + if (recipeHousehold.value?.preferences.lockRecipeEditsFromOtherHouseholds) { + return false; + } + } - // Check recipe - if (recipe.settings?.locked) { - return false; - } + // Check recipe + if (recipe.settings?.locked) { + return false; + } - return true; - }); + return true; + }); - return { - canEditRecipe, - } + return { + canEditRecipe, + } } diff --git a/frontend/composables/use-households.ts b/frontend/composables/use-households.ts index 618ab75636f..44f9caf8f4e 100644 --- a/frontend/composables/use-households.ts +++ b/frontend/composables/use-households.ts @@ -36,6 +36,8 @@ export const useHouseholdSelf = function () { if (data) { householdSelfRef.value.preferences = data; } + + return data || undefined; }, }; diff --git a/frontend/composables/use-users/user-form.ts b/frontend/composables/use-users/user-form.ts index 387f56f49c4..79b889f3f0f 100644 --- a/frontend/composables/use-users/user-form.ts +++ b/frontend/composables/use-users/user-form.ts @@ -65,6 +65,12 @@ export const useUserForm = () => { type: fieldTypes.BOOLEAN, rules: ["required"], }, + { + label: i18n.tc("user.user-can-manage-household"), + varName: "canManageHousehold", + type: fieldTypes.BOOLEAN, + rules: ["required"], + }, { label: i18n.tc("user.enable-advanced-features"), varName: "advanced", diff --git a/frontend/lang/messages/en-US.json b/frontend/lang/messages/en-US.json index 0ee1fadc316..382aa53aca0 100644 --- a/frontend/lang/messages/en-US.json +++ b/frontend/lang/messages/en-US.json @@ -241,13 +241,14 @@ "manage-members": "Manage Members", "manage-members-description": "Manage the permissions of the members in your household. {manage} allows the user to access the data-management page, and {invite} allows the user to generate invitation links for other users. Group owners cannot change their own permissions.", "manage": "Manage", + "manage-household": "Manage Household", "invite": "Invite", "looking-to-update-your-profile": "Looking to Update Your Profile?", "default-recipe-preferences-description": "These are the default settings when a new recipe is created in your group. These can be changed for individual recipes in the recipe settings menu.", "default-recipe-preferences": "Default Recipe Preferences", "group-preferences": "Group Preferences", "private-group": "Private Group", - "private-group-description": "Setting your group to private will default all public view options to default. This overrides any individual households or recipes public view settings.", + "private-group-description": "Setting your group to private will disable all public view options. This overrides any individual public view settings", "enable-public-access": "Enable Public Access", "enable-public-access-description": "Make group recipes public by default, and allow visitors to view recipes without logging-in", "allow-users-outside-of-your-group-to-see-your-recipes": "Allow users outside of your group to see your recipes", @@ -285,7 +286,9 @@ "admin-household-management-text": "Changes to this household will be reflected immediately.", "household-id-value": "Household Id: {0}", "private-household": "Private Household", - "private-household-description": "Setting your household to private will default all public view options to default. This overrides any individual recipes public view settings.", + "private-household-description": "Setting your household to private will disable all public view options. This overrides any individual public view settings", + "lock-recipe-edits-from-other-households": "Lock recipe edits from other households", + "lock-recipe-edits-from-other-households-description": "When enabled only users in your household can edit recipes created by your household", "household-recipe-preferences": "Household Recipe Preferences", "default-recipe-preferences-description": "These are the default settings when a new recipe is created in your household. These can be changed for individual recipes in the recipe settings menu.", "allow-users-outside-of-your-household-to-see-your-recipes": "Allow users outside of your household to see your recipes", @@ -987,6 +990,7 @@ "administrator": "Administrator", "user-can-invite-other-to-group": "User can invite others to group", "user-can-manage-group": "User can manage group", + "user-can-manage-household": "User can manage household", "user-can-organize-group-data": "User can organize group data", "enable-advanced-features": "Enable advanced features", "it-looks-like-this-is-your-first-time-logging-in": "It looks like this is your first time logging in.", diff --git a/frontend/lib/api/types/admin.ts b/frontend/lib/api/types/admin.ts index 88bf0f22f21..6f42b40d443 100644 --- a/frontend/lib/api/types/admin.ts +++ b/frontend/lib/api/types/admin.ts @@ -16,6 +16,7 @@ export interface AdminAboutInfo { oidcRedirect: boolean; oidcProviderName: string; enableOpenai: boolean; + enableOpenaiImageServices: boolean; versionLatest: string; apiPort: number; apiDocs: boolean; diff --git a/frontend/lib/api/types/household.ts b/frontend/lib/api/types/household.ts index 7841bd3861f..79b1a7ffaf5 100644 --- a/frontend/lib/api/types/household.ts +++ b/frontend/lib/api/types/household.ts @@ -15,6 +15,7 @@ export interface CreateGroupRecipeAction { } export interface CreateHouseholdPreferences { privateHousehold?: boolean; + lockRecipeEditsFromOtherHouseholds?: boolean; firstDayOfWeek?: number; recipePublic?: boolean; recipeShowNutrition?: boolean; @@ -185,6 +186,7 @@ export interface HouseholdInDB { } export interface ReadHouseholdPreferences { privateHousehold?: boolean; + lockRecipeEditsFromOtherHouseholds?: boolean; firstDayOfWeek?: number; recipePublic?: boolean; recipeShowNutrition?: boolean; @@ -241,6 +243,7 @@ export interface SaveGroupRecipeAction { } export interface SaveHouseholdPreferences { privateHousehold?: boolean; + lockRecipeEditsFromOtherHouseholds?: boolean; firstDayOfWeek?: number; recipePublic?: boolean; recipeShowNutrition?: boolean; @@ -267,6 +270,7 @@ export interface SaveWebhook { } export interface SetPermissions { userId: string; + canManageHousehold?: boolean; canManage?: boolean; canInvite?: boolean; canOrganize?: boolean; @@ -649,6 +653,7 @@ export interface UpdateHouseholdAdmin { } export interface UpdateHouseholdPreferences { privateHousehold?: boolean; + lockRecipeEditsFromOtherHouseholds?: boolean; firstDayOfWeek?: number; recipePublic?: boolean; recipeShowNutrition?: boolean; diff --git a/frontend/lib/api/types/openai.ts b/frontend/lib/api/types/openai.ts index ac4a29bd998..f1a358ae084 100644 --- a/frontend/lib/api/types/openai.ts +++ b/frontend/lib/api/types/openai.ts @@ -62,4 +62,159 @@ export interface OpenAIIngredient { export interface OpenAIIngredients { ingredients?: OpenAIIngredient[]; } +export interface OpenAIRecipe { + /** + * + * The name or title of the recipe. If you're unable to determine the name of the recipe, you should + * make your best guess based upon the ingredients and instructions provided. + * + */ + name: string; + /** + * + * A long description of the recipe. This should be a string that describes the recipe in a few words + * or sentences. If the recipe doesn't have a description, you should return None. + * + */ + description: string | null; + /** + * + * The yield of the recipe. For instance, if the recipe makes 12 cookies, the yield is "12 cookies". + * If the recipe makes 2 servings, the yield is "2 servings". Typically yield consists of a number followed + * by the word "serving" or "servings", but it can be any string that describes the yield. If the yield + * isn't specified, you should return None. + * + */ + recipe_yield?: string | null; + /** + * + * The total time it takes to make the recipe. This should be a string that describes a duration of time, + * such as "1 hour and 30 minutes", "90 minutes", or "1.5 hours". If the recipe has multiple times, choose + * the longest time. If the recipe doesn't specify a total time or duration, or it specifies a prep time or + * perform time but not a total time, you should return None. Do not duplicate times between total time, prep + * time and perform time. + * + */ + total_time?: string | null; + /** + * + * The time it takes to prepare the recipe. This should be a string that describes a duration of time, + * such as "30 minutes", "1 hour", or "1.5 hours". If the recipe has a total time, the prep time should be + * less than the total time. If the recipe doesn't specify a prep time, you should return None. If the recipe + * supplies only one time, it should be the total time. Do not duplicate times between total time, prep + * time and coperformok time. + * + */ + prep_time?: string | null; + /** + * + * The time it takes to cook the recipe. This should be a string that describes a duration of time, + * such as "30 minutes", "1 hour", or "1.5 hours". If the recipe has a total time, the perform time should be + * less than the total time. If the recipe doesn't specify a perform time, you should return None. If the + * recipe specifies a cook time, active time, or other time besides total or prep, you should use that + * time as the perform time. If the recipe supplies only one time, it should be the total time, and not the + * perform time. Do not duplicate times between total time, prep time and perform time. + * + */ + perform_time?: string | null; + /** + * + * A list of ingredients used in the recipe. Ingredients should be inserted in the order they appear in the + * recipe. If the recipe has no ingredients, you should return an empty list. + * + * Often times, but not always, ingredients are separated by line breaks. Use these as a guide to + * separate ingredients. + * + */ + ingredients?: OpenAIRecipeIngredient[]; + /** + * + * A list of ingredients used in the recipe. Ingredients should be inserted in the order they appear in the + * recipe. If the recipe has no ingredients, you should return an empty list. + * + * Often times, but not always, instructions are separated by line breaks and/or separated by paragraphs. + * Use these as a guide to separate instructions. They also may be separated by numbers or words, such as + * "1.", "2.", "Step 1", "Step 2", "First", "Second", etc. + * + */ + instructions?: OpenAIRecipeInstruction[]; + /** + * + * A list of notes found in the recipe. Notes should be inserted in the order they appear in the recipe. + * They may appear anywhere on the recipe, though they are typically found under the instructions. + * + */ + notes?: OpenAIRecipeNotes[]; +} +export interface OpenAIRecipeIngredient { + /** + * + * The title of the section of the recipe that the ingredient is found in. Recipes may not specify + * ingredient sections, in which case this should be left blank. + * Only the first item in the section should have this set, + * whereas subsuquent items should have their titles left blank (unless they start a new section). + * + */ + title?: string | null; + /** + * + * The text of the ingredient. This should represent the entire ingredient, such as "1 cup of flour" or + * "2 cups of onions, chopped". If the ingredient is completely blank, skip it and do not add the ingredient, + * since this field is required. + * + * If the ingredient has no text, but has a title, include the title on the + * next ingredient instead. + * + */ + text: string; +} +export interface OpenAIRecipeInstruction { + /** + * + * The title of the section of the recipe that the instruction is found in. Recipes may not specify + * instruction sections, in which case this should be left blank. + * Only the first instruction in the section should have this set, + * whereas subsuquent instructions should have their titles left blank (unless they start a new section). + * + */ + title?: string | null; + /** + * + * The text of the instruction. This represents one step in the recipe, such as "Preheat the oven to 350", + * or "Sauté the onions for 20 minutes". Sometimes steps can be longer, such as "Bring a large pot of lightly + * salted water to a boil. Add ditalini pasta and cook for 8 minutes or until al dente; drain.". + * + * Sometimes, but not always, recipes will include their number in front of the text, such as + * "1.", "2.", or "Step 1", "Step 2", or "First", "Second". In the case where they are directly numbered + * ("1.", "2.", "Step one", "Step 1", "Step two", "Step 2", etc.), you should not include the number in + * the text. However, if they use words ("First", "Second", etc.), then those should be included. + * + * If the instruction is completely blank, skip it and do not add the instruction, since this field is + * required. If the ingredient has no text, but has a title, include the title on the next + * instruction instead. + * + */ + text: string; +} +export interface OpenAIRecipeNotes { + /** + * + * The title of the note. Notes may not specify a title, and just have a body of text. In this case, + * title should be left blank, and all content should go in the note text. If the note title is just + * "note" or "info", you should ignore it and leave the title blank. + * + */ + title?: string | null; + /** + * + * The text of the note. This should represent the entire note, such as "This recipe is great for + * a summer picnic" or "This recipe is a family favorite". They may also include additional prep + * instructions such as "to make this recipe gluten free, use gluten free flour", or "you may prepare + * the dough the night before and refrigerate it until ready to bake". + * + * If the note is completely blank, skip it and do not add the note, since this field is required. + * + */ + text: string; +} export interface OpenAIBase {} diff --git a/frontend/lib/api/types/user.ts b/frontend/lib/api/types/user.ts index 8b2218f0015..81fd6a7014c 100644 --- a/frontend/lib/api/types/user.ts +++ b/frontend/lib/api/types/user.ts @@ -114,6 +114,7 @@ export interface PrivateUser { advanced?: boolean; canInvite?: boolean; canManage?: boolean; + canManageHousehold?: boolean; canOrganize?: boolean; groupId: string; groupSlug: string; @@ -189,6 +190,7 @@ export interface UserBase { advanced?: boolean; canInvite?: boolean; canManage?: boolean; + canManageHousehold?: boolean; canOrganize?: boolean; } export interface UserIn { @@ -203,6 +205,7 @@ export interface UserIn { advanced?: boolean; canInvite?: boolean; canManage?: boolean; + canManageHousehold?: boolean; canOrganize?: boolean; password: string; } @@ -218,6 +221,7 @@ export interface UserOut { advanced?: boolean; canInvite?: boolean; canManage?: boolean; + canManageHousehold?: boolean; canOrganize?: boolean; groupId: string; groupSlug: string; diff --git a/frontend/lib/api/user/groups.ts b/frontend/lib/api/user/groups.ts index a43063988ce..5dc85110abb 100644 --- a/frontend/lib/api/user/groups.ts +++ b/frontend/lib/api/user/groups.ts @@ -15,7 +15,8 @@ const routes = { groupsSelf: `${prefix}/groups/self`, preferences: `${prefix}/groups/preferences`, storage: `${prefix}/groups/storage`, - households: `${prefix}/households`, + households: `${prefix}/groups/households`, + householdsId: (id: string | number) => `${prefix}/groups/households/${id}`, membersHouseholdId: (householdId: string | number | null) => { return householdId ? `${prefix}/households/members?householdId=${householdId}` : @@ -50,6 +51,10 @@ export class GroupAPI extends BaseCRUDAPI(routes.households); } + async fetchHousehold(householdId: string | number) { + return await this.requests.get(routes.householdsId(householdId)); + } + async storage() { return await this.requests.get(routes.storage); } diff --git a/frontend/middleware/can-manage-household-only.ts b/frontend/middleware/can-manage-household-only.ts new file mode 100644 index 00000000000..0e4509e9e86 --- /dev/null +++ b/frontend/middleware/can-manage-household-only.ts @@ -0,0 +1,11 @@ +interface CanManageRedirectParams { + $auth: any + redirect: (path: string) => void +} +export default function ({ $auth, redirect }: CanManageRedirectParams) { + // If the user is not allowed to manage group settings redirect to the home page + if (!$auth.user?.canManageHousehold) { + console.warn("User is not allowed to manage household settings"); + return redirect("/"); + } +} diff --git a/frontend/pages/admin/manage/households/_id.vue b/frontend/pages/admin/manage/households/_id.vue index 174ab7c1b10..3e897cff2b1 100644 --- a/frontend/pages/admin/manage/households/_id.vue +++ b/frontend/pages/admin/manage/households/_id.vue @@ -53,7 +53,7 @@ import { VForm } from "~/types/vuetify"; export default defineComponent({ components: { - HouseholdPreferencesEditor, + HouseholdPreferencesEditor, }, layout: "admin", setup() { @@ -94,11 +94,8 @@ export default defineComponent({ const { response, data } = await userApi.households.updateOne(household.value.id, household.value); if (response?.status === 200 && data) { - if (household.value.slug !== data.slug) { - // the slug updated, which invalidates the nav URLs - window.location.reload(); - } household.value = data; + alert.success(i18n.tc("settings.settings-updated")); } else { alert.error(i18n.tc("settings.settings-update-failed")); } diff --git a/frontend/pages/household/index.vue b/frontend/pages/household/index.vue index 3e40b173ed6..0416a2bbad3 100644 --- a/frontend/pages/household/index.vue +++ b/frontend/pages/household/index.vue @@ -1,5 +1,5 @@ - + {{ child.icon }} {{ child.title }} - diff --git a/frontend/lang/messages/en-US.json b/frontend/lang/messages/en-US.json index 2dd9dcee3c2..72ec75defa9 100644 --- a/frontend/lang/messages/en-US.json +++ b/frontend/lang/messages/en-US.json @@ -1246,7 +1246,11 @@ "here-are-a-few-things-to-help-you-get-started": "Here are a few things to help you get started with Mealie", "restore-from-v1-backup": "Have a backup from a previous instance of Mealie v1? You can restore it here.", "manage-profile-or-get-invite-link": "Manage your own profile, or grab an invite link to share with others." - } + }, + "debug-openai-services": "Debug OpenAI Services", + "debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", + "run-test": "Run Test", + "test-results": "Test Results" }, "profile": { "welcome-user": "👋 Welcome, {0}!", diff --git a/frontend/layouts/admin.vue b/frontend/layouts/admin.vue index 16547f9cd21..41633791984 100644 --- a/frontend/layouts/admin.vue +++ b/frontend/layouts/admin.vue @@ -92,10 +92,23 @@ export default defineComponent({ restricted: true, }, { - icon: $globals.icons.slotMachine, - to: "/admin/parser", - title: i18n.tc("sidebar.parser"), + icon: $globals.icons.robot, + title: i18n.tc("recipe.debug"), restricted: true, + children: [ + { + icon: $globals.icons.robot, + to: "/admin/debug/openai", + title: i18n.tc("admin.openai"), + restricted: true, + }, + { + icon: $globals.icons.slotMachine, + to: "/admin/debug/parser", + title: i18n.tc("sidebar.parser"), + restricted: true, + }, + ] }, ]; diff --git a/frontend/lib/api/admin/admin-debug.ts b/frontend/lib/api/admin/admin-debug.ts new file mode 100644 index 00000000000..bfbc4cbc4a2 --- /dev/null +++ b/frontend/lib/api/admin/admin-debug.ts @@ -0,0 +1,21 @@ +import { BaseAPI } from "../base/base-clients"; +import { DebugResponse } from "~/lib/api/types/admin"; + +const prefix = "/api"; + +const routes = { + openai: `${prefix}/admin/debug/openai`, +}; + +export class AdminDebugAPI extends BaseAPI { + async debugOpenAI(fileObject: Blob | File | undefined = undefined, fileName = "") { + let formData: FormData | null = null; + if (fileObject) { + formData = new FormData(); + formData.append("image", fileObject); + formData.append("extension", fileName.split(".").pop() ?? ""); + } + + return await this.requests.post(routes.openai, formData); + } +} diff --git a/frontend/lib/api/client-admin.ts b/frontend/lib/api/client-admin.ts index bf151d390ed..27463043084 100644 --- a/frontend/lib/api/client-admin.ts +++ b/frontend/lib/api/client-admin.ts @@ -5,6 +5,7 @@ import { AdminGroupsApi } from "./admin/admin-groups"; import { AdminBackupsApi } from "./admin/admin-backups"; import { AdminMaintenanceApi } from "./admin/admin-maintenance"; import { AdminAnalyticsApi } from "./admin/admin-analytics"; +import { AdminDebugAPI } from "./admin/admin-debug"; import { ApiRequestInstance } from "~/lib/api/types/non-generated"; export class AdminAPI { @@ -15,6 +16,7 @@ export class AdminAPI { public backups: AdminBackupsApi; public maintenance: AdminMaintenanceApi; public analytics: AdminAnalyticsApi; + public debug: AdminDebugAPI; constructor(requests: ApiRequestInstance) { this.about = new AdminAboutAPI(requests); @@ -24,6 +26,7 @@ export class AdminAPI { this.backups = new AdminBackupsApi(requests); this.maintenance = new AdminMaintenanceApi(requests); this.analytics = new AdminAnalyticsApi(requests); + this.debug = new AdminDebugAPI(requests); Object.freeze(this); } diff --git a/frontend/lib/api/types/admin.ts b/frontend/lib/api/types/admin.ts index 6f42b40d443..4f02f2d527c 100644 --- a/frontend/lib/api/types/admin.ts +++ b/frontend/lib/api/types/admin.ts @@ -173,6 +173,10 @@ export interface CustomPageOut { categories?: RecipeCategoryResponse[]; id: number; } +export interface DebugResponse { + success: boolean; + response?: string | null; +} export interface EmailReady { ready: boolean; } diff --git a/frontend/pages/admin/debug/openai.vue b/frontend/pages/admin/debug/openai.vue new file mode 100644 index 00000000000..522cea20fc6 --- /dev/null +++ b/frontend/pages/admin/debug/openai.vue @@ -0,0 +1,127 @@ + + + diff --git a/frontend/pages/admin/parser.vue b/frontend/pages/admin/debug/parser.vue similarity index 100% rename from frontend/pages/admin/parser.vue rename to frontend/pages/admin/debug/parser.vue diff --git a/mealie/core/settings/settings.py b/mealie/core/settings/settings.py index 0b33f5a88cb..0e73ee51d76 100644 --- a/mealie/core/settings/settings.py +++ b/mealie/core/settings/settings.py @@ -3,7 +3,7 @@ import secrets from datetime import datetime, timezone from pathlib import Path -from typing import NamedTuple +from typing import Any, NamedTuple from dateutil.tz import tzlocal from pydantic import field_validator @@ -305,6 +305,10 @@ def OIDC_READY(self) -> bool: """Your OpenAI API key. Required to enable OpenAI features""" OPENAI_MODEL: str = "gpt-4o" """Which OpenAI model to send requests to. Leave this unset for most usecases""" + OPENAI_CUSTOM_HEADERS: dict[str, str] = {} + """Custom HTTP headers to send with each OpenAI request""" + OPENAI_CUSTOM_PARAMS: dict[str, Any] = {} + """Custom HTTP parameters to send with each OpenAI request""" OPENAI_ENABLE_IMAGE_SERVICES: bool = True """Whether to enable image-related features in OpenAI""" OPENAI_WORKERS: int = 2 diff --git a/mealie/routes/admin/__init__.py b/mealie/routes/admin/__init__.py index c0a9839e47f..c0ef59a9dcc 100644 --- a/mealie/routes/admin/__init__.py +++ b/mealie/routes/admin/__init__.py @@ -3,6 +3,7 @@ from . import ( admin_about, admin_backups, + admin_debug, admin_email, admin_maintenance, admin_management_groups, @@ -19,3 +20,4 @@ router.include_router(admin_email.router, tags=["Admin: Email"]) router.include_router(admin_backups.router, tags=["Admin: Backups"]) router.include_router(admin_maintenance.router, tags=["Admin: Maintenance"]) +router.include_router(admin_debug.router, tags=["Admin: Debug"]) diff --git a/mealie/routes/admin/admin_debug.py b/mealie/routes/admin/admin_debug.py new file mode 100644 index 00000000000..65bb654904f --- /dev/null +++ b/mealie/routes/admin/admin_debug.py @@ -0,0 +1,52 @@ +import os +import shutil + +from fastapi import APIRouter, File, UploadFile + +from mealie.core.dependencies.dependencies import get_temporary_path +from mealie.routes._base import BaseAdminController, controller +from mealie.schema.admin.debug import DebugResponse +from mealie.services.openai import OpenAILocalImage, OpenAIService + +router = APIRouter(prefix="/debug") + + +@controller(router) +class AdminDebugController(BaseAdminController): + @router.post("/openai", response_model=DebugResponse) + async def debug_openai(self, image: UploadFile | None = File(None)): + if not self.settings.OPENAI_ENABLED: + return DebugResponse(success=False, response="OpenAI is not enabled") + if image and not self.settings.OPENAI_ENABLE_IMAGE_SERVICES: + return DebugResponse( + success=False, response="Image was provided, but OpenAI image services are not enabled" + ) + + with get_temporary_path() as temp_path: + if image: + with temp_path.joinpath(image.filename).open("wb") as buffer: + shutil.copyfileobj(image.file, buffer) + local_image_path = temp_path.joinpath(image.filename) + local_images = [OpenAILocalImage(filename=os.path.basename(local_image_path), path=local_image_path)] + else: + local_images = None + + try: + openai_service = OpenAIService() + prompt = openai_service.get_prompt("debug") + + message = "Hello, checking to see if I can reach you." + if local_images: + message = f"{message} Here is an image to test with:" + + response = await openai_service.get_response( + prompt, message, images=local_images, force_json_response=False + ) + return DebugResponse(success=True, response=f'OpenAI is working. Response: "{response}"') + + except Exception as e: + self.logger.exception(e) + return DebugResponse( + success=False, + response=f'OpenAI request failed. Full error has been logged. {e.__class__.__name__}: "{e}"', + ) diff --git a/mealie/schema/admin/__init__.py b/mealie/schema/admin/__init__.py index 85d33599605..b399d46f8e9 100644 --- a/mealie/schema/admin/__init__.py +++ b/mealie/schema/admin/__init__.py @@ -1,6 +1,7 @@ # This file is auto-generated by gen_schema_exports.py from .about import AdminAboutInfo, AppInfo, AppStartupInfo, AppStatistics, AppTheme, CheckAppConfig, OIDCInfo from .backup import AllBackups, BackupFile, BackupOptions, CreateBackup, ImportJob +from .debug import DebugResponse from .email import EmailReady, EmailSuccess, EmailTest from .maintenance import MaintenanceLogs, MaintenanceStorageDetails, MaintenanceSummary from .migration import ChowdownURL, MigrationFile, MigrationImport, Migrations @@ -49,4 +50,5 @@ "EmailReady", "EmailSuccess", "EmailTest", + "DebugResponse", ] diff --git a/mealie/schema/admin/debug.py b/mealie/schema/admin/debug.py new file mode 100644 index 00000000000..e653a2bb628 --- /dev/null +++ b/mealie/schema/admin/debug.py @@ -0,0 +1,6 @@ +from mealie.schema._mealie import MealieModel + + +class DebugResponse(MealieModel): + success: bool + response: str | None = None diff --git a/mealie/services/openai/openai.py b/mealie/services/openai/openai.py index 64cd4180eb6..09c391d56b8 100644 --- a/mealie/services/openai/openai.py +++ b/mealie/services/openai/openai.py @@ -90,6 +90,8 @@ def __init__(self) -> None: base_url=settings.OPENAI_BASE_URL, api_key=settings.OPENAI_API_KEY, timeout=settings.OPENAI_REQUEST_TIMEOUT, + default_headers=settings.OPENAI_CUSTOM_HEADERS, + default_query=settings.OPENAI_CUSTOM_PARAMS, ) super().__init__() @@ -176,6 +178,5 @@ async def get_response( if not response.choices: return None return response.choices[0].message.content - except Exception: - self.logger.exception("OpenAI Request Failed") - return None + except Exception as e: + raise Exception(f"OpenAI Request Failed. {e.__class__.__name__}: {e}") from e diff --git a/mealie/services/openai/prompts/debug.txt b/mealie/services/openai/prompts/debug.txt new file mode 100644 index 00000000000..c6fb0bdb173 --- /dev/null +++ b/mealie/services/openai/prompts/debug.txt @@ -0,0 +1 @@ +You are a simple chatbot being used for debugging purposes. diff --git a/mealie/services/parser_services/openai/parser.py b/mealie/services/parser_services/openai/parser.py index 77e1c022935..0e01931bef5 100644 --- a/mealie/services/parser_services/openai/parser.py +++ b/mealie/services/parser_services/openai/parser.py @@ -80,10 +80,20 @@ async def _parse(self, ingredients: list[str]) -> OpenAIIngredients: tasks.append(service.get_response(prompt, message, force_json_response=True)) # re-combine chunks into one response - responses_json = await asyncio.gather(*tasks) - responses = [ - OpenAIIngredients.parse_openai_response(response_json) for response_json in responses_json if responses_json - ] + try: + responses_json = await asyncio.gather(*tasks) + except Exception as e: + raise Exception("Failed to call OpenAI services") from e + + try: + responses = [ + OpenAIIngredients.parse_openai_response(response_json) + for response_json in responses_json + if responses_json + ] + except Exception as e: + raise Exception("Failed to parse OpenAI response") from e + if not responses: raise Exception("No response from OpenAI") diff --git a/mealie/services/recipe/recipe_service.py b/mealie/services/recipe/recipe_service.py index d9efbaca87e..b420216c73f 100644 --- a/mealie/services/recipe/recipe_service.py +++ b/mealie/services/recipe/recipe_service.py @@ -487,7 +487,13 @@ async def build_recipe_from_images(self, images: list[Path], translate_language: if translate_language: message += f" Please translate the recipe to {translate_language}." - response = await openai_service.get_response(prompt, message, images=openai_images, force_json_response=True) + try: + response = await openai_service.get_response( + prompt, message, images=openai_images, force_json_response=True + ) + except Exception as e: + raise Exception("Failed to call OpenAI services") from e + try: openai_recipe = OpenAIRecipe.parse_openai_response(response) recipe = self._convert_recipe(openai_recipe) diff --git a/tests/utils/api_routes/__init__.py b/tests/utils/api_routes/__init__.py index 587ca4abef3..dc096b387e7 100644 --- a/tests/utils/api_routes/__init__.py +++ b/tests/utils/api_routes/__init__.py @@ -11,6 +11,8 @@ """`/api/admin/backups`""" admin_backups_upload = "/api/admin/backups/upload" """`/api/admin/backups/upload`""" +admin_debug_openai = "/api/admin/debug/openai" +"""`/api/admin/debug/openai`""" admin_email = "/api/admin/email" """`/api/admin/email`""" admin_groups = "/api/admin/groups" From 32d16e79aa461ca5de0cfa933a50594018069e0f Mon Sep 17 00:00:00 2001 From: Hayden <64056131+hay-kot@users.noreply.github.com> Date: Mon, 23 Sep 2024 05:31:17 -0500 Subject: [PATCH 081/102] chore(l10n): New Crowdin updates (#4256) --- frontend/lang/messages/af-ZA.json | 7 ++++++- frontend/lang/messages/ar-SA.json | 7 ++++++- frontend/lang/messages/bg-BG.json | 7 ++++++- frontend/lang/messages/ca-ES.json | 7 ++++++- frontend/lang/messages/cs-CZ.json | 7 ++++++- frontend/lang/messages/da-DK.json | 7 ++++++- frontend/lang/messages/de-DE.json | 7 ++++++- frontend/lang/messages/el-GR.json | 7 ++++++- frontend/lang/messages/en-GB.json | 7 ++++++- frontend/lang/messages/es-ES.json | 7 ++++++- frontend/lang/messages/fi-FI.json | 7 ++++++- frontend/lang/messages/fr-BE.json | 19 ++++++++++++------- frontend/lang/messages/fr-CA.json | 19 ++++++++++++------- frontend/lang/messages/fr-FR.json | 7 ++++++- frontend/lang/messages/gl-ES.json | 7 ++++++- frontend/lang/messages/he-IL.json | 7 ++++++- frontend/lang/messages/hr-HR.json | 7 ++++++- frontend/lang/messages/hu-HU.json | 7 ++++++- frontend/lang/messages/is-IS.json | 7 ++++++- frontend/lang/messages/it-IT.json | 7 ++++++- frontend/lang/messages/ja-JP.json | 7 ++++++- frontend/lang/messages/ko-KR.json | 7 ++++++- frontend/lang/messages/lt-LT.json | 7 ++++++- frontend/lang/messages/lv-LV.json | 7 ++++++- frontend/lang/messages/nl-NL.json | 7 ++++++- frontend/lang/messages/no-NO.json | 7 ++++++- frontend/lang/messages/pl-PL.json | 7 ++++++- frontend/lang/messages/pt-BR.json | 7 ++++++- frontend/lang/messages/pt-PT.json | 7 ++++++- frontend/lang/messages/ro-RO.json | 7 ++++++- frontend/lang/messages/ru-RU.json | 7 ++++++- frontend/lang/messages/sk-SK.json | 7 ++++++- frontend/lang/messages/sl-SI.json | 7 ++++++- frontend/lang/messages/sr-SP.json | 7 ++++++- frontend/lang/messages/sv-SE.json | 7 ++++++- frontend/lang/messages/tr-TR.json | 7 ++++++- frontend/lang/messages/uk-UA.json | 7 ++++++- frontend/lang/messages/vi-VN.json | 7 ++++++- frontend/lang/messages/zh-CN.json | 7 ++++++- frontend/lang/messages/zh-TW.json | 7 ++++++- 40 files changed, 252 insertions(+), 52 deletions(-) diff --git a/frontend/lang/messages/af-ZA.json b/frontend/lang/messages/af-ZA.json index 9fe7e648aab..ca048e2377a 100644 --- a/frontend/lang/messages/af-ZA.json +++ b/frontend/lang/messages/af-ZA.json @@ -652,6 +652,7 @@ "or": "Of", "has-any": "Het een van", "has-all": "Bevat alles", + "clear-selection": "Clear Selection", "results": "Resultate", "search": "Soek", "search-mealie": "Soek in Mealie (druk /)", @@ -1245,7 +1246,11 @@ "here-are-a-few-things-to-help-you-get-started": "Here are a few things to help you get started with Mealie", "restore-from-v1-backup": "Have a backup from a previous instance of Mealie v1? You can restore it here.", "manage-profile-or-get-invite-link": "Manage your own profile, or grab an invite link to share with others." - } + }, + "debug-openai-services": "Debug OpenAI Services", + "debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", + "run-test": "Run Test", + "test-results": "Test Results" }, "profile": { "welcome-user": "👋 Welcome, {0}!", diff --git a/frontend/lang/messages/ar-SA.json b/frontend/lang/messages/ar-SA.json index 7ce0f32e213..9767d807d40 100644 --- a/frontend/lang/messages/ar-SA.json +++ b/frontend/lang/messages/ar-SA.json @@ -652,6 +652,7 @@ "or": "Or", "has-any": "Has Any", "has-all": "Has All", + "clear-selection": "Clear Selection", "results": "Results", "search": "Search", "search-mealie": "Search Mealie (press /)", @@ -1245,7 +1246,11 @@ "here-are-a-few-things-to-help-you-get-started": "Here are a few things to help you get started with Mealie", "restore-from-v1-backup": "Have a backup from a previous instance of Mealie v1? You can restore it here.", "manage-profile-or-get-invite-link": "Manage your own profile, or grab an invite link to share with others." - } + }, + "debug-openai-services": "Debug OpenAI Services", + "debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", + "run-test": "Run Test", + "test-results": "Test Results" }, "profile": { "welcome-user": "👋 Welcome, {0}!", diff --git a/frontend/lang/messages/bg-BG.json b/frontend/lang/messages/bg-BG.json index bd063274a78..9e333fbd1ac 100644 --- a/frontend/lang/messages/bg-BG.json +++ b/frontend/lang/messages/bg-BG.json @@ -652,6 +652,7 @@ "or": "Или", "has-any": "Има някое", "has-all": "Има всички", + "clear-selection": "Clear Selection", "results": "Резултати", "search": "Търсене", "search-mealie": "Търсене в Mealie (Натисни /)", @@ -1245,7 +1246,11 @@ "here-are-a-few-things-to-help-you-get-started": "Ето няколко неща, които ще Ви помогнат да започнете с Mealie", "restore-from-v1-backup": "Имате резервно копие от предишна инстанция на Mealie v1? Можете да го възстановите тук.", "manage-profile-or-get-invite-link": "Управлявайте собствения си профил или вземете връзка за покана, която да споделите с други." - } + }, + "debug-openai-services": "Debug OpenAI Services", + "debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", + "run-test": "Run Test", + "test-results": "Test Results" }, "profile": { "welcome-user": "👋 Добре дошъл(а), {0}!", diff --git a/frontend/lang/messages/ca-ES.json b/frontend/lang/messages/ca-ES.json index 4a763230e03..ef2e38cbda5 100644 --- a/frontend/lang/messages/ca-ES.json +++ b/frontend/lang/messages/ca-ES.json @@ -652,6 +652,7 @@ "or": "O", "has-any": "Conté qualsevol", "has-all": "Ho conté tot", + "clear-selection": "Clear Selection", "results": "Resultats", "search": "Cerca", "search-mealie": "Cerca a Melie (prem /)", @@ -1245,7 +1246,11 @@ "here-are-a-few-things-to-help-you-get-started": "Aquí hi ha unes quantes coses per ajudar-te a posar Mealie en marxa", "restore-from-v1-backup": "Tens una còpia de seguretat d'una instància prèvia de Mealie v1? Pots restaurar-la aquí.", "manage-profile-or-get-invite-link": "Gestiona el teu propi perfil, o agafa un enllaç d'invitació per compartir amb altres." - } + }, + "debug-openai-services": "Debug OpenAI Services", + "debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", + "run-test": "Run Test", + "test-results": "Test Results" }, "profile": { "welcome-user": "👋 Benvingut/Benvinguda, {0}!", diff --git a/frontend/lang/messages/cs-CZ.json b/frontend/lang/messages/cs-CZ.json index 426daabaccb..dcbb74bfeba 100644 --- a/frontend/lang/messages/cs-CZ.json +++ b/frontend/lang/messages/cs-CZ.json @@ -652,6 +652,7 @@ "or": "Nebo", "has-any": "Má nějaké", "has-all": "Má všechny", + "clear-selection": "Clear Selection", "results": "Výsledky", "search": "Hledat", "search-mealie": "Hledat v Mealie (stiskněte /)", @@ -1245,7 +1246,11 @@ "here-are-a-few-things-to-help-you-get-started": "Here are a few things to help you get started with Mealie", "restore-from-v1-backup": "Have a backup from a previous instance of Mealie v1? You can restore it here.", "manage-profile-or-get-invite-link": "Manage your own profile, or grab an invite link to share with others." - } + }, + "debug-openai-services": "Debug OpenAI Services", + "debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", + "run-test": "Run Test", + "test-results": "Test Results" }, "profile": { "welcome-user": "👋 Welcome, {0}!", diff --git a/frontend/lang/messages/da-DK.json b/frontend/lang/messages/da-DK.json index 5cb397532c9..e1ca629c1ff 100644 --- a/frontend/lang/messages/da-DK.json +++ b/frontend/lang/messages/da-DK.json @@ -652,6 +652,7 @@ "or": "Eller", "has-any": "Har Nogen", "has-all": "Har Alle", + "clear-selection": "Clear Selection", "results": "Resultater", "search": "Søg", "search-mealie": "Søg Mealie (tryk /)", @@ -1245,7 +1246,11 @@ "here-are-a-few-things-to-help-you-get-started": "Her er et par ting, der kan hjælpe dig i gang med Mealie", "restore-from-v1-backup": "Har du en sikkerhedskopi fra en tidligere udgave af Mealie v1? Du kan gendanne den her.", "manage-profile-or-get-invite-link": "Administrer din egen profil, eller tag et invitationslink til at dele med andre." - } + }, + "debug-openai-services": "Debug OpenAI Services", + "debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", + "run-test": "Run Test", + "test-results": "Test Results" }, "profile": { "welcome-user": "👋 Velkommen, {0}!", diff --git a/frontend/lang/messages/de-DE.json b/frontend/lang/messages/de-DE.json index f010b5dcd7c..752a14b9312 100644 --- a/frontend/lang/messages/de-DE.json +++ b/frontend/lang/messages/de-DE.json @@ -652,6 +652,7 @@ "or": "Oder", "has-any": "Irgendeines enthalten", "has-all": "Alle enthalten", + "clear-selection": "Clear Selection", "results": "Ergebnisse", "search": "Suchen", "search-mealie": "Mealie durchsuchen (/ drücken)", @@ -1245,7 +1246,11 @@ "here-are-a-few-things-to-help-you-get-started": "Hier sind einige Funktionen, die dich beim Start mit Mealie unterstützen", "restore-from-v1-backup": "Hast du ein Backup von einer früheren v1 Instanz von Mealie? Hier kannst du es wiederherstellen.", "manage-profile-or-get-invite-link": "Verwalte dein eigenes Profil oder erstelle einen Einladungslink, den du an andere weitergeben kannst." - } + }, + "debug-openai-services": "Debug OpenAI Services", + "debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", + "run-test": "Run Test", + "test-results": "Test Results" }, "profile": { "welcome-user": "👋 Willkommen, {0}!", diff --git a/frontend/lang/messages/el-GR.json b/frontend/lang/messages/el-GR.json index d9a8461c5c0..fe95db2a2e8 100644 --- a/frontend/lang/messages/el-GR.json +++ b/frontend/lang/messages/el-GR.json @@ -652,6 +652,7 @@ "or": "Ή", "has-any": "Περιέχει", "has-all": "Περιέχει τα πάντα", + "clear-selection": "Απαλοιφή επιλογής", "results": "Αποτελέσματα", "search": "Αναζήτηση", "search-mealie": "Αναζήτηση στο Mealie (πατήστε /)", @@ -1245,7 +1246,11 @@ "here-are-a-few-things-to-help-you-get-started": "Εδώ είναι μερικά πράγματα που θα σας βοηθήσουν να ξεκινήσετε με το Mealie", "restore-from-v1-backup": "Εχετε ένα αντίγραφο ασφαλείας από μια προηγούμενη υπόσταση του Mealie v1; Μπορείτε να το επαναφέρετε εδώ.", "manage-profile-or-get-invite-link": "Διαχειριστείτε το δικό σας προφίλ, ή λάβετε έναν σύνδεσμο πρόσκλησης για να μοιραστείτε με άλλους." - } + }, + "debug-openai-services": "Debug OpenAI Services", + "debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", + "run-test": "Run Test", + "test-results": "Test Results" }, "profile": { "welcome-user": "👋 Καλώς ορίσατε, {0}!", diff --git a/frontend/lang/messages/en-GB.json b/frontend/lang/messages/en-GB.json index abfa465404b..0b38e746e06 100644 --- a/frontend/lang/messages/en-GB.json +++ b/frontend/lang/messages/en-GB.json @@ -652,6 +652,7 @@ "or": "Or", "has-any": "Has Any", "has-all": "Has All", + "clear-selection": "Clear Selection", "results": "Results", "search": "Search", "search-mealie": "Search Mealie (press /)", @@ -1245,7 +1246,11 @@ "here-are-a-few-things-to-help-you-get-started": "Here are a few things to help you get started with Mealie", "restore-from-v1-backup": "Have a backup from a previous instance of Mealie v1? You can restore it here.", "manage-profile-or-get-invite-link": "Manage your own profile, or grab an invite link to share with others." - } + }, + "debug-openai-services": "Debug OpenAI Services", + "debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", + "run-test": "Run Test", + "test-results": "Test Results" }, "profile": { "welcome-user": "👋 Welcome, {0}!", diff --git a/frontend/lang/messages/es-ES.json b/frontend/lang/messages/es-ES.json index fbe6c630c15..93bfc1f6bf0 100644 --- a/frontend/lang/messages/es-ES.json +++ b/frontend/lang/messages/es-ES.json @@ -652,6 +652,7 @@ "or": "O", "has-any": "Tiene alguna", "has-all": "Tiene todo", + "clear-selection": "Clear Selection", "results": "Resultados", "search": "Buscar", "search-mealie": "Buscar Mealie (presione /)", @@ -1245,7 +1246,11 @@ "here-are-a-few-things-to-help-you-get-started": "Aquí hay algunas cosas para ayudarte a empezar con Mealie", "restore-from-v1-backup": "¿Tienes una copia de seguridad de Mealie v1? Puedes restaurarla aquí.", "manage-profile-or-get-invite-link": "Gestiona tu perfil, o usa un enlace de invitación para compartir con otros." - } + }, + "debug-openai-services": "Debug OpenAI Services", + "debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", + "run-test": "Run Test", + "test-results": "Test Results" }, "profile": { "welcome-user": "👋 ¡Bienvenido, {0}!", diff --git a/frontend/lang/messages/fi-FI.json b/frontend/lang/messages/fi-FI.json index 18a0a321319..65b17904775 100644 --- a/frontend/lang/messages/fi-FI.json +++ b/frontend/lang/messages/fi-FI.json @@ -652,6 +652,7 @@ "or": "Tai", "has-any": "On Mikä Tahansa", "has-all": "On Kaikki", + "clear-selection": "Clear Selection", "results": "Tulokset", "search": "Hae", "search-mealie": "Hae Mealiestä (paina /)", @@ -1245,7 +1246,11 @@ "here-are-a-few-things-to-help-you-get-started": "Näillä muutamilla asioilla pääset alkuun", "restore-from-v1-backup": "Onko sinulla varmuuskopio aiemmasta Mealie v1 -instanssista? Palauta se tästä.", "manage-profile-or-get-invite-link": "Hallitse profiiliasi tai hanki kutsulinkki muille." - } + }, + "debug-openai-services": "Debug OpenAI Services", + "debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", + "run-test": "Run Test", + "test-results": "Test Results" }, "profile": { "welcome-user": "👋 Tervetuloa, {0}!", diff --git a/frontend/lang/messages/fr-BE.json b/frontend/lang/messages/fr-BE.json index 106b0e67e48..f7aa5878771 100644 --- a/frontend/lang/messages/fr-BE.json +++ b/frontend/lang/messages/fr-BE.json @@ -241,14 +241,14 @@ "manage-members": "Gestion des membres", "manage-members-description": "Gérez les permissions des membres de votre foyer. {manage} donne l’accès à la page de gestion des données à l’utilisateur, et {invite} lui permet de générer des liens d’invitation pour d’autres utilisateurs. Les propriétaires de groupe ne peuvent pas changer leurs propres permissions.", "manage": "Gérer", - "manage-household": "Manage Household", + "manage-household": "Gérer le foyer", "invite": "Inviter", "looking-to-update-your-profile": "Vous cherchez à mettre à jour votre profil ?", "default-recipe-preferences-description": "Ce sont les paramètres par défaut lorsqu'une nouvelle recette est créée dans votre groupe. Elles peuvent être modifiées individuellement dans le menu de configuration des recettes.", "default-recipe-preferences": "Préférences de recette par défaut", "group-preferences": "Préférences du groupe", "private-group": "Groupe privé", - "private-group-description": "Setting your group to private will disable all public view options. This overrides any individual public view settings", + "private-group-description": "Rendre votre groupe privé va désactiver toutes les options de vue publique. Cela écrase les paramètres de vue publique", "enable-public-access": "Activer l’accès public", "enable-public-access-description": "Les recettes de groupes deviennent publiques par défaut, cela permet aux visiteurs de les voir sans s’identifier", "allow-users-outside-of-your-group-to-see-your-recipes": "Autoriser les utilisateurs en dehors de votre groupe à voir vos recettes", @@ -286,9 +286,9 @@ "admin-household-management-text": "Les changements apportés à ce foyer seront immédiatement pris en compte.", "household-id-value": "Identifiant du foyer : {0}", "private-household": "Foyer privé", - "private-household-description": "Setting your household to private will disable all public view options. This overrides any individual public view settings", - "lock-recipe-edits-from-other-households": "Lock recipe edits from other households", - "lock-recipe-edits-from-other-households-description": "When enabled only users in your household can edit recipes created by your household", + "private-household-description": "Rendre votre foyer privé va désactiver toutes les options de vue publique. Cela écrase les paramètres de vue publique", + "lock-recipe-edits-from-other-households": "Verrouiller les éditions de recettes de la part des autres foyers", + "lock-recipe-edits-from-other-households-description": "Si activé, seuls les utilisateurs de votre foyer peuvent modifier les recettes créé par votre foyer", "household-recipe-preferences": "Préférences de recette du foyer", "default-recipe-preferences-description": "Ce sont les paramètres par défaut utilisés pour la création d’une nouvelle recette dans votre foyer. Ils peuvent être modifiés individuellement dans le menu de configuration des recettes.", "allow-users-outside-of-your-household-to-see-your-recipes": "Autoriser les utilisateurs en dehors de votre foyer à voir vos recettes", @@ -652,6 +652,7 @@ "or": "Ou", "has-any": "Requiert au moins", "has-all": "Requiert tout", + "clear-selection": "Effacer la sélection", "results": "Résultats", "search": "Rechercher", "search-mealie": "Rechercher dans Mealie (appuyez sur /)", @@ -990,7 +991,7 @@ "administrator": "Administrateur", "user-can-invite-other-to-group": "L’utilisateur peut inviter d’autres personnes dans le groupe", "user-can-manage-group": "L'utilisateur peut gérer le groupe", - "user-can-manage-household": "User can manage household", + "user-can-manage-household": "L’utilisateur peut gérer le foyer", "user-can-organize-group-data": "L'utilisateur peut organiser des données de groupe", "enable-advanced-features": "Activer les fonctions avancées", "it-looks-like-this-is-your-first-time-logging-in": "Il semble que ce soit votre première connexion.", @@ -1245,7 +1246,11 @@ "here-are-a-few-things-to-help-you-get-started": "Voici quelques trucs pour vous aider à commencer avec Mealie", "restore-from-v1-backup": "Vous avez une sauvegarde d’une précédente instance de Mealie v1 ? Vous pouvez la restaurer ici.", "manage-profile-or-get-invite-link": "Gérez votre propre profil, ou récupérez un lien d’invitation à partager avec d’autres." - } + }, + "debug-openai-services": "Debug OpenAI Services", + "debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", + "run-test": "Run Test", + "test-results": "Test Results" }, "profile": { "welcome-user": "👋 Bienvenue, {0} !", diff --git a/frontend/lang/messages/fr-CA.json b/frontend/lang/messages/fr-CA.json index 53b10e6988b..c4ac016a152 100644 --- a/frontend/lang/messages/fr-CA.json +++ b/frontend/lang/messages/fr-CA.json @@ -241,14 +241,14 @@ "manage-members": "Gestion des membres", "manage-members-description": "Gérer les permissions des membres de votre foyer. {manage} permet à l'utilisateur d'accéder à la page de gestion des données, et {invite} permet à l'utilisateur de générer des liens d'invitation pour d'autres utilisateurs. Les propriétaires du groupe ne peuvent pas modifier leurs propres permissions.", "manage": "Gérer", - "manage-household": "Manage Household", + "manage-household": "Gérer le foyer", "invite": "Inviter", "looking-to-update-your-profile": "Vous cherchez à mettre à jour votre profil ?", "default-recipe-preferences-description": "Ce sont les paramètres par défaut lorsqu'une nouvelle recette est créée dans votre groupe. Elles peuvent être modifiées individuellement dans le menu de configuration des recettes.", "default-recipe-preferences": "Préférences de recette par défaut", "group-preferences": "Préférences du groupe", "private-group": "Groupe privé", - "private-group-description": "Setting your group to private will disable all public view options. This overrides any individual public view settings", + "private-group-description": "Rendre votre groupe privé va désactiver toutes les options de vue publique. Cela écrase les paramètres de vue publique", "enable-public-access": "Permettre l'accès public", "enable-public-access-description": "Les recettes de groupes deviennent publiques par défaut, cela permet aux visiteurs de les voir sans s’identifier", "allow-users-outside-of-your-group-to-see-your-recipes": "Autoriser les utilisateurs en dehors de votre groupe à voir vos recettes", @@ -286,9 +286,9 @@ "admin-household-management-text": "Les changements apportés à ce foyer seront appliqués immédiatement.", "household-id-value": "Identifiant du foyer : {0}", "private-household": "Foyer privé", - "private-household-description": "Setting your household to private will disable all public view options. This overrides any individual public view settings", - "lock-recipe-edits-from-other-households": "Lock recipe edits from other households", - "lock-recipe-edits-from-other-households-description": "When enabled only users in your household can edit recipes created by your household", + "private-household-description": "Rendre votre foyer privé va désactiver toutes les options de vue publique. Cela écrase les paramètres de vue publique", + "lock-recipe-edits-from-other-households": "Verrouiller les éditions de recettes de la part des autres foyers", + "lock-recipe-edits-from-other-households-description": "Si activé, seuls les utilisateurs de votre foyer peuvent modifier les recettes créé par votre foyer", "household-recipe-preferences": "Préférences de recette du foyer", "default-recipe-preferences-description": "Ce sont les paramètres par défaut utilisés pour la création d’une nouvelle recette dans votre foyer. Ils peuvent être modifiés individuellement dans le menu de configuration des recettes.", "allow-users-outside-of-your-household-to-see-your-recipes": "Autoriser les utilisateurs en dehors de votre foyer à voir vos recettes", @@ -652,6 +652,7 @@ "or": "Ou", "has-any": "A n'importe quel", "has-all": "A tout", + "clear-selection": "Effacer la sélection", "results": "Résultats", "search": "Rechercher", "search-mealie": "Rechercher dans Mealie (appuyez sur /)", @@ -990,7 +991,7 @@ "administrator": "Administrateur", "user-can-invite-other-to-group": "L’utilisateur peut inviter d’autres personnes dans le groupe", "user-can-manage-group": "L'utilisateur peut gérer le groupe", - "user-can-manage-household": "User can manage household", + "user-can-manage-household": "L’utilisateur peut gérer le foyer", "user-can-organize-group-data": "L'utilisateur peut organiser des données de groupe", "enable-advanced-features": "Activer les fonctions avancées", "it-looks-like-this-is-your-first-time-logging-in": "Il semble que ce soit votre première connexion.", @@ -1245,7 +1246,11 @@ "here-are-a-few-things-to-help-you-get-started": "Voici quelques trucs pour vous aider à commencer avec Mealie", "restore-from-v1-backup": "Vous avez une sauvegarde d’une précédente instance de Mealie v1 ? Vous pouvez la restaurer ici.", "manage-profile-or-get-invite-link": "Gérez votre propre profil, ou récupérez un lien d’invitation à partager avec d’autres." - } + }, + "debug-openai-services": "Debug OpenAI Services", + "debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", + "run-test": "Run Test", + "test-results": "Test Results" }, "profile": { "welcome-user": "👋 Bienvenue, {0}!", diff --git a/frontend/lang/messages/fr-FR.json b/frontend/lang/messages/fr-FR.json index e0498b0b94d..f7aa5878771 100644 --- a/frontend/lang/messages/fr-FR.json +++ b/frontend/lang/messages/fr-FR.json @@ -652,6 +652,7 @@ "or": "Ou", "has-any": "Requiert au moins", "has-all": "Requiert tout", + "clear-selection": "Effacer la sélection", "results": "Résultats", "search": "Rechercher", "search-mealie": "Rechercher dans Mealie (appuyez sur /)", @@ -1245,7 +1246,11 @@ "here-are-a-few-things-to-help-you-get-started": "Voici quelques trucs pour vous aider à commencer avec Mealie", "restore-from-v1-backup": "Vous avez une sauvegarde d’une précédente instance de Mealie v1 ? Vous pouvez la restaurer ici.", "manage-profile-or-get-invite-link": "Gérez votre propre profil, ou récupérez un lien d’invitation à partager avec d’autres." - } + }, + "debug-openai-services": "Debug OpenAI Services", + "debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", + "run-test": "Run Test", + "test-results": "Test Results" }, "profile": { "welcome-user": "👋 Bienvenue, {0} !", diff --git a/frontend/lang/messages/gl-ES.json b/frontend/lang/messages/gl-ES.json index 2ded2419508..fc37d526840 100644 --- a/frontend/lang/messages/gl-ES.json +++ b/frontend/lang/messages/gl-ES.json @@ -652,6 +652,7 @@ "or": "Or", "has-any": "Has Any", "has-all": "Has All", + "clear-selection": "Clear Selection", "results": "Results", "search": "Search", "search-mealie": "Search Mealie (press /)", @@ -1245,7 +1246,11 @@ "here-are-a-few-things-to-help-you-get-started": "Here are a few things to help you get started with Mealie", "restore-from-v1-backup": "Have a backup from a previous instance of Mealie v1? You can restore it here.", "manage-profile-or-get-invite-link": "Manage your own profile, or grab an invite link to share with others." - } + }, + "debug-openai-services": "Debug OpenAI Services", + "debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", + "run-test": "Run Test", + "test-results": "Test Results" }, "profile": { "welcome-user": "👋 Welcome, {0}!", diff --git a/frontend/lang/messages/he-IL.json b/frontend/lang/messages/he-IL.json index 45cac7c67f6..683fd8e8c5d 100644 --- a/frontend/lang/messages/he-IL.json +++ b/frontend/lang/messages/he-IL.json @@ -652,6 +652,7 @@ "or": "או", "has-any": "מכיל חלק", "has-all": "מכיל הכול", + "clear-selection": "Clear Selection", "results": "תוצאות", "search": "חיפוש", "search-mealie": "חיפוש במילי (לחץ /)", @@ -1245,7 +1246,11 @@ "here-are-a-few-things-to-help-you-get-started": "Here are a few things to help you get started with Mealie", "restore-from-v1-backup": "Have a backup from a previous instance of Mealie v1? You can restore it here.", "manage-profile-or-get-invite-link": "Manage your own profile, or grab an invite link to share with others." - } + }, + "debug-openai-services": "Debug OpenAI Services", + "debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", + "run-test": "Run Test", + "test-results": "Test Results" }, "profile": { "welcome-user": "👋 Welcome, {0}!", diff --git a/frontend/lang/messages/hr-HR.json b/frontend/lang/messages/hr-HR.json index 4780bbc8bd7..d9866a2b11a 100644 --- a/frontend/lang/messages/hr-HR.json +++ b/frontend/lang/messages/hr-HR.json @@ -652,6 +652,7 @@ "or": "Ili", "has-any": "Sadrži dio", "has-all": "Sadrži sve", + "clear-selection": "Clear Selection", "results": "Rezultati", "search": "Traži", "search-mealie": "Pretraži Mealie (pritisnite /)", @@ -1245,7 +1246,11 @@ "here-are-a-few-things-to-help-you-get-started": "Here are a few things to help you get started with Mealie", "restore-from-v1-backup": "Have a backup from a previous instance of Mealie v1? You can restore it here.", "manage-profile-or-get-invite-link": "Manage your own profile, or grab an invite link to share with others." - } + }, + "debug-openai-services": "Debug OpenAI Services", + "debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", + "run-test": "Run Test", + "test-results": "Test Results" }, "profile": { "welcome-user": "👋 Welcome, {0}!", diff --git a/frontend/lang/messages/hu-HU.json b/frontend/lang/messages/hu-HU.json index 01e60cabe98..72ca172c3e9 100644 --- a/frontend/lang/messages/hu-HU.json +++ b/frontend/lang/messages/hu-HU.json @@ -652,6 +652,7 @@ "or": "Vagy", "has-any": "Bármely", "has-all": "Mind", + "clear-selection": "Clear Selection", "results": "Találatok", "search": "Keresés", "search-mealie": "Keresés a Mealie-ben (/ gombbal)", @@ -1245,7 +1246,11 @@ "here-are-a-few-things-to-help-you-get-started": "Itt van egy pár dolog ami segíthet a kezdésben a Mealie-vel", "restore-from-v1-backup": "Van egy korábbi Mealie v1 biztonsági másolatod? Itt visszaállíthatod.", "manage-profile-or-get-invite-link": "Alakítsa a profilját vagy szerezze meg a meghívó link-jét hogy megoszthassa másokkal." - } + }, + "debug-openai-services": "Debug OpenAI Services", + "debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", + "run-test": "Run Test", + "test-results": "Test Results" }, "profile": { "welcome-user": "👋 Üdvözöljük, {0}!", diff --git a/frontend/lang/messages/is-IS.json b/frontend/lang/messages/is-IS.json index 382aa53aca0..72ec75defa9 100644 --- a/frontend/lang/messages/is-IS.json +++ b/frontend/lang/messages/is-IS.json @@ -652,6 +652,7 @@ "or": "Or", "has-any": "Has Any", "has-all": "Has All", + "clear-selection": "Clear Selection", "results": "Results", "search": "Search", "search-mealie": "Search Mealie (press /)", @@ -1245,7 +1246,11 @@ "here-are-a-few-things-to-help-you-get-started": "Here are a few things to help you get started with Mealie", "restore-from-v1-backup": "Have a backup from a previous instance of Mealie v1? You can restore it here.", "manage-profile-or-get-invite-link": "Manage your own profile, or grab an invite link to share with others." - } + }, + "debug-openai-services": "Debug OpenAI Services", + "debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", + "run-test": "Run Test", + "test-results": "Test Results" }, "profile": { "welcome-user": "👋 Welcome, {0}!", diff --git a/frontend/lang/messages/it-IT.json b/frontend/lang/messages/it-IT.json index d02f4af5407..9f4130a5a79 100644 --- a/frontend/lang/messages/it-IT.json +++ b/frontend/lang/messages/it-IT.json @@ -652,6 +652,7 @@ "or": "O", "has-any": "Una Delle Scelte", "has-all": "Tutte Le Scelte", + "clear-selection": "Clear Selection", "results": "Risultati", "search": "Cerca", "search-mealie": "Cerca Mealie (premi /)", @@ -1245,7 +1246,11 @@ "here-are-a-few-things-to-help-you-get-started": "Qui ci sono alcune cose per aiutarvi a iniziare con Mealie", "restore-from-v1-backup": "Hai un backup da un'istanza precedente di Mealie v1? Puoi ripristinarlo qui.", "manage-profile-or-get-invite-link": "Gestisci il tuo profilo, o parti da un link di invito per condividere con gli altri." - } + }, + "debug-openai-services": "Debug OpenAI Services", + "debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", + "run-test": "Run Test", + "test-results": "Test Results" }, "profile": { "welcome-user": "👋 Benvenutǝ, {0}!", diff --git a/frontend/lang/messages/ja-JP.json b/frontend/lang/messages/ja-JP.json index 2c33d1aa3ef..6a943eea0eb 100644 --- a/frontend/lang/messages/ja-JP.json +++ b/frontend/lang/messages/ja-JP.json @@ -652,6 +652,7 @@ "or": "または", "has-any": "いずれかの", "has-all": "すべての", + "clear-selection": "Clear Selection", "results": "検索結果", "search": "検索", "search-mealie": "Mealieを検索 (/キーを押す)", @@ -1245,7 +1246,11 @@ "here-are-a-few-things-to-help-you-get-started": "Mealieを始めるのに役立つことがいくつかあります", "restore-from-v1-backup": "Mealie v1以前のインスタンスからのバックアップはありますか?ここで復元できます。", "manage-profile-or-get-invite-link": "自分のプロフィールを管理するか、招待リンクを取得して他の人と共有します。" - } + }, + "debug-openai-services": "Debug OpenAI Services", + "debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", + "run-test": "Run Test", + "test-results": "Test Results" }, "profile": { "welcome-user": "👋 ようこそ, {0}!", diff --git a/frontend/lang/messages/ko-KR.json b/frontend/lang/messages/ko-KR.json index eabbf2cc7f8..43efd844165 100644 --- a/frontend/lang/messages/ko-KR.json +++ b/frontend/lang/messages/ko-KR.json @@ -652,6 +652,7 @@ "or": "Or", "has-any": "Has Any", "has-all": "Has All", + "clear-selection": "Clear Selection", "results": "Results", "search": "검색", "search-mealie": "Search Mealie (press /)", @@ -1245,7 +1246,11 @@ "here-are-a-few-things-to-help-you-get-started": "Here are a few things to help you get started with Mealie", "restore-from-v1-backup": "Have a backup from a previous instance of Mealie v1? You can restore it here.", "manage-profile-or-get-invite-link": "Manage your own profile, or grab an invite link to share with others." - } + }, + "debug-openai-services": "Debug OpenAI Services", + "debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", + "run-test": "Run Test", + "test-results": "Test Results" }, "profile": { "welcome-user": "👋 Welcome, {0}!", diff --git a/frontend/lang/messages/lt-LT.json b/frontend/lang/messages/lt-LT.json index 6db99f5e48a..b61940adce5 100644 --- a/frontend/lang/messages/lt-LT.json +++ b/frontend/lang/messages/lt-LT.json @@ -652,6 +652,7 @@ "or": "Arba", "has-any": "Bet kuris", "has-all": "Visi", + "clear-selection": "Clear Selection", "results": "Rezultatai", "search": "Ieškoti", "search-mealie": "Pradėti ieškoti \"Mealie\" (spauskite /)", @@ -1245,7 +1246,11 @@ "here-are-a-few-things-to-help-you-get-started": "Here are a few things to help you get started with Mealie", "restore-from-v1-backup": "Have a backup from a previous instance of Mealie v1? You can restore it here.", "manage-profile-or-get-invite-link": "Manage your own profile, or grab an invite link to share with others." - } + }, + "debug-openai-services": "Debug OpenAI Services", + "debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", + "run-test": "Run Test", + "test-results": "Test Results" }, "profile": { "welcome-user": "👋 Welcome, {0}!", diff --git a/frontend/lang/messages/lv-LV.json b/frontend/lang/messages/lv-LV.json index ffdfd75d07a..5976ca8f866 100644 --- a/frontend/lang/messages/lv-LV.json +++ b/frontend/lang/messages/lv-LV.json @@ -652,6 +652,7 @@ "or": "Or", "has-any": "Has Any", "has-all": "Has All", + "clear-selection": "Clear Selection", "results": "Results", "search": "Search", "search-mealie": "Search Mealie (press /)", @@ -1245,7 +1246,11 @@ "here-are-a-few-things-to-help-you-get-started": "Here are a few things to help you get started with Mealie", "restore-from-v1-backup": "Have a backup from a previous instance of Mealie v1? You can restore it here.", "manage-profile-or-get-invite-link": "Manage your own profile, or grab an invite link to share with others." - } + }, + "debug-openai-services": "Debug OpenAI Services", + "debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", + "run-test": "Run Test", + "test-results": "Test Results" }, "profile": { "welcome-user": "👋 Welcome, {0}!", diff --git a/frontend/lang/messages/nl-NL.json b/frontend/lang/messages/nl-NL.json index 274f8bdc8b5..da9174975bd 100644 --- a/frontend/lang/messages/nl-NL.json +++ b/frontend/lang/messages/nl-NL.json @@ -652,6 +652,7 @@ "or": "Of", "has-any": "Heeft een van", "has-all": "Bevat alles", + "clear-selection": "Selectie wissen", "results": "Resultaten", "search": "Zoek", "search-mealie": "Zoek in Mealie (druk /)", @@ -1245,7 +1246,11 @@ "here-are-a-few-things-to-help-you-get-started": "Hier zijn een aantal dingen om je op weg te helpen met Mealie", "restore-from-v1-backup": "Heb je een back-up van een vorig exemplaar van Mealie v1? Deze kan je hier terugzetten.", "manage-profile-or-get-invite-link": "Beheer je eigen profiel, of gebruik een uitnodigingslink om te delen met anderen." - } + }, + "debug-openai-services": "Debug OpenAI Services", + "debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", + "run-test": "Run Test", + "test-results": "Test Results" }, "profile": { "welcome-user": "👋 Welkom, {0}!", diff --git a/frontend/lang/messages/no-NO.json b/frontend/lang/messages/no-NO.json index 7c28c842cb5..f98775fa6d1 100644 --- a/frontend/lang/messages/no-NO.json +++ b/frontend/lang/messages/no-NO.json @@ -652,6 +652,7 @@ "or": "Eller", "has-any": "Har enhver", "has-all": "Har alle", + "clear-selection": "Clear Selection", "results": "Resultater", "search": "Søk", "search-mealie": "Søk i Mealie (trykk /)", @@ -1245,7 +1246,11 @@ "here-are-a-few-things-to-help-you-get-started": "Her er noen ting som kan hjelpe deg å komme i gang med Mealie", "restore-from-v1-backup": "Har du en sikkerhetskopi fra en tidligere forekomst av Mealie v1? Du kan gjenopprette den her.", "manage-profile-or-get-invite-link": "Administrer din egen profil, eller hent en invitasjonslenke for å dele med andre." - } + }, + "debug-openai-services": "Debug OpenAI Services", + "debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", + "run-test": "Run Test", + "test-results": "Test Results" }, "profile": { "welcome-user": "Velkommen, {0}!", diff --git a/frontend/lang/messages/pl-PL.json b/frontend/lang/messages/pl-PL.json index c8bac2d4582..4f0a8c74f38 100644 --- a/frontend/lang/messages/pl-PL.json +++ b/frontend/lang/messages/pl-PL.json @@ -652,6 +652,7 @@ "or": "Lub", "has-any": "Ma dowolny", "has-all": "Ma wszystkie", + "clear-selection": "Clear Selection", "results": "Wyniki", "search": "Szukaj", "search-mealie": "Przeszukaj Mealie (naciśnij /)", @@ -1245,7 +1246,11 @@ "here-are-a-few-things-to-help-you-get-started": "Here are a few things to help you get started with Mealie", "restore-from-v1-backup": "Have a backup from a previous instance of Mealie v1? You can restore it here.", "manage-profile-or-get-invite-link": "Manage your own profile, or grab an invite link to share with others." - } + }, + "debug-openai-services": "Debug OpenAI Services", + "debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", + "run-test": "Run Test", + "test-results": "Test Results" }, "profile": { "welcome-user": "👋 Welcome, {0}!", diff --git a/frontend/lang/messages/pt-BR.json b/frontend/lang/messages/pt-BR.json index 8807e89554b..bfe7f9059c8 100644 --- a/frontend/lang/messages/pt-BR.json +++ b/frontend/lang/messages/pt-BR.json @@ -652,6 +652,7 @@ "or": "Ou", "has-any": "Tem alguma", "has-all": "Tem todos", + "clear-selection": "Clear Selection", "results": "Resultados", "search": "Pesquisar", "search-mealie": "Pesquisar no Mealie (pressione /)", @@ -1245,7 +1246,11 @@ "here-are-a-few-things-to-help-you-get-started": "Aqui há algumas coisas para ajudá-lo a começar com o Mealie", "restore-from-v1-backup": "Tem uma cópia de segurança de uma instância anterior do Mealie v1? Você pode restaurá-la aqui.", "manage-profile-or-get-invite-link": "Gerencie seu próprio perfil, ou pegue um link de convite para compartilhar." - } + }, + "debug-openai-services": "Debug OpenAI Services", + "debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", + "run-test": "Run Test", + "test-results": "Test Results" }, "profile": { "welcome-user": "👋 Bem-vindo(a), {0}!", diff --git a/frontend/lang/messages/pt-PT.json b/frontend/lang/messages/pt-PT.json index 6e248e0ebf0..6eb7bb57158 100644 --- a/frontend/lang/messages/pt-PT.json +++ b/frontend/lang/messages/pt-PT.json @@ -652,6 +652,7 @@ "or": "Ou", "has-any": "Tem algum", "has-all": "Tem todos", + "clear-selection": "Clear Selection", "results": "Resultados", "search": "Pesquisar", "search-mealie": "Procurar no Mealie (prima /)", @@ -1245,7 +1246,11 @@ "here-are-a-few-things-to-help-you-get-started": "Aqui estão algumas coisas para ajudar a começar com o Mealie", "restore-from-v1-backup": "Tem uma cópia de segurança de uma instância do Mealie v1? Pode restaurá-la aqui.", "manage-profile-or-get-invite-link": "Gira o seu próprio perfil ou pegue num convite para partilhar com outros." - } + }, + "debug-openai-services": "Debug OpenAI Services", + "debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", + "run-test": "Run Test", + "test-results": "Test Results" }, "profile": { "welcome-user": "👋 Bem-vindo, {0}!", diff --git a/frontend/lang/messages/ro-RO.json b/frontend/lang/messages/ro-RO.json index 34d8b5cde3f..bf70e62f5d0 100644 --- a/frontend/lang/messages/ro-RO.json +++ b/frontend/lang/messages/ro-RO.json @@ -652,6 +652,7 @@ "or": "Sau", "has-any": "Are orice", "has-all": "Are toate", + "clear-selection": "Clear Selection", "results": "Rezultate", "search": "Caută", "search-mealie": "Căutare Mealie (apasă /)", @@ -1245,7 +1246,11 @@ "here-are-a-few-things-to-help-you-get-started": "Here are a few things to help you get started with Mealie", "restore-from-v1-backup": "Have a backup from a previous instance of Mealie v1? You can restore it here.", "manage-profile-or-get-invite-link": "Manage your own profile, or grab an invite link to share with others." - } + }, + "debug-openai-services": "Debug OpenAI Services", + "debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", + "run-test": "Run Test", + "test-results": "Test Results" }, "profile": { "welcome-user": "👋 Welcome, {0}!", diff --git a/frontend/lang/messages/ru-RU.json b/frontend/lang/messages/ru-RU.json index 12cc5865674..3c2f2fa9ec4 100644 --- a/frontend/lang/messages/ru-RU.json +++ b/frontend/lang/messages/ru-RU.json @@ -652,6 +652,7 @@ "or": "Или", "has-any": "Включает любое", "has-all": "Включает все", + "clear-selection": "Clear Selection", "results": "Результаты", "search": "Поиск", "search-mealie": "Поиск Mealie (нажмите /)", @@ -1245,7 +1246,11 @@ "here-are-a-few-things-to-help-you-get-started": "Here are a few things to help you get started with Mealie", "restore-from-v1-backup": "Have a backup from a previous instance of Mealie v1? You can restore it here.", "manage-profile-or-get-invite-link": "Manage your own profile, or grab an invite link to share with others." - } + }, + "debug-openai-services": "Debug OpenAI Services", + "debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", + "run-test": "Run Test", + "test-results": "Test Results" }, "profile": { "welcome-user": "👋 Добро пожаловать, {0}!", diff --git a/frontend/lang/messages/sk-SK.json b/frontend/lang/messages/sk-SK.json index 10dd514b98f..44fd3d58afc 100644 --- a/frontend/lang/messages/sk-SK.json +++ b/frontend/lang/messages/sk-SK.json @@ -652,6 +652,7 @@ "or": "Alebo", "has-any": "Obsahuje ktorýkoľvek", "has-all": "Obsahuje všetky", + "clear-selection": "Clear Selection", "results": "Výsledky", "search": "Vyhľadať", "search-mealie": "Prehľadať Mealie (stlač /)", @@ -1245,7 +1246,11 @@ "here-are-a-few-things-to-help-you-get-started": "Tu je niekoľko bodov, ktoré vám pomôžu na začiatku v Mealie", "restore-from-v1-backup": "Máte zálohu z predchádzajúcej inštalácie Mealie v1? Tu ju môžete obnoviť.", "manage-profile-or-get-invite-link": "Spravujte svoj profil ako súkromný alebo ho s pomocou pozývacieho linku zdieľajte s ostatnými." - } + }, + "debug-openai-services": "Debug OpenAI Services", + "debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", + "run-test": "Run Test", + "test-results": "Test Results" }, "profile": { "welcome-user": "👋 Vitajte, {0}!", diff --git a/frontend/lang/messages/sl-SI.json b/frontend/lang/messages/sl-SI.json index 0cada85795f..dd93f02cfb9 100644 --- a/frontend/lang/messages/sl-SI.json +++ b/frontend/lang/messages/sl-SI.json @@ -652,6 +652,7 @@ "or": "Ali", "has-any": "Ima enega izmed", "has-all": "Ima vse", + "clear-selection": "Clear Selection", "results": "Rezultati", "search": "Iskanje", "search-mealie": "Išči po Mealie (pritisni /)", @@ -1245,7 +1246,11 @@ "here-are-a-few-things-to-help-you-get-started": "Par stvari, ki to bodo pomagale začeti z Mealie", "restore-from-v1-backup": "Imaš varnostno kopijo iz predhodnje instance Mealie v1? Obnoviš jo lahko tule.", "manage-profile-or-get-invite-link": "Upravljaj s svojim profilom ali skopiraj povezavo z vabilom in jo deli z drugimi." - } + }, + "debug-openai-services": "Debug OpenAI Services", + "debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", + "run-test": "Run Test", + "test-results": "Test Results" }, "profile": { "welcome-user": "👋 Živjo, {0}!", diff --git a/frontend/lang/messages/sr-SP.json b/frontend/lang/messages/sr-SP.json index 5d32c588838..de199099af0 100644 --- a/frontend/lang/messages/sr-SP.json +++ b/frontend/lang/messages/sr-SP.json @@ -652,6 +652,7 @@ "or": "Или", "has-any": "Садржи било који", "has-all": "Садржи све", + "clear-selection": "Clear Selection", "results": "Резултати", "search": "Претрага", "search-mealie": "Претражи Мили (стисни /)", @@ -1245,7 +1246,11 @@ "here-are-a-few-things-to-help-you-get-started": "Here are a few things to help you get started with Mealie", "restore-from-v1-backup": "Have a backup from a previous instance of Mealie v1? You can restore it here.", "manage-profile-or-get-invite-link": "Manage your own profile, or grab an invite link to share with others." - } + }, + "debug-openai-services": "Debug OpenAI Services", + "debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", + "run-test": "Run Test", + "test-results": "Test Results" }, "profile": { "welcome-user": "👋 Welcome, {0}!", diff --git a/frontend/lang/messages/sv-SE.json b/frontend/lang/messages/sv-SE.json index 6dea9485914..5c15d06ed60 100644 --- a/frontend/lang/messages/sv-SE.json +++ b/frontend/lang/messages/sv-SE.json @@ -652,6 +652,7 @@ "or": "Eller", "has-any": "Har någon", "has-all": "Har alla", + "clear-selection": "Clear Selection", "results": "Resultat", "search": "Sök", "search-mealie": "Sök Mealie (tryck /)", @@ -1245,7 +1246,11 @@ "here-are-a-few-things-to-help-you-get-started": "Här är några saker som hjälper dig att komma igång med Mealie", "restore-from-v1-backup": "Har du en säkerhetskopia från en tidigare instans av Mealie v1? Du kan återställa den här.", "manage-profile-or-get-invite-link": "Hantera din egen profil eller hämta en inbjudningslänk för att dela med andra." - } + }, + "debug-openai-services": "Debug OpenAI Services", + "debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", + "run-test": "Run Test", + "test-results": "Test Results" }, "profile": { "welcome-user": "👋 Välkommen, {0}!", diff --git a/frontend/lang/messages/tr-TR.json b/frontend/lang/messages/tr-TR.json index bd32f7c8f71..660cd4f424a 100644 --- a/frontend/lang/messages/tr-TR.json +++ b/frontend/lang/messages/tr-TR.json @@ -652,6 +652,7 @@ "or": "Veya", "has-any": "Herhangi biri var", "has-all": "Hepsi var", + "clear-selection": "Clear Selection", "results": "Sonuçlar", "search": "Ara", "search-mealie": "Mealie'de Ara (/ tuşuna basın)", @@ -1245,7 +1246,11 @@ "here-are-a-few-things-to-help-you-get-started": "Mealie'yi kullanmaya başlamanıza yardımcı olacak birkaç şey", "restore-from-v1-backup": "Mealie v1'in önceki örneğinden bir yedeğiniz mi var? Buradan geri yükleyebilirsiniz.", "manage-profile-or-get-invite-link": "Kendi profilinizi yönetin veya başkalarıyla paylaşmak için bir davet bağlantısı alın." - } + }, + "debug-openai-services": "Debug OpenAI Services", + "debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", + "run-test": "Run Test", + "test-results": "Test Results" }, "profile": { "welcome-user": "👋 Hoşgeldin, {0}!", diff --git a/frontend/lang/messages/uk-UA.json b/frontend/lang/messages/uk-UA.json index 80feb67bc82..603e5caf65a 100644 --- a/frontend/lang/messages/uk-UA.json +++ b/frontend/lang/messages/uk-UA.json @@ -652,6 +652,7 @@ "or": "Або", "has-any": "Є будь-яке", "has-all": "Є всі", + "clear-selection": "Clear Selection", "results": "Результати", "search": "Пошук", "search-mealie": "Пошук по Mealie (натисніть /)", @@ -1245,7 +1246,11 @@ "here-are-a-few-things-to-help-you-get-started": "Ось кілька речей, які допоможуть вам почати з Mealie", "restore-from-v1-backup": "Маєте резервну копію з попереднього екземпляра Меаліе v1? Ви можете використати його тут.", "manage-profile-or-get-invite-link": "Керуйте вашим власним профілем, або отримайте посилання-запрошення щоб поділитися з іншими." - } + }, + "debug-openai-services": "Debug OpenAI Services", + "debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", + "run-test": "Run Test", + "test-results": "Test Results" }, "profile": { "welcome-user": "👋 Ласкаво просимо, {0}!", diff --git a/frontend/lang/messages/vi-VN.json b/frontend/lang/messages/vi-VN.json index f522cb3318f..d6dafdd4a21 100644 --- a/frontend/lang/messages/vi-VN.json +++ b/frontend/lang/messages/vi-VN.json @@ -652,6 +652,7 @@ "or": "Or", "has-any": "Has Any", "has-all": "Has All", + "clear-selection": "Clear Selection", "results": "Results", "search": "Search", "search-mealie": "Search Mealie (press /)", @@ -1245,7 +1246,11 @@ "here-are-a-few-things-to-help-you-get-started": "Here are a few things to help you get started with Mealie", "restore-from-v1-backup": "Have a backup from a previous instance of Mealie v1? You can restore it here.", "manage-profile-or-get-invite-link": "Manage your own profile, or grab an invite link to share with others." - } + }, + "debug-openai-services": "Debug OpenAI Services", + "debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", + "run-test": "Run Test", + "test-results": "Test Results" }, "profile": { "welcome-user": "👋 Welcome, {0}!", diff --git a/frontend/lang/messages/zh-CN.json b/frontend/lang/messages/zh-CN.json index 7ccb94d8093..6eee3de9d1b 100644 --- a/frontend/lang/messages/zh-CN.json +++ b/frontend/lang/messages/zh-CN.json @@ -652,6 +652,7 @@ "or": "或", "has-any": "包含任意", "has-all": "包含所有", + "clear-selection": "Clear Selection", "results": "结果", "search": "搜索", "search-mealie": "搜索Mealie (按 /)", @@ -1245,7 +1246,11 @@ "here-are-a-few-things-to-help-you-get-started": "以下这些可以帮助你开始使用Mealie", "restore-from-v1-backup": "有之前Mealie v1实例的备份数据?你可以在这里恢复它们。", "manage-profile-or-get-invite-link": "管理你自己的个人资料,或者获取邀请链接分享给其他人。" - } + }, + "debug-openai-services": "Debug OpenAI Services", + "debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", + "run-test": "Run Test", + "test-results": "Test Results" }, "profile": { "welcome-user": "👋 欢迎,{0}!", diff --git a/frontend/lang/messages/zh-TW.json b/frontend/lang/messages/zh-TW.json index 639315d6633..0924d8bc92e 100644 --- a/frontend/lang/messages/zh-TW.json +++ b/frontend/lang/messages/zh-TW.json @@ -652,6 +652,7 @@ "or": "或", "has-any": "Has Any", "has-all": "Has All", + "clear-selection": "Clear Selection", "results": "結果", "search": "搜尋", "search-mealie": "搜尋Mealie (按 /)", @@ -1245,7 +1246,11 @@ "here-are-a-few-things-to-help-you-get-started": "Here are a few things to help you get started with Mealie", "restore-from-v1-backup": "Have a backup from a previous instance of Mealie v1? You can restore it here.", "manage-profile-or-get-invite-link": "Manage your own profile, or grab an invite link to share with others." - } + }, + "debug-openai-services": "Debug OpenAI Services", + "debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", + "run-test": "Run Test", + "test-results": "Test Results" }, "profile": { "welcome-user": "👋 Welcome, {0}!", From 514fbc6e5a4092d7f4f33f8e9c5e6970b826e6d9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 23 Sep 2024 11:49:46 +0000 Subject: [PATCH 082/102] chore(auto): Update pre-commit hooks (#4255) Co-authored-by: boc-the-git <3479092+boc-the-git@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 6413e3b0562..fb14874f0e0 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -12,7 +12,7 @@ repos: exclude: ^tests/data/ - repo: https://github.com/astral-sh/ruff-pre-commit # Ruff version. - rev: v0.6.5 + rev: v0.6.7 hooks: - id: ruff - id: ruff-format From 8ec1408a09d8caee718dd22542f72844acf4d558 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 23 Sep 2024 10:18:26 -0500 Subject: [PATCH 083/102] fix(deps): update dependency rapidfuzz to v3.10.0 (#4257) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 202 +++++++++++++++++++++++----------------------------- 1 file changed, 91 insertions(+), 111 deletions(-) diff --git a/poetry.lock b/poetry.lock index 3cb908e0dd1..bc31fd840dc 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2514,123 +2514,103 @@ pyyaml = "*" [[package]] name = "rapidfuzz" -version = "3.9.7" +version = "3.10.0" description = "rapid fuzzy string matching" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "rapidfuzz-3.9.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ccf68e30b80e903f2309f90a438dbd640dd98e878eeb5ad361a288051ee5b75c"}, - {file = "rapidfuzz-3.9.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:696a79018ef989bf1c9abd9005841cee18005ccad4748bad8a4c274c47b6241a"}, - {file = "rapidfuzz-3.9.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4eebf6c93af0ae866c22b403a84747580bb5c10f0d7b51c82a87f25405d4dcb"}, - {file = "rapidfuzz-3.9.7-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0e9125377fa3d21a8abd4fbdbcf1c27be73e8b1850f0b61b5b711364bf3b59db"}, - {file = "rapidfuzz-3.9.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c12d180b17a22d107c8747de9c68d0b9c1d15dcda5445ff9bf9f4ccfb67c3e16"}, - {file = "rapidfuzz-3.9.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1318d42610c26dcd68bd3279a1bf9e3605377260867c9a8ed22eafc1bd93a7c"}, - {file = "rapidfuzz-3.9.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd5fa6e3c6e0333051c1f3a49f0807b3366f4131c8d6ac8c3e05fd0d0ce3755c"}, - {file = "rapidfuzz-3.9.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:fcf79b686962d7bec458a0babc904cb4fa319808805e036b9d5a531ee6b9b835"}, - {file = "rapidfuzz-3.9.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:8b01153c7466d0bad48fba77a303d5a768e66f24b763853469f47220b3de4661"}, - {file = "rapidfuzz-3.9.7-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:94baaeea0b4f8632a6da69348b1e741043eba18d4e3088d674d3f76586b6223d"}, - {file = "rapidfuzz-3.9.7-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6c5b32875646cb7f60c193ade99b2e4b124f19583492115293cd00f6fb198b17"}, - {file = "rapidfuzz-3.9.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:110b6294396bc0a447648627479c9320f095c2034c0537f687592e0f58622638"}, - {file = "rapidfuzz-3.9.7-cp310-cp310-win32.whl", hash = "sha256:3445a35c4c8d288f2b2011eb61bce1227c633ce85a3154e727170f37c0266bb2"}, - {file = "rapidfuzz-3.9.7-cp310-cp310-win_amd64.whl", hash = "sha256:0d1415a732ee75e74a90af12020b77a0b396b36c60afae1bde3208a78cd2c9fc"}, - {file = "rapidfuzz-3.9.7-cp310-cp310-win_arm64.whl", hash = "sha256:836f4d88b8bd0fff2ebe815dcaab8aa6c8d07d1d566a7e21dd137cf6fe11ed5b"}, - {file = "rapidfuzz-3.9.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d098ce6162eb5e48fceb0745455bc950af059df6113eec83e916c129fca11408"}, - {file = "rapidfuzz-3.9.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:048d55d36c02c6685a2b2741688503c3d15149694506655b6169dcfd3b6c2585"}, - {file = "rapidfuzz-3.9.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c33211cfff9aec425bb1bfedaf94afcf337063aa273754f22779d6dadebef4c2"}, - {file = "rapidfuzz-3.9.7-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e6d9db2fa4e9be171e9bb31cf2d2575574774966b43f5b951062bb2e67885852"}, - {file = "rapidfuzz-3.9.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d4e049d5ad61448c9a020d1061eba20944c4887d720c4069724beb6ea1692507"}, - {file = "rapidfuzz-3.9.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cfa74aac64c85898b93d9c80bb935a96bf64985e28d4ee0f1a3d1f3bf11a5106"}, - {file = "rapidfuzz-3.9.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:965693c2e9efd425b0f059f5be50ef830129f82892fa1858e220e424d9d0160f"}, - {file = "rapidfuzz-3.9.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8501000a5eb8037c4b56857724797fe5a8b01853c363de91c8d0d0ad56bef319"}, - {file = "rapidfuzz-3.9.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8d92c552c6b7577402afdd547dcf5d31ea6c8ae31ad03f78226e055cfa37f3c6"}, - {file = "rapidfuzz-3.9.7-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:1ee2086f490cb501d86b7e386c1eb4e3a0ccbb0c99067089efaa8c79012c8952"}, - {file = "rapidfuzz-3.9.7-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:1de91e7fd7f525e10ea79a6e62c559d1b0278ec097ad83d9da378b6fab65a265"}, - {file = "rapidfuzz-3.9.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a4da514d13f4433e16960a17f05b67e0af30ac771719c9a9fb877e5004f74477"}, - {file = "rapidfuzz-3.9.7-cp311-cp311-win32.whl", hash = "sha256:a40184c67db8252593ec518e17fb8a6e86d7259dc9f2d6c0bf4ff4db8cf1ad4b"}, - {file = "rapidfuzz-3.9.7-cp311-cp311-win_amd64.whl", hash = "sha256:c4f28f1930b09a2c300357d8465b388cecb7e8b2f454a5d5425561710b7fd07f"}, - {file = "rapidfuzz-3.9.7-cp311-cp311-win_arm64.whl", hash = "sha256:675b75412a943bb83f1f53e2e54fd18c80ef15ed642dc6eb0382d1949419d904"}, - {file = "rapidfuzz-3.9.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1ef6a1a8f0b12f8722f595f15c62950c9a02d5abc64742561299ffd49f6c6944"}, - {file = "rapidfuzz-3.9.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:32532af1d70c6ec02ea5ac7ee2766dfff7c8ae8c761abfe8da9e527314e634e8"}, - {file = "rapidfuzz-3.9.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae1a38bade755aa9dd95a81cda949e1bf9cd92b79341ccc5e2189c9e7bdfc5ec"}, - {file = "rapidfuzz-3.9.7-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d73ee2df41224c87336448d279b5b6a3a75f36e41dd3dcf538c0c9cce36360d8"}, - {file = "rapidfuzz-3.9.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be3a1fc3e2ab3bdf93dc0c83c00acca8afd2a80602297d96cf4a0ba028333cdf"}, - {file = "rapidfuzz-3.9.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:603f48f621272a448ff58bb556feb4371252a02156593303391f5c3281dfaeac"}, - {file = "rapidfuzz-3.9.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:268f8e1ca50fc61c0736f3fe9d47891424adf62d96ed30196f30f4bd8216b41f"}, - {file = "rapidfuzz-3.9.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5f8bf3f0d02935751d8660abda6044821a861f6229f7d359f98bcdcc7e66c39b"}, - {file = "rapidfuzz-3.9.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b997ff3b39d4cee9fb025d6c46b0a24bd67595ce5a5b652a97fb3a9d60beb651"}, - {file = "rapidfuzz-3.9.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ca66676c8ef6557f9b81c5b2b519097817a7c776a6599b8d6fcc3e16edd216fe"}, - {file = "rapidfuzz-3.9.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:35d3044cb635ca6b1b2b7b67b3597bd19f34f1753b129eb6d2ae04cf98cd3945"}, - {file = "rapidfuzz-3.9.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5a93c9e60904cb76e7aefef67afffb8b37c4894f81415ed513db090f29d01101"}, - {file = "rapidfuzz-3.9.7-cp312-cp312-win32.whl", hash = "sha256:579d107102c0725f7c79b4e79f16d3cf4d7c9208f29c66b064fa1fd4641d5155"}, - {file = "rapidfuzz-3.9.7-cp312-cp312-win_amd64.whl", hash = "sha256:953b3780765c8846866faf891ee4290f6a41a6dacf4fbcd3926f78c9de412ca6"}, - {file = "rapidfuzz-3.9.7-cp312-cp312-win_arm64.whl", hash = "sha256:7c20c1474b068c4bd45bf2fd0ad548df284f74e9a14a68b06746c56e3aa8eb70"}, - {file = "rapidfuzz-3.9.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:fde81b1da9a947f931711febe2e2bee694e891f6d3e6aa6bc02c1884702aea19"}, - {file = "rapidfuzz-3.9.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:47e92c155a14f44511ea8ebcc6bc1535a1fe8d0a7d67ad3cc47ba61606df7bcf"}, - {file = "rapidfuzz-3.9.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8772b745668260c5c4d069c678bbaa68812e6c69830f3771eaad521af7bc17f8"}, - {file = "rapidfuzz-3.9.7-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:578302828dd97ee2ba507d2f71d62164e28d2fc7bc73aad0d2d1d2afc021a5d5"}, - {file = "rapidfuzz-3.9.7-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc3e6081069eea61593f1d6839029da53d00c8c9b205c5534853eaa3f031085c"}, - {file = "rapidfuzz-3.9.7-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0b1c2d504eddf97bc0f2eba422c8915576dbf025062ceaca2d68aecd66324ad9"}, - {file = "rapidfuzz-3.9.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb76e5a21034f0307c51c5a2fc08856f698c53a4c593b17d291f7d6e9d09ca3"}, - {file = "rapidfuzz-3.9.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d4ba2318ef670ce505f42881a5d2af70f948124646947341a3c6ccb33cd70369"}, - {file = "rapidfuzz-3.9.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:057bb03f39e285047d7e9412e01ecf31bb2d42b9466a5409d715d587460dd59b"}, - {file = "rapidfuzz-3.9.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a8feac9006d5c9758438906f093befffc4290de75663dbb2098461df7c7d28dd"}, - {file = "rapidfuzz-3.9.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:95b8292383e717e10455f2c917df45032b611141e43d1adf70f71b1566136b11"}, - {file = "rapidfuzz-3.9.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e9fbf659537d246086d0297628b3795dc3e4a384101ecc01e5791c827b8d7345"}, - {file = "rapidfuzz-3.9.7-cp313-cp313-win32.whl", hash = "sha256:1dc516ac6d32027be2b0196bedf6d977ac26debd09ca182376322ad620460feb"}, - {file = "rapidfuzz-3.9.7-cp313-cp313-win_amd64.whl", hash = "sha256:b4f86e09d3064dca0b014cd48688964036a904a2d28048f00c8f4640796d06a8"}, - {file = "rapidfuzz-3.9.7-cp313-cp313-win_arm64.whl", hash = "sha256:19c64d8ddb2940b42a4567b23f1681af77f50a5ff6c9b8e85daba079c210716e"}, - {file = "rapidfuzz-3.9.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fbda3dd68d8b28ccb20ffb6f756fefd9b5ba570a772bedd7643ed441f5793308"}, - {file = "rapidfuzz-3.9.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2379e0b2578ad3ac7004f223251550f08bca873ff76c169b09410ec562ad78d8"}, - {file = "rapidfuzz-3.9.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d1eff95362f993b0276fd3839aee48625b09aac8938bb0c23b40d219cba5dc5"}, - {file = "rapidfuzz-3.9.7-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd9360e30041690912525a210e48a897b49b230768cc8af1c702e5395690464f"}, - {file = "rapidfuzz-3.9.7-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a93cd834b3c315ab437f0565ee3a2f42dd33768dc885ccbabf9710b131cf70d2"}, - {file = "rapidfuzz-3.9.7-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ff196996240db7075f62c7bc4506f40a3c80cd4ae3ab0e79ac6892283a90859"}, - {file = "rapidfuzz-3.9.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:948dcee7aaa1cd14358b2a7ef08bf0be42bf89049c3a906669874a715fc2c937"}, - {file = "rapidfuzz-3.9.7-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d95751f505a301af1aaf086c19f34536056d6c8efa91b2240de532a3db57b543"}, - {file = "rapidfuzz-3.9.7-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:90db86fa196eecf96cb6db09f1083912ea945c50c57188039392d810d0b784e1"}, - {file = "rapidfuzz-3.9.7-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:3171653212218a162540a3c8eb8ae7d3dcc8548540b69eaecaf3b47c14d89c90"}, - {file = "rapidfuzz-3.9.7-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:36dd6e820379c37a1ffefc8a52b648758e867cd9d78ee5b5dc0c9a6a10145378"}, - {file = "rapidfuzz-3.9.7-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:7b702de95666a1f7d5c6b47eacadfe2d2794af3742d63d2134767d13e5d1c713"}, - {file = "rapidfuzz-3.9.7-cp38-cp38-win32.whl", hash = "sha256:9030e7238c0df51aed5c9c5ed8eee2bdd47a2ae788e562c1454af2851c3d1906"}, - {file = "rapidfuzz-3.9.7-cp38-cp38-win_amd64.whl", hash = "sha256:f847fb0fbfb72482b1c05c59cbb275c58a55b73708a7f77a83f8035ee3c86497"}, - {file = "rapidfuzz-3.9.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:97f2ce529d2a70a60c290f6ab269a2bbf1d3b47b9724dccc84339b85f7afb044"}, - {file = "rapidfuzz-3.9.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e2957fdad10bb83b1982b02deb3604a3f6911a5e545f518b59c741086f92d152"}, - {file = "rapidfuzz-3.9.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d5262383634626eb45c536017204b8163a03bc43bda880cf1bdd7885db9a163"}, - {file = "rapidfuzz-3.9.7-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:364587827d7cbd41afa0782adc2d2d19e3f07d355b0750a02a8e33ad27a9c368"}, - {file = "rapidfuzz-3.9.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ecc24af7f905f3d6efb371a01680116ffea8d64e266618fb9ad1602a9b4f7934"}, - {file = "rapidfuzz-3.9.7-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9dc86aa6b29d174713c5f4caac35ffb7f232e3e649113e8d13812b35ab078228"}, - {file = "rapidfuzz-3.9.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3dcfbe7266e74a707173a12a7b355a531f2dcfbdb32f09468e664330da14874"}, - {file = "rapidfuzz-3.9.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:b23806fbdd6b510ba9ac93bb72d503066263b0fba44b71b835be9f063a84025f"}, - {file = "rapidfuzz-3.9.7-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:5551d68264c1bb6943f542da83a4dc8940ede52c5847ef158698799cc28d14f5"}, - {file = "rapidfuzz-3.9.7-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:13d8675a1fa7e2b19650ca7ef9a6ec01391d4bb12ab9e0793e8eb024538b4a34"}, - {file = "rapidfuzz-3.9.7-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9b6a5de507b9be6de688dae40143b656f7a93b10995fb8bd90deb555e7875c60"}, - {file = "rapidfuzz-3.9.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:111a20a3c090cf244d9406e60500b6c34b2375ba3a5009e2b38fd806fe38e337"}, - {file = "rapidfuzz-3.9.7-cp39-cp39-win32.whl", hash = "sha256:22589c0b8ccc6c391ce7f776c93a8c92c96ab8d34e1a19f1bd2b12a235332632"}, - {file = "rapidfuzz-3.9.7-cp39-cp39-win_amd64.whl", hash = "sha256:6f83221db5755b8f34222e40607d87f1176a8d5d4dbda4a55a0f0b67d588a69c"}, - {file = "rapidfuzz-3.9.7-cp39-cp39-win_arm64.whl", hash = "sha256:3665b92e788578c3bb334bd5b5fa7ee1a84bafd68be438e3110861d1578c63a0"}, - {file = "rapidfuzz-3.9.7-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:d7df9c2194c7ec930b33c991c55dbd0c10951bd25800c0b7a7b571994ebbced5"}, - {file = "rapidfuzz-3.9.7-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:68bd888eafd07b09585dcc8bc2716c5ecdb7eed62827470664d25588982b2873"}, - {file = "rapidfuzz-3.9.7-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1230e0f9026851a6a432beaa0ce575dda7b39fe689b576f99a0704fbb81fc9c"}, - {file = "rapidfuzz-3.9.7-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3b36e1c61b796ae1777f3e9e11fd39898b09d351c9384baf6e3b7e6191d8ced"}, - {file = "rapidfuzz-3.9.7-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9dba13d86806fcf3fe9c9919f58575e0090eadfb89c058bde02bcc7ab24e4548"}, - {file = "rapidfuzz-3.9.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1f1a33e84056b7892c721d84475d3bde49a145126bc4c6efe0d6d0d59cb31c29"}, - {file = "rapidfuzz-3.9.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3492c7a42b7fa9f0051d7fcce9893e95ed91c97c9ec7fb64346f3e070dd318ed"}, - {file = "rapidfuzz-3.9.7-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:ece45eb2af8b00f90d10f7419322e8804bd42fb1129026f9bfe712c37508b514"}, - {file = "rapidfuzz-3.9.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcd14cf4876f04b488f6e54a7abd3e9b31db5f5a6aba0ce90659917aaa8c088"}, - {file = "rapidfuzz-3.9.7-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:521c58c72ed8a612b25cda378ff10dee17e6deb4ee99a070b723519a345527b9"}, - {file = "rapidfuzz-3.9.7-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18669bb6cdf7d40738526d37e550df09ba065b5a7560f3d802287988b6cb63cf"}, - {file = "rapidfuzz-3.9.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:7abe2dbae81120a64bb4f8d3fcafe9122f328c9f86d7f327f174187a5af4ed86"}, - {file = "rapidfuzz-3.9.7-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:a3c0783910911f4f24655826d007c9f4360f08107410952c01ee3df98c713eb2"}, - {file = "rapidfuzz-3.9.7-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:03126f9a040ff21d2a110610bfd6b93b79377ce8b4121edcb791d61b7df6eec5"}, - {file = "rapidfuzz-3.9.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:591908240f4085e2ade5b685c6e8346e2ed44932cffeaac2fb32ddac95b55c7f"}, - {file = "rapidfuzz-3.9.7-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e9012d86c6397edbc9da4ac0132de7f8ee9d6ce857f4194d5684c4ddbcdd1c5c"}, - {file = "rapidfuzz-3.9.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df596ddd3db38aa513d4c0995611267b3946e7cbe5a8761b50e9306dfec720ee"}, - {file = "rapidfuzz-3.9.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3ed5adb752f4308fcc8f4fb6f8eb7aa4082f9d12676fda0a74fa5564242a8107"}, - {file = "rapidfuzz-3.9.7.tar.gz", hash = "sha256:f1c7296534c1afb6f495aa95871f14ccdc197c6db42965854e483100df313030"}, + {file = "rapidfuzz-3.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:884453860de029380dded8f3c1918af2d8eb5adf8010261645c7e5c88c2b5428"}, + {file = "rapidfuzz-3.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:718c9bd369288aca5fa929df6dbf66fdbe9768d90940a940c0b5cdc96ade4309"}, + {file = "rapidfuzz-3.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a68e3724b7dab761c01816aaa64b0903734d999d5589daf97c14ef5cc0629a8e"}, + {file = "rapidfuzz-3.10.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1af60988d47534246d9525f77288fdd9de652608a4842815d9018570b959acc6"}, + {file = "rapidfuzz-3.10.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3084161fc3e963056232ef8d937449a2943852e07101f5a136c8f3cfa4119217"}, + {file = "rapidfuzz-3.10.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6cd67d3d017296d98ff505529104299f78433e4b8af31b55003d901a62bbebe9"}, + {file = "rapidfuzz-3.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b11a127ac590fc991e8a02c2d7e1ac86e8141c92f78546f18b5c904064a0552c"}, + {file = "rapidfuzz-3.10.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:aadce42147fc09dcef1afa892485311e824c050352e1aa6e47f56b9b27af4cf0"}, + {file = "rapidfuzz-3.10.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b54853c2371bf0e38d67da379519deb6fbe70055efb32f6607081641af3dc752"}, + {file = "rapidfuzz-3.10.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ce19887268e90ee81a3957eef5e46a70ecc000713796639f83828b950343f49e"}, + {file = "rapidfuzz-3.10.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:f39a2a5ded23b9b9194ec45740dce57177b80f86c6d8eba953d3ff1a25c97766"}, + {file = "rapidfuzz-3.10.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0ec338d5f4ad8d9339a88a08db5c23e7f7a52c2b2a10510c48a0cef1fb3f0ddc"}, + {file = "rapidfuzz-3.10.0-cp310-cp310-win32.whl", hash = "sha256:56fd15ea8f4c948864fa5ebd9261c67cf7b89a1c517a0caef4df75446a7af18c"}, + {file = "rapidfuzz-3.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:43dfc5e733808962a822ff6d9c29f3039a3cfb3620706f5953e17cfe4496724c"}, + {file = "rapidfuzz-3.10.0-cp310-cp310-win_arm64.whl", hash = "sha256:ae7966f205b5a7fde93b44ca8fed37c1c8539328d7f179b1197de34eceaceb5f"}, + {file = "rapidfuzz-3.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bb0013795b40db5cf361e6f21ee7cda09627cf294977149b50e217d7fe9a2f03"}, + {file = "rapidfuzz-3.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:69ef5b363afff7150a1fbe788007e307b9802a2eb6ad92ed51ab94e6ad2674c6"}, + {file = "rapidfuzz-3.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c582c46b1bb0b19f1a5f4c1312f1b640c21d78c371a6615c34025b16ee56369b"}, + {file = "rapidfuzz-3.10.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:288f6f6e7410cacb115fb851f3f18bf0e4231eb3f6cb5bd1cec0e7b25c4d039d"}, + {file = "rapidfuzz-3.10.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c9e29a13d2fd9be3e7d8c26c7ef4ba60b5bc7efbc9dbdf24454c7e9ebba31768"}, + {file = "rapidfuzz-3.10.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea2da0459b951ee461bd4e02b8904890bd1c4263999d291c5cd01e6620177ad4"}, + {file = "rapidfuzz-3.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:457827ba82261aa2ae6ac06a46d0043ab12ba7216b82d87ae1434ec0f29736d6"}, + {file = "rapidfuzz-3.10.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5d350864269d56f51ab81ab750c9259ae5cad3152c0680baef143dcec92206a1"}, + {file = "rapidfuzz-3.10.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a9b8f51e08c3f983d857c3889930af9ddecc768453822076683664772d87e374"}, + {file = "rapidfuzz-3.10.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7f3a6aa6e70fc27e4ff5c479f13cc9fc26a56347610f5f8b50396a0d344c5f55"}, + {file = "rapidfuzz-3.10.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:803f255f10d63420979b1909ef976e7d30dec42025c9b067fc1d2040cc365a7e"}, + {file = "rapidfuzz-3.10.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2026651761bf83a0f31495cc0f70840d5c0d54388f41316e3f9cb51bd85e49a5"}, + {file = "rapidfuzz-3.10.0-cp311-cp311-win32.whl", hash = "sha256:4df75b3ebbb8cfdb9bf8b213b168620b88fd92d0c16a8bc9f9234630b282db59"}, + {file = "rapidfuzz-3.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:f9f0bbfb6787b97c51516f3ccf97737d504db5d239ad44527673b81f598b84ab"}, + {file = "rapidfuzz-3.10.0-cp311-cp311-win_arm64.whl", hash = "sha256:10fdad800441b9c97d471a937ba7d42625f1b530db05e572f1cb7d401d95c893"}, + {file = "rapidfuzz-3.10.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7dc87073ba3a40dd65591a2100aa71602107443bf10770579ff9c8a3242edb94"}, + {file = "rapidfuzz-3.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a425a0a868cf8e9c6e93e1cda4b758cdfd314bb9a4fc916c5742c934e3613480"}, + {file = "rapidfuzz-3.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a86d5d1d75e61df060c1e56596b6b0a4422a929dff19cc3dbfd5eee762c86b61"}, + {file = "rapidfuzz-3.10.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34f213d59219a9c3ca14e94a825f585811a68ac56b4118b4dc388b5b14afc108"}, + {file = "rapidfuzz-3.10.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:96ad46f5f56f70fab2be9e5f3165a21be58d633b90bf6e67fc52a856695e4bcf"}, + {file = "rapidfuzz-3.10.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9178277f72d144a6c7704d7ae7fa15b7b86f0f0796f0e1049c7b4ef748a662ef"}, + {file = "rapidfuzz-3.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76a35e9e19a7c883c422ffa378e9a04bc98cb3b29648c5831596401298ee51e6"}, + {file = "rapidfuzz-3.10.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8a6405d34c394c65e4f73a1d300c001f304f08e529d2ed6413b46ee3037956eb"}, + {file = "rapidfuzz-3.10.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:bd393683129f446a75d8634306aed7e377627098a1286ff3af2a4f1736742820"}, + {file = "rapidfuzz-3.10.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:b0445fa9880ead81f5a7d0efc0b9c977a947d8052c43519aceeaf56eabaf6843"}, + {file = "rapidfuzz-3.10.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:c50bc308fa29767ed8f53a8d33b7633a9e14718ced038ed89d41b886e301da32"}, + {file = "rapidfuzz-3.10.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e89605afebbd2d4b045bccfdc12a14b16fe8ccbae05f64b4b4c64a97dad1c891"}, + {file = "rapidfuzz-3.10.0-cp312-cp312-win32.whl", hash = "sha256:2db9187f3acf3cd33424ecdbaad75414c298ecd1513470df7bda885dcb68cc15"}, + {file = "rapidfuzz-3.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:50e3d0c72ea15391ba9531ead7f2068a67c5b18a6a365fef3127583aaadd1725"}, + {file = "rapidfuzz-3.10.0-cp312-cp312-win_arm64.whl", hash = "sha256:9eac95b4278bd53115903d89118a2c908398ee8bdfd977ae844f1bd2b02b917c"}, + {file = "rapidfuzz-3.10.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:fe5231e8afd069c742ac5b4f96344a0fe4aff52df8e53ef87faebf77f827822c"}, + {file = "rapidfuzz-3.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:886882367dbc985f5736356105798f2ae6e794e671fc605476cbe2e73838a9bb"}, + {file = "rapidfuzz-3.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b33e13e537e3afd1627d421a142a12bbbe601543558a391a6fae593356842f6e"}, + {file = "rapidfuzz-3.10.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:094c26116d55bf9c53abd840d08422f20da78ec4c4723e5024322321caedca48"}, + {file = "rapidfuzz-3.10.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:545fc04f2d592e4350f59deb0818886c1b444ffba3bec535b4fbb97191aaf769"}, + {file = "rapidfuzz-3.10.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:916a6abf3632e592b937c3d04c00a6efadd8fd30539cdcd4e6e4d92be7ca5d90"}, + {file = "rapidfuzz-3.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb6ec40cef63b1922083d33bfef2f91fc0b0bc07b5b09bfee0b0f1717d558292"}, + {file = "rapidfuzz-3.10.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c77a7330dd15c7eb5fd3631dc646fc96327f98db8181138766bd14d3e905f0ba"}, + {file = "rapidfuzz-3.10.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:949b5e9eeaa4ecb4c7e9c2a4689dddce60929dd1ff9c76a889cdbabe8bbf2171"}, + {file = "rapidfuzz-3.10.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b5363932a5aab67010ae1a6205c567d1ef256fb333bc23c27582481606be480c"}, + {file = "rapidfuzz-3.10.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:5dd6eec15b13329abe66cc241b484002ecb0e17d694491c944a22410a6a9e5e2"}, + {file = "rapidfuzz-3.10.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:79e7f98525b60b3c14524e0a4e1fedf7654657b6e02eb25f1be897ab097706f3"}, + {file = "rapidfuzz-3.10.0-cp313-cp313-win32.whl", hash = "sha256:d29d1b9857c65f8cb3a29270732e1591b9bacf89de9d13fa764f79f07d8f1fd2"}, + {file = "rapidfuzz-3.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:fa9720e56663cc3649d62b4b5f3145e94b8f5611e8a8e1b46507777249d46aad"}, + {file = "rapidfuzz-3.10.0-cp313-cp313-win_arm64.whl", hash = "sha256:eda4c661e68dddd56c8fbfe1ca35e40dd2afd973f7ebb1605f4d151edc63dff8"}, + {file = "rapidfuzz-3.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cffbc50e0767396ed483900900dd58ce4351bc0d40e64bced8694bd41864cc71"}, + {file = "rapidfuzz-3.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c038b9939da3035afb6cb2f465f18163e8f070aba0482923ecff9443def67178"}, + {file = "rapidfuzz-3.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca366c2e2a54e2f663f4529b189fdeb6e14d419b1c78b754ec1744f3c01070d4"}, + {file = "rapidfuzz-3.10.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c4c82b1689b23b1b5e6a603164ed2be41b6f6de292a698b98ba2381e889eb9d"}, + {file = "rapidfuzz-3.10.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98f6ebe28831a482981ecfeedc8237047878424ad0c1add2c7f366ba44a20452"}, + {file = "rapidfuzz-3.10.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4bd1a7676ee2a4c8e2f7f2550bece994f9f89e58afb96088964145a83af7408b"}, + {file = "rapidfuzz-3.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec9139baa3f85b65adc700eafa03ed04995ca8533dd56c924f0e458ffec044ab"}, + {file = "rapidfuzz-3.10.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:26de93e6495078b6af4c4d93a42ca067b16cc0e95699526c82ab7d1025b4d3bf"}, + {file = "rapidfuzz-3.10.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f3a0bda83c18195c361b5500377d0767749f128564ca95b42c8849fd475bb327"}, + {file = "rapidfuzz-3.10.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:63e4c175cbce8c3adc22dca5e6154588ae673f6c55374d156f3dac732c88d7de"}, + {file = "rapidfuzz-3.10.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:4dd3d8443970eaa02ab5ae45ce584b061f2799cd9f7e875190e2617440c1f9d4"}, + {file = "rapidfuzz-3.10.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e5ddb2388610799fc46abe389600625058f2a73867e63e20107c5ad5ffa57c47"}, + {file = "rapidfuzz-3.10.0-cp39-cp39-win32.whl", hash = "sha256:2e9be5d05cd960914024412b5406fb75a82f8562f45912ff86255acbfdbfb78e"}, + {file = "rapidfuzz-3.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:47aca565a39c9a6067927871973ca827023e8b65ba6c5747f4c228c8d7ddc04f"}, + {file = "rapidfuzz-3.10.0-cp39-cp39-win_arm64.whl", hash = "sha256:b0732343cdc4273b5921268026dd7266f75466eb21873cb7635a200d9d9c3fac"}, + {file = "rapidfuzz-3.10.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:f744b5eb1469bf92dd143d36570d2bdbbdc88fe5cb0b5405e53dd34f479cbd8a"}, + {file = "rapidfuzz-3.10.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b67cc21a14327a0eb0f47bc3d7e59ec08031c7c55220ece672f9476e7a8068d3"}, + {file = "rapidfuzz-3.10.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fe5783676f0afba4a522c80b15e99dbf4e393c149ab610308a8ef1f04c6bcc8"}, + {file = "rapidfuzz-3.10.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d4688862f957c8629d557d084f20b2d803f8738b6c4066802a0b1cc472e088d9"}, + {file = "rapidfuzz-3.10.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20bd153aacc244e4c907d772c703fea82754c4db14f8aa64d75ff81b7b8ab92d"}, + {file = "rapidfuzz-3.10.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:50484d563f8bfa723c74c944b0bb15b9e054db9c889348c8c307abcbee75ab92"}, + {file = "rapidfuzz-3.10.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5897242d455461f2c5b82d7397b29341fd11e85bf3608a522177071044784ee8"}, + {file = "rapidfuzz-3.10.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:116c71a81e046ba56551d8ab68067ca7034d94b617545316d460a452c5c3c289"}, + {file = "rapidfuzz-3.10.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0a547e4350d1fa32624d3eab51eff8cf329f4cae110b4ea0402486b1da8be40"}, + {file = "rapidfuzz-3.10.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:399b9b79ccfcf50ca3bad7692bc098bb8eade88d7d5e15773b7f866c91156d0c"}, + {file = "rapidfuzz-3.10.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7947a425d1be3e744707ee58c6cb318b93a56e08f080722dcc0347e0b7a1bb9a"}, + {file = "rapidfuzz-3.10.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:94c48b4a2a4b1d22246f48e2b11cae01ec7d23f0c9123f8bb822839ad79d0a88"}, + {file = "rapidfuzz-3.10.0.tar.gz", hash = "sha256:6b62af27e65bb39276a66533655a2fa3c60a487b03935721c45b7809527979be"}, ] [package.extras] -full = ["numpy"] +all = ["numpy"] [[package]] name = "rdflib" From 222d5210d6bd1c1236a61bdddd061fde939346f9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 23 Sep 2024 15:31:05 +0000 Subject: [PATCH 084/102] fix(deps): update dependency alembic to v1.13.3 (#4258) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index bc31fd840dc..2264b89a9c7 100644 --- a/poetry.lock +++ b/poetry.lock @@ -13,13 +13,13 @@ files = [ [[package]] name = "alembic" -version = "1.13.2" +version = "1.13.3" description = "A database migration tool for SQLAlchemy." optional = false python-versions = ">=3.8" files = [ - {file = "alembic-1.13.2-py3-none-any.whl", hash = "sha256:6b8733129a6224a9a711e17c99b08462dbf7cc9670ba8f2e2ae9af860ceb1953"}, - {file = "alembic-1.13.2.tar.gz", hash = "sha256:1ff0ae32975f4fd96028c39ed9bb3c867fe3af956bd7bb37343b54c9fe7445ef"}, + {file = "alembic-1.13.3-py3-none-any.whl", hash = "sha256:908e905976d15235fae59c9ac42c4c5b75cfcefe3d27c0fbf7ae15a37715d80e"}, + {file = "alembic-1.13.3.tar.gz", hash = "sha256:203503117415561e203aa14541740643a611f641517f0209fcae63e9fa09f1a2"}, ] [package.dependencies] From 4c0709270da01f17d81d93def7de0cc1be60e563 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 23 Sep 2024 10:50:48 -0500 Subject: [PATCH 085/102] fix(deps): update dependency openai to v1.47.1 (#4259) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index 2264b89a9c7..cc712471d2c 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1580,13 +1580,13 @@ signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] [[package]] name = "openai" -version = "1.47.0" +version = "1.47.1" description = "The official Python library for the openai API" optional = false python-versions = ">=3.7.1" files = [ - {file = "openai-1.47.0-py3-none-any.whl", hash = "sha256:9ccc8737dfa791f7bd903db4758c176b8544a8cd89d3a3d2add3cea02a34c3a0"}, - {file = "openai-1.47.0.tar.gz", hash = "sha256:6e14d6f77c8cf546646afcd87a2ef752505b3710d2564a2e433e17307dfa86a0"}, + {file = "openai-1.47.1-py3-none-any.whl", hash = "sha256:34277583bf268bb2494bc03f48ac123788c5e2a914db1d5a23d5edc29d35c825"}, + {file = "openai-1.47.1.tar.gz", hash = "sha256:62c8f5f478f82ffafc93b33040f8bb16a45948306198bd0cba2da2ecd9cf7323"}, ] [package.dependencies] From 44bd64910f0ce6dda20738ef283feb513f23f182 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 23 Sep 2024 21:42:44 +0200 Subject: [PATCH 086/102] fix(deps): update dependency tzdata to v2024.2 (#4261) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index cc712471d2c..d642f79e2dc 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3110,13 +3110,13 @@ files = [ [[package]] name = "tzdata" -version = "2024.1" +version = "2024.2" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" files = [ - {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, - {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, + {file = "tzdata-2024.2-py2.py3-none-any.whl", hash = "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd"}, + {file = "tzdata-2024.2.tar.gz", hash = "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc"}, ] [[package]] From 869cabf7b7bb3165a1e5175ce3c5db3e00f0436e Mon Sep 17 00:00:00 2001 From: Hayden <64056131+hay-kot@users.noreply.github.com> Date: Tue, 24 Sep 2024 05:24:31 -0500 Subject: [PATCH 087/102] chore(l10n): New Crowdin updates (#4264) --- frontend/lang/messages/el-GR.json | 8 ++++---- frontend/lang/messages/fr-FR.json | 8 ++++---- frontend/lang/messages/hu-HU.json | 16 ++++++++-------- frontend/lang/messages/nl-NL.json | 8 ++++---- frontend/lang/messages/uk-UA.json | 10 +++++----- .../seed/resources/units/locales/hu-HU.json | 2 +- .../seed/resources/units/locales/uk-UA.json | 4 ++-- 7 files changed, 28 insertions(+), 28 deletions(-) diff --git a/frontend/lang/messages/el-GR.json b/frontend/lang/messages/el-GR.json index fe95db2a2e8..d8e8b3f5cd9 100644 --- a/frontend/lang/messages/el-GR.json +++ b/frontend/lang/messages/el-GR.json @@ -1247,10 +1247,10 @@ "restore-from-v1-backup": "Εχετε ένα αντίγραφο ασφαλείας από μια προηγούμενη υπόσταση του Mealie v1; Μπορείτε να το επαναφέρετε εδώ.", "manage-profile-or-get-invite-link": "Διαχειριστείτε το δικό σας προφίλ, ή λάβετε έναν σύνδεσμο πρόσκλησης για να μοιραστείτε με άλλους." }, - "debug-openai-services": "Debug OpenAI Services", - "debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", - "run-test": "Run Test", - "test-results": "Test Results" + "debug-openai-services": "Εντοπισμός Σφαλμάτων Υπηρεσιών OpenAI", + "debug-openai-services-description": "Χρησιμοποιήστε αυτή τη σελίδα για να αποσφαλματώσετε τις υπηρεσίες OpenAI. Μπορείτε να ελέγξετε τη σύνδεσή σας στην OpenAI και να δείτε τα αποτελέσματα εδώ. Αν έχετε ενεργοποιημένες τις υπηρεσίες εικόνας, μπορείτε επίσης να παρέχετε μια εικόνα.", + "run-test": "Εκτέλεση δοκιμής", + "test-results": "Αποτελέσματα δοκιμής" }, "profile": { "welcome-user": "👋 Καλώς ορίσατε, {0}!", diff --git a/frontend/lang/messages/fr-FR.json b/frontend/lang/messages/fr-FR.json index f7aa5878771..516bda6a1da 100644 --- a/frontend/lang/messages/fr-FR.json +++ b/frontend/lang/messages/fr-FR.json @@ -1247,10 +1247,10 @@ "restore-from-v1-backup": "Vous avez une sauvegarde d’une précédente instance de Mealie v1 ? Vous pouvez la restaurer ici.", "manage-profile-or-get-invite-link": "Gérez votre propre profil, ou récupérez un lien d’invitation à partager avec d’autres." }, - "debug-openai-services": "Debug OpenAI Services", - "debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", - "run-test": "Run Test", - "test-results": "Test Results" + "debug-openai-services": "Déboguer les services OpenAI", + "debug-openai-services-description": "Utilisez cette page pour déboguer les services OpenAI. Vous pouvez tester votre connexion OpenAI et voir les résultats ici. Si vous avez activé les services d'image, vous pouvez également fournir une image.", + "run-test": "Lancer le test", + "test-results": "Résultats du test" }, "profile": { "welcome-user": "👋 Bienvenue, {0} !", diff --git a/frontend/lang/messages/hu-HU.json b/frontend/lang/messages/hu-HU.json index 72ca172c3e9..9a3868c22db 100644 --- a/frontend/lang/messages/hu-HU.json +++ b/frontend/lang/messages/hu-HU.json @@ -8,7 +8,7 @@ "database-type": "Adatbázis típusa", "database-url": "Adatbázis URL", "default-group": "Alapértelmezett csoport", - "default-household": "Default Household", + "default-household": "Alapértelmezett háztartás", "demo": "Demó", "demo-status": "Demó állapot", "development": "Fejlesztői", @@ -239,7 +239,7 @@ "keep-my-recipes-private-description": "A csoport és az összes recept alapértelmezett beállítása privátra. Ezt később bármikor megváltoztathatod." }, "manage-members": "Tagok Kezelése", - "manage-members-description": "Manage the permissions of the members in your household. {manage} allows the user to access the data-management page, and {invite} allows the user to generate invitation links for other users. Group owners cannot change their own permissions.", + "manage-members-description": "Kezelje a háztartás tagjainak jogosultságait. A {manage} lehetővé teszi a felhasználó számára az adatkezelési oldal elérését, a {invite} pedig lehetővé teszi a felhasználó számára, hogy meghívó linkeket hozzon létre más felhasználók számára. A csoporttulajdonosok nem módosíthatják saját jogosultságaikat.", "manage": "Kezelés", "manage-household": "Manage Household", "invite": "Meghívás", @@ -652,7 +652,7 @@ "or": "Vagy", "has-any": "Bármely", "has-all": "Mind", - "clear-selection": "Clear Selection", + "clear-selection": "Kijelölés törlése", "results": "Találatok", "search": "Keresés", "search-mealie": "Keresés a Mealie-ben (/ gombbal)", @@ -1247,10 +1247,10 @@ "restore-from-v1-backup": "Van egy korábbi Mealie v1 biztonsági másolatod? Itt visszaállíthatod.", "manage-profile-or-get-invite-link": "Alakítsa a profilját vagy szerezze meg a meghívó link-jét hogy megoszthassa másokkal." }, - "debug-openai-services": "Debug OpenAI Services", - "debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", - "run-test": "Run Test", - "test-results": "Test Results" + "debug-openai-services": "OpenAI-szolgáltatások hibakeresése", + "debug-openai-services-description": "Ezt az oldalt az OpenAI szolgáltatások hibakeresésére használhatja. Itt tesztelheti az OpenAI-kapcsolatot, és láthatja az eredményeket. Ha engedélyezte a képszolgáltatásokat, akkor képet is megadhat.", + "run-test": "Teszt futtatása", + "test-results": "Teszt eredmények" }, "profile": { "welcome-user": "👋 Üdvözöljük, {0}!", @@ -1261,7 +1261,7 @@ "account-summary-description": "Itt egy áttekintés a csoportja információiról.", "group-statistics": "Csoportstatisztikák", "group-statistics-description": "Az Ön csoportstatisztikái betekintést nyújtanak abba, hogyan használja a Mealie-t.", - "household-statistics": "Household Statistics", + "household-statistics": "Háztartási statisztikák", "household-statistics-description": "Your Household Statistics provide some insight how you're using Mealie.", "storage-capacity": "Tárhely mérete", "storage-capacity-description": "A tárhely kapacitása az Ön által feltöltött képek és eszközök számításából adódik.", diff --git a/frontend/lang/messages/nl-NL.json b/frontend/lang/messages/nl-NL.json index da9174975bd..0cb3d6789b4 100644 --- a/frontend/lang/messages/nl-NL.json +++ b/frontend/lang/messages/nl-NL.json @@ -1247,10 +1247,10 @@ "restore-from-v1-backup": "Heb je een back-up van een vorig exemplaar van Mealie v1? Deze kan je hier terugzetten.", "manage-profile-or-get-invite-link": "Beheer je eigen profiel, of gebruik een uitnodigingslink om te delen met anderen." }, - "debug-openai-services": "Debug OpenAI Services", - "debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", - "run-test": "Run Test", - "test-results": "Test Results" + "debug-openai-services": "Debug OpenAI diensten", + "debug-openai-services-description": "Gebruik deze pagina om de OpenAI-diensten te debuggen. U kunt uw OpenAI-verbinding testen en de resultaten hier bekijken. Als u afbeeldingsdiensten hebt ingeschakeld, kunt u ook een afbeelding geven.", + "run-test": "Test starten", + "test-results": "Resultaten van de test" }, "profile": { "welcome-user": "👋 Welkom, {0}!", diff --git a/frontend/lang/messages/uk-UA.json b/frontend/lang/messages/uk-UA.json index 603e5caf65a..ef80b4932b9 100644 --- a/frontend/lang/messages/uk-UA.json +++ b/frontend/lang/messages/uk-UA.json @@ -652,7 +652,7 @@ "or": "Або", "has-any": "Є будь-яке", "has-all": "Є всі", - "clear-selection": "Clear Selection", + "clear-selection": "Зняти позначення", "results": "Результати", "search": "Пошук", "search-mealie": "Пошук по Mealie (натисніть /)", @@ -1247,10 +1247,10 @@ "restore-from-v1-backup": "Маєте резервну копію з попереднього екземпляра Меаліе v1? Ви можете використати його тут.", "manage-profile-or-get-invite-link": "Керуйте вашим власним профілем, або отримайте посилання-запрошення щоб поділитися з іншими." }, - "debug-openai-services": "Debug OpenAI Services", - "debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", - "run-test": "Run Test", - "test-results": "Test Results" + "debug-openai-services": "Налагодження служб OpenAI", + "debug-openai-services-description": "Використовуйте цю сторінку, щоб налагодити служби OpenAI. Ви можете перевірити ваше з'єднання з OpenAI й побачити результати тут. Якщо ввімкнено служби зображень, ви також можете надати зображення.", + "run-test": "Запустити перевірку", + "test-results": "Результати перевірки" }, "profile": { "welcome-user": "👋 Ласкаво просимо, {0}!", diff --git a/mealie/repos/seed/resources/units/locales/hu-HU.json b/mealie/repos/seed/resources/units/locales/hu-HU.json index 6b262403fb2..992161dd021 100644 --- a/mealie/repos/seed/resources/units/locales/hu-HU.json +++ b/mealie/repos/seed/resources/units/locales/hu-HU.json @@ -15,7 +15,7 @@ "name": "csésze", "plural_name": "csésze", "description": "", - "abbreviation": "c" + "abbreviation": "p" }, "fluid-ounce": { "name": "uncia", diff --git a/mealie/repos/seed/resources/units/locales/uk-UA.json b/mealie/repos/seed/resources/units/locales/uk-UA.json index c7ed913d75f..54d670949e4 100644 --- a/mealie/repos/seed/resources/units/locales/uk-UA.json +++ b/mealie/repos/seed/resources/units/locales/uk-UA.json @@ -133,8 +133,8 @@ "abbreviation": "" }, "pinch": { - "name": "pinch", - "plural_name": "pinches", + "name": "дрібка", + "plural_name": "дрібки", "description": "", "abbreviation": "" } From 49cc627561ea5cef6bc7e7b187b8ea2cc2f64592 Mon Sep 17 00:00:00 2001 From: Cody Date: Tue, 24 Sep 2024 09:29:06 -0500 Subject: [PATCH 088/102] feat: Shopping list UI overhaul - add label headings per category (#4235) Co-authored-by: Kuchenpirat <24235032+Kuchenpirat@users.noreply.github.com> --- frontend/pages/group/data/labels.vue | 2 +- frontend/pages/shopping-lists/_id.vue | 12 ++++-------- mealie/schema/labels/multi_purpose_label.py | 2 +- 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/frontend/pages/group/data/labels.vue b/frontend/pages/group/data/labels.vue index d30af8c1838..0f031828ca3 100644 --- a/frontend/pages/group/data/labels.vue +++ b/frontend/pages/group/data/labels.vue @@ -232,7 +232,7 @@ export default defineComponent({ editLabel.value = item; if (!editLabel.value.color) { - editLabel.value.color = "#E0E0E0"; + editLabel.value.color = "#959595"; } } diff --git a/frontend/pages/shopping-lists/_id.vue b/frontend/pages/shopping-lists/_id.vue index 54c4a471b8f..6afa28ff157 100644 --- a/frontend/pages/shopping-lists/_id.vue +++ b/frontend/pages/shopping-lists/_id.vue @@ -56,15 +56,11 @@
-
-
- - - {{ $globals.icons.tags }} - - - {{ key }} +
+
+ {{ key }}
+ Date: Tue, 24 Sep 2024 17:44:42 +0200 Subject: [PATCH 089/102] chore(deps): update dependency pylint to v3.3.1 (#4265) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/poetry.lock b/poetry.lock index d642f79e2dc..25aaae66166 100644 --- a/poetry.lock +++ b/poetry.lock @@ -108,13 +108,13 @@ requests-oauthlib = "*" [[package]] name = "astroid" -version = "3.3.3" +version = "3.3.4" description = "An abstract syntax tree for Python with inference support." optional = false python-versions = ">=3.9.0" files = [ - {file = "astroid-3.3.3-py3-none-any.whl", hash = "sha256:2d79acfd3c594b6a2d4141fea98a1d62ab4a52e54332b1f1ddcf07b652cc5c0f"}, - {file = "astroid-3.3.3.tar.gz", hash = "sha256:63f8c5370d9bad8294163c87b2d440a7fdf546be6c72bbeac0549c93244dbd72"}, + {file = "astroid-3.3.4-py3-none-any.whl", hash = "sha256:5eba185467253501b62a9f113c263524b4f5d55e1b30456370eed4cdbd6438fd"}, + {file = "astroid-3.3.4.tar.gz", hash = "sha256:e73d0b62dd680a7c07cb2cd0ce3c22570b044dd01bd994bc3a2dd16c6cbba162"}, ] [package.dependencies] @@ -2251,17 +2251,17 @@ tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] [[package]] name = "pylint" -version = "3.3.0" +version = "3.3.1" description = "python code static checker" optional = false python-versions = ">=3.9.0" files = [ - {file = "pylint-3.3.0-py3-none-any.whl", hash = "sha256:02dce1845f68974b9b03045894eb3bf05a8b3c7da9fd10af4de3c91e69eb92f1"}, - {file = "pylint-3.3.0.tar.gz", hash = "sha256:c685fe3c061ee5fb0ce7c29436174ab84a2f525fce2a268b1986e921e083fe22"}, + {file = "pylint-3.3.1-py3-none-any.whl", hash = "sha256:2f846a466dd023513240bc140ad2dd73bfc080a5d85a710afdb728c420a5a2b9"}, + {file = "pylint-3.3.1.tar.gz", hash = "sha256:9f3dcc87b1203e612b78d91a896407787e708b3f189b5fa0b307712d49ff0c6e"}, ] [package.dependencies] -astroid = ">=3.3.3,<=3.4.0-dev0" +astroid = ">=3.3.4,<=3.4.0-dev0" colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} dill = [ {version = ">=0.2", markers = "python_version < \"3.11\""}, From 2f2dff9f6c3b7bad9e7b367f885ee3d1ef8de306 Mon Sep 17 00:00:00 2001 From: Seamus Lowry Date: Tue, 24 Sep 2024 17:33:30 -0400 Subject: [PATCH 090/102] feat: sort labels by name,asc in shopping lists (#4253) --- frontend/pages/shopping-lists/_id.vue | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/frontend/pages/shopping-lists/_id.vue b/frontend/pages/shopping-lists/_id.vue index 6afa28ff157..cdda50c8c6d 100644 --- a/frontend/pages/shopping-lists/_id.vue +++ b/frontend/pages/shopping-lists/_id.vue @@ -788,16 +788,6 @@ export default defineComponent({ itemsByLabel.value = itemsSorted; } - async function refreshLabels() { - const { data } = await userApi.multiPurposeLabels.getAll(); - - if (data) { - allLabels.value = data.items ?? []; - } - } - - refreshLabels(); - // ===================================== // Add/Remove Recipe References From 69cbcec8043a14e7f95cc41b142295a256cacfd4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 25 Sep 2024 13:09:06 +0200 Subject: [PATCH 091/102] chore(deps): update dependency mkdocs-material to v9.5.37 (#4267) --- poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index 25aaae66166..db632ebd735 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1452,13 +1452,13 @@ pyyaml = ">=5.1" [[package]] name = "mkdocs-material" -version = "9.5.36" +version = "9.5.37" description = "Documentation that simply works" optional = false python-versions = ">=3.8" files = [ - {file = "mkdocs_material-9.5.36-py3-none-any.whl", hash = "sha256:36734c1fd9404bea74236242ba3359b267fc930c7233b9fd086b0898825d0ac9"}, - {file = "mkdocs_material-9.5.36.tar.gz", hash = "sha256:140456f761320f72b399effc073fa3f8aac744c77b0970797c201cae2f6c967f"}, + {file = "mkdocs_material-9.5.37-py3-none-any.whl", hash = "sha256:6e8a986abad77be5edec3dd77cf1ddf2480963fb297a8e971f87a82fd464b070"}, + {file = "mkdocs_material-9.5.37.tar.gz", hash = "sha256:2c31607431ec234db124031255b0a9d4f3e1c3ecc2c47ad97ecfff0460471941"}, ] [package.dependencies] From ecb6017b94135e973f1a557425740435a471c736 Mon Sep 17 00:00:00 2001 From: Hayden <64056131+hay-kot@users.noreply.github.com> Date: Wed, 25 Sep 2024 07:01:21 -0500 Subject: [PATCH 092/102] chore(l10n): New Crowdin updates (#4268) --- frontend/lang/messages/sl-SI.json | 22 +++++++++++----------- frontend/lang/messages/sv-SE.json | 10 +++++----- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/frontend/lang/messages/sl-SI.json b/frontend/lang/messages/sl-SI.json index dd93f02cfb9..cc6e7431d25 100644 --- a/frontend/lang/messages/sl-SI.json +++ b/frontend/lang/messages/sl-SI.json @@ -241,14 +241,14 @@ "manage-members": "Urejanje članov", "manage-members-description": "Upravljajte dovoljenja članov v vašem gospodinjstvu. {manage} omogoča uporabniku dostop do strani za upravljanje podatkov, {invite} pa uporabniku omogoča ustvarjanje povezav za povabila za druge uporabnike. Lastniki skupine ne morejo spremeniti lastnih dovoljenj.", "manage": "Upravljaj", - "manage-household": "Manage Household", + "manage-household": "Upravljanje gospodinjstva", "invite": "Povabi", "looking-to-update-your-profile": "Želiš posodobiti svoj profil?", "default-recipe-preferences-description": "To so privzete nastavitve za nove recepte ustvarjene v tvoji skupini. Nastavitve lahko spreminjaš za posamezne recepte v nastavitvah recepta.", "default-recipe-preferences": "Privzete nastavitve za recepte", "group-preferences": "Nastavitve za skupine", "private-group": "Zasebna skupina", - "private-group-description": "Setting your group to private will disable all public view options. This overrides any individual public view settings", + "private-group-description": "Če svojo skupino nastavite na zasebno, boste onemogočili vse možnosti javnega pogleda. To preglasi vse posamezne nastavitve javnega pogleda", "enable-public-access": "Omogoči javni dostop", "enable-public-access-description": "Skupinski recepti naj bodo privzeto javni, obiskovalcem omogoči ogled receptov brez prijave", "allow-users-outside-of-your-group-to-see-your-recipes": "Dovoli uporabnikom zunaj tvoje skupine, da vidijo tvoje recepte", @@ -286,9 +286,9 @@ "admin-household-management-text": "Spremembe tega gospodinjstva se bodo takoj odrazile.", "household-id-value": "ID gospodinjstva: {0}", "private-household": "Zasebno gospodinjstvo", - "private-household-description": "Setting your household to private will disable all public view options. This overrides any individual public view settings", - "lock-recipe-edits-from-other-households": "Lock recipe edits from other households", - "lock-recipe-edits-from-other-households-description": "When enabled only users in your household can edit recipes created by your household", + "private-household-description": "Če svoje gospodinjstvo nastavite na zasebno, boste onemogočili vse možnosti javnega pogleda. To preglasi vse posamezne nastavitve javnega pogleda", + "lock-recipe-edits-from-other-households": "Zakleni urejanje receptov iz drugih gospodinjstev", + "lock-recipe-edits-from-other-households-description": "Ko je omogočeno, lahko samo uporabniki v vašem gospodinjstvu urejajo recepte, ki jih je ustvarilo vaše gospodinjstvo", "household-recipe-preferences": "Nastavitve gospodinjskih receptov", "default-recipe-preferences-description": "To so privzete nastavitve, ko se v vašem gospodinjstvu ustvari nov recept. Te lahko spremenite za posamezne recepte v meniju z nastavitvami receptov.", "allow-users-outside-of-your-household-to-see-your-recipes": "Omogočite uporabnikom zunaj vašega gospodinjstva ogled vaših receptov", @@ -652,7 +652,7 @@ "or": "Ali", "has-any": "Ima enega izmed", "has-all": "Ima vse", - "clear-selection": "Clear Selection", + "clear-selection": "Počisti izbor", "results": "Rezultati", "search": "Iskanje", "search-mealie": "Išči po Mealie (pritisni /)", @@ -991,7 +991,7 @@ "administrator": "Administrator", "user-can-invite-other-to-group": "Uporabnih lahko povabi druge v skupino", "user-can-manage-group": "Uporabnik lahko upravlja s skupino", - "user-can-manage-household": "User can manage household", + "user-can-manage-household": "Uporabnik lahko upravlja gospodinjstvo", "user-can-organize-group-data": "Uporabnik lahko organizira podatke skupine", "enable-advanced-features": "Vključi napredne funkcije", "it-looks-like-this-is-your-first-time-logging-in": "Zgleda, kot da se prvič prijavljaš.", @@ -1247,10 +1247,10 @@ "restore-from-v1-backup": "Imaš varnostno kopijo iz predhodnje instance Mealie v1? Obnoviš jo lahko tule.", "manage-profile-or-get-invite-link": "Upravljaj s svojim profilom ali skopiraj povezavo z vabilom in jo deli z drugimi." }, - "debug-openai-services": "Debug OpenAI Services", - "debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", - "run-test": "Run Test", - "test-results": "Test Results" + "debug-openai-services": "Odpravljanje napak v storitvah OpenAI", + "debug-openai-services-description": "Uporabite to stran za odpravljanje napak v storitvah OpenAI. Tukaj lahko preizkusite svojo povezavo OpenAI in si ogledate rezultate. Če imate omogočene slikovne storitve, lahko zagotovite tudi sliko.", + "run-test": "Zaženi test", + "test-results": "Rezultati testa" }, "profile": { "welcome-user": "👋 Živjo, {0}!", diff --git a/frontend/lang/messages/sv-SE.json b/frontend/lang/messages/sv-SE.json index 5c15d06ed60..17d55c4d40e 100644 --- a/frontend/lang/messages/sv-SE.json +++ b/frontend/lang/messages/sv-SE.json @@ -652,7 +652,7 @@ "or": "Eller", "has-any": "Har någon", "has-all": "Har alla", - "clear-selection": "Clear Selection", + "clear-selection": "Rensa markering", "results": "Resultat", "search": "Sök", "search-mealie": "Sök Mealie (tryck /)", @@ -1247,10 +1247,10 @@ "restore-from-v1-backup": "Har du en säkerhetskopia från en tidigare instans av Mealie v1? Du kan återställa den här.", "manage-profile-or-get-invite-link": "Hantera din egen profil eller hämta en inbjudningslänk för att dela med andra." }, - "debug-openai-services": "Debug OpenAI Services", - "debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", - "run-test": "Run Test", - "test-results": "Test Results" + "debug-openai-services": "Felsök OpenAI-tjänster", + "debug-openai-services-description": "Använd denna sida för att felsöka OpenAI-tjänster. Du kan testa din OpenAI-anslutning och se resultaten här. Om du har bildtjänster aktiverade, kan du också ge en bild.", + "run-test": "Kör test", + "test-results": "Testresultat" }, "profile": { "welcome-user": "👋 Välkommen, {0}!", From 85dc5a8630003e5e7277d8332073283c409dbe4d Mon Sep 17 00:00:00 2001 From: Michael Genson <71845777+michael-genson@users.noreply.github.com> Date: Wed, 25 Sep 2024 10:30:49 -0500 Subject: [PATCH 093/102] docs: Update Docs for Households (#4266) Co-authored-by: Kuchenpirat <24235032+Kuchenpirat@users.noreply.github.com> --- .../developers-guide/migration-guide.md | 51 +++++++++++++++++++ .../docs/documentation/getting-started/faq.md | 15 ++++-- .../documentation/getting-started/features.md | 47 +++++++++++++++-- .../getting-started/introduction.md | 5 +- .../documentation/getting-started/updating.md | 4 +- .../usage/permissions-and-public-access.md | 16 ++++-- docs/docs/overrides/api.html | 2 +- docs/mkdocs.yml | 1 + 8 files changed, 123 insertions(+), 18 deletions(-) create mode 100644 docs/docs/contributors/developers-guide/migration-guide.md diff --git a/docs/docs/contributors/developers-guide/migration-guide.md b/docs/docs/contributors/developers-guide/migration-guide.md new file mode 100644 index 00000000000..5640a796d61 --- /dev/null +++ b/docs/docs/contributors/developers-guide/migration-guide.md @@ -0,0 +1,51 @@ +# Migration Guide + +This guide is a reference for developers maintaining custom integrations with Mealie. While we aim to keep breaking changes to a minimum, major versions are likely to contain at least *some* breaking changes. To clarify: *most users do not need to worry about this, this is **only** for those maintaining integrations and/or leveraging the API*. + +While this guide aims to simplify the migration process for developers, it's not necessarily a comprehensive list of breaking changes. Starting with v2, a comprehensive list of breaking changes are highlighted in the release notes. + +## V1 → V2 + +The biggest change between V1 and V2 is the introduction of Households. For more information on how households work in relation to groups/users, check out the [Groups and Households](./features.md#groups-and-households) section in the Features guide. + +### `updateAt` is now `updatedAt` + +We have renamed the `updateAt` field to `updatedAt`. While the API will still accept `updateAt` as an alias, the API will return it as `updatedAt`. The field's behavior has otherwise been unchanged. + +### Backend Endpoint Changes + +These endpoints have moved, but are otherwise unchanged: +- `/groups/webhooks` -> `/households/webhooks` +- `/groups/shopping/items` -> `/households/shopping/items` +- `/groups/shopping/lists` -> `/households/shopping/lists` +- `/groups/mealplans` -> `/households/mealplans` +- `/groups/mealplans/rules` -> `/households/mealplans/rules` +- `/groups/invitations` -> `/households/invitations` +- `/groups/recipe-actions` -> `/households/recipe-actions` +- `/groups/events/notifications` -> `/households/events/notifications` +- `/groups/cookbooks` -> `/households/cookbooks` +- `/explore/foods/{group_slug}` -> `/explore/groups/{group_slug}/foods` +- `/explore/organizers/{group_slug}/categories` -> `/explore/groups/{group_slug}/categories` +- `/explore/organizers/{group_slug}/tags` -> `/explore/groups/{group_slug}/tags` +- `/explore/organizers/{group_slug}/tools` -> `/explore/groups/{group_slug}/tools` +- `/explore/cookbooks/{group_slug}` -> `/explore/groups/{group_slug}/cookbooks` +- `/explore/recipes/{group_slug}` -> `/explore/groups/{group_slug}/recipes` + +`/groups/members` previously returned a `UserOut` object, but now returns a `UserSummary`. Should you need the full user information (username, email, etc.), rather than just the summary, see `/households/members` instead for the household members. + +These endpoints have been completely removed: +- `/admin/analytics` (no longer used) +- `/groups/permissions` (see household permissions) +- `/groups/statistics` (see household statistics) +- `/groups/categories` (see organizer endpoints) +- `/recipes/summary/untagged` (no longer used) +- `/recipes/summary/uncategorized` (no longer used) +- `/users/group-users` (see `/groups/members` and `/households/members`) + +### Frontend Links + +These frontend pages have moved: +- `/group/mealplan/...` -> `/household/mealplan/...` +- `/group/members` -> `/household/members` +- `/group/notifiers` -> `/household/notifiers` +- `/group/webhooks` -> `/household/webhooks` diff --git a/docs/docs/documentation/getting-started/faq.md b/docs/docs/documentation/getting-started/faq.md index 78473d3cba2..b6692f9c9d8 100644 --- a/docs/docs/documentation/getting-started/faq.md +++ b/docs/docs/documentation/getting-started/faq.md @@ -98,13 +98,14 @@ python /app/mealie/scripts/change_password.py Follow the [steps above](#how-can-i-change-my-password) for changing your password. You will be prompted if you would like to switch your authentication method back to local auth so you can log in again. -## How do private groups and recipes work? +## How do private groups, households, and recipes work? Managing private groups and recipes can be confusing. The following diagram and notes should help explain how they work to determine if a recipe can be shared publicly. - Private links that are generated from the recipe page using the `Share` button bypass all group and recipe permissions - Private groups block all access to recipes, including those that are public, except as noted above. -- Groups with "Allow users outside of your group to see your recipes" disabled block all access to recipes, except as noted above. +- Private households, similar to private groups, block all access to recipes, except as noted above. +- Households with "Allow users outside of your group to see your recipes" disabled block all access to recipes, except as noted above. - Private recipes block all access to the recipe from public links. This does not affect Private Links. ```mermaid @@ -112,7 +113,8 @@ stateDiagram-v2 r1: Request Access p1: Using Private Link? p2: Is Group Private? - p3: Is Recipe Private? + p3: Is Household Private? + p4: Is Recipe Private? s1: Deny Access n1: Allow Access @@ -125,10 +127,13 @@ stateDiagram-v2 p2 --> p3: No p3 --> s1: Yes - p3 --> n1: No + p3 --> p4: No + + p4 --> s1: Yes + p4 --> n1: No ``` -For more information, check out the [Permissions and Public Access guide](./usage/permissions-and-public-access.md). +For more information on public access, check out the [Permissions and Public Access guide](./usage/permissions-and-public-access.md). For more information on groups vs. households, check out the [Groups and Households](./features.md#groups-and-households) section in the Features guide. ## Can I use fail2ban with Mealie? Yes, Mealie is configured to properly forward external IP addresses into the `mealie.log` logfile. Note that due to restrictions in docker, IP address forwarding only works on Linux. diff --git a/docs/docs/documentation/getting-started/features.md b/docs/docs/documentation/getting-started/features.md index 797c4d0d083..8e4aa62581c 100644 --- a/docs/docs/documentation/getting-started/features.md +++ b/docs/docs/documentation/getting-started/features.md @@ -35,7 +35,6 @@ Mealie has a robust and flexible recipe organization system with a few different #### Categories - Categories are the overarching organizer for recipes. You can assign as many categories as you'd like to a recipe, but we recommend that you try to limit the categories you assign to a recipe to one or two. This helps keep categories as focused as possible while still allowing you to find recipes that are related to each other. For example, you might assign a recipe to the category **Breakfast**, **Lunch**, **Dinner**, or **Side**. [Categories Demo](https://demo.mealie.io/g/home/recipes/categories){ .md-button .md-button--primary } @@ -164,6 +163,46 @@ Managing a robust collection of recipes inevitable requires a lot of data. Meali [Data Management Demo](https://demo.mealie.io/group/data/foods){ .md-button .md-button--primary } +## Groups and Households + +Mealie lets you fully customize how you organize your users. You can use Groups to host multiple instances (or tenants) of Mealie which are completely isolated from each other. Within each Group you can organize users into Households which allow users to share recipes, but keep other items separate (e.g. meal plans and shopping lists). + +### Groups + +Groups are fully isolated instances of Mealie. Think of a goup as a completely separate, fully self-contained site. There is no data shared between groups. Each group has its own users, recipes, tags, categories, etc. A user logged-in to one group cannot make any changes to another. + +Common use cases for groups include: +- Hosting multiple instances of Mealie for others who want to keep their data private and secure +- Creating completely isolated recipe pools + +### Households + +Households are subdivisions within a single Group. Households maintain their own users and settings, while sharing their recipes with other households. Households also share organizers (tags, categories, etc.) with the entire group. Meal Plans, Shopping Lists, and Integrations are only accessible within a household. + +Common use cases for households include: +- Sharing a common recipe pool amongst families +- Maintaining separate meal plans and shopping lists from other households +- Maintaining separate integrations and customizations from other households + +```mermaid +flowchart TB + mealie[(Mealie)] ==> groups + + %% Groups + groups((Groups)) --> ingredients & organizers + groups((Groups)) ====> households + ingredients("Ingredients
(Foods, Units, Labels)") + organizers("Organizers
(Categories, Tags, Tools)") + + %% Households + households((Households)) --> recipes & mealplans & shoppinglists & integrations + + recipes(Recipes & Cookbooks) + mealplans(Meal Plans) + shoppinglists(Shopping Lists) + integrations("Integrations
(Notifiers, Webhooks)") +``` + ## Server Administration ### Site Settings @@ -172,11 +211,13 @@ The site settings page contains general information about your installation like [Settings Demo](https://demo.mealie.io/admin/site-settings){ .md-button .md-button--primary } -### Users and Group +### Users, Households, and Groups -There is a small management area for users and groups that allows you to create, edit, and delete users and groups. +There is a small management area for users, households, and groups. [Users Demo](https://demo.mealie.io/admin/manage/users){ .md-button .md-button--primary } +[Households Demo](https://demo.mealie.io/admin/manage/households){ .md-button .md-button--primary } +[Groups Demo](https://demo.mealie.io/admin/manage/groups){ .md-button .md-button--primary } ### Backups diff --git a/docs/docs/documentation/getting-started/introduction.md b/docs/docs/documentation/getting-started/introduction.md index 010de5edf56..25648deafdd 100644 --- a/docs/docs/documentation/getting-started/introduction.md +++ b/docs/docs/documentation/getting-started/introduction.md @@ -11,7 +11,8 @@ Mealie is a self hosted recipe manager and meal planner with a RestAPI backend a - 🕸 Import recipes from around the web by URL - 📱 Progressive Web App - 📆 Create Meal Plans -- 🛒 Generate shopping lists +- 🛒 Generate Shopping Lists +- 🏠 Separate Users into Households and share Recipes - 🐳 Easy setup with Docker - 🎨 Customize your interface with color themed layouts - 🌍 localized in many languages @@ -27,7 +28,7 @@ Mealie is a self hosted recipe manager and meal planner with a RestAPI backend a - Copy Me That - Paprika - Tandoor Recipes - - Random meal plan generation + - Random Meal Plan generation - Advanced rule configuration to fine tune random recipes ## FAQ diff --git a/docs/docs/documentation/getting-started/updating.md b/docs/docs/documentation/getting-started/updating.md index 6917bc35bb9..de8be5a8746 100644 --- a/docs/docs/documentation/getting-started/updating.md +++ b/docs/docs/documentation/getting-started/updating.md @@ -9,8 +9,8 @@ - Create a Backup and Download from the UI - Upgrade -## Upgrading to Mealie v1 -If you are upgrading from pre-v1.0.0 to v1.0.0, make sure you read [Migrating to Mealie v1](./migrating-to-mealie-v1.md)! +## Upgrading to Mealie v1 or later +If you are upgrading from pre-v1.0.0 to v1.0.0 or later (v2.0.0, etc.), make sure you read [Migrating to Mealie v1](./migrating-to-mealie-v1.md)! ## Backing Up Your Data diff --git a/docs/docs/documentation/getting-started/usage/permissions-and-public-access.md b/docs/docs/documentation/getting-started/usage/permissions-and-public-access.md index 475a0b44886..35461701d22 100644 --- a/docs/docs/documentation/getting-started/usage/permissions-and-public-access.md +++ b/docs/docs/documentation/getting-started/usage/permissions-and-public-access.md @@ -19,9 +19,10 @@ Administrators can navigate to the Settings page and access the User Management ## Public Recipe Access -By default, groups are set to private, meaning only logged-in users may access the group. In order for a recipe to be viewable by public (not logged-in) users, two criteria must be met: +By default, groups and households are set to private, meaning only logged-in users may access the group/household. In order for a recipe to be viewable by public (not logged-in) users, three criteria must be met: -1. The group must not be private, *and* the group setting for allowing users outside of your group to see your recipes must be enabled. These can be toggled on the Group Settings page +1. The group must not be private +2. The household must not be private, *and* the household setting for allowing users outside of your group to see your recipes must be enabled. These can be toggled on the Household Settings page 2. The recipe must be set to public. This can be toggled for each recipe individually, or in bulk using the Recipe Data Management page Additionally, if the group is not private, public users can view all public group data (public recipes, public cookbooks, etc.) from the home page ([e.g. the demo home page](https://demo.mealie.io/g/home)). @@ -32,7 +33,8 @@ More broadly, here are the rules for how recipe access is determined: - Private links that are generated from the recipe page using the `Share` button bypass all group and recipe permissions - Private groups block all access to recipes, including those that are public, except as noted above. -- Groups with "Allow users outside of your group to see your recipes" disabled block all access to recipes, except as noted above. +- Private households, similar to private groups, block all access to recipes, except as noted above. +- Households with "Allow users outside of your group to see your recipes" disabled block all access to recipes, except as noted above. - Private recipes block all access to the recipe from public links. This does not affect Private Links. ```mermaid @@ -40,7 +42,8 @@ stateDiagram-v2 r1: Request Access p1: Using Private Link? p2: Is Group Private? - p3: Is Recipe Private? + p3: Is Household Private? + p4: Is Recipe Private? s1: Deny Access n1: Allow Access @@ -53,5 +56,8 @@ stateDiagram-v2 p2 --> p3: No p3 --> s1: Yes - p3 --> n1: No + p3 --> p4: No + + p4 --> s1: Yes + p4 --> n1: No ``` diff --git a/docs/docs/overrides/api.html b/docs/docs/overrides/api.html index ed6136a1666..ce5d7fd8614 100644 --- a/docs/docs/overrides/api.html +++ b/docs/docs/overrides/api.html @@ -14,7 +14,7 @@
diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index 2369a9a89e8..6def4dc34d7 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -101,5 +101,6 @@ nav: - Dev Getting Started: "contributors/developers-guide/starting-dev-server.md" - Database Changes: "contributors/developers-guide/database-changes.md" - Maintainers Guide: "contributors/developers-guide/maintainers.md" + - Migration Guide: "contributors/developers-guide/migration-guide.md" - Guides: - Improving Ingredient Parser: "contributors/guides/ingredient-parser.md" From 8d0f067cd3a5dab05af61a205adedd1357f22c66 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 25 Sep 2024 17:25:46 +0000 Subject: [PATCH 094/102] fix(deps): update dependency openai to v1.48.0 (#4269) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index db632ebd735..d197c328cc3 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1580,13 +1580,13 @@ signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] [[package]] name = "openai" -version = "1.47.1" +version = "1.48.0" description = "The official Python library for the openai API" optional = false python-versions = ">=3.7.1" files = [ - {file = "openai-1.47.1-py3-none-any.whl", hash = "sha256:34277583bf268bb2494bc03f48ac123788c5e2a914db1d5a23d5edc29d35c825"}, - {file = "openai-1.47.1.tar.gz", hash = "sha256:62c8f5f478f82ffafc93b33040f8bb16a45948306198bd0cba2da2ecd9cf7323"}, + {file = "openai-1.48.0-py3-none-any.whl", hash = "sha256:7c4af223f0bf615ce4a12453729952c9a8b04ffe8c78aa77981b12fd970149cf"}, + {file = "openai-1.48.0.tar.gz", hash = "sha256:1d3b69ea62c287c4885a6f3ce840768564cd5f52c60ac5f890fef80d43cc4799"}, ] [package.dependencies] From 14f9b7e2d1f5483d13319c75054de2bec9bc3ec1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 26 Sep 2024 11:39:47 +0200 Subject: [PATCH 095/102] chore(deps): update dependency mkdocs-material to v9.5.38 (#4270) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index d197c328cc3..a317714486b 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1452,13 +1452,13 @@ pyyaml = ">=5.1" [[package]] name = "mkdocs-material" -version = "9.5.37" +version = "9.5.38" description = "Documentation that simply works" optional = false python-versions = ">=3.8" files = [ - {file = "mkdocs_material-9.5.37-py3-none-any.whl", hash = "sha256:6e8a986abad77be5edec3dd77cf1ddf2480963fb297a8e971f87a82fd464b070"}, - {file = "mkdocs_material-9.5.37.tar.gz", hash = "sha256:2c31607431ec234db124031255b0a9d4f3e1c3ecc2c47ad97ecfff0460471941"}, + {file = "mkdocs_material-9.5.38-py3-none-any.whl", hash = "sha256:d4779051d52ba9f1e7e344b34de95449c7c366c212b388e4a2db9a3db043c228"}, + {file = "mkdocs_material-9.5.38.tar.gz", hash = "sha256:1843c5171ad6b489550aeaf7358e5b7128cc03ddcf0fb4d91d19aa1e691a63b8"}, ] [package.dependencies] From 0a0e798496a6d370296c27793b7870c6d335623e Mon Sep 17 00:00:00 2001 From: Hayden <64056131+hay-kot@users.noreply.github.com> Date: Thu, 26 Sep 2024 07:01:27 -0500 Subject: [PATCH 096/102] chore(l10n): New Crowdin updates (#4271) --- frontend/lang/messages/ru-RU.json | 6 +++--- mealie/repos/seed/resources/units/locales/ru-RU.json | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/lang/messages/ru-RU.json b/frontend/lang/messages/ru-RU.json index 3c2f2fa9ec4..7a7eece7b14 100644 --- a/frontend/lang/messages/ru-RU.json +++ b/frontend/lang/messages/ru-RU.json @@ -591,7 +591,7 @@ "crop-and-rotate-the-image": "Crop and rotate the image so that only the text is visible, and it's in the correct orientation.", "create-from-image": "Create from Image", "should-translate-description": "Translate the recipe into my language", - "please-wait-image-procesing": "Please wait, the image is processing. This may take some time.", + "please-wait-image-procesing": "Подождите, идет обработка изображения.", "bulk-url-import": "Массовый импорт по URL", "debug-scraper": "Отладка сканирования", "create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Создайте рецепт, указав имя. Все рецепты должны иметь уникальные имена.", @@ -636,7 +636,7 @@ "natural-language-processor": "Natural Language Processor", "brute-parser": "Brute Parser", "openai-parser": "OpenAI Parser", - "parse-all": "Parse All", + "parse-all": "Обработать все", "no-unit": "No unit", "missing-unit": "Create missing unit: {unit}", "missing-food": "Create missing food: {food}", @@ -1052,7 +1052,7 @@ "edit-label": "Изменить метку", "new-label": "Новая метка", "labels": "Метки", - "assign-label": "Assign Label" + "assign-label": "Присвоить метку" }, "recipes": { "purge-exports": "Очистить экспорты", diff --git a/mealie/repos/seed/resources/units/locales/ru-RU.json b/mealie/repos/seed/resources/units/locales/ru-RU.json index 153ffedd855..bb264b78e3f 100644 --- a/mealie/repos/seed/resources/units/locales/ru-RU.json +++ b/mealie/repos/seed/resources/units/locales/ru-RU.json @@ -92,7 +92,7 @@ }, "dash": { "name": "щепотка", - "plural_name": "dashes", + "plural_name": "", "description": "", "abbreviation": "" }, @@ -104,7 +104,7 @@ }, "head": { "name": "головка", - "plural_name": "heads", + "plural_name": "головки", "description": "", "abbreviation": "" }, From 6fce4a650cbeacf0c7fe4ecd809c35f8783d66c1 Mon Sep 17 00:00:00 2001 From: jlssmt <42897917+jlssmt@users.noreply.github.com> Date: Fri, 27 Sep 2024 13:02:34 +0200 Subject: [PATCH 097/102] feat: add regex to url before scraping (#4174) Co-authored-by: Kuchenpirat <24235032+Kuchenpirat@users.noreply.github.com> --- mealie/services/scraper/scraper.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/mealie/services/scraper/scraper.py b/mealie/services/scraper/scraper.py index a6e307ca820..75a29d60ec5 100644 --- a/mealie/services/scraper/scraper.py +++ b/mealie/services/scraper/scraper.py @@ -1,4 +1,5 @@ from enum import Enum +from re import search as regex_search from uuid import uuid4 from fastapi import HTTPException, status @@ -31,7 +32,13 @@ async def create_from_url(url: str, translator: Translator) -> tuple[Recipe, Scr Recipe: Recipe Object """ scraper = RecipeScraper(translator) - new_recipe, extras = await scraper.scrape(url) + + extracted_url = regex_search(r"(https?://|www\.)[^\s]+", url) + + if not extracted_url: + raise HTTPException(status.HTTP_400_BAD_REQUEST, {"details": ParserErrors.BAD_RECIPE_DATA.value}) + + new_recipe, extras = await scraper.scrape(extracted_url.group(0)) if not new_recipe: raise HTTPException(status.HTTP_400_BAD_REQUEST, {"details": ParserErrors.BAD_RECIPE_DATA.value}) From b74ef085178459d5af08af1b9ad417b4d02ad1a4 Mon Sep 17 00:00:00 2001 From: Michael Genson <71845777+michael-genson@users.noreply.github.com> Date: Fri, 27 Sep 2024 09:06:45 -0500 Subject: [PATCH 098/102] feat: Add Household Filter to Meal Plan Rules (#4231) --- ...cc8_add_households_filter_to_meal_plans.py | 53 ++++++ .../Household/GroupHouseholdSelector.vue | 91 ++++++++++ .../Household/GroupMealPlanRuleForm.vue | 33 +++- frontend/lang/messages/en-US.json | 4 + frontend/lib/api/types/meal-plan.ts | 27 ++- .../pages/household/mealplan/settings.vue | 54 +++++- mealie/db/models/household/mealplan.py | 12 +- mealie/repos/repository_generic.py | 7 + mealie/repos/repository_recipes.py | 25 +-- .../routes/households/controller_mealplan.py | 101 ++++++----- mealie/schema/meal_plan/__init__.py | 12 +- mealie/schema/meal_plan/plan_rules.py | 37 +++- .../test_group_mealplan.py | 164 ++++++++++++++++++ 13 files changed, 533 insertions(+), 87 deletions(-) create mode 100644 alembic/versions/2024-09-18-14.52.55_1fe4bd37ccc8_add_households_filter_to_meal_plans.py create mode 100644 frontend/components/Domain/Household/GroupHouseholdSelector.vue diff --git a/alembic/versions/2024-09-18-14.52.55_1fe4bd37ccc8_add_households_filter_to_meal_plans.py b/alembic/versions/2024-09-18-14.52.55_1fe4bd37ccc8_add_households_filter_to_meal_plans.py new file mode 100644 index 00000000000..a127e72f44a --- /dev/null +++ b/alembic/versions/2024-09-18-14.52.55_1fe4bd37ccc8_add_households_filter_to_meal_plans.py @@ -0,0 +1,53 @@ +"""add households filter to meal plans + +Revision ID: 1fe4bd37ccc8 +Revises: be568e39ffdf +Create Date: 2024-09-18 14:52:55.831540 + +""" + +import sqlalchemy as sa + +import mealie.db.migration_types +from alembic import op + +# revision identifiers, used by Alembic. +revision = "1fe4bd37ccc8" +down_revision: str | None = "be568e39ffdf" +branch_labels: str | tuple[str, ...] | None = None +depends_on: str | tuple[str, ...] | None = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.create_table( + "plan_rules_to_households", + sa.Column("group_plan_rule_id", mealie.db.migration_types.GUID(), nullable=True), + sa.Column("household_id", mealie.db.migration_types.GUID(), nullable=True), + sa.ForeignKeyConstraint( + ["group_plan_rule_id"], + ["group_meal_plan_rules.id"], + ), + sa.ForeignKeyConstraint( + ["household_id"], + ["households.id"], + ), + sa.UniqueConstraint("group_plan_rule_id", "household_id", name="group_plan_rule_id_household_id_key"), + ) + with op.batch_alter_table("plan_rules_to_households", schema=None) as batch_op: + batch_op.create_index( + batch_op.f("ix_plan_rules_to_households_group_plan_rule_id"), ["group_plan_rule_id"], unique=False + ) + batch_op.create_index(batch_op.f("ix_plan_rules_to_households_household_id"), ["household_id"], unique=False) + + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table("plan_rules_to_households", schema=None) as batch_op: + batch_op.drop_index(batch_op.f("ix_plan_rules_to_households_household_id")) + batch_op.drop_index(batch_op.f("ix_plan_rules_to_households_group_plan_rule_id")) + + op.drop_table("plan_rules_to_households") + # ### end Alembic commands ### diff --git a/frontend/components/Domain/Household/GroupHouseholdSelector.vue b/frontend/components/Domain/Household/GroupHouseholdSelector.vue new file mode 100644 index 00000000000..fcdf63e4004 --- /dev/null +++ b/frontend/components/Domain/Household/GroupHouseholdSelector.vue @@ -0,0 +1,91 @@ + + + diff --git a/frontend/components/Domain/Household/GroupMealPlanRuleForm.vue b/frontend/components/Domain/Household/GroupMealPlanRuleForm.vue index cf71112a3ee..1f263eb3621 100644 --- a/frontend/components/Domain/Household/GroupMealPlanRuleForm.vue +++ b/frontend/components/Domain/Household/GroupMealPlanRuleForm.vue @@ -5,8 +5,15 @@
- - +
+ + + +
{{ $t('meal-plan.this-rule-will-apply', { @@ -18,11 +25,13 @@