--- a/common/registerers.py Tue Feb 17 21:29:58 2009 +0100
+++ b/common/registerers.py Tue Feb 17 21:42:33 2009 +0100
@@ -11,9 +11,12 @@
__docformat__ = "restructuredtext en"
from cubicweb.vregistry import registerer
-
+from cubicweb.selectors import implements
def _accepts_interfaces(obj):
+ impl = obj.__select__.search_selector(implements)
+ if impl:
+ return sorted(impl.expected_ifaces)
return sorted(getattr(obj, 'accepts_interfaces', ()))
@@ -54,17 +57,6 @@
def equivalent(self, other):
raise NotImplementedError(self, self.vobject)
-
-
-class kick_registerer(registerer):
- """systematically kick previous registered class and don't register the
- wrapped class. This is temporarily used to discard library object registrable
- but that we don't want to use
- """
- def do_it_yourself(self, registered):
- if registered:
- self.kick(registered, registered[-1])
- return
class accepts_registerer(priority_registerer):
--- a/selectors.py Tue Feb 17 21:29:58 2009 +0100
+++ b/selectors.py Tue Feb 17 21:42:33 2009 +0100
@@ -479,6 +479,7 @@
proximity so the most specific object'll be selected
"""
def __init__(self, *expected_ifaces):
+ super(implements, self).__init__()
self.expected_ifaces = expected_ifaces
def score_class(self, eclass, req):
--- a/vregistry.py Tue Feb 17 21:29:58 2009 +0100
+++ b/vregistry.py Tue Feb 17 21:42:33 2009 +0100
@@ -243,7 +243,17 @@
# def clear(self, key):
# regname, oid = key.split('.')
# self[regname].pop(oid, None)
-
+ def register_all(self, objects, modname, butclasses=()):
+ for obj in objects:
+ try:
+ if obj.__module__ != modname or obj in butclasses:
+ continue
+ oid = obj.id
+ except AttributeError:
+ continue
+ if oid:
+ self.register(obj)
+
def register(self, obj, registryname=None, oid=None, clear=False):
"""base method to add an object in the registry"""
registryname = registryname or obj.__registry__
@@ -567,42 +577,6 @@
set_log_methods(registerer, getLogger('cubicweb.registration'))
-# advanced selector building functions ########################################
-
-def chainall(*selectors, **kwargs):
- """return a selector chaining given selectors. If one of
- the selectors fail, selection will fail, else the returned score
- will be the sum of each selector'score
- """
- assert selectors
- def selector(cls, *args, **kwargs):
- score = 0
- for selector in selectors:
- partscore = selector(cls, *args, **kwargs)
- if not partscore:
- return 0
- score += partscore
- return score
- if 'name' in kwargs:
- selector.__name__ = kwargs['name']
- return selector
-
-def chainfirst(*selectors, **kwargs):
- """return a selector chaining given selectors. If all
- the selectors fail, selection will fail, else the returned score
- will be the first non-zero selector score
- """
- assert selectors
- def selector(cls, *args, **kwargs):
- for selector in selectors:
- partscore = selector(cls, *args, **kwargs)
- if partscore:
- return partscore
- return 0
- if 'name' in kwargs:
- selector.__name__ = kwargs['name']
- return selector
-
# selector base classes and operations ########################################
@@ -630,20 +604,39 @@
else:
merged_selectors.append(selector)
return merged_selectors
-
+
+ def search_selector(self, selector):
+ """search for the given selector or selector instance in the selectors
+ tree. Return it of None if not found
+ """
+ if self is selector:
+ return self
+ if isinstance(selector, type) and instance(self, selector):
+ return self
+ for childselector in self.selectors:
+ try:
+ if childselector.use_selector(selector):
+ return childselector
+ except AttributeError: # simple function
+ if childselector is selector:
+ return childselector
+ return None
+
def __and__(self, other):
return AndSelector(self, other)
+ def __rand__(self, other):
+ return AndSelector(other, self)
def __or__(self, other):
return OrSelector(self, other)
-
- __ror__ = __or__ # for cases like (function | selector)
- __rand__ = __and__ # for cases like (function & selector)
+ def __ror__(self, other):
+ return OrSelector(other, self)
+
# XXX (function | function) or (function & function) not managed yet
def __call__(self, cls, *args, **kwargs):
return NotImplementedError("selector %s must implement its logic "
- "in its __call__ method" % self.__class__.__name__)
+ "in its __call__ method" % self.__class__)
class AndSelector(Selector):
@@ -666,3 +659,28 @@
if partscore:
return partscore
return 0
+
+
+# advanced selector building functions ########################################
+
+def chainall(*selectors, **kwargs):
+ """return a selector chaining given selectors. If one of
+ the selectors fail, selection will fail, else the returned score
+ will be the sum of each selector'score
+ """
+ assert selectors
+ selector = AndSelector(*selectors)
+ if 'name' in kwargs:
+ selector.__name__ = kwargs['name']
+ return selector
+
+def chainfirst(*selectors, **kwargs):
+ """return a selector chaining given selectors. If all
+ the selectors fail, selection will fail, else the returned score
+ will be the first non-zero selector score
+ """
+ assert selectors
+ selector = OrSelector(*selectors)
+ if 'name' in kwargs:
+ selector.__name__ = kwargs['name']
+ return selector
--- a/web/views/actions.py Tue Feb 17 21:29:58 2009 +0100
+++ b/web/views/actions.py Tue Feb 17 21:42:33 2009 +0100
@@ -126,17 +126,19 @@
# generic secondary actions ###################################################
-class ManagePermissions(Action):
+class ManagePermissionsAction(Action):
id = 'addpermission'
- __selectors__ = (
- (match_user_groups('managers')
- | relation_possible('require_permission', 'subject', 'EPermission')),
- )
+ __selectors__ = match_user_groups('managers')
title = _('manage permissions')
category = 'moreactions'
order = 100
-
+
+ def registered(cls, vreg):
+ if 'require_permission' in vreg.schema:
+ cls.__selectors__ |= relation_possible('require_permission', 'subject', 'EPermission',
+ action='add')
+
def url(self):
return self.rset.get_entity(0, 0).absolute_url(vid='security')
@@ -269,4 +271,3 @@
def url(self):
return self.build_url(self.id)
-