mirror of
https://github.com/ankitects/anki.git
synced 2025-11-11 07:07:13 -05:00
use the timestamps instead of forcing id on fact/card creation
- we ditch nextCid/nextFid as we don't need incrementing ids anymore - we add nextPos so we can maintain a user-friendly position number
This commit is contained in:
parent
f7b89c9fa1
commit
47be8b0546
5 changed files with 22 additions and 22 deletions
24
anki/deck.py
24
anki/deck.py
|
|
@ -24,7 +24,7 @@ defaultQconf = {
|
||||||
'newPerDay': 20,
|
'newPerDay': 20,
|
||||||
'newToday': [0, 0], # currentDay, count
|
'newToday': [0, 0], # currentDay, count
|
||||||
'newTodayOrder': NEW_TODAY_ORD,
|
'newTodayOrder': NEW_TODAY_ORD,
|
||||||
'newOrder': 1,
|
'newOrder': NEW_CARDS_DUE,
|
||||||
'newSpread': NEW_CARDS_DISTRIBUTE,
|
'newSpread': NEW_CARDS_DISTRIBUTE,
|
||||||
'revOrder': REV_CARDS_RANDOM,
|
'revOrder': REV_CARDS_RANDOM,
|
||||||
'collapseTime': 1200,
|
'collapseTime': 1200,
|
||||||
|
|
@ -36,8 +36,7 @@ defaultQconf = {
|
||||||
defaultConf = {
|
defaultConf = {
|
||||||
'currentModelId': 1,
|
'currentModelId': 1,
|
||||||
'currentGroupId': 1,
|
'currentGroupId': 1,
|
||||||
'nextFid': 1,
|
'nextPos': 1,
|
||||||
'nextCid': 1,
|
|
||||||
'nextGid': 2,
|
'nextGid': 2,
|
||||||
'nextGcid': 2,
|
'nextGcid': 2,
|
||||||
'mediaURL': "",
|
'mediaURL': "",
|
||||||
|
|
@ -200,10 +199,11 @@ qconf=?, conf=?, data=?""",
|
||||||
# Utils
|
# Utils
|
||||||
##########################################################################
|
##########################################################################
|
||||||
|
|
||||||
def nextID(self, type):
|
def nextID(self, type, inc=True):
|
||||||
type = "next"+type.capitalize()
|
type = "next"+type.capitalize()
|
||||||
id = self.conf.get(type, 1)
|
id = self.conf.get(type, 1)
|
||||||
self.conf[type] = id+1
|
if inc:
|
||||||
|
self.conf[type] = id+1
|
||||||
return id
|
return id
|
||||||
|
|
||||||
def reset(self):
|
def reset(self):
|
||||||
|
|
@ -231,18 +231,16 @@ qconf=?, conf=?, data=?""",
|
||||||
|
|
||||||
def addFact(self, fact):
|
def addFact(self, fact):
|
||||||
"Add a fact to the deck. Return number of new cards."
|
"Add a fact to the deck. Return number of new cards."
|
||||||
# check we have card models available
|
# check we have card models available, then save
|
||||||
cms = self.findTemplates(fact)
|
cms = self.findTemplates(fact)
|
||||||
if not cms:
|
if not cms:
|
||||||
return 0
|
return 0
|
||||||
# flush the fact
|
|
||||||
fact.id = self.nextID("fid")
|
|
||||||
fact.flush()
|
fact.flush()
|
||||||
# randomize?
|
# randomize?
|
||||||
if self.randomNew():
|
if self.randomNew():
|
||||||
due = random.randrange(1, fact.id)
|
due = self._randPos()
|
||||||
else:
|
else:
|
||||||
due = fact.id
|
due = self.nextID("pos")
|
||||||
# add cards
|
# add cards
|
||||||
ncards = 0
|
ncards = 0
|
||||||
for template in cms:
|
for template in cms:
|
||||||
|
|
@ -250,6 +248,9 @@ qconf=?, conf=?, data=?""",
|
||||||
ncards += 1
|
ncards += 1
|
||||||
return ncards
|
return ncards
|
||||||
|
|
||||||
|
def _randPos(self):
|
||||||
|
return random.randrange(1, self.nextID("pos", inc=False))
|
||||||
|
|
||||||
def delFacts(self, ids):
|
def delFacts(self, ids):
|
||||||
self.delCards(self.db.list("select id from cards where fid in "+
|
self.delCards(self.db.list("select id from cards where fid in "+
|
||||||
ids2str(ids)))
|
ids2str(ids)))
|
||||||
|
|
@ -296,7 +297,7 @@ qconf=?, conf=?, data=?""",
|
||||||
# if this fact has existing new cards, use their due time
|
# if this fact has existing new cards, use their due time
|
||||||
due = self.db.scalar(
|
due = self.db.scalar(
|
||||||
"select due from cards where fid = ? and queue = 0", fact.id)
|
"select due from cards where fid = ? and queue = 0", fact.id)
|
||||||
due = due or random.randrange(1, self.conf['nextFid'])
|
due = due or self._randPos()
|
||||||
else:
|
else:
|
||||||
due = fact.id
|
due = fact.id
|
||||||
for template in self.findTemplates(fact, checkActive=False):
|
for template in self.findTemplates(fact, checkActive=False):
|
||||||
|
|
@ -331,7 +332,6 @@ qconf=?, conf=?, data=?""",
|
||||||
def _newCard(self, fact, template, due, flush=True):
|
def _newCard(self, fact, template, due, flush=True):
|
||||||
"Create a new card."
|
"Create a new card."
|
||||||
card = anki.cards.Card(self)
|
card = anki.cards.Card(self)
|
||||||
card.id = self.nextID("cid")
|
|
||||||
card.fid = fact.id
|
card.fid = fact.id
|
||||||
card.ord = template['ord']
|
card.ord = template['ord']
|
||||||
card.gid = self.defaultGroup(template['gid'] or fact.gid)
|
card.gid = self.defaultGroup(template['gid'] or fact.gid)
|
||||||
|
|
|
||||||
|
|
@ -572,8 +572,7 @@ update cards set due = cast(
|
||||||
if deck.randomNew():
|
if deck.randomNew():
|
||||||
deck.sched.randomizeCards()
|
deck.sched.randomizeCards()
|
||||||
# update insertion id
|
# update insertion id
|
||||||
deck.conf['nextFid'] = deck.db.scalar("select max(id) from facts")+1
|
deck.conf['nextPos'] = deck.db.scalar("select max(id) from facts")+1
|
||||||
deck.conf['nextCid'] = deck.db.scalar("select max(id) from cards")+1
|
|
||||||
deck.save()
|
deck.save()
|
||||||
|
|
||||||
# optimize and finish
|
# optimize and finish
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@ def test_genCards():
|
||||||
assert deck.cardCount() == 2
|
assert deck.cardCount() == 2
|
||||||
assert cards[0].due == f.id
|
assert cards[0].due == f.id
|
||||||
# should work on random mode too
|
# should work on random mode too
|
||||||
deck.qconf['newCardOrder'] = NEW_CARDS_RANDOM
|
deck.qconf['newOrder'] = NEW_CARDS_RANDOM
|
||||||
f = deck.newFact()
|
f = deck.newFact()
|
||||||
f['Front'] = u'1'
|
f['Front'] = u'1'
|
||||||
f['Back'] = u'2'
|
f['Back'] = u'2'
|
||||||
|
|
@ -76,5 +76,4 @@ def test_misc():
|
||||||
c = f.cards()[0]
|
c = f.cards()[0]
|
||||||
id = d.conf['currentModelId']
|
id = d.conf['currentModelId']
|
||||||
assert c.cssClass() == "cm%s-0" % hexifyID(id)
|
assert c.cssClass() == "cm%s-0" % hexifyID(id)
|
||||||
assert c.fact().id == 1
|
|
||||||
assert c.template()['ord'] == 0
|
assert c.template()['ord'] == 0
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@ def test_findCards():
|
||||||
f['Front'] = u'dog'
|
f['Front'] = u'dog'
|
||||||
f['Back'] = u'cat'
|
f['Back'] = u'cat'
|
||||||
f.tags.append(u"monkey")
|
f.tags.append(u"monkey")
|
||||||
|
f1id = f.id
|
||||||
deck.addFact(f)
|
deck.addFact(f)
|
||||||
firstCardId = f.cards()[0].id
|
firstCardId = f.cards()[0].id
|
||||||
f = deck.newFact()
|
f = deck.newFact()
|
||||||
|
|
@ -15,6 +16,7 @@ def test_findCards():
|
||||||
f['Back'] = u'sheep'
|
f['Back'] = u'sheep'
|
||||||
f.tags.append(u"sheep goat horse")
|
f.tags.append(u"sheep goat horse")
|
||||||
deck.addFact(f)
|
deck.addFact(f)
|
||||||
|
f2id = f.id
|
||||||
f = deck.newFact()
|
f = deck.newFact()
|
||||||
f['Front'] = u'cat'
|
f['Front'] = u'cat'
|
||||||
f['Back'] = u'sheep'
|
f['Back'] = u'sheep'
|
||||||
|
|
@ -34,11 +36,11 @@ def test_findCards():
|
||||||
assert len(deck.findCards("tag:monkey")) == 1
|
assert len(deck.findCards("tag:monkey")) == 1
|
||||||
assert len(deck.findCards("tag:sheep -tag:monkey")) == 1
|
assert len(deck.findCards("tag:sheep -tag:monkey")) == 1
|
||||||
assert len(deck.findCards("-tag:sheep")) == 4
|
assert len(deck.findCards("-tag:sheep")) == 4
|
||||||
deck.addTags(deck.db.list("select id from cards"), "foo bar")
|
deck.addTags(deck.db.list("select id from facts"), "foo bar")
|
||||||
assert (len(deck.findCards("tag:foo")) ==
|
assert (len(deck.findCards("tag:foo")) ==
|
||||||
len(deck.findCards("tag:bar")) ==
|
len(deck.findCards("tag:bar")) ==
|
||||||
5)
|
5)
|
||||||
deck.delTags(deck.db.list("select id from cards"), "foo")
|
deck.delTags(deck.db.list("select id from facts"), "foo")
|
||||||
assert len(deck.findCards("tag:foo")) == 0
|
assert len(deck.findCards("tag:foo")) == 0
|
||||||
assert len(deck.findCards("tag:bar")) == 5
|
assert len(deck.findCards("tag:bar")) == 5
|
||||||
# text searches
|
# text searches
|
||||||
|
|
@ -67,7 +69,7 @@ def test_findCards():
|
||||||
# fids
|
# fids
|
||||||
assert deck.findCards("fid:54321") == []
|
assert deck.findCards("fid:54321") == []
|
||||||
assert len(deck.findCards("fid:%d"%f.id)) == 2
|
assert len(deck.findCards("fid:%d"%f.id)) == 2
|
||||||
assert len(deck.findCards("fid:3,2")) == 2
|
assert len(deck.findCards("fid:%d,%d" % (f1id, f2id))) == 2
|
||||||
# templates
|
# templates
|
||||||
assert len(deck.findCards("card:foo")) == 0
|
assert len(deck.findCards("card:foo")) == 0
|
||||||
assert len(deck.findCards("card:forward")) == 4
|
assert len(deck.findCards("card:forward")) == 4
|
||||||
|
|
|
||||||
|
|
@ -103,7 +103,7 @@ def test_learn():
|
||||||
d.sched.answerCard(c, 1)
|
d.sched.answerCard(c, 1)
|
||||||
# it should by due in 30 seconds
|
# it should by due in 30 seconds
|
||||||
t = round(c.due - time.time())
|
t = round(c.due - time.time())
|
||||||
assert t >= 30 and t <= 40
|
assert t >= 25 and t <= 40
|
||||||
# and have 1 cycle, but still a zero grade
|
# and have 1 cycle, but still a zero grade
|
||||||
assert c.grade == 0
|
assert c.grade == 0
|
||||||
assert c.cycles == 1
|
assert c.cycles == 1
|
||||||
|
|
@ -736,7 +736,7 @@ def test_reorder():
|
||||||
f2 = d.newFact()
|
f2 = d.newFact()
|
||||||
f2['Front'] = u"two"
|
f2['Front'] = u"two"
|
||||||
d.addFact(f2)
|
d.addFact(f2)
|
||||||
assert f2.cards()[0].due == f2.id
|
assert f2.cards()[0].due == 2
|
||||||
found=False
|
found=False
|
||||||
# 50/50 chance of being reordered
|
# 50/50 chance of being reordered
|
||||||
for i in range(20):
|
for i in range(20):
|
||||||
|
|
@ -746,7 +746,7 @@ def test_reorder():
|
||||||
break
|
break
|
||||||
assert found
|
assert found
|
||||||
d.sched.orderCards()
|
d.sched.orderCards()
|
||||||
assert f.cards()[0].due == f.id
|
assert f.cards()[0].due == 1
|
||||||
# shifting
|
# shifting
|
||||||
f3 = d.newFact()
|
f3 = d.newFact()
|
||||||
f3['Front'] = u"three"
|
f3['Front'] = u"three"
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue