mirror of
https://github.com/ankitects/anki.git
synced 2025-09-24 16:56:36 -04:00
implement sort fields; make sure they're updated on upgrade
This commit is contained in:
parent
93dcfceffe
commit
d95cc6c44b
5 changed files with 51 additions and 28 deletions
|
@ -22,6 +22,9 @@ REV_CARDS_OLD_FIRST = 0
|
||||||
REV_CARDS_NEW_FIRST = 1
|
REV_CARDS_NEW_FIRST = 1
|
||||||
REV_CARDS_RANDOM = 2
|
REV_CARDS_RANDOM = 2
|
||||||
|
|
||||||
|
# maximum characters to store in sort cache
|
||||||
|
SORT_FIELD_LEN = 20
|
||||||
|
|
||||||
# Labels
|
# Labels
|
||||||
##########################################################################
|
##########################################################################
|
||||||
|
|
||||||
|
|
50
anki/deck.py
50
anki/deck.py
|
@ -627,9 +627,13 @@ where id = :id""", vals)
|
||||||
def currentModel(self):
|
def currentModel(self):
|
||||||
return self.getModel(self.conf['currentModelId'])
|
return self.getModel(self.conf['currentModelId'])
|
||||||
|
|
||||||
def allModels(self):
|
def models(self):
|
||||||
return [self.getModel(id) for id in self.db.list(
|
"Return a dict of mid -> model."
|
||||||
"select id from models")]
|
mods = {}
|
||||||
|
for m in [self.getModel(id) for id in self.db.list(
|
||||||
|
"select id from models")]:
|
||||||
|
mods[m.id] = m
|
||||||
|
return mods
|
||||||
|
|
||||||
def getModel(self, mid):
|
def getModel(self, mid):
|
||||||
return anki.models.Model(self, mid)
|
return anki.models.Model(self, mid)
|
||||||
|
@ -860,9 +864,7 @@ where tid in %s""" % strids, now=time.time())
|
||||||
where = ""
|
where = ""
|
||||||
else:
|
else:
|
||||||
raise Exception()
|
raise Exception()
|
||||||
mods = {}
|
mods = self.models()
|
||||||
for m in self.allModels():
|
|
||||||
mods[m.id] = m
|
|
||||||
groups = dict(self.db.all("select id, name from groups"))
|
groups = dict(self.db.all("select id, name from groups"))
|
||||||
return [self._renderQA(mods[row[2]], groups[row[3]], row)
|
return [self._renderQA(mods[row[2]], groups[row[3]], row)
|
||||||
for row in self._qaData(where)]
|
for row in self._qaData(where)]
|
||||||
|
@ -908,24 +910,32 @@ from cards c, facts f, models m, groups g
|
||||||
where c.fid == f.id and f.mid == m.id and c.gid = g.id
|
where c.fid == f.id and f.mid == m.id and c.gid = g.id
|
||||||
%s""" % where)
|
%s""" % where)
|
||||||
|
|
||||||
# Field checksum bulk update
|
# Field checksums and sorting fields
|
||||||
##########################################################################
|
##########################################################################
|
||||||
|
|
||||||
def updateFieldChecksums(self, fids):
|
def _fieldData(self, sfids):
|
||||||
"Update all field checksums, after find&replace, etc."
|
return self.db.execute(
|
||||||
|
"select id, mid, flds from facts where id in "+sfids)
|
||||||
|
|
||||||
|
def updateFieldCache(self, fids, csum=True):
|
||||||
|
"Update field checksums and sort cache, after find&replace, etc."
|
||||||
sfids = ids2str(fids)
|
sfids = ids2str(fids)
|
||||||
mods = {}
|
mods = self.models()
|
||||||
for m in self.allModels():
|
|
||||||
mods[m.id] = m
|
|
||||||
r = []
|
r = []
|
||||||
for row in self._qaData(where="and f.id in "+sfids):
|
r2 = []
|
||||||
fields = splitFields(row[6])
|
for (fid, mid, flds) in self._fieldData(sfids):
|
||||||
model = mods[row[2]]
|
fields = splitFields(flds)
|
||||||
for c, f in enumerate(model.fields):
|
model = mods[mid]
|
||||||
if f['uniq'] and fields[c]:
|
if csum:
|
||||||
r.append((row[1], model.id, fieldChecksum(fields[c])))
|
for c, f in enumerate(model.fields):
|
||||||
self.db.execute("delete from fsums where fid in "+sfids)
|
if f['uniq'] and fields[c]:
|
||||||
self.db.executemany("insert into fsums values (?,?,?)", r)
|
r.append((fid, mid, fieldChecksum(fields[c])))
|
||||||
|
r2.append((stripHTML(fields[model.sortIdx()])[
|
||||||
|
:SORT_FIELD_LEN], fid))
|
||||||
|
if csum:
|
||||||
|
self.db.execute("delete from fsums where fid in "+sfids)
|
||||||
|
self.db.executemany("insert into fsums values (?,?,?)", r)
|
||||||
|
self.db.executemany("update facts set sfld = ? where id = ?", r2)
|
||||||
|
|
||||||
# Tags
|
# Tags
|
||||||
##########################################################################
|
##########################################################################
|
||||||
|
|
|
@ -40,7 +40,7 @@ select mid, crt, mod, tags, flds, data from facts where id = ?""", self.id)
|
||||||
def flush(self):
|
def flush(self):
|
||||||
self.mod = intTime()
|
self.mod = intTime()
|
||||||
# facts table
|
# facts table
|
||||||
sfld = self._fields[self.model.sortField()]
|
sfld = self._fields[self.model.sortIdx()]
|
||||||
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.crt,
|
self.id, self.mid, self.crt,
|
||||||
|
|
|
@ -10,6 +10,7 @@ from anki.lang import _
|
||||||
##########################################################################
|
##########################################################################
|
||||||
|
|
||||||
defaultConf = {
|
defaultConf = {
|
||||||
|
'sortf': 0,
|
||||||
}
|
}
|
||||||
|
|
||||||
defaultField = {
|
defaultField = {
|
||||||
|
@ -75,6 +76,9 @@ insert or replace into models values (?, ?, ?, ?, ?, ?, ?)""",
|
||||||
self.genCSS())
|
self.genCSS())
|
||||||
self.id = ret.lastrowid
|
self.id = ret.lastrowid
|
||||||
|
|
||||||
|
def fids(self):
|
||||||
|
return self.deck.db.list("select id from facts where mid = ?", self.id)
|
||||||
|
|
||||||
# Fields
|
# Fields
|
||||||
##################################################
|
##################################################
|
||||||
|
|
||||||
|
@ -89,9 +93,13 @@ insert or replace into models values (?, ?, ?, ?, ?, ?, ?)""",
|
||||||
"Mapping of field name -> (ord, conf)."
|
"Mapping of field name -> (ord, conf)."
|
||||||
return dict([(f['name'], (c, f)) for c, f in enumerate(self.fields)])
|
return dict([(f['name'], (c, f)) for c, f in enumerate(self.fields)])
|
||||||
|
|
||||||
def sortField(self):
|
def sortIdx(self):
|
||||||
print "sortField() fixme"
|
return self.conf['sortf']
|
||||||
return 0
|
|
||||||
|
def setSortIdx(self, idx):
|
||||||
|
assert idx > 0 and idx < len(self.fields)
|
||||||
|
self.conf['sortf'] = idx
|
||||||
|
self.deck.updateFieldCache(self.fids(), csum=False)
|
||||||
|
|
||||||
# Templates
|
# Templates
|
||||||
##################################################
|
##################################################
|
||||||
|
|
|
@ -307,10 +307,12 @@ originalPath from media2""")
|
||||||
|
|
||||||
# models
|
# models
|
||||||
###########
|
###########
|
||||||
|
import anki.models
|
||||||
_moveTable(db, "models")
|
_moveTable(db, "models")
|
||||||
db.execute("""
|
db.execute("""
|
||||||
insert into models select id, cast(modified as int),
|
insert into models select id, cast(modified as int),
|
||||||
name, "{}", "{}", "{}", "" from models2""")
|
name, "{}", "{}", ?, "" from models2""", simplejson.dumps(
|
||||||
|
anki.models.defaultConf))
|
||||||
db.execute("drop table models2")
|
db.execute("drop table models2")
|
||||||
|
|
||||||
# reviewHistory -> revlog
|
# reviewHistory -> revlog
|
||||||
|
@ -454,9 +456,9 @@ questionAlign, lastFontColour, allowEmptyAnswer, typeAnswer from cardModels"""):
|
||||||
|
|
||||||
def _rewriteModelIds(deck):
|
def _rewriteModelIds(deck):
|
||||||
# rewrite model/template/field ids
|
# rewrite model/template/field ids
|
||||||
models = deck.allModels()
|
models = deck.models()
|
||||||
deck.db.execute("delete from models")
|
deck.db.execute("delete from models")
|
||||||
for c, m in enumerate(models):
|
for c, m in enumerate(models.values()):
|
||||||
old = m.id
|
old = m.id
|
||||||
m.id = c+1
|
m.id = c+1
|
||||||
m.flush()
|
m.flush()
|
||||||
|
@ -468,7 +470,7 @@ def _postSchemaUpgrade(deck):
|
||||||
# fix up model/template ids
|
# fix up model/template ids
|
||||||
_rewriteModelIds(deck)
|
_rewriteModelIds(deck)
|
||||||
# update uniq cache
|
# update uniq cache
|
||||||
deck.updateFieldChecksums(deck.db.list("select id from facts"))
|
deck.updateFieldCache(deck.db.list("select id from facts"))
|
||||||
# remove old views
|
# remove old views
|
||||||
for v in ("failedCards", "revCardsOld", "revCardsNew",
|
for v in ("failedCards", "revCardsOld", "revCardsNew",
|
||||||
"revCardsDue", "revCardsRandom", "acqCardsRandom",
|
"revCardsDue", "revCardsRandom", "acqCardsRandom",
|
||||||
|
|
Loading…
Reference in a new issue