Skip to content

Commit aa88c2f

Browse files
authored
Merge pull request #202 from novafloss/fix-unhandled-exceptions
Check for unicity in NestListSerializers
2 parents b324072 + 3c65eec commit aa88c2f

File tree

5 files changed

+42
-1
lines changed

5 files changed

+42
-1
lines changed

CHANGELOG.rst

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ ChangeLog
55
master (unreleased)
66
===================
77

8-
- Nothing here yet
8+
* Enforce unicity of keys in NestedListSerializers (#202)
9+
* Define __unicode__ and __str__ on models (#200)
10+
* Fix regression on presets_lists endpoint (#199)
911

1012
Release 0.8.1 (2017-03-07)
1113
==========================

demo/tests/tests_integration.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,15 @@ def test_simple(self):
8686
field.accesses.filter(access_id=access, level=level).exists()
8787
)
8888

89+
def test_fields_slug(self):
90+
data = deepcopy(form_data)
91+
# duplicate field
92+
data['fields'] *= 2
93+
res = self.client.post(
94+
reverse('formidable:form_create'), data, format='json'
95+
)
96+
self.assertEquals(res.status_code, 400)
97+
8998
def test_with_items_in_fields(self):
9099
initial_count = Formidable.objects.count()
91100
res = self.client.post(
@@ -179,6 +188,17 @@ def test_create_field_on_update(self):
179188
self.assertEquals(form.pk, self.form.pk)
180189
self.assertEquals(form.fields.count(), 2)
181190

191+
def test_duplicate_items_update(self):
192+
# create a form with items
193+
data = deepcopy(form_data_items)
194+
res = self.client.put(self.edit_url, data, format='json')
195+
self.assertEquals(res.status_code, 200)
196+
# update items with duplicate entries
197+
data['fields'] *= 2
198+
res = self.client.put(self.edit_url, data, format='json')
199+
# expect validation error
200+
self.assertEquals(res.status_code, 400)
201+
182202
def test_delete_field_on_update(self):
183203
self.form.fields.create(
184204
type_id='text', slug='textslug', label='mytext',

formidable/serializers/access.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ class AccessListSerializer(NestedListSerializer):
3636
parent_name = 'field_id'
3737

3838
def validate(self, data):
39+
data = super(AccessListSerializer, self).validate(data)
3940
accesses_id = [accesses['access_id'] for accesses in data]
4041

4142
for access in get_accesses():

formidable/serializers/fields.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ def validate(self, validated_data):
4141
order before the update/create method sorts the validated data
4242
by id.
4343
"""
44+
validated_data = super(FieldListSerializer, self).validate(
45+
validated_data)
4446
for index, data in enumerate(validated_data):
4547
data['order'] = index
4648

formidable/serializers/list.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import logging
66

7+
from rest_framework.exceptions import ValidationError
78
from rest_framework.serializers import ListSerializer
89

910
logger = logging.getLogger(__name__)
@@ -50,6 +51,21 @@ def _extract_id(self, qs, validated_data):
5051
deleted_ids = db_ids - validated_ids
5152
return created_ids, updated_ids, deleted_ids
5253

54+
def validate(self, data):
55+
"""
56+
ensure that field_id is unique among children
57+
"""
58+
data = super(NestedListSerializer, self).validate(data)
59+
60+
if self.field_id:
61+
if len(data) != len(set(f[self.field_id] for f in data)):
62+
msg = 'The fields {field_id} must make a unique set.'.format(
63+
field_id=self.field_id
64+
)
65+
raise ValidationError(msg, code='unique')
66+
67+
return data
68+
5369

5470
class NestedListSerializerDummyUpdate(NestedListSerializer):
5571

0 commit comments

Comments
 (0)