diff --git a/pylib/anki/schedv2.py b/pylib/anki/schedv2.py index b91aed151..dbec53d3d 100644 --- a/pylib/anki/schedv2.py +++ b/pylib/anki/schedv2.py @@ -1064,42 +1064,21 @@ select id from cards where did in %s and queue = {QUEUE_TYPE_REV} and due <= ? l # Filtered deck handling ########################################################################## - _restoreQueueWhenEmptyingSnippet = f""" -queue = (case when queue < 0 then queue - when type in (1,{CARD_TYPE_RELEARNING}) then - (case when (case when odue then odue else due end) > 1000000000 then 1 else - {QUEUE_TYPE_DAY_LEARN_RELEARN} end) -else - type -end) -""" + def rebuild_filtered_deck(self, deck_id: int) -> int: + return self.col.backend.rebuild_filtered_deck(deck_id) + + 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]: - "Rebuild a filtered deck." did = did or self.col.decks.selected() - count = self.col.backend.rebuild_filtered_deck(did) or None + 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.col.backend.empty_filtered_deck(did) - return - - self.col.db.execute( - """ -update cards set did = odid, %s, -due = (case when odue>0 then odue else due end), odue = 0, odid = 0, usn = ? where %s""" - % (self._restoreQueueWhenEmptyingSnippet, lim), - self.col.usn(), - ) - - def remFromDyn(self, cids: List[int]) -> None: - self.emptyDyn(None, "id in %s and odid" % ids2str(cids)) - def _removeFromFiltered(self, card: Card) -> None: if card.odid: card.did = card.odid @@ -1121,6 +1100,33 @@ due = (case when odue>0 then odue else due end), odue = 0, odid = 0, usn = ? whe else: card.queue = card.type + # legacy + + def emptyDyn(self, did: Optional[int], lim: Optional[str] = None) -> None: + if lim is None: + self.empty_filtered_deck(did) + return + + queue = f""" +queue = (case when queue < 0 then queue + when type in (1,{CARD_TYPE_RELEARNING}) then + (case when (case when odue then odue else due end) > 1000000000 then 1 else + {QUEUE_TYPE_DAY_LEARN_RELEARN} end) +else + type +end) +""" + self.col.db.execute( + """ +update cards set did = odid, %s, +due = (case when odue>0 then odue else due end), odue = 0, odid = 0, usn = ? where %s""" + % (queue, lim), + self.col.usn(), + ) + + def remFromDyn(self, cids: List[int]) -> None: + self.emptyDyn(None, "id in %s and odid" % ids2str(cids)) + # Leeches ########################################################################## diff --git a/pylib/tests/test_schedv1.py b/pylib/tests/test_schedv1.py index 025ec55de..407eddd12 100644 --- a/pylib/tests/test_schedv1.py +++ b/pylib/tests/test_schedv1.py @@ -682,7 +682,7 @@ def test_cram_rem(): assert c.type == CARD_TYPE_LRN and c.queue == QUEUE_TYPE_LRN assert c.due != oldDue # if we terminate cramming prematurely it should be set back to new - col.sched.emptyDyn(did) + col.sched.empty_filtered_deck(did) c.load() assert c.type == CARD_TYPE_NEW and c.queue == QUEUE_TYPE_NEW assert c.due == oldDue @@ -734,7 +734,7 @@ def test_cram_resched(): col.reset() c = col.sched.getCard() col.sched.answerCard(c, 1) - col.sched.emptyDyn(did) + col.sched.empty_filtered_deck(did) c.load() assert c.ivl == 100 assert c.due == col.sched.today + 25 @@ -746,7 +746,7 @@ def test_cram_resched(): c = col.sched.getCard() col.sched.answerCard(c, 1) col.sched.answerCard(c, 3) - col.sched.emptyDyn(did) + col.sched.empty_filtered_deck(did) c.load() assert c.ivl == 100 assert c.due == col.sched.today + 25 @@ -758,7 +758,7 @@ def test_cram_resched(): col.reset() c = col.sched.getCard() col.sched.answerCard(c, 3) - col.sched.emptyDyn(did) + col.sched.empty_filtered_deck(did) c.load() assert c.ivl == 100 assert c.due == -25 @@ -770,7 +770,7 @@ def test_cram_resched(): col.reset() c = col.sched.getCard() col.sched.answerCard(c, 1) - col.sched.emptyDyn(did) + col.sched.empty_filtered_deck(did) c.load() assert c.ivl == 100 assert c.due == -25 diff --git a/pylib/tests/test_schedv2.py b/pylib/tests/test_schedv2.py index 6e928ae7b..fdd906d88 100644 --- a/pylib/tests/test_schedv2.py +++ b/pylib/tests/test_schedv2.py @@ -773,7 +773,7 @@ def test_filt_keep_lrn_state(): assert c.due - intTime() > 60 * 60 # emptying the deck preserves learning state - col.sched.emptyDyn(did) + col.sched.empty_filtered_deck(did) c.load() assert c.type == CARD_TYPE_LRN and c.queue == QUEUE_TYPE_LRN assert c.left == 1001 @@ -823,7 +823,7 @@ def test_preview(): assert c.id == orig.id # emptying the filtered deck should restore card - col.sched.emptyDyn(did) + col.sched.empty_filtered_deck(did) c.load() assert c.queue == QUEUE_TYPE_NEW assert c.reps == 0 @@ -1255,7 +1255,7 @@ def test_negativeDueFilter(): # into and out of filtered deck did = col.decks.newDyn("Cram") col.sched.rebuildDyn(did) - col.sched.emptyDyn(did) + col.sched.empty_filtered_deck(did) col.reset() c.load() diff --git a/qt/aqt/customstudy.py b/qt/aqt/customstudy.py index 1b5debc8e..6a36479d7 100644 --- a/qt/aqt/customstudy.py +++ b/qt/aqt/customstudy.py @@ -145,7 +145,7 @@ class CustomStudy(QDialog): return QDialog.accept(self) else: # safe to empty - self.mw.col.sched.emptyDyn(cur["id"]) + self.mw.col.sched.empty_filtered_deck(cur["id"]) # reuse; don't delete as it may have children dyn = cur self.mw.col.decks.select(cur["id"]) diff --git a/qt/aqt/overview.py b/qt/aqt/overview.py index 58f49c005..430eefd2b 100644 --- a/qt/aqt/overview.py +++ b/qt/aqt/overview.py @@ -79,7 +79,7 @@ class Overview: self.mw.col.sched.rebuildDyn() self.mw.reset() elif url == "empty": - self.mw.col.sched.emptyDyn(self.mw.col.decks.selected()) + self.mw.col.sched.empty_filtered_deck(self.mw.col.decks.selected()) self.mw.reset() elif url == "decks": self.mw.moveToState("deckBrowser") @@ -112,7 +112,7 @@ class Overview: def onEmptyKey(self): if self._filteredDeck(): - self.mw.col.sched.emptyDyn(self.mw.col.decks.selected()) + self.mw.col.sched.empty_filtered_deck(self.mw.col.decks.selected()) self.mw.reset() def onCustomStudyKey(self):