rearrange implementation to use mixin classes instead of adapters
git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@3640 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
		
							parent
							
								
									6944666e82
								
							
						
					
					
						commit
						6ff8ff7099
					
				
					 5 changed files with 182 additions and 23 deletions
				
			
		|  | @ -65,8 +65,8 @@ from the page content. | ||||||
|   >>> len(links) |   >>> len(links) | ||||||
|   1 |   1 | ||||||
|   >>> link = links.values()[0] |   >>> link = links.values()[0] | ||||||
|   >>> link.source, link.target, link.name, link.refuri |   >>> link.source, link.target, link.name | ||||||
|   (0, 1, u'start_page', 'http://127.0.0.1/demo_wiki/start_page') |   (0, 1, u'start_page') | ||||||
| 
 | 
 | ||||||
| Links to not yet existing pages | Links to not yet existing pages | ||||||
| ------------------------------- | ------------------------------- | ||||||
|  |  | ||||||
|  | @ -114,9 +114,11 @@ class LinkProcessor(object): | ||||||
|         self.context = context |         self.context = context | ||||||
| 
 | 
 | ||||||
|     def process(self): |     def process(self): | ||||||
|  |         if '..' in self.targetName: | ||||||
|  |             return | ||||||
|         wiki = self.source.getWiki() |         wiki = self.source.getWiki() | ||||||
|         manager = wiki.getManager() |         manager = wiki.getManager() | ||||||
|         sourceUid = self.source.uid |         sourceUid = self.source.getUid() | ||||||
|         lmName = self.source.getConfig('linkManager') |         lmName = self.source.getConfig('linkManager') | ||||||
|         lm = manager.getPlugin(ILinkManager, lmName) |         lm = manager.getPlugin(ILinkManager, lmName) | ||||||
|         targetPageName = self.targetName |         targetPageName = self.targetName | ||||||
|  | @ -134,24 +136,26 @@ class LinkProcessor(object): | ||||||
|                 target = None |                 target = None | ||||||
|         else: |         else: | ||||||
|             target = wiki.getPage(targetPageName) |             target = wiki.getPage(targetPageName) | ||||||
|             targetUid = target is not None and target.uid or None |             targetUid = target is not None and target.getUid() or None | ||||||
|             link = lm.createLink(self.targetName, sourceUid, targetUid) |             link = lm.createLink(self.targetName, sourceUid, targetUid) | ||||||
|         if link.refuri is None: |         #if link.refuri is None: | ||||||
|         if fragment: |         if fragment: | ||||||
|             link.targetFragment = fragment |             link.targetFragment = fragment | ||||||
|         if params: |         if params: | ||||||
|             link.targetParameters = params |             link.targetParameters = params | ||||||
|         if self.request is not None: |         if self.request is not None: | ||||||
|             if target is None: |             if target is None: | ||||||
|                     uri = link.refuri = '%s/create.html?name=%s' % ( |                 #uri = link.refuri = '%s/create.html?name=%s' % ( | ||||||
|  |                 uri = '%s/create.html?name=%s' % ( | ||||||
|                                 absoluteURL(wiki, self.request), link.name) |                                 absoluteURL(wiki, self.request), link.name) | ||||||
|             else: |             else: | ||||||
|                     uri = link.refuri = target.getURI(self.request) |                 #uri = link.refuri = target.getURI(self.request) | ||||||
|  |                 uri = target.getURI(self.request) | ||||||
|                 uri += self.fragmentAndParams(fragment, params) |                 uri += self.fragmentAndParams(fragment, params) | ||||||
|         else: |         #else: | ||||||
|             uri = link.refuri + self.fragmentAndParams( |         #    uri = link.refuri + self.fragmentAndParams( | ||||||
|                                             link.targetFragment, |         #                                    link.targetFragment, | ||||||
|                                             link.targetParameters) |         #                                    link.targetParameters) | ||||||
|         self.setURI(uri) |         self.setURI(uri) | ||||||
|         if target is None: |         if target is None: | ||||||
|             self.markPresentation('create') |             self.markPresentation('create') | ||||||
|  |  | ||||||
|  | @ -124,8 +124,9 @@ class Wiki(BaseConfiguration): | ||||||
|     def createPage(self, name, title=None): |     def createPage(self, name, title=None): | ||||||
|         if name in self.pages: |         if name in self.pages: | ||||||
|             raise ValueError("Name '%s' already present." % name) |             raise ValueError("Name '%s' already present." % name) | ||||||
|         page = self.pages[name] = WikiPage(name, title) |         page = self.pages[name] = WikiPage(name) | ||||||
|         page.wiki = self |         page.wiki = self | ||||||
|  |         page.title = title or name | ||||||
|         return page |         return page | ||||||
| 
 | 
 | ||||||
