From ac0e3fad57e24b212322f7d48da225540c0cf9ea Mon Sep 17 00:00:00 2001 From: helmutm Date: Wed, 13 Jan 2010 16:30:10 +0000 Subject: [PATCH] change wiki to use new link and link manager implementations git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@3679 fd906abe-77d9-0310-91a1-e0d9ade77398 --- link/base.py | 3 +- wiki/README.txt | 6 +-- wiki/base/link.py | 91 +++-------------------------------------- wiki/generic/adapter.py | 8 ++-- wiki/generic/mixin.py | 33 +++++++++++---- wiki/tests.py | 11 +++-- wiki/tracking/link.py | 6 +-- 7 files changed, 49 insertions(+), 109 deletions(-) diff --git a/link/base.py b/link/base.py index 37c898e..ab95df3 100644 --- a/link/base.py +++ b/link/base.py @@ -155,7 +155,8 @@ class Link(Persistent): def update(self, **kw): manager = self.getManager() for k in ('source', 'target'): - kw[k] = manager.getUniqueId(kw[k]) + if k in kw: + kw[k] = manager.getUniqueId(kw[k]) for k, v in kw.items(): setattr(self, k, v) for k in manager.indexes: diff --git a/wiki/README.txt b/wiki/README.txt index 25ba4c9..fa12740 100644 --- a/wiki/README.txt +++ b/wiki/README.txt @@ -15,11 +15,11 @@ An Example for an Elementary Wiki Structure We create a wiki manager with one wiki that in turn contains a simple start page. We also set the ``linkManager`` configuration option explicitly -to make sure the btree-based tracking link manager will be used. +to make sure the correct link manager will be used. >>> manager = WikiManager() - >>> linkManagerName = 'tracking' + >>> linkManagerName = 'cybertools.link' >>> manager.setConfig('linkManager', linkManagerName) >>> wiki = manager.addWiki(Wiki('demo_wiki')) >>> startPage = wiki.createPage('start_page') @@ -59,7 +59,7 @@ We now create another page that contains a link to the start page. Let's now have a look at the link manager - it should have recorded the link from the page content. - >>> from cybertools.wiki.interfaces import ILinkManager + >>> from cybertools.link.interfaces import ILinkManager >>> linkManager = manager.getPlugin(ILinkManager, linkManagerName) >>> links = linkManager.links >>> len(links) diff --git a/wiki/base/link.py b/wiki/base/link.py index b790f33..569f1b0 100644 --- a/wiki/base/link.py +++ b/wiki/base/link.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2009 Helmut Merz helmutm@cy55.de +# Copyright (c) 2010 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 @@ -26,80 +26,8 @@ from docutils.nodes import Text from zope.interface import implements from zope.traversing.browser import absoluteURL -from cybertools.wiki.interfaces import ILink, ILinkManager, ILinkProcessor - - -class LinkManager(object): - """ A very basic link manager implementation. - """ - - implements(ILinkManager) - - def __init__(self): - self.links = {} - self.linksBySource = {} - - def createLink(self, name, source, target, **kw): - link = Link(name, source, target, **kw) - link.manager = self - id = self.generateLinkIdentifier(link) - self.links[id] = link - self.linksBySource.setdefault(source, []).append(link) - return link - - def removeLink(self, link): - if link.identifier in self.links: - link.manager = None - del self.links[link.identifier] - - def getLink(self, name): - result = self.query(name=name) - if result: - return result[0] - - def query(self, source=None, target=None, name=None, **kw): - if source is None: - result = self.links.values() - else: - result = self.linksBySource.get(source, []) - kw.update(dict(target=target, name=name)) - for k, v in kw.items(): - if v is None: - continue - if not isinstance(v, (list, tuple)): - v = [v] - result = [r for r in result if getattr(r, k) in v] - return result - - def generateLinkIdentifier(self, link): - identifier = '%07i' % (max([int(k) for k in self.links.keys()] or [0]) + 1) - link.identifier = identifier - return identifier - - -class Link(object): - - implements(ILink) - - identifier = None - manager = None - - def __init__(self, name, source, target, **kw): - self.name = name - self.source = source - self.target = target - for k, v in kw.items(): - if k not in ILink: - raise AttributeError(k) - setattr(self, k, v) - - def getManager(self): - return self.manager - - def __getattr__(self, attr): - if attr not in ILink: - raise AttributeError(attr) - return self.__dict__.get(attr) +from cybertools.link.interfaces import ILink, ILinkManager +from cybertools.wiki.interfaces import ILinkProcessor class LinkProcessor(object): @@ -118,7 +46,6 @@ class LinkProcessor(object): return wiki = self.source.getWiki() manager = wiki.getManager() - sourceUid = self.source.getUid() lmName = self.source.getConfig('linkManager') lm = manager.getPlugin(ILinkManager, lmName) targetPageName = self.targetName @@ -127,7 +54,7 @@ class LinkProcessor(object): targetPageName, params = targetPageName.split('?', 1) if '#' in targetPageName: targetPageName, fragment = targetPageName.split('#', 1) - existing = iter(lm.query(source=sourceUid, name=self.targetName)) + existing = iter(lm.query(source=self.source, name=self.targetName)) if existing: link = existing.next() if link.target is not None: @@ -136,9 +63,8 @@ class LinkProcessor(object): target = None else: target = wiki.getPage(targetPageName) - targetUid = target is not None and target.getUid() or None - link = lm.createLink(self.targetName, sourceUid, targetUid) - #if link.refuri is None: + link = lm.createLink(name=self.targetName, + source=self.source, target=target) if fragment: link.targetFragment = fragment if params: @@ -149,13 +75,8 @@ class LinkProcessor(object): uri = '%s/create.html?name=%s' % ( absoluteURL(wiki, self.request), link.name) else: - #uri = link.refuri = target.getURI(self.request) uri = target.getURI(self.request) uri += self.fragmentAndParams(fragment, params) - #else: - # uri = link.refuri + self.fragmentAndParams( - # link.targetFragment, - # link.targetParameters) self.setURI(uri) if target is None: self.markPresentation('create') diff --git a/wiki/generic/adapter.py b/wiki/generic/adapter.py index 0b7ece2..11ecdd4 100644 --- a/wiki/generic/adapter.py +++ b/wiki/generic/adapter.py @@ -36,13 +36,13 @@ from zope import component from zope.component import adapts from zope.interface import implements +from cybertools.link.base import Link, LinkManager 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): @@ -80,9 +80,9 @@ class WikiManager(BaseWikiManager): self.context.setGenericAttribute('wikis', IOTreeSet()) plugins = self.context.setGenericAttribute('plugins', PersistentMapping()) plugins[(IIntIds, None)] = IntIds() - linkStorage = TrackingStorage(trackFactory=Link) - plugins[(ILinkManager, 'tracking')] = linkStorage - self.setConfig('linkManager', 'tracking') + #linkStorage = TrackingStorage(trackFactory=Link) + plugins[(ILinkManager, 'cybertools.link')] = LinkManager() + self.setConfig('linkManager', 'cybertools.link') def addWiki(self, wiki): uid = self.getUid(wiki) diff --git a/wiki/generic/mixin.py b/wiki/generic/mixin.py index 78f4bfa..ed51a61 100644 --- a/wiki/generic/mixin.py +++ b/wiki/generic/mixin.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2009 Helmut Merz helmutm@cy55.de +# Copyright (c) 2010 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 @@ -17,7 +17,7 @@ # """ -Wiki implementation = adapters for Zope2 content objects. +Wiki implementation = mixin classes for Zope2 content objects. $Id$ """ @@ -36,13 +36,14 @@ from zope import component from zope.component import adapts from zope.interface import implements +from cybertools.link.base import Link, LinkManager as BaseLinkManager +from cybertools.link.interfaces import ILinkManager 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 +from cybertools.wiki.interfaces import IWikiConfigInfo class PersistentConfigInfo(PersistentMapping): @@ -68,6 +69,8 @@ class GenericConfigurator(BaseConfigurator): class WikiManager(BaseWikiManager): + """ + """ configurator = GenericConfigurator @@ -75,9 +78,8 @@ class WikiManager(BaseWikiManager): self.setGenericAttribute('wikis', IOTreeSet()) plugins = self.setGenericAttribute('plugins', PersistentMapping()) plugins[(IIntIds, '')] = IntIds() - linkStorage = TrackingStorage(trackFactory=Link) - plugins[(ILinkManager, 'tracking')] = linkStorage - self.setConfig('linkManager', 'tracking') + plugins[(ILinkManager, 'internal')] = LinkManager(self) + self.setConfig('linkManager', 'internal') def addWiki(self, wiki): uid = self.getUid(wiki) @@ -143,3 +145,20 @@ class WikiPage(BaseWikiPage): def getWiki(self): # TODO: fetch wiki in a generic way return aq_parent(aq_inner(self)) + + +class LinkManager(BaseLinkManager): + + def __init__(self, manager): + super(LinkManager, self).__init__() + self.manager = manager + + def getUniqueId(self, obj): + if obj is None: + return None + if isinstance(obj, self.uid): + return obj + return self.manager.getUid(obj) + + def getObject(self, uid): + return self.manager.getObject(uid) diff --git a/wiki/tests.py b/wiki/tests.py index 2fcce6f..56f3fd7 100755 --- a/wiki/tests.py +++ b/wiki/tests.py @@ -16,12 +16,13 @@ from zope.traversing.browser.interfaces import IAbsoluteURL from cybertools.relation.tests import IntIdsStub from cybertools.wiki.base.config import WikiConfiguration -from cybertools.wiki.base.link import LinkManager +from cybertools.link.base import LinkManager +from cybertools.link.interfaces import ILinkManager from cybertools.wiki.dcu.html import Writer as DocutilsHTMLWriter from cybertools.wiki.dcu.rstx import Parser as DocutilsRstxParser from cybertools.wiki.dcu import process from cybertools.wiki.interfaces import IWiki, IWikiPage -from cybertools.wiki.tracking import link +#from cybertools.wiki.tracking import link class WikiURL(object): @@ -58,10 +59,8 @@ def setUp(testCase): component.provideUtility(DocutilsHTMLWriter(), name='docutils.html') component.provideUtility(DocutilsRstxParser(), name='docutils.rstx') component.provideAdapter(process.Reference, name='default') - component.provideUtility(LinkManager(), name='basic') - component.provideAdapter(link.LinkManager) - links = link.setupLinkManager(None) - component.provideUtility(links, name='tracking') + component.provideUtility(LinkManager(), provides=ILinkManager, + name='cybertools.link') from cybertools.wiki.generic import adapter adapter.IntIds = IntIdsStub diff --git a/wiki/tracking/link.py b/wiki/tracking/link.py index 7d33d0f..9f8e212 100644 --- a/wiki/tracking/link.py +++ b/wiki/tracking/link.py @@ -33,8 +33,8 @@ from cybertools.stateful.definition import State, Transition from cybertools.stateful.interfaces import IStatesDefinition from cybertools.tracking.btree import TrackingStorage, Track from cybertools.tracking.interfaces import ITrackingStorage -from cybertools.wiki.base.link import Link as BaseLink -from cybertools.wiki.base.link import LinkManager as BaseLinkManager +from cybertools.link.base import Link as BaseLink +from cybertools.link.base import LinkManager as BaseLinkManager from cybertools.wiki.interfaces import ILink, ILinkManager @@ -91,7 +91,7 @@ class Link(BaseLink, Stateful, Track): return component.getUtility(IStatesDefinition, name=self.statesDefinition) -class LinkManager(BaseLinkManager): +class xx_LinkManager(BaseLinkManager): """ A tracking storage adapter managing wiki links. """