[1.7.x] Fixed code to solve #23070 problem

Added a class to wrap callable in settings:
* Not to call in the debug page (#21345).
* Not to break the debug page if the callable forbidding to set attributes (#23070).

Thanks @bmispelon for giving me some advice.

Backport of d0889863de from master.
This commit is contained in:
Hiroki KIYOHARA 2014-07-26 12:06:48 +02:00 committed by James Bennett
parent 0d8d4fe9b4
commit df678b7500
2 changed files with 31 additions and 2 deletions

View File

@ -31,6 +31,19 @@ def linebreak_iter(template_source):
yield len(template_source) + 1 yield len(template_source) + 1
class CallableSettingWrapper(object):
""" Object to wrap callable appearing in settings
* Not to call in the debug page (#21345).
* Not to break the debug page if the callable forbidding to set attributes (#23070).
"""
def __init__(self, callable_setting):
self._wrapped = callable_setting
def __repr__(self):
return repr(self._wrapped)
def cleanse_setting(key, value): def cleanse_setting(key, value):
"""Cleanse an individual setting key/value of sensitive content. """Cleanse an individual setting key/value of sensitive content.
@ -50,7 +63,8 @@ def cleanse_setting(key, value):
cleansed = value cleansed = value
if callable(cleansed): if callable(cleansed):
cleansed.do_not_call_in_templates = True # For fixing #21345 and #23070
cleansed = CallableSettingWrapper(cleansed)
return cleansed return cleansed

View File

@ -21,7 +21,7 @@ from django.test.utils import (
setup_test_template_loader, restore_template_loaders) setup_test_template_loader, restore_template_loaders)
from django.utils.encoding import force_text, force_bytes from django.utils.encoding import force_text, force_bytes
from django.utils import six from django.utils import six
from django.views.debug import ExceptionReporter from django.views.debug import CallableSettingWrapper, ExceptionReporter
from .. import BrokenException, except_args from .. import BrokenException, except_args
from ..views import (sensitive_view, non_sensitive_view, paranoid_view, from ..views import (sensitive_view, non_sensitive_view, paranoid_view,
@ -30,6 +30,21 @@ from ..views import (sensitive_view, non_sensitive_view, paranoid_view,
multivalue_dict_key_error) multivalue_dict_key_error)
class CallableSettingWrapperTests(TestCase):
""" Unittests for CallableSettingWrapper
"""
def test_repr(self):
class WrappedCallable(object):
def __repr__(self):
return "repr from the wrapped callable"
def __call__(self):
pass
actual = repr(CallableSettingWrapper(WrappedCallable()))
self.assertEqual(actual, "repr from the wrapped callable")
@override_settings(DEBUG=True, TEMPLATE_DEBUG=True) @override_settings(DEBUG=True, TEMPLATE_DEBUG=True)
class DebugViewTests(TestCase): class DebugViewTests(TestCase):
urls = "view_tests.urls" urls = "view_tests.urls"