Skip to content

Road to 2.0 #229

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 11 commits into from
Aug 27, 2017
1 change: 1 addition & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -64,3 +64,4 @@ deploy:
tags: true
password:
secure: kymIFCEPUbkgRqe2NAXkWfxMmGRfWvWBOP6LIXdVdkOOkm91fU7bndPGrAjos+/7gN0Org609ZmHSlVXNMJUWcsL2or/x5LcADJ4cZDe+79qynuoRb9xs1Ri4O4SBAuVMZxuVJvs8oUzT2R11ql5vASSMtXgbX+ZDGpmPRVZStkCuXgOc4LBhbPKyl3OFy7UQFPgAEmy3Yjh4ZSKzlXheK+S6mmr60+DCIjpaA0BWPxYK9FUE0qm7JJbHLUbwsUP/QMp5MmGjwFisXCNsIe686B7QKRaiOw62eJc2R7He8AuEC8T9OM4kRwDlecSn8mMpkoSB7QWtlJ+6XdLrJFPNvtrOfgfzS9/96Qrw9WlOslk68hMlhJeRb0s2YUD8tiV3UUkvbL1mfFoS4SI9U+rojS55KhUEJWHg1w7DjoOPoZmaIL2ChRupmvrFYNAGae1cxwG3Urh+t3wYlN3gpKsRDe5GOT7Wm2tr0ad3McCpDGUwSChX59BAJXe/MoLxkKScTrMyR8yMxHOF0b4zpVn5l7xB/o2Ik4zavx5q/0rGBMK2D+5d+gpQogKShoquTPsZUwO7sB5hYeH2hqGqpeGzZtb76E2zZYd18pJ0FsBudm5+KWjYdZ+vbtGrLxdTXJ1EEtzVXm0lscykTpqUucbXSa51dhStJvW2xEEz6p3rHo=
distributions: "sdist bdist_wheel"
8 changes: 3 additions & 5 deletions examples/starwars/schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ class Meta:
interfaces = (relay.Node, )

@classmethod
def get_node(cls, id, context, info):
def get_node(cls, info, id):
node = get_ship(id)
return node

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

@classmethod
def get_node(cls, id, context, info):
def get_node(cls, info, id):
return get_faction(id)


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

@classmethod
def mutate_and_get_payload(cls, input, context, info):
ship_name = input.get('ship_name')
faction_id = input.get('faction_id')
def mutate_and_get_payload(cls, root, info, ship_name, faction_id, client_mutation_id=None):
ship = create_ship(ship_name, faction_id)
faction = get_faction(faction_id)
return IntroduceShip(ship=ship, faction=faction)
Expand Down
9 changes: 7 additions & 2 deletions graphene_django/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,10 @@
DjangoConnectionField,
)

__all__ = ['DjangoObjectType',
'DjangoConnectionField']
__version__ = '2.0.dev2017073101'

__all__ = [
'__version__',
'DjangoObjectType',
'DjangoConnectionField'
]
23 changes: 17 additions & 6 deletions graphene_django/converter.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,14 @@
from django.utils.encoding import force_text

from graphene import (ID, Boolean, Dynamic, Enum, Field, Float, Int, List,
NonNull, String)
from graphene.relay import is_node
NonNull, String, UUID)
from graphene.types.datetime import DateTime, Time
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 .fields import get_connection_field, DjangoListField
from .fields import DjangoListField, DjangoConnectionField
from .utils import get_related_model, import_single_dispatch

singledispatch = import_single_dispatch()
Expand Down Expand Up @@ -79,11 +78,15 @@ def convert_field_to_string(field, registry=None):


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


@convert_django_field.register(models.UUIDField)
def convert_field_to_uuid(field, registry=None):
return UUID(description=field.help_text, required=not field.null)


@convert_django_field.register(models.PositiveIntegerField)
@convert_django_field.register(models.PositiveSmallIntegerField)
@convert_django_field.register(models.SmallIntegerField)
Expand Down Expand Up @@ -148,8 +151,16 @@ def dynamic_type():
if not _type:
return

