Introduced ChoiceFieldSerializer for choice fields

This commit is contained in:
Jeremy Stretch 2017-02-08 16:00:42 -05:00
parent 6f3c3b6d61
commit 7040086201
3 changed files with 41 additions and 14 deletions

View File

@ -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, CONNECTION_STATUS_CHOICES, ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device,
DeviceBayTemplate, DeviceType, DeviceRole, Interface, InterfaceConnection, InterfaceTemplate, Manufacturer, Module, DeviceBay, DeviceBayTemplate, DeviceType, DeviceRole, IFACE_FF_CHOICES, IFACE_ORDERING_CHOICES, Interface,
Platform, PowerOutlet, PowerOutletTemplate, PowerPort, PowerPortTemplate, Rack, RackGroup, RackRole, Site, InterfaceConnection, InterfaceTemplate, Manufacturer, Module, Platform, PowerOutlet, PowerOutletTemplate, PowerPort,
SUBDEVICE_ROLE_CHILD, SUBDEVICE_ROLE_PARENT, 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

View File

@ -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:

View File

@ -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).