From f4a0598f2f3c246cb7721f2a3bc291b3e47209d7 Mon Sep 17 00:00:00 2001 From: Abdo Date: Wed, 26 Mar 2025 08:11:34 +0300 Subject: [PATCH] Return a copy of note type in ModelManager.get() (#3865) * Return a copy of note type in ModelManager.get() * Update tests * Revert "Return a copy of note type in ModelManager.get()" This reverts commit 04ef186336c24253173023dead608bd877fbea65. * Add note to .get() --- pylib/anki/models.py | 5 ++++- pylib/tests/test_decks.py | 4 +++- pylib/tests/test_exporting.py | 4 +++- pylib/tests/test_schedv3.py | 24 ++++++++++++++++++------ 4 files changed, 28 insertions(+), 9 deletions(-) diff --git a/pylib/anki/models.py b/pylib/anki/models.py index fb08fd6f3..4157bef16 100644 --- a/pylib/anki/models.py +++ b/pylib/anki/models.py @@ -151,7 +151,10 @@ class ModelManager(DeprecatedNamesMixin): return None def get(self, id: NotetypeId) -> NotetypeDict | None: - "Get model with ID, or None." + """Get model with ID, or None. + + This returns a reference to a cached dict. Copy the returned model before modifying it if you're not calling .update_dict() afterward. + """ # deal with various legacy input types if id is None: return None diff --git a/pylib/tests/test_decks.py b/pylib/tests/test_decks.py index 42da44e89..ab9b96735 100644 --- a/pylib/tests/test_decks.py +++ b/pylib/tests/test_decks.py @@ -48,7 +48,9 @@ def test_remove(): deck1 = col.decks.id("deck1") note = col.newNote() note["Front"] = "1" - note.note_type()["did"] = deck1 + note_type = note.note_type() + note_type["did"] = deck1 + col.models.update_dict(note_type) col.addNote(note) c = note.cards()[0] assert c.did == deck1 diff --git a/pylib/tests/test_exporting.py b/pylib/tests/test_exporting.py index 7946f2e45..954414d6e 100644 --- a/pylib/tests/test_exporting.py +++ b/pylib/tests/test_exporting.py @@ -35,7 +35,9 @@ def setup1(): note = col.newNote() note["Front"] = "baz" note["Back"] = "qux" - note.note_type()["did"] = col.decks.id("new col") + note_type = note.note_type() + note_type["did"] = col.decks.id("new col") + col.models.update_dict(note_type) col.addNote(note) diff --git a/pylib/tests/test_schedv3.py b/pylib/tests/test_schedv3.py index 442dc0a62..f106e7725 100644 --- a/pylib/tests/test_schedv3.py +++ b/pylib/tests/test_schedv3.py @@ -85,7 +85,9 @@ def test_newLimits(): note = col.newNote() note["Front"] = str(i) if i > 4: - note.note_type()["did"] = deck2 + note_type = note.note_type() + note_type["did"] = deck2 + col.models.update_dict(note_type) col.addNote(note) # give the child deck a different configuration c2 = col.decks.add_config_returning_id("new conf") @@ -936,7 +938,9 @@ def test_deckDue(): # and one that's a child note = col.newNote() note["Front"] = "two" - default1 = note.note_type()["did"] = col.decks.id("Default::1") + note_type = note.note_type() + default1 = note_type["did"] = col.decks.id("Default::1") + col.models.update_dict(note_type) col.addNote(note) # make it a review card c = note.cards()[0] @@ -946,12 +950,16 @@ def test_deckDue(): # add one more with a new deck note = col.newNote() note["Front"] = "two" - note.note_type()["did"] = col.decks.id("foo::bar") + note_type = note.note_type() + note_type["did"] = col.decks.id("foo::bar") + col.models.update_dict(note_type) col.addNote(note) # and one that's a sibling note = col.newNote() note["Front"] = "three" - note.note_type()["did"] = col.decks.id("foo::baz") + note_type = note.note_type() + note_type["did"] = col.decks.id("foo::baz") + col.models.update_dict(note_type) col.addNote(note) assert len(col.decks.all_names_and_ids()) == 5 tree = col.sched.deck_due_tree().children @@ -991,12 +999,16 @@ def test_deckFlow(): # and one that's a child note = col.newNote() note["Front"] = "two" - note.note_type()["did"] = col.decks.id("Default::2") + note_type = note.note_type() + note_type["did"] = col.decks.id("Default::2") + col.models.update_dict(note_type) col.addNote(note) # and another that's higher up note = col.newNote() note["Front"] = "three" - default1 = note.note_type()["did"] = col.decks.id("Default::1") + note_type = note.note_type() + default1 = note_type["did"] = col.decks.id("Default::1") + col.models.update_dict(note_type) col.addNote(note) assert col.sched.counts() == (3, 0, 0) # should get top level one first, then ::1, then ::2