aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJannis Leidel2012-04-07 03:10:10 +0200
committerJannis Leidel2012-04-07 03:10:10 +0200
commit963ec339d932d3888f79dea12d3d3a89cbd1f141 (patch)
treed57c43f9625cbed2edeb7f583c06aabddb9a463b
parent12fdf7ea605d3716d6c9127e22a63bcc345d55be (diff)
downloaddjango-debug-toolbar-963ec339d932d3888f79dea12d3d3a89cbd1f141.tar.bz2
Added resolved URL name to the Request var panel. Closes #214.
-rw-r--r--debug_toolbar/panels/request_vars.py47
-rw-r--r--debug_toolbar/templates/debug_toolbar/panels/request_vars.html2
-rw-r--r--tests/tests.py56
-rw-r--r--tests/urls.py3
-rw-r--r--tests/views.py7
5 files changed, 67 insertions, 48 deletions
diff --git a/debug_toolbar/panels/request_vars.py b/debug_toolbar/panels/request_vars.py
index 4f85052..ade23f3 100644
--- a/debug_toolbar/panels/request_vars.py
+++ b/debug_toolbar/panels/request_vars.py
@@ -1,3 +1,5 @@
+from django.core.urlresolvers import resolve
+from django.http import Http404
from django.utils.translation import ugettext_lazy as _
from debug_toolbar.panels import DebugPanel
@@ -12,12 +14,6 @@ class RequestVarsDebugPanel(DebugPanel):
template = 'debug_toolbar/panels/request_vars.html'
has_content = True
- def __init__(self, *args, **kwargs):
- DebugPanel.__init__(self, *args, **kwargs)
- self.view_func = None
- self.view_args = None
- self.view_kwargs = None
-
def nav_title(self):
return _('Request Vars')
@@ -30,31 +26,32 @@ class RequestVarsDebugPanel(DebugPanel):
def process_request(self, request):
self.request = request
- def process_view(self, request, view_func, view_args, view_kwargs):
- self.view_func = view_func
- self.view_args = view_args
- self.view_kwargs = view_kwargs
-
def process_response(self, request, response):
self.record_stats({
'get': [(k, self.request.GET.getlist(k)) for k in self.request.GET],
'post': [(k, self.request.POST.getlist(k)) for k in self.request.POST],
'cookies': [(k, self.request.COOKIES.get(k)) for k in self.request.COOKIES],
})
-
- if hasattr(self, 'view_func'):
- if self.view_func is not None:
- name = get_name_from_obj(self.view_func)
- else:
- name = '<no view>'
-
- self.record_stats({
- 'view_func': name,
- 'view_args': self.view_args,
- 'view_kwargs': self.view_kwargs
- })
+ view_info = {
+ 'view_func': _('<no view>'),
+ 'view_args': 'None',
+ 'view_kwargs': 'None',
+ 'view_urlname': 'None',
+ }
+ try:
+ match = resolve(self.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',
+ _('<unavailable>'))
+ except Http404:
+ pass
+ self.record_stats(view_info)
if hasattr(self.request, 'session'):
self.record_stats({
- 'session': [(k, self.request.session.get(k)) for k in self.request.session.iterkeys()]
- })
+ 'session': [(k, self.request.session.get(k))
+ for k in self.request.session.iterkeys()]
+ })
diff --git a/debug_toolbar/templates/debug_toolbar/panels/request_vars.html b/debug_toolbar/templates/debug_toolbar/panels/request_vars.html
index 07c223a..057f4de 100644
--- a/debug_toolbar/templates/debug_toolbar/panels/request_vars.html
+++ b/debug_toolbar/templates/debug_toolbar/panels/request_vars.html
@@ -5,6 +5,7 @@
<thead>
<tr>
<th>{% trans 'View Function' %}</th>
+ <th>{% trans 'URL Name' %}</th>
<th>{% trans 'args' %}</th>
<th>{% trans 'kwargs' %}</th>
</tr>
@@ -12,6 +13,7 @@
<tbody>
<tr>
<td>{{ view_func }}</td>
+ <td>{{ view_urlname }}</td>
<td>{{ view_args|default:"None" }}</td>
<td>
{% if view_kwargs.items %}
diff --git a/tests/tests.py b/tests/tests.py
index fcebb50..7d6436e 100644
--- a/tests/tests.py
+++ b/tests/tests.py
@@ -11,6 +11,7 @@ from django.contrib.auth.models import User
from django.http import HttpResponse
from django.test import TestCase
from django.template import Template, Context
+from django import VERSION
from dingus import Dingus
import thread
@@ -158,31 +159,42 @@ class DebugToolbarTestCase(BaseTestCase):
middleware.process_request(request)
self.assertFalse(isinstance(request.urlconf, basestring))
- def test_with_process_view(self):
- request = self.request
- response = self.response
-
- def _test_view(request):
- return HttpResponse('')
-
+ def _resolve_stats(self, path):
+ # takes stats from RequestVars panel
+ self.request.path = path
with Settings(DEBUG=True):
panel = self.toolbar.get_panel(RequestVarsDebugPanel)
- panel.process_request(request)
- panel.process_view(request, _test_view, [], {})
- panel.process_response(request, response)
- content = panel.content()
- self.assertTrue('tests.tests._test_view' in content, content)
+ panel.process_request(self.request)
+ panel.process_response(self.request, self.response)
+ return self.toolbar.stats['requestvars']
+
+ def test_url_resolving_positional(self):
+ stats = self._resolve_stats('/resolving1/a/b/')
+ if tuple(VERSION[:2]) >= (1, 3):
+ self.assertEquals(stats['view_urlname'], 'positional-resolving') # Django >= 1.3
+ else:
+ self.assertEquals(stats['view_urlname'], '<unavailable>') # Django < 1.3
+ self.assertEquals(stats['view_func'], 'tests.views.resolving_view')
+ self.assertEquals(stats['view_args'], ('a', 'b'))
+ self.assertEquals(stats['view_kwargs'], {})
+
+ def test_url_resolving_named(self):
+ stats = self._resolve_stats('/resolving2/a/b/')
+ self.assertEquals(stats['view_args'], ())
+ self.assertEquals(stats['view_kwargs'], {'arg1': 'a', 'arg2': 'b'})
+
+ def test_url_resolving_mixed(self):
+ stats = self._resolve_stats('/resolving3/a/')
+ self.assertEquals(stats['view_args'], ('a',))
+ self.assertEquals(stats['view_kwargs'], {'arg2': 'default'})
+
+ def test_url_resolving_bad(self):
+ stats = self._resolve_stats('/non-existing-url/')
+ self.assertEquals(stats['view_urlname'], 'None')
+ self.assertEquals(stats['view_args'], 'None')
+ self.assertEquals(stats['view_kwargs'], 'None')
+ self.assertEquals(stats['view_func'], '<no view>')
- def test_without_process_view(self):
- request = self.request
- response = self.response
-
- with Settings(DEBUG=True):
- panel = self.toolbar.get_panel(RequestVarsDebugPanel)
- panel.process_request(request)
- panel.process_response(request, response)
- content = panel.content()
- self.assertTrue('&lt;no view&gt;' in content, content)
class DebugToolbarNameFromObjectTest(BaseTestCase):
def test_func(self):
diff --git a/tests/urls.py b/tests/urls.py
index 359fd8f..a556703 100644
--- a/tests/urls.py
+++ b/tests/urls.py
@@ -11,5 +11,8 @@ admin.autodiscover()
urlpatterns = patterns('',
# This pattern should be last to ensure tests still work
+ url(r'^resolving1/(.+)/(.+)/$', 'tests.views.resolving_view', name = 'positional-resolving'),
+ url(r'^resolving2/(?P<arg1>.+)/(?P<arg2>.+)/$', 'tests.views.resolving_view'),
+ url(r'^resolving3/(.+)/$', 'tests.views.resolving_view', { 'arg2' : 'default' }),
url(r'^execute_sql/$', 'tests.views.execute_sql'),
)
diff --git a/tests/views.py b/tests/views.py
index f989dcd..909a784 100644
--- a/tests/views.py
+++ b/tests/views.py
@@ -4,4 +4,9 @@ from django.http import HttpResponse
def execute_sql(request):
list(User.objects.all())
- return HttpResponse() \ No newline at end of file
+ return HttpResponse()
+
+def resolving_view(request, arg1, arg2):
+ # see test_url_resolving in tests.py
+ return HttpResponse()
+