Task: handle multiple resource constraints

git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@123 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
helmutm 2004-10-01 12:41:42 +00:00
parent f0928adbd8
commit 6d91ae183d
2 changed files with 28 additions and 11 deletions

19
task.py
View file

@ -122,24 +122,27 @@ class Task(OrderedContainer):
# resource constraint stuff:
def isResourceAllowed(self, resource):
def isResourceAllowed(self, resource, rcDontCheck=None):
rc = self.resourceConstraints
if not rc:
return True
for c in rc:
if rcDontCheck and c == rcDontCheck: # don't check constraint already checked
continue
# that's too simple, we must check all constraints for constraintType:
if c.isResourceAllowed(resource):
return True
return False
if not c.isResourceAllowed(resource):
return False
return True
def getCandidateResources(self):
rc = self.resourceConstraints
if not rc:
return ()
result = []
for c in rc:
result.extend(c.getAllowedResources())
return tuple(result)
candidates = c.getAllowedResources()
if candidates is not None:
return tuple([ r for r in candidates if self.isResourceAllowed(r, c) ])
return ()
def getAllowedResources(self, candidates=None):
rc = self.resourceConstraints
@ -149,7 +152,7 @@ class Task(OrderedContainer):
result = self.getCandidateResources()
# Empty result means: can't tell
return result and result or None
return tuple([ c for c in candidates if self.isResourceAllowed(c) ])
return tuple([ r for r in candidates if self.isResourceAllowed(r) ])
def isValid(self, checkSubtasks=True):
if self.resourceConstraints is not None:

View file

@ -150,7 +150,7 @@ class TestTaskResourceConstraints(unittest.TestCase):
# the tests...
def testSelectExplicit(self):
def testRequireExplicit(self):
t1 = self.t1
r1 = self.r1
rc1 = self.rc1
@ -165,9 +165,23 @@ class TestTaskResourceConstraints(unittest.TestCase):
self.assertEqual((), t1.getAllowedResources([r1]))
rc1.referenceValues = ([r1])
self.assertEqual(True, rc1.isResourceAllowed(r1))
self.assertEqual(True, t1.isResourceAllowed(r1))
self.assertEqual((r1,), t1.getCandidateResources())
self.assertEqual((r1,), rc1.getAllowedResources([r1]))
self.assertEqual((r1,), t1.getAllowedResources([r1]))
def testRCCombination(self):
t1 = self.t1
r1 = self.r1
r2 = Resource()
self.f1['rsc2'] = r2
rc1 = self.rc1
rc1.referenceValues = ([r1, r2]) # allow/select both resources
rc2 = ResourceConstraint()
rc2.referenceType = 'checkmethod'
rc2.referenceKey = 'isAllowedForTesting'
Resource.isAllowedForTesting = lambda self: zapi.name(self) == 'rsc1'
t1.resourceConstraints = [rc1, rc2]
self.assertEqual((r1,), t1.getAllowedResources())
def testIsValid(self):
t1 = self.t1