From e0dd08a6a706f0ad6dea8fc3040b4cfc36f7651c Mon Sep 17 00:00:00 2001 From: Theo Julienne Date: Mon, 12 Sep 2011 14:06:32 +1000 Subject: [PATCH] Wrap panel process_view requests to allow multiple panels to hook without calling the view multiple times --- debug_toolbar/middleware.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/debug_toolbar/middleware.py b/debug_toolbar/middleware.py index f49a29ffa..a27f9559b 100644 --- a/debug_toolbar/middleware.py +++ b/debug_toolbar/middleware.py @@ -3,6 +3,7 @@ """ import imp import thread +from functools import wraps from django.conf import settings from django.conf.urls.defaults import include, patterns @@ -97,14 +98,25 @@ def process_request(self, request): for panel in toolbar.panels: panel.process_request(request) self.__class__.debug_toolbars[thread.get_ident()] = toolbar - + + def _wrap_view(self, view_func, panel): + @wraps(view_func) + def _wrapped_view(request, *view_args, **view_kwargs): + ret = panel.process_view(request, view_func, view_args, view_kwargs) + if ret is None: # call the next panel if this one didn't do it + ret = view_func( request, *view_args, **view_kwargs ) + return ret + return _wrapped_view + def process_view(self, request, view_func, view_args, view_kwargs): __traceback_hide__ = True toolbar = self.__class__.debug_toolbars.get(thread.get_ident()) if not toolbar: return + wrapped_view_func = view_func for panel in toolbar.panels: - panel.process_view(request, view_func, view_args, view_kwargs) + wrapped_view_func = self._wrap_view( wrapped_view_func, panel ) + return wrapped_view_func(request, *view_args, **view_kwargs) def process_response(self, request, response): __traceback_hide__ = True