Bladeren bron

Introduced ChoiceFieldSerializer for choice fields

Jeremy Stretch 9 jaren geleden
bovenliggende
commit
7040086201
3 gewijzigde bestanden met toevoegingen van 41 en 14 verwijderingen
  1. 15 12
      netbox/dcim/api/serializers.py
  2. 9 1
      netbox/ipam/api/serializers.py
  3. 17 1
      netbox/utilities/api.py

+ 15 - 12
netbox/dcim/api/serializers.py

@@ -2,13 +2,15 @@ from rest_framework import serializers
 
 
 from ipam.models import IPAddress
 from ipam.models import IPAddress
 from dcim.models import (
 from dcim.models import (
-    ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device, DeviceBay,
-    DeviceBayTemplate, DeviceType, DeviceRole, Interface, InterfaceConnection, InterfaceTemplate, Manufacturer, Module,
-    Platform, PowerOutlet, PowerOutletTemplate, PowerPort, PowerPortTemplate, Rack, RackGroup, RackRole, Site,
-    SUBDEVICE_ROLE_CHILD, SUBDEVICE_ROLE_PARENT,
+    CONNECTION_STATUS_CHOICES, ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device,
+    DeviceBay, DeviceBayTemplate, DeviceType, DeviceRole, IFACE_FF_CHOICES, IFACE_ORDERING_CHOICES, Interface,
+    InterfaceConnection, InterfaceTemplate, Manufacturer, Module, Platform, PowerOutlet, PowerOutletTemplate, PowerPort,
+    PowerPortTemplate, Rack, RackGroup, RackRole, RACK_FACE_CHOICES, RACK_TYPE_CHOICES, RACK_WIDTH_CHOICES, Site,
+    STATUS_CHOICES, SUBDEVICE_ROLE_CHOICES,
 )
 )
 from extras.api.serializers import CustomFieldValueSerializer
 from extras.api.serializers import CustomFieldValueSerializer
 from tenancy.api.serializers import NestedTenantSerializer
 from tenancy.api.serializers import NestedTenantSerializer
+from utilities.api import ChoiceFieldSerializer
 
 
 
 
 #
 #
@@ -102,6 +104,8 @@ class RackSerializer(serializers.ModelSerializer):
     group = NestedRackGroupSerializer()
     group = NestedRackGroupSerializer()
     tenant = NestedTenantSerializer()
     tenant = NestedTenantSerializer()
     role = NestedRackRoleSerializer()
     role = NestedRackRoleSerializer()
+    type = ChoiceFieldSerializer(choices=RACK_TYPE_CHOICES)
+    width = ChoiceFieldSerializer(choices=RACK_WIDTH_CHOICES)
     custom_field_values = CustomFieldValueSerializer(many=True)
     custom_field_values = CustomFieldValueSerializer(many=True)
 
 
     class Meta:
     class Meta:
@@ -155,7 +159,8 @@ class NestedManufacturerSerializer(serializers.ModelSerializer):
 
 
 class DeviceTypeSerializer(serializers.ModelSerializer):
 class DeviceTypeSerializer(serializers.ModelSerializer):
     manufacturer = NestedManufacturerSerializer()
     manufacturer = NestedManufacturerSerializer()
-    subdevice_role = serializers.SerializerMethodField()
+    interface_ordering = ChoiceFieldSerializer(choices=IFACE_ORDERING_CHOICES)
+    subdevice_role = ChoiceFieldSerializer(choices=SUBDEVICE_ROLE_CHOICES)
     instance_count = serializers.IntegerField(source='instances.count', read_only=True)
     instance_count = serializers.IntegerField(source='instances.count', read_only=True)
     custom_field_values = CustomFieldValueSerializer(many=True)
     custom_field_values = CustomFieldValueSerializer(many=True)
 
 
@@ -167,13 +172,6 @@ class DeviceTypeSerializer(serializers.ModelSerializer):
             'instance_count',
             'instance_count',
         ]
         ]
 
 
