Skip to content

Commit 22968a6

Browse files
🐛 Fix enum introspection on search serializer schema
Search introspection from query parameters didn't take choices/enums into account, which is now fixed.
1 parent f37cde9 commit 22968a6

File tree

3 files changed

+28
-7
lines changed

3 files changed

+28
-7
lines changed

vng_api_common/inspectors/query.py

+1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ def get_filter_parameters(self, filter_backend):
3030
for parameter in fields:
3131
filter_field = filter_class.base_filters[parameter.name]
3232
model_field = get_target_field(queryset.model, parameter.name)
33+
parameter._filter_field = filter_field
3334

3435
help_text = filter_field.extra.get(
3536
"help_text", model_field.help_text if model_field else ""

vng_api_common/inspectors/view.py

+22-5
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,11 @@
1515
from ..geo import GeoMixin
1616
from ..permissions import BaseAuthRequired, get_required_scopes
1717
from ..search import is_search_view
18-
from ..serializers import FoutSerializer, ValidatieFoutSerializer
18+
from ..serializers import (
19+
FoutSerializer,
20+
ValidatieFoutSerializer,
21+
add_choice_values_help_text,
22+
)
1923

2024
logger = logging.getLogger(__name__)
2125

@@ -232,10 +236,23 @@ def get_request_serializer(self):
232236
)
233237

234238
filters = {}
235-
for filter_field in filter_fields:
236-
FieldClass = TYPE_TO_FIELDMAPPING[filter_field.type]
237-
filters[filter_field.name] = FieldClass(
238-
help_text=filter_field.description, required=filter_field.required
239+
for parameter in filter_fields:
240+
help_text = parameter.description
241+
# we can't get the verbose_label back from the enum, so the inspector
242+
# in vng_api_common.inspectors.fields leaves a filter field reference behind
243+
_filter_field = getattr(parameter, "_filter_field", None)
244+
choices = getattr(_filter_field, "extra", {}).get("choices", [])
245+
if choices:
246+
FieldClass = serializers.ChoiceField
247+
extra = {"choices": choices}
248+
value_display_mapping = add_choice_values_help_text(choices)
249+
help_text += f"\n\n{value_display_mapping}"
250+
else:
251+
FieldClass = TYPE_TO_FIELDMAPPING[parameter.type]
252+
extra = {}
253+
254+
filters[parameter.name] = FieldClass(
255+
help_text=help_text, required=parameter.required, **extra
239256
)
240257

241258
SearchSerializer = type(Base.__name__, (Base,), filters)

vng_api_common/serializers.py

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import datetime
22
from collections import OrderedDict
3+
from typing import Tuple, Union
34

45
from django.db import transaction
56

@@ -78,10 +79,12 @@ class ValidatieFoutSerializer(FoutSerializer):
7879
invalid_params = FieldValidationErrorSerializer(many=True)
7980

8081

81-
def add_choice_values_help_text(choices: DjangoChoices) -> str:
82+
def add_choice_values_help_text(choices: Union[DjangoChoices, Tuple[str, str]]) -> str:
8283
items = []
8384

84-
for key, value in choices.choices:
85+
_choices = choices.choices if issubclass(choices, DjangoChoices) else choices
86+
87+
for key, value in _choices:
8588
description = getattr(choices.get_choice(key), "description", None)
8689
if description:
8790
item = f"* `{key}` - ({value}) {description}"

0 commit comments

Comments
 (0)