add queueless counts; fix special field references on upgrade

This commit is contained in:
Damien Elmes 2011-03-22 08:29:43 +09:00
parent 4e989d98a9
commit c63b4085c6
5 changed files with 73 additions and 14 deletions

View file

@ -24,6 +24,7 @@ class CramScheduler(Scheduler):
def reset(self): def reset(self):
self._updateCutoff() self._updateCutoff()
self._resetConf() self._resetConf()
self._resetLrnCount()
self._resetLrn() self._resetLrn()
self._resetNew() self._resetNew()
self._resetRev() self._resetRev()

View file

@ -21,7 +21,6 @@ import anki.cards, anki.facts, anki.models, anki.template, anki.cram
defaultQconf = { defaultQconf = {
'revGroups': [], 'revGroups': [],
'newGroups': [], 'newGroups': [],
'groupsOn': True,
'newPerDay': 20, 'newPerDay': 20,
'newToday': [0, 0], # currentDay, count 'newToday': [0, 0], # currentDay, count
'newTodayOrder': NEW_TODAY_ORD, 'newTodayOrder': NEW_TODAY_ORD,
@ -557,8 +556,6 @@ select conf from gconf where id = (select gcid from groups where id = ?)""",
gid)) gid))
def activeGroups(self, type): def activeGroups(self, type):
if not self.qconf['groupsOn']:
return []
return self.qconf[type+"Groups"] return self.qconf[type+"Groups"]
def setActiveGroups(self, type, list): def setActiveGroups(self, type, list):

View file

@ -19,6 +19,8 @@ class Scheduler(object):
self.db = deck.db self.db = deck.db
self.queueLimit = 200 self.queueLimit = 200
self.reportLimit = 1000 self.reportLimit = 1000
self.useGroups = True
self._updateCutoff()
def getCard(self): def getCard(self):
"Pop the next card from the queue. None if finished." "Pop the next card from the queue. None if finished."
@ -30,15 +32,11 @@ class Scheduler(object):
return c return c
def reset(self): def reset(self):
self._updateCutoff()
self._resetConf() self._resetConf()
t = time.time() self._resetCounts()
self._resetLrn() self._resetLrn()
#print "lrn %0.2fms" % ((time.time() - t)*1000); t = time.time()
self._resetRev() self._resetRev()
#print "rev %0.2fms" % ((time.time() - t)*1000); t = time.time()
self._resetNew() self._resetNew()
#print "new %0.2fms" % ((time.time() - t)*1000); t = time.time()
def answerCard(self, card, ease): def answerCard(self, card, ease):
if card.queue == 0: if card.queue == 0:
@ -76,6 +74,27 @@ order by due""" % self._groupLimit("rev"),
self.db.execute( self.db.execute(
"update cards set queue = type where queue between -3 and -2") "update cards set queue = type where queue between -3 and -2")
# Counts
##########################################################################
def selCounts(self):
"Return counts for selected groups, without building queue."
self.useGroups = True
self._resetCounts()
return self.counts()
def allCounts(self):
"Return counts for all groups, without building queue."
self.useGroups = False
self._resetCounts()
return self.counts()
def _resetCounts(self):
self._updateCutoff()
self._resetLrnCount()
self._resetRevCount()
self._resetNewCount()
# Getting the next card # Getting the next card
########################################################################## ##########################################################################
@ -118,7 +137,6 @@ select count() from (select id from cards where
queue = 0 %s limit %d)""" % (self._groupLimit('new'), lim)) queue = 0 %s limit %d)""" % (self._groupLimit('new'), lim))
def _resetNew(self): def _resetNew(self):
self._resetNewCount()
lim = min(self.queueLimit, self.newCount) lim = min(self.queueLimit, self.newCount)
self.newQueue = self.db.all(""" self.newQueue = self.db.all("""
select id, due from cards where select id, due from cards where
@ -173,7 +191,6 @@ queue = 0 %s order by due limit %d""" % (self._groupLimit('new'),
intTime() + self.deck.qconf['collapseTime']) intTime() + self.deck.qconf['collapseTime'])
def _resetLrn(self): def _resetLrn(self):
self._resetLrnCount()
self.lrnQueue = self.db.all(""" self.lrnQueue = self.db.all("""
select due, id from cards where select due, id from cards where
queue = 1 and due < :lim order by due queue = 1 and due < :lim order by due
@ -282,7 +299,6 @@ queue = 2 %s and due <= :lim limit %d)""" % (
lim=self.today) lim=self.today)
def _resetRev(self): def _resetRev(self):
self._resetRevCount()
self.revQueue = self.db.list(""" self.revQueue = self.db.list("""
select id from cards where select id from cards where
queue = 2 %s and due <= :lim order by %s limit %d""" % ( queue = 2 %s and due <= :lim order by %s limit %d""" % (
@ -451,6 +467,8 @@ queue = 2 %s and due <= :lim order by %s limit %d""" % (
return self.confCache[id] return self.confCache[id]
def _groupLimit(self, type): def _groupLimit(self, type):
if not self.useGroups:
return ""
l = self.deck.activeGroups(type) l = self.deck.activeGroups(type)
if not l: if not l:
# everything # everything

View file

@ -457,9 +457,16 @@ questionAlign, lastFontColour, allowEmptyAnswer, typeAnswer from cardModels"""):
conf['typeAns'] = ordN conf['typeAns'] = ordN
else: else:
conf['typeAns'] = None conf['typeAns'] = None
for type in ("qfmt", "afmt"):
# ensure the new style field format # ensure the new style field format
conf['qfmt'] = re.sub("%\((.+?)\)s", "{{\\1}}", conf['qfmt']) conf[type] = re.sub("%\((.+?)\)s", "{{\\1}}", conf[type])
conf['afmt'] = re.sub("%\((.+?)\)s", "{{\\1}}", conf['afmt']) # some special names have changed
conf[type] = re.sub(
"(?i){{tags}}", "{{Tags}}", conf[type])
conf[type] = re.sub(
"(?i){{cardModel}}", "{{Template}}", conf[type])
conf[type] = re.sub(
"(?i){{modelTags}}", "{{Model}}", conf[type])
# add to model list with ordinal for sorting # add to model list with ordinal for sorting
mods[row[0]].append((row[1], conf)) mods[row[0]].append((row[1], conf))
# now we've gathered all the info, save it into the models # now we've gathered all the info, save it into the models

View file

@ -496,3 +496,39 @@ def test_ordcycle():
assert d.sched.getCard().ord == 0 assert d.sched.getCard().ord == 0
assert d.sched.getCard().ord == 1 assert d.sched.getCard().ord == 1
assert d.sched.getCard().ord == 2 assert d.sched.getCard().ord == 2
def test_counts():
d = getEmptyDeck()
# add a second group
assert d.groupId("new group") == 2
# for each card type
for type in range(3):
# and each of the groups
for gid in (1,2):
# create a new fact
f = d.newFact()
f['Front'] = u"one"
d.addFact(f)
c = f.cards()[0]
# set type/gid
c.type = type
c.queue = type
c.gid = gid
c.due = 0
c.flush()
d.reset()
# with the default settings, there's no count limit
assert d.sched.counts() == (2,2,2)
# check limit to one group
d.qconf['revGroups'] = [1]
d.qconf['newGroups'] = [1]
d.reset()
assert d.sched.counts() == (1,2,1)
# we can disable the groups without forgetting them
d.sched.useGroups = False
d.reset()
assert d.sched.counts() == (2,2,2)
# we don't need to build the queue to get the counts
assert d.sched.allCounts() == (2,2,2)
assert d.sched.selCounts() == (1,2,1)
assert d.sched.allCounts() == (2,2,2)