From fe3df822111d3b56000deca354b0bceed7bde9cc Mon Sep 17 00:00:00 2001 From: Aymeric Augustin Date: Sun, 24 Nov 2013 10:42:43 +0100 Subject: Rename all panels consistently. Enforce absolute imports to avoid clashing with built-in package names. Thanks Jannis for his feedback. --- debug_toolbar/__init__.py | 2 +- debug_toolbar/management/commands/debugsqlshell.py | 2 +- debug_toolbar/middleware.py | 2 +- debug_toolbar/models.py | 2 +- debug_toolbar/panels/__init__.py | 16 ++- debug_toolbar/panels/cache.py | 8 +- debug_toolbar/panels/headers.py | 10 +- debug_toolbar/panels/logger.py | 139 ------------------ debug_toolbar/panels/logging.py | 139 ++++++++++++++++++ debug_toolbar/panels/profiling.py | 6 +- debug_toolbar/panels/redirects.py | 6 +- debug_toolbar/panels/request.py | 54 +++++++ debug_toolbar/panels/request_vars.py | 54 ------- debug_toolbar/panels/settings.py | 28 ++++ debug_toolbar/panels/settings_vars.py | 28 ---- debug_toolbar/panels/signals.py | 6 +- debug_toolbar/panels/sql/__init__.py | 2 +- debug_toolbar/panels/sql/forms.py | 2 +- debug_toolbar/panels/sql/panel.py | 8 +- debug_toolbar/panels/sql/tracking.py | 2 +- debug_toolbar/panels/sql/utils.py | 2 +- debug_toolbar/panels/sql/views.py | 2 +- debug_toolbar/panels/template/__init__.py | 1 - debug_toolbar/panels/template/panel.py | 158 --------------------- debug_toolbar/panels/template/views.py | 46 ------ debug_toolbar/panels/templates/__init__.py | 1 + debug_toolbar/panels/templates/panel.py | 158 +++++++++++++++++++++ debug_toolbar/panels/templates/views.py | 46 ++++++ debug_toolbar/panels/timer.py | 8 +- debug_toolbar/panels/version.py | 56 -------- debug_toolbar/panels/versions.py | 56 ++++++++ debug_toolbar/settings.py | 72 +++++++--- .../templates/debug_toolbar/panels/logger.html | 28 ---- .../templates/debug_toolbar/panels/logging.html | 28 ++++ .../templates/debug_toolbar/panels/request.html | 124 ++++++++++++++++ .../debug_toolbar/panels/request_vars.html | 124 ---------------- .../templates/debug_toolbar/panels/settings.html | 17 +++ .../debug_toolbar/panels/settings_vars.html | 17 --- .../debug_toolbar/panels/sql_explain.html | 4 +- .../debug_toolbar/panels/sql_profile.html | 4 +- .../templates/debug_toolbar/panels/sql_select.html | 4 +- .../debug_toolbar/panels/template_source.html | 4 +- debug_toolbar/toolbar.py | 2 +- debug_toolbar/utils.py | 2 +- debug_toolbar/views.py | 2 +- 45 files changed, 766 insertions(+), 716 deletions(-) delete mode 100644 debug_toolbar/panels/logger.py create mode 100644 debug_toolbar/panels/logging.py create mode 100644 debug_toolbar/panels/request.py delete mode 100644 debug_toolbar/panels/request_vars.py create mode 100644 debug_toolbar/panels/settings.py delete mode 100644 debug_toolbar/panels/settings_vars.py delete mode 100644 debug_toolbar/panels/template/__init__.py delete mode 100644 debug_toolbar/panels/template/panel.py delete mode 100644 debug_toolbar/panels/template/views.py create mode 100644 debug_toolbar/panels/templates/__init__.py create mode 100644 debug_toolbar/panels/templates/panel.py create mode 100644 debug_toolbar/panels/templates/views.py delete mode 100644 debug_toolbar/panels/version.py create mode 100644 debug_toolbar/panels/versions.py delete mode 100644 debug_toolbar/templates/debug_toolbar/panels/logger.html create mode 100644 debug_toolbar/templates/debug_toolbar/panels/logging.html create mode 100644 debug_toolbar/templates/debug_toolbar/panels/request.html delete mode 100644 debug_toolbar/templates/debug_toolbar/panels/request_vars.html create mode 100644 debug_toolbar/templates/debug_toolbar/panels/settings.html delete mode 100644 debug_toolbar/templates/debug_toolbar/panels/settings_vars.html (limited to 'debug_toolbar') diff --git a/debug_toolbar/__init__.py b/debug_toolbar/__init__.py index 23bfa55..12a7fc8 100644 --- a/debug_toolbar/__init__.py +++ b/debug_toolbar/__init__.py @@ -1,4 +1,4 @@ -from __future__ import unicode_literals +from __future__ import absolute_import, unicode_literals __all__ = ['VERSION'] diff --git a/debug_toolbar/management/commands/debugsqlshell.py b/debug_toolbar/management/commands/debugsqlshell.py index a11af98..2d4bfa6 100644 --- a/debug_toolbar/management/commands/debugsqlshell.py +++ b/debug_toolbar/management/commands/debugsqlshell.py @@ -1,4 +1,4 @@ -from __future__ import print_function, unicode_literals +from __future__ import absolute_import, print_function, unicode_literals from time import time diff --git a/debug_toolbar/middleware.py b/debug_toolbar/middleware.py index bda784d..3c9edf0 100644 --- a/debug_toolbar/middleware.py +++ b/debug_toolbar/middleware.py @@ -2,7 +2,7 @@ Debug Toolbar middleware """ -from __future__ import unicode_literals +from __future__ import absolute_import, unicode_literals import threading diff --git a/debug_toolbar/models.py b/debug_toolbar/models.py index 2152627..eba7028 100644 --- a/debug_toolbar/models.py +++ b/debug_toolbar/models.py @@ -1,4 +1,4 @@ -from __future__ import unicode_literals +from __future__ import absolute_import, unicode_literals from django.conf import settings from django.conf.urls import include, patterns, url diff --git a/debug_toolbar/panels/__init__.py b/debug_toolbar/panels/__init__.py index 37d7eb7..1ab500b 100644 --- a/debug_toolbar/panels/__init__.py +++ b/debug_toolbar/panels/__init__.py @@ -1,12 +1,14 @@ -from __future__ import unicode_literals +from __future__ import absolute_import, unicode_literals + +import warnings from django.template.defaultfilters import slugify from django.template.loader import render_to_string -class DebugPanel(object): +class Panel(object): """ - Base class for debug panels. + Base class for panels. """ # name = 'Base' # template = 'debug_toolbar/panels/base.html' @@ -89,3 +91,11 @@ class DebugPanel(object): def process_response(self, request, response): pass + + +# Backward-compatibility for 1.0, remove in 2.0. +class DebugPanel(Panel): + + def __init__(self, *args, **kwargs): + warnings.warn("DebugPanel was renamed to Panel.", DeprecationWarning) + super(DebugPanel, self).__init__(*args, **kwargs) diff --git a/debug_toolbar/panels/cache.py b/debug_toolbar/panels/cache.py index 42e512f..c2808a1 100644 --- a/debug_toolbar/panels/cache.py +++ b/debug_toolbar/panels/cache.py @@ -1,4 +1,4 @@ -from __future__ import unicode_literals +from __future__ import absolute_import, unicode_literals import inspect import sys @@ -13,7 +13,7 @@ from django.template import Node from django.utils.datastructures import SortedDict from django.utils.translation import ugettext_lazy as _, ungettext -from debug_toolbar.panels import DebugPanel +from debug_toolbar.panels import Panel from debug_toolbar.utils import (tidy_stacktrace, render_stacktrace, get_template_info, get_stack) from debug_toolbar import settings as dt_settings @@ -127,7 +127,7 @@ def get_cache(*args, **kwargs): return CacheStatTracker(original_get_cache(*args, **kwargs)) -class CacheDebugPanel(DebugPanel): +class CachePanel(Panel): """ Panel that displays the cache statistics. """ @@ -136,7 +136,7 @@ class CacheDebugPanel(DebugPanel): has_content = True def __init__(self, *args, **kwargs): - super(CacheDebugPanel, self).__init__(*args, **kwargs) + super(CachePanel, self).__init__(*args, **kwargs) self.total_time = 0 self.hits = 0 self.misses = 0 diff --git a/debug_toolbar/panels/headers.py b/debug_toolbar/panels/headers.py index 2a41081..3ee499d 100644 --- a/debug_toolbar/panels/headers.py +++ b/debug_toolbar/panels/headers.py @@ -1,18 +1,18 @@ -from __future__ import unicode_literals +from __future__ import absolute_import, unicode_literals try: from collections import OrderedDict except ImportError: from django.utils.datastructures import SortedDict as OrderedDict from django.utils.translation import ugettext_lazy as _ -from debug_toolbar.panels import DebugPanel +from debug_toolbar.panels import Panel -class HeaderDebugPanel(DebugPanel): +class HeadersPanel(Panel): """ A panel to display HTTP headers. """ - name = 'Header' + name = 'Headers' template = 'debug_toolbar/panels/headers.html' has_content = True # List of environment variables we want to display @@ -46,7 +46,7 @@ class HeaderDebugPanel(DebugPanel): self.request_headers = OrderedDict( (unmangle(k), v) for (k, v) in wsgi_env if k.startswith('HTTP_')) if 'Cookie' in self.request_headers: - self.request_headers['Cookie'] = '=> see Request Vars panel' + self.request_headers['Cookie'] = '=> see Request panel' self.environ = OrderedDict( (k, v) for (k, v) in wsgi_env if k in self.environ_filter) self.record_stats({ diff --git a/debug_toolbar/panels/logger.py b/debug_toolbar/panels/logger.py deleted file mode 100644 index 45c995a..0000000 --- a/debug_toolbar/panels/logger.py +++ /dev/null @@ -1,139 +0,0 @@ -from __future__ import unicode_literals - -import datetime -import logging -try: - import threading -except ImportError: - threading = None -from django.utils.translation import ungettext, ugettext_lazy as _ -from debug_toolbar.panels import DebugPanel - -MESSAGE_IF_STRING_REPRESENTATION_INVALID = '[Could not get log message]' - - -class LogCollector(object): - def __init__(self): - if threading is None: - raise NotImplementedError( - "threading module is not available, " - "the logging panel cannot be used without it") - self.records = {} # a dictionary that maps threads to log records - - def add_record(self, record, thread=None): - # Avoid logging SQL queries since they are already in the SQL panel - # TODO: Make this check whether SQL panel is enabled - if record.get('channel', '') == 'django.db.backends': - return - - self.get_records(thread).append(record) - - def get_records(self, thread=None): - """ - Returns a list of records for the provided thread, of if none is provided, - returns a list for the current thread. - """ - if thread is None: - thread = threading.currentThread() - if thread not in self.records: - self.records[thread] = [] - return self.records[thread] - - def clear_records(self, thread=None): - if thread is None: - thread = threading.currentThread() - if thread in self.records: - del self.records[thread] - - -class ThreadTrackingHandler(logging.Handler): - def __init__(self, collector): - logging.Handler.__init__(self) - self.collector = collector - - def emit(self, record): - try: - message = record.getMessage() - except Exception: - message = MESSAGE_IF_STRING_REPRESENTATION_INVALID - - record = { - 'message': message, - 'time': datetime.datetime.fromtimestamp(record.created), - 'level': record.levelname, - 'file': record.pathname, - 'line': record.lineno, - 'channel': record.name, - } - self.collector.add_record(record) - - -collector = LogCollector() -logging_handler = ThreadTrackingHandler(collector) -logging.root.setLevel(logging.NOTSET) -logging.root.addHandler(logging_handler) # register with logging - -# We don't use enable/disable_instrumentation because we can't make these -# functions thread-safe and (hopefully) logging isn't too expensive. - -try: - import logbook - logbook_supported = True -except ImportError: - # logbook support is optional, so fail silently - logbook_supported = False - -if logbook_supported: - class LogbookThreadTrackingHandler(logbook.handlers.Handler): - def __init__(self, collector): - logbook.handlers.Handler.__init__(self, bubble=True) - self.collector = collector - - def emit(self, record): - record = { - 'message': record.message, - 'time': record.time, - 'level': record.level_name, - 'file': record.filename, - 'line': record.lineno, - 'channel': record.channel, - } - self.collector.add_record(record) - - logbook_handler = LogbookThreadTrackingHandler(collector) - logbook_handler.push_application() # register with logbook - - -class LoggingPanel(DebugPanel): - name = 'Logging' - template = 'debug_toolbar/panels/logger.html' - has_content = True - - def __init__(self, *args, **kwargs): - super(LoggingPanel, self).__init__(*args, **kwargs) - self._records = {} - - def process_request(self, request): - collector.clear_records() - - def process_response(self, request, response): - records = self.get_and_delete() - self.record_stats({'records': records}) - - def get_and_delete(self): - records = collector.get_records() - self._records[threading.currentThread()] = records - collector.clear_records() - return records - - def nav_title(self): - return _("Logging") - - def nav_subtitle(self): - records = self._records[threading.currentThread()] - record_count = len(records) - return ungettext('%(count)s message', '%(count)s messages', - record_count) % {'count': record_count} - - def title(self): - return _('Log Messages') diff --git a/debug_toolbar/panels/logging.py b/debug_toolbar/panels/logging.py new file mode 100644 index 0000000..a37e000 --- /dev/null +++ b/debug_toolbar/panels/logging.py @@ -0,0 +1,139 @@ +from __future__ import absolute_import, unicode_literals + +import datetime +import logging +try: + import threading +except ImportError: + threading = None +from django.utils.translation import ungettext, ugettext_lazy as _ +from debug_toolbar.panels import Panel + +MESSAGE_IF_STRING_REPRESENTATION_INVALID = '[Could not get log message]' + + +class LogCollector(object): + def __init__(self): + if threading is None: + raise NotImplementedError( + "threading module is not available, " + "the logging panel cannot be used without it") + self.records = {} # a dictionary that maps threads to log records + + def add_record(self, record, thread=None): + # Avoid logging SQL queries since they are already in the SQL panel + # TODO: Make this check whether SQL panel is enabled + if record.get('channel', '') == 'django.db.backends': + return + + self.get_records(thread).append(record) + + def get_records(self, thread=None): + """ + Returns a list of records for the provided thread, of if none is provided, + returns a list for the current thread. + """ + if thread is None: + thread = threading.currentThread() + if thread not in self.records: + self.records[thread] = [] + return self.records[thread] + + def clear_records(self, thread=None): + if thread is None: + thread = threading.currentThread() + if thread in self.records: + del self.records[thread] + + +class ThreadTrackingHandler(logging.Handler): + def __init__(self, collector): + logging.Handler.__init__(self) + self.collector = collector + + def emit(self, record): + try: + message = record.getMessage() + except Exception: + message = MESSAGE_IF_STRING_REPRESENTATION_INVALID + + record = { + 'message': message, + 'time': datetime.datetime.fromtimestamp(record.created), + 'level': record.levelname, + 'file': record.pathname, + 'line': record.lineno, + 'channel': record.name, + } + self.collector.add_record(record) + + +collector = LogCollector() +logging_handler = ThreadTrackingHandler(collector) +logging.root.setLevel(logging.NOTSET) +logging.root.addHandler(logging_handler) # register with logging + +# We don't use enable/disable_instrumentation because we can't make these +# functions thread-safe and (hopefully) logging isn't too expensive. + +try: + import logbook + logbook_supported = True +except ImportError: + # logbook support is optional, so fail silently + logbook_supported = False + +if logbook_supported: + class LogbookThreadTrackingHandler(logbook.handlers.Handler): + def __init__(self, collector): + logbook.handlers.Handler.__init__(self, bubble=True) + self.collector = collector + + def emit(self, record): + record = { + 'message': record.message, + 'time': record.time, + 'level': record.level_name, + 'file': record.filename, + 'line': record.lineno, + 'channel': record.channel, + } + self.collector.add_record(record) + + logbook_handler = LogbookThreadTrackingHandler(collector) + logbook_handler.push_application() # register with logbook + + +class LoggingPanel(Panel): + name = 'Logging' + template = 'debug_toolbar/panels/logging.html' + has_content = True + + def __init__(self, *args, **kwargs): + super(LoggingPanel, self).__init__(*args, **kwargs) + self._records = {} + + def process_request(self, request): + collector.clear_records() + + def process_response(self, request, response): + records = self.get_and_delete() + self.record_stats({'records': records}) + + def get_and_delete(self): + records = collector.get_records() + self._records[threading.currentThread()] = records + collector.clear_records() + return records + + def nav_title(self): + return _("Logging") + + def nav_subtitle(self): + records = self._records[threading.currentThread()] + record_count = len(records) + return ungettext('%(count)s message', '%(count)s messages', + record_count) % {'count': record_count} + + def title(self): + return _('Log Messages') diff --git a/debug_toolbar/panels/profiling.py b/debug_toolbar/panels/profiling.py index 6192ef9..9443e34 100644 --- a/debug_toolbar/panels/profiling.py +++ b/debug_toolbar/panels/profiling.py @@ -1,9 +1,9 @@ -from __future__ import division, unicode_literals +from __future__ import absolute_import, division, unicode_literals from django.utils.translation import ugettext_lazy as _ from django.utils.safestring import mark_safe from django.utils.six.moves import cStringIO -from debug_toolbar.panels import DebugPanel +from debug_toolbar.panels import Panel try: from line_profiler import LineProfiler, show_func @@ -140,7 +140,7 @@ class FunctionCall(object): return self._line_stats_text -class ProfilingDebugPanel(DebugPanel): +class ProfilingPanel(Panel): """ Panel that displays profiling information. """ diff --git a/debug_toolbar/panels/redirects.py b/debug_toolbar/panels/redirects.py index 605dde3..9deeb69 100644 --- a/debug_toolbar/panels/redirects.py +++ b/debug_toolbar/panels/redirects.py @@ -1,13 +1,13 @@ -from __future__ import unicode_literals +from __future__ import absolute_import, unicode_literals from django.core.handlers.wsgi import STATUS_CODE_TEXT from django.shortcuts import render from django.utils.translation import ugettext as _ -from debug_toolbar.panels import DebugPanel +from debug_toolbar.panels import Panel -class InterceptRedirectsPanel(DebugPanel): +class RedirectsPanel(Panel): """ Panel that intercepts redirects and displays a page with debug info. """ diff --git a/debug_toolbar/panels/request.py b/debug_toolbar/panels/request.py new file mode 100644 index 0000000..934946a --- /dev/null +++ b/debug_toolbar/panels/request.py @@ -0,0 +1,54 @@ +from __future__ import absolute_import, unicode_literals + +from django.core.urlresolvers import resolve +from django.http import Http404 +from django.utils.encoding import force_text +from django.utils.translation import ugettext_lazy as _ + +from debug_toolbar.panels import Panel +from debug_toolbar.utils import get_name_from_obj + + +class RequestPanel(Panel): + """ + A panel to display request variables (POST/GET, session, cookies). + """ + name = 'Request' + template = 'debug_toolbar/panels/request.html' + has_content = True + + def nav_title(self): + return _('Request') + + def title(self): + return _('Request') + + def process_response(self, request, response): + self.record_stats({ + 'get': [(k, request.GET.getlist(k)) for k in sorted(request.GET)], + 'post': [(k, request.POST.getlist(k)) for k in sorted(request.POST)], + 'cookies': [(k, request.COOKIES.get(k)) for k in sorted(request.COOKIES)], + }) + view_info = { + 'view_func': _(''), + 'view_args': 'None', + 'view_kwargs': 'None', + 'view_urlname': 'None', + } + try: + match = resolve(request.path) + func, args, kwargs = match + view_info['view_func'] = get_name_from_obj(func) + view_info['view_args'] = args + view_info['view_kwargs'] = kwargs + view_info['view_urlname'] = getattr(match, 'url_name', + _('')) + except Http404: + pass + self.record_stats(view_info) + + if hasattr(request, 'session'): + self.record_stats({ + 'session': [(k, request.session.get(k)) + for k in sorted(request.session.keys(), key=force_text)] + }) diff --git a/debug_toolbar/panels/request_vars.py b/debug_toolbar/panels/request_vars.py deleted file mode 100644 index b5e7070..0000000 --- a/debug_toolbar/panels/request_vars.py +++ /dev/null @@ -1,54 +0,0 @@ -from __future__ import unicode_literals - -from django.core.urlresolvers import resolve -from django.http import Http404 -from django.utils.encoding import force_text -from django.utils.translation import ugettext_lazy as _ - -from debug_toolbar.panels import DebugPanel -from debug_toolbar.utils import get_name_from_obj - - -class RequestVarsDebugPanel(DebugPanel): - """ - A panel to display request variables (POST/GET, session, cookies). - """ - name = 'RequestVars' - template = 'debug_toolbar/panels/request_vars.html' - has_content = True - - def nav_title(self): - return _('Request Vars') - - def title(self): - return _('Request Vars') - - def process_response(self, request, response): - self.record_stats({ - 'get': [(k, request.GET.getlist(k)) for k in sorted(request.GET)], - 'post': [(k, request.POST.getlist(k)) for k in sorted(request.POST)], - 'cookies': [(k, request.COOKIES.get(k)) for k in sorted(request.COOKIES)], - }) - view_info = { - 'view_func': _(''), - 'view_args': 'None', - 'view_kwargs': 'None', - 'view_urlname': 'None', - } - try: - match = resolve(request.path) - func, args, kwargs = match - view_info['view_func'] = get_name_from_obj(func) - view_info['view_args'] = args - view_info['view_kwargs'] = kwargs - view_info['view_urlname'] = getattr(match, 'url_name', - _('')) - except Http404: - pass - self.record_stats(view_info) - - if hasattr(request, 'session'): - self.record_stats({ - 'session': [(k, request.session.get(k)) - for k in sorted(request.session.keys(), key=force_text)] - }) diff --git a/debug_toolbar/panels/settings.py b/debug_toolbar/panels/settings.py new file mode 100644 index 0000000..b7af57d --- /dev/null +++ b/debug_toolbar/panels/settings.py @@ -0,0 +1,28 @@ +from __future__ import absolute_import, unicode_literals + +from django.conf import settings +from django.views.debug import get_safe_settings +from django.utils.translation import ugettext_lazy as _ +from django.utils.datastructures import SortedDict + +from debug_toolbar.panels import Panel + + +class SettingsPanel(Panel): + """ + A panel to display all variables in django.conf.settings + """ + name = 'Settings' + template = 'debug_toolbar/panels/settings.html' + has_content = True + + def nav_title(self): + return _('Settings') + + def title(self): + return _('Settings from %s') % settings.SETTINGS_MODULE + + def process_response(self, request, response): + self.record_stats({ + 'settings': SortedDict(sorted(get_safe_settings().items(), key=lambda s: s[0])), + }) diff --git a/debug_toolbar/panels/settings_vars.py b/debug_toolbar/panels/settings_vars.py deleted file mode 100644 index 8692394..0000000 --- a/debug_toolbar/panels/settings_vars.py +++ /dev/null @@ -1,28 +0,0 @@ -from __future__ import unicode_literals - -from django.conf import settings -from django.views.debug import get_safe_settings -from django.utils.translation import ugettext_lazy as _ -from django.utils.datastructures import SortedDict - -from debug_toolbar.panels import DebugPanel - - -class SettingsVarsDebugPanel(DebugPanel): - """ - A panel to display all variables in django.conf.settings - """ - name = 'SettingsVars' - template = 'debug_toolbar/panels/settings_vars.html' - has_content = True - - def nav_title(self): - return _('Settings') - - def title(self): - return _('Settings from %s') % settings.SETTINGS_MODULE - - def process_response(self, request, response): - self.record_stats({ - 'settings': SortedDict(sorted(get_safe_settings().items(), key=lambda s: s[0])), - }) diff --git a/debug_toolbar/panels/signals.py b/debug_toolbar/panels/signals.py index e9f4f00..74d1faa 100644 --- a/debug_toolbar/panels/signals.py +++ b/debug_toolbar/panels/signals.py @@ -1,4 +1,4 @@ -from __future__ import unicode_literals +from __future__ import absolute_import, unicode_literals from django.core.signals import ( request_started, request_finished, got_request_exception) @@ -10,10 +10,10 @@ from django.dispatch.dispatcher import WEAKREF_TYPES from django.utils.translation import ugettext_lazy as _, ungettext from django.utils.importlib import import_module -from debug_toolbar.panels import DebugPanel +from debug_toolbar.panels import Panel -class SignalDebugPanel(DebugPanel): +class SignalsPanel(Panel): name = "Signals" template = 'debug_toolbar/panels/signals.html' has_content = True diff --git a/debug_toolbar/panels/sql/__init__.py b/debug_toolbar/panels/sql/__init__.py index 90e05cb..88a916e 100644 --- a/debug_toolbar/panels/sql/__init__.py +++ b/debug_toolbar/panels/sql/__init__.py @@ -1 +1 @@ -from debug_toolbar.panels.sql.panel import SQLDebugPanel # noqa +from debug_toolbar.panels.sql.panel import SQLPanel # noqa diff --git a/debug_toolbar/panels/sql/forms.py b/debug_toolbar/panels/sql/forms.py index c18be0c..3fdbc25 100644 --- a/debug_toolbar/panels/sql/forms.py +++ b/debug_toolbar/panels/sql/forms.py @@ -1,4 +1,4 @@ -from __future__ import unicode_literals +from __future__ import absolute_import, unicode_literals import json import hashlib diff --git a/debug_toolbar/panels/sql/panel.py b/debug_toolbar/panels/sql/panel.py index 84ac992..3bfbe60 100644 --- a/debug_toolbar/panels/sql/panel.py +++ b/debug_toolbar/panels/sql/panel.py @@ -1,4 +1,4 @@ -from __future__ import unicode_literals +from __future__ import absolute_import, unicode_literals import uuid from copy import copy @@ -7,7 +7,7 @@ from django.conf.urls import patterns, url from django.db import connections from django.utils.translation import ugettext_lazy as _, ungettext_lazy as __ -from debug_toolbar.panels import DebugPanel +from debug_toolbar.panels import Panel from debug_toolbar.panels.sql.forms import SQLSelectForm from debug_toolbar.utils import render_stacktrace from debug_toolbar.panels.sql.utils import reformat_sql @@ -44,7 +44,7 @@ def get_transaction_status_display(engine, level): return choices.get(level) -class SQLDebugPanel(DebugPanel): +class SQLPanel(Panel): """ Panel that displays information about the SQL queries run while processing the request. @@ -54,7 +54,7 @@ class SQLDebugPanel(DebugPanel): has_content = True def __init__(self, *args, **kwargs): - super(SQLDebugPanel, self).__init__(*args, **kwargs) + super(SQLPanel, self).__init__(*args, **kwargs) self._offset = dict((k, len(connections[k].queries)) for k in connections) self._sql_time = 0 self._num_queries = 0 diff --git a/debug_toolbar/panels/sql/tracking.py b/debug_toolbar/panels/sql/tracking.py index 989ce3d..d412872 100644 --- a/debug_toolbar/panels/sql/tracking.py +++ b/debug_toolbar/panels/sql/tracking.py @@ -1,4 +1,4 @@ -from __future__ import unicode_literals +from __future__ import absolute_import, unicode_literals import sys diff --git a/debug_toolbar/panels/sql/utils.py b/debug_toolbar/panels/sql/utils.py index 00728a3..3943168 100644 --- a/debug_toolbar/panels/sql/utils.py +++ b/debug_toolbar/panels/sql/utils.py @@ -1,4 +1,4 @@ -from __future__ import unicode_literals +from __future__ import absolute_import, unicode_literals import re diff --git a/debug_toolbar/panels/sql/views.py b/debug_toolbar/panels/sql/views.py index 346cf6e..05ad74f 100644 --- a/debug_toolbar/panels/sql/views.py +++ b/debug_toolbar/panels/sql/views.py @@ -1,4 +1,4 @@ -from __future__ import unicode_literals +from __future__ import absolute_import, unicode_literals from django.http import HttpResponseBadRequest from django.shortcuts import render diff --git a/debug_toolbar/panels/template/__init__.py b/debug_toolbar/panels/template/__init__.py deleted file mode 100644 index d2f595d..0000000 --- a/debug_toolbar/panels/template/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from debug_toolbar.panels.template.panel import TemplateDebugPanel # noqa diff --git a/debug_toolbar/panels/template/panel.py b/debug_toolbar/panels/template/panel.py deleted file mode 100644 index b877a53..0000000 --- a/debug_toolbar/panels/template/panel.py +++ /dev/null @@ -1,158 +0,0 @@ -from __future__ import unicode_literals - -from os.path import normpath -from pprint import pformat - -import django -from django import http -from django.conf import settings -from django.conf.urls import patterns, url -from django.db.models.query import QuerySet, RawQuerySet -from django.template.context import get_standard_processors -from django.test.signals import template_rendered -from django.utils.encoding import force_text -from django.utils import six -from django.utils.translation import ugettext_lazy as _ - -from debug_toolbar.panels import DebugPanel -from debug_toolbar.panels.sql.tracking import recording, SQLQueryTriggered - -# Code taken and adapted from Simon Willison and Django Snippets: -# http://www.djangosnippets.org/snippets/766/ - -# Monkey-patch to enable the template_rendered signal. The receiver returns -# immediately when the panel is disabled to keep the overhead small. - -from django.test.utils import instrumented_test_render -from django.template import Template - -if Template._render != instrumented_test_render: - Template.original_render = Template._render - Template._render = instrumented_test_render - - -if django.VERSION[:2] < (1, 7): - # Monkey-patch versions of Django where Template doesn't store origin. - # See https://code.djangoproject.com/ticket/16096. - - old_template_init = Template.__init__ - - def new_template_init(self, template_string, origin=None, name=''): - old_template_init(self, template_string, origin, name) - self.origin = origin - - Template.__init__ = new_template_init - - -class TemplateDebugPanel(DebugPanel): - """ - A panel that lists all templates used during processing of a response. - """ - name = 'Template' - template = 'debug_toolbar/panels/templates.html' - has_content = True - - def __init__(self, *args, **kwargs): - super(TemplateDebugPanel, self).__init__(*args, **kwargs) - self.templates = [] - template_rendered.connect(self._store_template_info) - - def _store_template_info(self, sender, **kwargs): - if not self.enabled: - return - - template, context = kwargs['template'], kwargs['context'] - - # Skip templates that we are generating through the debug toolbar. - if (isinstance(template.name, six.string_types) and - template.name.startswith('debug_toolbar/')): - return - - context_list = [] - for context_layer in context.dicts: - temp_layer = {} - if hasattr(context_layer, 'items'): - for key, value in context_layer.items(): - # Replace any request elements - they have a large - # unicode representation and the request data is - # already made available from the Request Vars panel. - if isinstance(value, http.HttpRequest): - temp_layer[key] = '<>' - # Replace the debugging sql_queries element. The SQL - # data is already made available from the SQL panel. - elif key == 'sql_queries' and isinstance(value, list): - temp_layer[key] = '<>' - # Replace LANGUAGES, which is available in i18n context processor - elif key == 'LANGUAGES' and isinstance(value, tuple): - temp_layer[key] = '<>' - # QuerySet would trigger the database: user can run the query from SQL Panel - elif isinstance(value, (QuerySet, RawQuerySet)): - model_name = "%s.%s" % ( - value.model._meta.app_label, value.model.__name__) - temp_layer[key] = '<<%s of %s>>' % ( - value.__class__.__name__.lower(), model_name) - else: - try: - recording(False) - pformat(value) # this MAY trigger a db query - except SQLQueryTriggered: - temp_layer[key] = '<>' - except UnicodeEncodeError: - temp_layer[key] = '<>' - except Exception: - temp_layer[key] = '<>' - else: - temp_layer[key] = value - finally: - recording(True) - try: - context_list.append(pformat(temp_layer)) - except UnicodeEncodeError: - pass - - kwargs['context'] = [force_text(item) for item in context_list] - self.templates.append(kwargs) - - @classmethod - def get_urls(cls): - return patterns('debug_toolbar.panels.template.views', # noqa - url(r'^template_source/$', 'template_source', name='template_source'), - ) - - def nav_title(self): - return _('Templates') - - def title(self): - num_templates = len(self.templates) - return _('Templates (%(num_templates)s rendered)') % {'num_templates': num_templates} - - def process_response(self, request, response): - context_processors = dict( - [ - ("%s.%s" % (k.__module__, k.__name__), - pformat(k(request))) for k in get_standard_processors() - ] - ) - template_context = [] - for template_data in self.templates: - info = {} - # Clean up some info about templates - template = template_data.get('template', None) - if not hasattr(template, 'origin'): - continue - if template.origin and template.origin.name: - template.origin_name = template.origin.name - else: - template.origin_name = 'No origin' - info['template'] = template - # Clean up context for better readability - if self.toolbar.config['SHOW_TEMPLATE_CONTEXT']: - context_list = template_data.get('context', []) - info['context'] = '\n'.join(context_list) - template_context.append(info) - - self.record_stats({ - 'templates': template_context, - 'template_dirs': [normpath(x) for x in settings.TEMPLATE_DIRS], - 'context_processors': context_processors, - }) diff --git a/debug_toolbar/panels/template/views.py b/debug_toolbar/panels/template/views.py deleted file mode 100644 index 30bd167..0000000 --- a/debug_toolbar/panels/template/views.py +++ /dev/null @@ -1,46 +0,0 @@ -from __future__ import unicode_literals - -from django.http import HttpResponseBadRequest -from django.conf import settings -from django.shortcuts import render -from django.template import TemplateDoesNotExist -from django.template.loader import find_template_loader -from django.utils.safestring import mark_safe - - -def template_source(request): - """ - Return the source of a template, syntax-highlighted by Pygments if - it's available. - """ - template_name = request.GET.get('template', None) - if template_name is None: - return HttpResponseBadRequest('"template" key is required') - - loaders = [] - for loader_name in settings.TEMPLATE_LOADERS: - loader = find_template_loader(loader_name) - if loader is not None: - loaders.append(loader) - for loader in loaders: - try: - source, display_name = loader.load_template_source(template_name) - break - except TemplateDoesNotExist: - source = "Template Does Not Exist: %s" % (template_name,) - - try: - from pygments import highlight - from pygments.lexers import HtmlDjangoLexer - from pygments.formatters import HtmlFormatter - - source = highlight(source, HtmlDjangoLexer(), HtmlFormatter()) - source = mark_safe(source) - source.pygmentized = True - except ImportError: - pass - - return render(request, 'debug_toolbar/panels/template_source.html', { - 'source': source, - 'template_name': template_name - }) diff --git a/debug_toolbar/panels/templates/__init__.py b/debug_toolbar/panels/templates/__init__.py new file mode 100644 index 0000000..96908e2 --- /dev/null +++ b/debug_toolbar/panels/templates/__init__.py @@ -0,0 +1 @@ +from debug_toolbar.panels.templates.panel import TemplatesPanel # noqa diff --git a/debug_toolbar/panels/templates/panel.py b/debug_toolbar/panels/templates/panel.py new file mode 100644 index 0000000..c745b83 --- /dev/null +++ b/debug_toolbar/panels/templates/panel.py @@ -0,0 +1,158 @@ +from __future__ import absolute_import, unicode_literals + +from os.path import normpath +from pprint import pformat + +import django +from django import http +from django.conf import settings +from django.conf.urls import patterns, url +from django.db.models.query import QuerySet, RawQuerySet +from django.template.context import get_standard_processors +from django.test.signals import template_rendered +from django.utils.encoding import force_text +from django.utils import six +from django.utils.translation import ugettext_lazy as _ + +from debug_toolbar.panels import Panel +from debug_toolbar.panels.sql.tracking import recording, SQLQueryTriggered + +# Code taken and adapted from Simon Willison and Django Snippets: +# http://www.djangosnippets.org/snippets/766/ + +# Monkey-patch to enable the template_rendered signal. The receiver returns +# immediately when the panel is disabled to keep the overhead small. + +from django.test.utils import instrumented_test_render +from django.template import Template + +if Template._render != instrumented_test_render: + Template.original_render = Template._render + Template._render = instrumented_test_render + + +if django.VERSION[:2] < (1, 7): + # Monkey-patch versions of Django where Template doesn't store origin. + # See https://code.djangoproject.com/ticket/16096. + + old_template_init = Template.__init__ + + def new_template_init(self, template_string, origin=None, name=''): + old_template_init(self, template_string, origin, name) + self.origin = origin + + Template.__init__ = new_template_init + + +class TemplatesPanel(Panel): + """ + A panel that lists all templates used during processing of a response. + """ + name = 'Templates' + template = 'debug_toolbar/panels/templates.html' + has_content = True + + def __init__(self, *args, **kwargs): + super(TemplatesPanel, self).__init__(*args, **kwargs) + self.templates = [] + template_rendered.connect(self._store_template_info) + + def _store_template_info(self, sender, **kwargs): + if not self.enabled: + return + + template, context = kwargs['template'], kwargs['context'] + + # Skip templates that we are generating through the debug toolbar. + if (isinstance(template.name, six.string_types) and + template.name.startswith('debug_toolbar/')): + return + + context_list = [] + for context_layer in context.dicts: + temp_layer = {} + if hasattr(context_layer, 'items'): + for key, value in context_layer.items(): + # Replace any request elements - they have a large + # unicode representation and the request data is + # already made available from the Request panel. + if isinstance(value, http.HttpRequest): + temp_layer[key] = '<>' + # Replace the debugging sql_queries element. The SQL + # data is already made available from the SQL panel. + elif key == 'sql_queries' and isinstance(value, list): + temp_layer[key] = '<>' + # Replace LANGUAGES, which is available in i18n context processor + elif key == 'LANGUAGES' and isinstance(value, tuple): + temp_layer[key] = '<>' + # QuerySet would trigger the database: user can run the query from SQL Panel + elif isinstance(value, (QuerySet, RawQuerySet)): + model_name = "%s.%s" % ( + value.model._meta.app_label, value.model.__name__) + temp_layer[key] = '<<%s of %s>>' % ( + value.__class__.__name__.lower(), model_name) + else: + try: + recording(False) + pformat(value) # this MAY trigger a db query + except SQLQueryTriggered: + temp_layer[key] = '<>' + except UnicodeEncodeError: + temp_layer[key] = '<>' + except Exception: + temp_layer[key] = '<>' + else: + temp_layer[key] = value + finally: + recording(True) + try: + context_list.append(pformat(temp_layer)) + except UnicodeEncodeError: + pass + + kwargs['context'] = [force_text(item) for item in context_list] + self.templates.append(kwargs) + + @classmethod + def get_urls(cls): + return patterns('debug_toolbar.panels.templates.views', # noqa + url(r'^template_source/$', 'template_source', name='template_source'), + ) + + def nav_title(self): + return _('Templates') + + def title(self): + num_templates = len(self.templates) + return _('Templates (%(num_templates)s rendered)') % {'num_templates': num_templates} + + def process_response(self, request, response): + context_processors = dict( + [ + ("%s.%s" % (k.__module__, k.__name__), + pformat(k(request))) for k in get_standard_processors() + ] + ) + template_context = [] + for template_data in self.templates: + info = {} + # Clean up some info about templates + template = template_data.get('template', None) + if not hasattr(template, 'origin'): + continue + if template.origin and template.origin.name: + template.origin_name = template.origin.name + else: + template.origin_name = 'No origin' + info['template'] = template + # Clean up context for better readability + if self.toolbar.config['SHOW_TEMPLATE_CONTEXT']: + context_list = template_data.get('context', []) + info['context'] = '\n'.join(context_list) + template_context.append(info) + + self.record_stats({ + 'templates': template_context, + 'template_dirs': [normpath(x) for x in settings.TEMPLATE_DIRS], + 'context_processors': context_processors, + }) diff --git a/debug_toolbar/panels/templates/views.py b/debug_toolbar/panels/templates/views.py new file mode 100644 index 0000000..79479d9 --- /dev/null +++ b/debug_toolbar/panels/templates/views.py @@ -0,0 +1,46 @@ +from __future__ import absolute_import, unicode_literals + +from django.http import HttpResponseBadRequest +from django.conf import settings +from django.shortcuts import render +from django.template import TemplateDoesNotExist +from django.template.loader import find_template_loader +from django.utils.safestring import mark_safe + + +def template_source(request): + """ + Return the source of a template, syntax-highlighted by Pygments if + it's available. + """ + template_name = request.GET.get('template', None) + if template_name is None: + return HttpResponseBadRequest('"template" key is required') + + loaders = [] + for loader_name in settings.TEMPLATE_LOADERS: + loader = find_template_loader(loader_name) + if loader is not None: + loaders.append(loader) + for loader in loaders: + try: + source, display_name = loader.load_template_source(template_name) + break + except TemplateDoesNotExist: + source = "Template Does Not Exist: %s" % (template_name,) + + try: + from pygments import highlight + from pygments.lexers import HtmlDjangoLexer + from pygments.formatters import HtmlFormatter + + source = highlight(source, HtmlDjangoLexer(), HtmlFormatter()) + source = mark_safe(source) + source.pygmentized = True + except ImportError: + pass + + return render(request, 'debug_toolbar/panels/template_source.html', { + 'source': source, + 'template_name': template_name + }) diff --git a/debug_toolbar/panels/timer.py b/debug_toolbar/panels/timer.py index 9a0fef3..900b624 100644 --- a/debug_toolbar/panels/timer.py +++ b/debug_toolbar/panels/timer.py @@ -1,4 +1,4 @@ -from __future__ import unicode_literals +from __future__ import absolute_import, unicode_literals try: import resource @@ -7,10 +7,10 @@ except ImportError: import time from django.template.loader import render_to_string from django.utils.translation import ugettext as _ -from debug_toolbar.panels import DebugPanel +from debug_toolbar.panels import Panel -class TimerDebugPanel(DebugPanel): +class TimerPanel(Panel): """ Panel that displays the time a response took in milliseconds. """ @@ -59,7 +59,7 @@ class TimerDebugPanel(DebugPanel): self.record_stats(stats) def nav_title(self): - return _('Time') + return _('Timer') def nav_subtitle(self): stats = self.get_stats() diff --git a/debug_toolbar/panels/version.py b/debug_toolbar/panels/version.py deleted file mode 100644 index 87823f3..0000000 --- a/debug_toolbar/panels/version.py +++ /dev/null @@ -1,56 +0,0 @@ -from __future__ import unicode_literals - -import sys - -import django -from django.conf import settings -from django.utils.translation import ugettext_lazy as _ -from django.utils.datastructures import SortedDict -from django.utils.importlib import import_module - -from debug_toolbar.panels import DebugPanel - - -class VersionDebugPanel(DebugPanel): - """ - Panel that displays the Django version. - """ - name = 'Version' - template = 'debug_toolbar/panels/versions.html' - has_content = True - - def nav_title(self): - return _('Versions') - - def nav_subtitle(self): - return 'Django %s' % django.get_version() - - def title(self): - return _('Versions') - - def process_response(self, request, response): - versions = [('Python', '%d.%d.%d' % sys.version_info[:3])] - for app in list(settings.INSTALLED_APPS) + ['django']: - name = app.split('.')[-1].replace('_', ' ').capitalize() - app = import_module(app) - if hasattr(app, 'get_version'): - get_version = app.get_version - if callable(get_version): - version = get_version() - else: - version = get_version - elif hasattr(app, 'VERSION'): - version = app.VERSION - elif hasattr(app, '__version__'): - version = app.__version__ - else: - continue - if isinstance(version, (list, tuple)): - version = '.'.join(str(o) for o in version) - versions.append((name, version)) - versions = sorted(versions, key=lambda version: version[0]) - - self.record_stats({ - 'versions': SortedDict(versions), - 'paths': sys.path, - }) diff --git a/debug_toolbar/panels/versions.py b/debug_toolbar/panels/versions.py new file mode 100644 index 0000000..6028115 --- /dev/null +++ b/debug_toolbar/panels/versions.py @@ -0,0 +1,56 @@ +from __future__ import absolute_import, unicode_literals + +import sys + +import django +from django.conf import settings +from django.utils.translation import ugettext_lazy as _ +from django.utils.datastructures import SortedDict +from django.utils.importlib import import_module + +from debug_toolbar.panels import Panel + + +class VersionsPanel(Panel): + """ + Shows versions of Python, Django, and installed apps if possible. + """ + name = 'Versions' + template = 'debug_toolbar/panels/versions.html' + has_content = True + + def nav_title(self): + return _('Versions') + + def nav_subtitle(self): + return 'Django %s' % django.get_version() + + def title(self): + return _('Versions') + + def process_response(self, request, response): + versions = [('Python', '%d.%d.%d' % sys.version_info[:3])] + for app in list(settings.INSTALLED_APPS) + ['django']: + name = app.split('.')[-1].replace('_', ' ').capitalize() + app = import_module(app) + if hasattr(app, 'get_version'): + get_version = app.get_version + if callable(get_version): + version = get_version() + else: + version = get_version + elif hasattr(app, 'VERSION'): + version = app.VERSION + elif hasattr(app, '__version__'): + version = app.__version__ + else: + continue + if isinstance(version, (list, tuple)): + version = '.'.join(str(o) for o in version) + versions.append((name, version)) + versions = sorted(versions, key=lambda version: version[0]) + + self.record_stats({ + 'versions': SortedDict(versions), + 'paths': sys.path, + }) diff --git a/debug_toolbar/settings.py b/debug_toolbar/settings.py index c86688a..7e23122 100644 --- a/debug_toolbar/settings.py +++ b/debug_toolbar/settings.py @@ -1,4 +1,6 @@ -from __future__ import unicode_literals +from __future__ import absolute_import, unicode_literals + +import warnings from django.conf import settings from django.utils import six @@ -38,19 +40,57 @@ CONFIG.update(CONFIG_DEFAULTS) CONFIG.update(getattr(settings, 'DEBUG_TOOLBAR_CONFIG', {})) -PANELS_DEFAULTS = ( - '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', - 'debug_toolbar.panels.redirects.InterceptRedirectsPanel', -) - +PANELS_DEFAULTS = [ + 'debug_toolbar.panels.versions.VersionsPanel', + 'debug_toolbar.panels.timer.TimerPanel', + 'debug_toolbar.panels.settings.SettingsPanel', + 'debug_toolbar.panels.headers.HeadersPanel', + 'debug_toolbar.panels.request.RequestPanel', + 'debug_toolbar.panels.sql.SQLPanel', + 'debug_toolbar.panels.templates.TemplatesPanel', + 'debug_toolbar.panels.cache.CachePanel', + 'debug_toolbar.panels.signals.SignalsPanel', + 'debug_toolbar.panels.logging.LoggingPanel', + 'debug_toolbar.panels.redirects.RedirectsPanel', + 'debug_toolbar.panels.profiling.ProfilingPanel', +] -PANELS = getattr(settings, 'DEBUG_TOOLBAR_PANELS', PANELS_DEFAULTS) +try: + PANELS = list(settings.DEBUG_TOOLBAR_PANELS) +except AttributeError: + PANELS = PANELS_DEFAULTS +else: + # Backward-compatibility for 1.0, remove in 2.0. + _RENAMED_PANELS = { + 'debug_toolbar.panels.version.VersionDebugPanel': + 'debug_toolbar.panels.versions.VersionsPanel', + 'debug_toolbar.panels.timer.TimerDebugPanel': + 'debug_toolbar.panels.timer.TimerPanel', + 'debug_toolbar.panels.settings_vars.SettingsDebugPanel': + 'debug_toolbar.panels.settings.SettingsPanel', + 'debug_toolbar.panels.headers.HeaderDebugPanel': + 'debug_toolbar.panels.headers.HeadersPanel', + 'debug_toolbar.panels.request_vars.RequestVarsDebugPanel': + 'debug_toolbar.panels.request.RequestPanel', + 'debug_toolbar.panels.sql.SQLDebugPanel': + 'debug_toolbar.panels.sql.SQLPanel', + 'debug_toolbar.panels.template.TemplateDebugPanel': + 'debug_toolbar.panels.templates.TemplatesPanel', + 'debug_toolbar.panels.cache.CacheDebugPanel': + 'debug_toolbar.panels.cache.CachePanel', + 'debug_toolbar.panels.signals.SignalDebugPanel': + 'debug_toolbar.panels.signals.SignalsPanel', + 'debug_toolbar.panels.logger.LoggingDebugPanel': + 'debug_toolbar.panels.logging.LoggingPanel', + 'debug_toolbar.panels.redirects.InterceptRedirectsDebugPanel': + 'debug_toolbar.panels.redirects.RedirectsPanel', + 'debug_toolbar.panels.profiling.ProfilingDebugPanel': + 'debug_toolbar.panels.profiling.ProfilingPanel', + } + for index, old_panel in enumerate(PANELS): + new_panel = _RENAMED_PANELS.get(old_panel) + if new_panel is not None: + warnings.warn( + "%r was renamed to %r. Update your DEBUG_TOOLBAR_PANELS " + "setting." % (old_panel, new_panel), DeprecationWarning) + PANELS[index] = new_panel diff --git a/debug_toolbar/templates/debug_toolbar/panels/logger.html b/debug_toolbar/templates/debug_toolbar/panels/logger.html deleted file mode 100644 index 3908f4f..0000000 --- a/debug_toolbar/templates/debug_toolbar/panels/logger.html +++ /dev/null @@ -1,28 +0,0 @@ -{% load i18n %} -{% if records %} - - - - - - - - - - - - {% for record in records %} - - - - - - - - {% endfor %} - -
{% trans "Level" %}{% trans "Time" %}{% trans "Channel" %}{% trans "Message" %}{% trans "Location" %}
{{ record.level }}{{ record.time|date:"h:i:s m/d/Y" }}{{ record.channel|default:"-" }}{{ record.message|linebreaksbr }}{{ record.file }}:{{ record.line }}
-{% else %} -