-    def get_subdevice_role(self, obj):
-        return {
-            SUBDEVICE_ROLE_PARENT: 'parent',
-            SUBDEVICE_ROLE_CHILD: 'child',
-            None: None,
-        }[obj.subdevice_role]
-
 
 
 class NestedDeviceTypeSerializer(serializers.ModelSerializer):
 class NestedDeviceTypeSerializer(serializers.ModelSerializer):
     url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicetype-detail')
     url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicetype-detail')
@@ -276,6 +274,7 @@ class WritablePowerOutletTemplateSerializer(serializers.ModelSerializer):
 
 
 class InterfaceTemplateSerializer(serializers.ModelSerializer):
 class InterfaceTemplateSerializer(serializers.ModelSerializer):
     device_type = NestedDeviceTypeSerializer()
     device_type = NestedDeviceTypeSerializer()
+    form_factor = ChoiceFieldSerializer(choices=IFACE_FF_CHOICES)
 
 
     class Meta:
     class Meta:
         model = InterfaceTemplate
         model = InterfaceTemplate
@@ -365,6 +364,8 @@ class DeviceSerializer(serializers.ModelSerializer):
     tenant = NestedTenantSerializer()
     tenant = NestedTenantSerializer()
     platform = NestedPlatformSerializer()
     platform = NestedPlatformSerializer()
     rack = NestedRackSerializer()
     rack = NestedRackSerializer()
+    face = ChoiceFieldSerializer(choices=RACK_FACE_CHOICES)
+    status = ChoiceFieldSerializer(choices=STATUS_CHOICES)
     primary_ip = DeviceIPAddressSerializer()
     primary_ip = DeviceIPAddressSerializer()
     primary_ip4 = DeviceIPAddressSerializer()
     primary_ip4 = DeviceIPAddressSerializer()
     primary_ip6 = DeviceIPAddressSerializer()
     primary_ip6 = DeviceIPAddressSerializer()
@@ -497,6 +498,7 @@ class WritablePowerPortSerializer(serializers.ModelSerializer):
 
 
 class InterfaceSerializer(serializers.ModelSerializer):
 class InterfaceSerializer(serializers.ModelSerializer):
     device = NestedDeviceSerializer()
     device = NestedDeviceSerializer()
+    form_factor = ChoiceFieldSerializer(choices=IFACE_FF_CHOICES)
     connection = serializers.SerializerMethodField(read_only=True)
     connection = serializers.SerializerMethodField(read_only=True)
     connected_interface = serializers.SerializerMethodField(read_only=True)
     connected_interface = serializers.SerializerMethodField(read_only=True)
 
 
@@ -581,6 +583,7 @@ class WritableModuleSerializer(serializers.ModelSerializer):
 class InterfaceConnectionSerializer(serializers.ModelSerializer):
 class InterfaceConnectionSerializer(serializers.ModelSerializer):
     interface_a = PeerInterfaceSerializer()
     interface_a = PeerInterfaceSerializer()
     interface_b = PeerInterfaceSerializer()
     interface_b = PeerInterfaceSerializer()
+    connection_status = ChoiceFieldSerializer(choices=CONNECTION_STATUS_CHOICES)
 
 
     class Meta:
     class Meta:
         model = InterfaceConnection
         model = InterfaceConnection

+ 9 - 1
netbox/ipam/api/serializers.py

@@ -2,8 +2,12 @@ from rest_framework import serializers
 
 
 from dcim.api.serializers import NestedDeviceSerializer, InterfaceSerializer, NestedSiteSerializer
 from dcim.api.serializers import NestedDeviceSerializer, InterfaceSerializer, NestedSiteSerializer
 from extras.api.serializers import CustomFieldValueSerializer
 from extras.api.serializers import CustomFieldValueSerializer
-from ipam.models import Aggregate, IPAddress, Prefix, RIR, Role, Service, VLAN, VLANGroup, VRF
+from ipam.models import (
+    Aggregate, IPAddress, IPADDRESS_STATUS_CHOICES, IP_PROTOCOL_CHOICES, Prefix, PREFIX_STATUS_CHOICES, RIR, Role,
+    Service, VLAN, VLAN_STATUS_CHOICES, VLANGroup, VRF,
+)
 from tenancy.api.serializers import NestedTenantSerializer
 from tenancy.api.serializers import NestedTenantSerializer
