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