aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAymeric Augustin2013-11-15 20:14:40 +0100
committerAymeric Augustin2013-11-15 20:33:51 +0100
commit70d3aa1b8c12d614f2ca1b1b550bb605d8c8a506 (patch)
tree00df40543a7e7a3b509dfb3bc2c9efb1f3736e05
parent5f54e2d88a12ec7fa06bd2a9dd54e1af2f0b50f7 (diff)
downloaddjango-debug-toolbar-70d3aa1b8c12d614f2ca1b1b550bb605d8c8a506.tar.bz2
Make panels behave more like Django middleware.
-rw-r--r--debug_toolbar/middleware.py44
-rw-r--r--debug_toolbar/panels/__init__.py6
-rw-r--r--debug_toolbar/static/debug_toolbar/js/toolbar.js4
-rw-r--r--debug_toolbar/templates/debug_toolbar/base.html2
-rw-r--r--debug_toolbar/toolbar.py4
5 files changed, 32 insertions, 28 deletions
diff --git a/debug_toolbar/middleware.py b/debug_toolbar/middleware.py
index 44d0700..7456072 100644
--- a/debug_toolbar/middleware.py
+++ b/debug_toolbar/middleware.py
@@ -59,34 +59,34 @@ class DebugToolbarMiddleware(object):
def process_request(self, request):
__traceback_hide__ = True # noqa
- if self.show_toolbar(request):
- toolbar = DebugToolbar(request)
- for panel in toolbar.panels:
- panel.enabled = panel.dom_id() not in request.COOKIES
- if not panel.enabled:
- continue
- panel.enable_instrumentation()
- panel.process_request(request)
- self.__class__.debug_toolbars[threading.current_thread().ident] = toolbar
+ if not self.show_toolbar(request):
+ return
+ response = None
+ toolbar = DebugToolbar(request)
+ for panel in toolbar.enabled_panels:
+ panel.enable_instrumentation()
+ for panel in toolbar.enabled_panels:
+ response = panel.process_request(request)
+ if response:
+ break
+ self.__class__.debug_toolbars[threading.current_thread().ident] = toolbar
+ return response
def process_view(self, request, view_func, view_args, view_kwargs):
__traceback_hide__ = True # noqa
toolbar = self.__class__.debug_toolbars.get(threading.current_thread().ident)
if not toolbar:
return
- result = None
- for panel in toolbar.panels:
- if not panel.enabled:
- continue
+ response = None
+ for panel in toolbar.enabled_panels:
response = panel.process_view(request, view_func, view_args, view_kwargs)
if response:
- result = response
- return result
+ break
+ return response
def process_response(self, request, response):
__traceback_hide__ = True # noqa
- ident = threading.current_thread().ident
- toolbar = self.__class__.debug_toolbars.get(ident)
+ toolbar = self.__class__.debug_toolbars.pop(threading.current_thread().ident, None)
if not toolbar or request.is_ajax() or getattr(response, 'streaming', False):
return response
if isinstance(response, HttpResponseRedirect):
@@ -101,10 +101,11 @@ class DebugToolbarMiddleware(object):
{'redirect_to': redirect_to}
)
response.cookies = cookies
- for panel in toolbar.panels:
- if not panel.enabled:
- continue
- panel.process_response(request, response)
+ for panel in reversed(toolbar.enabled_panels):
+ new_response = panel.process_response(request, response)
+ if new_response:
+ response = new_response
+ for panel in reversed(toolbar.enabled_panels):
panel.disable_instrumentation()
if ('gzip' not in response.get('Content-Encoding', '') and
response.get('Content-Type', '').split(';')[0] in _HTML_TYPES):
@@ -114,5 +115,4 @@ class DebugToolbarMiddleware(object):
force_text(toolbar.render_toolbar() + self.tag))
if response.get('Content-Length', None):
response['Content-Length'] = len(response.content)
- del self.__class__.debug_toolbars[ident]
return response
diff --git a/debug_toolbar/panels/__init__.py b/debug_toolbar/panels/__init__.py
index 47ca996..d64aac2 100644
--- a/debug_toolbar/panels/__init__.py
+++ b/debug_toolbar/panels/__init__.py
@@ -14,9 +14,6 @@ class DebugPanel(object):
# If content returns something, set to True in subclass
has_content = False
- # This can be set to False in instances if the panel is disabled.
- enabled = True
-
# We'll maintain a local context instance so we can expose our template
# context variables to panels which need them:
context = {}
@@ -37,6 +34,9 @@ class DebugPanel(object):
def dom_id(self):
return 'djDebug%sPanel' % (self.name.replace(' ', ''))
+ def enabled(self):
+ return self.toolbar.request.COOKIES.get(self.dom_id(), 'on') == 'on'
+
# URLs for panel-specific views
@classmethod
diff --git a/debug_toolbar/static/debug_toolbar/js/toolbar.js b/debug_toolbar/static/debug_toolbar/js/toolbar.js
index e062f9e..3e0913b 100644
--- a/debug_toolbar/static/debug_toolbar/js/toolbar.js
+++ b/debug_toolbar/static/debug_toolbar/js/toolbar.js
@@ -58,9 +58,9 @@
return false;
});
$('#djDebug .djDebugPanelButton input[type=checkbox]').live('click', function() {
- $.cookie($(this).attr('data-cookie'), 'off', {
+ $.cookie($(this).attr('data-cookie'), $(this).prop('checked') ? 'on' : 'off', {
path: '/',
- expires: $(this).prop('checked') ? -1 : 10
+ expires: 10,
});
});
diff --git a/debug_toolbar/templates/debug_toolbar/base.html b/debug_toolbar/templates/debug_toolbar/base.html
index b2ea63e..19b32cf 100644
--- a/debug_toolbar/templates/debug_toolbar/base.html
+++ b/debug_toolbar/templates/debug_toolbar/base.html
@@ -20,7 +20,7 @@ if(!window.jQuery) document.write('<scr'+'ipt src="{{ STATIC_URL }}debug_toolbar
{% endif %}
{% for panel in panels %}
<li class="djDebugPanelButton">
- <input type="checkbox" data-cookie="{{ panel.dom_id }}"{% if panel.enabled %} checked="checked"{% endif %} title="{% trans "Toogle Panel for next and successive requests" %}" />
+ <input type="checkbox" data-cookie="{{ panel.dom_id }}" {% if panel.enabled %}checked="checked" title="{% trans "Disable for next and successive requests" %}"{% else %}title="{% trans "Enable for next and successive requests" %}"{% endif %} />
{% if panel.has_content and panel.enabled %}
<a href="{{ panel.url|default:"#" }}" title="{{ panel.title }}" class="{{ panel.dom_id }}">
{% else %}
diff --git a/debug_toolbar/toolbar.py b/debug_toolbar/toolbar.py
index 3f274d0..5c48ffa 100644
--- a/debug_toolbar/toolbar.py
+++ b/debug_toolbar/toolbar.py
@@ -35,6 +35,10 @@ class DebugToolbar(object):
return list(self._panels.values())
panels = property(_get_panels)
+ def _get_enabled_panels(self):
+ return [panel for panel in self._panels.values() if panel.enabled]
+ enabled_panels = property(_get_enabled_panels)
+
def get_panel(self, cls):
return self._panels[cls]