view: show target with items

This commit is contained in:
Helmut Merz 2024-03-15 11:35:07 +01:00
parent a108ad9fc3
commit 6cc5136550
5 changed files with 60 additions and 10 deletions

View file

@ -24,6 +24,15 @@ class IContainer(ITraversable):
and the value object (e.g. `parent´ and `name`) are stored correctly."""
class IReference(Interface):
def getTarget():
"""Return item referenced by this object."""
def setTarget(target):
"""Store reference to target item."""
class IView(Interface):
def __call__():

View file

@ -7,6 +7,7 @@ from zope.publisher.publish import publish
from scopes.interfaces import ITraversable, IView
from scopes.server.browser import getView
import scopes.storage.concept
from scopes.storage.folder import Root

View file

@ -2,7 +2,7 @@
import json
from zope.interface import implementer
from scopes.interfaces import IContainer, IView
from scopes.interfaces import IContainer, IReference, IView
views = {} # registry for all views: {name: {prefix: viewClass, ...}, ...}
@ -38,10 +38,24 @@ class DefaultView:
self.context = context
self.request = request
def __call__(self):
def prepareResult(self):
ob = self.context
result = dict(head=ob.head, data=ob.data)
result = ob.asDict()
if IContainer.providedBy(ob):
result['items'] = [v.asDict() for v in ob.values()]
return json.dumps(result)
if IReference.providedBy(ob):
target = ob.getTarget()
if target:
result['target'] = target.asDict()
if IContainer.providedBy(target):
result['target']['items'] = [v.asDict() for v in target.values()]
return result
def renderJson(self, result):
self.request.response.setHeader('Content-type', 'application/json; charset=utf-8')
return json.dumps(result).encode('UTF-8')
def __call__(self):
result = self.prepareResult()
return self.renderJson(result)

View file

@ -3,6 +3,7 @@
"""Core classes for concept map structure."""
from zope.interface import implementer
from scopes.interfaces import IContainer
from scopes.storage.common import registerContainerClass, registry
from scopes.storage.tracking import Container, Track
@ -17,6 +18,10 @@ class Concept(Track):
def children(self, predicate=None):
return self.container.queryRels(first=self, predicate=predicate)
def values(self):
return (t.getSecond() for t in self.children(Rels.defaultPredicate))
class Concepts(Container):
@ -77,18 +82,30 @@ class Rels(Container):
# types stuff
@implementer(IContainer)
class Type(Concept):
headFields = ['name', 'tprefix']
prefix = 'type'
def values(self):
cont = self.container.storage.getContainer(self.tprefix)
return cont.query()
def get(self, key, default=None):
cont = self.container.storage.getContainer(self.tprefix)
return cont.queryLast(name=key) or default
def values(self):
def __getitem__(self, key):
value = self.get(key)
if value is None:
raise KeyError(key)
return value
def __setitem__(self, key, value):
cont = self.container.storage.getContainer(self.tprefix)
return cont.query()
value.name = key
cont.save(value)
@registerContainerClass
@ -100,7 +117,7 @@ class Types(Concepts):
def storeType(storage, cls, name):
types = storage.create(Types)
types = storage.getContainer('type')
types.save(Type(name, cls.prefix))
def setupCoreTypes(storage):

View file

@ -2,12 +2,12 @@
from zope.interface import implementer
from scopes.interfaces import IContainer
from scopes.interfaces import IContainer, IReference
from scopes.storage.common import registerContainerClass
from scopes.storage.tracking import Container, Track
@implementer(IContainer)
@implementer(IContainer, IReference)
class Folder(Track):
headFields = ['parent', 'name', 'ref']
@ -29,7 +29,7 @@ class Folder(Track):
return value
def __getitem__(self, key):
value = self.container.queryLast(parent=self.rid, name=key)
value = self.get(key)
if value is None:
raise KeyError(key)
return value
@ -39,6 +39,15 @@ class Folder(Track):
value.set('name', key)
self.container.save(value)
def getTarget(self):
if self.ref == '':
return None
return self.container.storage.getItem(self.ref)
def setTarget(self, target):
self.ref = target.uid
self.container.save(self)
def __str__(self):
return '%s: %s; keys: %s' % (self.__class__.__name__,
self.name, list(self.keys()))