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 +- docs/configuration.rst | 26 ++-- docs/panels.rst | 26 ++-- example/settings.py | 28 ++-- tests/base.py | 2 +- tests/commands/test_debugsqlshell.py | 2 +- tests/models.py | 2 +- tests/panels/test_cache.py | 4 +- tests/panels/test_logger.py | 50 ------- tests/panels/test_logging.py | 50 +++++++ tests/panels/test_profiling.py | 8 +- tests/panels/test_redirects.py | 4 +- tests/panels/test_request.py | 33 +++++ tests/panels/test_request_vars.py | 33 ----- tests/panels/test_sql.py | 4 +- tests/panels/test_template.py | 12 +- tests/test_integration.py | 20 +-- tests/test_utils.py | 2 +- tests/tests.py | 4 +- tests/urls.py | 2 +- tests/views.py | 2 +- 65 files changed, 923 insertions(+), 873 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 delete mode 100644 tests/panels/test_logger.py create mode 100644 tests/panels/test_logging.py create mode 100644 tests/panels/test_request.py delete mode 100644 tests/panels/test_request_vars.py 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 diff --git a/docs/configuration.rst b/docs/configuration.rst index eefa527..7849d2e 100644 --- a/docs/configuration.rst +++ b/docs/configuration.rst @@ -11,19 +11,19 @@ This setting specifies the full Python path to each panel that you want included in the toolbar. It works like Django's ``MIDDLEWARE_CLASSES`` setting. The default value is:: - 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', - 'debug_toolbar.panels.redirects.InterceptRedirectsPanel', - ) + DEBUG_TOOLBAR_PANELS = [ + '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.template.TemplatesPanel', + 'debug_toolbar.panels.cache.CachePanel', + 'debug_toolbar.panels.signals.SignalsPanel', + 'debug_toolbar.panels.logging.LoggingPanel', + 'debug_toolbar.panels.redirects.RedirectsPanel', + ] This setting allows you to: diff --git a/docs/panels.rst b/docs/panels.rst index 5ea4e44..39ddf7f 100644 --- a/docs/panels.rst +++ b/docs/panels.rst @@ -12,28 +12,28 @@ The following panels are enabled by default. Version ~~~~~~~ -Path: ``debug_toolbar.panels.version.VersionDebugPanel`` +Path: ``debug_toolbar.panels.versions.VersionsPanel`` -Django version. +Shows versions of Python, Django, and installed apps if possible. Timer ~~~~~ -Path: ``debug_toolbar.panels.timer.TimerDebugPanel`` +Path: ``debug_toolbar.panels.timer.TimerPanel`` Request timer. Settings ~~~~~~~~ -Path: ``debug_toolbar.panels.settings_vars.SettingsVarsDebugPanel`` +Path: ``debug_toolbar.panels.settings.SettingsPanel`` A list of settings in settings.py. Headers ~~~~~~~ -Path: ``debug_toolbar.panels.headers.HeaderDebugPanel`` +Path: ``debug_toolbar.panels.headers.HeadersPanel`` This panels shows the HTTP request and response headers, as well as a selection of values from the WSGI environment. @@ -45,49 +45,49 @@ itself may also add response headers such as ``Date`` and ``Server``. Request ~~~~~~~ -Path: ``debug_toolbar.panels.request_vars.RequestVarsDebugPanel`` +Path: ``debug_toolbar.panels.request.RequestPanel`` GET/POST/cookie/session variable display. SQL ~~~ -Path: ``debug_toolbar.panels.sql.SQLDebugPanel`` +Path: ``debug_toolbar.panels.sql.SQLPanel`` SQL queries including time to execute and links to EXPLAIN each query. Template ~~~~~~~~ -Path: ``debug_toolbar.panels.template.TemplateDebugPanel`` +Path: ``debug_toolbar.panels.templates.TemplatesPanel`` Templates and context used, and their template paths. Cache ~~~~~ -Path: ``debug_toolbar.panels.cache.CacheDebugPanel`` +Path: ``debug_toolbar.panels.cache.CachePanel`` Cache queries. Signal ~~~~~~ -Path: ``debug_toolbar.panels.signals.SignalDebugPanel`` +Path: ``debug_toolbar.panels.signals.SignalsPanel`` List of signals, their args and receivers. Logging ~~~~~~~ -Path: ``debug_toolbar.panels.logger.LoggingPanel`` +Path: ``debug_toolbar.panels.logging.LoggingPanel`` Logging output via Python's built-in :mod:`logging`, or via the `logbook `_ module. Redirects ~~~~~~~~~ -Path: ``debug_toolbar.panels.redirects.InterceptRedirectsPanel`` +Path: ``debug_toolbar.panels.redirects.RedirectsPanel`` When this panel is enabled, the debug toolbar will show an intermediate page upon redirect so you can view any debug information prior to redirecting. This @@ -108,7 +108,7 @@ The following panels are disabled by default. You must add them to the Profiling ~~~~~~~~~ -Path: ``debug_toolbar.panels.profiling.ProfilingDebugPanel`` +Path: ``debug_toolbar.panels.profiling.ProfilingPanel`` Profiling information for the view function. diff --git a/example/settings.py b/example/settings.py index a4e9e67..4c29ba9 100644 --- a/example/settings.py +++ b/example/settings.py @@ -76,17 +76,17 @@ if os.environ.get('DJANGO_DATABASE_ENGINE', '').lower() == 'mysql': # django-debug-toolbar -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.profiling.ProfilingDebugPanel', - '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', -) +DEBUG_TOOLBAR_PANELS = [ + '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', +] diff --git a/tests/base.py b/tests/base.py index a1a59cc..78f3d6f 100644 --- a/tests/base.py +++ b/tests/base.py @@ -1,4 +1,4 @@ -from __future__ import unicode_literals +from __future__ import absolute_import, unicode_literals import threading diff --git a/tests/commands/test_debugsqlshell.py b/tests/commands/test_debugsqlshell.py index f35ef07..f0c88fa 100644 --- a/tests/commands/test_debugsqlshell.py +++ b/tests/commands/test_debugsqlshell.py @@ -1,4 +1,4 @@ -from __future__ import unicode_literals +from __future__ import absolute_import, unicode_literals import sys diff --git a/tests/models.py b/tests/models.py index 24358c0..78c1eb8 100644 --- a/tests/models.py +++ b/tests/models.py @@ -1,6 +1,6 @@ # coding: utf-8 -from __future__ import unicode_literals +from __future__ import absolute_import, unicode_literals from django.utils import six diff --git a/tests/panels/test_cache.py b/tests/panels/test_cache.py index 42a6814..73b7e7c 100644 --- a/tests/panels/test_cache.py +++ b/tests/panels/test_cache.py @@ -1,6 +1,6 @@ # coding: utf-8 -from __future__ import unicode_literals +from __future__ import absolute_import, unicode_literals from django.core import cache @@ -11,7 +11,7 @@ class CachePanelTestCase(BaseTestCase): def setUp(self): super(CachePanelTestCase, self).setUp() - self.panel = self.toolbar.get_panel_by_id('CacheDebugPanel') + self.panel = self.toolbar.get_panel_by_id('CachePanel') self.panel.enable_instrumentation() def tearDown(self): diff --git a/tests/panels/test_logger.py b/tests/panels/test_logger.py deleted file mode 100644 index f5fe375..0000000 --- a/tests/panels/test_logger.py +++ /dev/null @@ -1,50 +0,0 @@ -from __future__ import unicode_literals - -import logging - -from debug_toolbar.panels.logger import MESSAGE_IF_STRING_REPRESENTATION_INVALID - -from ..base import BaseTestCase - - -class LoggingPanelTestCase(BaseTestCase): - - def setUp(self): - super(LoggingPanelTestCase, self).setUp() - self.panel = self.toolbar.get_panel_by_id('LoggingPanel') - self.logger = logging.getLogger(__name__) - - def test_happy_case(self): - self.logger.info('Nothing to see here, move along!') - - self.panel.process_response(self.request, self.response) - records = self.panel.get_stats()['records'] - - self.assertEqual(1, len(records)) - self.assertEqual('Nothing to see here, move along!', - records[0]['message']) - - def test_formatting(self): - self.logger.info('There are %d %s', 5, 'apples') - - self.panel.process_response(self.request, self.response) - records = self.panel.get_stats()['records'] - - self.assertEqual(1, len(records)) - self.assertEqual('There are 5 apples', - records[0]['message']) - - def test_failing_formatting(self): - class BadClass(object): - def __str__(self): - raise Exception('Please not stringify me!') - - # should not raise exception, but fail silently - self.logger.debug('This class is misbehaving: %s', BadClass()) - - self.panel.process_response(self.request, self.response) - records = self.panel.get_stats()['records'] - - self.assertEqual(1, len(records)) - self.assertEqual(MESSAGE_IF_STRING_REPRESENTATION_INVALID, - records[0]['message']) diff --git a/tests/panels/test_logging.py b/tests/panels/test_logging.py new file mode 100644 index 0000000..342e673 --- /dev/null +++ b/tests/panels/test_logging.py @@ -0,0 +1,50 @@ +from __future__ import absolute_import, unicode_literals + +import logging + +from debug_toolbar.panels.logging import MESSAGE_IF_STRING_REPRESENTATION_INVALID + +from ..base import BaseTestCase + + +class LoggingPanelTestCase(BaseTestCase): + + def setUp(self): + super(LoggingPanelTestCase, self).setUp() + self.panel = self.toolbar.get_panel_by_id('LoggingPanel') + self.logger = logging.getLogger(__name__) + + def test_happy_case(self): + self.logger.info('Nothing to see here, move along!') + + self.panel.process_response(self.request, self.response) + records = self.panel.get_stats()['records'] + + self.assertEqual(1, len(records)) + self.assertEqual('Nothing to see here, move along!', + records[0]['message']) + + def test_formatting(self): + self.logger.info('There are %d %s', 5, 'apples') + + self.panel.process_response(self.request, self.response) + records = self.panel.get_stats()['records'] + + self.assertEqual(1, len(records)) + self.assertEqual('There are 5 apples', + records[0]['message']) + + def test_failing_formatting(self): + class BadClass(object): + def __str__(self): + raise Exception('Please not stringify me!') + + # should not raise exception, but fail silently + self.logger.debug('This class is misbehaving: %s', BadClass()) + + self.panel.process_response(self.request, self.response) + records = self.panel.get_stats()['records'] + + self.assertEqual(1, len(records)) + self.assertEqual(MESSAGE_IF_STRING_REPRESENTATION_INVALID, + records[0]['message']) diff --git a/tests/panels/test_profiling.py b/tests/panels/test_profiling.py index f6bb7d3..7ca7e7b 100644 --- a/tests/panels/test_profiling.py +++ b/tests/panels/test_profiling.py @@ -1,4 +1,4 @@ -from __future__ import unicode_literals +from __future__ import absolute_import, unicode_literals from django.contrib.auth.models import User from django.db import IntegrityError, transaction @@ -17,12 +17,12 @@ from ..base import BaseTestCase from ..views import regular_view -@override_settings(DEBUG_TOOLBAR_PANELS=['debug_toolbar.panels.profiling.ProfilingDebugPanel']) +@override_settings(DEBUG_TOOLBAR_PANELS=['debug_toolbar.panels.profiling.ProfilingPanel']) class ProfilingPanelTestCase(BaseTestCase): def setUp(self): super(ProfilingPanelTestCase, self).setUp() - self.panel = self.toolbar.get_panel_by_id('ProfilingDebugPanel') + self.panel = self.toolbar.get_panel_by_id('ProfilingPanel') def _test_render_with_or_without_line_profiler(self): self.panel.process_view(self.request, regular_view, ('profiling',), {}) @@ -44,7 +44,7 @@ class ProfilingPanelTestCase(BaseTestCase): @override_settings(DEBUG=True, - DEBUG_TOOLBAR_PANELS=['debug_toolbar.panels.profiling.ProfilingDebugPanel']) + DEBUG_TOOLBAR_PANELS=['debug_toolbar.panels.profiling.ProfilingPanel']) class ProfilingPanelIntegrationTestCase(TestCase): def test_view_executed_once(self): diff --git a/tests/panels/test_redirects.py b/tests/panels/test_redirects.py index 400cdcc..7e94e77 100644 --- a/tests/panels/test_redirects.py +++ b/tests/panels/test_redirects.py @@ -1,4 +1,4 @@ -from __future__ import unicode_literals +from __future__ import absolute_import, unicode_literals import django from django.http import HttpResponse @@ -13,7 +13,7 @@ class RedirectsPanelTestCase(BaseTestCase): def setUp(self): super(RedirectsPanelTestCase, self).setUp() - self.panel = self.toolbar.get_panel_by_id('InterceptRedirectsPanel') + self.panel = self.toolbar.get_panel_by_id('RedirectsPanel') def test_regular_response(self): response = self.panel.process_response(self.request, self.response) diff --git a/tests/panels/test_request.py b/tests/panels/test_request.py new file mode 100644 index 0000000..16843c4 --- /dev/null +++ b/tests/panels/test_request.py @@ -0,0 +1,33 @@ +# coding: utf-8 + +from __future__ import absolute_import, unicode_literals + +from django.utils import six + +from ..base import BaseTestCase + + +class RequestPanelTestCase(BaseTestCase): + + def setUp(self): + super(RequestPanelTestCase, self).setUp() + self.panel = self.toolbar.get_panel_by_id('RequestPanel') + + def test_non_ascii_session(self): + self.request.session = {'où': 'où'} + if not six.PY3: + self.request.session['là'.encode('utf-8')] = 'là'.encode('utf-8') + self.panel.process_request(self.request) + self.panel.process_response(self.request, self.response) + content = self.panel.content() + if six.PY3: + self.assertIn('où', content) + else: + self.assertIn('o\\xf9', content) + self.assertIn('l\\xc3\\xa0', content) + + def test_object_with_non_ascii_repr_in_request_params(self): + self.request.path = '/non_ascii_request/' + self.panel.process_request(self.request) + self.panel.process_response(self.request, self.response) + self.assertIn('nôt åscíì', self.panel.content()) diff --git a/tests/panels/test_request_vars.py b/tests/panels/test_request_vars.py deleted file mode 100644 index a86956f..0000000 --- a/tests/panels/test_request_vars.py +++ /dev/null @@ -1,33 +0,0 @@ -# coding: utf-8 - -from __future__ import unicode_literals - -from django.utils import six - -from ..base import BaseTestCase - - -class RequestVarsDebugPanelTestCase(BaseTestCase): - - def setUp(self): - super(RequestVarsDebugPanelTestCase, self).setUp() - self.panel = self.toolbar.get_panel_by_id('RequestVarsDebugPanel') - - def test_non_ascii_session(self): - self.request.session = {'où': 'où'} - if not six.PY3: - self.request.session['là'.encode('utf-8')] = 'là'.encode('utf-8') - self.panel.process_request(self.request) - self.panel.process_response(self.request, self.response) - content = self.panel.content() - if six.PY3: - self.assertIn('où', content) - else: - self.assertIn('o\\xf9', content) - self.assertIn('l\\xc3\\xa0', content) - - def test_object_with_non_ascii_repr_in_request_vars(self): - self.request.path = '/non_ascii_request/' - self.panel.process_request(self.request) - self.panel.process_response(self.request, self.response) - self.assertIn('nôt åscíì', self.panel.content()) diff --git a/tests/panels/test_sql.py b/tests/panels/test_sql.py index 4a18a16..a6990a3 100644 --- a/tests/panels/test_sql.py +++ b/tests/panels/test_sql.py @@ -1,6 +1,6 @@ # coding: utf-8 -from __future__ import unicode_literals +from __future__ import absolute_import, unicode_literals from django.contrib.auth.models import User from django.db import connection @@ -14,7 +14,7 @@ class SQLPanelTestCase(BaseTestCase): def setUp(self): super(SQLPanelTestCase, self).setUp() - self.panel = self.toolbar.get_panel_by_id('SQLDebugPanel') + self.panel = self.toolbar.get_panel_by_id('SQLPanel') self.panel.enable_instrumentation() def tearDown(self): diff --git a/tests/panels/test_template.py b/tests/panels/test_template.py index 1c43982..8cb29f2 100644 --- a/tests/panels/test_template.py +++ b/tests/panels/test_template.py @@ -1,6 +1,6 @@ # coding: utf-8 -from __future__ import unicode_literals +from __future__ import absolute_import, unicode_literals import django from django.contrib.auth.models import User @@ -10,17 +10,17 @@ from ..base import BaseTestCase from ..models import NonAsciiRepr -class TemplateDebugPanelTestCase(BaseTestCase): +class TemplatesPanelTestCase(BaseTestCase): def setUp(self): - super(TemplateDebugPanelTestCase, self).setUp() - self.panel = self.toolbar.get_panel_by_id('TemplateDebugPanel') - self.sql_panel = self.toolbar.get_panel_by_id('SQLDebugPanel') + super(TemplatesPanelTestCase, self).setUp() + self.panel = self.toolbar.get_panel_by_id('TemplatesPanel') + self.sql_panel = self.toolbar.get_panel_by_id('SQLPanel') self.sql_panel.enable_instrumentation() def tearDown(self): self.sql_panel.disable_instrumentation() - super(TemplateDebugPanelTestCase, self).tearDown() + super(TemplatesPanelTestCase, self).tearDown() def test_queryset_hook(self): t = Template("No context variables here!") diff --git a/tests/test_integration.py b/tests/test_integration.py index b903cb8..e92cab6 100644 --- a/tests/test_integration.py +++ b/tests/test_integration.py @@ -1,6 +1,6 @@ # coding: utf-8 -from __future__ import unicode_literals +from __future__ import absolute_import, unicode_literals import os from xml.etree import ElementTree as ET @@ -40,12 +40,12 @@ class DebugToolbarTestCase(BaseTestCase): self.assertFalse(show_toolbar(self.request)) def _resolve_stats(self, path): - # takes stats from RequestVars panel + # takes stats from Request panel self.request.path = path - panel = self.toolbar.get_panel_by_id('RequestVarsDebugPanel') + panel = self.toolbar.get_panel_by_id('RequestPanel') panel.process_request(self.request) panel.process_response(self.request, self.response) - return self.toolbar.stats['requestvars'] + return self.toolbar.stats['request'] def test_url_resolving_positional(self): stats = self._resolve_stats('/resolving1/a/b/') @@ -120,14 +120,14 @@ class DebugToolbarLiveTestCase(LiveServerTestCase): def test_basic(self): self.selenium.get(self.live_server_url + '/regular/basic/') - version_panel = self.selenium.find_element_by_id('VersionDebugPanel') + version_panel = self.selenium.find_element_by_id('VersionsPanel') - # Version panel isn't loaded + # Versions panel isn't loaded with self.assertRaises(NoSuchElementException): version_panel.find_element_by_tag_name('table') - # Click to show the version panel - self.selenium.find_element_by_class_name('VersionDebugPanel').click() + # Click to show the versions panel + self.selenium.find_element_by_class_name('VersionsPanel').click() # Version panel loads table = WebDriverWait(self.selenium, timeout=10).until( @@ -138,10 +138,10 @@ class DebugToolbarLiveTestCase(LiveServerTestCase): @override_settings(DEBUG_TOOLBAR_CONFIG={'RESULTS_CACHE_SIZE': 0}) def test_expired_storage(self): self.selenium.get(self.live_server_url + '/regular/basic/') - version_panel = self.selenium.find_element_by_id('VersionDebugPanel') + version_panel = self.selenium.find_element_by_id('VersionsPanel') # Click to show the version panel - self.selenium.find_element_by_class_name('VersionDebugPanel').click() + self.selenium.find_element_by_class_name('VersionsPanel').click() # Version panel doesn't loads error = WebDriverWait(self.selenium, timeout=10).until( diff --git a/tests/test_utils.py b/tests/test_utils.py index a930894..40e99be 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -1,4 +1,4 @@ -from __future__ import unicode_literals +from __future__ import absolute_import, unicode_literals from django.utils.unittest import TestCase diff --git a/tests/tests.py b/tests/tests.py index b08ac1c..1818fe7 100644 --- a/tests/tests.py +++ b/tests/tests.py @@ -3,10 +3,10 @@ import django if django.VERSION[:2] < (1, 6): # unittest-style discovery isn't available from .commands.test_debugsqlshell import * # noqa from .panels.test_cache import * # noqa - from .panels.test_logger import * # noqa + from .panels.test_logging import * # noqa from .panels.test_profiling import * # noqa from .panels.test_redirects import * # noqa - from .panels.test_request_vars import * # noqa + from .panels.test_request import * # noqa from .panels.test_sql import * # noqa from .panels.test_template import * # noqa from .test_integration import * # noqa diff --git a/tests/urls.py b/tests/urls.py index f297834..0a7ac19 100644 --- a/tests/urls.py +++ b/tests/urls.py @@ -1,6 +1,6 @@ # coding: utf-8 -from __future__ import unicode_literals +from __future__ import absolute_import, unicode_literals from django.conf.urls import include, patterns, url from django.contrib import admin diff --git a/tests/views.py b/tests/views.py index d7ff167..73e0087 100644 --- a/tests/views.py +++ b/tests/views.py @@ -1,6 +1,6 @@ # coding: utf-8 -from __future__ import unicode_literals +from __future__ import absolute_import, unicode_literals from django.contrib.auth.models import User from django.http import HttpResponse -- cgit v1.2.3