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 04ef186336.

* Add note to .get()
This commit is contained in:
Abdo 2025-03-26 08:11:34 +03:00 committed by GitHub
parent 45bb56808a
commit f4a0598f2f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 28 additions and 9 deletions

View file

@ -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

View file

@ -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

View file

@ -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)

View file

@ -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