diff --git a/anki/sched.py b/anki/sched.py index 1f173121c..d6076fe49 100644 --- a/anki/sched.py +++ b/anki/sched.py @@ -552,8 +552,12 @@ did = ? and queue = 3 and due <= ? limit ?""", return self._newConf(card) def _rescheduleAsRev(self, card, conf, early): - if card.type == 2: - card.due = max(self.today+1, card.odue) + lapse = card.type == 2 + if lapse: + if self._resched(card): + card.due = max(self.today+1, card.odue) + else: + card.due = card.odue card.odue = 0 else: self._rescheduleNew(card, conf, early) @@ -566,7 +570,7 @@ did = ? and queue = 3 and due <= ? limit ?""", card.odue = 0 card.odid = 0 # if rescheduling is off, it needs to be set back to a new card - if not resched: + if not resched and not lapse: card.queue = card.type = 0 card.due = self.col.nextID("pos") @@ -592,8 +596,9 @@ did = ? and queue = 3 and due <= ? limit ?""", def _graduatingIvl(self, card, conf, early, adj=True): if card.type == 2: # lapsed card being relearnt - if card.odid and conf['resched']: - return self._dynIvlBoost(card) + if card.odid: + if conf['resched']: + return self._dynIvlBoost(card) return card.ivl if not early: # graduate @@ -1128,6 +1133,8 @@ your short-term review workload will become.""")) left = card.left%1000 - 1 if left <= 0: # graduate + if not self._resched(card): + return 0 return self._graduatingIvl(card, conf, False, adj=False) * 86400 else: return self._delayForGrade(conf, left) diff --git a/tests/test_sched.py b/tests/test_sched.py index 7905c6abd..eb17817b5 100644 --- a/tests/test_sched.py +++ b/tests/test_sched.py @@ -650,6 +650,24 @@ def test_cram_resched(): assert d.sched.nextIvlStr(c, 3) == "" d.sched.answerCard(c, 3) assert c.queue == c.type == 0 + # undue reviews should also be unaffected + c.ivl = 100 + c.type = c.queue = 2 + c.due = d.sched.today + 25 + c.factor = 2500 + c.flush() + cardcopy = copy.copy(c) + d.sched.rebuildDyn(did) + d.reset() + c = d.sched.getCard() + assert ni(c, 1) == 600 + assert ni(c, 2) == 0 + assert ni(c, 3) == 0 + d.sched.answerCard(c, 2) + assert c.ivl == 100 + assert c.due == d.sched.today + 25 + # check failure too + def test_adjIvl(): d = getEmptyDeck()