From 8136223bb1061da92a05031260d356388c2149a7 Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Sat, 15 Oct 2016 16:43:27 -0700 Subject: [PATCH] Added duration field and improved UUID conversion --- graphene_django/compat.py | 2 ++ graphene_django/converter.py | 5 +++-- graphene_django/tests/test_converter.py | 12 +++++++++++- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/graphene_django/compat.py b/graphene_django/compat.py index 4b1f55a..461dfef 100644 --- a/graphene_django/compat.py +++ b/graphene_django/compat.py @@ -5,9 +5,11 @@ class MissingType(object): pass try: + DurationField = models.DurationField UUIDField = models.UUIDField except AttributeError: # Improved compatibility for Django 1.6 + DurationField = MissingType UUIDField = MissingType try: diff --git a/graphene_django/converter.py b/graphene_django/converter.py index 4ae1e4e..22df6ca 100644 --- a/graphene_django/converter.py +++ b/graphene_django/converter.py @@ -10,7 +10,7 @@ from graphene.utils.str_converters import to_const from graphql import assert_valid_name from .compat import (ArrayField, HStoreField, JSONField, RangeField, - RelatedObject, UUIDField) + RelatedObject, UUIDField, DurationField) from .fields import get_connection_field, DjangoListField from .utils import get_related_model, import_single_dispatch @@ -71,12 +71,12 @@ def convert_django_field(field, registry=None): @convert_django_field.register(models.URLField) @convert_django_field.register(models.GenericIPAddressField) @convert_django_field.register(models.FileField) -@convert_django_field.register(UUIDField) def convert_field_to_string(field, registry=None): return String(description=field.help_text, required=not field.null) @convert_django_field.register(models.AutoField) +@convert_django_field.register(UUIDField) def convert_field_to_id(field, registry=None): return ID(description=field.help_text, required=not field.null) @@ -102,6 +102,7 @@ def convert_field_to_nullboolean(field, registry=None): @convert_django_field.register(models.DecimalField) @convert_django_field.register(models.FloatField) +@convert_django_field.register(DurationField) def convert_field_to_float(field, registry=None): return Float(description=field.help_text, required=not field.null) diff --git a/graphene_django/tests/test_converter.py b/graphene_django/tests/test_converter.py index c8b6e01..3467ed7 100644 --- a/graphene_django/tests/test_converter.py +++ b/graphene_django/tests/test_converter.py @@ -9,7 +9,7 @@ from graphene.types.datetime import DateTime from graphene.types.json import JSONString from ..compat import (ArrayField, HStoreField, JSONField, MissingType, - RangeField) + RangeField, UUIDField, DurationField) from ..converter import convert_django_field, convert_django_field_with_choices from ..registry import Registry from ..types import DjangoObjectType @@ -80,6 +80,16 @@ def test_should_auto_convert_id(): assert_conversion(models.AutoField, graphene.ID, primary_key=True) +@pytest.mark.skipif(UUIDField == MissingType, reason="requires Django UUIDField") +def test_should_auto_convert_id(): + assert_conversion(UUIDField, graphene.ID) + + +@pytest.mark.skipif(DurationField == MissingType, reason="requires Django DurationField") +def test_should_auto_convert_duration(): + assert_conversion(DurationField, graphene.Float) + + def test_should_positive_integer_convert_int(): assert_conversion(models.PositiveIntegerField, graphene.Int)