fix(mirror): rename_note сливает заметки, а не удаляет заметку под ключом (#13)
M-3 (hub#4, PR #2). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
ec49ed64ba
commit
7a2f2e694b
@ -112,12 +112,21 @@ def set_note(conn, key, fields: dict, updated_by: str) -> dict:
|
|||||||
|
|
||||||
|
|
||||||
def rename_note(conn, old_key, new_key) -> None:
|
def rename_note(conn, old_key, new_key) -> None:
|
||||||
"""После создания задачи: заметка с временного ключа переезжает на настоящий (старая запись под новым ключом,
|
"""После создания задачи: заметка с временного ключа переезжает на настоящий. Если под настоящим ключом заметка уже
|
||||||
если вдруг была, уступает место)."""
|
есть — слияние (M-3 #4): поле временной заметки побеждает, если оно непустое; updated_at/updated_by — от более
|
||||||
|
поздней; временная строка удаляется."""
|
||||||
if old_key == new_key:
|
if old_key == new_key:
|
||||||
return
|
return
|
||||||
with db.transaction(conn):
|
with db.transaction(conn):
|
||||||
if get_note(conn, old_key) is None:
|
old = get_note(conn, old_key)
|
||||||
|
if old is None:
|
||||||
return
|
return
|
||||||
conn.execute("DELETE FROM issue_note WHERE key = ?", (new_key,))
|
cur = get_note(conn, new_key)
|
||||||
conn.execute("UPDATE issue_note SET key = ? WHERE key = ?", (new_key, old_key))
|
if cur is None:
|
||||||
|
conn.execute("UPDATE issue_note SET key = ? WHERE key = ?", (new_key, old_key))
|
||||||
|
return
|
||||||
|
merged = [old[f] if old[f] not in (None, "") else cur[f] for f in NOTE_FIELDS]
|
||||||
|
newer = old if (old["updated_at"] or "") >= (cur["updated_at"] or "") else cur
|
||||||
|
conn.execute(f"UPDATE issue_note SET {', '.join(f'{f} = ?' for f in NOTE_FIELDS)}, updated_at = ?, updated_by = ? "
|
||||||
|
"WHERE key = ?", merged + [newer["updated_at"], newer["updated_by"], new_key])
|
||||||
|
conn.execute("DELETE FROM issue_note WHERE key = ?", (old_key,))
|
||||||
|
|||||||
@ -101,3 +101,25 @@ def test_set_note_partial_keeps_other_fields():
|
|||||||
got = mirror.set_note(conn, "A-1", {"fact_status": "Готово"}, "y")
|
got = mirror.set_note(conn, "A-1", {"fact_status": "Готово"}, "y")
|
||||||
assert got["work_kind"] == "разработка" and got["done_text"] == "сделано"
|
assert got["work_kind"] == "разработка" and got["done_text"] == "сделано"
|
||||||
assert got["fact_status"] == "Готово" and got["updated_by"] == "y"
|
assert got["fact_status"] == "Готово" and got["updated_by"] == "y"
|
||||||
|
|
||||||
|
|
||||||
|
def test_rename_note_merges_with_existing():
|
||||||
|
conn = db.connect(":memory:")
|
||||||
|
mirror.set_note(conn, "A-5", {"owner_note": "спросить ИБ", "work_kind": "Старое"}, "human")
|
||||||
|
mirror.set_note(conn, "new:5", {"work_kind": "Аналитика", "fact_status": "В работе"}, "import")
|
||||||
|
mirror.rename_note(conn, "new:5", "A-5")
|
||||||
|
note = mirror.get_note(conn, "A-5")
|
||||||
|
assert note["work_kind"] == "Аналитика" # непустое поле временной заметки побеждает
|
||||||
|
assert note["owner_note"] == "спросить ИБ" # пустое у временной — остаётся под ключом
|
||||||
|
assert note["fact_status"] == "В работе"
|
||||||
|
assert note["updated_by"] == "import" # временная заметка записана позже
|
||||||
|
assert mirror.get_note(conn, "new:5") is None
|
||||||
|
|
||||||
|
|
||||||
|
def test_rename_note_empty_string_does_not_overwrite():
|
||||||
|
conn = db.connect(":memory:")
|
||||||
|
mirror.set_note(conn, "A-6", {"rest_text": "доделать отчёт"}, "human")
|
||||||
|
mirror.set_note(conn, "new:6", {"rest_text": "", "done_text": "сделано"}, "import")
|
||||||
|
mirror.rename_note(conn, "new:6", "A-6")
|
||||||
|
note = mirror.get_note(conn, "A-6")
|
||||||
|
assert note["rest_text"] == "доделать отчёт" and note["done_text"] == "сделано"
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user