From bc359782fdc298044d9da0af0081b53c70ee7a2c Mon Sep 17 00:00:00 2001 From: Ryan P Kilby Date: Sun, 16 Oct 2016 19:13:12 -0400 Subject: [PATCH] Add coreapi/DRF compatibility --- django_filters/compat.py | 9 +++++++++ django_filters/rest_framework/backends.py | 6 +++--- tests/rest_framework/test_backends.py | 5 ++--- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/django_filters/compat.py b/django_filters/compat.py index e7fa88b..cbac451 100644 --- a/django_filters/compat.py +++ b/django_filters/compat.py @@ -1,4 +1,6 @@ +from __future__ import absolute_import + import django from django.conf import settings @@ -12,6 +14,13 @@ except ImportError: is_crispy = 'crispy_forms' in settings.INSTALLED_APPS and crispy_forms +# coreapi only compatible with DRF 3.4+ +try: + from rest_framework.compat import coreapi +except ImportError: + coreapi = None + + def remote_field(field): """ https://docs.djangoproject.com/en/1.9/releases/1.9/#field-rel-changes diff --git a/django_filters/rest_framework/backends.py b/django_filters/rest_framework/backends.py index eefc5fe..37c7dfa 100644 --- a/django_filters/rest_framework/backends.py +++ b/django_filters/rest_framework/backends.py @@ -2,7 +2,7 @@ from __future__ import absolute_import from django.template import Template, TemplateDoesNotExist, loader -from rest_framework.compat import coreapi, template_render +from rest_framework.compat import template_render from rest_framework.filters import BaseFilterBackend from .. import compat @@ -94,10 +94,10 @@ class DjangoFilterBackend(BaseFilterBackend): # This is not compatible with widgets where the query param differs from the # filter's attribute name. Notably, this includes `MultiWidget`, where query # params will be of the format `_0`, `_1`, etc... - assert coreapi is not None, 'coreapi must be installed to use `get_schema_fields()`' + assert compat.coreapi is not None, 'coreapi must be installed to use `get_schema_fields()`' filter_class = self.get_filter_class(view, view.get_queryset()) return [] if not filter_class else [ - coreapi.Field(name=field_name, required=False, location='query') + compat.coreapi.Field(name=field_name, required=False, location='query') for field_name in filter_class().filters.keys() ] diff --git a/tests/rest_framework/test_backends.py b/tests/rest_framework/test_backends.py index 496eecd..763d093 100644 --- a/tests/rest_framework/test_backends.py +++ b/tests/rest_framework/test_backends.py @@ -16,10 +16,9 @@ except ImportError: from django.core.urlresolvers import reverse from rest_framework import generics, serializers, status -from rest_framework.compat import coreapi from rest_framework.test import APIRequestFactory -from django_filters import filters +from django_filters import compat, filters from django_filters.rest_framework import DjangoFilterBackend, FilterSet from django_filters.rest_framework import backends @@ -123,7 +122,7 @@ urlpatterns = [ ] -@skipIf(coreapi is None, 'coreapi must be installed') +@skipIf(compat.coreapi is None, 'coreapi must be installed') class GetSchemaFieldsTests(TestCase): def test_fields_with_filter_fields_list(self): backend = DjangoFilterBackend()