diff --git a/graphene_django/__init__.py b/graphene_django/__init__.py index 5ba360f..bb328a7 100644 --- a/graphene_django/__init__.py +++ b/graphene_django/__init__.py @@ -5,7 +5,7 @@ from .fields import ( DjangoConnectionField, ) -__version__ = '2.0.0' +__version__ = '2.0.1' __all__ = [ '__version__', diff --git a/graphene_django/converter.py b/graphene_django/converter.py index dff77a8..dbcbbd5 100644 --- a/graphene_django/converter.py +++ b/graphene_django/converter.py @@ -3,7 +3,7 @@ from django.utils.encoding import force_text from graphene import (ID, Boolean, Dynamic, Enum, Field, Float, Int, List, NonNull, String, UUID) -from graphene.types.datetime import DateTime, Time +from graphene.types.datetime import DateTime, Date, Time from graphene.types.json import JSONString from graphene.utils.str_converters import to_camel_case, to_const from graphql import assert_valid_name @@ -121,9 +121,14 @@ def convert_field_to_float(field, registry=None): return Float(description=field.help_text, required=not field.null) +@convert_django_field.register(models.DateTimeField) +def convert_datetime_to_string(field, registry=None): + return DateTime(description=field.help_text, required=not field.null) + + @convert_django_field.register(models.DateField) def convert_date_to_string(field, registry=None): - return DateTime(description=field.help_text, required=not field.null) + return Date(description=field.help_text, required=not field.null) @convert_django_field.register(models.TimeField) diff --git a/graphene_django/filter/tests/test_fields.py b/graphene_django/filter/tests/test_fields.py index 258da3e..c730ef3 100644 --- a/graphene_django/filter/tests/test_fields.py +++ b/graphene_django/filter/tests/test_fields.py @@ -157,8 +157,8 @@ def test_filter_shortcut_filterset_context(): r1 = Reporter.objects.create(first_name='r1', last_name='r1', email='r1@test.com') r2 = Reporter.objects.create(first_name='r2', last_name='r2', email='r2@test.com') - Article.objects.create(headline='a1', pub_date=datetime.now(), reporter=r1, editor=r1) - Article.objects.create(headline='a2', pub_date=datetime.now(), reporter=r2, editor=r2) + Article.objects.create(headline='a1', pub_date=datetime.now(), pub_date_time=datetime.now(), reporter=r1, editor=r1) + Article.objects.create(headline='a2', pub_date=datetime.now(), pub_date_time=datetime.now(), reporter=r2, editor=r2) class context(object): reporter = r2 @@ -245,8 +245,8 @@ def test_filter_filterset_related_results(): r1 = Reporter.objects.create(first_name='r1', last_name='r1', email='r1@test.com') r2 = Reporter.objects.create(first_name='r2', last_name='r2', email='r2@test.com') - Article.objects.create(headline='a1', pub_date=datetime.now(), reporter=r1) - Article.objects.create(headline='a2', pub_date=datetime.now(), reporter=r2) + Article.objects.create(headline='a1', pub_date=datetime.now(), pub_date_time=datetime.now(), reporter=r1) + Article.objects.create(headline='a2', pub_date=datetime.now(), pub_date_time=datetime.now(), reporter=r2) query = ''' query { @@ -464,6 +464,7 @@ def test_should_query_filter_node_limit(): Article.objects.create( headline='Article Node 1', pub_date=datetime.now(), + pub_date_time=datetime.now(), reporter=r, editor=r, lang='es' @@ -471,6 +472,7 @@ def test_should_query_filter_node_limit(): Article.objects.create( headline='Article Node 2', pub_date=datetime.now(), + pub_date_time=datetime.now(), reporter=r, editor=r, lang='en' diff --git a/graphene_django/rest_framework/serializer_converter.py b/graphene_django/rest_framework/serializer_converter.py index 6a57f5f..44cb01d 100644 --- a/graphene_django/rest_framework/serializer_converter.py +++ b/graphene_django/rest_framework/serializer_converter.py @@ -92,9 +92,13 @@ def convert_serializer_field_to_float(field): @get_graphene_type_from_serializer_field.register(serializers.DateTimeField) +def convert_serializer_field_to_datetime_time(field): + return graphene.types.datetime.DateTime + + @get_graphene_type_from_serializer_field.register(serializers.DateField) def convert_serializer_field_to_date_time(field): - return graphene.types.datetime.DateTime + return graphene.types.datetime.Date @get_graphene_type_from_serializer_field.register(serializers.TimeField) diff --git a/graphene_django/rest_framework/tests/test_field_converter.py b/graphene_django/rest_framework/tests/test_field_converter.py index 623cf58..ec851c2 100644 --- a/graphene_django/rest_framework/tests/test_field_converter.py +++ b/graphene_django/rest_framework/tests/test_field_converter.py @@ -87,8 +87,8 @@ def test_should_date_time_convert_datetime(): assert_conversion(serializers.DateTimeField, graphene.types.datetime.DateTime) -def test_should_date_convert_datetime(): - assert_conversion(serializers.DateField, graphene.types.datetime.DateTime) +def test_should_date_convert_date(): + assert_conversion(serializers.DateField, graphene.types.datetime.Date) def test_should_time_convert_time(): diff --git a/graphene_django/tests/models.py b/graphene_django/tests/models.py index 406d184..ec81373 100644 --- a/graphene_django/tests/models.py +++ b/graphene_django/tests/models.py @@ -42,6 +42,7 @@ class Reporter(models.Model): class Article(models.Model): headline = models.CharField(max_length=100) pub_date = models.DateField() + pub_date_time = models.DateTimeField() reporter = models.ForeignKey(Reporter, related_name='articles') editor = models.ForeignKey(Reporter, related_name='edited_articles_+') lang = models.CharField(max_length=2, help_text='Language', choices=[ diff --git a/graphene_django/tests/test_converter.py b/graphene_django/tests/test_converter.py index d616106..3dd2963 100644 --- a/graphene_django/tests/test_converter.py +++ b/graphene_django/tests/test_converter.py @@ -5,7 +5,7 @@ from py.test import raises import graphene from graphene.relay import ConnectionField, Node -from graphene.types.datetime import DateTime, Time +from graphene.types.datetime import DateTime, Date, Time from graphene.types.json import JSONString from ..compat import JSONField, ArrayField, HStoreField, RangeField, MissingType @@ -38,9 +38,12 @@ def test_should_unknown_django_field_raise_exception(): convert_django_field(None) assert 'Don\'t know how to convert the Django field' in str(excinfo.value) +def test_should_date_time_convert_string(): + assert_conversion(models.DateTimeField, DateTime) + def test_should_date_convert_string(): - assert_conversion(models.DateField, DateTime) + assert_conversion(models.DateField, Date) def test_should_time_convert_string(): diff --git a/graphene_django/tests/test_form_converter.py b/graphene_django/tests/test_form_converter.py index 5a13554..97932d8 100644 --- a/graphene_django/tests/test_form_converter.py +++ b/graphene_django/tests/test_form_converter.py @@ -30,6 +30,8 @@ def test_should_date_convert_string(): def test_should_time_convert_string(): assert_conversion(forms.TimeField, graphene.String) +def test_should_date_convert_string(): + assert_conversion(forms.DateField, graphene.String) def test_should_date_time_convert_string(): assert_conversion(forms.DateTimeField, graphene.String) diff --git a/graphene_django/tests/test_query.py b/graphene_django/tests/test_query.py index c4c26f5..99b3060 100644 --- a/graphene_django/tests/test_query.py +++ b/graphene_django/tests/test_query.py @@ -371,6 +371,7 @@ def test_should_query_node_filtering(): Article.objects.create( headline='Article Node 1', pub_date=datetime.date.today(), + pub_date_time=datetime.datetime.now(), reporter=r, editor=r, lang='es' @@ -378,6 +379,7 @@ def test_should_query_node_filtering(): Article.objects.create( headline='Article Node 2', pub_date=datetime.date.today(), + pub_date_time=datetime.datetime.now(), reporter=r, editor=r, lang='en' @@ -453,6 +455,7 @@ def test_should_query_node_multiple_filtering(): Article.objects.create( headline='Article Node 1', pub_date=datetime.date.today(), + pub_date_time=datetime.datetime.now(), reporter=r, editor=r, lang='es' @@ -460,6 +463,7 @@ def test_should_query_node_multiple_filtering(): Article.objects.create( headline='Article Node 2', pub_date=datetime.date.today(), + pub_date_time=datetime.datetime.now(), reporter=r, editor=r, lang='es' @@ -467,6 +471,7 @@ def test_should_query_node_multiple_filtering(): Article.objects.create( headline='Article Node 3', pub_date=datetime.date.today(), + pub_date_time=datetime.datetime.now(), reporter=r, editor=r, lang='en' @@ -842,6 +847,7 @@ def test_should_query_dataloader_fields(): Article.objects.create( headline='Article Node 1', pub_date=datetime.date.today(), + pub_date_time=datetime.datetime.now(), reporter=r, editor=r, lang='es' @@ -849,6 +855,7 @@ def test_should_query_dataloader_fields(): Article.objects.create( headline='Article Node 2', pub_date=datetime.date.today(), + pub_date_time=datetime.datetime.now(), reporter=r, editor=r, lang='en' diff --git a/graphene_django/tests/test_types.py b/graphene_django/tests/test_types.py index a69870d..ca41f7a 100644 --- a/graphene_django/tests/test_types.py +++ b/graphene_django/tests/test_types.py @@ -64,7 +64,7 @@ def test_django_objecttype_map_correct_fields(): def test_django_objecttype_with_node_have_correct_fields(): fields = Article._meta.fields - assert list(fields.keys()) == ['id', 'headline', 'pub_date', 'reporter', 'editor', 'lang', 'importance'] + assert list(fields.keys()) == ['id', 'headline', 'pub_date', 'pub_date_time', 'reporter', 'editor', 'lang', 'importance'] def test_django_objecttype_with_custom_meta(): @@ -96,7 +96,8 @@ schema { type Article implements Node { id: ID! headline: String! - pubDate: DateTime! + pubDate: Date! + pubDateTime: DateTime! reporter: Reporter! editor: Reporter! lang: ArticleLang! @@ -124,6 +125,8 @@ enum ArticleLang { EN } +scalar Date + scalar DateTime interface Node { diff --git a/setup.py b/setup.py index 2e835d1..5e058b4 100644 --- a/setup.py +++ b/setup.py @@ -58,7 +58,7 @@ setup( install_requires=[ 'six>=1.10.0', - 'graphene>=2.0,<3', + 'graphene>=2.0.1,<3', django_version, 'iso8601', 'singledispatch>=3.4.0.3',