From 1e0b97f25bb651175f5711ff38c53f56912a6a6d Mon Sep 17 00:00:00 2001 From: Damien Elmes Date: Sun, 14 Jan 2018 13:08:38 +1000 Subject: [PATCH] support a second filter in filtered decks --- anki/decks.py | 2 +- anki/sched.py | 45 ++++++++++++------------ aqt/dyndeckconf.py | 40 ++++++++++++++++++---- designer/dyndconf.ui | 81 +++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 139 insertions(+), 29 deletions(-) diff --git a/anki/decks.py b/anki/decks.py index 4edd8bba4..eec95f713 100644 --- a/anki/decks.py +++ b/anki/decks.py @@ -38,7 +38,7 @@ defaultDynamicDeck = { 'usn': 0, 'delays': None, 'separate': True, - # list of (search, limit, order); we only use first element for now + # list of (search, limit, order); we only use first two elements for now 'terms': [["", 100, 0]], 'resched': True, 'return': True, # currently unused diff --git a/anki/sched.py b/anki/sched.py index 330afe148..d39302720 100644 --- a/anki/sched.py +++ b/anki/sched.py @@ -983,28 +983,30 @@ select id from cards where did in %s and queue = 2 and due <= ? limit ?)""" assert deck['dyn'] # move any existing cards back first, then fill self.emptyDyn(did) - ids = self._fillDyn(deck) - if not ids: + cnt = self._fillDyn(deck) + if not cnt: return # and change to our new deck self.col.decks.select(did) - return ids + return cnt def _fillDyn(self, deck): - search, limit, order = deck['terms'][0] - orderlimit = self._dynOrder(order, limit) - if search.strip(): - search = "(%s)" % search - search = "%s -is:suspended -is:buried -deck:filtered" % search - try: - ids = self.col.findCards(search, order=orderlimit) - except: - ids = [] - return ids - # move the cards over - self.col.log(deck['id'], ids) - self._moveToDyn(deck['id'], ids) - return ids + start = -100000 + total = 0 + for search, limit, order in deck['terms']: + orderlimit = self._dynOrder(order, limit) + if search.strip(): + search = "(%s)" % search + search = "%s -is:suspended -is:buried -deck:filtered" % search + try: + ids = self.col.findCards(search, order=orderlimit) + except: + return total + # move the cards over + self.col.log(deck['id'], ids) + self._moveToDyn(deck['id'], ids, start=start+total) + total += len(ids) + return total def emptyDyn(self, did, lim=None): if not lim: @@ -1069,13 +1071,14 @@ group by did t = "c.due" return t + " limit %d" % l - def _moveToDyn(self, did, ids): + def _moveToDyn(self, did, ids, start=-100000): deck = self.col.decks.get(did) data = [] t = intTime(); u = self.col.usn() - for c, id in enumerate(ids): - # start at -100000 so that reviews are all due - data.append((did, -100000+c, u, id)) + due = start + for id in ids: + data.append((did, due, u, id)) + due += 1 query = """ update cards set diff --git a/aqt/dyndeckconf.py b/aqt/dyndeckconf.py index 1fc04639d..a1be94d05 100644 --- a/aqt/dyndeckconf.py +++ b/aqt/dyndeckconf.py @@ -28,7 +28,8 @@ class DeckConf(QDialog): self.setupOrder() self.loadConf() if search: - self.form.search.setText(search) + self.form.search.setText(search + " is:due") + self.form.search_2.setText(search + " is:new") self.form.search.selectAll() self.show() self.exec_() @@ -37,24 +38,51 @@ class DeckConf(QDialog): def setupOrder(self): import anki.consts as cs self.form.order.addItems(list(cs.dynOrderLabels().values())) + self.form.order_2.addItems(list(cs.dynOrderLabels().values())) def loadConf(self): f = self.form d = self.deck + + f.resched.setChecked(d['resched']) + search, limit, order = d['terms'][0] f.search.setText(search) - f.resched.setChecked(d['resched']) f.order.setCurrentIndex(order) f.limit.setValue(limit) + if len(d['terms']) > 1: + search, limit, order = d['terms'][1] + f.search_2.setText(search) + f.order_2.setCurrentIndex(order) + f.limit_2.setValue(limit) + f.secondFilter.setChecked(True) + f.filter2group.setVisible(True) + else: + f.order_2.setCurrentIndex(5) + f.limit_2.setValue(20) + f.secondFilter.setChecked(False) + f.filter2group.setVisible(False) + def saveConf(self): f = self.form d = self.deck - d['delays'] = None - d['terms'][0] = [f.search.text(), - f.limit.value(), - f.order.currentIndex()] d['resched'] = f.resched.isChecked() + d['delays'] = None + + terms = [[ + f.search.text(), + f.limit.value(), + f.order.currentIndex()]] + + if f.secondFilter.isChecked(): + terms.append([ + f.search_2.text(), + f.limit_2.value(), + f.order_2.currentIndex()]) + + d['terms'] = terms + self.mw.col.decks.save(d) return True diff --git a/designer/dyndconf.ui b/designer/dyndconf.ui index c0f8d935c..3bedbdc09 100644 --- a/designer/dyndconf.ui +++ b/designer/dyndconf.ui @@ -7,7 +7,7 @@ 0 0 445 - 301 + 354 @@ -66,6 +66,58 @@ + + + + Filter 2 + + + + + + Limit to + + + + + + + + + + + + + Search + + + + + + + + 60 + 16777215 + + + + 1 + + + 99999 + + + + + + + cards selected by + + + + + + @@ -82,6 +134,13 @@ + + + + Enable second filter + + + @@ -114,7 +173,11 @@ search limit order + search_2 + limit_2 + order_2 resched + secondFilter buttonBox @@ -151,5 +214,21 @@ + + secondFilter + toggled(bool) + filter2group + setVisible(bool) + + + 125 + 265 + + + 222 + 155 + + +