{% trans "No messages logged" %}.

-{% endif %} - diff --git a/debug_toolbar/templates/debug_toolbar/panels/logging.html b/debug_toolbar/templates/debug_toolbar/panels/logging.html new file mode 100644 index 0000000..3908f4f --- /dev/null +++ b/debug_toolbar/templates/debug_toolbar/panels/logging.html @@ -0,0 +1,28 @@ +{% load i18n %} +{% if records %} + + + + + + + + + + + + {% for record in records %} + + + + + + + + {% endfor %} + +
{% trans "Level" %}{% trans "Time" %}{% trans "Channel" %}{% trans "Message" %}{% trans "Location" %}
{{ record.level }}{{ record.time|date:"h:i:s m/d/Y" }}{{ record.channel|default:"-" }}{{ record.message|linebreaksbr }}{{ record.file }}:{{ record.line }}
+{% else %} +

{% trans "No messages logged" %}.

+{% endif %} + diff --git a/debug_toolbar/templates/debug_toolbar/panels/request.html b/debug_toolbar/templates/debug_toolbar/panels/request.html new file mode 100644 index 0000000..a8277a4 --- /dev/null +++ b/debug_toolbar/templates/debug_toolbar/panels/request.html @@ -0,0 +1,124 @@ +{% load i18n %} + +

{% trans 'View information' %}

+ + + + + + + + + + + + + + + + + +
{% trans 'View Function' %}{% trans 'Arguments' %}{% trans 'Keyword Arguments' %}{% trans 'URL Name' %}
{{ view_func }}{{ view_args|pprint }}{{ view_kwargs|pprint }}{{ view_urlname }}
+ +{% if cookies %} +

{% trans "COOKIES Variables" %}

+ + + + + + + + + + + + + {% for key, value in cookies %} + + + + + {% endfor %} + +
{% trans "Variable" %}{% trans "Value" %}
{{ key|pprint }}{{ value|pprint }}
+{% else %} +

{% trans "No COOKIE data" %}

+{% endif %} + +{% if session %} +

{% trans "SESSION Variables" %}

+ + + + + + + + + + + + + {% for key, value in session %} + + + + + {% endfor %} + +
{% trans "Variable" %}{% trans "Value" %}
{{ key|pprint }}{{ value|pprint }}
+{% else %} +

{% trans "No SESSION data" %}

+{% endif %} + +{% if get %} +

{% trans "GET Variables" %}

+ + + + + + + + + + + + + {% for key, value in get %} + + + + + {% endfor %} + +
{% trans "Variable" %}{% trans "Value" %}
{{ key|pprint }}{{ value|pprint }}
+{% else %} +

