From 4015da3b6b3604e50186cf5497ce799e1d0ce03a Mon Sep 17 00:00:00 2001 From: sprhawk <465558+sprhawk@users.noreply.github.com> Date: Sun, 16 Jun 2019 15:06:24 +0800 Subject: [PATCH] resolve subtypes of postgres RangeField to new RangeType ( with lower and upper field --- graphene_django/compat.py | 6 ++++++ graphene_django/converter.py | 39 +++++++++++++++++++++++++++++++++- graphene_django/range_types.py | 29 +++++++++++++++++++++++++ graphene_django/types.py | 1 + 4 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 graphene_django/range_types.py diff --git a/graphene_django/compat.py b/graphene_django/compat.py index 59fab30..f20f126 100644 --- a/graphene_django/compat.py +++ b/graphene_django/compat.py @@ -10,6 +10,12 @@ try: HStoreField, JSONField, RangeField, + DateTimeRangeField, + DateRangeField, + IntegerRangeField, + BigIntegerRangeField, + FloatRangeField, + DecimalRangeField ) except ImportError: ArrayField, HStoreField, JSONField, RangeField = (MissingType,) * 4 diff --git a/graphene_django/converter.py b/graphene_django/converter.py index 1bb16f4..dcd3ac5 100644 --- a/graphene_django/converter.py +++ b/graphene_django/converter.py @@ -21,7 +21,26 @@ from graphene.types.json import JSONString from graphene.utils.str_converters import to_camel_case, to_const from graphql import assert_valid_name -from .compat import ArrayField, HStoreField, JSONField, RangeField +from .compat import ( + ArrayField, + HStoreField, + JSONField, + RangeField, + DateTimeRangeField, + DateRangeField, + IntegerRangeField, + BigIntegerRangeField, + FloatRangeField, + DecimalRangeField +) + +from .range_types import ( + DateRangeType, + DateTimeRangeType, + IntRangeType, + FloatRangeType +) + from .fields import DjangoListField, DjangoConnectionField from .utils import import_single_dispatch @@ -236,3 +255,21 @@ def convert_posgres_range_to_string(field, registry=None): if not isinstance(inner_type, (List, NonNull)): inner_type = type(inner_type) return List(inner_type, description=field.help_text, required=not field.null) + +@convert_django_field.register(DateTimeRangeField) +def convert_posgres_datetime_range_to_datetime(field, registry=None): + return Field(DateTimeRangeType, description=field.help_text, required=not field.null) + +@convert_django_field.register(DateRangeField) +def convert_posgres_date_range_to_date(field, registry=None): + return Field(DateRangeType, description=field.help_text, required=not field.null) + +@convert_django_field.register(IntegerRangeField) +@convert_django_field.register(BigIntegerRangeField) +def convert_posgres_int_range_to_int(field, registry=None): + return Field(IntRangeType, description=field.help_text, required=not field.null) + +@convert_django_field.register(FloatRangeField) +@convert_django_field.register(DecimalRangeField) +def convert_posgres_float_range_to_float(field, registry=None): + return Field(FloatRangeType, description=field.help_text, required=not field.null) diff --git a/graphene_django/range_types.py b/graphene_django/range_types.py new file mode 100644 index 0000000..641f09a --- /dev/null +++ b/graphene_django/range_types.py @@ -0,0 +1,29 @@ +from graphene import ObjectType +from graphene import ( + Float, + Int, + DateTime, + Date +) + +class RangeResolver: + def resolve_lower(parent, info): + return parent.lower + def resolve_upper(parent, info): + return parent.upper + +class DateTimeRangeType(RangeResolver, ObjectType): + lower = DateTime() + upper = DateTime() + +class DateRangeType(RangeResolver, ObjectType): + lower = Date() + upper = Date() + +class IntRangeType(RangeResolver, ObjectType): + lower = Int() + upper = Int() + +class FloatRangeType(RangeResolver, ObjectType): + lower = Float() + upper = Float() diff --git a/graphene_django/types.py b/graphene_django/types.py index a1e17b3..58663f0 100644 --- a/graphene_django/types.py +++ b/graphene_django/types.py @@ -165,3 +165,4 @@ class DjangoObjectType(ObjectType): class ErrorType(ObjectType): field = graphene.String(required=True) messages = graphene.List(graphene.NonNull(graphene.String), required=True) +