Skip to content

Commit 0395ad1

Browse files
authored
Merge pull request #221 from novafloss/transaction-atomic
Atomic transactions
2 parents 7676d32 + 65b0139 commit 0395ad1

File tree

3 files changed

+23
-2
lines changed

3 files changed

+23
-2
lines changed

CHANGELOG.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ ChangeLog
55
master (unreleased)
66
===================
77

8-
- Nothing changed yet.
8+
- Use an atomic transaction in FormidableSerialize.save() (#220)
99

1010
Release 0.9.0 (2017-04-11)
1111
==========================

demo/tests/test_end_point.py

+17-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44
import copy
55
from functools import reduce
66

7-
from django.test import TestCase
7+
from django.db import connection
8+
from django.test import TestCase, TransactionTestCase
9+
from django.test.utils import CaptureQueriesContext
810
import django_perf_rec
911

1012
from formidable import constants
@@ -859,6 +861,20 @@ def test_create_sepa(self):
859861
self.assertTrue(qs.exists())
860862

861863

864+
class CreateSerializerTransactionTestCase(TransactionTestCase):
865+
866+
def test_unique_transaction(self):
867+
data = copy.deepcopy(CreateSerializerTestCase.data)
868+
data['fields'] = CreateSerializerTestCase.fields_with_items
869+
serializer = FormidableSerializer(data=data)
870+
self.assertTrue(serializer.is_valid(), serializer.errors)
871+
with CaptureQueriesContext(connection) as capture:
872+
serializer.save()
873+
begin_count = sum(1 for query in capture.captured_queries
874+
if query['sql'] == 'BEGIN')
875+
self.assertEqual(begin_count, 1)
876+
877+
862878
class UpdateFormTestCase(TestCase):
863879

864880
data = {

formidable/serializers/forms.py

+5
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from __future__ import unicode_literals
44

55
from django.core.exceptions import ValidationError
6+
from django.db import transaction
67

78
from formidable.models import Formidable
89
from formidable.serializers import fields
@@ -59,6 +60,10 @@ def check_presets_cohesion(self, data):
5960
)
6061
return data
6162

63+
def save(self, *args, **kwargs):
64+
with transaction.atomic():
65+
return super(FormidableSerializer, self).save(*args, **kwargs)
66+
6267

6368
class ContextFormSerializer(serializers.ModelSerializer):
6469

0 commit comments

Comments
 (0)