mirror of
https://github.com/ankitects/anki.git
synced 2025-09-20 15:02:21 -04:00
dupe fact on add to avoid session issues
This commit is contained in:
parent
02a124b66d
commit
8c9f883e68
3 changed files with 17 additions and 11 deletions
18
anki/deck.py
18
anki/deck.py
|
@ -783,6 +783,7 @@ and due < :now""", now=time.time())
|
||||||
"Add a fact to the deck. Return list of new cards."
|
"Add a fact to the deck. Return list of new cards."
|
||||||
if not fact.model:
|
if not fact.model:
|
||||||
fact.model = self.currentModel
|
fact.model = self.currentModel
|
||||||
|
fact = self.cloneFact(fact)
|
||||||
# validate
|
# validate
|
||||||
fact.assertValid()
|
fact.assertValid()
|
||||||
fact.assertUnique(self.s)
|
fact.assertUnique(self.s)
|
||||||
|
@ -805,7 +806,7 @@ and due < :now""", now=time.time())
|
||||||
# keep track of last used tags for convenience
|
# keep track of last used tags for convenience
|
||||||
self.lastTags = fact.tags
|
self.lastTags = fact.tags
|
||||||
self.flushMod()
|
self.flushMod()
|
||||||
return cards
|
return fact
|
||||||
|
|
||||||
def availableCardModels(self, fact, checkActive=True):
|
def availableCardModels(self, fact, checkActive=True):
|
||||||
"List of active card models that aren't empty for FACT."
|
"List of active card models that aren't empty for FACT."
|
||||||
|
@ -899,11 +900,7 @@ where facts.id not in (select factId from cards)""")
|
||||||
cms = self.availableCardModels(oldFact)
|
cms = self.availableCardModels(oldFact)
|
||||||
if not cms:
|
if not cms:
|
||||||
return []
|
return []
|
||||||
# dupe fact
|
fact = self.cloneFact(oldFact)
|
||||||
fact = self.newFact(oldFact.model)
|
|
||||||
for field in fact.fields:
|
|
||||||
fact[field.name] = oldFact[field.name]
|
|
||||||
fact.tags = oldFact.tags
|
|
||||||
# proceed
|
# proceed
|
||||||
cards = []
|
cards = []
|
||||||
for cardModel in cms:
|
for cardModel in cms:
|
||||||
|
@ -911,6 +908,15 @@ where facts.id not in (select factId from cards)""")
|
||||||
cards.append(card)
|
cards.append(card)
|
||||||
return cards
|
return cards
|
||||||
|
|
||||||
|
def cloneFact(self, oldFact):
|
||||||
|
"Copy fact into new session."
|
||||||
|
model = self.s.query(Model).get(oldFact.model.id)
|
||||||
|
fact = self.newFact(model)
|
||||||
|
for field in fact.fields:
|
||||||
|
fact[field.name] = oldFact[field.name]
|
||||||
|
fact.tags = oldFact.tags
|
||||||
|
return fact
|
||||||
|
|
||||||
# Cards
|
# Cards
|
||||||
##########################################################################
|
##########################################################################
|
||||||
|
|
||||||
|
|
|
@ -85,14 +85,14 @@ def test_factAddDelete():
|
||||||
assert e.data['type'] == 'fieldEmpty'
|
assert e.data['type'] == 'fieldEmpty'
|
||||||
# add a fact
|
# add a fact
|
||||||
f['Front'] = u"one"; f['Back'] = u"two"
|
f['Front'] = u"one"; f['Back'] = u"two"
|
||||||
deck.addFact(f)
|
f = deck.addFact(f)
|
||||||
assert len(f.cards) == 1
|
assert len(f.cards) == 1
|
||||||
deck.rollback()
|
deck.rollback()
|
||||||
# try with two cards
|
# try with two cards
|
||||||
f = deck.newFact()
|
f = deck.newFact()
|
||||||
f['Front'] = u"one"; f['Back'] = u"two"
|
f['Front'] = u"one"; f['Back'] = u"two"
|
||||||
f.model.cardModels[1].active = True
|
f.model.cardModels[1].active = True
|
||||||
deck.addFact(f)
|
f = deck.addFact(f)
|
||||||
assert len(f.cards) == 2
|
assert len(f.cards) == 2
|
||||||
# ensure correct order
|
# ensure correct order
|
||||||
c0 = [c for c in f.cards if c.ordinal == 0][0]
|
c0 = [c for c in f.cards if c.ordinal == 0][0]
|
||||||
|
@ -101,7 +101,7 @@ def test_factAddDelete():
|
||||||
f2 = deck.newFact()
|
f2 = deck.newFact()
|
||||||
f2['Front'] = u"one"; f2['Back'] = u"three"
|
f2['Front'] = u"one"; f2['Back'] = u"three"
|
||||||
try:
|
try:
|
||||||
deck.addFact(f2)
|
f2 = deck.addFact(f2)
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
pass
|
pass
|
||||||
assert e.data['type'] == 'fieldNotUnique'
|
assert e.data['type'] == 'fieldNotUnique'
|
||||||
|
|
|
@ -196,8 +196,8 @@ def test_localsync_threeway():
|
||||||
# add a new question
|
# add a new question
|
||||||
f = deck1.newFact()
|
f = deck1.newFact()
|
||||||
f['Front'] = u"a"; f['Back'] = u"b"
|
f['Front'] = u"a"; f['Back'] = u"b"
|
||||||
cards = deck1.addFact(f)
|
f = deck1.addFact(f)
|
||||||
card = cards[0]
|
card = f.cards[0]
|
||||||
client.sync()
|
client.sync()
|
||||||
assert deck1.cardCount == 6
|
assert deck1.cardCount == 6
|
||||||
assert deck2.cardCount == 6
|
assert deck2.cardCount == 6
|
||||||
|
|
Loading…
Reference in a new issue