Skip to content

Commit ca0d1a3

Browse files
committed
Added RangeField conversion and testing
1 parent 7f96500 commit ca0d1a3

File tree

4 files changed

+66
-8
lines changed

4 files changed

+66
-8
lines changed

graphene/contrib/django/compat.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,6 @@ class MissingType(object):
1919

2020
try:
2121
# Postgres fields are only available in Django 1.8+
22-
from django.contrib.postgres.fields import ArrayField, HStoreField, JSONField
22+
from django.contrib.postgres.fields import ArrayField, HStoreField, JSONField, RangeField
2323
except ImportError:
24-
ArrayField, HStoreField, JSONField = (MissingType, ) * 3
24+
ArrayField, HStoreField, JSONField, RangeField = (MissingType, ) * 4

graphene/contrib/django/converter.py

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
from django.db import models
22

3+
from ...core.classtypes.objecttype import ObjectType
34
from ...core.types.definitions import List
5+
from ...core.types.field import Field
46
from ...core.types.scalars import ID, Boolean, Float, Int, String
57
from ...core.classtypes.enum import Enum
6-
from .compat import RelatedObject, UUIDField, ArrayField, HStoreField, JSONField
8+
from .compat import RelatedObject, UUIDField, ArrayField, HStoreField, JSONField, RangeField
79
from .utils import get_related_model, import_single_dispatch
810

911
singledispatch = import_single_dispatch()
@@ -34,8 +36,6 @@ def convert_django_field(field):
3436
@convert_django_field.register(models.GenericIPAddressField)
3537
@convert_django_field.register(models.FileField)
3638
@convert_django_field.register(UUIDField)
37-
@convert_django_field.register(HStoreField)
38-
@convert_django_field.register(JSONField)
3939
def convert_field_to_string(field):
4040
return String(description=field.help_text)
4141

@@ -95,6 +95,18 @@ def convert_field_to_djangomodel(field):
9595

9696

9797
@convert_django_field.register(ArrayField)
98-
def convert_field_to_list(field):
98+
def convert_postgres_array_to_list(field):
9999
base_type = convert_django_field(field.base_field)
100100
return List(base_type, description=field.help_text)
101+
102+
103+
@convert_django_field.register(HStoreField)
104+
@convert_django_field.register(JSONField)
105+
def convert_posgres_field_to_string(field):
106+
return String(description=field.help_text)
107+
108+
109+
@convert_django_field.register(RangeField)
110+
def convert_posgres_range_to_string(field):
111+
inner_type = convert_django_field(field.base_field)
112+
return List(inner_type, description=field.help_text)

graphene/contrib/django/tests/test_converter.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
convert_django_field, convert_django_field_with_choices)
88
from ..fields import (ConnectionOrListField,
99
DjangoModelField)
10-
from ..compat import MissingType, ArrayField, HStoreField, JSONField
10+
from ..compat import MissingType, ArrayField, HStoreField, JSONField, RangeField
1111

1212
from .models import Article, Reporter
1313

@@ -175,3 +175,11 @@ def test_should_postgres_hstore_convert_string():
175175
reason="JSONField should exist")
176176
def test_should_postgres_json_convert_string():
177177
assert_conversion(JSONField, graphene.String)
178+
179+
180+
@pytest.mark.skipif(RangeField is MissingType,
181+
reason="RangeField should exist")
182+
def test_should_postgres_range_convert_list():
183+
from django.contrib.postgres.fields import IntegerRangeField
184+
field = assert_conversion(IntegerRangeField, graphene.List)
185+
assert isinstance(field.type.of_type, graphene.Int)

graphene/contrib/django/tests/test_query.py

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
import pytest
22
from py.test import raises
3+
from django.db import models
34

45
import graphene
56
from graphene import relay
6-
from graphene.contrib.django import DjangoNode, DjangoObjectType
7+
from ..types import DjangoNode, DjangoObjectType
8+
from ..compat import MissingType, ArrayField, HStoreField, JSONField, RangeField
79

810
from .models import Article, Reporter
911

@@ -62,6 +64,42 @@ def resolve_reporter(self, *args, **kwargs):
6264
assert result.data == expected
6365

6466

67+
@pytest.mark.skipif(RangeField is MissingType,
68+
reason="RangeField should exist")
69+
def test_should_query_ranges():
70+
from django.contrib.postgres.fields import IntegerRangeField
71+
72+
class Event(models.Model):
73+
ages = IntegerRangeField(help_text='Range desc')
74+
75+
class EventType(DjangoObjectType):
76+
class Meta:
77+
model = Event
78+
79+
class Query(graphene.ObjectType):
80+
event = graphene.Field(EventType)
81+
82+
def resolve_event(self, *args, **kwargs):
83+
return Event(ages=(0, 10))
84+
85+
schema = graphene.Schema(query=Query)
86+
query = '''
87+
query myQuery {
88+
event {
89+
ages
90+
}
91+
}
92+
'''
93+
expected = {
94+
'event': {
95+
'ages': [0, 10],
96+
},
97+
}
98+
result = schema.execute(query)
99+
assert not result.errors
100+
assert result.data == expected
101+
102+
65103
def test_should_node():
66104
class ReporterNode(DjangoNode):
67105

0 commit comments

Comments
 (0)