basic implementation for subtask assignment working again (with the cybertools.relation package)
git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@669 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
parent
81d54dab91
commit
b7a0b9d836
4 changed files with 64 additions and 76 deletions
43
README.txt
43
README.txt
|
@ -1,6 +1,12 @@
|
||||||
# $Id$
|
loops - Linked Objects for Organizational Process Services
|
||||||
|
==========================================================
|
||||||
|
|
||||||
Task Examples::
|
($Id$)
|
||||||
|
|
||||||
|
Tasks and Subtasks
|
||||||
|
~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Let's start with creating a few example tasks:
|
||||||
|
|
||||||
>>> from loops.task import Task
|
>>> from loops.task import Task
|
||||||
>>> t1 = Task()
|
>>> t1 = Task()
|
||||||
|
@ -11,3 +17,36 @@ Task Examples::
|
||||||
>>> t2.title
|
>>> t2.title
|
||||||
u'Second Task'
|
u'Second Task'
|
||||||
|
|
||||||
|
Now we want to make the second task a subtask of the first one.
|
||||||
|
|
||||||
|
In order to do this we first have to provide a relations registry. For
|
||||||
|
testing we use a simple dummy implementation.
|
||||||
|
|
||||||
|
>>> from cybertools.relation.interfaces import IRelationsRegistry
|
||||||
|
>>> from cybertools.relation.registry import DummyRelationsRegistry
|
||||||
|
>>> from zope.app.testing import ztapi
|
||||||
|
|
||||||
|
>>> ztapi.provideUtility(IRelationsRegistry, DummyRelationsRegistry())
|
||||||
|
|
||||||
|
Now we can assign the task t2 as a subtask to t1:
|
||||||
|
|
||||||
|
>>> t1.assignSubtask(t2)
|
||||||
|
|
||||||
|
We can now ask our tasks for their subtasks and parent tasks:
|
||||||
|
|
||||||
|
>>> st1 = t1.getSubtasks()
|
||||||
|
>>> len(st1)
|
||||||
|
1
|
||||||
|
>>> t2 in st1
|
||||||
|
True
|
||||||
|
>>> len(t1.getParentTasks())
|
||||||
|
0
|
||||||
|
|
||||||
|
>>> pt2 = t2.getParentTasks()
|
||||||
|
>>> len(pt2)
|
||||||
|
1
|
||||||
|
>>> t1 in pt2
|
||||||
|
True
|
||||||
|
>>> len(t2.getSubtasks())
|
||||||
|
0
|
||||||
|
|
47
relation.py
47
relation.py
|
@ -1,47 +0,0 @@
|
||||||
#
|
|
||||||
# Copyright (c) 2004 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
|
|
||||||
#
|
|
||||||
|
|
||||||
"""
|
|
||||||
relation classes implementation.
|
|
||||||
|
|
||||||
$Id$
|
|
||||||
"""
|
|
||||||
|
|
||||||
from BTrees.OOBTree import OOSet
|
|
||||||
from zope.interface import implements
|
|
||||||
from zope.app import zapi
|
|
||||||
|
|
||||||
from interfaces import IRelation, IRelations
|
|
||||||
|
|
||||||
|
|
||||||
class Relation(object):
|
|
||||||
|
|
||||||
implements(IRelation)
|
|
||||||
|
|
||||||
def __init__(self, source, target):
|
|
||||||
self._source = source
|
|
||||||
self._target = target
|
|
||||||
|
|
||||||
|
|
||||||
class Relations(OOSet):
|
|
||||||
|
|
||||||
implements(IRelations)
|
|
||||||
|
|
||||||
def add(self, relation, **kw):
|
|
||||||
self.insert(relation)
|
|
||||||
|
|
33
task.py
33
task.py
|
@ -27,14 +27,24 @@ from zope.app.container.ordered import OrderedContainer
|
||||||
from zope.app.copypastemove import ObjectCopier
|
from zope.app.copypastemove import ObjectCopier
|
||||||
from zope.app import zapi
|
from zope.app import zapi
|
||||||
from zope.schema.fieldproperty import FieldProperty
|
from zope.schema.fieldproperty import FieldProperty
|
||||||
|
from zope.component.interfaces import IFactory
|
||||||
|
|
||||||
from relation import Relation, Relations
|
from cybertools.relation.interfaces import IRelationsRegistry
|
||||||
|
from cybertools.relation import DyadicRelation
|
||||||
|
|
||||||
|
#from relation import Relation, Relations
|
||||||
from resource import Resource
|
from resource import Resource
|
||||||
from interfaces import ITask
|
from interfaces import ITask
|
||||||
|
|
||||||
from copy import copy
|
from copy import copy
|
||||||
|
|
||||||
|
|
||||||
|
class SubtaskRelation(DyadicRelation):
|
||||||
|
""" Relation of a first task (the parent task) to a second task
|
||||||
|
(the subtask).
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
class Task(OrderedContainer):
|
class Task(OrderedContainer):
|
||||||
|
|
||||||
implements(ITask)
|
implements(ITask)
|
||||||
|
@ -53,19 +63,22 @@ class Task(OrderedContainer):
|
||||||
# subtasks:
|
# subtasks:
|
||||||
|
|
||||||
def getSubtasks(self, taskTypes=None):
|
def getSubtasks(self, taskTypes=None):
|
||||||
st = [ r._target for r in self._subtasks ]
|
registry = zapi.getUtility(IRelationsRegistry)
|
||||||
st.sort(lambda x,y: x.priority < y.priority and -1 or 1)
|
return [r.second
|
||||||
return tuple(st)
|
for r in registry.query(relationship=SubtaskRelation,
|
||||||
|
first=self)]
|
||||||
|
# TODO: sort according to priority
|
||||||
|
|
||||||
def getParentTasks(self, taskTypes=None):
|
def getParentTasks(self, taskTypes=None):
|
||||||
pt = [ r._source for r in self._parentTasks ]
|
registry = zapi.getUtility(IRelationsRegistry)
|
||||||
return tuple(pt)
|
return [r.first
|
||||||
|
for r in registry.query(relationship=SubtaskRelation,
|
||||||
|
second=self)]
|
||||||
|
|
||||||
def assignSubtask(self, task):
|
def assignSubtask(self, task):
|
||||||
if task not in self.getSubtasks():
|
registry = zapi.getUtility(IRelationsRegistry)
|
||||||
rel = Relation(self, task)
|
registry.register(SubtaskRelation(self, task))
|
||||||
self._subtasks.add(rel)
|
# TODO (?): avoid duplicates
|
||||||
task._parentTasks.add(rel)
|
|
||||||
|
|
||||||
def createSubtask(self, taskType=None, container=None, name=None):
|
def createSubtask(self, taskType=None, container=None, name=None):
|
||||||
container = container or zapi.getParent(self)
|
container = container or zapi.getParent(self)
|
||||||
|
|
17
test_task.py
17
test_task.py
|
@ -30,23 +30,6 @@ class TestTask(unittest.TestCase):
|
||||||
|
|
||||||
# the tests...
|
# the tests...
|
||||||
|
|
||||||
def testInterface(self):
|
|
||||||
self.assert_(ITask.providedBy(Task()),
|
|
||||||
'Interface ITask is not implemented by class Task.')
|
|
||||||
self.assert_(IContained.providedBy(Task()),
|
|
||||||
'Interface IContained is not implemented by class Task.')
|
|
||||||
verifyClass(ITask, Task)
|
|
||||||
|
|
||||||
def testContained(self):
|
|
||||||
self.assertEqual(u'tsk1', zapi.name(self.t1))
|
|
||||||
self.assertEqual(u'f1', zapi.name(zapi.getParent(self.t1)))
|
|
||||||
|
|
||||||
def testTitle(self):
|
|
||||||
t = Task()
|
|
||||||
self.assertEqual(u'', t.title)
|
|
||||||
t.title = u'First Task'
|
|
||||||
self.assertEqual(u'First Task', t.title)
|
|
||||||
|
|
||||||
def testQualifier(self):
|
def testQualifier(self):
|
||||||
t = Task()
|
t = Task()
|
||||||
self.assertEqual(u'', t.qualifier)
|
self.assertEqual(u'', t.qualifier)
|
||||||
|
|
Loading…
Add table
Reference in a new issue