Skip to content

Commit 963ec33

Browse files
committed
Added resolved URL name to the Request var panel. Closes #214.
1 parent 12fdf7e commit 963ec33

File tree

5 files changed

+67
-48
lines changed

5 files changed

+67
-48
lines changed

debug_toolbar/panels/request_vars.py

Lines changed: 22 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from django.core.urlresolvers import resolve
2+
from django.http import Http404
13
from django.utils.translation import ugettext_lazy as _
24

35
from debug_toolbar.panels import DebugPanel
@@ -12,12 +14,6 @@ class RequestVarsDebugPanel(DebugPanel):
1214
template = 'debug_toolbar/panels/request_vars.html'
1315
has_content = True
1416

15-
def __init__(self, *args, **kwargs):
16-
DebugPanel.__init__(self, *args, **kwargs)
17-
self.view_func = None
18-
self.view_args = None
19-
self.view_kwargs = None
20-
2117
def nav_title(self):
2218
return _('Request Vars')
2319

@@ -30,31 +26,32 @@ def url(self):
3026
def process_request(self, request):
3127
self.request = request
3228

33-
def process_view(self, request, view_func, view_args, view_kwargs):
34-
self.view_func = view_func
35-
self.view_args = view_args
36-
self.view_kwargs = view_kwargs
37-
3829
def process_response(self, request, response):
3930
self.record_stats({
4031
'get': [(k, self.request.GET.getlist(k)) for k in self.request.GET],
4132
'post': [(k, self.request.POST.getlist(k)) for k in self.request.POST],
4233
'cookies': [(k, self.request.COOKIES.get(k)) for k in self.request.COOKIES],
4334
})
44-
45-
if hasattr(self, 'view_func'):
46-
if self.view_func is not None:
47-
name = get_name_from_obj(self.view_func)
48-
else:
49-
name = '<no view>'
50-
51-
self.record_stats({
52-
'view_func': name,
53-
'view_args': self.view_args,
54-
'view_kwargs': self.view_kwargs
55-
})
35+
view_info = {
36+
'view_func': _('<no view>'),
37+
'view_args': 'None',
38+
'view_kwargs': 'None',
39+
'view_urlname': 'None',
40+
}
41+
try:
42+
match = resolve(self.request.path)
43+
func, args, kwargs = match
44+
view_info['view_func'] = get_name_from_obj(func)
45+
view_info['view_args'] = args
46+
view_info['view_kwargs'] = kwargs
47+
view_info['view_urlname'] = getattr(match, 'url_name',
48+
_('<unavailable>'))
49+
except Http404:
50+
pass
51+
self.record_stats(view_info)
5652

5753
if hasattr(self.request, 'session'):
5854
self.record_stats({
59-
'session': [(k, self.request.session.get(k)) for k in self.request.session.iterkeys()]
60-
})
55+
'session': [(k, self.request.session.get(k))
56+
for k in self.request.session.iterkeys()]
57+
})

debug_toolbar/templates/debug_toolbar/panels/request_vars.html

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@ <h4>{% trans 'View information' %}</h4>
55
<thead>
66
<tr>
77
<th>{% trans 'View Function' %}</th>
8+
<th>{% trans 'URL Name' %}</th>
89
<th>{% trans 'args' %}</th>
910
<th>{% trans 'kwargs' %}</th>
1011
</tr>
1112
</thead>
1213
<tbody>
1314
<tr>
1415
<td>{{ view_func }}</td>
16+
<td>{{ view_urlname }}</td>
1517
<td>{{ view_args|default:"None" }}</td>
1618
<td>
1719
{% if view_kwargs.items %}

tests/tests.py

Lines changed: 34 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from django.http import HttpResponse
1212
from django.test import TestCase
1313
from django.template import Template, Context
14+
from django import VERSION
1415