{% trans "No GET data" %}

+{% endif %} + +{% if post %} +

{% trans "POST Variables" %}

+ + + + + + + + + + + {% for key, value in post %} + + + + + {% endfor %} + +
{% trans "Variable" %}{% trans "Value" %}
{{ key|pprint }}{{ value|pprint }}
+{% else %} +

{% trans "No POST data" %}

+{% endif %} diff --git a/debug_toolbar/templates/debug_toolbar/panels/request_vars.html b/debug_toolbar/templates/debug_toolbar/panels/request_vars.html deleted file mode 100644 index a8277a4..0000000 --- a/debug_toolbar/templates/debug_toolbar/panels/request_vars.html +++ /dev/null @@ -1,124 +0,0 @@ -{% load i18n %} - -

{% trans 'View information' %}

- - - - - - - - - - - - - - - - - -
{% trans 'View Function' %}{% trans 'Arguments' %}{% trans 'Keyword Arguments' %}{% trans 'URL Name' %}
{{ view_func }}{{ view_args|pprint }}{{ view_kwargs|pprint }}{{ view_urlname }}
- -{% if cookies %} -

{% trans "COOKIES Variables" %}

- - - - - - - - - - - - - {% for key, value in cookies %} - - - - - {% endfor %} - -
{% trans "Variable" %}{% trans "Value" %}
{{ key|pprint }}{{ value|pprint }}
-{% else %} -

{% trans "No COOKIE data" %}

-{% endif %} - -{% if session %} -

{% trans "SESSION Variables" %}

- - - - - - - - - - - - - {% for key, value in session %} - - - - - {% endfor %} - -
{% trans "Variable" %}{% trans "Value" %}
{{ key|pprint }}{{ value|pprint }}
-{% else %} -

{% trans "No SESSION data" %}

-{% endif %} - -{% if get %} -

{% trans "GET Variables" %}

- - - - - - - - - - - - - {% for key, value in get %} - - - - - {% endfor %} - -
{% trans "Variable" %}{% trans "Value" %}
{{ key|pprint }}{{ value|pprint }}
-{% else %} -

{% trans "No GET data" %}

-{% endif %} - -{% if post %} -

{% trans "POST Variables" %}

- - - - - - - - - - - {% for key, value in post %} - - - - - {% endfor %} - -
{% trans "Variable" %}{% trans "Value" %}
{{ key|pprint }}{{ value|pprint }}
-{% else %} -

{% trans "No POST data" %}

-{% endif %} diff --git a/debug_toolbar/templates/debug_toolbar/panels/settings.html b/debug_toolbar/templates/debug_toolbar/panels/settings.html new file mode 100644 index 0000000..f6b5afe --- /dev/null +++ b/debug_toolbar/templates/debug_toolbar/panels/settings.html @@ -0,0 +1,17 @@ +{% load i18n %} + + + + + + + + + {% for name, value in settings.items %} + + + + + {% endfor %} + +
{% trans "Setting" %}{% trans "Value" %}
{{ name }}{{ value|pprint }}
diff --git a/debug_toolbar/templates/debug_toolbar/panels/settings_vars.html b/debug_toolbar/templates/debug_toolbar/panels/settings_vars.html deleted file mode 100644 index f6b5afe..0000000 --- a/debug_toolbar/templates/debug_toolbar/panels/settings_vars.html +++ /dev/null @@ -1,17 +0,0 @@ -{% load i18n %} - - - - - - - - - {% for name, value in settings.items %} - - - - - {% endfor %} - -
{% trans "Setting" %}{% trans "Value" %}
{{ name }}{{ value|pprint }}
diff --git a/debug_toolbar/templates/debug_toolbar/panels/sql_explain.html b/debug_toolbar/templates/debug_toolbar/panels/sql_explain.html index 0d47ada..6bc2f8d 100644 --- a/debug_toolbar/templates/debug_toolbar/panels/sql_explain.html +++ b/debug_toolbar/templates/debug_toolbar/panels/sql_explain.html @@ -1,9 +1,9 @@ {% load i18n %} -
+
{% trans "Back" %}

