From 66d019422c75419095c4660fe53dd4f2d0e62b18 Mon Sep 17 00:00:00 2001 From: Arthur Milchior Date: Wed, 23 Oct 2019 03:44:44 +0200 Subject: [PATCH] New model can be edited without full sync This commit solves a problem that I had many time in the past. When I create a new model, I usually want to edit it. Clone of existing models present no interest by themselves. And as soon as I edit it, I need to do a full sync. As far as I understand ankiweb (which is sadly closed source), the full sync is required because ankiweb needs to know that the model associated to note type on the server did change. But since the model is new, it has no note type associated to on the server, so there is no need to do a full sync immediatly. Since the model is new, it also means there is no risk of the inconsistency with a change made in another computer/smartphone. Thus, when a field/template is added, I check that the model is not new by checking both whether it's id is not null, and also that it's usn is not -1. (I set usn early in the model's life) If it does not make into anki, then it'll be an add-on. But it's worth a try first. --- anki/models.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/anki/models.py b/anki/models.py index d37b7e24e..f9ebd997b 100644 --- a/anki/models.py +++ b/anki/models.py @@ -150,6 +150,7 @@ class ModelManager: m['tmpls'] = [] m['tags'] = [] m['id'] = None + m['usn'] = self.col.usn() return m def rem(self, m): @@ -225,6 +226,7 @@ and notes.mid = ? and cards.ord = ?""", m['id'], ord) m2 = copy.deepcopy(m) m2['name'] = _("%s copy") % m2['name'] self.add(m2) + m['usn'] = self.col.usn() return m2 # Fields @@ -253,9 +255,7 @@ and notes.mid = ? and cards.ord = ?""", m['id'], ord) self.save(m) def addField(self, m, field): - # only mod schema if model isn't new - if m['id']: - self.col.modSchema(check=True) + self._modSchemaIfRequired(m) m['flds'].append(field) self._updateFieldOrds(m) self.save(m) @@ -352,8 +352,7 @@ and notes.mid = ? and cards.ord = ?""", m['id'], ord) def addTemplate(self, m, template): "Note: should col.genCards() afterwards." - if m['id']: - self.col.modSchema(check=True) + self._modSchemaIfRequired(m) m['tmpls'].append(template) self._updateTemplOrds(m) self.save(m) @@ -474,6 +473,10 @@ select id from notes where mid = ?)""" % " ".join(map), d) self.col.remCards(deleted) + def _modSchemaIfRequired(self, m): + if m['id'] and m["usn"] != -1: + self.col.modSchema(check=True) + # Schema hash ##########################################################################