mirror of
https://github.com/ankitects/anki.git
synced 2025-09-19 14:32:22 -04:00
add flag fields for conditional templates
This commit is contained in:
parent
d9a19f3e5e
commit
87a996cdce
2 changed files with 50 additions and 0 deletions
|
@ -577,6 +577,48 @@ and ord = ? limit 1""", m['id'], t['ord']):
|
||||||
d.models.remTemplate(m, r)
|
d.models.remTemplate(m, r)
|
||||||
d.models.save(m)
|
d.models.save(m)
|
||||||
|
|
||||||
|
# Conditional templates
|
||||||
|
######################################################################
|
||||||
|
# For models that don't use a given template in all cards, we'll need to
|
||||||
|
# add a new field to notes to indicate if the card should be generated or not
|
||||||
|
|
||||||
|
def _addFlagFields(self):
|
||||||
|
for m in self.col.models.all():
|
||||||
|
nids = self.col.models.nids(m)
|
||||||
|
changed = False
|
||||||
|
for tmpl in m['tmpls']:
|
||||||
|
if self._addFlagFieldsForTemplate(m, nids, tmpl):
|
||||||
|
changed = True
|
||||||
|
if changed:
|
||||||
|
# save model
|
||||||
|
self.col.models.save(m, templates=True)
|
||||||
|
|
||||||
|
def _addFlagFieldsForTemplate(self, m, nids, tmpl):
|
||||||
|
cids = self.col.db.list(
|
||||||
|
"select id from cards where nid in %s and ord = ?" %
|
||||||
|
ids2str(nids), tmpl['ord'])
|
||||||
|
if len(cids) == len(nids):
|
||||||
|
# not selectively used
|
||||||
|
return
|
||||||
|
# add a flag field
|
||||||
|
name = tmpl['name']
|
||||||
|
have = [f['name'] for f in m['flds']]
|
||||||
|
while name in have:
|
||||||
|
name += "_"
|
||||||
|
f = self.col.models.newField(name)
|
||||||
|
self.col.models.addField(m, f)
|
||||||
|
# find the notes that have that card
|
||||||
|
haveNids = self.col.db.list(
|
||||||
|
"select nid from cards where id in "+ids2str(cids))
|
||||||
|
# add "y" to the appended field for those notes
|
||||||
|
self.col.db.execute(
|
||||||
|
"update notes set flds = flds || 'y' where id in "+ids2str(
|
||||||
|
haveNids))
|
||||||
|
# wrap the template in a conditional
|
||||||
|
tmpl['qfmt'] = "{{#%s}}\n%s\n{{/%s}}" % (
|
||||||
|
f['name'], tmpl['qfmt'], f['name'])
|
||||||
|
return True
|
||||||
|
|
||||||
# New due times
|
# New due times
|
||||||
######################################################################
|
######################################################################
|
||||||
# New cards now use a user-friendly increasing integer rather than a
|
# New cards now use a user-friendly increasing integer rather than a
|
||||||
|
@ -609,6 +651,8 @@ and ord = ? limit 1""", m['id'], t['ord']):
|
||||||
self._rewriteMediaRefs()
|
self._rewriteMediaRefs()
|
||||||
# template handling has changed
|
# template handling has changed
|
||||||
self._upgradeTemplates()
|
self._upgradeTemplates()
|
||||||
|
# add fields for selectively used templates
|
||||||
|
self._addFlagFields()
|
||||||
# fix creation time
|
# fix creation time
|
||||||
col.sched._updateCutoff()
|
col.sched._updateCutoff()
|
||||||
d = datetime.datetime.today()
|
d = datetime.datetime.today()
|
||||||
|
|
|
@ -29,6 +29,12 @@ def test_upgrade():
|
||||||
deck.reset()
|
deck.reset()
|
||||||
deck.conf['counts'] = COUNT_REMAINING
|
deck.conf['counts'] = COUNT_REMAINING
|
||||||
assert deck.sched.counts() == (3,4,1)
|
assert deck.sched.counts() == (3,4,1)
|
||||||
|
# modifying each note should not cause new cards to be generated
|
||||||
|
assert deck.cardCount() == 6
|
||||||
|
for nid in deck.db.list("select id from notes"):
|
||||||
|
note = deck.getNote(nid)
|
||||||
|
note.flush()
|
||||||
|
assert deck.cardCount() == 6
|
||||||
# now's a good time to test the integrity check too
|
# now's a good time to test the integrity check too
|
||||||
deck.fixIntegrity()
|
deck.fixIntegrity()
|
||||||
# c = deck.sched.getCard()
|
# c = deck.sched.getCard()
|
||||||
|
|
Loading…
Reference in a new issue