mirror of
				https://github.com/django/django.git
				synced 2025-11-03 21:25:09 +00:00 
			
		
		
		
	Merge branch 'ticket_19325' of https://github.com/hannesstruss/django into hannesstruss-ticket_19325
This commit is contained in:
		
						commit
						3fb83729b9
					
				
					 5 changed files with 69 additions and 3 deletions
				
			
		
							
								
								
									
										1
									
								
								AUTHORS
									
										
									
									
									
								
							
							
						
						
									
										1
									
								
								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:
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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):
 | 
			
		||||
        """
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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):
 | 
			
		||||
    """
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue