Skip to content

Commit

Permalink
Merge 3dcb0ff into 9ddc13f
Browse files Browse the repository at this point in the history
  • Loading branch information
NdubisiOnuora committed Feb 25, 2019
2 parents 9ddc13f + 3dcb0ff commit fe0ee6d
Show file tree
Hide file tree
Showing 5 changed files with 40 additions and 3 deletions.
1 change: 1 addition & 0 deletions AUTHORS.rst
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,4 @@ Contributors
* Agam Dua - https://github.com/agamdua
* Marc Marta - https://github.com/mmarta
* ClairePhila - https://github.com/ClairePhila
* Ndubisi Onuora - https://github.com/NdubisiOnuora
5 changes: 5 additions & 0 deletions HISTORY.rst
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,11 @@
History
-------

0.3.4 (2019-02-25)
~~~~~~~~~~~~~~~~~~

* Added ``EnforceValidationFieldMixin.capture_failed_field`` to capture the optional fields that failed.

0.3.3 (2019-02-21)
~~~~~~~~~~~~~~~~~~

Expand Down
2 changes: 1 addition & 1 deletion drf_braces/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,4 @@

__author__ = 'Miroslav Shubernetskiy'
__email__ = 'miroslav@miki725.com'
__version__ = '0.3.3'
__version__ = '0.3.4'
16 changes: 14 additions & 2 deletions drf_braces/serializers/enforce_validation_serializer.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,13 +31,25 @@ def run_validation(self, data=empty):
if must_validate_fields is None or field_name in must_validate_fields:
raise
else:
self.capture_failed_field(field_name, data)
raise fields.SkipField(
'This field "{}" is being skipped as per enforce validation logic.'
''.format(field_name)
)

def capture_failed_field(self, field_name, field_data):
"""Hook for capturing invalid fields. This is used to track which fields have been skipped.
Args:
field_name (str): the name of the field whose data failed to validate
field_data (object): the data of the field that failed validation
def _create_enforce_validation_serializer(serializer, strict_mode_by_default=True):
Returns:
Not meant to return anything.
"""
pass


def _create_enforce_validation_serializer(serializer, strict_mode_by_default=True, validation_serializer_mixin_class=EnforceValidationFieldMixin):
"""
Recursively creates a copy of a given serializer which enforces ``must_validate_fields``.
Expand Down Expand Up @@ -129,7 +141,7 @@ def _create_enforce_validation_serializer(serializer, strict_mode_by_default=Tru
elif isinstance(field, serializers.Field):
replacement = add_base_class_to_instance(
field,
EnforceValidationFieldMixin,
validation_serializer_mixin_class,
new_name=get_class_name_with_new_suffix(
field.__class__,
'Field',
Expand Down
19 changes: 19 additions & 0 deletions drf_braces/tests/serializers/test_enforce_validation_serializer.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,19 @@ class TestManySerializer(serializers.Serializer):
many = TestSerializer(many=True)


class CaptureFailedFieldValidationFieldMixin(EnforceValidationFieldMixin):

def capture_failed_field(self, field_name, field_data):
self._failed_validation = {field_name: field_data}


class TestEnforceValidationFieldMixin(unittest.TestCase):
class Field(EnforceValidationFieldMixin, fields.IntegerField):
pass

class CaptureFailedField(CaptureFailedFieldValidationFieldMixin, fields.TimeField):
pass

def test_run_validation_must_validate(self):
field = self.Field()
field.field_name = 'field'
Expand Down Expand Up @@ -66,6 +75,16 @@ def test_run_validation_must_validate_ignore(self):
with self.assertRaises(serializers.SkipField):
field.run_validation('hello')

def test_run_validation_must_validate_ignore_capture(self):
field = self.CaptureFailedField()
field.field_name = 'field'
field.parent = mock.MagicMock(must_validate_fields=[''])

with self.assertRaises(serializers.SkipField):
field.run_validation('Bad Time')

self.assertDictEqual({'field': 'Bad Time'}, field._failed_validation)


class TestUtils(unittest.TestCase):
def test_add_base_class_to_instance(self):
Expand Down

0 comments on commit fe0ee6d

Please sign in to comment.