aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAymeric Augustin2013-11-12 22:40:20 +0100
committerAymeric Augustin2013-11-12 22:40:20 +0100
commit1062d9cf878b4bdc6f0e0f6434668cd7eb289998 (patch)
treee3e400deec4a8c772fbc025e9144b0a380715b43
parentf48039e3bad9e24a59a25ed5636b428e11784da9 (diff)
downloaddjango-debug-toolbar-1062d9cf878b4bdc6f0e0f6434668cd7eb289998.tar.bz2
Make it possible for panels to provide URLs and views.
Fix #448.
-rw-r--r--debug_toolbar/__init__.py8
-rw-r--r--debug_toolbar/models.py3
-rw-r--r--debug_toolbar/panels/__init__.py6
-rw-r--r--debug_toolbar/panels/sql.py9
-rw-r--r--debug_toolbar/panels/template.py7
-rw-r--r--debug_toolbar/toolbar.py17
-rw-r--r--debug_toolbar/urls.py18
-rw-r--r--docs/installation.rst9
-rw-r--r--tests/__init__.py1
-rw-r--r--tests/urls.py4
10 files changed, 57 insertions, 25 deletions
diff --git a/debug_toolbar/__init__.py b/debug_toolbar/__init__.py
index 3a8f300..61c4e7a 100644
--- a/debug_toolbar/__init__.py
+++ b/debug_toolbar/__init__.py
@@ -1,9 +1,17 @@
from __future__ import unicode_literals
+
__all__ = ('VERSION',)
+
try:
VERSION = __import__('pkg_resources') \
.get_distribution('django-debug-toolbar').version
except Exception as e:
VERSION = 'unknown'
+
+
+from .toolbar import DebugToolbar
+
+
+urls = DebugToolbar.get_urls(), 'djdt', 'djdt'
diff --git a/debug_toolbar/models.py b/debug_toolbar/models.py
index a204b13..ef1d012 100644
--- a/debug_toolbar/models.py
+++ b/debug_toolbar/models.py
@@ -5,6 +5,7 @@ from django.conf.urls import include, patterns, url
from django.core.urlresolvers import reverse, NoReverseMatch
from django.utils.importlib import import_module
+import debug_toolbar
from debug_toolbar.middleware import DebugToolbarMiddleware
@@ -50,7 +51,7 @@ def patch_root_urlconf():
except NoReverseMatch:
urlconf_module = import_module(settings.ROOT_URLCONF)
urlconf_module.urlpatterns += patterns('', # noqa
- url(r'^__debug__/', include('debug_toolbar.urls', namespace='djdt', app_name='djdt')),
+ url(r'^__debug__/', include(debug_toolbar.urls)),
)
diff --git a/debug_toolbar/panels/__init__.py b/debug_toolbar/panels/__init__.py
index e60a5e6..47ca996 100644
--- a/debug_toolbar/panels/__init__.py
+++ b/debug_toolbar/panels/__init__.py
@@ -37,6 +37,12 @@ class DebugPanel(object):
def dom_id(self):
return 'djDebug%sPanel' % (self.name.replace(' ', ''))
+ # URLs for panel-specific views
+
+ @classmethod
+ def get_urls(cls):
+ return []
+
# Titles and subtitles
def nav_title(self):
diff --git a/debug_toolbar/panels/sql.py b/debug_toolbar/panels/sql.py
index 1ccdc47..8042269 100644
--- a/debug_toolbar/panels/sql.py
+++ b/debug_toolbar/panels/sql.py
@@ -3,6 +3,7 @@ from __future__ import unicode_literals
import uuid
from copy import copy
+from django.conf.urls import patterns, url
from django.db import connections
from django.utils.translation import ugettext_lazy as _, ungettext_lazy as __
@@ -103,6 +104,14 @@ class SQLDebugPanel(DebugPanel):
self._sql_time += kwargs['duration']
self._num_queries += 1
+ @classmethod
+ def get_urls(cls):
+ return patterns('debug_toolbar.views', # noqa
+ url(r'^sql_select/$', 'sql_select', name='sql_select'),
+ url(r'^sql_explain/$', 'sql_explain', name='sql_explain'),
+ url(r'^sql_profile/$', 'sql_profile', name='sql_profile'),
+ )
+
def nav_title(self):
return _('SQL')
diff --git a/debug_toolbar/panels/template.py b/debug_toolbar/panels/template.py
index d918cd7..562e87f 100644
--- a/debug_toolbar/panels/template.py
+++ b/debug_toolbar/panels/template.py
@@ -6,6 +6,7 @@ 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
@@ -113,6 +114,12 @@ class TemplateDebugPanel(DebugPanel):
kwargs['context'] = [force_text(item) for item in context_list]
self.templates.append(kwargs)
+ @classmethod
+ def get_urls(cls):
+ return patterns('debug_toolbar.views', # noqa
+ url(r'^template_source/$', 'template_source', name='template_source'),
+ )
+
def nav_title(self):
return _('Templates')
diff --git a/debug_toolbar/toolbar.py b/debug_toolbar/toolbar.py
index 32dc1b7..bf632cd 100644
--- a/debug_toolbar/toolbar.py
+++ b/debug_toolbar/toolbar.py
@@ -5,6 +5,7 @@ The main DebugToolbar class that loads and renders the Toolbar.
from __future__ import unicode_literals
from django.conf import settings
+from django.conf.urls import patterns, url
from django.core.exceptions import ImproperlyConfigured
from django.template.loader import render_to_string
from django.utils.datastructures import SortedDict
@@ -107,3 +108,19 @@ class DebugToolbar(object):
panel_classes.append(panel_class)
cls._panel_classes = panel_classes
return cls._panel_classes
+
+ _urlpatterns = None
+
+ @classmethod
+ def get_urls(cls):
+ if cls._urlpatterns is None:
+ # Load URLs in a temporary variable for thread safety.
+ # Global URLs
+ urlpatterns = patterns('debug_toolbar.views', # noqa
+ url(r'^render_panel/$', 'render_panel', name='render_panel'),
+ )
+ # Per-panel URLs
+ for panel_class in cls.get_panel_classes():
+ urlpatterns += panel_class.get_urls()
+ cls._urlpatterns = urlpatterns
+ return cls._urlpatterns
diff --git a/debug_toolbar/urls.py b/debug_toolbar/urls.py
deleted file mode 100644
index 860187a..0000000
--- a/debug_toolbar/urls.py
+++ /dev/null
@@ -1,18 +0,0 @@
-"""
-URLpatterns for the debug toolbar.
-
-The debug toolbar middleware will monkey-patch them into the default urlconf
-if they aren't explicitly included.
-"""
-
-from __future__ import unicode_literals
-
-from django.conf.urls import patterns, url
-
-urlpatterns = patterns('debug_toolbar.views', # noqa
- url(r'^render_panel/$', 'render_panel', name='render_panel'),
- url(r'^sql_select/$', 'sql_select', name='sql_select'),
- url(r'^sql_explain/$', 'sql_explain', name='sql_explain'),
- url(r'^sql_profile/$', 'sql_profile', name='sql_profile'),
- url(r'^template_source/$', 'template_source', name='template_source'),
-)
diff --git a/docs/installation.rst b/docs/installation.rst
index 514548a..3d71e12 100644
--- a/docs/installation.rst
+++ b/docs/installation.rst
@@ -57,15 +57,14 @@ Add the Debug Toolbar's URLs to your project's URLconf as follows::
from django.conf.urls import include, patterns, url
if settings.DEBUG:
+ import debug_toolbar
urlpatterns += patterns('',
- url(r'^__debug__/', include('debug_toolbar.urls', namespace='djdt', app_name='djdt')),
+ url(r'^__debug__/', include(debug_toolbar.urls)),
)
This example uses the ``__debug__`` prefix, but you can use any prefix that
-doesn't clash with your application's URLs.
-
-It is mandatory to use the ``djdt`` namespace as shown above. This avoids
-conflicts when reversing URLs by name.
+doesn't clash with your application's URLs. Note the lack of quotes around
+``debug_toolbar.urls``.
If the URLs aren't included in your root URLconf, the Debug Toolbar
automatically appends them.
diff --git a/tests/__init__.py b/tests/__init__.py
index b3b9440..3bf8994 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -20,3 +20,4 @@ def update_toolbar_panels(**kwargs):
if kwargs['setting'] == 'DEBUG_TOOLBAR_PANELS':
dt_settings.PANELS = kwargs['value'] or dt_settings.PANELS_DEFAULTS
DebugToolbar._panel_classes = None
+ # Not implemented: invalidate debug_toolbar.urls
diff --git a/tests/urls.py b/tests/urls.py
index d4417a1..f297834 100644
--- a/tests/urls.py
+++ b/tests/urls.py
@@ -5,6 +5,8 @@ from __future__ import unicode_literals
from django.conf.urls import include, patterns, url
from django.contrib import admin
+import debug_toolbar
+
from .models import NonAsciiRepr
@@ -18,5 +20,5 @@ urlpatterns = patterns('tests.views', # noqa
url(r'^non_ascii_request/$', 'regular_view', {'title': NonAsciiRepr()}),
url(r'^new_user/$', 'new_user'),
url(r'^execute_sql/$', 'execute_sql'),
- url(r'^__debug__/', include('debug_toolbar.urls', namespace='djdt', app_name='djdt')),
+ url(r'^__debug__/', include(debug_toolbar.urls)),
)