if is_node(_type):
return get_connection_field(_type)
# If there is a connection, we should transform the field
# into a DjangoConnectionField
if _type._meta.connection:
# Use a DjangoFilterConnectionField if there are
# defined filter_fields in the DjangoObjectType Meta
if _type._meta.filter_fields:
from .filter.fields import DjangoFilterConnectionField
return DjangoFilterConnectionField(_type)

return DjangoConnectionField(_type)

return DjangoListField(_type)

Expand Down
5 changes: 3 additions & 2 deletions graphene_django/debug/middleware.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,8 @@ def disable_instrumentation(self):

class DjangoDebugMiddleware(object):

def resolve(self, next, root, args, context, info):
def resolve(self, next, root, info, **args):
context = info.context
django_debug = getattr(context, 'django_debug', None)
if not django_debug:
if context is None:
Expand All @@ -52,6 +53,6 @@ def resolve(self, next, root, args, context, info):
))
if info.schema.get_type('DjangoDebug') == info.return_type:
return context.django_debug.get_debug_promise()
promise = next(root, args, context, info)
promise = next(root, info, **args)
context.django_debug.add_promise(promise)
return promise
10 changes: 5 additions & 5 deletions graphene_django/debug/tests/test_query.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ class Query(graphene.ObjectType):
reporter = graphene.Field(ReporterType)
debug = graphene.Field(DjangoDebug, name='__debug')

def resolve_reporter(self, *args, **kwargs):
def resolve_reporter(self, info, **args):
return Reporter.objects.first()

query = '''
Expand Down Expand Up @@ -80,7 +80,7 @@ class Query(graphene.ObjectType):
all_reporters = graphene.List(ReporterType)
debug = graphene.Field(DjangoDebug, name='__debug')

def resolve_all_reporters(self, *args, **kwargs):
def resolve_all_reporters(self, info, **args):
return Reporter.objects.all()

query = '''
Expand Down Expand Up @@ -129,7 +129,7 @@ class Query(graphene.ObjectType):
all_reporters = DjangoConnectionField(ReporterType)
debug = graphene.Field(DjangoDebug, name='__debug')

def resolve_all_reporters(self, *args, **kwargs):
def resolve_all_reporters(self, info, **args):
return Reporter.objects.all()

query = '''
Expand Down Expand Up @@ -181,11 +181,11 @@ class Meta:
interfaces = (Node, )

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

def resolve_all_reporters(self, *args, **kwargs):
def resolve_all_reporters(self, info, **args):
return Reporter.objects.all()

query = '''
Expand Down
25 changes: 13 additions & 12 deletions graphene_django/fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
from graphql_relay.connection.arrayconnection import connection_from_list_slice

from .settings import graphene_settings
from .utils import DJANGO_FILTER_INSTALLED, maybe_queryset
from .utils import maybe_queryset


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

@staticmethod
def list_resolver(resolver, root, args, context, info):
return maybe_queryset(resolver(root, args, context, info))
def list_resolver(resolver, root, info, **args):
return maybe_queryset(resolver(root, info, **args))

def get_resolver(self, parent_resolver):
return partial(self.list_resolver, parent_resolver)
Expand All @@ -43,6 +43,14 @@ def __init__(self, *args, **kwargs):
)
super(DjangoConnectionField, self).__init__(*args, **kwargs)

@property
def type(self):
from .types import DjangoObjectType
_type = super(ConnectionField, self).type
assert issubclass(_type, DjangoObjectType), "DjangoConnectionField only accepts DjangoObjectType types"
assert _type._meta.connection, "The type {} doesn't have a connection".format(_type.__name__)
return _type._meta.connection

@property
def node_type(self):
return self.type._meta.node
Expand Down Expand Up @@ -89,7 +97,7 @@ def resolve_connection(cls, connection, default_manager, args, iterable):

@classmethod
def connection_resolver(cls, resolver, connection, default_manager, max_limit,
enforce_first_or_last, root, args, context, info):
enforce_first_or_last, root, info, **args):
first = args.get('first')
last = args.get('last')

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

