From 2abf5d9f7f27a80cf747ca6c2667c2c1599da9e1 Mon Sep 17 00:00:00 2001 From: Michael Genson <71845777+michael-genson@users.noreply.github.com> Date: Sat, 13 Jan 2024 18:51:42 +0000 Subject: [PATCH 1/9] added more test data --- tests/data/__init__.py | 3 +++ .../backups/backup_version_44e8d670719d_3.zip | Bin 0 -> 105664 bytes .../backup_v2_tests/test_backup_v2.py | 1 + 3 files changed, 4 insertions(+) create mode 100644 tests/data/backups/backup_version_44e8d670719d_3.zip diff --git a/tests/data/__init__.py b/tests/data/__init__.py index 4a3290ac5d4..fe09b5eff85 100644 --- a/tests/data/__init__.py +++ b/tests/data/__init__.py @@ -10,6 +10,9 @@ backup_version_44e8d670719d_2 = CWD / "backups/backup_version_44e8d670719d_2.zip" """44e8d670719d: add extras to shopping lists, list items, and ingredient foods""" +backup_version_44e8d670719d_3 = CWD / "backups/backup_version_44e8d670719d_3.zip" +"""44e8d670719d: add extras to shopping lists, list items, and ingredient foods""" + backup_version_ba1e4a6cfe99_1 = CWD / "backups/backup_version_ba1e4a6cfe99_1.zip" """ba1e4a6cfe99: added plural names and alias tables for foods and units""" diff --git a/tests/data/backups/backup_version_44e8d670719d_3.zip b/tests/data/backups/backup_version_44e8d670719d_3.zip new file mode 100644 index 0000000000000000000000000000000000000000..238dd46cd099d3bfb261d823448e453917812cef GIT binary patch literal 105664 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%0ABIJ8@y91-t~Y8h8nH!?4&`ztRe#0k7B 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%0D8$iy^+ptHi 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 E0|K57rvLx| literal 0 HcmV?d00001 diff --git a/tests/unit_tests/services_tests/backup_v2_tests/test_backup_v2.py b/tests/unit_tests/services_tests/backup_v2_tests/test_backup_v2.py index 1451f482c22..4e92c985435 100644 --- a/tests/unit_tests/services_tests/backup_v2_tests/test_backup_v2.py +++ b/tests/unit_tests/services_tests/backup_v2_tests/test_backup_v2.py @@ -73,6 +73,7 @@ def test_database_restore(): [ test_data.backup_version_44e8d670719d_1, test_data.backup_version_44e8d670719d_2, + test_data.backup_version_44e8d670719d_3, test_data.backup_version_ba1e4a6cfe99_1, test_data.backup_version_bcfdad6b7355_1, ], From 987d59455714b62c0045d296156265eb1a456b41 Mon Sep 17 00:00:00 2001 From: Michael Genson <71845777+michael-genson@users.noreply.github.com> Date: Sat, 13 Jan 2024 21:22:52 +0000 Subject: [PATCH 2/9] added missing pytest id --- .../unit_tests/services_tests/backup_v2_tests/test_backup_v2.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/unit_tests/services_tests/backup_v2_tests/test_backup_v2.py b/tests/unit_tests/services_tests/backup_v2_tests/test_backup_v2.py index 4e92c985435..7f74b8761b0 100644 --- a/tests/unit_tests/services_tests/backup_v2_tests/test_backup_v2.py +++ b/tests/unit_tests/services_tests/backup_v2_tests/test_backup_v2.py @@ -80,6 +80,7 @@ def test_database_restore(): ids=[ "44e8d670719d_1: add extras to shopping lists, list items, and ingredient foods", "44e8d670719d_2: add extras to shopping lists, list items, and ingredient foods", + "44e8d670719d_3: add extras to shopping lists, list items, and ingredient foods", "ba1e4a6cfe99_1: added plural names and alias tables for foods and units", "bcfdad6b7355_1: remove tool name and slug unique contraints", ], From 1070e811cbeaa4ce4224cab1e57b6c5f87a3d0f7 Mon Sep 17 00:00:00 2001 From: Michael Genson <71845777+michael-genson@users.noreply.github.com> Date: Sun, 14 Jan 2024 22:26:02 +0000 Subject: [PATCH 3/9] add fk validation to backup restore --- .../services/backups_v2/alchemy_exporter.py | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/mealie/services/backups_v2/alchemy_exporter.py b/mealie/services/backups_v2/alchemy_exporter.py index 5ad2ac20c5a..e2d51b4e690 100644 --- a/mealie/services/backups_v2/alchemy_exporter.py +++ b/mealie/services/backups_v2/alchemy_exporter.py @@ -1,4 +1,5 @@ import datetime +import typing import uuid from os import path from pathlib import Path @@ -15,6 +16,9 @@ from mealie.db.models._model_utils import GUID from mealie.services._base_service import BaseService +if typing.TYPE_CHECKING: + from sqlalchemy import ForeignKey, Table + PROJECT_DIR = Path(__file__).parent.parent.parent.parent @@ -48,6 +52,20 @@ def is_uuid(value: str) -> bool: except ValueError: return False + @staticmethod + def is_valid_foreign_key(db_dump: dict[str, list[dict]], fk: ForeignKey, fk_value: typing.Any) -> bool: + if not fk_value: + return True + + foreign_table_name = fk.column.table.name + foreign_field_name = fk.column.name + + for row in db_dump.get(foreign_table_name, []): + if row[foreign_field_name] == fk_value: + return True + + return False + def convert_types(self, data: dict) -> dict: """ walks the dictionary to restore all things that look like string representations of their complex types @@ -70,6 +88,21 @@ def convert_types(self, data: dict) -> dict: data[key] = self.DateTimeParser(time=value).time return data + def clean_rows(self, db_dump: dict[str, list[dict]], table: Table, rows: list[dict]) -> list[dict]: + fks = table.foreign_keys + + valid_rows = [] + for row in rows: + is_valid_row = True + for fk in fks: + if not self.is_valid_foreign_key(db_dump, fk, row.get(fk.name)): + continue + + if is_valid_row: + valid_rows.append(row) + + return valid_rows + def dump_schema(self) -> dict: """ Returns the schema of the SQLAlchemy database as a python dictionary. This dictionary is wrapped by @@ -125,6 +158,7 @@ def restore(self, db_dump: dict) -> None: if not rows: continue table = self.meta.tables[table_name] + rows = self.clean_rows(db_dump, table, rows) connection.execute(table.delete()) connection.execute(insert(table), rows) From a5159211aa645e6636c3e23ab5a12d88ce361a9e Mon Sep 17 00:00:00 2001 From: Michael Genson <71845777+michael-genson@users.noreply.github.com> Date: Sun, 14 Jan 2024 22:28:41 +0000 Subject: [PATCH 4/9] removed bad type imports --- mealie/services/backups_v2/alchemy_exporter.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/mealie/services/backups_v2/alchemy_exporter.py b/mealie/services/backups_v2/alchemy_exporter.py index e2d51b4e690..5bec39fdaa7 100644 --- a/mealie/services/backups_v2/alchemy_exporter.py +++ b/mealie/services/backups_v2/alchemy_exporter.py @@ -6,7 +6,7 @@ from fastapi.encoders import jsonable_encoder from pydantic import BaseModel -from sqlalchemy import ForeignKeyConstraint, MetaData, create_engine, insert, text +from sqlalchemy import ForeignKey, ForeignKeyConstraint, MetaData, Table, create_engine, insert, text from sqlalchemy.engine import base from sqlalchemy.orm import sessionmaker @@ -16,9 +16,6 @@ from mealie.db.models._model_utils import GUID from mealie.services._base_service import BaseService -if typing.TYPE_CHECKING: - from sqlalchemy import ForeignKey, Table - PROJECT_DIR = Path(__file__).parent.parent.parent.parent @@ -89,6 +86,10 @@ def convert_types(self, data: dict) -> dict: return data def clean_rows(self, db_dump: dict[str, list[dict]], table: Table, rows: list[dict]) -> list[dict]: + """ + Checks rows against foreign key restraints and removes any rows that would violate them + """ + fks = table.foreign_keys valid_rows = [] From f75265630955becfbe45e246984980d78664d3a9 Mon Sep 17 00:00:00 2001 From: Michael Genson <71845777+michael-genson@users.noreply.github.com> Date: Sun, 14 Jan 2024 22:41:34 +0000 Subject: [PATCH 5/9] actually apply the invalid fk filter and clean up types --- mealie/services/backups_v2/alchemy_exporter.py | 11 +++++++---- mealie/services/backups_v2/backup_v2.py | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/mealie/services/backups_v2/alchemy_exporter.py b/mealie/services/backups_v2/alchemy_exporter.py index 5bec39fdaa7..5268d098ab7 100644 --- a/mealie/services/backups_v2/alchemy_exporter.py +++ b/mealie/services/backups_v2/alchemy_exporter.py @@ -1,8 +1,8 @@ import datetime -import typing import uuid from os import path from pathlib import Path +from typing import Any from fastapi.encoders import jsonable_encoder from pydantic import BaseModel @@ -42,7 +42,7 @@ def __init__(self, connection_str: str) -> None: self.session_maker = sessionmaker(bind=self.engine) @staticmethod - def is_uuid(value: str) -> bool: + def is_uuid(value: Any) -> bool: try: uuid.UUID(value) return True @@ -50,7 +50,7 @@ def is_uuid(value: str) -> bool: return False @staticmethod - def is_valid_foreign_key(db_dump: dict[str, list[dict]], fk: ForeignKey, fk_value: typing.Any) -> bool: + def is_valid_foreign_key(db_dump: dict[str, list[dict]], fk: ForeignKey, fk_value: Any) -> bool: if not fk_value: return True @@ -96,9 +96,12 @@ def clean_rows(self, db_dump: dict[str, list[dict]], table: Table, rows: list[di for row in rows: is_valid_row = True for fk in fks: - if not self.is_valid_foreign_key(db_dump, fk, row.get(fk.name)): + if self.is_valid_foreign_key(db_dump, fk, row.get(fk.name)): continue + is_valid_row = False + break + if is_valid_row: valid_rows.append(row) diff --git a/mealie/services/backups_v2/backup_v2.py b/mealie/services/backups_v2/backup_v2.py index f5b6b2b814c..0123ef90bcc 100644 --- a/mealie/services/backups_v2/backup_v2.py +++ b/mealie/services/backups_v2/backup_v2.py @@ -69,7 +69,7 @@ def _copy_data(self, data_path: Path) -> None: shutil.copytree(f, self.directories.DATA_DIR / f.name) def restore(self, backup_path: Path) -> None: - self.logger.info("initially backup restore") + self.logger.info("initializing backup restore") backup = BackupFile(backup_path) From d1e20ff071dc6b4dfdff01f7979bc69c04df5fd2 Mon Sep 17 00:00:00 2001 From: Michael Genson <71845777+michael-genson@users.noreply.github.com> Date: Sun, 14 Jan 2024 23:08:36 +0000 Subject: [PATCH 6/9] fix key name --- mealie/services/backups_v2/alchemy_exporter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mealie/services/backups_v2/alchemy_exporter.py b/mealie/services/backups_v2/alchemy_exporter.py index 5268d098ab7..11acf127f0f 100644 --- a/mealie/services/backups_v2/alchemy_exporter.py +++ b/mealie/services/backups_v2/alchemy_exporter.py @@ -96,7 +96,7 @@ def clean_rows(self, db_dump: dict[str, list[dict]], table: Table, rows: list[di for row in rows: is_valid_row = True for fk in fks: - if self.is_valid_foreign_key(db_dump, fk, row.get(fk.name)): + if self.is_valid_foreign_key(db_dump, fk, row.get(fk.parent.name)): continue is_valid_row = False From 8e20b76292742db402d6994c6c21ea5ab00f7690 Mon Sep 17 00:00:00 2001 From: Michael Genson <71845777+michael-genson@users.noreply.github.com> Date: Mon, 15 Jan 2024 15:45:30 +0000 Subject: [PATCH 7/9] added log when removing bad rows --- mealie/services/backups_v2/alchemy_exporter.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mealie/services/backups_v2/alchemy_exporter.py b/mealie/services/backups_v2/alchemy_exporter.py index 11acf127f0f..326505df430 100644 --- a/mealie/services/backups_v2/alchemy_exporter.py +++ b/mealie/services/backups_v2/alchemy_exporter.py @@ -12,6 +12,7 @@ from alembic import command from alembic.config import Config +from mealie.core.root_logger import get_logger from mealie.db import init_db from mealie.db.models._model_utils import GUID from mealie.services._base_service import BaseService @@ -96,10 +97,15 @@ def clean_rows(self, db_dump: dict[str, list[dict]], table: Table, rows: list[di for row in rows: is_valid_row = True for fk in fks: + fk_value = row.get(fk.parent.name) if self.is_valid_foreign_key(db_dump, fk, row.get(fk.parent.name)): continue is_valid_row = False + self.logger.info( + f"Removing row from table {table.name} because of invalid foreign key {fk.parent.name}: {fk_value}" + ) + self.logger.info(f"Row: {row}") break if is_valid_row: From 262dc343538006b77fe232ed8b6604f598449f5e Mon Sep 17 00:00:00 2001 From: Michael Genson <71845777+michael-genson@users.noreply.github.com> Date: Mon, 15 Jan 2024 15:48:39 +0000 Subject: [PATCH 8/9] removed unused import --- mealie/services/backups_v2/alchemy_exporter.py | 1 - 1 file changed, 1 deletion(-) diff --git a/mealie/services/backups_v2/alchemy_exporter.py b/mealie/services/backups_v2/alchemy_exporter.py index 326505df430..07cb76f7c9c 100644 --- a/mealie/services/backups_v2/alchemy_exporter.py +++ b/mealie/services/backups_v2/alchemy_exporter.py @@ -12,7 +12,6 @@ from alembic import command from alembic.config import Config -from mealie.core.root_logger import get_logger from mealie.db import init_db from mealie.db.models._model_utils import GUID from mealie.services._base_service import BaseService From 151500723da3798d72a6b25cd1c0d203a9a67333 Mon Sep 17 00:00:00 2001 From: Michael Genson <71845777+michael-genson@users.noreply.github.com> Date: Mon, 15 Jan 2024 15:51:21 +0000 Subject: [PATCH 9/9] bumped info to warning --- mealie/services/backups_v2/alchemy_exporter.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mealie/services/backups_v2/alchemy_exporter.py b/mealie/services/backups_v2/alchemy_exporter.py index 07cb76f7c9c..d21f9fdbfa0 100644 --- a/mealie/services/backups_v2/alchemy_exporter.py +++ b/mealie/services/backups_v2/alchemy_exporter.py @@ -101,10 +101,10 @@ def clean_rows(self, db_dump: dict[str, list[dict]], table: Table, rows: list[di continue is_valid_row = False - self.logger.info( + self.logger.warning( f"Removing row from table {table.name} because of invalid foreign key {fk.parent.name}: {fk_value}" ) - self.logger.info(f"Row: {row}") + self.logger.warning(f"Row: {row}") break if is_valid_row: