Skip to content

Commit 12c69c0

Browse files
committed
Added DateTime custom Scalar
1 parent 81560df commit 12c69c0

File tree

4 files changed

+32
-6
lines changed

4 files changed

+32
-6
lines changed

graphene/contrib/django/converter.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from ...core.types.definitions import List
44
from ...core.types.scalars import ID, Boolean, Float, Int, String
5-
from ...core.types.custom_scalars import JSONString
5+
from ...core.types.custom_scalars import JSONString, DateTime
66
from ...core.classtypes.enum import Enum
77
from .compat import RelatedObject, UUIDField, ArrayField, HStoreField, JSONField, RangeField
88
from .utils import get_related_model, import_single_dispatch
@@ -26,7 +26,6 @@ def convert_django_field(field):
2626
(field, field.__class__))
2727

2828

29-
@convert_django_field.register(models.DateField)
3029
@convert_django_field.register(models.CharField)
3130
@convert_django_field.register(models.TextField)
3231
@convert_django_field.register(models.EmailField)
@@ -69,6 +68,11 @@ def convert_field_to_float(field):
6968
return Float(description=field.help_text)
7069

7170

71+
@convert_django_field.register(models.DateField)
72+
def convert_date_to_string(field):
73+
return DateTime(description=field.help_text)
74+
75+
7276
@convert_django_field.register(models.ManyToManyField)
7377
@convert_django_field.register(models.ManyToOneRel)
7478
@convert_django_field.register(models.ManyToManyRel)

graphene/contrib/django/tests/test_converter.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from ..fields import (ConnectionOrListField,
99
DjangoModelField)
1010
from ..compat import MissingType, ArrayField, HStoreField, JSONField, RangeField
11-
from graphene.core.types.custom_scalars import JSONString
11+
from graphene.core.types.custom_scalars import JSONString, DateTime
1212

1313
from .models import Article, Reporter
1414

@@ -29,7 +29,7 @@ def test_should_unknown_django_field_raise_exception():
2929

3030

3131
def test_should_date_convert_string():
32-
assert_conversion(models.DateField, graphene.String)
32+
assert_conversion(models.DateField, DateTime)
3333

3434

3535
def test_should_char_convert_string():

graphene/contrib/django/tests/test_query.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import datetime
12
import pytest
23
from py.test import raises
34
from django.db import models
@@ -134,7 +135,7 @@ class Meta:
134135

135136
@classmethod
136137
def get_node(cls, id, info):
137-
return ArticleNode(Article(id=1, headline='Article node'))
138+
return ArticleNode(Article(id=1, headline='Article node', pub_date=datetime.date(2002, 3, 11)))
138139

139140
class Query(graphene.ObjectType):
140141
node = relay.NodeField()
@@ -167,6 +168,7 @@ def resolve_reporter(self, *args, **kwargs):
167168
}
168169
... on ArticleNode {
169170
headline
171+
pubDate
170172
}
171173
}
172174
}
@@ -187,7 +189,8 @@ def resolve_reporter(self, *args, **kwargs):
187189
},
188190
'myArticle': {
189191
'id': 'QXJ0aWNsZU5vZGU6MQ==',
190-
'headline': 'Article node'
192+
'headline': 'Article node',
193+
'pubDate': '2002-03-11',
191194
}
192195
}
193196
schema = graphene.Schema(query=Query)

graphene/core/types/custom_scalars.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import json
2+
import datetime
23

34
from graphql.core.language import ast
45
from ...core.classtypes.scalar import Scalar
@@ -19,3 +20,21 @@ def parse_literal(node):
1920
@staticmethod
2021
def parse_value(value):
2122
return json.dumps(value)
23+
24+
25+
class DateTime(Scalar):
26+
'''DateTime in ISO 8601 format'''
27+
28+
@staticmethod
29+
def serialize(dt):
30+
return dt.isoformat()
31+
32+
@staticmethod
33+
def parse_literal(node):
34+
if isinstance(node, ast.StringValue):
35+
return datetime.datetime.strptime(
36+
node.value, "%Y-%m-%dT%H:%M:%S.%f")
37+
38+
@staticmethod
39+
def parse_value(value):
40+
return datetime.datetime.strptime(value, "%Y-%m-%dT%H:%M:%S.%f")

0 commit comments

Comments
 (0)