From 4428c04774c9e099f652da1bb22e0bc8b76ad61f Mon Sep 17 00:00:00 2001 From: Damien Elmes Date: Sat, 10 Dec 2011 22:36:18 +0900 Subject: [PATCH] new order is now a deck property --- anki/collection.py | 26 ++++++++++++++++---------- anki/consts.py | 10 +++------- anki/decks.py | 3 ++- anki/models.py | 5 ----- anki/sched.py | 4 ++-- anki/upgrade.py | 12 ++++++------ 6 files changed, 29 insertions(+), 31 deletions(-) diff --git a/anki/collection.py b/anki/collection.py index d3b346676..e62b2258a 100644 --- a/anki/collection.py +++ b/anki/collection.py @@ -2,7 +2,7 @@ # Copyright: Damien Elmes # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html -import time, os, random, re, stat, simplejson, datetime, copy, shutil +import time, os, random, re, stat, simplejson, datetime, copy, shutil, sys from anki.lang import _, ngettext from anki.utils import ids2str, hexifyID, checksum, fieldChecksum, stripHTML, \ intTime, splitFields, joinFields, maxID @@ -252,11 +252,8 @@ crt=?, mod=?, scm=?, dty=?, usn=?, ls=?, conf=?""", if not cms: return 0 note.flush() - # randomize? - if self.models.randomNew(): - due = self._randPos() - else: - due = self.nextID("pos") + # deck conf governs which of these are used + due = self.nextID("pos") # add cards ncards = 0 for template in cms: @@ -264,9 +261,6 @@ crt=?, mod=?, scm=?, dty=?, usn=?, ls=?, conf=?""", ncards += 1 return ncards - def _randPos(self): - return random.randrange(1, sys.maxint) - def remNotes(self, ids): self.remCards(self.db.list("select id from cards where nid in "+ ids2str(ids))) @@ -347,11 +341,23 @@ insert into cards values (?,?,?,?,?,-1,0,0,?,0,0,0,0,0,0,0,"")""", card.nid = note.id card.ord = template['ord'] card.did = template['did'] or note.did - card.due = due + card.due = self._dueForDid(card.did, due) if flush: card.flush() return card + def _dueForDid(self, did, due): + conf = self.decks.conf(did) + # in order due? + if conf['new']['order']: + return due + else: + # random mode; seed with note ts so all cards of this note get the + # same random number + r = random.Random() + r.seed(due) + return r.randrange(1, 2**32-1) + # Cards ########################################################################## diff --git a/anki/consts.py b/anki/consts.py index c39a866b8..ee7223f80 100644 --- a/anki/consts.py +++ b/anki/consts.py @@ -13,10 +13,6 @@ NEW_CARDS_FIRST = 2 NEW_CARDS_RANDOM = 0 NEW_CARDS_DUE = 1 -# sort order for day's new cards -NEW_TODAY_ORD = 0 -NEW_TODAY_DUE = 1 - # review card sort order REV_CARDS_RANDOM = 0 REV_CARDS_OLD_FIRST = 1 @@ -64,9 +60,9 @@ def newCardSchedulingLabels(): def revCardOrderLabels(): return { - 0: _("Review cards in date due order"), - 1: _("Review cards from largest interval"), - 2: _("Review cards from smallest interval"), + 0: _("Sort by due date"), + 1: _("Sort by decreasing interval (slower)"), + 2: _("Sort by increasing interval (slower)"), } def alignmentLabels(): diff --git a/anki/decks.py b/anki/decks.py index c364a2956..ccced239b 100644 --- a/anki/decks.py +++ b/anki/decks.py @@ -25,7 +25,8 @@ defaultConf = { 'delays': [1, 10], 'ints': [1, 4, 7], # 7 is not currently used 'initialFactor': 2500, - 'order': NEW_TODAY_ORD, + 'separate': True, + 'order': NEW_CARDS_DUE, 'perDay': 20, }, 'lapse': { diff --git a/anki/models.py b/anki/models.py index 940d06239..bad5d654d 100644 --- a/anki/models.py +++ b/anki/models.py @@ -17,11 +17,9 @@ defaultModel = { 'sortf': 0, 'did': 1, 'clozectx': False, - 'newOrder': NEW_CARDS_DUE, 'latexPre': """\ \\documentclass[12pt]{article} \\special{papersize=3in,5in} -% \\usepackage[utf8x]{inputenc} % uncomment this for foreign characters \\usepackage{amssymb,amsmath} \\pagestyle{empty} \\setlength{\\parindent}{0in} @@ -172,9 +170,6 @@ select id from cards where nid in (select id from notes where mid = ?)""", return self.col.db.scalar( "select count() from notes where mid = ?", m['id']) - def randomNew(self): - return self.current()['newOrder'] == NEW_CARDS_RANDOM - # Copying ################################################## diff --git a/anki/sched.py b/anki/sched.py index 2c68e0138..47fbebb5e 100644 --- a/anki/sched.py +++ b/anki/sched.py @@ -264,7 +264,7 @@ select id, due from cards where did = ? and queue = 0 limit ?""", did, lim) (id, due) = self._newQueue.pop() # move any siblings to the end? conf = self.col.decks.conf(self._newDids[0]) - if conf['new']['order'] == NEW_TODAY_ORD: + if conf['new']['separate']: n = len(self._newQueue) while self._newQueue and self._newQueue[-1][1] == due: self._newQueue.insert(0, self._newQueue.pop()) @@ -823,7 +823,7 @@ your short-term review workload will become.""")) "update cards set type=0,queue=0,ivl=0 where id in "+ids2str(ids)) pmax = self.col.db.scalar("select max(due) from cards where type=0") # takes care of mod + usn - self.sortCards(ids, start=pmax+1, shuffle=self.col.models.randomNew()) + self.sortCards(ids, start=pmax+1) def reschedCards(self, ids, imin, imax): "Put cards in review queue with a new interval in days (min, max)." diff --git a/anki/upgrade.py b/anki/upgrade.py index 3847d6e02..f77f4bb12 100644 --- a/anki/upgrade.py +++ b/anki/upgrade.py @@ -578,11 +578,6 @@ and ord = ? limit 1""", m['id'], t['ord']): self._rewriteMediaRefs() # template handling has changed self._upgradeTemplates() - # set new card order - for m in col.models.all(): - m['newOrder'] = col.conf['oldNewOrder'] - col.models.save(m) - del col.conf['oldNewOrder'] # fix creation time col.sched._updateCutoff() d = datetime.datetime.today() @@ -621,8 +616,13 @@ update cards set due = cast( (case when due < :stamp then 0 else 1 end) + ((due-:stamp)/86400) as int)+:today where type = 2 """, stamp=col.sched.dayCutoff, today=col.sched.today) + # set new card order + conf = col.decks.allConf()[0] + conf['new']['order'] = col.conf['oldNewOrder'] + col.decks.save(conf) + del col.conf['oldNewOrder'] # possibly re-randomize - if col.models.randomNew(): + if not conf['new']['order']: col.sched.randomizeCards(1) # update insertion id col.conf['nextPos'] = (