From e1a7d1983314174c91ede1ebbfe35a9009cf6268 Mon Sep 17 00:00:00 2001 From: Jarkko Piiroinen <183207+jmp@users.noreply.github.com> Date: Tue, 18 Jan 2022 16:03:08 +0200 Subject: [PATCH] Convert DecimalField to Decimal instead of Float in DRF and form converters (#1277) * Convert serializer DecimalField to Decimal * Convert form DecimalField to Decimal --- graphene_django/filter/tests/test_fields.py | 4 ++-- graphene_django/forms/converter.py | 22 +++++++++++++++++-- graphene_django/forms/tests/test_converter.py | 5 +++-- .../rest_framework/serializer_converter.py | 6 ++++- .../tests/test_field_converter.py | 4 ++-- 5 files changed, 32 insertions(+), 9 deletions(-) diff --git a/graphene_django/filter/tests/test_fields.py b/graphene_django/filter/tests/test_fields.py index 17b4630..7d440f4 100644 --- a/graphene_django/filter/tests/test_fields.py +++ b/graphene_django/filter/tests/test_fields.py @@ -5,7 +5,7 @@ import pytest from django.db.models import TextField, Value from django.db.models.functions import Concat -from graphene import Argument, Boolean, Field, Float, ObjectType, Schema, String +from graphene import Argument, Boolean, Decimal, Field, ObjectType, Schema, String from graphene.relay import Node from graphene_django import DjangoObjectType from graphene_django.forms import GlobalIDFormField, GlobalIDMultipleChoiceField @@ -401,7 +401,7 @@ def test_filterset_descriptions(): field = DjangoFilterConnectionField(ArticleNode, filterset_class=ArticleIdFilter) max_time = field.args["max_time"] assert isinstance(max_time, Argument) - assert max_time.type == Float + assert max_time.type == Decimal assert max_time.description == "The maximum time" diff --git a/graphene_django/forms/converter.py b/graphene_django/forms/converter.py index b64e478..47eb51d 100644 --- a/graphene_django/forms/converter.py +++ b/graphene_django/forms/converter.py @@ -3,7 +3,19 @@ from functools import singledispatch from django import forms from django.core.exceptions import ImproperlyConfigured -from graphene import ID, Boolean, Float, Int, List, String, UUID, Date, DateTime, Time +from graphene import ( + ID, + Boolean, + Decimal, + Float, + Int, + List, + String, + UUID, + Date, + DateTime, + Time, +) from .forms import GlobalIDFormField, GlobalIDMultipleChoiceField @@ -57,12 +69,18 @@ def convert_form_field_to_nullboolean(field): return Boolean(description=get_form_field_description(field)) -@convert_form_field.register(forms.DecimalField) @convert_form_field.register(forms.FloatField) def convert_form_field_to_float(field): return Float(description=get_form_field_description(field), required=field.required) +@convert_form_field.register(forms.DecimalField) +def convert_form_field_to_decimal(field): + return Decimal( + description=get_form_field_description(field), required=field.required + ) + + @convert_form_field.register(forms.MultipleChoiceField) def convert_form_field_to_string_list(field): return List( diff --git a/graphene_django/forms/tests/test_converter.py b/graphene_django/forms/tests/test_converter.py index ccf630f..05584a5 100644 --- a/graphene_django/forms/tests/test_converter.py +++ b/graphene_django/forms/tests/test_converter.py @@ -6,6 +6,7 @@ from graphene import ( String, Int, Boolean, + Decimal, Float, ID, UUID, @@ -97,8 +98,8 @@ def test_should_float_convert_float(): assert_conversion(forms.FloatField, Float) -def test_should_decimal_convert_float(): - assert_conversion(forms.DecimalField, Float) +def test_should_decimal_convert_decimal(): + assert_conversion(forms.DecimalField, Decimal) def test_should_multiple_choice_convert_list(): diff --git a/graphene_django/rest_framework/serializer_converter.py b/graphene_django/rest_framework/serializer_converter.py index b26e5e6..9835475 100644 --- a/graphene_django/rest_framework/serializer_converter.py +++ b/graphene_django/rest_framework/serializer_converter.py @@ -110,11 +110,15 @@ def convert_serializer_field_to_bool(field): @get_graphene_type_from_serializer_field.register(serializers.FloatField) -@get_graphene_type_from_serializer_field.register(serializers.DecimalField) def convert_serializer_field_to_float(field): return graphene.Float +@get_graphene_type_from_serializer_field.register(serializers.DecimalField) +def convert_serializer_field_to_decimal(field): + return graphene.Decimal + + @get_graphene_type_from_serializer_field.register(serializers.DateTimeField) def convert_serializer_field_to_datetime_time(field): return graphene.types.datetime.DateTime diff --git a/graphene_django/rest_framework/tests/test_field_converter.py b/graphene_django/rest_framework/tests/test_field_converter.py index daa8349..4858365 100644 --- a/graphene_django/rest_framework/tests/test_field_converter.py +++ b/graphene_django/rest_framework/tests/test_field_converter.py @@ -133,9 +133,9 @@ def test_should_float_convert_float(): assert_conversion(serializers.FloatField, graphene.Float) -def test_should_decimal_convert_float(): +def test_should_decimal_convert_decimal(): assert_conversion( - serializers.DecimalField, graphene.Float, max_digits=4, decimal_places=2 + serializers.DecimalField, graphene.Decimal, max_digits=4, decimal_places=2 )