apply review limit; fix finished msg

This commit is contained in:
Damien Elmes 2011-11-15 04:05:44 +09:00
parent 4a4f4797db
commit 58c56c433a
3 changed files with 60 additions and 46 deletions

View file

@ -475,11 +475,13 @@ where queue = 1 and type = 2
gid, self.today) gid, self.today)
def _resetRevCount(self): def _resetRevCount(self):
top = self.deck.groups.top()
lim = min(self.reportLimit,
max(0, top['revLim'] - top['revToday'][1]))
self.revCount = self.deck.db.scalar(""" self.revCount = self.deck.db.scalar("""
select count() from (select id from cards where select count() from (select id from cards where
gid in %s and queue = 2 and due <= :lim limit %d)""" % ( gid in %s and queue = 2 and due <= :day limit %d)""" % (
self._groupLimit(), self.reportLimit), self._groupLimit(), lim), day=self.today)
lim=self.today)
def _resetRev(self): def _resetRev(self):
self._resetRevCount() self._resetRevCount()
@ -683,52 +685,37 @@ gid in %s and queue = 2 and due <= :lim %s limit %d""" % (
########################################################################## ##########################################################################
def finishedMsg(self): def finishedMsg(self):
return ( return ("<b>"+_(
"<h1>"+_("Congratulations!")+"</h1>"+ "Congratulations! You have finished the selected deck for now.")+
_("You have finished the selected groups for now.") + "</b><br><br>" + self._nextDueMsg())
"<br><br>"+
self._nextDueMsg())
def _nextDueMsg(self): def _nextDueMsg(self):
line = [] line = []
rev = self.revTomorrow() + self.lrnTomorrow() if self.revDue():
if rev: line.append(_("""\
line.append( Today's review limit has been reached, but there are still cards
ngettext("There will be <b>%s review</b>.", waiting to be reviewed. For optimum memory, consider increasing
"There will be <b>%s reviews</b>.", rev) % rev) the daily limit in the options."""))
new = self.newTomorrow() if self.newDue():
if new: line.append(_("""\
line.append( There are more new cards available, but the daily limit has been
ngettext("There will be <b>%d new</b> card.", reached. You can increase the limit in the options, but please
"There will be <b>%d new</b> cards.", new) % new) bear in mind that the more new cards you introduce, the higher
if line: your short-term review workload will become."""))
line.insert(0, _("At this time tomorrow:")) return "<br>".join(line)
buf = "<br>".join(line)
else:
buf = _("No cards are due tomorrow.")
buf = '<style>b { color: #00f; }</style>' + buf
return buf
def lrnTomorrow(self): def revDue(self):
"Number of cards in the learning queue due tomorrow." "True if there are any rev cards due."
return self.deck.db.scalar( return self.deck.db.scalar(
"select count() from cards where queue = 1 and due < ?", ("select 1 from cards where gid in %s and queue = 2 "
self.dayCutoff+86400) "and due <= ? limit 1") % self._groupLimit(),
self.today)
def revTomorrow(self): def newDue(self):
"Number of reviews due tomorrow." "True if there are any new cards due."
return self.deck.db.scalar( return self.deck.db.scalar(
"select count() from cards where gid in %s and queue = 2 and due = ?"% ("select 1 from cards where gid in %s and queue = 0 "
self._groupLimit(), self.today+1) "limit 1") % self._groupLimit())
def newTomorrow(self):
"Number of new cards tomorrow."
print "fixme: rethink newTomorrow() etc"
return 1
lim = self.deck.groups.top()['newPerDay']
return self.deck.db.scalar(
"select count() from (select id from cards where "
"gid in %s and queue = 0 limit %d)" % (self._groupLimit(), lim))
# Next time reports # Next time reports
########################################################################## ##########################################################################

View file

@ -284,18 +284,20 @@ def test_reviews():
def test_finished(): def test_finished():
d = getEmptyDeck() d = getEmptyDeck()
# nothing due # nothing due
assert "No cards are due" in d.sched.finishedMsg() assert "Congratulations" in d.sched.finishedMsg()
assert "limit" not in d.sched.finishedMsg()
f = d.newFact() f = d.newFact()
f['Front'] = u"one"; f['Back'] = u"two" f['Front'] = u"one"; f['Back'] = u"two"
d.addFact(f) d.addFact(f)
# have a new card # have a new card
assert "1 new" in d.sched.finishedMsg() assert "new cards available" in d.sched.finishedMsg()
# turn it into a review # turn it into a review
c = f.cards()[0] c = f.cards()[0]
c.startTimer() c.startTimer()
d.sched.answerCard(c, 3) d.sched.answerCard(c, 3)
# nothing should be due tomorrow, as it's due in a week # nothing should be due tomorrow, as it's due in a week
assert "No cards are due" in d.sched.finishedMsg() assert "Congratulations" in d.sched.finishedMsg()
assert "limit" not in d.sched.finishedMsg()
def test_nextIvl(): def test_nextIvl():
d = getEmptyDeck() d = getEmptyDeck()
@ -902,3 +904,21 @@ def test_resched():
c.load() c.load()
assert c.due == d.sched.today+1 assert c.due == d.sched.today+1
assert c.ivl == +1 assert c.ivl == +1
def test_revlim():
d = getEmptyDeck()
for i in range(20):
f = d.newFact()
f['Front'] = str(i)
d.addFact(f)
d.db.execute("update cards set due = 0, queue = 2, type = 2")
d.reset()
assert d.sched.repCounts()[2] == 20
for i in range(5):
d.sched.answerCard(d.sched.getCard(), 3)
assert d.sched.repCounts()[2] == 15
t = d.groups.top()
t['revLim'] = 10
d.reset()
assert d.sched.repCounts()[2] == 5

View file

@ -5,4 +5,11 @@ if [ -d 'locale' ]; then
else else
dir=. dir=.
fi fi
(cd $dir && nosetests -vs --with-coverage --cover-package=anki $@)
if [ x$coverage != x ]; then
args="--with-coverage"
else
args=""
echo "Call with coverage=1 to run coverage tests"
fi
(cd $dir && nosetests -vs $args --cover-package=anki $@)