From 2afc475c6ce374cadaeb1ea9129760b9d18523be Mon Sep 17 00:00:00 2001 From: mtyton Date: Fri, 12 Jan 2024 09:41:44 +0100 Subject: [PATCH] Fixed choice param issue --- audoma/drf/filters.py | 18 +++++++++++++----- audoma/schema.py | 2 ++ audoma/tests/test_schema.py | 5 ++++- docs/changelog.rst | 7 +++++++ setup.py | 2 +- 5 files changed, 27 insertions(+), 7 deletions(-) diff --git a/audoma/drf/filters.py b/audoma/drf/filters.py index ad8004c..90953a4 100644 --- a/audoma/drf/filters.py +++ b/audoma/drf/filters.py @@ -12,14 +12,22 @@ class DocumentedTypedChoiceFilter(df_filters.TypedChoiceFilter): """Extended TypedChoiceFilter to generate documentation automatically""" + def _parse_choices(self, choices): + if hasattr(choices, "get_api_choices"): + return choices.get_api_choices() + if isinstance(choices, dict): + return choices + if isinstance(choices, (list, tuple)): + if isinstance(choices[0], (list, tuple)): + return choices + else: + return tuple([(c, c) for c in choices]) + raise ValueError(f"Choices must be a dict, list or tuple, not {type(choices)}") + def __init__( self, full_choices: Union[NamedTuple, Tuple], parameter_name: str, **kwargs ) -> None: - self.parsed_choices = ( - full_choices.get_api_choices() - if hasattr(full_choices, "get_api_choices") - else full_choices - ) + self.parsed_choices = self._parse_choices(full_choices) if hasattr(full_choices, "get_value_by_name"): def coerce(value): diff --git a/audoma/schema.py b/audoma/schema.py index c678df7..7eb11cf 100644 --- a/audoma/schema.py +++ b/audoma/schema.py @@ -37,6 +37,8 @@ def resolve_filter_field( if choices and "x-choices" not in schema: schema["schema"]["x-choices"] = self._get_x_choices(choices) parsed_schemas.append(schema) + if not choices: + parsed_schemas.append(schema) return parsed_schemas diff --git a/audoma/tests/test_schema.py b/audoma/tests/test_schema.py index f1da985..1da9d4b 100644 --- a/audoma/tests/test_schema.py +++ b/audoma/tests/test_schema.py @@ -144,7 +144,10 @@ def test_get_x_choices_no_choices(self): result = self.extension.resolve_filter_field( self.view.schema, self.view.model, None, "company_rate", field ) - self.assertEqual(result, []) + self.assertEqual( + result, + [{"in": "query", "name": "company_rate", "schema": {"type": "string"}}], + ) class SearchFilterExtensionTestCase(TestCase): diff --git a/docs/changelog.rst b/docs/changelog.rst index c50f4be..183595b 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -1,5 +1,12 @@ ========== Changelog + +0.6.4 +====== + +Added Features +--------------- +* Fixed documentng native `django_filters` fields ========== 0.6.4 diff --git a/setup.py b/setup.py index 13bd1f5..08b3a05 100644 --- a/setup.py +++ b/setup.py @@ -45,7 +45,7 @@ def get_reqiuired_packages(): setup( name=name, - version="0.6.4", + version="0.6.6", packages=find_packages(), install_requires=get_reqiuired_packages(), description=description,