Parcourir la source

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.
Dave Cameron il y a 7 ans
Parent
commit
e071b7dfd5
2 fichiers modifiés avec 15 ajouts et 1 suppressions
  1. 4 0
      netbox/netbox/settings.py
  2. 11 1
      netbox/utilities/custom_inspectors.py

+ 4 - 0
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',

+ 11 - 1
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):