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
This commit is contained in:
helmutm 2010-01-13 16:30:10 +00:00
parent 24157bb323
commit ac0e3fad57
7 changed files with 49 additions and 109 deletions

View file

@ -155,6 +155,7 @@ class Link(Persistent):
def update(self, **kw):
manager = self.getManager()
for k in ('source', 'target'):
if k in kw:
kw[k] = manager.getUniqueId(kw[k])
for k, v in kw.items():
setattr(self, k, v)

View file

@ -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)

View file

@ -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')

View file

@ -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)

View file

@ -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)

View file

@ -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

View file

@ -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.
"""