view: show target with items
This commit is contained in:
parent
a108ad9fc3
commit
6cc5136550
5 changed files with 60 additions and 10 deletions
|
@ -24,6 +24,15 @@ class IContainer(ITraversable):
|
||||||
and the value object (e.g. `parent´ and `name`) are stored correctly."""
|
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):
|
class IView(Interface):
|
||||||
|
|
||||||
def __call__():
|
def __call__():
|
||||||
|
|
|
@ -7,6 +7,7 @@ from zope.publisher.publish import publish
|
||||||
|
|
||||||
from scopes.interfaces import ITraversable, IView
|
from scopes.interfaces import ITraversable, IView
|
||||||
from scopes.server.browser import getView
|
from scopes.server.browser import getView
|
||||||
|
import scopes.storage.concept
|
||||||
from scopes.storage.folder import Root
|
from scopes.storage.folder import Root
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
import json
|
import json
|
||||||
from zope.interface import implementer
|
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, ...}, ...}
|
views = {} # registry for all views: {name: {prefix: viewClass, ...}, ...}
|
||||||
|
|
||||||
|
@ -38,10 +38,24 @@ class DefaultView:
|
||||||
self.context = context
|
self.context = context
|
||||||
self.request = request
|
self.request = request
|
||||||
|
|
||||||
def __call__(self):
|
def prepareResult(self):
|
||||||
ob = self.context
|
ob = self.context
|
||||||
result = dict(head=ob.head, data=ob.data)
|
result = ob.asDict()
|
||||||
if IContainer.providedBy(ob):
|
if IContainer.providedBy(ob):
|
||||||
result['items'] = [v.asDict() for v in ob.values()]
|
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)
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
"""Core classes for concept map structure."""
|
"""Core classes for concept map structure."""
|
||||||
|
|
||||||
from zope.interface import implementer
|
from zope.interface import implementer
|
||||||
|
from scopes.interfaces import IContainer
|
||||||
from scopes.storage.common import registerContainerClass, registry
|
from scopes.storage.common import registerContainerClass, registry
|
||||||
from scopes.storage.tracking import Container, Track
|
from scopes.storage.tracking import Container, Track
|
||||||
|
|
||||||
|
@ -17,6 +18,10 @@ class Concept(Track):
|
||||||
def children(self, predicate=None):
|
def children(self, predicate=None):
|
||||||
return self.container.queryRels(first=self, predicate=predicate)
|
return self.container.queryRels(first=self, predicate=predicate)
|
||||||
|
|
||||||
|
def values(self):
|
||||||
|
return (t.getSecond() for t in self.children(Rels.defaultPredicate))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Concepts(Container):
|
class Concepts(Container):
|
||||||
|
|
||||||
|
@ -77,18 +82,30 @@ class Rels(Container):
|
||||||
|
|
||||||
# types stuff
|
# types stuff
|
||||||
|
|
||||||
|
@implementer(IContainer)
|
||||||
class Type(Concept):
|
class Type(Concept):
|
||||||
|
|
||||||
headFields = ['name', 'tprefix']
|
headFields = ['name', 'tprefix']
|
||||||
prefix = 'type'
|
prefix = 'type'
|
||||||
|
|
||||||
|
def values(self):
|
||||||
|
cont = self.container.storage.getContainer(self.tprefix)
|
||||||
|
return cont.query()
|
||||||
|
|
||||||
def get(self, key, default=None):
|
def get(self, key, default=None):
|
||||||
cont = self.container.storage.getContainer(self.tprefix)
|
cont = self.container.storage.getContainer(self.tprefix)
|
||||||
return cont.queryLast(name=key) or default
|
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)
|
cont = self.container.storage.getContainer(self.tprefix)
|
||||||
return cont.query()
|
value.name = key
|
||||||
|
cont.save(value)
|
||||||
|
|
||||||
|
|
||||||
@registerContainerClass
|
@registerContainerClass
|
||||||
|
@ -100,7 +117,7 @@ class Types(Concepts):
|
||||||
|
|
||||||
|
|
||||||
def storeType(storage, cls, name):
|
def storeType(storage, cls, name):
|
||||||
types = storage.create(Types)
|
types = storage.getContainer('type')
|
||||||
types.save(Type(name, cls.prefix))
|
types.save(Type(name, cls.prefix))
|
||||||
|
|
||||||
def setupCoreTypes(storage):
|
def setupCoreTypes(storage):
|
||||||
|
|
|
@ -2,12 +2,12 @@
|
||||||
|
|
||||||
from zope.interface import implementer
|
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.common import registerContainerClass
|
||||||
from scopes.storage.tracking import Container, Track
|
from scopes.storage.tracking import Container, Track
|
||||||
|
|
||||||
|
|
||||||
@implementer(IContainer)
|
@implementer(IContainer, IReference)
|
||||||
class Folder(Track):
|
class Folder(Track):
|
||||||
|
|
||||||
headFields = ['parent', 'name', 'ref']
|
headFields = ['parent', 'name', 'ref']
|
||||||
|
@ -29,7 +29,7 @@ class Folder(Track):
|
||||||
return value
|
return value
|
||||||
|
|
||||||
def __getitem__(self, key):
|
def __getitem__(self, key):
|
||||||
value = self.container.queryLast(parent=self.rid, name=key)
|
value = self.get(key)
|
||||||
if value is None:
|
if value is None:
|
||||||
raise KeyError(key)
|
raise KeyError(key)
|
||||||
return value
|
return value
|
||||||
|
@ -39,6 +39,15 @@ class Folder(Track):
|
||||||
value.set('name', key)
|
value.set('name', key)
|
||||||
self.container.save(value)
|
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):
|
def __str__(self):
|
||||||
return '%s: %s; keys: %s' % (self.__class__.__name__,
|
return '%s: %s; keys: %s' % (self.__class__.__name__,
|
||||||
self.name, list(self.keys()))
|
self.name, list(self.keys()))
|
||||||
|
|
Loading…
Add table
Reference in a new issue