{% trans "SQL Explained" %}

-
+
{% trans "Executed SQL" %}
diff --git a/debug_toolbar/templates/debug_toolbar/panels/sql_profile.html b/debug_toolbar/templates/debug_toolbar/panels/sql_profile.html index c0d90b4..e154de5 100644 --- a/debug_toolbar/templates/debug_toolbar/panels/sql_profile.html +++ b/debug_toolbar/templates/debug_toolbar/panels/sql_profile.html @@ -1,9 +1,9 @@ {% load i18n %} -
+
{% trans "Back" %}

{% trans "SQL Profiled" %}

-
+
{% if result %}
diff --git a/debug_toolbar/templates/debug_toolbar/panels/sql_select.html b/debug_toolbar/templates/debug_toolbar/panels/sql_select.html index 7a57c75..6263364 100644 --- a/debug_toolbar/templates/debug_toolbar/panels/sql_select.html +++ b/debug_toolbar/templates/debug_toolbar/panels/sql_select.html @@ -1,9 +1,9 @@ {% load i18n %} -
+
{% trans "Back" %}

{% trans "SQL Selected" %}

-
+
{% trans "Executed SQL" %}
diff --git a/debug_toolbar/templates/debug_toolbar/panels/template_source.html b/debug_toolbar/templates/debug_toolbar/panels/template_source.html index 7dedde3..829842c 100644 --- a/debug_toolbar/templates/debug_toolbar/panels/template_source.html +++ b/debug_toolbar/templates/debug_toolbar/panels/template_source.html @@ -1,9 +1,9 @@ {% load i18n %} -
+
{% trans "Back" %}

{% trans 'Template Source' %}: {{ template_name }}

-
+
{% if not source.pygmentized %} {{ source }} diff --git a/debug_toolbar/toolbar.py b/debug_toolbar/toolbar.py index 3d24891..ca6d1b4 100644 --- a/debug_toolbar/toolbar.py +++ b/debug_toolbar/toolbar.py @@ -2,7 +2,7 @@ The main DebugToolbar class that loads and renders the Toolbar. """ -from __future__ import unicode_literals +from __future__ import absolute_import, unicode_literals import uuid diff --git a/debug_toolbar/utils.py b/debug_toolbar/utils.py index d7197b6..811f1b2 100644 --- a/debug_toolbar/utils.py +++ b/debug_toolbar/utils.py @@ -1,4 +1,4 @@ -from __future__ import unicode_literals +from __future__ import absolute_import, unicode_literals import inspect import os.path diff --git a/debug_toolbar/views.py b/debug_toolbar/views.py index eb67e8b..109c87a 100644 --- a/debug_toolbar/views.py +++ b/debug_toolbar/views.py @@ -1,4 +1,4 @@ -from __future__ import unicode_literals +from __future__ import absolute_import, unicode_literals from django.http import HttpResponse from django.utils.html import escape -- cgit v1.2.3