Skip to content

Commit

Permalink
Merge pull request #8 from dealertrack/form_serializer
Browse files Browse the repository at this point in the history
Form serializer bugfix
  • Loading branch information
miki725 committed Feb 29, 2016
2 parents 51fcaaa + 216b0b5 commit 0b04b09
Show file tree
Hide file tree
Showing 10 changed files with 43 additions and 16 deletions.
6 changes: 2 additions & 4 deletions .travis.yml
@@ -1,15 +1,13 @@
language: python

python:
- "3.4"
- "3.5"
- "2.7"
- "pypy"
- "pypy3"

env:
- "$DJANGO='django<1.7'"
- "$DJANGO='django<1.8'"
- "$DJANGO='django<1.9'"
- "$DJANGO='django<1.10'"

# command to install dependencies, e.g. pip install -r requirements.txt --use-mirrors
install:
Expand Down
6 changes: 6 additions & 0 deletions HISTORY.rst
Expand Up @@ -3,6 +3,12 @@
History
-------

0.1.6 (2016-02-29)
~~~~~~~~~~~~~~~~~~

* Fixed a bug in ``SerializerForm`` in which form cleaned data was replaced with serializer data
instead of updating it.

0.1.5 (2015-07-15)
~~~~~~~~~~~~~~~~~~

Expand Down
2 changes: 1 addition & 1 deletion drf_braces/__init__.py
Expand Up @@ -4,4 +4,4 @@

__author__ = 'Miroslav Shubernetskiy'
__email__ = 'miroslav@miki725.com'
__version__ = '0.1.5'
__version__ = '0.1.6'
8 changes: 7 additions & 1 deletion drf_braces/fields/modified.py
Expand Up @@ -27,8 +27,14 @@ def quantize(self, value):
class DateTimeField(fields.DateTimeField):
def __init__(self, *args, **kwargs):
super(DateTimeField, self).__init__(*args, **kwargs)
# allow fo the case when default_timezone is passed as None
# since super will in that use Django's default timezone
if 'default_timezone' in kwargs:
self.default_timezone = kwargs['default_timezone']
# DRF >= 3.3
if callable(self.default_timezone):
self.timezone = kwargs['default_timezone']
else:
self.default_timezone = kwargs['default_timezone']


__all__ = [name for name, value in locals().items()
Expand Down
2 changes: 1 addition & 1 deletion drf_braces/forms/serializer_form.py
Expand Up @@ -134,7 +134,7 @@ def _clean_form(self):
if not self.serializer.is_valid():
self._errors.update(self.serializer.errors)
else:
self.cleaned_data = self.serializer.validated_data
self.cleaned_data.update(self.serializer.validated_data)


class SerializerForm(six.with_metaclass(SerializerFormMeta, SerializerFormBase)):
Expand Down
5 changes: 4 additions & 1 deletion drf_braces/tests/fields/test_custom.py
Expand Up @@ -38,7 +38,10 @@ class TestUTCDateTimeField(unittest.TestCase):
def test_init(self):
field = UTCDateTimeField()

self.assertEqual(field.default_timezone, pytz.UTC)
self.assertEqual(
getattr(field, 'timezone', getattr(field, 'default_timezone', None)),
pytz.UTC
)


class TestNonValidatingChoiceField(unittest.TestCase):
Expand Down
9 changes: 5 additions & 4 deletions drf_braces/tests/fields/test_modified.py
Expand Up @@ -3,6 +3,7 @@
from decimal import Decimal

import pytz
from django.test.utils import override_settings

from drf_braces.fields.modified import BooleanField, DateTimeField, DecimalField

Expand Down Expand Up @@ -31,9 +32,9 @@ def test_quantize(self):


class TestDateTimeField(unittest.TestCase):
@override_settings(USE_TZ=True)
def test_init(self):
field = DateTimeField()
self.assertIsNone(field.default_timezone)
value = '2015-01-02T16:00'

field = DateTimeField(default_timezone=pytz.utc)
self.assertEqual(field.default_timezone, pytz.utc)
self.assertIsNotNone(DateTimeField(default_timezone=pytz.utc).run_validation(value).tzinfo)
self.assertIsNone(DateTimeField(default_timezone=None).run_validation(value).tzinfo)
14 changes: 11 additions & 3 deletions drf_braces/tests/forms/test_serializer_form.py
Expand Up @@ -178,12 +178,20 @@ def test_get_serializer(self, mock_get_serializer_context, mock_get_serializer_d

@mock.patch.object(SerializerFormBase, 'get_serializer')
def test_clean_form_valid(self, mock_get_serializer):
form = SerializerFormBase(data={})
class TestForm(SerializerFormBase):
hello = forms.CharField()

form = TestForm(data={'hello': 'world'})
mock_get_serializer.return_value.is_valid.return_value = True
mock_get_serializer.return_value.validated_data = {
'and': 'mars'
}

self.assertTrue(form.is_valid(), form.errors)

self.assertEqual(form.cleaned_data, mock_get_serializer.return_value.validated_data)
self.assertEqual(form.cleaned_data, {
'hello': 'world',
'and': 'mars',
})

@mock.patch.object(SerializerFormBase, 'get_serializer')
def test_clean_form_invalid(self, mock_get_serializer):
Expand Down
1 change: 1 addition & 0 deletions setup.py
Expand Up @@ -50,6 +50,7 @@ def read(fname):
'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.4',
'Programming Language :: Python :: 3.5',
'Development Status :: 2 - Pre-Alpha',
],
)
6 changes: 5 additions & 1 deletion tox.ini
@@ -1,11 +1,12 @@
[tox]
envlist =
{py27,py34,pypy,pypy3}-django{16,17,18}
{py27,py35,pypy}-django{18,19}-drf{32,33}

[testenv]
basepython =
py27: python2.7
py34: python3.4
py35: python3.5
pypy: pypy
pypy3: pypy3
setenv =
Expand All @@ -18,5 +19,8 @@ deps =
django16: django<1.7
django17: django<1.8
django18: django<1.9
django19: django<1.10
drf32: djangorestframework<3.3
drf33: djangorestframework
whitelist_externals =
make

0 comments on commit 0b04b09

Please sign in to comment.