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:
parent
24157bb323
commit
ac0e3fad57
7 changed files with 49 additions and 109 deletions
|
@ -155,7 +155,8 @@ class Link(Persistent):
|
||||||
def update(self, **kw):
|
def update(self, **kw):
|
||||||
manager = self.getManager()
|
manager = self.getManager()
|
||||||
for k in ('source', 'target'):
|
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():
|
for k, v in kw.items():
|
||||||
setattr(self, k, v)
|
setattr(self, k, v)
|
||||||
for k in manager.indexes:
|
for k in manager.indexes:
|
||||||
|
|
|
@ -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
|
We create a wiki manager with one wiki that in turn contains a simple
|
||||||
start page. We also set the ``linkManager`` configuration option explicitly
|
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()
|
>>> manager = WikiManager()
|
||||||
|
|
||||||
>>> linkManagerName = 'tracking'
|
>>> linkManagerName = 'cybertools.link'
|
||||||
>>> manager.setConfig('linkManager', linkManagerName)
|
>>> manager.setConfig('linkManager', linkManagerName)
|
||||||
>>> wiki = manager.addWiki(Wiki('demo_wiki'))
|
>>> wiki = manager.addWiki(Wiki('demo_wiki'))
|
||||||
>>> startPage = wiki.createPage('start_page')
|
>>> 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
|
Let's now have a look at the link manager - it should have recorded the link
|
||||||
from the page content.
|
from the page content.
|
||||||
|
|
||||||
>>> from cybertools.wiki.interfaces import ILinkManager
|
>>> from cybertools.link.interfaces import ILinkManager
|
||||||
>>> linkManager = manager.getPlugin(ILinkManager, linkManagerName)
|
>>> linkManager = manager.getPlugin(ILinkManager, linkManagerName)
|
||||||
>>> links = linkManager.links
|
>>> links = linkManager.links
|
||||||
>>> len(links)
|
>>> len(links)
|
||||||
|
|
|
@ -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
|
# 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
|
# 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.interface import implements
|
||||||
from zope.traversing.browser import absoluteURL
|
from zope.traversing.browser import absoluteURL
|
||||||
|
|
||||||
from cybertools.wiki.interfaces import ILink, ILinkManager, ILinkProcessor
|
from cybertools.link.interfaces import ILink, ILinkManager
|
||||||
|
from cybertools.wiki.interfaces import 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)
|
|
||||||
|
|
||||||
|
|
||||||
class LinkProcessor(object):
|
class LinkProcessor(object):
|
||||||
|
@ -118,7 +46,6 @@ class LinkProcessor(object):
|
||||||
return
|
return
|
||||||
wiki = self.source.getWiki()
|
wiki = self.source.getWiki()
|
||||||
manager = wiki.getManager()
|
manager = wiki.getManager()
|
||||||
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
|
||||||
|
@ -127,7 +54,7 @@ class LinkProcessor(object):
|
||||||
targetPageName, params = targetPageName.split('?', 1)
|
targetPageName, params = targetPageName.split('?', 1)
|
||||||
if '#' in targetPageName:
|
if '#' in targetPageName:
|
||||||
targetPageName, fragment = targetPageName.split('#', 1)
|
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:
|
if existing:
|
||||||
link = existing.next()
|
link = existing.next()
|
||||||
if link.target is not None:
|
if link.target is not None:
|
||||||
|
@ -136,9 +63,8 @@ class LinkProcessor(object):
|
||||||
target = None
|
target = None
|
||||||
else:
|
else:
|
||||||
target = wiki.getPage(targetPageName)
|
target = wiki.getPage(targetPageName)
|
||||||
targetUid = target is not None and target.getUid() or None
|
link = lm.createLink(name=self.targetName,
|
||||||
link = lm.createLink(self.targetName, sourceUid, targetUid)
|
source=self.source, target=target)
|
||||||
#if link.refuri is None:
|
|
||||||
if fragment:
|
if fragment:
|
||||||
link.targetFragment = fragment
|
link.targetFragment = fragment
|
||||||
if params:
|
if params:
|
||||||
|
@ -149,13 +75,8 @@ class LinkProcessor(object):
|
||||||
uri = '%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 = target.getURI(self.request)
|
uri = target.getURI(self.request)
|
||||||
uri += self.fragmentAndParams(fragment, params)
|
uri += self.fragmentAndParams(fragment, params)
|
||||||
#else:
|
|
||||||
# uri = link.refuri + self.fragmentAndParams(
|
|
||||||
# link.targetFragment,
|
|
||||||
# link.targetParameters)
|
|
||||||
self.setURI(uri)
|
self.setURI(uri)
|
||||||
if target is None:
|
if target is None:
|
||||||
self.markPresentation('create')
|
self.markPresentation('create')
|
||||||
|
|
|
@ -36,13 +36,13 @@ from zope import component
|
||||||
from zope.component import adapts
|
from zope.component import adapts
|
||||||
from zope.interface import implements
|
from zope.interface import implements
|
||||||
|
|
||||||
|
from cybertools.link.base import Link, LinkManager
|
||||||
from cybertools.util.generic.interfaces import IGenericObject, IGenericFolder
|
from cybertools.util.generic.interfaces import IGenericObject, IGenericFolder
|
||||||
from cybertools.wiki.base.config import WikiConfigInfo, BaseConfigurator
|
from cybertools.wiki.base.config import WikiConfigInfo, BaseConfigurator
|
||||||
from cybertools.wiki.base.wiki import WikiManager as BaseWikiManager
|
from cybertools.wiki.base.wiki import WikiManager as BaseWikiManager
|
||||||
from cybertools.wiki.base.wiki import Wiki as BaseWiki
|
from cybertools.wiki.base.wiki import Wiki as BaseWiki
|
||||||
from cybertools.wiki.base.wiki import WikiPage as BaseWikiPage
|
from cybertools.wiki.base.wiki import WikiPage as BaseWikiPage
|
||||||
from cybertools.wiki.interfaces import ILinkManager, IWikiConfigInfo
|
from cybertools.wiki.interfaces import ILinkManager, IWikiConfigInfo
|
||||||
from cybertools.wiki.tracking.link import Link, TrackingStorage
|
|
||||||
|
|
||||||
|
|
||||||
class PersistentConfigInfo(PersistentMapping):
|
class PersistentConfigInfo(PersistentMapping):
|
||||||
|
@ -80,9 +80,9 @@ class WikiManager(BaseWikiManager):
|
||||||
self.context.setGenericAttribute('wikis', IOTreeSet())
|
self.context.setGenericAttribute('wikis', IOTreeSet())
|
||||||
plugins = self.context.setGenericAttribute('plugins', PersistentMapping())
|
plugins = self.context.setGenericAttribute('plugins', PersistentMapping())
|
||||||
plugins[(IIntIds, None)] = IntIds()
|
plugins[(IIntIds, None)] = IntIds()
|
||||||
linkStorage = TrackingStorage(trackFactory=Link)
|
#linkStorage = TrackingStorage(trackFactory=Link)
|
||||||
plugins[(ILinkManager, 'tracking')] = linkStorage
|
plugins[(ILinkManager, 'cybertools.link')] = LinkManager()
|
||||||
self.setConfig('linkManager', 'tracking')
|
self.setConfig('linkManager', 'cybertools.link')
|
||||||
|
|
||||||
def addWiki(self, wiki):
|
def addWiki(self, wiki):
|
||||||
uid = self.getUid(wiki)
|
uid = self.getUid(wiki)
|
||||||
|
|
|
@ -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
|
# 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
|
# 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$
|
$Id$
|
||||||
"""
|
"""
|
||||||
|
@ -36,13 +36,14 @@ from zope import component
|
||||||
from zope.component import adapts
|
from zope.component import adapts
|
||||||
from zope.interface import implements
|
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.util.generic.interfaces import IGenericObject, IGenericFolder
|
||||||
from cybertools.wiki.base.config import WikiConfigInfo, BaseConfigurator
|
from cybertools.wiki.base.config import WikiConfigInfo, BaseConfigurator
|
||||||
from cybertools.wiki.base.wiki import WikiManager as BaseWikiManager
|
from cybertools.wiki.base.wiki import WikiManager as BaseWikiManager
|
||||||
from cybertools.wiki.base.wiki import Wiki as BaseWiki
|
from cybertools.wiki.base.wiki import Wiki as BaseWiki
|
||||||
from cybertools.wiki.base.wiki import WikiPage as BaseWikiPage
|
from cybertools.wiki.base.wiki import WikiPage as BaseWikiPage
|
||||||
from cybertools.wiki.interfaces import ILinkManager, IWikiConfigInfo
|
from cybertools.wiki.interfaces import IWikiConfigInfo
|
||||||
from cybertools.wiki.tracking.link import Link, TrackingStorage
|
|
||||||
|
|
||||||
|
|
||||||
class PersistentConfigInfo(PersistentMapping):
|
class PersistentConfigInfo(PersistentMapping):
|
||||||
|
@ -68,6 +69,8 @@ class GenericConfigurator(BaseConfigurator):
|
||||||
|
|
||||||
|
|
||||||
class WikiManager(BaseWikiManager):
|
class WikiManager(BaseWikiManager):
|
||||||
|
"""
|
||||||
|
"""
|
||||||
|
|
||||||
configurator = GenericConfigurator
|
configurator = GenericConfigurator
|
||||||
|
|
||||||
|
@ -75,9 +78,8 @@ class WikiManager(BaseWikiManager):
|
||||||
self.setGenericAttribute('wikis', IOTreeSet())
|
self.setGenericAttribute('wikis', IOTreeSet())
|
||||||
plugins = self.setGenericAttribute('plugins', PersistentMapping())
|
plugins = self.setGenericAttribute('plugins', PersistentMapping())
|
||||||
plugins[(IIntIds, '')] = IntIds()
|
plugins[(IIntIds, '')] = IntIds()
|
||||||
linkStorage = TrackingStorage(trackFactory=Link)
|
plugins[(ILinkManager, 'internal')] = LinkManager(self)
|
||||||
plugins[(ILinkManager, 'tracking')] = linkStorage
|
self.setConfig('linkManager', 'internal')
|
||||||
self.setConfig('linkManager', 'tracking')
|
|
||||||
|
|
||||||
def addWiki(self, wiki):
|
def addWiki(self, wiki):
|
||||||
uid = self.getUid(wiki)
|
uid = self.getUid(wiki)
|
||||||
|
@ -143,3 +145,20 @@ class WikiPage(BaseWikiPage):
|
||||||
def getWiki(self):
|
def getWiki(self):
|
||||||
# TODO: fetch wiki in a generic way
|
# TODO: fetch wiki in a generic way
|
||||||
return aq_parent(aq_inner(self))
|
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)
|
||||||
|
|
|
@ -16,12 +16,13 @@ from zope.traversing.browser.interfaces import IAbsoluteURL
|
||||||
|
|
||||||
from cybertools.relation.tests import IntIdsStub
|
from cybertools.relation.tests import IntIdsStub
|
||||||
from cybertools.wiki.base.config import WikiConfiguration
|
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.html import Writer as DocutilsHTMLWriter
|
||||||
from cybertools.wiki.dcu.rstx import Parser as DocutilsRstxParser
|
from cybertools.wiki.dcu.rstx import Parser as DocutilsRstxParser
|
||||||
from cybertools.wiki.dcu import process
|
from cybertools.wiki.dcu import process
|
||||||
from cybertools.wiki.interfaces import IWiki, IWikiPage
|
from cybertools.wiki.interfaces import IWiki, IWikiPage
|
||||||
from cybertools.wiki.tracking import link
|
#from cybertools.wiki.tracking import link
|
||||||
|
|
||||||
|
|
||||||
class WikiURL(object):
|
class WikiURL(object):
|
||||||
|
@ -58,10 +59,8 @@ def setUp(testCase):
|
||||||
component.provideUtility(DocutilsHTMLWriter(), name='docutils.html')
|
component.provideUtility(DocutilsHTMLWriter(), name='docutils.html')
|
||||||
component.provideUtility(DocutilsRstxParser(), name='docutils.rstx')
|
component.provideUtility(DocutilsRstxParser(), name='docutils.rstx')
|
||||||
component.provideAdapter(process.Reference, name='default')
|
component.provideAdapter(process.Reference, name='default')
|
||||||
component.provideUtility(LinkManager(), name='basic')
|
component.provideUtility(LinkManager(), provides=ILinkManager,
|
||||||
component.provideAdapter(link.LinkManager)
|
name='cybertools.link')
|
||||||
links = link.setupLinkManager(None)
|
|
||||||
component.provideUtility(links, name='tracking')
|
|
||||||
from cybertools.wiki.generic import adapter
|
from cybertools.wiki.generic import adapter
|
||||||
adapter.IntIds = IntIdsStub
|
adapter.IntIds = IntIdsStub
|
||||||
|
|
||||||
|
|
|
@ -33,8 +33,8 @@ from cybertools.stateful.definition import State, Transition
|
||||||
from cybertools.stateful.interfaces import IStatesDefinition
|
from cybertools.stateful.interfaces import IStatesDefinition
|
||||||
from cybertools.tracking.btree import TrackingStorage, Track
|
from cybertools.tracking.btree import TrackingStorage, Track
|
||||||
from cybertools.tracking.interfaces import ITrackingStorage
|
from cybertools.tracking.interfaces import ITrackingStorage
|
||||||
from cybertools.wiki.base.link import Link as BaseLink
|
from cybertools.link.base import Link as BaseLink
|
||||||
from cybertools.wiki.base.link import LinkManager as BaseLinkManager
|
from cybertools.link.base import LinkManager as BaseLinkManager
|
||||||
from cybertools.wiki.interfaces import ILink, ILinkManager
|
from cybertools.wiki.interfaces import ILink, ILinkManager
|
||||||
|
|
||||||
|
|
||||||
|
@ -91,7 +91,7 @@ class Link(BaseLink, Stateful, Track):
|
||||||
return component.getUtility(IStatesDefinition, name=self.statesDefinition)
|
return component.getUtility(IStatesDefinition, name=self.statesDefinition)
|
||||||
|
|
||||||
|
|
||||||
class LinkManager(BaseLinkManager):
|
class xx_LinkManager(BaseLinkManager):
|
||||||
""" A tracking storage adapter managing wiki links.
|
""" A tracking storage adapter managing wiki links.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue