mirror of
https://github.com/ankitects/anki.git
synced 2025-09-19 22:42:25 -04:00
parse tags when creating fact, add selective study, fix emptyAns default
This commit is contained in:
parent
1c1ad88973
commit
96f36e66f7
5 changed files with 70 additions and 12 deletions
35
anki/deck.py
35
anki/deck.py
|
@ -620,6 +620,41 @@ select conf from gconf where id = (select gcid from groups where id = ?)""",
|
||||||
def setActiveGroups(self, type, list):
|
def setActiveGroups(self, type, list):
|
||||||
self.qconf[type+"Groups"] = list
|
self.qconf[type+"Groups"] = list
|
||||||
|
|
||||||
|
def setGroup(self, cids, gid):
|
||||||
|
self.db.execute(
|
||||||
|
"update cards set gid = ? where id in "+ids2str(cids), gid)
|
||||||
|
|
||||||
|
# Tag-based selective study
|
||||||
|
##########################################################################
|
||||||
|
|
||||||
|
def selTagFids(self, yes, no):
|
||||||
|
l = []
|
||||||
|
# find facts that match yes
|
||||||
|
lim = ""
|
||||||
|
args = []
|
||||||
|
query = "select id from facts"
|
||||||
|
if not yes and not no:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
if yes:
|
||||||
|
lim += " or ".join(["tags like ?" for t in yes])
|
||||||
|
args += ['%% %s %%' % t for t in yes]
|
||||||
|
if no:
|
||||||
|
lim2 = " and ".join(["tags not like ?" for t in no])
|
||||||
|
if lim:
|
||||||
|
lim = "(%s) and %s" % (lim, lim2)
|
||||||
|
else:
|
||||||
|
lim = lim2
|
||||||
|
args += ['%% %s %%' % t for t in no]
|
||||||
|
query += " where " + lim
|
||||||
|
return self.db.list(query, *args)
|
||||||
|
|
||||||
|
def setGroupForTags(self, yes, no, gid):
|
||||||
|
fids = self.selTagFids(yes, no)
|
||||||
|
self.db.execute(
|
||||||
|
"update cards set gid = ? where fid in "+ids2str(fids),
|
||||||
|
gid)
|
||||||
|
|
||||||
# Finding cards
|
# Finding cards
|
||||||
##########################################################################
|
##########################################################################
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
import time
|
import time
|
||||||
from anki.errors import AnkiError
|
from anki.errors import AnkiError
|
||||||
from anki.utils import stripHTMLMedia, fieldChecksum, intTime, \
|
from anki.utils import stripHTMLMedia, fieldChecksum, intTime, \
|
||||||
addTags, delTags, joinFields, splitFields, ids2str, parseTags
|
joinFields, splitFields, ids2str, parseTags, joinTags, hasTag
|
||||||
|
|
||||||
class Fact(object):
|
class Fact(object):
|
||||||
|
|
||||||
|
@ -22,7 +22,7 @@ class Fact(object):
|
||||||
self.mid = model.id
|
self.mid = model.id
|
||||||
self.crt = intTime()
|
self.crt = intTime()
|
||||||
self.mod = self.crt
|
self.mod = self.crt
|
||||||
self.tags = ""
|
self.tags = []
|
||||||
self._fields = [""] * len(self._model.fields)
|
self._fields = [""] * len(self._model.fields)
|
||||||
self.data = ""
|
self.data = ""
|
||||||
self._fmap = self._model.fieldMap()
|
self._fmap = self._model.fieldMap()
|
||||||
|
@ -37,20 +37,22 @@ class Fact(object):
|
||||||
self.data) = self.deck.db.first("""
|
self.data) = self.deck.db.first("""
|
||||||
select mid, gid, crt, mod, tags, flds, data from facts where id = ?""", self.id)
|
select mid, gid, crt, mod, tags, flds, data from facts where id = ?""", self.id)
|
||||||
self._fields = splitFields(self._fields)
|
self._fields = splitFields(self._fields)
|
||||||
|
self.tags = parseTags(self.tags)
|
||||||
self._model = self.deck.getModel(self.mid)
|
self._model = self.deck.getModel(self.mid)
|
||||||
|
|
||||||
def flush(self):
|
def flush(self):
|
||||||
self.mod = intTime()
|
self.mod = intTime()
|
||||||
# facts table
|
# facts table
|
||||||
sfld = self._fields[self._model.sortIdx()]
|
sfld = self._fields[self._model.sortIdx()]
|
||||||
|
tags = joinTags(self.tags)
|
||||||
res = self.deck.db.execute("""
|
res = self.deck.db.execute("""
|
||||||
insert or replace into facts values (?, ?, ?, ?, ?, ?, ?, ?, ?)""",
|
insert or replace into facts values (?, ?, ?, ?, ?, ?, ?, ?, ?)""",
|
||||||
self.id, self.mid, self.gid, self.crt,
|
self.id, self.mid, self.gid, self.crt,
|
||||||
self.mod, self.tags, self.joinedFields(),
|
self.mod, tags, self.joinedFields(),
|
||||||
sfld, self.data)
|
sfld, self.data)
|
||||||
self.id = res.lastrowid
|
self.id = res.lastrowid
|
||||||
self.updateFieldChecksums()
|
self.updateFieldChecksums()
|
||||||
self.deck.registerTags(parseTags(self.tags))
|
self.deck.registerTags(self.tags)
|
||||||
|
|
||||||
def joinedFields(self):
|
def joinedFields(self):
|
||||||
return joinFields(self._fields)
|
return joinFields(self._fields)
|
||||||
|
@ -102,11 +104,8 @@ insert or replace into facts values (?, ?, ?, ?, ?, ?, ?, ?, ?)""",
|
||||||
# Tags
|
# Tags
|
||||||
##################################################
|
##################################################
|
||||||
|
|
||||||
def addTags(self, tags):
|
def hasTag(self, tag):
|
||||||
self.tags = addTags(tags, self.tags)
|
return hasTag(tag, self.tags)
|
||||||
|
|
||||||
def delTags(self, tags):
|
|
||||||
self.tags = delTags(tags, self.tags)
|
|
||||||
|
|
||||||
# Unique/duplicate checks
|
# Unique/duplicate checks
|
||||||
##################################################
|
##################################################
|
||||||
|
|
|
@ -35,7 +35,7 @@ defaultTemplate = {
|
||||||
'hideQ': False,
|
'hideQ': False,
|
||||||
'align': 0,
|
'align': 0,
|
||||||
'bg': "#000",
|
'bg': "#000",
|
||||||
'emptyAns': None,
|
'emptyAns': True,
|
||||||
'typeAns': None,
|
'typeAns': None,
|
||||||
'gid': None
|
'gid': None
|
||||||
}
|
}
|
||||||
|
|
|
@ -148,3 +148,27 @@ def test_groups():
|
||||||
# set new cards to only 'another group'
|
# set new cards to only 'another group'
|
||||||
deck.setActiveGroups('new', [3])
|
deck.setActiveGroups('new', [3])
|
||||||
assert deck.activeGroups('new') == [3]
|
assert deck.activeGroups('new') == [3]
|
||||||
|
|
||||||
|
def test_selective():
|
||||||
|
deck = getEmptyDeck()
|
||||||
|
f = deck.newFact()
|
||||||
|
f['Front'] = u"1"; f.tags = ["one", "three"]
|
||||||
|
deck.addFact(f)
|
||||||
|
f = deck.newFact()
|
||||||
|
f['Front'] = u"2"; f.tags = ["two", "three", "four"]
|
||||||
|
deck.addFact(f)
|
||||||
|
f = deck.newFact()
|
||||||
|
f['Front'] = u"3"; f.tags = ["one", "two", "three", "four"]
|
||||||
|
deck.addFact(f)
|
||||||
|
assert len(deck.selTagFids(["one"], [])) == 2
|
||||||
|
assert len(deck.selTagFids(["three"], [])) == 3
|
||||||
|
assert len(deck.selTagFids([], ["three"])) == 0
|
||||||
|
assert len(deck.selTagFids(["one"], ["three"])) == 0
|
||||||
|
assert len(deck.selTagFids(["one"], ["two"])) == 1
|
||||||
|
assert len(deck.selTagFids(["two", "three"], [])) == 3
|
||||||
|
assert len(deck.selTagFids(["two", "three"], ["one"])) == 1
|
||||||
|
assert len(deck.selTagFids(["one", "three"], ["two", "four"])) == 1
|
||||||
|
deck.setGroupForTags(["three"], [], 3)
|
||||||
|
assert deck.db.scalar("select count() from cards where gid = 3") == 3
|
||||||
|
deck.setGroupForTags(["one"], [], 2)
|
||||||
|
assert deck.db.scalar("select count() from cards where gid = 2") == 2
|
||||||
|
|
|
@ -7,12 +7,12 @@ def test_findCards():
|
||||||
f = deck.newFact()
|
f = deck.newFact()
|
||||||
f['Front'] = u'dog'
|
f['Front'] = u'dog'
|
||||||
f['Back'] = u'cat'
|
f['Back'] = u'cat'
|
||||||
f.addTags(u"monkey")
|
f.tags.append(u"monkey")
|
||||||
deck.addFact(f)
|
deck.addFact(f)
|
||||||
f = deck.newFact()
|
f = deck.newFact()
|
||||||
f['Front'] = u'goats are fun'
|
f['Front'] = u'goats are fun'
|
||||||
f['Back'] = u'sheep'
|
f['Back'] = u'sheep'
|
||||||
f.addTags(u"sheep goat horse")
|
f.tags.append(u"sheep goat horse")
|
||||||
deck.addFact(f)
|
deck.addFact(f)
|
||||||
f = deck.newFact()
|
f = deck.newFact()
|
||||||
f['Front'] = u'cat'
|
f['Front'] = u'cat'
|
||||||
|
|
Loading…
Reference in a new issue