# HG changeset patch # User sylvain.thenault@logilab.fr # Date 1234903353 -3600 # Node ID 2a5a1918528869de03e3487c4d5d2e2742028ebd # Parent 356da23c57f15b59c86f51b669cdcdb5afea0c0d# Parent 800592b8d39bdff1e82ccdb3bd7ab86eb39a87e0 merge diff -r 800592b8d39b -r 2a5a19185288 common/registerers.py --- 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): diff -r 800592b8d39b -r 2a5a19185288 selectors.py --- 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): diff -r 800592b8d39b -r 2a5a19185288 vregistry.py --- 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 diff -r 800592b8d39b -r 2a5a19185288 web/views/actions.py --- 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) -