From aa559431b6ddbfe13c6b972471dae93af63bebe9 Mon Sep 17 00:00:00 2001 From: Damien Elmes Date: Fri, 6 Apr 2012 12:45:01 +0900 Subject: [PATCH] on upgrade all cards of a note should share the same due # --- anki/upgrade.py | 22 ++-------------------- tests/shared.py | 4 ++-- tests/support/anki12-due.anki | Bin 0 -> 60416 bytes tests/test_upgrade.py | 6 ++++++ 4 files changed, 10 insertions(+), 22 deletions(-) create mode 100644 tests/support/anki12-due.anki diff --git a/anki/upgrade.py b/anki/upgrade.py index 62ea22608..55b254a02 100644 --- a/anki/upgrade.py +++ b/anki/upgrade.py @@ -624,24 +624,6 @@ and ord = ? limit 1""", m['id'], t['ord']): f['name'], tmpl['qfmt'], f['name']) return True - # New due times - ###################################################################### - # New cards now use a user-friendly increasing integer rather than a - # timestamp - - def _rewriteNewDue(self): - col = self.col - pos = 0 - data = [] - for id, due in col.db.execute( - "select id, due from cards where type = 0 order by id"): - pos += 1 - data.append((pos, id)) - col.db.executemany("update cards set due = ? where id = ?", data) - # update insertion id - col.conf['nextPos'] = pos + 1 - col.save() - # Post-schema upgrade ###################################################################### @@ -683,8 +665,6 @@ and ord = ? limit 1""", m['id'], t['ord']): # remove old deleted tables for t in ("cards", "notes", "models", "media"): col.db.execute("drop table if exists %sDeleted" % t) - # rewrite due times for new cards - self._rewriteNewDue() # and failed cards left = len(col.decks.confForDid(1)['new']['delays']) col.db.execute("update cards set odue = ?, left=? where type = 1", @@ -704,6 +684,8 @@ update cards set due = cast( conf = col.decks.allConf()[0] if not conf['new']['order']: col.sched.randomizeCards(1) + else: + col.sched.orderCards(1) # optimize and finish col.db.commit() col.db.execute("vacuum") diff --git a/tests/shared.py b/tests/shared.py index c8a1c3969..20d12401a 100644 --- a/tests/shared.py +++ b/tests/shared.py @@ -14,8 +14,8 @@ def getEmptyDeck(**kwargs): os.unlink(nam) return aopen(nam, **kwargs) -def getUpgradeDeckPath(): - src = os.path.join(testDir, "support", "anki12.anki") +def getUpgradeDeckPath(name="anki12.anki"): + src = os.path.join(testDir, "support", name) (fd, dst) = tempfile.mkstemp(suffix=".anki2") shutil.copy(src, dst) return dst diff --git a/tests/support/anki12-due.anki b/tests/support/anki12-due.anki new file mode 100644 index 0000000000000000000000000000000000000000..9da506c7ea9284e5b8c6d0dc692fba0e09808c90 GIT binary patch literal 60416 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 S0c24&6(j0P23I#;Qu}`p0Pu7G literal 0 HcmV?d00001 diff --git a/tests/test_upgrade.py b/tests/test_upgrade.py index d8fa43b50..466c64c1d 100644 --- a/tests/test_upgrade.py +++ b/tests/test_upgrade.py @@ -43,6 +43,12 @@ def test_upgrade1(): # print # print "--a", c.a() +def test_upgrade1_due(): + dst = getUpgradeDeckPath("anki12-due.anki") + u = Upgrader() + deck = u.upgrade(dst) + print deck.db.all("select nid, due from cards") + def test_upgrade2(): p = "/tmp/alpha-upgrade.anki2" if os.path.exists(p):