1516
from dingus import Dingus
1617
import thread
@@ -158,31 +159,42 @@ def test_tuple_urlconf(self):
158159
middleware.process_request(request)
159160
self.assertFalse(isinstance(request.urlconf, basestring))
160161

161-
def test_with_process_view(self):
162-
request = self.request
163-
response = self.response
164-
165-
def _test_view(request):
166-
return HttpResponse('')
167-
162+
def _resolve_stats(self, path):
163+
# takes stats from RequestVars panel
164+
self.request.path = path
168165
with Settings(DEBUG=True):
169166
panel = self.toolbar.get_panel(RequestVarsDebugPanel)
170-
panel.process_request(request)
171-
panel.process_view(request, _test_view, [], {})
172-
panel.process_response(request, response)
173-
content = panel.content()
174-
self.assertTrue('tests.tests._test_view' in content, content)
167+
panel.process_request(self.request)
168+
panel.process_response(self.request, self.response)
169+
return self.toolbar.stats['requestvars']
170+
171+
def test_url_resolving_positional(self):
172+
stats = self._resolve_stats('/resolving1/a/b/')
173+
if tuple(VERSION[:2]) >= (1, 3):
174+
self.assertEquals(stats['view_urlname'], 'positional-resolving') # Django >= 1.3
175+
else:
176+
self.assertEquals(stats['view_urlname'], '<unavailable>') # Django < 1.3
177+
self.assertEquals(stats['view_func'], 'tests.views.resolving_view')
178+
self.assertEquals(stats['view_args'], ('a', 'b'))
179+
self.assertEquals(stats['view_kwargs'], {})
180+
181+
def test_url_resolving_named(self):
182+
stats = self._resolve_stats('/resolving2/a/b/')
183+
self.assertEquals(stats['view_args'], ())
184+
self.assertEquals(stats['view_kwargs'], {'arg1': 'a', 'arg2': 'b'})
185+
186+
def test_url_resolving_mixed(self):
187+
stats = self._resolve_stats('/resolving3/a/')
188+
self.assertEquals(stats['view_args'], ('a',))
189+
self.assertEquals(stats['view_kwargs'], {'arg2': 'default'})
190+
191+
def test_url_resolving_bad(self):
192+
stats = self._resolve_stats('/non-existing-url/')
193+
self.assertEquals(stats['view_urlname'], 'None')
194+
self.assertEquals(stats['view_args'], 'None')
195+
self.assertEquals(stats['view_kwargs'], 'None')
196+
self.assertEquals(stats['view_func'], '<no view>')
175197

176-
def test_without_process_view(self):
177-
request = self.request
178-
response = self.response
179-
180-
with Settings(DEBUG=True):
181-
panel = self.toolbar.get_panel(RequestVarsDebugPanel)
182-
panel.process_request(request)
183-
panel.process_response(request, response)
184-
content = panel.content()
185-
self.assertTrue('&lt;no view&gt;' in content, content)
186198

187199
class DebugToolbarNameFromObjectTest(BaseTestCase):
188200
def test_func(self):

tests/urls.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,8 @@
1111

1212
urlpatterns = patterns('',
1313
# This pattern should be last to ensure tests still work
14+
url(r'^resolving1/(.+)/(.+)/$', 'tests.views.resolving_view', name = 'positional-resolving'),
15+
url(r'^resolving2/(?P<arg1>.+)/(?P<arg2>.+)/$', 'tests.views.resolving_view'),
16+
url(r'^resolving3/(.+)/$', 'tests.views.resolving_view', { 'arg2' : 'default' }),
1417
url(r'^execute_sql/$', 'tests.views.execute_sql'),
1518
)

tests/views.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,9 @@
44
def execute_sql(request):
55
list(User.objects.all())
66

7-
return HttpResponse()
7+
return HttpResponse()
8+
9+
def resolving_view(request, arg1, arg2):
10+
# see test_url_resolving in tests.py
11+
return HttpResponse()
12+

0 commit comments

Comments
 (0)