From b4b42db73efade255db1289eef5791843f95d594 Mon Sep 17 00:00:00 2001 From: Adam Charnock Date: Fri, 4 Dec 2015 17:48:33 +0000 Subject: [PATCH] Updating imports to work when singledispatch is available natively --- graphene/contrib/django/converter.py | 4 +++- graphene/contrib/django/filter/__init__.py | 8 +++++++ graphene/contrib/django/form_converter.py | 4 ++-- graphene/contrib/django/utils.py | 26 +++++++++++++++++++++- 4 files changed, 38 insertions(+), 4 deletions(-) diff --git a/graphene/contrib/django/converter.py b/graphene/contrib/django/converter.py index 255ec8a5..0722643b 100644 --- a/graphene/contrib/django/converter.py +++ b/graphene/contrib/django/converter.py @@ -1,8 +1,10 @@ from django.db import models -from singledispatch import singledispatch +from .utils import import_single_dispatch from ...core.types.scalars import ID, Boolean, Float, Int, String +singledispatch = import_single_dispatch() + try: UUIDField = models.UUIDField except AttributeError: diff --git a/graphene/contrib/django/filter/__init__.py b/graphene/contrib/django/filter/__init__.py index 21e65b56..78a9507b 100644 --- a/graphene/contrib/django/filter/__init__.py +++ b/graphene/contrib/django/filter/__init__.py @@ -1,3 +1,11 @@ +try: + import django_filters +except: + raise Exception( + "Use of django filtering requires the django-filter package " + "be installed. You can do so using `pip install django-filter`" + ) + from .fields import DjangoFilterConnectionField from .filterset import GrapheneFilterSet, GlobalIDFilter, GlobalIDMultipleChoiceFilter from .resolvers import FilterConnectionResolver diff --git a/graphene/contrib/django/form_converter.py b/graphene/contrib/django/form_converter.py index f5acf202..8acd574c 100644 --- a/graphene/contrib/django/form_converter.py +++ b/graphene/contrib/django/form_converter.py @@ -1,10 +1,10 @@ from django import forms from django.forms.fields import BaseTemporalField -from singledispatch import singledispatch - from graphene import String, Int, Boolean, Float, ID from graphene.contrib.django.forms import GlobalIDFormField, GlobalIDMultipleChoiceField +from graphene.contrib.django.utils import import_single_dispatch from graphene.core.types.definitions import List +singledispatch = import_single_dispatch() try: UUIDField = forms.UUIDField diff --git a/graphene/contrib/django/utils.py b/graphene/contrib/django/utils.py index 7c59e045..b4136eda 100644 --- a/graphene/contrib/django/utils.py +++ b/graphene/contrib/django/utils.py @@ -3,7 +3,6 @@ from django.db import models from django.db.models.manager import Manager from graphene import Argument, String -from graphene.contrib.django.form_converter import convert_form_field def get_type_for_model(schema, model): @@ -36,6 +35,8 @@ def get_filtering_args_from_filterset(filterset_class, type): a Graphene Field. These arguments will be available to filter against in the GraphQL """ + from graphene.contrib.django.form_converter import convert_form_field + args = {} for name, filter_field in six.iteritems(filterset_class.base_filters): field_type = Argument(convert_form_field(filter_field.field)) @@ -46,3 +47,26 @@ def get_filtering_args_from_filterset(filterset_class, type): # Also add the 'order_by' field args[filterset_class.order_by_field] = Argument(String) return args + + +def import_single_dispatch(): + singledispatch = None + try: + from functools import singledispatch + except ImportError: + pass + + try: + from singledispatch import singledispatch + except ImportError: + pass + + if not singledispatch: + raise Exception( + "It seems your python version does not include " + "functools.singledispatch. Please install the 'singledispatch' " + "package. More information here: " + "https://pypi.python.org/pypi/singledispatch" + ) + + return singledispatch