From 2d00163323437497978d4f361e89b794d2108368 Mon Sep 17 00:00:00 2001 From: Damien Elmes Date: Mon, 28 Mar 2011 20:02:28 +0900 Subject: [PATCH] tree grouping; add column to groups so they can remember tags --- anki/deck.py | 30 +++++++++++++++++++++++++----- anki/groups.py | 17 ++++------------- anki/storage.py | 8 +++++--- tests/test_deck.py | 9 +++++++++ 4 files changed, 43 insertions(+), 21 deletions(-) diff --git a/anki/deck.py b/anki/deck.py index c3bdac9e1..4e013e397 100644 --- a/anki/deck.py +++ b/anki/deck.py @@ -2,7 +2,8 @@ # Copyright: Damien Elmes # License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html -import time, os, random, re, stat, simplejson, datetime, copy +import time, os, random, re, stat, simplejson, datetime, copy, itertools +import operator from anki.lang import _, ngettext from anki.utils import parseTags, tidyHTML, ids2str, hexifyID, \ @@ -554,15 +555,34 @@ update facts set tags = :t, mod = :n where id = :id""", [fix(row) for row in res def groups(self): "A list of all group names." - return self.db.list("select name from groups") + return self.db.list("select name from groups order by name") + + def groupsTree(self): + return self._groupChildren(self.groups()) + + def _groupChildren(self, grps): + tree = [] + for (head, tail) in itertools.groupby([x.split("::", 1) for x in grps], + key=operator.itemgetter(0)): + tail = list(tail) + l = [c[1] for c in tail if len(c) > 1] + children = self._groupChildren(l) + tree.append((head, children)) + return tuple(tree) + for g in grps: + names = g.split("::") + if g == last: + top[-1][1].append(g) + pass def groupId(self, name): "Return the id for NAME, creating if necessary." id = self.db.scalar("select id from groups where name = ?", name) if not id: - id = self.db.execute("insert into groups values (?,?,?,?)", - self.nextID("gid"), intTime(), name, - 1).lastrowid + id = self.db.execute( + "insert into groups values (?,?,?,?, ?)", + self.nextID("gid"), intTime(), name, 1, + simplejson.dumps(anki.groups.defaultData)).lastrowid return id def delGroup(self, gid): diff --git a/anki/groups.py b/anki/groups.py index cb294b192..4ff2cbc34 100644 --- a/anki/groups.py +++ b/anki/groups.py @@ -33,16 +33,7 @@ defaultConf = { 'maxTaken': 60, } -class GroupConfig(object): - def __init__(self, name): - self.name = name - self.id = None - self.config = defaultConf - - def load(self): - self.config = simplejson.loads(self._config) - return self - - def save(self): - self._config = simplejson.dumps(self.config) - self.modified = intTime() +defaultData = { + 'activeTags': None, + 'inactiveTags': None, +} diff --git a/anki/storage.py b/anki/storage.py index de80e5567..f084ce15c 100644 --- a/anki/storage.py +++ b/anki/storage.py @@ -123,7 +123,8 @@ create table if not exists groups ( id integer primary key, mod integer not null, name text not null, - gcid integer not null + gcid integer not null, + data text not null ); create table if not exists gconf ( @@ -162,8 +163,9 @@ values(1,0,0,0,%(v)s,0,'',0,'', '', ''); intTime(), _("Default Config"), simplejson.dumps(anki.groups.defaultConf)) db.execute( - "insert or ignore into groups values (1, ?, ?, 1)", - intTime(), _("Default Group")) + "insert or ignore into groups values (1, ?, ?, 1, ?)", + intTime(), _("Default Group"), simplejson.dumps( + anki.groups.defaultData)) if setDeckConf: db.execute("update deck set qconf = ?, conf = ?, data = ?", simplejson.dumps(anki.deck.defaultQconf), diff --git a/tests/test_deck.py b/tests/test_deck.py index e4cc240a4..064727230 100644 --- a/tests/test_deck.py +++ b/tests/test_deck.py @@ -177,3 +177,12 @@ def test_selective(): assert deck.db.scalar("select count() from cards where gid = 3") == 3 deck.setGroupForTags(["one"], [], 2) assert deck.db.scalar("select count() from cards where gid = 2") == 2 + +def test_groups(): + d = getEmptyDeck() + tree = d._groupChildren( + ["a", "b", "c::1", "c::2", "d", "d::1", "d::1::2::3"]) + assert tree[0] == ("a", tuple()) + assert tree[1] == ("b", tuple()) + assert tree[2] == ("c", (("1", tuple()), ("2", tuple()))) + assert tree[3] == ('d', (('1', (('2', (('3', ()),)),)),))