From 44d3aed77165c6d56ab3831d0e84c7a2db6b2b60 Mon Sep 17 00:00:00 2001 From: Valentin Deniaud Date: Tue, 20 Jul 2021 16:03:01 +0200 Subject: [PATCH] misc: fix override of trace emails recipients for Django 2 (#55687) --- passerelle/base/models.py | 7 +++---- passerelle/log.py | 44 +++++++++++++++++++++++++++++++++++++++ passerelle/settings.py | 5 +++++ tests/test_misc.py | 2 +- 4 files changed, 53 insertions(+), 5 deletions(-) create mode 100644 passerelle/log.py diff --git a/passerelle/base/models.py b/passerelle/base/models.py index e6628880..57685b9b 100644 --- a/passerelle/base/models.py +++ b/passerelle/base/models.py @@ -971,10 +971,9 @@ class ProxyLogger(object): admins = settings.ADMINS logging_parameters = self.connector.logging_parameters - if logging_parameters.trace_emails: - admins = [('', x) for x in logging_parameters.trace_emails.splitlines()] - with override_settings(ADMINS=admins): - getattr(self._logger, levelname.lower())(message, *args, **kwargs) + kwargs.setdefault('extra', {})['admin_emails'] = logging_parameters.trace_emails.splitlines() + + getattr(self._logger, levelname.lower())(message, *args, **kwargs) def exception(self, message, *args, **kwargs): kwargs['exc_info'] = 1 diff --git a/passerelle/log.py b/passerelle/log.py new file mode 100644 index 00000000..010c3646 --- /dev/null +++ b/passerelle/log.py @@ -0,0 +1,44 @@ +# Copyright (C) 2021 Entr'ouvert +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +import django.utils.log +from django.conf import settings +from django.core.mail.message import EmailMultiAlternatives + + +class AdminEmailHandler(django.utils.log.AdminEmailHandler): + def emit(self, record): + self.emails = [] + if getattr(record, 'admin_emails', None): + self.emails = record.admin_emails + elif settings.ADMINS: + self.emails = [a[1] for a in settings.ADMINS] + return super().emit(record) + + def send_mail(self, subject, message, *args, **kwargs): + if not self.emails: + return + + mail = EmailMultiAlternatives( + '%s%s' % (settings.EMAIL_SUBJECT_PREFIX, subject), + message, + settings.SERVER_EMAIL, + self.emails, + connection=self.connection(), + ) + if 'html_message' in kwargs: + mail.attach_alternative(kwargs['html_message'], 'text/html') + + mail.send(fail_silently=kwargs.get('fail_silently', False)) diff --git a/passerelle/settings.py b/passerelle/settings.py index 3750c8f0..78011980 100644 --- a/passerelle/settings.py +++ b/passerelle/settings.py @@ -244,6 +244,11 @@ LOGGING = { 'level': 'DEBUG', 'class': 'logging.StreamHandler', }, + 'mail_admins': { + 'level': 'ERROR', + 'class': 'passerelle.log.AdminEmailHandler', + 'include_html': True, + }, }, 'loggers': { 'django.request': { diff --git a/tests/test_misc.py b/tests/test_misc.py index 05f2df94..62216fae 100644 --- a/tests/test_misc.py +++ b/tests/test_misc.py @@ -88,7 +88,7 @@ def test_log_cleaning(app, db, admin_user, settings): def email_handler(): import logging - from django.utils.log import AdminEmailHandler + from passerelle.log import AdminEmailHandler root = logging.getLogger() handler = AdminEmailHandler(include_html=True) -- 2.20.1