mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	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.
This commit is contained in:
		| @@ -33,6 +33,19 @@ def linebreak_iter(template_source): | ||||
|     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): | ||||
|     """Cleanse an individual setting key/value of sensitive content. | ||||
|  | ||||
| @@ -52,7 +65,8 @@ def cleanse_setting(key, value): | ||||
|         cleansed = value | ||||
|  | ||||
|     if callable(cleansed): | ||||
|         cleansed.do_not_call_in_templates = True | ||||
|         # For fixing #21345 and #23070 | ||||
|         cleansed = CallableSettingWrapper(cleansed) | ||||
|  | ||||
|     return cleansed | ||||
|  | ||||
|   | ||||
| @@ -20,7 +20,7 @@ from django.test import TestCase, RequestFactory, override_settings | ||||
| from django.test.utils import override_with_test_loader | ||||
| from django.utils.encoding import force_text, force_bytes | ||||
| from django.utils import six | ||||
| from django.views.debug import ExceptionReporter | ||||
| from django.views.debug import CallableSettingWrapper, ExceptionReporter | ||||
|  | ||||
| from .. import BrokenException, except_args | ||||
| from ..views import (sensitive_view, non_sensitive_view, paranoid_view, | ||||
| @@ -29,6 +29,21 @@ from ..views import (sensitive_view, non_sensitive_view, paranoid_view, | ||||
|     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, | ||||
|                    ROOT_URLCONF="view_tests.urls") | ||||
| class DebugViewTests(TestCase): | ||||
|   | ||||
		Reference in New Issue
	
	Block a user