cybertools/wiki/tracking/link.py
helmutm b1a231f40e work in progress: wiki configuration and editing
git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@3855 fd906abe-77d9-0310-91a1-e0d9ade77398
2010-05-09 09:50:15 +00:00

141 lines
4.2 KiB
Python

#
# 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
# 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
#
"""
Store wiki links as tracks.
$Id$
"""
from zope import component
from zope.component import adapts
from zope.interface import implementer, implements
from zope.traversing.api import getName, getParent
from cybertools.stateful.base import Stateful
from cybertools.stateful.definition import StatesDefinition
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.link.base import Link as BaseLink
from cybertools.link.base import LinkManager as BaseLinkManager
from cybertools.wiki.interfaces import ILink, ILinkManager
@implementer(IStatesDefinition)
def linkStates():
return StatesDefinition('wiki.linkStates',
State('valid', 'valid', ('invalidate',), color='green'),
State('invalid', 'invalid', ('validate',), color='red'),
# transitions:
Transition('invalidate', 'invalidate', 'invalid'),
Transition('validate', 'validate', 'valid'),
initialState='valid')
class Link(BaseLink, Stateful, Track):
""" A link that is stored as a track in a tracking storage.
"""
statesDefinition = 'wiki.linkStates'
metadata_attributes = Track.metadata_attributes + ('name', 'targetId')
index_attributes = metadata_attributes
typeName = 'Link'
def __init__(self, taskId, runId, userName, data={}):
self.name = data.pop('name', '???')
self.targetId = data.pop('targetId', '')
Track.__init__(self, taskId, runId, userName, data={})
@property
def identifier(self):
return self.__name__
#return getName(self)
@property
def source(self):
return self.taskId
@property
def target(self):
return self.targetId
def __getattr__(self, k):
if k not in ILink:
raise AttributeError(k)
return self.data.get(k)
def getManager(self):
return getParent(self)
# IStateful
def getStatesDefinition(self):
return component.getUtility(IStatesDefinition, name=self.statesDefinition)
class LinkManager(BaseLinkManager):
""" A tracking storage adapter managing wiki links.
"""
adapts(ITrackingStorage)
def __init__(self, context):
self.context = context
def getLink(self, identifier):
return self.context.get(identifier)
def query(self, source=None, target=None, name=None, **kw):
criteria = kw
if source is not None:
criteria['taskId'] = source
if target is not None:
criteria['targetId'] = target
if name is not None:
criteria['name'] = name
return self.context.query(**criteria)
def createLink(self, name, source, target, **kw):
taskId = source
runId = kw.pop('runId', 0) or 0
userName = kw.pop('userName', '') or ''
if not runId:
runId = self.context.startRun()
kw['name'] = name
kw['targetId'] = target
trackId = self.context.saveUserTrack(taskId, runId, userName, kw)
track = self.context[trackId]
return track
def removeLink(self, link):
id = link.identifier
if id in self.context:
del self.context[id]
@property
def links(self):
return self.context
# for testing only:
def setupLinkManager(manager):
ts = TrackingStorage(trackFactory=Link)
return ILinkManager(ts)