rebuild_filtered_deck() and new_filtered()

This commit is contained in:
Damien Elmes 2020-09-03 18:02:47 +10:00
parent f87fa762be
commit ade7f438ce
9 changed files with 50 additions and 46 deletions

View file

@ -556,7 +556,7 @@ class DeckManager:
# Dynamic decks # 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." "Return a new dynamic deck and set it as the current deck."
did = self.id(name, type=1) did = self.id(name, type=1)
self.select(did) self.select(did)
@ -565,3 +565,7 @@ class DeckManager:
# 1 for dyn, 0 for standard # 1 for dyn, 0 for standard
def isDyn(self, did: Union[int, str]) -> int: def isDyn(self, did: Union[int, str]) -> int:
return self.get(did)["dyn"] return self.get(did)["dyn"]
# legacy
newDyn = new_filtered

View file

@ -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: def empty_filtered_deck(self, deck_id: int) -> None:
self.col.backend.empty_filtered_deck(deck_id) 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: def _removeFromFiltered(self, card: Card) -> None:
if card.odid: if card.odid:
card.did = 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 # 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: def emptyDyn(self, did: Optional[int], lim: Optional[str] = None) -> None:
if lim is None: if lim is None:
self.empty_filtered_deck(did) self.empty_filtered_deck(did)

View file

@ -84,7 +84,7 @@ def test_rename():
for n in "yo", "yo::two", "yo::two::three": for n in "yo", "yo::two", "yo::two::three":
assert n in names assert n in names
# over filtered # over filtered
filteredId = col.decks.newDyn("filtered") filteredId = col.decks.new_filtered("filtered")
filtered = col.decks.get(filteredId) filtered = col.decks.get(filteredId)
childId = col.decks.id("child") childId = col.decks.id("child")
child = col.decks.get(childId) child = col.decks.get(childId)

View file

@ -545,8 +545,8 @@ def test_suspend():
# should cope with cards in cram decks # should cope with cards in cram decks
c.due = 1 c.due = 1
c.flush() c.flush()
col.decks.newDyn("tmp") did = col.decks.new_filtered("tmp")
col.sched.rebuildDyn() col.sched.rebuild_filtered_deck(did)
c.load() c.load()
assert c.due != 1 assert c.due != 1
assert c.did != 1 assert c.did != 1
@ -575,8 +575,8 @@ def test_cram():
assert col.sched.counts() == (0, 0, 0) assert col.sched.counts() == (0, 0, 0)
cardcopy = copy.copy(c) cardcopy = copy.copy(c)
# create a dynamic deck and refresh it # create a dynamic deck and refresh it
did = col.decks.newDyn("Cram") did = col.decks.new_filtered("Cram")
col.sched.rebuildDyn(did) col.sched.rebuild_filtered_deck(did)
col.reset() col.reset()
# should appear as new in the deck list # should appear as new in the deck list
assert sorted(col.sched.deck_due_tree().children)[0].new_count == 1 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 # and it will have moved back to the previous deck
assert c.did == 1 assert c.did == 1
# cram the deck again # cram the deck again
col.sched.rebuildDyn(did) col.sched.rebuild_filtered_deck(did)
col.reset() col.reset()
c = col.sched.getCard() c = col.sched.getCard()
# check ivls again - passing should be idempotent # check ivls again - passing should be idempotent
@ -646,8 +646,8 @@ def test_cram():
col.reset() col.reset()
assert col.sched.counts() == (0, 0, 1) assert col.sched.counts() == (0, 0, 1)
# cram again # cram again
did = col.decks.newDyn("Cram") did = col.decks.new_filtered("Cram")
col.sched.rebuildDyn(did) col.sched.rebuild_filtered_deck(did)
col.reset() col.reset()
assert col.sched.counts() == (0, 0, 1) assert col.sched.counts() == (0, 0, 1)
c.load() c.load()
@ -673,8 +673,8 @@ def test_cram_rem():
note["Front"] = "one" note["Front"] = "one"
col.addNote(note) col.addNote(note)
oldDue = note.cards()[0].due oldDue = note.cards()[0].due
did = col.decks.newDyn("Cram") did = col.decks.new_filtered("Cram")
col.sched.rebuildDyn(did) col.sched.rebuild_filtered_deck(did)
col.reset() col.reset()
c = col.sched.getCard() c = col.sched.getCard()
col.sched.answerCard(c, 2) col.sched.answerCard(c, 2)
@ -695,11 +695,11 @@ def test_cram_resched():
note["Front"] = "one" note["Front"] = "one"
col.addNote(note) col.addNote(note)
# cram deck # cram deck
did = col.decks.newDyn("Cram") did = col.decks.new_filtered("Cram")
cram = col.decks.get(did) cram = col.decks.get(did)
cram["resched"] = False cram["resched"] = False
col.decks.save(cram) col.decks.save(cram)
col.sched.rebuildDyn(did) col.sched.rebuild_filtered_deck(did)
col.reset() col.reset()
# graduate should return it to new # graduate should return it to new
c = col.sched.getCard() c = col.sched.getCard()
@ -718,7 +718,7 @@ def test_cram_resched():
c.factor = STARTING_FACTOR c.factor = STARTING_FACTOR
c.flush() c.flush()
cardcopy = copy.copy(c) cardcopy = copy.copy(c)
col.sched.rebuildDyn(did) col.sched.rebuild_filtered_deck(did)
col.reset() col.reset()
c = col.sched.getCard() c = col.sched.getCard()
assert ni(c, 1) == 600 assert ni(c, 1) == 600
@ -730,7 +730,7 @@ def test_cram_resched():
# check failure too # check failure too
c = cardcopy c = cardcopy
c.flush() c.flush()
col.sched.rebuildDyn(did) col.sched.rebuild_filtered_deck(did)
col.reset() col.reset()
c = col.sched.getCard() c = col.sched.getCard()
col.sched.answerCard(c, 1) col.sched.answerCard(c, 1)
@ -741,7 +741,7 @@ def test_cram_resched():
# fail+grad early # fail+grad early
c = cardcopy c = cardcopy
c.flush() c.flush()
col.sched.rebuildDyn(did) col.sched.rebuild_filtered_deck(did)
col.reset() col.reset()
c = col.sched.getCard() c = col.sched.getCard()
col.sched.answerCard(c, 1) col.sched.answerCard(c, 1)
@ -754,7 +754,7 @@ def test_cram_resched():
c = cardcopy c = cardcopy
c.due = -25 c.due = -25
c.flush() c.flush()
col.sched.rebuildDyn(did) col.sched.rebuild_filtered_deck(did)
col.reset() col.reset()
c = col.sched.getCard() c = col.sched.getCard()
col.sched.answerCard(c, 3) col.sched.answerCard(c, 3)
@ -766,7 +766,7 @@ def test_cram_resched():
c = cardcopy c = cardcopy
c.due = -25 c.due = -25
c.flush() c.flush()
col.sched.rebuildDyn(did) col.sched.rebuild_filtered_deck(did)
col.reset() col.reset()
c = col.sched.getCard() c = col.sched.getCard()
col.sched.answerCard(c, 1) col.sched.answerCard(c, 1)
@ -778,7 +778,7 @@ def test_cram_resched():
c = cardcopy c = cardcopy
c.due = -25 c.due = -25
c.flush() c.flush()
col.sched.rebuildDyn(did) col.sched.rebuild_filtered_deck(did)
col.reset() col.reset()
c = col.sched.getCard() c = col.sched.getCard()
col.sched.answerCard(c, 1) col.sched.answerCard(c, 1)
@ -789,7 +789,7 @@ def test_cram_resched():
# lapsed card pulled into cram # lapsed card pulled into cram
# col.sched._cardConf(c)['lapse']['mult']=0.5 # col.sched._cardConf(c)['lapse']['mult']=0.5
# col.sched.answerCard(c, 1) # col.sched.answerCard(c, 1)
# col.sched.rebuildDyn(did) # col.sched.rebuild_filtered_deck(did)
# col.reset() # col.reset()
# c = col.sched.getCard() # c = col.sched.getCard()
# col.sched.answerCard(c, 2) # col.sched.answerCard(c, 2)

View file

@ -668,8 +668,8 @@ def test_suspend():
# should cope with cards in cram decks # should cope with cards in cram decks
c.due = 1 c.due = 1
c.flush() c.flush()
col.decks.newDyn("tmp") did = col.decks.new_filtered("tmp")
col.sched.rebuildDyn() col.sched.rebuild_filtered_deck(did)
c.load() c.load()
assert c.due != 1 assert c.due != 1
assert c.did != 1 assert c.did != 1
@ -698,8 +698,8 @@ def test_filt_reviewing_early_normal():
col.reset() col.reset()
assert col.sched.counts() == (0, 0, 0) assert col.sched.counts() == (0, 0, 0)
# create a dynamic deck and refresh it # create a dynamic deck and refresh it
did = col.decks.newDyn("Cram") did = col.decks.new_filtered("Cram")
col.sched.rebuildDyn(did) col.sched.rebuild_filtered_deck(did)
col.reset() col.reset()
# should appear as normal in the deck list # should appear as normal in the deck list
assert sorted(col.sched.deck_due_tree().children)[0].review_count == 1 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.ivl = 100
c.due = col.sched.today + 75 c.due = col.sched.today + 75
c.flush() c.flush()
col.sched.rebuildDyn(did) col.sched.rebuild_filtered_deck(did)
col.reset() col.reset()
c = col.sched.getCard() 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 assert c.type == CARD_TYPE_LRN and c.queue == QUEUE_TYPE_LRN
# create a dynamic deck and refresh it # create a dynamic deck and refresh it
did = col.decks.newDyn("Cram") did = col.decks.new_filtered("Cram")
col.sched.rebuildDyn(did) col.sched.rebuild_filtered_deck(did)
col.reset() col.reset()
# card should still be in learning state # card should still be in learning state
@ -792,11 +792,11 @@ def test_preview():
note2["Front"] = "two" note2["Front"] = "two"
col.addNote(note2) col.addNote(note2)
# cram deck # cram deck
did = col.decks.newDyn("Cram") did = col.decks.new_filtered("Cram")
cram = col.decks.get(did) cram = col.decks.get(did)
cram["resched"] = False cram["resched"] = False
col.decks.save(cram) col.decks.save(cram)
col.sched.rebuildDyn(did) col.sched.rebuild_filtered_deck(did)
col.reset() col.reset()
# grab the first card # grab the first card
c = col.sched.getCard() c = col.sched.getCard()
@ -1253,8 +1253,8 @@ def test_negativeDueFilter():
c.flush() c.flush()
# into and out of filtered deck # into and out of filtered deck
did = col.decks.newDyn("Cram") did = col.decks.new_filtered("Cram")
col.sched.rebuildDyn(did) col.sched.rebuild_filtered_deck(did)
col.sched.empty_filtered_deck(did) col.sched.empty_filtered_deck(did)
col.reset() col.reset()

View file

@ -150,7 +150,7 @@ class CustomStudy(QDialog):
dyn = cur dyn = cur
self.mw.col.decks.select(cur["id"]) self.mw.col.decks.select(cur["id"])
else: 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) dyn = self.mw.col.decks.get(did)
# and then set various options # and then set various options
if i == RADIO_FORGOT: if i == RADIO_FORGOT:
@ -186,7 +186,7 @@ class CustomStudy(QDialog):
self.mw.col.decks.save(dyn) self.mw.col.decks.save(dyn)
# generate cards # generate cards
self.created_custom_study = True 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.")) return showWarning(_("No cards matched the criteria you provided."))
self.mw.moveToState("overview") self.mw.moveToState("overview")
QDialog.accept(self) QDialog.accept(self)

View file

@ -122,7 +122,7 @@ class DeckConf(QDialog):
def accept(self): def accept(self):
if not self.saveConf(): if not self.saveConf():
return return
if not self.mw.col.sched.rebuildDyn(): if not self.mw.col.sched.rebuild_filtered_deck(self.deck["id"]):
if askUser( if askUser(
_( _(
"""\ """\

View file

@ -1159,7 +1159,7 @@ title="%s" %s>%s</button>""" % (
while self.col.decks.id_for_name(_("Filtered Deck %d") % n): while self.col.decks.id_for_name(_("Filtered Deck %d") % n):
n += 1 n += 1
name = _("Filtered Deck %d") % n 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) diag = aqt.dyndeckconf.DeckConf(self, first=True, search=search)
if not diag.ok: if not diag.ok:
# user cancelled first config # user cancelled first config

View file

@ -76,7 +76,7 @@ class Overview:
deck = self.mw.col.decks.current() deck = self.mw.col.decks.current()
self.mw.onCram("'deck:%s'" % deck["name"]) self.mw.onCram("'deck:%s'" % deck["name"])
elif url == "refresh": elif url == "refresh":
self.mw.col.sched.rebuildDyn() self.mw.col.sched.rebuild_filtered_deck(self.mw.col.decks.selected())
self.mw.reset() self.mw.reset()
elif url == "empty": elif url == "empty":
self.mw.col.sched.empty_filtered_deck(self.mw.col.decks.selected()) self.mw.col.sched.empty_filtered_deck(self.mw.col.decks.selected())
@ -107,7 +107,7 @@ class Overview:
def onRebuildKey(self): def onRebuildKey(self):
if self._filteredDeck(): if self._filteredDeck():
self.mw.col.sched.rebuildDyn() self.mw.col.sched.rebuild_filtered_deck(self.mw.col.decks.selected())
self.mw.reset() self.mw.reset()
def onEmptyKey(self): def onEmptyKey(self):