fix: Eine Sicherung mit Transfer-Schlagwort laesst sich wieder einspielen

Das feste Zielkonto eines Transfer-Schlagworts behielt beim Wiederherstellen
die alte Konto-Nummer. Die Nummern werden dabei aber neu vergeben, also lief
es ins Leere – und zwar so, dass die GANZE Wiederherstellung mit einem
Fremdschluessel-Fehler abbrach, nicht nur diese eine Zeile. Wer je ein
Zielkonto gewaehlt hatte, kam an seine Sicherung nicht mehr heran.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-10-19 07:16:03 +02:00
co-authored by Claude Opus 5
parent e8c18adafb
commit a9ea0432d8
2 changed files with 60 additions and 1 deletions
+19 -1
View File
@@ -55,7 +55,9 @@ from ..models import (
LinkIgnored,
PlannedIncomeLine,
RecoveryCode,
Tag,
Transaction,
TransactionTag,
TransferLink,
User,
UserSetting,
@@ -135,8 +137,14 @@ USER_TABLES: list[TableSpec] = [
{"budget_period_id": "budget_periods", "category_id": "categories"},
label="Budget-Monatswerte"),
TableSpec("dashboard_layouts", DashboardLayout, "owner", label="Dashboard-Layout"),
# target_account_id gehört dazu: Ein Transfer-Schlagwort mit festem
# Zielkonto trug sonst die ALTE Konto-Nummer in die neue Datenbank, und die
# Wiederherstellung brach mit einem Fremdschlüssel-Fehler ab – nicht nur
# diese Zeile, die ganze Sicherung liess sich nicht mehr einspielen.
# accounts steht weiter oben, die Übersetzung greift also.
TableSpec("categorization_rules", CategorizationRule, "owner",
{"category_id": "categories"}, label="Schlagwortregeln"),
{"category_id": "categories", "target_account_id": "accounts"},
label="Schlagwortregeln"),
TableSpec("user_settings", UserSetting, "user", has_id=False,
label="Persönliche Einstellungen"),
# Der Eingang MUSS mitgesichert werden: Er hält fest, welche Zahlungen
@@ -154,6 +162,12 @@ USER_TABLES: list[TableSpec] = [
TableSpec("link_ignored", LinkIgnored, "owner",
{"a_txn_id": "transactions", "b_txn_id": "transactions"},
label="Abgelehnte Übertrags-Vorschläge"),
# Erst die Tags, dann die Zuordnung – ein refs-Verweis darf nur auf eine
# schon eingefügte Tabelle zeigen.
TableSpec("tags", Tag, "owner", label="Tags"),
TableSpec("transaction_tags", TransactionTag, "owner",
{"transaction_id": "transactions", "tag_id": "tags"},
label="Tag-Zuordnungen"),
# Ohne die Geräteschlüssel hört der Kurzbefehl auf dem Telefon nach einem
# Wiedereinspielen stillschweigend auf zu funktionieren. Gesichert wird nur
# der Hash – der Klartext existiert nirgends.
@@ -412,6 +426,10 @@ _MERGE_KEYS: dict[str, Callable[[dict], tuple | None]] = {
# Vertrags ein zweites Mal an – und scheitert an seinem Schluessel, womit
# die ganze Wiederherstellung kippt. Es gibt genau eins je Vertrag.
"subscription_logos": lambda r: ("logo", r.get("subscription_id")),
# Ohne die beiden Einträge scheitert ein zweiter Ergänzen-Lauf an
# (owner_id, name) bzw. (transaction_id, tag_id).
"tags": lambda r: ("name", (r.get("name") or "").strip().lower()),
"transaction_tags": lambda r: ("zuordnung", r.get("transaction_id"), r.get("tag_id")),
"transactions": lambda r: (
("uid", r["source_uid"]) if r.get("source_uid")
else ("hash", r["import_hash"]) if r.get("import_hash")