diff --git a/anki/stats.py b/anki/stats.py
index 9c62b6ef0..e8cac5061 100644
--- a/anki/stats.py
+++ b/anki/stats.py
@@ -106,14 +106,13 @@ class CollectionStats(object):
def report(self, type=0):
# 0=days, 1=weeks, 2=months
- # period-dependent graphs
self.type = type
from statsbg import bg
txt = self.css % bg
+ txt += self.todayStats()
txt += self.dueGraph()
txt += self.repsGraph()
txt += self.ivlGraph()
- # other graphs & info
txt += self.hourGraph()
txt += self.easeGraph()
txt += self.cardGraph()
@@ -129,6 +128,47 @@ body {background-image: url(data:image/png;base64,%s); }
"""
+ # Today stats
+ ######################################################################
+
+ def todayStats(self):
+ b = self._title(_("Today"))
+ # studied today
+ lim = self._revlogLimit()
+ if lim:
+ lim = " and " + lim
+ cards, thetime, failed, lrn, rev, relrn, filt = self.col.db.first("""
+select count(), sum(time)/1000,
+sum(case when ease = 0 then 1 else 0 end), /* failed */
+sum(case when type = 0 then 1 else 0 end), /* learning */
+sum(case when type = 1 then 1 else 0 end), /* review */
+sum(case when type = 2 then 1 else 0 end), /* relearn */
+sum(case when type = 3 then 1 else 0 end) /* filter */
+from revlog where id > ? """+lim, (self.col.sched.dayCutoff-86400)*1000)
+ cards = cards or 0
+ thetime = thetime or 0
+ failed = failed or 0
+ lrn = lrn or 0
+ rev = rev or 0
+ relrn = relrn or 0
+ filt = filt or 0
+ # studied
+ def bold(s):
+ return ""+str(s)+""
+ msgp1 = ngettext("%d card", "%d cards", cards) % cards
+ b += _("Studied %(a)s in %(b)s today.") % dict(
+ a=bold(msgp1), b=bold(fmtTimeSpan(thetime, unit=1)))
+ # again/pass count
+ b += "
" + _("Again count: %s") % bold(failed)
+ if cards:
+ b += " " + _("(%s correct)") % bold(
+ "%0.1f%%" %((1-failed/float(cards))*100))
+ # type breakdown
+ b += "
"
+ b += (_("Learn: %(a)s, Review: %(b)s, Relearn: %(c)s, Filtered: %(d)s")
+ % dict(a=bold(lrn), b=bold(rev), c=bold(relrn), d=bold(filt)))
+ return b
+
# Due and cumulative due
######################################################################
@@ -175,6 +215,11 @@ body {background-image: url(data:image/png;base64,%s); }
self._line(i, _("Total"), ngettext("%d review", "%d reviews", tot) % tot)
self._line(i, _("Average"), self._avgDay(
tot, num, _("reviews")))
+ tomorrow = self.col.db.scalar("""
+select count() from cards where did in %s and queue in (2,3)
+and due = ?""" % self._limit(), self.col.sched.today+1)
+ tomorrow = ngettext("%d card", "%d cards", tomorrow) % tomorrow
+ self._line(i, _("Due tomorrow"), tomorrow)
return self._lineTbl(i)
def _due(self, start=None, end=None, chunk=1):