Projet

Général

Profil

0001-general-add-possibility-to-override-trace-emails-rec.patch

Benjamin Dauvergne, 05 décembre 2018 11:54

Télécharger (6,51 ko)

Voir les différences:

Subject: [PATCH 1/2] general: add possibility to override trace emails
 recipients (#24591)

 .../0010_loggingparameters_trace_emails.py    | 20 +++++++++++++
 passerelle/base/models.py                     | 29 ++++++++++++++-----
 passerelle/base/views.py                      | 15 +++++++---
 tests/test_manager.py                         | 10 +++++++
 4 files changed, 63 insertions(+), 11 deletions(-)
 create mode 100644 passerelle/base/migrations/0010_loggingparameters_trace_emails.py
passerelle/base/migrations/0010_loggingparameters_trace_emails.py
1
# -*- coding: utf-8 -*-
2
# Generated by Django 1.11.12 on 2018-11-25 13:55
3
from __future__ import unicode_literals
4

  
5
from django.db import migrations, models
6

  
7

  
8
class Migration(migrations.Migration):
9

  
10
    dependencies = [
11
        ('base', '0009_auto_20181118_0807'),
12
    ]
13

  
14
    operations = [
15
        migrations.AddField(
16
            model_name='loggingparameters',
17
            name='trace_emails',
18
            field=models.TextField(blank=True, help_text='One address per line (empty for site administrators)', verbose_name='Emails to receive error and critical traces'),
19
        ),
20
    ]
passerelle/base/models.py
15 15
from django.core.urlresolvers import reverse
16 16
from django.db import models, transaction
17 17
from django.db.models import Q
18
from django.test import override_settings
18 19
from django.utils.text import slugify
19 20
from django.utils import timezone
20 21
from django.utils.translation import ugettext_lazy as _
......
154 155
        return passerelle.utils.Request(resource=self, logger=self.logger)
155 156

  
156 157
    @property
157
    def log_level(self):
158
    def logging_parameters(self):
158 159
        resource_type = ContentType.objects.get_for_model(self)
159 160
        try:
160 161
            return LoggingParameters.objects.get(
161 162
                    resource_type=resource_type,
162
                    resource_pk=self.id).log_level
163
                    resource_pk=self.id)
163 164
        except LoggingParameters.DoesNotExist:
164
            return 'INFO'
165
            return LoggingParameters(
166
                    resource_type=resource_type,
167
                    resource_pk=self.id)
168

  
169
    @property
170
    def log_level(self):
171
        return self.logging_parameters.log_level
165 172

  
166 173
    def set_log_level(self, value):
167
        resource_type = ContentType.objects.get_for_model(self)
168
        parameters, created = LoggingParameters.objects.get_or_create(
169
                resource_type=resource_type, resource_pk=self.pk)
174
        parameters = self.logging_parameters
170 175
        parameters.log_level = value
171 176
        parameters.save()
172 177

  
......
461 466
        ),
462 467
        default='INFO'
463 468
    )
469
    trace_emails = models.TextField(
470
        verbose_name=_('Emails to receive error and critical traces'),
471
        help_text=_('One address per line (empty for site administrators)'),
472
        blank=True
473
    )
464 474

  
465 475
    class Meta:
466 476
        unique_together = (('resource_type', 'resource_pk'))
......
567 577

  
568 578
            ResourceLog.objects.create(**attr)
569 579

  
570
        getattr(self._logger, levelname.lower())(message, *args, **kwargs)
580
        admins = settings.ADMINS
581
        logging_parameters = self.connector.logging_parameters
582
        if logging_parameters.trace_emails:
583
            admins = [('', x) for x in logging_parameters.trace_emails.splitlines()]
584
        with override_settings(ADMINS=admins):
585
            getattr(self._logger, levelname.lower())(message, *args, **kwargs)
571 586

  
572 587
    def exception(self, message, *args, **kwargs):
573 588
        kwargs['exc_info'] = 1
passerelle/base/views.py
108 108
        return context
109 109

  
110 110
    def get_form_class(self):
111
        return model_forms.modelform_factory(
111
        form_class = model_forms.modelform_factory(
112 112
                LoggingParameters,
113
                fields=['log_level'])
113
                fields=['log_level', 'trace_emails'])
114
        form_class.base_fields['trace_emails'].widget.attrs['rows'] = '3'
115
        return form_class
114 116

  
115 117
    def get_initial(self):
116 118
        d = self.initial.copy()
117 119
        d['resource_type'] = self.kwargs['resource_type']
118 120
        d['resource_pk'] = self.kwargs['resource_pk']
119
        d['log_level'] = self.get_resource().log_level
121
        parameters = self.get_resource().logging_parameters
122
        d['log_level'] = parameters.log_level
123
        d['trace_emails'] = parameters.trace_emails
120 124
        return d
121 125

  
122 126
    def get_resource(self):
......
127 131
        return self.get_resource().get_absolute_url()
128 132

  
129 133
    def form_valid(self, form):
130
        self.get_resource().set_log_level(form.cleaned_data['log_level'])
134
        parameters = self.get_resource().logging_parameters
135
        parameters.log_level = form.cleaned_data['log_level']
136
        parameters.trace_emails = form.cleaned_data['trace_emails']
137
        parameters.save()
131 138
        return super(LoggingParametersUpdateView, self).form_valid(form)
tests/test_manager.py
187 187
    resp.form['log_level'] = 'DEBUG'
188 188
    resp = resp.form.submit()
189 189
    assert CsvDataSource.objects.get(id=csv.id).log_level == 'DEBUG'
190

  
191
    resp = app.get(csv.get_absolute_url())
192
    resp = resp.click('logging parameters')
193
    resp.form['trace_emails'] = 'fred@localhost'
194
    resp = resp.form.submit()
195
    assert CsvDataSource.objects.get(id=csv.id).logging_parameters.trace_emails == 'fred@localhost'
196

  
197
    resp = app.get(csv.get_absolute_url())
198
    resp = resp.click('logging parameters')
199
    assert resp.form['trace_emails'].value == 'fred@localhost'
190
-