Ticket #16568: ticket_16568_v2.patch

File ticket_16568_v2.patch, 7.6 KB (added by andreas_pelme, 3 years ago)
  • django/conf/__init__.py

    diff --git a/django/conf/__init__.py b/django/conf/__init__.py
    index 4337bd4..3b829ce 100644
    a b def compat_patch_logging_config(logging_config): 
    199199        while filter_name in filters:
    200200            filter_name = filter_name + "_"
    201201
    202         def _callback(record):
    203             from django.conf import settings
    204             return not settings.DEBUG
    205 
    206202        filters[filter_name] = {
    207             "()": "django.utils.log.CallbackFilter",
    208             "callback": _callback
    209             }
     203            "()": "django.utils.log.RequireDebugFalse",
     204        }
    210205
    211206        logging_config["handlers"]["mail_admins"]["filters"] = [filter_name]
  • django/conf/global_settings.py

    diff --git a/django/conf/global_settings.py b/django/conf/global_settings.py
    index 637b5f4..29c9812 100644
    a b LOGGING_CONFIG = 'django.utils.log.dictConfig' 
    514514# The default logging configuration. This sends an email to
    515515# the site admins on every HTTP 500 error. All other log
    516516# records are sent to the bit bucket.
     517
    517518LOGGING = {
    518519    'version': 1,
    519520    'disable_existing_loggers': False,
    520521    'filters': {
    521522        'require_debug_false': {
    522             '()': 'django.utils.log.CallbackFilter',
    523             'callback': lambda r: not DEBUG
     523            '()': 'django.utils.log.RequireDebugFalse',
    524524        }
    525525    },
    526526    'handlers': {
  • django/conf/project_template/settings.py

    diff --git a/django/conf/project_template/settings.py b/django/conf/project_template/settings.py
    index 3a2243f..b92c116 100644
    a b LOGGING = { 
    128128    'disable_existing_loggers': False,
    129129    'filters': {
    130130        'require_debug_false': {
    131             '()': 'django.utils.log.CallbackFilter',
    132             'callback': lambda r: not DEBUG
     131            '()': 'django.utils.log.RequireDebugFalse'
    133132        }
    134133    },
    135134    'handlers': {
  • django/utils/log.py

    diff --git a/django/utils/log.py b/django/utils/log.py
    index a8098fc..8ce37f5 100644
    a b logger = getLogger('django') 
    3030if not logger.handlers:
    3131    logger.addHandler(NullHandler())
    3232
     33
    3334class AdminEmailHandler(logging.Handler):
    3435    """An exception log handler that emails log entries to site admins.
    3536
    class CallbackFilter(logging.Filter): 
    8283    def __init__(self, callback):
    8384        self.callback = callback
    8485
    85 
    8686    def filter(self, record):
    8787        if self.callback(record):
    8888            return 1
    8989        return 0
     90
     91
     92class RequireDebugFalse(logging.Filter):
     93    def filter(self, record):
     94        return not settings.DEBUG
  • docs/releases/1.4.txt

    diff --git a/docs/releases/1.4.txt b/docs/releases/1.4.txt
    index 90c5e24..f12db28 100644
    a b to :class:`django.utils.log.AdminEmailHandler` to prevent admin error emails in 
    593593
    594594   'filters': {
    595595        'require_debug_false': {
    596             '()': 'django.utils.log.CallbackFilter',
    597             'callback': lambda r: not DEBUG
     596            '()': 'django.utils.log.RequireDebugFalse'
    598597        }
    599598    },
    600599    'handlers': {
  • docs/topics/logging.txt

    diff --git a/docs/topics/logging.txt b/docs/topics/logging.txt
    index f23b529..3b4e26a 100644
    a b Python logging module. 
    504504Filters
    505505-------
    506506
    507 Django provides one log filter in addition to those provided by the
     507Django provides two log filter in addition to those provided by the
    508508Python logging module.
    509509
    510510.. class:: CallbackFilter(callback)
    Python logging module. 
    516516   through the filter. Handling of that record will not proceed if the callback
    517517   returns False.
    518518
     519.. class:: RequireDebugFalse()
     520
     521   .. versionadded:: 1.4
     522
     523   This filter will only proceed records when settings.DEBUG is False.
     524
    519525   This filter is used as follows in the default :setting:`LOGGING`
    520526   configuration to ensure that the :class:`AdminEmailHandler` only sends error
    521527   emails to admins when :setting:`DEBUG` is `False`::
    522528
    523529       'filters': {
    524530            'require_debug_false': {
    525                 '()': 'django.utils.log.CallbackFilter',
    526                 'callback': lambda r: not DEBUG
     531                '()': 'django.utils.log.RequireDebugFalse',
    527532            }
    528533        },
    529534        'handlers': {
  • tests/regressiontests/logging_tests/tests.py

    diff --git a/tests/regressiontests/logging_tests/tests.py b/tests/regressiontests/logging_tests/tests.py
    index 76c5185..354950c 100644
    a b from __future__ import with_statement 
    22
    33import copy
    44
    5 from django.conf import compat_patch_logging_config
     5from django.conf import compat_patch_logging_config, settings, global_settings
    66from django.test import TestCase
     7
     8from django.utils.log import CallbackFilter, RequireDebugFalse, getLogger
    79from django.test.utils import override_settings
    8 from django.utils.log import CallbackFilter, getLogger
    910from django.core import mail
    1011
    1112
    12 
    1313# logging config prior to using filter with mail_admins
    1414OLD_LOGGING = {
    1515    'version': 1,
    OLD_LOGGING = { 
    3030}
    3131
    3232
    33 
    3433class PatchLoggingConfigTest(TestCase):
    3534    """
    3635    Tests for backward-compat shim for #16288. These tests should be removed in
    class PatchLoggingConfigTest(TestCase): 
    5049            config["handlers"]["mail_admins"]["filters"],
    5150            ['require_debug_false'])
    5251
    53 
    5452    def test_filter_configuration(self):
    5553        """
    56         Test that the debug-false filter is a CallbackFilter with a callback
    57         that works as expected (returns ``not DEBUG``).
     54        Test that the require_debug_false filter (RequireDebugFalse) is added
     55        to the settings when not explicitly specified in the settings.
    5856
    5957        """
    6058        config = copy.deepcopy(OLD_LOGGING)
    6159        compat_patch_logging_config(config)
    6260
    6361        flt = config["filters"]["require_debug_false"]
     62        self.assertEqual(flt["()"], "django.utils.log.RequireDebugFalse")
    6463
    65         self.assertEqual(flt["()"], "django.utils.log.CallbackFilter")
    66 
    67         callback = flt["callback"]
     64    def test_require_debug_false_filter(self):
     65        """Test the RequireDebugFalse filter"""
     66        filter_ = RequireDebugFalse()
    6867
    6968        with self.settings(DEBUG=True):
    70             self.assertEqual(callback("record is not used"), False)
     69            self.assertEqual(filter_.filter("record is not used"), False)
    7170
    7271        with self.settings(DEBUG=False):
    73             self.assertEqual(callback("record is not used"), True)
    74 
     72            self.assertEqual(filter_.filter("record is not used"), True)
    7573
    7674    def test_no_patch_if_filters_key_exists(self):
    7775        """
    class PatchLoggingConfigTest(TestCase): 
    10098        self.assertEqual(config, new_config)
    10199
    102100
     101class TestRequireDebugFalseNoLoggingSetting(TestCase):
     102    """
     103    Test that RequireDebugFalse works as excpected when LOGGING is not
     104    specified in the project settings. See #16568.
     105    """
     106    def test_require_debug_no_logging_setting(self):
     107        filter_ = RequireDebugFalse()
     108
     109        with self.settings(DEBUG=True):
     110            self.assertEqual(filter_.filter("record is not used"), False)
     111
     112        with self.settings(DEBUG=False):
     113            self.assertEqual(filter_.filter("record is not used"), True)
     114
     115
    103116class CallbackFilterTest(TestCase):
    104117    def test_sense(self):
    105118        f_false = CallbackFilter(lambda r: False)
    class CallbackFilterTest(TestCase): 
    110123
    111124    def test_passes_on_record(self):
    112125        collector = []
     126
    113127        def _callback(record):
    114128            collector.append(record)
    115129            return True
Back to Top