diff --git a/scopes/storage/common.py b/scopes/storage/common.py index 78c2850..e0d5995 100644 --- a/scopes/storage/common.py +++ b/scopes/storage/common.py @@ -33,12 +33,16 @@ class Storage(object): def add(self, container): self.containers[container.itemFactory.prefix] = container + def getContainer(self, prefix): + container = self.containers.get(prefix) + if container is None: + return self.create(registry[prefix]) + return container + def getItem(self, uid): prefix, id = uid.split('-') id = int(id) - container = self.containers.get(prefix) - if container is None: - container = self.create(registry[prefix]) + container = self.getContainer(prefix) return container.get(id) def getExistingTable(self, tableName): diff --git a/scopes/storage/concept.py b/scopes/storage/concept.py index df962cb..129bd05 100644 --- a/scopes/storage/concept.py +++ b/scopes/storage/concept.py @@ -4,7 +4,7 @@ from zope.interface import implementer from scopes.interfaces import IConcept -from scopes.storage.common import registerContainerClass +from scopes.storage.common import registerContainerClass, registry from scopes.storage.tracking import Container, Track @@ -51,16 +51,21 @@ class Rels(Container): class Type(Concept): - headFields = ['name', 'prefix'] + headFields = ['name', 'tprefix'] prefix = 'type' - def get(key, default=None): - return self.container.queryLast(name=key) or default + def get(self, key, default=None): + cont = self.container.storage.getContainer(self.tprefix) + return cont.queryLast(name=key) or default + + def values(self): + cont = self.container.storage.getContainer(self.tprefix) + return cont.query() @registerContainerClass class Types(Concepts): itemFactory = Type - indexes = [('name',), ('prefix',)] + indexes = [('name',), ('tprefix',)] tableName = 'types' diff --git a/scopes/storage/tracking.py b/scopes/storage/tracking.py index 35c4213..e33e574 100644 --- a/scopes/storage/tracking.py +++ b/scopes/storage/tracking.py @@ -98,8 +98,11 @@ class Container(object): return tr def query(self, **crit): - stmt = self.table.select().where( + if crit: + stmt = self.table.select().where( and_(*self.setupWhere(crit))).order_by(self.table.c.trackid) + else: + stmt = self.table.select().order_by(self.table.c.trackid) for r in self.session.execute(stmt): yield self.makeTrack(r) @@ -109,6 +112,7 @@ class Container(object): return self.makeTrack(self.session.execute(stmt).first()) def save(self, track): + track.container = self crit = dict((hf, track.head[hf]) for hf in track.headFields) found = self.queryLast(**crit) if found is None: diff --git a/tests/tlib_storage.py b/tests/tlib_storage.py index 0c6c70b..a0b1056 100644 --- a/tests/tlib_storage.py +++ b/tests/tlib_storage.py @@ -78,7 +78,15 @@ def test_type(self, config): storage = config.storageFactory(config.dbschema) storage.dropTable('types') types = storage.create(concept.Types) - tid01 = types.save(concept.Type('type', 'type')) - self.assertEqual(tid01, 1) + ttype = concept.Type('type', concept.Type.prefix) + ttid = types.save(ttype) + self.assertEqual(ttid, 1) + tps = list(ttype.values()) + self.assertEqual(len(tps), 1) + + tfolder = concept.Type('folder', folder.Folder.prefix) + tfid = types.save(tfolder) + fldrs = list(tfolder.values()) + self.assertEqual(len(fldrs), 2) storage.commit()