iterable = resolver(root, args, context, info)
iterable = resolver(root, info, **args)
on_resolve = partial(cls.resolve_connection, connection, default_manager, args)

if Promise.is_thenable(iterable):
Expand All @@ -128,10 +136,3 @@ def get_resolver(self, parent_resolver):
self.max_limit,
self.enforce_first_or_last
)


def get_connection_field(*args, **kwargs):
if DJANGO_FILTER_INSTALLED:
from .filter.fields import DjangoFilterConnectionField
return DjangoFilterConnectionField(*args, **kwargs)
return DjangoConnectionField(*args, **kwargs)
8 changes: 3 additions & 5 deletions graphene_django/filter/fields.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
from collections import OrderedDict
from functools import partial

# from graphene.relay import is_node
from graphene.types.argument import to_arguments
from ..fields import DjangoConnectionField
from .utils import get_filtering_args_from_filterset, get_filterset_class
Expand Down Expand Up @@ -69,7 +68,7 @@ def merge_querysets(default_queryset, queryset):
@classmethod
def connection_resolver(cls, resolver, connection, default_manager, max_limit,
enforce_first_or_last, filterset_class, filtering_args,
root, args, context, info):
root, info, **args):
filter_kwargs = {k: v for k, v in args.items() if k in filtering_args}
qs = filterset_class(
data=filter_kwargs,
Expand All @@ -83,9 +82,8 @@ def connection_resolver(cls, resolver, connection, default_manager, max_limit,
max_limit,
enforce_first_or_last,
root,
args,
context,
info
info,
**args
)

def get_resolver(self, parent_resolver):
Expand Down
12 changes: 6 additions & 6 deletions graphene_django/filter/tests/test_fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -114,9 +114,9 @@ def test_filter_explicit_filterset_orderable():
assert_orderable(field)


def test_filter_shortcut_filterset_orderable_true():
field = DjangoFilterConnectionField(ReporterNode)
assert_not_orderable(field)
# def test_filter_shortcut_filterset_orderable_true():
# field = DjangoFilterConnectionField(ReporterNode)
# assert_not_orderable(field)


# def test_filter_shortcut_filterset_orderable_headline():
Expand Down Expand Up @@ -356,7 +356,7 @@ def test_recursive_filter_connection():
class ReporterFilterNode(DjangoObjectType):
child_reporters = DjangoFilterConnectionField(lambda: ReporterFilterNode)

def resolve_child_reporters(self, args, context, info):
def resolve_child_reporters(self, **args):
return []

class Meta:
Expand Down Expand Up @@ -399,7 +399,7 @@ class Query(ObjectType):
filterset_class=ReporterFilter
)

def resolve_all_reporters(self, args, context, info):
def resolve_all_reporters(self, info, **args):
return Reporter.objects.order_by('a_choice')

Reporter.objects.create(
Expand Down Expand Up @@ -499,7 +499,7 @@ class Query(ObjectType):
filterset_class=ReporterFilter
)

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

Reporter.objects.create(
Expand Down
8 changes: 6 additions & 2 deletions graphene_django/form_converter.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from django import forms
from django.forms.fields import BaseTemporalField

from graphene import ID, Boolean, Float, Int, List, String
from graphene import ID, Boolean, Float, Int, List, String, UUID

from .forms import GlobalIDFormField, GlobalIDMultipleChoiceField
from .utils import import_single_dispatch
Expand Down Expand Up @@ -32,11 +32,15 @@ def convert_form_field(field):
@convert_form_field.register(forms.ChoiceField)
@convert_form_field.register(forms.RegexField)
@convert_form_field.register(forms.Field)
@convert_form_field.register(UUIDField)
def convert_form_field_to_string(field):
return String(description=field.help_text, required=field.required)


@convert_form_field.register(UUIDField)
def convert_form_field_to_uuid(field):
return UUID(description=field.help_text, required=field.required)


@convert_form_field.register(forms.IntegerField)
@convert_form_field.register(forms.NumberInput)
def convert_form_field_to_int(field):
Expand Down
1 change: 1 addition & 0 deletions graphene_django/registry.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@

class Registry(object):

def __init__(self):
Expand Down
Loading