From f0928adbd86def790c5f814dec4dba9be8bc3c83 Mon Sep 17 00:00:00 2001 From: helmutm Date: Fri, 1 Oct 2004 09:10:37 +0000 Subject: [PATCH] ResourceConstraint: more on selectmethod and checkmethod git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@122 fd906abe-77d9-0310-91a1-e0d9ade77398 --- constraint.py | 21 ++++++++++----------- interfaces.py | 6 +++--- tests/test_constraint.py | 30 ++++++++++++++++++------------ 3 files changed, 31 insertions(+), 26 deletions(-) diff --git a/constraint.py b/constraint.py index 4ce4e1e..d0382af 100644 --- a/constraint.py +++ b/constraint.py @@ -32,7 +32,7 @@ class ResourceConstraint(object): implements(IResourceConstraint) explanation = u'' - constraintType = 'select' + constraintType = 'require' referenceType = 'explicit' referenceKey = None @@ -47,20 +47,16 @@ class ResourceConstraint(object): m = getattr(ref, self.referenceKey) if resource in m(): return True - return False elif self.referenceType == 'explicit': return resource in self.referenceValues - elif self.referenceType == 'method': + elif self.referenceType == 'checkmethod': m = getattr(resource, self.referenceKey, None) if m: - result = m() - if result is None: # method needs additional task parameter - result = m(task=task) - return result - else: - return False - else: - return False + return m() + elif self.referenceType == 'selectmethod': + allowed = self.getAllowedResources(task=task) + return allowed and resource in allowed or False + return False def getAllowedResources(self, candidates=None, task=None): @@ -72,6 +68,9 @@ class ResourceConstraint(object): return tuple(result) elif self.referenceType == 'explicit': return tuple(self.referenceValues) + elif self.referenceType == 'selectmethod': + m = getattr(self, self.referenceKey) + return m(candidates, task) else: if candidates is None: return None diff --git a/interfaces.py b/interfaces.py index 56a89d9..485e0d5 100644 --- a/interfaces.py +++ b/interfaces.py @@ -41,14 +41,14 @@ class IResourceConstraint(Interface): constraintType = TextLine( title=u'Constraint Type', - description=u'Type of the constraint: select, require, allow, disallow', - default=u'select', + description=u'Type of the constraint: require, allow, disallow', + default=u'require', required=True) referenceType = TextLine( title=u'Reference Type', description=u'Type of reference to the resource attribute to check: ' - 'explicit, parent, type, method.', + 'explicit, parent, type, selectmethod, checkmethod.', default=u'explicit', required=True) diff --git a/tests/test_constraint.py b/tests/test_constraint.py index 87e64a3..5f6e465 100755 --- a/tests/test_constraint.py +++ b/tests/test_constraint.py @@ -34,7 +34,7 @@ class Test(unittest.TestCase): 'Interface IResourceConstraint is not implemented by class ResourceConstraint.') verifyClass(IResourceConstraint, ResourceConstraint) - def testSelectExplicit(self): + def testRequireExplicit(self): rc1 = self.rc1 r1 = self.r1 self.assertEqual(False, rc1.isResourceAllowed(r1)) @@ -43,7 +43,7 @@ class Test(unittest.TestCase): self.assertEqual(True, rc1.isResourceAllowed(r1)) self.assertEqual((r1,), rc1.getAllowedResources()) - def testSelectParent(self): + def testRequireParent(self): rc1 = self.rc1 r1 = self.r1 t2 = Task() @@ -56,10 +56,9 @@ class Test(unittest.TestCase): rc1.referenceType = 'parent' rc1.referenceKey = 'getAllocatedResources' - def testRequireMethod(self): + def testRequireCheckmethod(self): rc1 = self.rc1 - rc1.constraintType = 'require' - rc1.referenceType = 'method' + rc1.referenceType = 'checkmethod' rc1.referenceKey = 'isAllowedForTesting' r1 = self.r1 t1 = self.t1 @@ -67,13 +66,20 @@ class Test(unittest.TestCase): Resource.isAllowedForTesting = lambda self: True self.failUnless(rc1.isResourceAllowed(r1)) Resource.isAllowedForTesting = lambda self: False - self.failIf(rc1.isResourceAllowed(r1)) - def method(self, task='dummy'): - if task == 'dummy': return None # need task keyword parameter - return task == t1 - Resource.isAllowedForTesting = method - self.failUnless(rc1.isResourceAllowed(r1, t1)) - self.failIf(rc1.isResourceAllowed(r1, Task())) + self.failIf(rc1.isResourceAllowed(r1, t1)) + + def testRequireSelectMethod(self): + rc1 = self.rc1 + rc1.referenceType = 'selectmethod' + rc1.referenceKey = 'selectResources' + r1 = self.r1 + t1 = self.t1 + def method(self, candidates, task): + if task is None: return None + return (r1,) + ResourceConstraint.selectResources = method + self.assertEqual((r1,), rc1.getAllowedResources(task=t1)) + self.failUnless(rc1.isResourceAllowed(r1, task=t1))