provide registry for views, use for default view
This commit is contained in:
		
							parent
							
								
									0bda603f1e
								
							
						
					
					
						commit
						3d10c45222
					
				
					 2 changed files with 48 additions and 21 deletions
				
			
		|  | @ -1,14 +1,14 @@ | |||
| # scopes.server.app | ||||
| 
 | ||||
| import json | ||||
| from zope.interface import implementer | ||||
| from zope.publisher.base import DefaultPublication | ||||
| from zope.publisher.browser import BrowserRequest | ||||
| from zope.publisher.interfaces import NotFound | ||||
| from zope.publisher.publish import publish | ||||
| from zope.traversing.publicationtraverse import PublicationTraverser | ||||
| 
 | ||||
| from scopes.interfaces import IContainer, ITraversable, IView | ||||
| from scopes.interfaces import ITraversable, IView | ||||
| from scopes.server.browser import getView | ||||
| from scopes.storage.folder import Root | ||||
| 
 | ||||
| 
 | ||||
|  | @ -29,12 +29,11 @@ def zope_app_factory(config): | |||
| class Publication(DefaultPublication): | ||||
| 
 | ||||
|     def traverseName(self, request, ob, name): | ||||
|         next = None | ||||
|         next = getView(request, ob, name) | ||||
|         if next is not None: | ||||
|             return next | ||||
|         if ITraversable.providedBy(ob): | ||||
|             next = ob.get(name) | ||||
|         if next is None: | ||||
|             if name == 'index.html': | ||||
|                 next = DefaultView(ob, request) | ||||
|         if next is None: | ||||
|             raise NotFound(ob, name, request) | ||||
|         return next | ||||
|  | @ -44,18 +43,3 @@ class Publication(DefaultPublication): | |||
|             return ob, () | ||||
|         return ob, ('index.html',) | ||||
| 
 | ||||
| 
 | ||||
| @implementer(IView) | ||||
| class DefaultView: | ||||
| 
 | ||||
|     def __init__(self, context, request): | ||||
|         self.context = context | ||||
|         self.request = request | ||||
| 
 | ||||
|     def __call__(self): | ||||
|         ob = self.context | ||||
|         result = dict(head=ob.head, data=ob.data) | ||||
|         if IContainer.providedBy(ob): | ||||
|             result['items'] = list(ob.keys()) | ||||
|         return json.dumps(result) | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										43
									
								
								scopes/server/browser.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								scopes/server/browser.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,43 @@ | |||
| # scopes.server.browser | ||||
| 
 | ||||
| import json | ||||
| from zope.interface import implementer | ||||
| from scopes.interfaces import IContainer, IView | ||||
| 
 | ||||
| views = {} | ||||
| 
 | ||||
| def register(contextClass, name): | ||||
|     def doRegister(viewClass): | ||||
|         nameEntry = views.setdefault(name, {}) | ||||
|         key = contextClass and contextClass.prefix or '' | ||||
|         nameEntry[key] = viewClass | ||||
|         return viewClass | ||||
|     return doRegister | ||||
| 
 | ||||
| def getView(request, ob, name): | ||||
|     nameEntry = views.get(name) | ||||
|     if nameEntry is None: | ||||
|         return None | ||||
|     viewClass = nameEntry.get(ob.__class__.prefix) | ||||
|     if viewClass is None: | ||||
|         viewClass = nameEntry.get('') | ||||
|     if viewClass is None: | ||||
|         return None | ||||
|     return viewClass(ob, request) | ||||
| 
 | ||||
| 
 | ||||
| @register(None, 'index.html') | ||||
| @implementer(IView) | ||||
| class DefaultView: | ||||
| 
 | ||||
|     def __init__(self, context, request): | ||||
|         self.context = context | ||||
|         self.request = request | ||||
| 
 | ||||
|     def __call__(self): | ||||
|         ob = self.context | ||||
|         result = dict(head=ob.head, data=ob.data) | ||||
|         if IContainer.providedBy(ob): | ||||
|             result['items'] = list(ob.keys()) | ||||
|         return json.dumps(result) | ||||
| 
 | ||||
		Loading…
	
	Add table
		
		Reference in a new issue