From b0f7ddfefb3016a335384070b7b0269a956ad98c Mon Sep 17 00:00:00 2001 From: Damien Elmes Date: Thu, 19 Mar 2015 15:35:04 +1100 Subject: [PATCH] don't bump mod time when moving cards into/out of a filtered deck fixes the following: - create a filtered deck and sync it - review cards in the filtered deck and delete it - sync again The filtered deck deletion was bumping the mod time on cards at the start of the sync, preventing the reviews from being synced from the other side, leading to lost reviews and sanity check errors. --- anki/sched.py | 8 ++++---- tests/test_sync.py | 30 ++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/anki/sched.py b/anki/sched.py index 2416ba84b..61c26256a 100644 --- a/anki/sched.py +++ b/anki/sched.py @@ -975,8 +975,8 @@ select id from cards where did in %s and queue = 2 and due <= ? limit ?)""" self.col.db.execute(""" update cards set did = odid, queue = (case when type = 1 then 0 else type end), type = (case when type = 1 then 0 else type end), -due = odue, odue = 0, odid = 0, usn = ?, mod = ? where %s""" % lim, - self.col.usn(), intTime()) +due = odue, odue = 0, odid = 0, usn = ? where %s""" % lim, + self.col.usn()) def remFromDyn(self, cids): self.emptyDyn(None, "id in %s and odid" % ids2str(cids)) @@ -1012,7 +1012,7 @@ due = odue, odue = 0, odid = 0, usn = ?, mod = ? where %s""" % lim, t = intTime(); u = self.col.usn() for c, id in enumerate(ids): # start at -100000 so that reviews are all due - data.append((did, -100000+c, t, u, id)) + data.append((did, -100000+c, u, id)) # due reviews stay in the review queue. careful: can't use # "odid or did", as sqlite converts to boolean queue = """ @@ -1023,7 +1023,7 @@ due = odue, odue = 0, odid = 0, usn = ?, mod = ? where %s""" % lim, update cards set odid = (case when odid then odid else did end), odue = (case when odue then odue else due end), -did = ?, queue = %s, due = ?, mod = ?, usn = ? where id = ?""" % queue, data) +did = ?, queue = %s, due = ?, usn = ? where id = ?""" % queue, data) def _dynIvlBoost(self, card): assert card.odid and card.type == 2 diff --git a/tests/test_sync.py b/tests/test_sync.py index 72ab99701..5e35a41e5 100644 --- a/tests/test_sync.py +++ b/tests/test_sync.py @@ -332,3 +332,33 @@ def _test_speed(): print "load %d" % ((time.time() - t)*1000); t = time.time() assert client.sync() == "success" print "sync %d" % ((time.time() - t)*1000); t = time.time() + +@nose.with_setup(setup_modified) +def test_filtered_delete(): + test_sync() + nid = deck1.db.scalar("select id from notes") + note = deck1.getNote(nid) + card = note.cards()[0] + card.type = 2 + card.ivl = 10 + card.factor = 2500 + card.due = deck1.sched.today + card.flush() + # put cards into a filtered deck + did = deck1.decks.newDyn("dyn") + deck1.sched.rebuildDyn(did) + # sync the filtered deck + assert client.sync() == "success" + # answer the card locally + time.sleep(1) + card.load() + card.startTimer() + deck1.sched.answerCard(card, 4) + assert card.ivl > 10 + # delete the filtered deck + deck1.decks.rem(did) + # sync again + assert client.sync() == "success" + card.load() + assert card.ivl > 10 + return