--- 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)