Skip to content
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

Add Django form mutations #217

Merged
merged 14 commits into from
Jun 5, 2018
Prev Previous commit
Next Next commit
Merge form converter modules
  • Loading branch information
Grant McConnaughey committed Oct 2, 2017
commit 666ddb2ff38eae171ed20ef8b467cd2cb0eaa8e0
2 changes: 1 addition & 1 deletion graphene_django/filter/utils.py
Original file line number Diff line number Diff line change
@@ -8,7 +8,7 @@ def get_filtering_args_from_filterset(filterset_class, type):
a Graphene Field. These arguments will be available to
filter against in the GraphQL
"""
from ..form_converter import convert_form_field
from ..forms.converter import convert_form_field

args = {}
for name, filter_field in six.iteritems(filterset_class.base_filters):
75 changes: 0 additions & 75 deletions graphene_django/form_converter.py

This file was deleted.

100 changes: 56 additions & 44 deletions graphene_django/forms/converter.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,17 @@
from django import forms
from django.core.exceptions import ImproperlyConfigured
from graphene_django.utils import import_single_dispatch

import graphene

from .forms import GlobalIDFormField, GlobalIDMultipleChoiceField
from .utils import import_single_dispatch

try:
UUIDField = forms.UUIDField
except AttributeError:
class UUIDField(object):
pass


singledispatch = import_single_dispatch()

@@ -23,68 +32,71 @@ def convert_form_to_input_type(form_class):


@singledispatch
def get_graphene_type_from_form_field(field):
def convert_form_field(field):
raise ImproperlyConfigured(
"Don't know how to convert the form field %s (%s) "
"to Graphene type" % (field, field.__class__)
"Don't know how to convert the Django form field %s (%s) "
"to Graphene type" %
(field, field.__class__)
)


def convert_form_field(field, is_input=True):
"""
Converts a Django form field to a graphql field and marks the field as
required if we are creating an input type and the field itself is required
"""
@convert_form_field.register(forms.BaseTemporalField)
@convert_form_field.register(forms.CharField)
@convert_form_field.register(forms.EmailField)
@convert_form_field.register(forms.SlugField)
@convert_form_field.register(forms.URLField)
@convert_form_field.register(forms.ChoiceField)
@convert_form_field.register(forms.RegexField)
@convert_form_field.register(forms.Field)
def convert_form_field_to_string(field):
return graphene.String(description=field.help_text, required=field.required)

graphql_type = get_graphene_type_from_form_field(field)

kwargs = {
'description': field.help_text,
'required': is_input and field.required,
}
@convert_form_field.register(UUIDField)
def convert_form_field_to_uuid(field):
return graphene.UUID(description=field.help_text, required=field.required)

# if it is a tuple or a list it means that we are returning
# the graphql type and the child type
if isinstance(graphql_type, (list, tuple)):
kwargs['of_type'] = graphql_type[1]
graphql_type = graphql_type[0]

return graphql_type(**kwargs)
@convert_form_field.register(forms.IntegerField)
@convert_form_field.register(forms.NumberInput)
def convert_form_field_to_int(field):
return graphene.Int(description=field.help_text, required=field.required)


@get_graphene_type_from_form_field.register(forms.CharField)
@get_graphene_type_from_form_field.register(forms.ChoiceField)
def convert_form_field_to_string(field):
return graphene.String
@convert_form_field.register(forms.BooleanField)
def convert_form_field_to_boolean(field):
return graphene.Boolean(description=field.help_text, required=True)


@get_graphene_type_from_form_field.register(forms.IntegerField)
def convert_form_field_to_int(field):
return graphene.Int
@convert_form_field.register(forms.NullBooleanField)
def convert_form_field_to_nullboolean(field):
return graphene.Boolean(description=field.help_text)


@get_graphene_type_from_form_field.register(forms.BooleanField)
def convert_form_field_to_bool(field):
return graphene.Boolean
@convert_form_field.register(forms.DecimalField)
@convert_form_field.register(forms.FloatField)
def convert_form_field_to_float(field):
return graphene.Float(description=field.help_text, required=field.required)


@get_graphene_type_from_form_field.register(forms.FloatField)
@get_graphene_type_from_form_field.register(forms.DecimalField)
def convert_form_field_to_float(field):
return graphene.Float
@convert_form_field.register(forms.ModelMultipleChoiceField)
@convert_form_field.register(GlobalIDMultipleChoiceField)
def convert_form_field_to_list(field):
return graphene.List(graphene.ID, required=field.required)


@get_graphene_type_from_form_field.register(forms.DateField)
@get_graphene_type_from_form_field.register(forms.DateTimeField)
def convert_form_field_to_datetime(field):
return graphene.types.datetime.DateTime
@convert_form_field.register(forms.ModelChoiceField)
@convert_form_field.register(GlobalIDFormField)
def convert_form_field_to_id(field):
return graphene.ID(required=field.required)


@get_graphene_type_from_form_field.register(forms.TimeField)
def convert_form_field_to_time(field):
return graphene.types.datetime.Time
@convert_form_field.register(forms.DateField)
@convert_form_field.register(forms.DateTimeField)
def convert_form_field_to_datetime(field):
return graphene.types.datetime.DateTime(description=field.help_text, required=field.required)


@get_graphene_type_from_form_field.register(forms.MultipleChoiceField)
def convert_form_field_to_list_of_string(field):
return (graphene.List, graphene.String)
@convert_form_field.register(forms.TimeField)
def convert_form_field_to_time(field):
return graphene.types.datetime.Time(description=field.help_text, required=field.required)
Original file line number Diff line number Diff line change
@@ -4,7 +4,7 @@
import graphene
from graphene import ID, List, NonNull

from ..form_converter import convert_form_field
from ..converter import convert_form_field
from .models import Reporter