|     def addPage(self, page): |     def addPage(self, page): | ||||||
|  | @ -142,10 +143,13 @@ class Wiki(BaseConfiguration): | ||||||
|             protocol, address = name.split(':', 1) |             protocol, address = name.split(':', 1) | ||||||
|             if protocol in protocols: |             if protocol in protocols: | ||||||
|                 return ExternalPage(name) |                 return ExternalPage(name) | ||||||
|         return self.pages.get(name) |         return self.getPages().get(name) | ||||||
| 
 | 
 | ||||||
|     def listPages(self): |     def listPages(self): | ||||||
|         return self.pages.values() |         return self.getPages().values() | ||||||
|  | 
 | ||||||
|  |     def getPages(self): | ||||||
|  |         return self.pages | ||||||
| 
 | 
 | ||||||
|     # configuration |     # configuration | ||||||
| 
 | 
 | ||||||
|  | @ -198,6 +202,9 @@ class WikiPage(BaseConfiguration): | ||||||
| 
 | 
 | ||||||
|     @property |     @property | ||||||
|     def uid(self): |     def uid(self): | ||||||
|  |         return self.getUid() | ||||||
|  | 
 | ||||||
|  |     def getUid(self): | ||||||
|         return self.getWiki().getManager().getUid(self) |         return self.getWiki().getManager().getUid(self) | ||||||
| 
 | 
 | ||||||
|     def getURI(self, request): |     def getURI(self, request): | ||||||
|  |  | ||||||
|  | @ -38,6 +38,9 @@ class ExternalPage(object): | ||||||
|     def __init__(self, uid): |     def __init__(self, uid): | ||||||
|         self.uid = uid |         self.uid = uid | ||||||
| 
 | 
 | ||||||
|  |     def getUid(self): | ||||||
|  |         return self.uid | ||||||
|  | 
 | ||||||
|     def getURI(self, request): |     def getURI(self, request): | ||||||
|         return self.uid |         return self.uid | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										145
									
								
								wiki/generic/mixin.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										145
									
								
								wiki/generic/mixin.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,145 @@ | ||||||
|  | # | ||||||
|  | #  Copyright (c) 2009 Helmut Merz helmutm@cy55.de | ||||||
|  | # | ||||||
|  | #  This program is free software; you can redistribute it and/or modify | ||||||
|  | #  it under the terms of the GNU General Public License as published by | ||||||
|  | #  the Free Software Foundation; either version 2 of the License, or | ||||||
|  | #  (at your option) any later version. | ||||||
|  | # | ||||||
|  | #  This program is distributed in the hope that it will be useful, | ||||||
|  | #  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  | #  GNU General Public License for more details. | ||||||
|  | # | ||||||
|  | #  You should have received a copy of the GNU General Public License | ||||||
|  | #  along with this program; if not, write to the Free Software | ||||||
|  | #  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA | ||||||
|  | # | ||||||
|  | 
 | ||||||
|  | """ | ||||||
|  | Wiki implementation = adapters for Zope2 content objects. | ||||||
|  | 
 | ||||||
|  | $Id$ | ||||||
|  | """ | ||||||
|  | 
 | ||||||
|  | try: | ||||||
|  |     from Acquisition import aq_inner, aq_parent | ||||||
|  | except ImportError: | ||||||
|  |     pass | ||||||
|  | from BTrees.IOBTree import IOTreeSet | ||||||
|  | from BTrees.OOBTree import OOBTree | ||||||
|  | from persistent.mapping import PersistentMapping | ||||||
|  | from zope.app.intid import IntIds | ||||||
|  | from zope.app.intid.interfaces import IIntIds | ||||||
|  | from zope.cachedescriptors.property import Lazy | ||||||
|  | from zope import component | ||||||
|  | from zope.component import adapts | ||||||
|  | from zope.interface import implements | ||||||
|  | 
 | ||||||
|  | from cybertools.util.generic.interfaces import IGenericObject, IGenericFolder | ||||||
|  | from cybertools.wiki.base.config import WikiConfigInfo, BaseConfigurator | ||||||
|  | from cybertools.wiki.base.wiki import WikiManager as BaseWikiManager | ||||||
|  | from cybertools.wiki.base.wiki import Wiki as BaseWiki | ||||||
|  | from cybertools.wiki.base.wiki import WikiPage as BaseWikiPage | ||||||
|  | from cybertools.wiki.interfaces import ILinkManager, IWikiConfigInfo | ||||||
|  | from cybertools.wiki.tracking.link import Link, TrackingStorage | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class PersistentConfigInfo(PersistentMapping): | ||||||
|  | 
 | ||||||
