Projet

Général

Profil

0001-misc-fix-override-of-trace-emails-recipients-for-Dja.patch

Valentin Deniaud, 22 juillet 2021 11:03

Télécharger (5,7 ko)

Voir les différences:

Subject: [PATCH] misc: fix override of trace emails recipients for Django 2
 (#55687)

 passerelle/base/models.py | 13 ++++-----
 passerelle/log.py         | 59 +++++++++++++++++++++++++++++++++++++++
 passerelle/settings.py    |  5 ++++
 tests/test_misc.py        |  2 +-
 4 files changed, 71 insertions(+), 8 deletions(-)
 create mode 100644 passerelle/log.py
passerelle/base/models.py
23 23
from django.db.models import Q
24 24
from django.forms.models import modelform_factory
25 25
from django.forms.widgets import ClearableFileInput
26
from django.test import override_settings
27 26
from django.urls import reverse
28 27
from django.utils import six, timezone
29 28
from django.utils.encoding import force_text
......
35 34

  
36 35
import passerelle
37 36
from passerelle.forms import GenericConnectorForm
37
from passerelle.log import AddResourceFilter, AdminEmailHandler
38 38
from passerelle.utils.api import endpoint
39 39
from passerelle.utils.jsonresponse import APIError
40 40
from passerelle.utils.sftp import SFTP, SFTPField
......
158 158
    def __init__(self, *args, **kwargs):
159 159
        super(BaseResource, self).__init__(*args, **kwargs)
160 160
        self.logger = ProxyLogger(connector=self, transaction_id=str(uuid.uuid4()))
161
        root_logger = logging.getLogger()
162
        for handler in root_logger.handlers:
163
            if isinstance(handler, AdminEmailHandler):
164
                handler.addFilter(AddResourceFilter(resource=self))
161 165

  
162 166
    def __str__(self):
163 167
        return self.title
......
969 973

  
970 974
            ResourceLog.objects.create(**attr)
971 975

  
972
        admins = settings.ADMINS
973
        logging_parameters = self.connector.logging_parameters
974
        if logging_parameters.trace_emails:
975
            admins = [('', x) for x in logging_parameters.trace_emails.splitlines()]
976
        with override_settings(ADMINS=admins):
977
            getattr(self._logger, levelname.lower())(message, *args, **kwargs)
976
        getattr(self._logger, levelname.lower())(message, *args, **kwargs)
978 977

  
979 978
    def exception(self, message, *args, **kwargs):
980 979
        kwargs['exc_info'] = 1
passerelle/log.py
1
# Copyright (C) 2021  Entr'ouvert
2
#
3
# This program is free software: you can redistribute it and/or modify it
4
# under the terms of the GNU Affero General Public License as published
5
# by the Free Software Foundation, either version 3 of the License, or
6
# (at your option) any later version.
7
#
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU Affero General Public License for more details.
12
#
13
# You should have received a copy of the GNU Affero General Public License
14
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
15
import logging
16

  
17
import django.utils.log
18
from django.conf import settings
19
from django.core.mail.message import EmailMultiAlternatives
20

  
21

  
22
class AddResourceFilter(logging.Filter):
23
    def __init__(self, *args, resource=None, **kwargs):
24
        self.resource = resource
25
        super().__init__(*args, **kwargs)
26

  
27
    def filter(self, record):
28
        record.resource = self.resource
29
        return True
30

  
31

  
32
class AdminEmailHandler(django.utils.log.AdminEmailHandler):
33
    def __init__(self, *args, **kwargs):
34
        self.emails = []
35
        super().__init__(*args, **kwargs)
36

  
37
    def emit(self, record):
38
        if hasattr(record, 'resource'):
39
            logging_parameters = record.resource.logging_parameters
40
            self.emails = logging_parameters.trace_emails.splitlines()
41
        elif settings.ADMINS:
42
            self.emails = [a[1] for a in settings.ADMINS]
43
        return super().emit(record)
44

  
45
    def send_mail(self, subject, message, *args, **kwargs):
46
        if not self.emails:
47
            return
48

  
49
        mail = EmailMultiAlternatives(
50
            '%s%s' % (settings.EMAIL_SUBJECT_PREFIX, subject),
51
            message,
52
            settings.SERVER_EMAIL,
53
            self.emails,
54
            connection=self.connection(),
55
        )
56
        if 'html_message' in kwargs:
57
            mail.attach_alternative(kwargs['html_message'], 'text/html')
58

  
59
        mail.send(fail_silently=kwargs.get('fail_silently', False))
passerelle/settings.py
244 244
            'level': 'DEBUG',
245 245
            'class': 'logging.StreamHandler',
246 246
        },
247
        'mail_admins': {
248
            'level': 'ERROR',
249
            'class': 'passerelle.log.AdminEmailHandler',
250
            'include_html': True,
251
        },
247 252
    },
248 253
    'loggers': {
249 254
        'django.request': {
tests/test_misc.py
88 88
def email_handler():
89 89
    import logging
90 90

  
91
    from django.utils.log import AdminEmailHandler
91
    from passerelle.log import AdminEmailHandler
92 92

  
93 93
    root = logging.getLogger()
94 94
    handler = AdminEmailHandler(include_html=True)
95
-