Skip to content

Commit a4cc360

Browse files
authored
Merge branch 'master' into fix-deprecation-warnings
2 parents b0df510 + 6de94a7 commit a4cc360

23 files changed

+221
-254
lines changed

docs/filtering.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ Filtering
44
Graphene integrates with
55
`django-filter <https://django-filter.readthedocs.org>`__ to provide
66
filtering of results. See the `usage
7-
documentation <https://django-filter.readthedocs.org/en/latest/usage.html#the-filter>`__
7+
documentation <https://django-filter.readthedocs.io/en/latest/guide/usage.html#the-filter>`__
88
for details on the format for ``filter_fields``.
99

1010
This filtering is automatically available when implementing a ``relay.Node``.
@@ -26,7 +26,7 @@ Filterable fields
2626
The ``filter_fields`` parameter is used to specify the fields which can
2727
be filtered upon. The value specified here is passed directly to
2828
``django-filter``, so see the `filtering
29-
documentation <https://django-filter.readthedocs.org/en/latest/usage.html#the-filter>`__
29+
documentation <https://django-filter.readthedocs.io/en/latest/guide/usage.html#the-filter>`__
3030
for full details on the range of options available.
3131

3232
For example:

examples/starwars/schema.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ class Meta:
1616
interfaces = (relay.Node, )
1717

1818
@classmethod
19-
def get_node(cls, id, context, info):
19+
def get_node(cls, info, id):
2020
node = get_ship(id)
2121
return node
2222

@@ -34,7 +34,7 @@ class Meta:
3434
interfaces = (relay.Node, )
3535

3636
@classmethod
37-
def get_node(cls, id, context, info):
37+
def get_node(cls, info, id):
3838
return get_faction(id)
3939

4040

@@ -48,9 +48,7 @@ class Input:
4848
faction = graphene.Field(Faction)
4949

5050
@classmethod
51-
def mutate_and_get_payload(cls, input, context, info):
52-
ship_name = input.get('ship_name')
53-
faction_id = input.get('faction_id')
51+
def mutate_and_get_payload(cls, root, info, ship_name, faction_id, client_mutation_id=None):
5452
ship = create_ship(ship_name, faction_id)
5553
faction = get_faction(faction_id)
5654
return IntroduceShip(ship=ship, faction=faction)

graphene_django/__init__.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,10 @@
55
DjangoConnectionField,
66
)
77

8-
__all__ = ['DjangoObjectType',
9-
'DjangoConnectionField']
8+
__version__ = '2.0.dev2017073101'
9+
10+
__all__ = [
11+
'__version__',
12+
'DjangoObjectType',
13+
'DjangoConnectionField'
14+
]

graphene_django/converter.py

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,14 @@
22
from django.utils.encoding import force_text
33

44
from graphene import (ID, Boolean, Dynamic, Enum, Field, Float, Int, List,
5-
NonNull, String)
6-
from graphene.relay import is_node
5+
NonNull, String, UUID)
76
from graphene.types.datetime import DateTime, Time
87
from graphene.types.json import JSONString
98
from graphene.utils.str_converters import to_camel_case, to_const
109
from graphql import assert_valid_name
1110

1211
from .compat import ArrayField, HStoreField, JSONField, RangeField
13-
from .fields import get_connection_field, DjangoListField
12+
from .fields import DjangoListField, DjangoConnectionField
1413
from .utils import import_single_dispatch
1514

1615
singledispatch = import_single_dispatch()
@@ -79,11 +78,15 @@ def convert_field_to_string(field, registry=None):
7978

8079

8180
@convert_django_field.register(models.AutoField)
82-
@convert_django_field.register(models.UUIDField)
8381
def convert_field_to_id(field, registry=None):
8482
return ID(description=field.help_text, required=not field.null)
8583

8684

85+
@convert_django_field.register(models.UUIDField)
86+
def convert_field_to_uuid(field, registry=None):
87+
return UUID(description=field.help_text, required=not field.null)
88+
89+
8790
@convert_django_field.register(models.PositiveIntegerField)
8891
@convert_django_field.register(models.PositiveSmallIntegerField)
8992
@convert_django_field.register(models.SmallIntegerField)
@@ -148,8 +151,16 @@ def dynamic_type():
148151
if not _type:
149152
return
150153

151-
if is_node(_type):
152-
return get_connection_field(_type)
154+
# If there is a connection, we should transform the field
155+
# into a DjangoConnectionField
156+
if _type._meta.connection:
157+
# Use a DjangoFilterConnectionField if there are
158+
# defined filter_fields in the DjangoObjectType Meta
159+
if _type._meta.filter_fields:
160+
from .filter.fields import DjangoFilterConnectionField
161+
return DjangoFilterConnectionField(_type)
162+
163+
return DjangoConnectionField(_type)
153164

