diff -r d6fd82a5a4e8 -r a63d7886fcf5 server/hook.py --- a/server/hook.py Tue Mar 30 14:32:03 2010 +0200 +++ b/server/hook.py Wed Mar 31 15:39:09 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,15 +67,14 @@ 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: - iter(obj.events) - except AttributeError: - raise - except: - raise Exception('bad .events attribute %s on %s.%s' % ( - obj.events, obj.__module__, obj.__name__)) for event in obj.events: if event not in ALL_HOOKS: raise Exception('bad event %s on %s.%s' % ( @@ -96,7 +96,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 +128,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 +187,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 +200,16 @@ enabled = True @classproperty + def __registries__(cls): + try: + return ['%s_hooks' % ev for ev in cls.events] + except AttributeError: + raise + except TypeError: + raise Exception('bad .events attribute %s on %s.%s' % ( + cls.events, cls.__module__, cls.__name__)) + + @classproperty def __regid__(cls): warn('[3.6] %s.%s: please specify an id for your hook' % (cls.__module__, cls.__name__), DeprecationWarning)