Projet

Général

Profil

0002-base-use-deferrable-to-create-ResourceLog-objects-31.patch

Benjamin Dauvergne, 06 mai 2021 17:04

Télécharger (3,05 ko)

Voir les différences:

Subject: [PATCH 2/3] base: use deferrable to create ResourceLog objects
 (#31204)

 passerelle/base/models.py |  9 ++++++++-
 tests/test_proxylogger.py | 28 ++++++++++++++++++++++++++++
 2 files changed, 36 insertions(+), 1 deletion(-)
passerelle/base/models.py
35 35

  
36 36
from model_utils.managers import InheritanceManager as ModelUtilsInheritanceManager
37 37

  
38

  
38 39
import passerelle
39 40
from passerelle.forms import GenericConnectorForm
40 41
from passerelle.utils.api import endpoint
42
from passerelle.utils.defer import deferrable
41 43
from passerelle.utils.jsonresponse import APIError
42 44
from passerelle.utils.sftp import SFTPField, SFTP
43 45

  
......
844 846
    extra = JSONField(verbose_name='extras', default=dict)
845 847
    transaction_id = models.UUIDField(null=True, db_index=True)
846 848

  
849
    @classmethod
850
    @deferrable
851
    def safe_create(cls, **attr):
852
        cls.objects.create(**attr)
853

  
847 854
    class Meta:
848 855
        ordering = ('id',)
849 856
        permissions = (('see_resourcelog', 'Can see resource logs'),)
......
969 976
                (exc_type, exc_value, tb) = sys.exc_info()
970 977
                attr['extra']['error_summary'] = traceback.format_exception_only(exc_type, exc_value)
971 978

  
972
            ResourceLog.objects.create(**attr)
979
            ResourceLog.safe_create(**attr)
973 980

  
974 981
        admins = settings.ADMINS
975 982
        logging_parameters = self.connector.logging_parameters
tests/test_proxylogger.py
383 383
        assert ResourceLog.objects.all()[1].extra.get('response_content') == '\'{"service_reply_var": "33\''
384 384
    else:
385 385
        assert ResourceLog.objects.all()[1].extra.get('response_content') == 'b\'{"service_reply_var": "33\''
386

  
387

  
388
def test_log_in_transaction(transactional_db, connector):
389
    from passerelle.utils.defer import deferrable_barrier
390
    from django.db import transaction
391

  
392
    qs = ResourceLog.objects.filter(message='coucou')
393
    # without deferrable_barrier logs are lost
394
    assert not qs.exists()
395
    try:
396
        with transaction.atomic():
397
            connector.logger.info('coucou')
398
            raise Exception
399
            assert qs.exists()
400
    except Exception:
401
        pass
402
    assert not qs.exists()
403

  
404
    # with deferrable_barrier logs are kept
405
    try:
406
        with deferrable_barrier:
407
            with transaction.atomic():
408
                connector.logger.info('coucou')
409
                raise Exception
410
                assert qs.exists()
411
    except Exception:
412
        pass
413
    assert qs.exists()
386
-