aboutsummaryrefslogtreecommitdiffstats
path: root/debug_toolbar/toolbar.py
diff options
context:
space:
mode:
Diffstat (limited to 'debug_toolbar/toolbar.py')
-rw-r--r--debug_toolbar/toolbar.py118
1 files changed, 118 insertions, 0 deletions
diff --git a/debug_toolbar/toolbar.py b/debug_toolbar/toolbar.py
new file mode 100644
index 0000000..f9262f8
--- /dev/null
+++ b/debug_toolbar/toolbar.py
@@ -0,0 +1,118 @@
+"""
+The main DebugToolbar class that loads and renders the Toolbar.
+"""
+
+from __future__ import unicode_literals
+
+from django.conf import settings
+from django.template.loader import render_to_string
+from django.utils.datastructures import SortedDict
+from django.utils.importlib import import_module
+
+from debug_toolbar.utils.settings import CONFIG
+
+
+class DebugToolbar(object):
+
+ def __init__(self, request):
+ self.request = request
+ self._panels = SortedDict()
+ base_url = self.request.META.get('SCRIPT_NAME', '')
+ self.config = {}
+ self.config.update(CONFIG)
+ self.template_context = {
+ 'BASE_URL': base_url, # for backwards compatibility
+ 'STATIC_URL': settings.STATIC_URL,
+ 'TOOLBAR_ROOT_TAG_ATTRS': self.config['ROOT_TAG_ATTRS'],
+ }
+
+ self.load_panels()
+ self.stats = {}
+
+ def _get_panels(self):
+ return list(self._panels.values())
+ panels = property(_get_panels)
+
+ def get_panel(self, cls):
+ return self._panels[cls]
+
+ def load_panels(self):
+ """
+ Populate debug panels
+ """
+ global panel_classes
+ for panel_class in panel_classes:
+ panel_instance = panel_class(self, context=self.template_context)
+ self._panels[panel_class] = panel_instance
+
+ def render_toolbar(self):
+ """
+ Renders the overall Toolbar with panels inside.
+ """
+ context = self.template_context.copy()
+ context.update({
+ 'panels': self.panels,
+ 'toolbar_id': save_toolbar(self),
+ })
+ return render_to_string('debug_toolbar/base.html', context)
+
+
+panel_classes = []
+
+
+def load_panel_classes():
+ from django.conf import settings
+ from django.core.exceptions import ImproperlyConfigured
+
+ # Check if settings has a DEBUG_TOOLBAR_PANELS, otherwise use default
+ panels = getattr(settings, 'DEBUG_TOOLBAR_PANELS', (
+ 'debug_toolbar.panels.version.VersionDebugPanel',
+ 'debug_toolbar.panels.timer.TimerDebugPanel',
+ 'debug_toolbar.panels.settings_vars.SettingsVarsDebugPanel',
+ 'debug_toolbar.panels.headers.HeaderDebugPanel',
+ 'debug_toolbar.panels.request_vars.RequestVarsDebugPanel',
+ 'debug_toolbar.panels.sql.SQLDebugPanel',
+ 'debug_toolbar.panels.template.TemplateDebugPanel',
+ 'debug_toolbar.panels.cache.CacheDebugPanel',
+ 'debug_toolbar.panels.signals.SignalDebugPanel',
+ 'debug_toolbar.panels.logger.LoggingPanel',
+ ))
+ for panel_path in panels:
+ try:
+ dot = panel_path.rindex('.')
+ except ValueError:
+ raise ImproperlyConfigured(
+ "%s isn't a debug panel module" % panel_path)
+ panel_module, panel_classname = panel_path[:dot], panel_path[dot + 1:]
+ try:
+ mod = import_module(panel_module)
+ except ImportError as e:
+ raise ImproperlyConfigured(
+ 'Error importing debug panel %s: "%s"' %
+ (panel_module, e))
+ try:
+ panel_class = getattr(mod, panel_classname)
+ except AttributeError:
+ raise ImproperlyConfigured(
+ 'Toolbar Panel module "%s" does not define a "%s" class' %
+ (panel_module, panel_classname))
+ panel_classes.append(panel_class)
+
+
+toolbar_counter = 0
+toolbar_results = SortedDict()
+
+
+def save_toolbar(toolbar):
+ global toolbar_counter, toolbar_results
+ toolbar_counter += 1
+ toolbar_results[toolbar_counter] = toolbar
+ for _ in range(len(toolbar_results) - CONFIG['RESULTS_CACHE_SIZE']):
+ # When we drop support for Python 2.6 and switch to
+ # collections.OrderedDict, use popitem(last=False).
+ del toolbar_results[toolbar_results.keyOrder[0]]
+ return toolbar_counter
+
+
+def get_saved_toolbar(toolbar_id):
+ return toolbar_results.get(toolbar_id)