From 6991dff3e60f3755bedae580d1ce8f984f6ce9e2 Mon Sep 17 00:00:00 2001 From: Michael Genson <71845777+michael-genson@users.noreply.github.com> Date: Sun, 5 May 2024 06:17:29 -0500 Subject: [PATCH] fix: Make Nextcloud Migrations Fault Tolerant (#3544) --- mealie/schema/recipe/recipe.py | 4 ++++ mealie/schema/recipe/recipe_nutrition.py | 2 +- mealie/services/migrations/nextcloud.py | 17 +++++++++++++++-- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/mealie/schema/recipe/recipe.py b/mealie/schema/recipe/recipe.py index 8120ba53fbe..e9240b82a81 100644 --- a/mealie/schema/recipe/recipe.py +++ b/mealie/schema/recipe/recipe.py @@ -243,6 +243,10 @@ def convert_extras_to_dict(cls, v): return {x.key_name: x.value for x in v} if v else {} + @field_validator("nutrition", mode="before") + def validate_nutrition(cls, v): + return v or None + @classmethod def loader_options(cls) -> list[LoaderOption]: return [ diff --git a/mealie/schema/recipe/recipe_nutrition.py b/mealie/schema/recipe/recipe_nutrition.py index 12908ffb94f..167b30285e4 100644 --- a/mealie/schema/recipe/recipe_nutrition.py +++ b/mealie/schema/recipe/recipe_nutrition.py @@ -11,4 +11,4 @@ class Nutrition(MealieModel): fiber_content: str | None = None sodium_content: str | None = None sugar_content: str | None = None - model_config = ConfigDict(from_attributes=True) + model_config = ConfigDict(from_attributes=True, coerce_numbers_to_str=True) diff --git a/mealie/services/migrations/nextcloud.py b/mealie/services/migrations/nextcloud.py index b45c4247f0d..692dff761a5 100644 --- a/mealie/services/migrations/nextcloud.py +++ b/mealie/services/migrations/nextcloud.py @@ -9,6 +9,8 @@ from isodate.isoerror import ISO8601Error from slugify import slugify +from mealie.schema.reports.reports import ReportEntryCreate + from ._migration_base import BaseMigrator from .utils.migration_alias import MigrationAlias from .utils.migration_helpers import MigrationReaders, glob_walker, import_image, split_by_comma @@ -66,8 +68,19 @@ def _migrate(self) -> None: all_recipes = [] for _, nc_dir in nextcloud_dirs.items(): - recipe = self.clean_recipe_dictionary(nc_dir.recipe) - all_recipes.append(recipe) + try: + recipe = self.clean_recipe_dictionary(nc_dir.recipe) + all_recipes.append(recipe) + except Exception as e: + self.logger.exception(e) + self.report_entries.append( + ReportEntryCreate( + report_id=self.report_id, + success=False, + message=f"Failed to import {nc_dir.name}", + exception=f"{e.__class__.__name__}: {e}", + ) + ) all_statuses = self.import_recipes_to_database(all_recipes)