+from utilities.api import ChoiceFieldSerializer
 
 
 
 
 #
 #
@@ -135,6 +139,7 @@ class VLANSerializer(serializers.ModelSerializer):
     site = NestedSiteSerializer()
     site = NestedSiteSerializer()
     group = NestedVLANGroupSerializer()
     group = NestedVLANGroupSerializer()
     tenant = NestedTenantSerializer()
     tenant = NestedTenantSerializer()
+    status = ChoiceFieldSerializer(choices=VLAN_STATUS_CHOICES)
     role = NestedRoleSerializer()
     role = NestedRoleSerializer()
     custom_field_values = CustomFieldValueSerializer(many=True)
     custom_field_values = CustomFieldValueSerializer(many=True)
 
 
@@ -172,6 +177,7 @@ class PrefixSerializer(serializers.ModelSerializer):
     vrf = NestedVRFSerializer()
     vrf = NestedVRFSerializer()
     tenant = NestedTenantSerializer()
     tenant = NestedTenantSerializer()
     vlan = NestedVLANSerializer()
     vlan = NestedVLANSerializer()
+    status = ChoiceFieldSerializer(choices=PREFIX_STATUS_CHOICES)
     role = NestedRoleSerializer()
     role = NestedRoleSerializer()
     custom_field_values = CustomFieldValueSerializer(many=True)
     custom_field_values = CustomFieldValueSerializer(many=True)
 
 
@@ -207,6 +213,7 @@ class WritablePrefixSerializer(serializers.ModelSerializer):
 class IPAddressSerializer(serializers.ModelSerializer):
 class IPAddressSerializer(serializers.ModelSerializer):
     vrf = NestedVRFSerializer()
     vrf = NestedVRFSerializer()
     tenant = NestedTenantSerializer()
     tenant = NestedTenantSerializer()
+    status = ChoiceFieldSerializer(choices=IPADDRESS_STATUS_CHOICES)
     interface = InterfaceSerializer()
     interface = InterfaceSerializer()
     custom_field_values = CustomFieldValueSerializer(many=True)
     custom_field_values = CustomFieldValueSerializer(many=True)
 
 
@@ -242,6 +249,7 @@ class WritableIPAddressSerializer(serializers.ModelSerializer):
 
 
 class ServiceSerializer(serializers.ModelSerializer):
 class ServiceSerializer(serializers.ModelSerializer):
     device = NestedDeviceSerializer()
     device = NestedDeviceSerializer()
+    protocol = ChoiceFieldSerializer(choices=IP_PROTOCOL_CHOICES)
     ipaddresses = NestedIPAddressSerializer(many=True)
     ipaddresses = NestedIPAddressSerializer(many=True)
 
 
     class Meta:
     class Meta:

+ 17 - 1
netbox/utilities/api.py

@@ -1,5 +1,5 @@
 from rest_framework.exceptions import APIException
 from rest_framework.exceptions import APIException
-from rest_framework.serializers import ModelSerializer
+from rest_framework.serializers import Field
 
 
 
 
 WRITE_OPERATIONS = ['create', 'update', 'partial_update', 'delete']
 WRITE_OPERATIONS = ['create', 'update', 'partial_update', 'delete']
@@ -10,6 +10,22 @@ class ServiceUnavailable(APIException):
     default_detail = "Service temporarily unavailable, please try again later."
     default_detail = "Service temporarily unavailable, please try again later."
 
 
 
 
+class ChoiceFieldSerializer(Field):
+    """
+    Represent a ChoiceField as a list of (value, label) tuples.
+    """
+
+    def __init__(self, choices, **kwargs):
+        self._choices = choices
+        super(ChoiceFieldSerializer, self).__init__(**kwargs)
+
+    def to_representation(self, obj):
+        return self._choices[obj]
+
+    def to_internal_value(self, data):
+        return getattr(self._choices, data)
+
+
 class WritableSerializerMixin(object):
 class WritableSerializerMixin(object):
     """
     """
     Allow for the use of an alternate, writable serializer class for write operations (e.g. POST, PUT).
     Allow for the use of an alternate, writable serializer class for write operations (e.g. POST, PUT).