diff --git a/graphene/types/datetime.py b/graphene/types/datetime.py index 7bfd9bd2..d8388f8d 100644 --- a/graphene/types/datetime.py +++ b/graphene/types/datetime.py @@ -1,5 +1,7 @@ import datetime +from dateutil.parser import isoparse + from graphql.error import GraphQLError from graphql.language import StringValueNode, print_ast @@ -71,7 +73,7 @@ class DateTime(Scalar): f"DateTime cannot represent non-string value: {repr(value)}" ) try: - return datetime.datetime.fromisoformat(value) + return isoparse(value) except ValueError: raise GraphQLError(f"DateTime cannot represent value: {repr(value)}") diff --git a/graphene/types/tests/test_datetime.py b/graphene/types/tests/test_datetime.py index 12927617..5d4cb604 100644 --- a/graphene/types/tests/test_datetime.py +++ b/graphene/types/tests/test_datetime.py @@ -226,6 +226,23 @@ def test_time_query_variable(sample_time): assert not result.errors assert result.data == {"time": isoformat} +def test_support_isoformat(): + isoformat = 20111104 + + # test time variable provided as Python time + result = schema.execute( + """query Test($time: Time){ time(at: $time) }""", + variables={"time": sample_time}, + ) + assert not result.errors + assert result.data == {"time": isoformat} + + # test time variable in string representation + result = schema.execute( + """query Test($time: Time){ time(at: $time) }""", variables={"time": isoformat} + ) + assert not result.errors + assert result.data == {"time": isoformat} def test_bad_variables(sample_date, sample_datetime, sample_time): def _test_bad_variables(type_, input_): diff --git a/setup.py b/setup.py index 33ceba50..b8db0e0c 100644 --- a/setup.py +++ b/setup.py @@ -84,6 +84,7 @@ setup( "graphql-core>=3.1,<3.3", "graphql-relay>=3.1,<3.3", "typing-extensions>=4.7.1,<5", + "python-dateutil>=2.7.0,<3" ], tests_require=tests_require, extras_require={"test": tests_require, "dev": dev_requires},