
git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@3855 fd906abe-77d9-0310-91a1-e0d9ade77398
141 lines
4.2 KiB
Python
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)
|