--- a/selectors.py Wed Nov 18 09:16:38 2009 +0100
+++ b/selectors.py Thu Nov 19 12:55:47 2009 +0100
@@ -665,19 +665,6 @@
self.target_etype = target_etype
self.action = action
- @lltrace
- def __call__(self, cls, req, *args, **kwargs):
- rschema = cls.schema.rschema(self.rtype)
- if not (rschema.has_perm(req, self.action)
- or rschema.has_local_role(self.action)):
- return 0
- if self.action != 'read':
- if not (rschema.has_perm(req, 'read')
- or rschema.has_local_role('read')):
- return 0
- score = super(relation_possible, self).__call__(cls, req, *args, **kwargs)
- return score
-
def score_class(self, eclass, req):
eschema = eclass.e_schema
try:
@@ -689,12 +676,13 @@
return 0
if self.target_etype is not None:
try:
- if self.role == 'subject':
- return int(self.target_etype in rschema.objects(eschema))
- else:
- return int(self.target_etype in rschema.subjects(eschema))
+ rdef = rschema.role_rdef(eschema, self.target_etype, self.role)
+ if not rdef.may_have_permission(self.action, req):
+ return 0
except KeyError:
return 0
+ else:
+ return rschema.may_have_permission(self.action, req, eschema, self.role)
return 1
@@ -1070,11 +1058,11 @@
perm = getattr(cls, 'require_permission', 'read')
if hasattr(cls, 'etype'):
eschema = schema.eschema(cls.etype)
- if not (eschema.has_perm(req, perm) or eschema.has_local_role(perm)):
+ if not eschema.may_have_permission(perm, req):
return 0
if hasattr(cls, 'rtype'):
rschema = schema.rschema(cls.rtype)
- if not (rschema.has_perm(req, perm) or rschema.has_local_role(perm)):
+ if not rschema.may_have_permission(perm, req):
return 0
return 1
etype_rtype_selector = deprecated()(etype_rtype_selector)