server/hook.py
branchstable
changeset 5093 8d073d2e089d
parent 5072 072ae171aeb0
child 5116 a2ce436e00ad
--- a/server/hook.py	Wed Mar 31 09:45:14 2010 +0200
+++ b/server/hook.py	Wed Mar 31 09:55:19 2010 +0200
@@ -48,6 +48,7 @@
 from logilab.common.deprecation import deprecated
 from logilab.common.logging_ext import set_log_methods
 
+from cubicweb import RegistryNotFound
 from cubicweb.cwvreg import CWRegistry, VRegistry
 from cubicweb.selectors import (objectify_selector, lltrace, ExpectedValueSelector,
                                 implements)
@@ -66,6 +67,12 @@
 
 
 class HooksRegistry(CWRegistry):
+    def initialization_completed(self):
+        for appobjects in self.values():
+            for cls in appobjects:
+                if not cls.enabled:
+                    warn('[3.6] %s: enabled is deprecated' % cls)
+                    self.unregister(cls)
 
     def register(self, obj, **kwargs):
         try:
@@ -96,7 +103,19 @@
                     for hook in hooks:
                         hook()
 
-VRegistry.REGISTRY_FACTORY['hooks'] = HooksRegistry
+class HooksManager(object):
+    def __init__(self, vreg):
+        self.vreg = vreg
+
+    def call_hooks(self, event, session=None, **kwargs):
+        try:
+            self.vreg['%s_hooks' % event].call_hooks(event, session, **kwargs)
+        except RegistryNotFound:
+            pass # no hooks for this event
+
+
+for event in ALL_HOOKS:
+    VRegistry.REGISTRY_FACTORY['%s_hooks' % event] = HooksRegistry
 
 _MARKER = object()
 def entity_oldnewvalue(entity, attr):
@@ -116,21 +135,6 @@
 
 @objectify_selector
 @lltrace
-def _bw_is_enabled(cls, req, **kwargs):
-    if cls.enabled:
-        return 1
-    warn('[3.6] %s: enabled is deprecated' % cls)
-    return 0
-
-@objectify_selector
-@lltrace
-def match_event(cls, req, **kwargs):
-    if kwargs.get('event') in cls.events:
-        return 1
-    return 0
-
-@objectify_selector
-@lltrace
 def enabled_category(cls, req, **kwargs):
     if req is None:
         return True # XXX how to deactivate server startup / shutdown event
@@ -190,11 +194,11 @@
                 return 1
         return 0
 
+
 # base class for hook ##########################################################
 
 class Hook(AppObject):
-    __registry__ = 'hooks'
-    __select__ = match_event() & enabled_category() & _bw_is_enabled()
+    __select__ = enabled_category()
     # set this in derivated classes
     events = None
     category = None
@@ -203,6 +207,10 @@
     enabled = True
 
     @classproperty
+    def __registries__(self):
+        return ['%s_hooks' % ev for ev in self.events]
+
+    @classproperty
     def __regid__(cls):
         warn('[3.6] %s.%s: please specify an id for your hook'
              % (cls.__module__, cls.__name__), DeprecationWarning)