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,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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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')
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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.
|
||||
"""
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue