merge tls-sprint
authorsylvain.thenault@logilab.fr
Tue, 17 Feb 2009 21:42:33 +0100
branchtls-sprint
changeset 696 2a5a19185288
parent 695 356da23c57f1 (diff)
parent 692 800592b8d39b (current diff)
child 697 06807984e610
merge
selectors.py
web/views/actions.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):
--- 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)
-