From e071b7dfd53ca74f2b1dda5f93682d146d79bd13 Mon Sep 17 00:00:00 2001 From: Dave Cameron Date: Thu, 15 Mar 2018 16:51:57 -0400 Subject: [PATCH] The id__in field is a csv-separated string of ids drf_yasg is interpreting it as a number because NumericInFilter inherits from django's NumberFilter which explicitly identifies as being a DecimalField. --- netbox/netbox/settings.py | 4 ++++ netbox/utilities/custom_inspectors.py | 12 +++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index b326a7fbc..a296dbbd0 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -260,6 +260,10 @@ SWAGGER_SETTINGS = { 'drf_yasg.inspectors.SimpleFieldInspector', 'drf_yasg.inspectors.StringDefaultFieldInspector', ], + 'DEFAULT_FILTER_INSPECTORS': [ + 'utilities.custom_inspectors.IdInFilterInspector', + 'drf_yasg.inspectors.CoreAPICompatInspector', + ], 'DEFAULT_PAGINATOR_INSPECTORS': [ 'utilities.custom_inspectors.NullablePaginatorInspector', 'drf_yasg.inspectors.DjangoRestResponsePagination', diff --git a/netbox/utilities/custom_inspectors.py b/netbox/utilities/custom_inspectors.py index 25330ad67..b97506b85 100644 --- a/netbox/utilities/custom_inspectors.py +++ b/netbox/utilities/custom_inspectors.py @@ -1,5 +1,5 @@ from drf_yasg import openapi -from drf_yasg.inspectors import FieldInspector, NotHandled, PaginatorInspector +from drf_yasg.inspectors import FieldInspector, NotHandled, PaginatorInspector, FilterInspector from rest_framework.fields import ChoiceField from extras.api.customfields import CustomFieldsSerializer @@ -53,6 +53,16 @@ class NullableBooleanFieldInspector(FieldInspector): return result +class IdInFilterInspector(FilterInspector): + def process_result(self, result, method_name, obj, **kwargs): + if isinstance(result, list): + params = [p for p in result if isinstance(p, openapi.Parameter) and p.name == 'id__in'] + for p in params: + p.type = 'string' + + return result + + class NullablePaginatorInspector(PaginatorInspector): def process_result(self, result, method_name, obj, **kwargs): if method_name == 'get_paginated_response' and isinstance(result, openapi.Schema):