From 9366ece81761f56fcf4df674e49157dab5bb86bc Mon Sep 17 00:00:00 2001 From: Tomasz Buchert Date: Tue, 27 Sep 2011 20:19:14 +0200 Subject: [PATCH 1/2] Resolving view name in Request Vars panel. --- debug_toolbar/panels/request_vars.py | 40 ++++++++++--------- .../debug_toolbar/panels/request_vars.html | 2 + 2 files changed, 24 insertions(+), 18 deletions(-) diff --git a/debug_toolbar/panels/request_vars.py b/debug_toolbar/panels/request_vars.py index ee9cdc54c..9712d3f78 100644 --- a/debug_toolbar/panels/request_vars.py +++ b/debug_toolbar/panels/request_vars.py @@ -3,6 +3,9 @@ from debug_toolbar.panels import DebugPanel from debug_toolbar.utils import get_name_from_obj +from django.core.urlresolvers import resolve +from django.http import Http404 + class RequestVarsDebugPanel(DebugPanel): """ A panel to display request variables (POST/GET, session, cookies). @@ -13,9 +16,6 @@ class RequestVarsDebugPanel(DebugPanel): 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') @@ -29,11 +29,6 @@ def url(self): 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], @@ -41,17 +36,26 @@ def process_response(self, request, response): '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) + view_info = { } + view_info['view_func'] = '' + view_info['view_args'] = 'None' + view_info['view_kwargs'] = 'None' + view_info['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 + if hasattr(match, 'url_name'): # Django >= 1.3 + view_info['view_urlname'] = match.url_name else: - name = '' - - self.record_stats({ - 'view_func': name, - 'view_args': self.view_args, - 'view_kwargs': self.view_kwargs - }) + view_info['view_urlname'] = '' + except Http404: + pass + + self.record_stats(view_info) if hasattr(self.request, 'session'): self.record_stats({ diff --git a/debug_toolbar/templates/debug_toolbar/panels/request_vars.html b/debug_toolbar/templates/debug_toolbar/panels/request_vars.html index 07c223aa3..057f4dee8 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 @@

{% trans 'View information' %}

{% trans 'View Function' %} + {% trans 'URL Name' %} {% trans 'args' %} {% trans 'kwargs' %} @@ -12,6 +13,7 @@

{% trans 'View information' %}

{{ view_func }} + {{ view_urlname }} {{ view_args|default:"None" }} {% if view_kwargs.items %} From bf0483b916e0a5476545e6b37a8e271235441d12 Mon Sep 17 00:00:00 2001 From: Tomasz Buchert Date: Wed, 28 Sep 2011 08:24:57 +0200 Subject: [PATCH 2/2] Fixes broken tests by the previous commit. Adds new instead. --- tests/tests.py | 57 ++++++++++++++++++++++++++++++-------------------- tests/urls.py | 3 +++ tests/views.py | 7 ++++++- 3 files changed, 43 insertions(+), 24 deletions(-) diff --git a/tests/tests.py b/tests/tests.py index 154615a28..98950f725 100644 --- a/tests/tests.py +++ b/tests/tests.py @@ -11,6 +11,7 @@ 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 @@ -147,31 +148,41 @@ def test_request_urlconf_module(self): self.assertTrue(hasattr(request.urlconf.urlpatterns[1], '_callback_str')) self.assertEquals(request.urlconf.urlpatterns[-1]._callback_str, 'tests.views.execute_sql') - def test_with_process_view(self): - request = self.request - response = self.response - - def _test_view(request): - return HttpResponse('') - - 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) - - def test_without_process_view(self): - request = self.request - response = self.response - + 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_response(request, response) - content = panel.content() - self.assertTrue('<no 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'], '') # 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'], tuple() ) + 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'], '') class DebugToolbarNameFromObjectTest(BaseTestCase): def test_func(self): diff --git a/tests/urls.py b/tests/urls.py index 359fd8fae..a556703d7 100644 --- a/tests/urls.py +++ b/tests/urls.py @@ -11,5 +11,8 @@ 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.+)/(?P.+)/$', '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 f989dcdc5..909a784ff 100644 --- a/tests/views.py +++ b/tests/views.py @@ -4,4 +4,9 @@ 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() +