From ade7f438ce81bc9eae38bf28f3b62d2389661567 Mon Sep 17 00:00:00 2001 From: Damien Elmes Date: Thu, 3 Sep 2020 18:02:47 +1000 Subject: [PATCH] rebuild_filtered_deck() and new_filtered() --- pylib/anki/decks.py | 6 +++++- pylib/anki/schedv2.py | 18 +++++++++--------- pylib/tests/test_decks.py | 2 +- pylib/tests/test_schedv1.py | 36 ++++++++++++++++++------------------ pylib/tests/test_schedv2.py | 22 +++++++++++----------- qt/aqt/customstudy.py | 4 ++-- qt/aqt/dyndeckconf.py | 2 +- qt/aqt/main.py | 2 +- qt/aqt/overview.py | 4 ++-- 9 files changed, 50 insertions(+), 46 deletions(-) diff --git a/pylib/anki/decks.py b/pylib/anki/decks.py index 2da3cbe9c..a6284950e 100644 --- a/pylib/anki/decks.py +++ b/pylib/anki/decks.py @@ -556,7 +556,7 @@ class DeckManager: # Dynamic decks ########################################################################## - def newDyn(self, name: str) -> int: + def new_filtered(self, name: str) -> int: "Return a new dynamic deck and set it as the current deck." did = self.id(name, type=1) self.select(did) @@ -565,3 +565,7 @@ class DeckManager: # 1 for dyn, 0 for standard def isDyn(self, did: Union[int, str]) -> int: return self.get(did)["dyn"] + + # legacy + + newDyn = new_filtered diff --git a/pylib/anki/schedv2.py b/pylib/anki/schedv2.py index dbec53d3d..1b3660a7d 100644 --- a/pylib/anki/schedv2.py +++ b/pylib/anki/schedv2.py @@ -1070,15 +1070,6 @@ select id from cards where did in %s and queue = {QUEUE_TYPE_REV} and due <= ? l def empty_filtered_deck(self, deck_id: int) -> None: self.col.backend.empty_filtered_deck(deck_id) - def rebuildDyn(self, did: Optional[int] = None) -> Optional[int]: - did = did or self.col.decks.selected() - count = self.rebuild_filtered_deck(did) or None - if not count: - return None - # and change to our new deck - self.col.decks.select(did) - return count - def _removeFromFiltered(self, card: Card) -> None: if card.odid: card.did = card.odid @@ -1102,6 +1093,15 @@ select id from cards where did in %s and queue = {QUEUE_TYPE_REV} and due <= ? l # legacy + def rebuildDyn(self, did: Optional[int] = None) -> Optional[int]: + did = did or self.col.decks.selected() + count = self.rebuild_filtered_deck(did) or None + if not count: + return None + # and change to our new deck + self.col.decks.select(did) + return count + def emptyDyn(self, did: Optional[int], lim: Optional[str] = None) -> None: if lim is None: self.empty_filtered_deck(did) diff --git a/pylib/tests/test_decks.py b/pylib/tests/test_decks.py index 4dbe61551..59fb8e130 100644 --- a/pylib/tests/test_decks.py +++ b/pylib/tests/test_decks.py @@ -84,7 +84,7 @@ def test_rename(): for n in "yo", "yo::two", "yo::two::three": assert n in names # over filtered - filteredId = col.decks.newDyn("filtered") + filteredId = col.decks.new_filtered("filtered") filtered = col.decks.get(filteredId) childId = col.decks.id("child") child = col.decks.get(childId) diff --git a/pylib/tests/test_schedv1.py b/pylib/tests/test_schedv1.py index 407eddd12..fe5452cb1 100644 --- a/pylib/tests/test_schedv1.py +++ b/pylib/tests/test_schedv1.py @@ -545,8 +545,8 @@ def test_suspend(): # should cope with cards in cram decks c.due = 1 c.flush() - col.decks.newDyn("tmp") - col.sched.rebuildDyn() + did = col.decks.new_filtered("tmp") + col.sched.rebuild_filtered_deck(did) c.load() assert c.due != 1 assert c.did != 1 @@ -575,8 +575,8 @@ def test_cram(): assert col.sched.counts() == (0, 0, 0) cardcopy = copy.copy(c) # create a dynamic deck and refresh it - did = col.decks.newDyn("Cram") - col.sched.rebuildDyn(did) + did = col.decks.new_filtered("Cram") + col.sched.rebuild_filtered_deck(did) col.reset() # should appear as new in the deck list assert sorted(col.sched.deck_due_tree().children)[0].new_count == 1 @@ -616,7 +616,7 @@ def test_cram(): # and it will have moved back to the previous deck assert c.did == 1 # cram the deck again - col.sched.rebuildDyn(did) + col.sched.rebuild_filtered_deck(did) col.reset() c = col.sched.getCard() # check ivls again - passing should be idempotent @@ -646,8 +646,8 @@ def test_cram(): col.reset() assert col.sched.counts() == (0, 0, 1) # cram again - did = col.decks.newDyn("Cram") - col.sched.rebuildDyn(did) + did = col.decks.new_filtered("Cram") + col.sched.rebuild_filtered_deck(did) col.reset() assert col.sched.counts() == (0, 0, 1) c.load() @@ -673,8 +673,8 @@ def test_cram_rem(): note["Front"] = "one" col.addNote(note) oldDue = note.cards()[0].due - did = col.decks.newDyn("Cram") - col.sched.rebuildDyn(did) + did = col.decks.new_filtered("Cram") + col.sched.rebuild_filtered_deck(did) col.reset() c = col.sched.getCard() col.sched.answerCard(c, 2) @@ -695,11 +695,11 @@ def test_cram_resched(): note["Front"] = "one" col.addNote(note) # cram deck - did = col.decks.newDyn("Cram") + did = col.decks.new_filtered("Cram") cram = col.decks.get(did) cram["resched"] = False col.decks.save(cram) - col.sched.rebuildDyn(did) + col.sched.rebuild_filtered_deck(did) col.reset() # graduate should return it to new c = col.sched.getCard() @@ -718,7 +718,7 @@ def test_cram_resched(): c.factor = STARTING_FACTOR c.flush() cardcopy = copy.copy(c) - col.sched.rebuildDyn(did) + col.sched.rebuild_filtered_deck(did) col.reset() c = col.sched.getCard() assert ni(c, 1) == 600 @@ -730,7 +730,7 @@ def test_cram_resched(): # check failure too c = cardcopy c.flush() - col.sched.rebuildDyn(did) + col.sched.rebuild_filtered_deck(did) col.reset() c = col.sched.getCard() col.sched.answerCard(c, 1) @@ -741,7 +741,7 @@ def test_cram_resched(): # fail+grad early c = cardcopy c.flush() - col.sched.rebuildDyn(did) + col.sched.rebuild_filtered_deck(did) col.reset() c = col.sched.getCard() col.sched.answerCard(c, 1) @@ -754,7 +754,7 @@ def test_cram_resched(): c = cardcopy c.due = -25 c.flush() - col.sched.rebuildDyn(did) + col.sched.rebuild_filtered_deck(did) col.reset() c = col.sched.getCard() col.sched.answerCard(c, 3) @@ -766,7 +766,7 @@ def test_cram_resched(): c = cardcopy c.due = -25 c.flush() - col.sched.rebuildDyn(did) + col.sched.rebuild_filtered_deck(did) col.reset() c = col.sched.getCard() col.sched.answerCard(c, 1) @@ -778,7 +778,7 @@ def test_cram_resched(): c = cardcopy c.due = -25 c.flush() - col.sched.rebuildDyn(did) + col.sched.rebuild_filtered_deck(did) col.reset() c = col.sched.getCard() col.sched.answerCard(c, 1) @@ -789,7 +789,7 @@ def test_cram_resched(): # lapsed card pulled into cram # col.sched._cardConf(c)['lapse']['mult']=0.5 # col.sched.answerCard(c, 1) - # col.sched.rebuildDyn(did) + # col.sched.rebuild_filtered_deck(did) # col.reset() # c = col.sched.getCard() # col.sched.answerCard(c, 2) diff --git a/pylib/tests/test_schedv2.py b/pylib/tests/test_schedv2.py index fdd906d88..f09a63094 100644 --- a/pylib/tests/test_schedv2.py +++ b/pylib/tests/test_schedv2.py @@ -668,8 +668,8 @@ def test_suspend(): # should cope with cards in cram decks c.due = 1 c.flush() - col.decks.newDyn("tmp") - col.sched.rebuildDyn() + did = col.decks.new_filtered("tmp") + col.sched.rebuild_filtered_deck(did) c.load() assert c.due != 1 assert c.did != 1 @@ -698,8 +698,8 @@ def test_filt_reviewing_early_normal(): col.reset() assert col.sched.counts() == (0, 0, 0) # create a dynamic deck and refresh it - did = col.decks.newDyn("Cram") - col.sched.rebuildDyn(did) + did = col.decks.new_filtered("Cram") + col.sched.rebuild_filtered_deck(did) col.reset() # should appear as normal in the deck list assert sorted(col.sched.deck_due_tree().children)[0].review_count == 1 @@ -727,7 +727,7 @@ def test_filt_reviewing_early_normal(): c.ivl = 100 c.due = col.sched.today + 75 c.flush() - col.sched.rebuildDyn(did) + col.sched.rebuild_filtered_deck(did) col.reset() c = col.sched.getCard() @@ -758,8 +758,8 @@ def test_filt_keep_lrn_state(): assert c.type == CARD_TYPE_LRN and c.queue == QUEUE_TYPE_LRN # create a dynamic deck and refresh it - did = col.decks.newDyn("Cram") - col.sched.rebuildDyn(did) + did = col.decks.new_filtered("Cram") + col.sched.rebuild_filtered_deck(did) col.reset() # card should still be in learning state @@ -792,11 +792,11 @@ def test_preview(): note2["Front"] = "two" col.addNote(note2) # cram deck - did = col.decks.newDyn("Cram") + did = col.decks.new_filtered("Cram") cram = col.decks.get(did) cram["resched"] = False col.decks.save(cram) - col.sched.rebuildDyn(did) + col.sched.rebuild_filtered_deck(did) col.reset() # grab the first card c = col.sched.getCard() @@ -1253,8 +1253,8 @@ def test_negativeDueFilter(): c.flush() # into and out of filtered deck - did = col.decks.newDyn("Cram") - col.sched.rebuildDyn(did) + did = col.decks.new_filtered("Cram") + col.sched.rebuild_filtered_deck(did) col.sched.empty_filtered_deck(did) col.reset() diff --git a/qt/aqt/customstudy.py b/qt/aqt/customstudy.py index 6a36479d7..bf049575e 100644 --- a/qt/aqt/customstudy.py +++ b/qt/aqt/customstudy.py @@ -150,7 +150,7 @@ class CustomStudy(QDialog): dyn = cur self.mw.col.decks.select(cur["id"]) else: - did = self.mw.col.decks.newDyn(_("Custom Study Session")) + did = self.mw.col.decks.new_filtered(_("Custom Study Session")) dyn = self.mw.col.decks.get(did) # and then set various options if i == RADIO_FORGOT: @@ -186,7 +186,7 @@ class CustomStudy(QDialog): self.mw.col.decks.save(dyn) # generate cards self.created_custom_study = True - if not self.mw.col.sched.rebuildDyn(): + if not self.mw.col.sched.rebuild_filtered_deck(dyn["id"]): return showWarning(_("No cards matched the criteria you provided.")) self.mw.moveToState("overview") QDialog.accept(self) diff --git a/qt/aqt/dyndeckconf.py b/qt/aqt/dyndeckconf.py index 91c5d89e6..b1c018193 100644 --- a/qt/aqt/dyndeckconf.py +++ b/qt/aqt/dyndeckconf.py @@ -122,7 +122,7 @@ class DeckConf(QDialog): def accept(self): if not self.saveConf(): return - if not self.mw.col.sched.rebuildDyn(): + if not self.mw.col.sched.rebuild_filtered_deck(self.deck["id"]): if askUser( _( """\ diff --git a/qt/aqt/main.py b/qt/aqt/main.py index f9b80ef3a..25be4c4ac 100644 --- a/qt/aqt/main.py +++ b/qt/aqt/main.py @@ -1159,7 +1159,7 @@ title="%s" %s>%s""" % ( while self.col.decks.id_for_name(_("Filtered Deck %d") % n): n += 1 name = _("Filtered Deck %d") % n - did = self.col.decks.newDyn(name) + did = self.col.decks.new_filtered(name) diag = aqt.dyndeckconf.DeckConf(self, first=True, search=search) if not diag.ok: # user cancelled first config diff --git a/qt/aqt/overview.py b/qt/aqt/overview.py index 430eefd2b..bc02b4e85 100644 --- a/qt/aqt/overview.py +++ b/qt/aqt/overview.py @@ -76,7 +76,7 @@ class Overview: deck = self.mw.col.decks.current() self.mw.onCram("'deck:%s'" % deck["name"]) elif url == "refresh": - self.mw.col.sched.rebuildDyn() + self.mw.col.sched.rebuild_filtered_deck(self.mw.col.decks.selected()) self.mw.reset() elif url == "empty": self.mw.col.sched.empty_filtered_deck(self.mw.col.decks.selected()) @@ -107,7 +107,7 @@ class Overview: def onRebuildKey(self): if self._filteredDeck(): - self.mw.col.sched.rebuildDyn() + self.mw.col.sched.rebuild_filtered_deck(self.mw.col.decks.selected()) self.mw.reset() def onEmptyKey(self):