fix type methods

This commit is contained in:
Helmut Merz 2024-03-14 11:30:59 +01:00
parent 3e1127e798
commit 1e165a711c
4 changed files with 32 additions and 11 deletions

View file

@ -33,12 +33,16 @@ class Storage(object):
def add(self, container): def add(self, container):
self.containers[container.itemFactory.prefix] = 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): def getItem(self, uid):
prefix, id = uid.split('-') prefix, id = uid.split('-')
id = int(id) id = int(id)
container = self.containers.get(prefix) container = self.getContainer(prefix)
if container is None:
container = self.create(registry[prefix])
return container.get(id) return container.get(id)
def getExistingTable(self, tableName): def getExistingTable(self, tableName):

View file

@ -4,7 +4,7 @@
from zope.interface import implementer from zope.interface import implementer
from scopes.interfaces import IConcept 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 from scopes.storage.tracking import Container, Track
@ -51,16 +51,21 @@ class Rels(Container):
class Type(Concept): class Type(Concept):
headFields = ['name', 'prefix'] headFields = ['name', 'tprefix']
prefix = 'type' prefix = 'type'
def get(key, default=None): def get(self, key, default=None):
return self.container.queryLast(name=key) or default 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 @registerContainerClass
class Types(Concepts): class Types(Concepts):
itemFactory = Type itemFactory = Type
indexes = [('name',), ('prefix',)] indexes = [('name',), ('tprefix',)]
tableName = 'types' tableName = 'types'

View file

@ -98,8 +98,11 @@ class Container(object):
return tr return tr
def query(self, **crit): def query(self, **crit):
if crit:
stmt = self.table.select().where( stmt = self.table.select().where(
and_(*self.setupWhere(crit))).order_by(self.table.c.trackid) 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): for r in self.session.execute(stmt):
yield self.makeTrack(r) yield self.makeTrack(r)
@ -109,6 +112,7 @@ class Container(object):
return self.makeTrack(self.session.execute(stmt).first()) return self.makeTrack(self.session.execute(stmt).first())
def save(self, track): def save(self, track):
track.container = self
crit = dict((hf, track.head[hf]) for hf in track.headFields) crit = dict((hf, track.head[hf]) for hf in track.headFields)
found = self.queryLast(**crit) found = self.queryLast(**crit)
if found is None: if found is None:

View file

@ -78,7 +78,15 @@ def test_type(self, config):
storage = config.storageFactory(config.dbschema) storage = config.storageFactory(config.dbschema)
storage.dropTable('types') storage.dropTable('types')
types = storage.create(concept.Types) types = storage.create(concept.Types)
tid01 = types.save(concept.Type('type', 'type')) ttype = concept.Type('type', concept.Type.prefix)
self.assertEqual(tid01, 1) 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() storage.commit()