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.
This commit is contained in:
Arthur Milchior 2019-10-23 03:44:44 +02:00
parent fed2f2fa3d
commit b78480fe52

View file

@ -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
##########################################################################