Skip to content

Commit

Permalink
Merge pull request #3568 from jpadilla/decimal-validator
Browse files Browse the repository at this point in the history
Add compat util for DecimalValidator
  • Loading branch information
xordoquy committed Oct 30, 2015
2 parents 08e4a98 + 7d79cf3 commit ce491b3
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 2 deletions.
5 changes: 5 additions & 0 deletions rest_framework/compat.py
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,11 @@ def apply_markdown(text):
else:
DurationField = duration_string = parse_duration = None

try:
# DecimalValidator is unavailable in Django < 1.9
from django.core.validators import DecimalValidator
except ImportError:
DecimalValidator = None

def set_rollback():
if hasattr(transaction, 'set_rollback'):
Expand Down
3 changes: 2 additions & 1 deletion rest_framework/utils/field_mapping.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
from django.db import models
from django.utils.text import capfirst

from rest_framework.compat import DecimalValidator
from rest_framework.validators import UniqueValidator

NUMERIC_FIELD_TYPES = (
Expand Down Expand Up @@ -132,7 +133,7 @@ def get_field_kwargs(field_name, model_field):
if isinstance(model_field, models.DecimalField):
validator_kwarg = [
validator for validator in validator_kwarg
if not isinstance(validator, validators.DecimalValidator)
if DecimalValidator and not isinstance(validator, DecimalValidator)
]

# Ensure that max_length is passed explicitly as a keyword arg,
Expand Down
40 changes: 39 additions & 1 deletion tests/test_model_serializer.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@

from rest_framework import serializers
from rest_framework.compat import DurationField as ModelDurationField
from rest_framework.compat import unicode_repr
from rest_framework.compat import DecimalValidator, unicode_repr


def dedent(blocktext):
Expand Down Expand Up @@ -861,3 +861,41 @@ class Meta:
}]

assert serializer.data == expected


class DecimalFieldModel(models.Model):
decimal_field = models.DecimalField(
max_digits=3,
decimal_places=1,
validators=[MinValueValidator(1), MaxValueValidator(3)]
)


class TestDecimalFieldMappings(TestCase):
@pytest.mark.skipif(DecimalValidator is not None,
reason='DecimalValidator is available in Django 1.9+')
def test_decimal_field_has_no_decimal_validator(self):
"""
Test that a DecimalField has no validators before Django 1.9.
"""
class TestSerializer(serializers.ModelSerializer):
class Meta:
model = DecimalFieldModel

serializer = TestSerializer()

assert len(serializer.fields['decimal_field'].validators) == 0

@pytest.mark.skipif(DecimalValidator is None,
reason='DecimalValidator is available in Django 1.9+')
def test_decimal_field_has_decimal_validator(self):
"""
Test that a DecimalField has DecimalValidator in Django 1.9+.
"""
class TestSerializer(serializers.ModelSerializer):
class Meta:
model = DecimalFieldModel

serializer = TestSerializer()

assert len(serializer.fields['decimal_field'].validators) == 2

0 comments on commit ce491b3

Please sign in to comment.