ResourceConstraint: more on selectmethod and checkmethod
git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@122 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
parent
cf291c3417
commit
f0928adbd8
3 changed files with 31 additions and 26 deletions
|
@ -32,7 +32,7 @@ class ResourceConstraint(object):
|
||||||
implements(IResourceConstraint)
|
implements(IResourceConstraint)
|
||||||
|
|
||||||
explanation = u''
|
explanation = u''
|
||||||
constraintType = 'select'
|
constraintType = 'require'
|
||||||
referenceType = 'explicit'
|
referenceType = 'explicit'
|
||||||
referenceKey = None
|
referenceKey = None
|
||||||
|
|
||||||
|
@ -47,20 +47,16 @@ class ResourceConstraint(object):
|
||||||
m = getattr(ref, self.referenceKey)
|
m = getattr(ref, self.referenceKey)
|
||||||
if resource in m():
|
if resource in m():
|
||||||
return True
|
return True
|
||||||
return False
|
|
||||||
elif self.referenceType == 'explicit':
|
elif self.referenceType == 'explicit':
|
||||||
return resource in self.referenceValues
|
return resource in self.referenceValues
|
||||||
elif self.referenceType == 'method':
|
elif self.referenceType == 'checkmethod':
|
||||||
m = getattr(resource, self.referenceKey, None)
|
m = getattr(resource, self.referenceKey, None)
|
||||||
if m:
|
if m:
|
||||||
result = m()
|
return m()
|
||||||
if result is None: # method needs additional task parameter
|
elif self.referenceType == 'selectmethod':
|
||||||
result = m(task=task)
|
allowed = self.getAllowedResources(task=task)
|
||||||
return result
|
return allowed and resource in allowed or False
|
||||||
else:
|
return False
|
||||||
return False
|
|
||||||
else:
|
|
||||||
return False
|
|
||||||
|
|
||||||
|
|
||||||
def getAllowedResources(self, candidates=None, task=None):
|
def getAllowedResources(self, candidates=None, task=None):
|
||||||
|
@ -72,6 +68,9 @@ class ResourceConstraint(object):
|
||||||
return tuple(result)
|
return tuple(result)
|
||||||
elif self.referenceType == 'explicit':
|
elif self.referenceType == 'explicit':
|
||||||
return tuple(self.referenceValues)
|
return tuple(self.referenceValues)
|
||||||
|
elif self.referenceType == 'selectmethod':
|
||||||
|
m = getattr(self, self.referenceKey)
|
||||||
|
return m(candidates, task)
|
||||||
else:
|
else:
|
||||||
if candidates is None:
|
if candidates is None:
|
||||||
return None
|
return None
|
||||||
|
|
|
@ -41,14 +41,14 @@ class IResourceConstraint(Interface):
|
||||||
|
|
||||||
constraintType = TextLine(
|
constraintType = TextLine(
|
||||||
title=u'Constraint Type',
|
title=u'Constraint Type',
|
||||||
description=u'Type of the constraint: select, require, allow, disallow',
|
description=u'Type of the constraint: require, allow, disallow',
|
||||||
default=u'select',
|
default=u'require',
|
||||||
required=True)
|
required=True)
|
||||||
|
|
||||||
referenceType = TextLine(
|
referenceType = TextLine(
|
||||||
title=u'Reference Type',
|
title=u'Reference Type',
|
||||||
description=u'Type of reference to the resource attribute to check: '
|
description=u'Type of reference to the resource attribute to check: '
|
||||||
'explicit, parent, type, method.',
|
'explicit, parent, type, selectmethod, checkmethod.',
|
||||||
default=u'explicit',
|
default=u'explicit',
|
||||||
required=True)
|
required=True)
|
||||||
|
|
||||||
|
|
|
@ -34,7 +34,7 @@ class Test(unittest.TestCase):
|
||||||
'Interface IResourceConstraint is not implemented by class ResourceConstraint.')
|
'Interface IResourceConstraint is not implemented by class ResourceConstraint.')
|
||||||
verifyClass(IResourceConstraint, ResourceConstraint)
|
verifyClass(IResourceConstraint, ResourceConstraint)
|
||||||
|
|
||||||
def testSelectExplicit(self):
|
def testRequireExplicit(self):
|
||||||
rc1 = self.rc1
|
rc1 = self.rc1
|
||||||
r1 = self.r1
|
r1 = self.r1
|
||||||
self.assertEqual(False, rc1.isResourceAllowed(r1))
|
self.assertEqual(False, rc1.isResourceAllowed(r1))
|
||||||
|
@ -43,7 +43,7 @@ class Test(unittest.TestCase):
|
||||||
self.assertEqual(True, rc1.isResourceAllowed(r1))
|
self.assertEqual(True, rc1.isResourceAllowed(r1))
|
||||||
self.assertEqual((r1,), rc1.getAllowedResources())
|
self.assertEqual((r1,), rc1.getAllowedResources())
|
||||||
|
|
||||||
def testSelectParent(self):
|
def testRequireParent(self):
|
||||||
rc1 = self.rc1
|
rc1 = self.rc1
|
||||||
r1 = self.r1
|
r1 = self.r1
|
||||||
t2 = Task()
|
t2 = Task()
|
||||||
|
@ -56,10 +56,9 @@ class Test(unittest.TestCase):
|
||||||
rc1.referenceType = 'parent'
|
rc1.referenceType = 'parent'
|
||||||
rc1.referenceKey = 'getAllocatedResources'
|
rc1.referenceKey = 'getAllocatedResources'
|
||||||
|
|
||||||
def testRequireMethod(self):
|
def testRequireCheckmethod(self):
|
||||||
rc1 = self.rc1
|
rc1 = self.rc1
|
||||||
rc1.constraintType = 'require'
|
rc1.referenceType = 'checkmethod'
|
||||||
rc1.referenceType = 'method'
|
|
||||||
rc1.referenceKey = 'isAllowedForTesting'
|
rc1.referenceKey = 'isAllowedForTesting'
|
||||||
r1 = self.r1
|
r1 = self.r1
|
||||||
t1 = self.t1
|
t1 = self.t1
|
||||||
|
@ -67,13 +66,20 @@ class Test(unittest.TestCase):
|
||||||
Resource.isAllowedForTesting = lambda self: True
|
Resource.isAllowedForTesting = lambda self: True
|
||||||
self.failUnless(rc1.isResourceAllowed(r1))
|
self.failUnless(rc1.isResourceAllowed(r1))
|
||||||
Resource.isAllowedForTesting = lambda self: False
|
Resource.isAllowedForTesting = lambda self: False
|
||||||
self.failIf(rc1.isResourceAllowed(r1))
|
self.failIf(rc1.isResourceAllowed(r1, t1))
|
||||||
def method(self, task='dummy'):
|
|
||||||
if task == 'dummy': return None # need task keyword parameter
|
def testRequireSelectMethod(self):
|
||||||
return task == t1
|
rc1 = self.rc1
|
||||||
Resource.isAllowedForTesting = method
|
rc1.referenceType = 'selectmethod'
|
||||||
self.failUnless(rc1.isResourceAllowed(r1, t1))
|
rc1.referenceKey = 'selectResources'
|
||||||
self.failIf(rc1.isResourceAllowed(r1, Task()))
|
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))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue