Просмотр исходного кода

Merge pull request #4797 from netbox-community/4695_fix_api_cable_choices_termination_types

Fixes #4695 - Add Metadata class that returns content type choices
Jeremy Stretch 5 лет назад
Родитель
Сommit
7e8a4a2a77
2 измененных файлов с 21 добавлено и 0 удалено
  1. 2 0
      netbox/dcim/api/views.py
  2. 19 0
      netbox/utilities/metadata.py

+ 2 - 0
netbox/dcim/api/views.py

@@ -29,6 +29,7 @@ from utilities.api import (
     get_serializer_for_model, IsAuthenticatedOrLoginNotRequired, ModelViewSet, ServiceUnavailable,
 )
 from utilities.utils import get_subquery
+from utilities.metadata import ContentTypeMetadata
 from virtualization.models import VirtualMachine
 from . import serializers
 from .exceptions import MissingFilterException
@@ -567,6 +568,7 @@ class InterfaceConnectionViewSet(ListModelMixin, GenericViewSet):
 #
 
 class CableViewSet(ModelViewSet):
+    metadata_class = ContentTypeMetadata
     queryset = Cable.objects.prefetch_related(
         'termination_a', 'termination_b'
     )

+ 19 - 0
netbox/utilities/metadata.py

@@ -0,0 +1,19 @@
+from rest_framework.metadata import SimpleMetadata
+from django.utils.encoding import force_str
+from utilities.api import ContentTypeField
+
+
+class ContentTypeMetadata(SimpleMetadata):
+
+    def get_field_info(self, field):
+        field_info = super().get_field_info(field)
+        if hasattr(field, 'queryset') and not field_info.get('read_only') and isinstance(field, ContentTypeField):
+            field_info['choices'] = [
+                {
+                    'value': choice_value,
+                    'display_name': force_str(choice_name, strings_only=True)
+                }
+                for choice_value, choice_name in field.choices.items()
+            ]
+            field_info['choices'].sort(key=lambda item: item['display_name'])
+        return field_info