From fc715e1e17aab69763dc80dd51b6800cc8ab916e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Sun, 25 Nov 2018 15:08:19 +0100 Subject: [PATCH] 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 diff --git a/passerelle/base/migrations/0010_loggingparameters_trace_emails.py b/passerelle/base/migrations/0010_loggingparameters_trace_emails.py new file mode 100644 index 0000000..0ac9a49 --- /dev/null +++ b/passerelle/base/migrations/0010_loggingparameters_trace_emails.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.12 on 2018-11-25 13:55 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('base', '0009_auto_20181118_0807'), + ] + + operations = [ + migrations.AddField( + model_name='loggingparameters', + name='trace_emails', + field=models.TextField(blank=True, help_text='One address per line (empty for site administrators)', verbose_name='Emails to receive error and critical traces'), + ), + ] diff --git a/passerelle/base/models.py b/passerelle/base/models.py index 96ab8d1..4a15951 100644 --- a/passerelle/base/models.py +++ b/passerelle/base/models.py @@ -15,6 +15,7 @@ from django.core.exceptions import ValidationError, ObjectDoesNotExist, Permissi from django.core.urlresolvers import reverse from django.db import models, transaction from django.db.models import Q +from django.test import override_settings from django.utils.text import slugify from django.utils import timezone from django.utils.translation import ugettext_lazy as _ @@ -154,19 +155,23 @@ class BaseResource(models.Model): return passerelle.utils.Request(resource=self, logger=self.logger) @property - def log_level(self): + def logging_parameters(self): resource_type = ContentType.objects.get_for_model(self) try: return LoggingParameters.objects.get( resource_type=resource_type, - resource_pk=self.id).log_level + resource_pk=self.id) except LoggingParameters.DoesNotExist: - return 'INFO' + return LoggingParameters( + resource_type=resource_type, + resource_pk=self.id) + + @property + def log_level(self): + return self.logging_parameters.log_level def set_log_level(self, value): - resource_type = ContentType.objects.get_for_model(self) - parameters, created = LoggingParameters.objects.get_or_create( - resource_type=resource_type, resource_pk=self.pk) + parameters = self.logging_parameters parameters.log_level = value parameters.save() @@ -461,6 +466,11 @@ class LoggingParameters(models.Model): ), default='INFO' ) + trace_emails = models.TextField( + verbose_name=_('Emails to receive error and critical traces'), + help_text=_('One address per line (empty for site administrators)'), + blank=True + ) class Meta: unique_together = (('resource_type', 'resource_pk')) @@ -567,7 +577,12 @@ class ProxyLogger(object): ResourceLog.objects.create(**attr) - getattr(self._logger, levelname.lower())(message, *args, **kwargs) + 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) def exception(self, message, *args, **kwargs): kwargs['exc_info'] = 1 diff --git a/passerelle/base/views.py b/passerelle/base/views.py index 0271a2c..20b4a13 100644 --- a/passerelle/base/views.py +++ b/passerelle/base/views.py @@ -108,15 +108,19 @@ class LoggingParametersUpdateView(FormView): return context def get_form_class(self): - return model_forms.modelform_factory( + form_class = model_forms.modelform_factory( LoggingParameters, - fields=['log_level']) + fields=['log_level', 'trace_emails']) + form_class.base_fields['trace_emails'].widget.attrs['rows'] = '3' + return form_class def get_initial(self): d = self.initial.copy() d['resource_type'] = self.kwargs['resource_type'] d['resource_pk'] = self.kwargs['resource_pk'] - d['log_level'] = self.get_resource().log_level + parameters = self.get_resource().logging_parameters + d['log_level'] = parameters.log_level + d['trace_emails'] = parameters.trace_emails return d def get_resource(self): @@ -127,5 +131,8 @@ class LoggingParametersUpdateView(FormView): return self.get_resource().get_absolute_url() def form_valid(self, form): - self.get_resource().set_log_level(form.cleaned_data['log_level']) + parameters = self.get_resource().logging_parameters + parameters.log_level = form.cleaned_data['log_level'] + parameters.trace_emails = form.cleaned_data['trace_emails'] + parameters.save() return super(LoggingParametersUpdateView, self).form_valid(form) diff --git a/tests/test_manager.py b/tests/test_manager.py index 094ad1d..39903c7 100644 --- a/tests/test_manager.py +++ b/tests/test_manager.py @@ -187,3 +187,13 @@ def test_logging_parameters(app, admin_user): resp.form['log_level'] = 'DEBUG' resp = resp.form.submit() assert CsvDataSource.objects.get(id=csv.id).log_level == 'DEBUG' + + resp = app.get(csv.get_absolute_url()) + resp = resp.click('logging parameters') + resp.form['trace_emails'] = 'fred@localhost' + resp = resp.form.submit() + assert CsvDataSource.objects.get(id=csv.id).logging_parameters.trace_emails == 'fred@localhost' + + resp = app.get(csv.get_absolute_url()) + resp = resp.click('logging parameters') + assert resp.form['trace_emails'].value == 'fred@localhost' -- 2.19.1