|  |     implements(IWikiConfigInfo) | ||||||
|  | 
 | ||||||
|  |     def set(self, functionality, value): | ||||||
|  |         self[functionality] = value | ||||||
|  | 
 | ||||||
|  |     def __getattr__(self, attr): | ||||||
|  |         return self.get(attr, None) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class GenericConfigurator(BaseConfigurator): | ||||||
|  | 
 | ||||||
|  |     def initialize(self): | ||||||
|  |         ci = PersistentConfigInfo() | ||||||
|  |         self.context.setGenericAttribute('configInfo', ci) | ||||||
|  |         return ci | ||||||
|  | 
 | ||||||
|  |     def getConfigInfo(self): | ||||||
|  |         return self.context.getGenericAttribute('configInfo', None) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class WikiManager(BaseWikiManager): | ||||||
|  | 
 | ||||||
|  |     configurator = GenericConfigurator | ||||||
|  | 
 | ||||||
|  |     def setup(self): | ||||||
|  |         self.setGenericAttribute('wikis', IOTreeSet()) | ||||||
|  |         plugins = self.setGenericAttribute('plugins', PersistentMapping()) | ||||||
|  |         plugins[(IIntIds, '')] = IntIds() | ||||||
|  |         linkStorage = TrackingStorage(trackFactory=Link) | ||||||
|  |         plugins[(ILinkManager, 'tracking')] = linkStorage | ||||||
|  |         self.setConfig('linkManager', 'tracking') | ||||||
|  | 
 | ||||||
|  |     def addWiki(self, wiki): | ||||||
|  |         uid = self.getUid(wiki) | ||||||
|  |         self.wikiUids.insert(uid) | ||||||
|  |         wiki.setManager(self) | ||||||
|  |         return wiki | ||||||
|  | 
 | ||||||
|  |     def removeWiki(self, wiki): | ||||||
|  |         uid = self.getUid(wiki) | ||||||
|  |         if uid in self.wikiUids: | ||||||
|  |             self.wikiUids.remove(uid) | ||||||
|  | 
 | ||||||
|  |     def listWikis(self): | ||||||
|  |         for uid in self.wikiUids: | ||||||
|  |             yield self.getObject(uid) | ||||||
|  | 
 | ||||||
|  |     @Lazy | ||||||
|  |     def wikiUids(self): | ||||||
|  |         return self.getGenericAttribute('wikis') | ||||||
|  | 
 | ||||||
|  |     def getPlugins(self): | ||||||
|  |         return self.getGenericAttribute('plugins') | ||||||
|  | 
 | ||||||
|  |     def getObject(self, uid): | ||||||
|  |         obj = self.resolveUid(uid) | ||||||
|  |         if obj is None: | ||||||
|  |             return super(WikiManager, self).getObject(uid) | ||||||
|  |         return obj | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class Wiki(BaseWiki): | ||||||
|  | 
 | ||||||
|  |     @property | ||||||
|  |     def name(self): | ||||||
|  |         return self.getId() | ||||||
|  | 
 | ||||||
|  |     def getPages(self): | ||||||
|  |         # TODO: restrict to wiki page objects; use generic access methods | ||||||
|  |         return dict((k, v) for k, v in self.objectItems()) | ||||||
|  | 
 | ||||||
|  |     def createPage(self, name, title, text=u''): | ||||||
|  |         # TODO: delegate to generic folder | ||||||
|  |         # page = self[name] = WikiPage(name) | ||||||
|  |         self._setObject(name, self.pageFactory(name)) | ||||||
|  |         page = getattr(self, name) | ||||||
|  |         page.title = title | ||||||
|  |         page.text = text | ||||||
|  |         return page | ||||||
|  | 
 | ||||||
|  |     def getManager(self): | ||||||
|  |         # TODO: fetch tool/utility in a generic way | ||||||
|  |         return self.portal_wikimanager | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class WikiPage(BaseWikiPage): | ||||||
|  | 
 | ||||||
|  |     def getText(self): | ||||||
|  |         return self.getGenericAttribute('text') | ||||||
|  |     def setText(self, text): | ||||||
|  |         self.setGenericAttribute('text', text) | ||||||
|  |     text = property(getText, setText) | ||||||
|  | 
 | ||||||
|  |     def getWiki(self): | ||||||
|  |         # TODO: fetch wiki in a generic way | ||||||
|  |         return aq_parent(aq_inner(self)) | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 helmutm
						helmutm