From d21881e207b318696f854a5d834e118defab3dbd Mon Sep 17 00:00:00 2001 From: Daniel Sheppard Date: Fri, 26 Jun 2020 10:57:11 -0500 Subject: [PATCH 1/3] #4695 - Add Metadata class that returns content type choices --- netbox/dcim/api/views.py | 2 ++ netbox/utilities/metadata.py | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+) create mode 100644 netbox/utilities/metadata.py diff --git a/netbox/dcim/api/views.py b/netbox/dcim/api/views.py index f70193903..ef9e2fdcc 100644 --- a/netbox/dcim/api/views.py +++ b/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 LimitedMetaData 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 = LimitedMetaData queryset = Cable.objects.prefetch_related( 'termination_a', 'termination_b' ) diff --git a/netbox/utilities/metadata.py b/netbox/utilities/metadata.py new file mode 100644 index 000000000..2e85126f2 --- /dev/null +++ b/netbox/utilities/metadata.py @@ -0,0 +1,18 @@ +from rest_framework.metadata import SimpleMetadata +from django.utils.encoding import force_str +from utilities.api import ContentTypeField + + +class LimitedMetaData(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() + ] + return field_info From 8179cfa4c1aaeb28a6fe0376ae5cf0e459c50ac1 Mon Sep 17 00:00:00 2001 From: Daniel Sheppard Date: Fri, 26 Jun 2020 11:09:27 -0500 Subject: [PATCH 2/3] #4695 - Rename LimitedMetaData to ContentTypeMetadata --- netbox/dcim/api/views.py | 4 ++-- netbox/utilities/metadata.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/netbox/dcim/api/views.py b/netbox/dcim/api/views.py index ef9e2fdcc..924f14a93 100644 --- a/netbox/dcim/api/views.py +++ b/netbox/dcim/api/views.py @@ -29,7 +29,7 @@ from utilities.api import ( get_serializer_for_model, IsAuthenticatedOrLoginNotRequired, ModelViewSet, ServiceUnavailable, ) from utilities.utils import get_subquery -from utilities.metadata import LimitedMetaData +from utilities.metadata import ContentTypeMetadata from virtualization.models import VirtualMachine from . import serializers from .exceptions import MissingFilterException @@ -568,7 +568,7 @@ class InterfaceConnectionViewSet(ListModelMixin, GenericViewSet): # class CableViewSet(ModelViewSet): - metadata_class = LimitedMetaData + metadata_class = ContentTypeMetadata queryset = Cable.objects.prefetch_related( 'termination_a', 'termination_b' ) diff --git a/netbox/utilities/metadata.py b/netbox/utilities/metadata.py index 2e85126f2..aceef03da 100644 --- a/netbox/utilities/metadata.py +++ b/netbox/utilities/metadata.py @@ -3,7 +3,7 @@ from django.utils.encoding import force_str from utilities.api import ContentTypeField -class LimitedMetaData(SimpleMetadata): +class ContentTypeMetadata(SimpleMetadata): def get_field_info(self, field): field_info = super().get_field_info(field) From b26fc811872caf3393be0a6b6c0800f5335ad2df Mon Sep 17 00:00:00 2001 From: Sander Steffann Date: Fri, 26 Jun 2020 18:42:08 +0200 Subject: [PATCH 3/3] Sort the list for consistent output --- netbox/utilities/metadata.py | 1 + 1 file changed, 1 insertion(+) diff --git a/netbox/utilities/metadata.py b/netbox/utilities/metadata.py index aceef03da..8fd664d5a 100644 --- a/netbox/utilities/metadata.py +++ b/netbox/utilities/metadata.py @@ -15,4 +15,5 @@ class ContentTypeMetadata(SimpleMetadata): } for choice_value, choice_name in field.choices.items() ] + field_info['choices'].sort(key=lambda item: item['display_name']) return field_info