浏览代码

Merge branch 'ticket_19325' of https://github.com/hannesstruss/django into hannesstruss-ticket_19325

Jannis Leidel 12 年之前
父节点
当前提交
3fb83729b9

+ 1 - 0
AUTHORS

@@ -589,6 +589,7 @@ answer newbie questions, and generally made Django that much better:
     Gasper Zejn <zejn@kiberpipa.org>
     Jarek Zgoda <jarek.zgoda@gmail.com>
     Cheng Zhang
+    Hannes Struß <x@hannesstruss.de>
 
 A big THANK YOU goes to:
 

+ 9 - 2
django/utils/log.py

@@ -3,6 +3,7 @@ import traceback
 
 from django.conf import settings
 from django.core import mail
+from django.core.mail import get_connection
 from django.views.debug import ExceptionReporter, get_exception_reporter_filter
 
 
@@ -76,9 +77,10 @@ class AdminEmailHandler(logging.Handler):
     request data will be provided in the email report.
     """
 
-    def __init__(self, include_html=False):
+    def __init__(self, include_html=False, email_backend=None):
         logging.Handler.__init__(self)
         self.include_html = include_html
+        self.email_backend = email_backend
 
     def emit(self, record):
         try:
@@ -110,7 +112,12 @@ class AdminEmailHandler(logging.Handler):
         message = "%s\n\n%s" % (stack_trace, request_repr)
         reporter = ExceptionReporter(request, is_email=True, *exc_info)
         html_message = self.include_html and reporter.get_traceback_html() or None
-        mail.mail_admins(subject, message, fail_silently=True, html_message=html_message)
+        mail.mail_admins(subject, message, fail_silently=True,
+                         html_message=html_message,
+                         connection=self.connection())
+
+    def connection(self):
+        return get_connection(backend=self.email_backend)
 
     def format_subject(self, subject):
         """

+ 18 - 1
docs/topics/logging.txt

@@ -440,7 +440,7 @@ Handlers
 Django provides one log handler in addition to those provided by the
 Python logging module.
 
-.. class:: AdminEmailHandler([include_html=False])
+.. class:: AdminEmailHandler(include_html=False, email_backend=None)
 
     This handler sends an email to the site admins for each log
     message it receives.
@@ -476,6 +476,23 @@ Python logging module.
     sensitive information to be filtered out of error reports -- learn more on
     :ref:`Filtering error reports<filtering-error-reports>`.
 
+    .. versionadded:: 1.6
+
+    By setting the ``email_backend`` argument of ``AdminEmailHandler``, the
+    :ref:`email backend <topic-email-backends>` that is being used by the
+    handler can be overridden, like this::
+
+        'handlers': {
+            'mail_admins': {
+                'level': 'ERROR',
+                'class': 'django.utils.log.AdminEmailHandler',
+                'email_backend': 'django.core.mail.backends.filebased.EmailBackend',
+            }
+        },
+
+    By default, an instance of the email backend specified in
+    :setting:`EMAIL_BACKEND` will be used.
+
 .. _Sentry: http://pypi.python.org/pypi/sentry
 
 

+ 7 - 0
tests/regressiontests/logging_tests/logconfig.py

@@ -1,8 +1,15 @@
 import logging
 
 from django.conf import settings
+from django.core.mail.backends.base import BaseEmailBackend
+
 
 class MyHandler(logging.Handler):
     def __init__(self):
         logging.Handler.__init__(self)
         self.config = settings.LOGGING
+
+
+class MyEmailBackend(BaseEmailBackend):
+    def send_messages(self, email_messages):
+        pass

+ 34 - 0
tests/regressiontests/logging_tests/tests.py

@@ -15,6 +15,8 @@ from django.utils.unittest import skipUnless
 
 from ..admin_scripts.tests import AdminScriptTestCase
 
+from .logconfig import MyEmailBackend
+
 PYVERS = sys.version_info[:2]
 
 # logging config prior to using filter with mail_admins
@@ -305,6 +307,38 @@ class AdminEmailHandlerTest(TestCase):
         self.assertEqual(len(mail.outbox), 1)
         self.assertEqual(mail.outbox[0].subject, expected_subject)
 
+    @override_settings(
+            ADMINS=(('admin', 'admin@example.com'),),
+            DEBUG=False,
+        )
+    def test_uses_custom_email_backend(self):
+        """
+        Refs #19325
+        """
+        message = 'All work and no play makes Jack a dull boy'
+        admin_email_handler = self.get_admin_email_handler(self.logger)
+        mail_admins_called = {'called': False}
+
+        def my_mail_admins(*args, **kwargs):
+            connection = kwargs['connection']
+            self.assertTrue(isinstance(connection, MyEmailBackend))
+            mail_admins_called['called'] = True
+
+        # Monkeypatches
+        orig_mail_admins = mail.mail_admins
+        orig_email_backend = admin_email_handler.email_backend
+        mail.mail_admins = my_mail_admins
+        admin_email_handler.email_backend = (
+            'regressiontests.logging_tests.logconfig.MyEmailBackend')
+
+        try:
+            self.logger.error(message)
+            self.assertTrue(mail_admins_called['called'])
+        finally:
+            # Revert Monkeypatches
+            mail.mail_admins = orig_mail_admins
+            admin_email_handler.email_backend = orig_email_backend
+
 
 class SettingsConfigTest(AdminScriptTestCase):
     """