Task: added qualifier, priority, isValid()

git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@120 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
helmutm 2004-09-30 09:34:15 +00:00
parent f4cc0c132c
commit 33147169c5
3 changed files with 75 additions and 2 deletions

View file

@ -25,7 +25,7 @@ $Id$
from zope.interface import Interface
from zope.app.container.interfaces import IOrderedContainer
from zope.schema import Text, TextLine, List, Object
from zope.schema import Text, TextLine, List, Object, Int
class IResourceConstraint(Interface):
@ -93,6 +93,20 @@ class ITask(IOrderedContainer):
default=u'',
required=True)
qualifier = TextLine(
title=u'Qualifier',
description=u'Some string telling more specifically what this task is about',
default=u'',
required=False)
# to do: associate with a dynamically provided vocabulary
priority = Int(
title=u'Priority',
description=u'The priority is usually used for ordering the listing '
'of tasks or subtasks; 0 means no priority, lower number = higher priority',
default=0,
required=False)
resourceConstraints = List(
title=u'Resource Constraints',
description=u'Collection of Constraints controlling the resources '
@ -196,6 +210,12 @@ class ITask(IOrderedContainer):
and usable resource constraints are present.
"""
def isValid(checkSubtasks=True):
""" Check if currently assigned resources fulfill the resource constraints.
Default: Also check subtasks.
"""
# Task object as prototype:
def copyTask(targetContainer=None):

17
task.py
View file

@ -37,6 +37,8 @@ class Task(OrderedContainer):
implements(ITask)
title = u''
qualifier = u''
priority = 0
def __init__(self):
@ -49,7 +51,9 @@ class Task(OrderedContainer):
# subtasks:
def getSubtasks(self, taskTypes=None):
return tuple(self._subtasks)
st = self._subtasks
st.sort(lambda x,y: x.priority < y.priority and -1 or 1)
return tuple(st)
def getParentTasks(self, taskTypes=None):
return tuple(self._parentTasks)
@ -147,6 +151,17 @@ class Task(OrderedContainer):
return result and result or None
return tuple([ c for c in candidates if self.isResourceAllowed(c) ])
def isValid(self, checkSubtasks=True):
if self.resourceConstraints is not None:
for r in self.getAllocatedResources():
if not self.isResourceAllowed(r):
return False
if checkSubtasks:
for t in self.getSubtasks():
if not t.isValid():
return False
return True
# Task object as prototype:
def copyTask(self, targetContainer=None):

View file

@ -47,6 +47,12 @@ class TestTask(unittest.TestCase):
t.title = u'First Task'
self.assertEqual(u'First Task', t.title)
def testQualifier(self):
t = Task()
self.assertEqual(u'', t.qualifier)
t.qualifier = u'troubleticket'
self.assertEqual(u'troubleticket', t.qualifier)
def testSubtasks(self):
t1 = Task()
self.assertEqual((), t1.getSubtasks())
@ -72,6 +78,15 @@ class TestTask(unittest.TestCase):
self.assertEqual((), t2.getParentTasks())
self.assertEqual((), t1.getSubtasks())
def testSubtasksOrdering(self):
t1 = self.t1
st1 = t1.createSubtask()
st2 = t1.createSubtask()
st2.priority = 2
self.assertEqual((st1, st2), t1.getSubtasks())
st1.priority = 3
self.assertEqual((st2, st1), t1.getSubtasks())
from loops.resource import Resource
@ -154,6 +169,29 @@ class TestTaskResourceConstraints(unittest.TestCase):
self.assertEqual((r1,), t1.getCandidateResources())
self.assertEqual((r1,), rc1.getAllowedResources([r1]))
def testIsValid(self):
t1 = self.t1
r1 = self.r1
rc1 = self.rc1
t1.allocateResource(r1)
self.failUnless(t1.isValid()) # no constraint - everything valid
self.t1.resourceConstraints.append(self.rc1) # empty constraint
self.failIf(t1.isValid()) # does not allow anything
rc1.referenceValues = ([r1]) # explicit allow
self.failUnless(t1.isValid()) #
def testIsValidParentTask(self):
t1 = self.t1
r1 = self.r1
rc1 = self.rc1
t1.allocateResource(r1)
pt = Task()
pt.assignSubtask(t1)
self.failUnless(pt.isValid()) # no constraint - everything valid
self.t1.resourceConstraints.append(self.rc1) # empty constraint
self.failIf(pt.isValid()) # does not allow anything
self.failUnless(pt.isValid(False)) # don't check subtasks
class TestTaskCopy(unittest.TestCase):
"Tests related to copying tasks e.g. when using task prototypes."