From f6ec2a1e820c1353ee110792ff8988a503f9757f Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Thu, 7 Mar 2019 20:08:29 +0100 Subject: [PATCH 2/3] base: use deferrable to create ResourceLog objects (#31204) --- passerelle/base/models.py | 8 +++++++- tests/test_proxylogger.py | 28 ++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/passerelle/base/models.py b/passerelle/base/models.py index ebcb5208..2fce8c3d 100644 --- a/passerelle/base/models.py +++ b/passerelle/base/models.py @@ -36,6 +36,7 @@ from model_utils.managers import InheritanceManager as ModelUtilsInheritanceMana import jsonfield +from passerelle.utils.defer import deferrable import passerelle import requests from passerelle.compat import json_loads @@ -727,6 +728,11 @@ class ResourceLog(models.Model): message = models.TextField(verbose_name='message') extra = jsonfield.JSONField(verbose_name='extras', default={}) + @classmethod + @deferrable + def safe_create(cls, **attr): + cls.objects.create(**attr) + class Meta: permissions = ( ('view_resourcelog', 'Can view resource logs'), @@ -843,7 +849,7 @@ class ProxyLogger(object): (exc_type, exc_value, tb) = sys.exc_info() attr['extra']['error_summary'] = traceback.format_exception_only(exc_type, exc_value) - ResourceLog.objects.create(**attr) + ResourceLog.safe_create(**attr) admins = settings.ADMINS logging_parameters = self.connector.logging_parameters diff --git a/tests/test_proxylogger.py b/tests/test_proxylogger.py index f5d5078c..f7f10e56 100644 --- a/tests/test_proxylogger.py +++ b/tests/test_proxylogger.py @@ -256,3 +256,31 @@ def test_proxy_logger_context(db, connector): base_logger.debug('test') log = ResourceLog.objects.latest('id') assert log.extra == {} + + +def test_log_in_transaction(transactional_db, connector): + from passerelle.utils.defer import deferrable_barrier + from django.db import transaction + + qs = ResourceLog.objects.filter(message='coucou') + # without deferrable_barrier logs are lost + assert not qs.exists() + try: + with transaction.atomic(): + connector.logger.info('coucou') + raise Exception + assert qs.exists() + except Exception: + pass + assert not qs.exists() + + # with deferrable_barrier logs are kept + try: + with deferrable_barrier: + with transaction.atomic(): + connector.logger.info('coucou') + raise Exception + assert qs.exists() + except Exception: + pass + assert qs.exists() -- 2.24.0