154165
return DjangoListField(_type)
155166

graphene_django/debug/middleware.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ def disable_instrumentation(self):
3939

4040
class DjangoDebugMiddleware(object):
4141

42-
def resolve(self, next, root, args, context, info):
42+
def resolve(self, next, root, info, **args):
43+
context = info.context
4344
django_debug = getattr(context, 'django_debug', None)
4445
if not django_debug:
4546
if context is None:
@@ -52,6 +53,6 @@ def resolve(self, next, root, args, context, info):
5253
))
5354
if info.schema.get_type('DjangoDebug') == info.return_type:
5455
return context.django_debug.get_debug_promise()
55-
promise = next(root, args, context, info)
56+
promise = next(root, info, **args)
5657
context.django_debug.add_promise(promise)
5758
return promise

graphene_django/debug/tests/test_query.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class Query(graphene.ObjectType):
3333
reporter = graphene.Field(ReporterType)
3434
debug = graphene.Field(DjangoDebug, name='__debug')
3535

36-
def resolve_reporter(self, *args, **kwargs):
36+
def resolve_reporter(self, info, **args):
3737
return Reporter.objects.first()
3838

3939
query = '''
@@ -80,7 +80,7 @@ class Query(graphene.ObjectType):
8080
all_reporters = graphene.List(ReporterType)
8181
debug = graphene.Field(DjangoDebug, name='__debug')
8282

83-
def resolve_all_reporters(self, *args, **kwargs):
83+
def resolve_all_reporters(self, info, **args):
8484
return Reporter.objects.all()
8585

8686
query = '''
@@ -129,7 +129,7 @@ class Query(graphene.ObjectType):
129129
all_reporters = DjangoConnectionField(ReporterType)
130130
debug = graphene.Field(DjangoDebug, name='__debug')
131131

132-
def resolve_all_reporters(self, *args, **kwargs):
132+
def resolve_all_reporters(self, info, **args):
133133
return Reporter.objects.all()
134134

135135
query = '''
@@ -181,11 +181,11 @@ class Meta:
181181
interfaces = (Node, )
182182

183183
class Query(graphene.ObjectType):
184-
all_reporters = DjangoFilterConnectionField(ReporterType)
184+
all_reporters = DjangoFilterConnectionField(ReporterType, fields=['last_name'])
185185
s = graphene.String(resolver=lambda *_: "S")
186186
debug = graphene.Field(DjangoDebug, name='__debug')
187187

188-
def resolve_all_reporters(self, *args, **kwargs):
188+
def resolve_all_reporters(self, info, **args):
189189
return Reporter.objects.all()
190190

191191
query = '''

graphene_django/fields.py

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from graphql_relay.connection.arrayconnection import connection_from_list_slice
1010

1111
from .settings import graphene_settings
12-
from .utils import DJANGO_FILTER_INSTALLED, maybe_queryset
12+
from .utils import maybe_queryset
1313

1414

1515
class DjangoListField(Field):
@@ -22,8 +22,8 @@ def model(self):
2222
return self.type.of_type._meta.node._meta.model
2323

2424
@staticmethod
25-
def list_resolver(resolver, root, args, context, info):
26-
return maybe_queryset(resolver(root, args, context, info))
25+
def list_resolver(resolver, root, info, **args):
26+
return maybe_queryset(resolver(root, info, **args))
2727

2828
def get_resolver(self, parent_resolver):
2929
return partial(self.list_resolver, parent_resolver)
@@ -43,6 +43,14 @@ def __init__(self, *args, **kwargs):
4343
)
4444
super(DjangoConnectionField, self).__init__(*args, **kwargs)
4545

46+
@property
47+
def type(self):
48+
from .types import DjangoObjectType
49+
_type = super(ConnectionField, self).type
50+
assert issubclass(_type, DjangoObjectType), "DjangoConnectionField only accepts DjangoObjectType types"
51+
assert _type._meta.connection, "The type {} doesn't have a connection".format(_type.__name__)
52+
return _type._meta.connection
53+
4654
@property
4755
def node_type(self):
4856
return self.type._meta.node
@@ -89,7 +97,7 @@ def resolve_connection(cls, connection, default_manager, args, iterable):
8997

9098
@classmethod
9199
def connection_resolver(cls, resolver, connection, default_manager, max_limit,
92-
enforce_first_or_last, root, args, context, info):
100+
enforce_first_or_last, root, info, **args):
93101
first = args.get('first')
94102
last = args.get('last')
95103

@@ -111,7 +119,7 @@ def connection_resolver(cls, resolver, connection, default_manager, max_limit,
111119
).format(first, info.field_name, max_limit)
112120
args['last'] = min(last, max_limit)
113121

114-
iterable = resolver(root, args, context, info)
122+
iterable = resolver(root, info, **args)
115123
on_resolve = partial(cls.resolve_connection, connection, default_manager, args)
116124

117125
if Promise.is_thenable(iterable):
@@ -128,10 +136,3 @@ def get_resolver(self, parent_resolver):
128136
self.max_limit,
129137
self.enforce_first_or_last
130138
)
131-
132-
133-
def get_connection_field(*args, **kwargs):
134-
if DJANGO_FILTER_INSTALLED:
135-
from .filter.fields import DjangoFilterConnectionField
136-
return DjangoFilterConnectionField(*args, **kwargs)
137-
return DjangoConnectionField(*args, **kwargs)

graphene_django/filter/fields.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
from collections import OrderedDict
22
from functools import partial
33

4-
# from graphene.relay import is_node
54
from graphene.types.argument import to_arguments
65
from ..fields import DjangoConnectionField
76
from .utils import get_filtering_args_from_filterset, get_filterset_class
@@ -69,7 +68,7 @@ def merge_querysets(default_queryset, queryset):
6968
@classmethod
7069
def connection_resolver(cls, resolver, connection, default_manager, max_limit,
7170
enforce_first_or_last, filterset_class, filtering_args,
72-
root, args, context, info):
71+
root, info, **args):
7372
filter_kwargs = {k: v for k, v in args.items() if k in filtering_args}
7473
qs = filterset_class(
7574
data=filter_kwargs,
@@ -83,9 +82,8 @@ def connection_resolver(cls, resolver, connection, default_manager, max_limit,
8382
max_limit,
8483
enforce_first_or_last,
8584
root,
86-
args,
87-
context,
88-
info
85+
info,
86+
**args
8987
)
9088

9189
def get_resolver(self, parent_resolver):

graphene_django/filter/tests/test_fields.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -114,9 +114,9 @@ def test_filter_explicit_filterset_orderable():
114114
assert_orderable(field)
115115

116116

117-
def test_filter_shortcut_filterset_orderable_true():
118-
field = DjangoFilterConnectionField(ReporterNode)
119-
assert_not_orderable(field)
117+
# def test_filter_shortcut_filterset_orderable_true():
118+
# field = DjangoFilterConnectionField(ReporterNode)
119+
# assert_not_orderable(field)
120120

121121

122122
# def test_filter_shortcut_filterset_orderable_headline():
@@ -356,7 +356,7 @@ def test_recursive_filter_connection():
356356
class ReporterFilterNode(DjangoObjectType):
357357
child_reporters = DjangoFilterConnectionField(lambda: ReporterFilterNode)
358358

359-
def resolve_child_reporters(self, args, context, info):
359+
def resolve_child_reporters(self, **args):
360360
return []
361361

362362
class Meta:
@@ -399,7 +399,7 @@ class Query(ObjectType):
399399
filterset_class=ReporterFilter
400400
)
401401

402-
def resolve_all_reporters(self, args, context, info):
402+
def resolve_all_reporters(self, info, **args):
403403
return Reporter.objects.order_by('a_choice')
404404

405405
Reporter.objects.create(
@@ -499,7 +499,7 @@ class Query(ObjectType):
499499
filterset_class=ReporterFilter
500500
)
501501

502-
def resolve_all_reporters(self, args, context, info):
502+
def resolve_all_reporters(self, info, **args):
503503
return Reporter.objects.order_by('a_choice')[:2]
504504

505505
Reporter.objects.create(

graphene_django/form_converter.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from django import forms
22
from django.forms.fields import BaseTemporalField
33

4-
from graphene import ID, Boolean, Float, Int, List, String
4+
from graphene import ID, Boolean, Float, Int, List, String, UUID
55

66
from .forms import GlobalIDFormField, GlobalIDMultipleChoiceField
77
from .utils import import_single_dispatch
@@ -32,11 +32,15 @@ def convert_form_field(field):
3232
@convert_form_field.register(forms.ChoiceField)
3333
@convert_form_field.register(forms.RegexField)
3434
@convert_form_field.register(forms.Field)
35-
@convert_form_field.register(UUIDField)
3635
def convert_form_field_to_string(field):
3736
return String(description=field.help_text, required=field.required)
3837

3938

39+
@convert_form_field.register(UUIDField)
40+
def convert_form_field_to_uuid(field):
41+
return UUID(description=field.help_text, required=field.required)
42+
43+
4044
@convert_form_field.register(forms.IntegerField)
4145
@convert_form_field.register(forms.NumberInput)
4246
def convert_form_field_to_int(field):

graphene_django/registry.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
12
class Registry(object):
23

34
def __init__(self):

0 commit comments

Comments
 (0)