1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00

Re-implemented CustomFieldSerializer (read-only for now)

This commit is contained in:
Jeremy Stretch
2017-02-09 16:55:54 -05:00
parent 7040086201
commit 0e04d20762
5 changed files with 55 additions and 72 deletions

View File

@ -2,7 +2,7 @@ from rest_framework import serializers
from circuits.models import Provider, Circuit, CircuitTermination, CircuitType from circuits.models import Provider, Circuit, CircuitTermination, CircuitType
from dcim.api.serializers import NestedSiteSerializer, InterfaceSerializer from dcim.api.serializers import NestedSiteSerializer, InterfaceSerializer
from extras.api.serializers import CustomFieldValueSerializer from extras.api.serializers import CustomFieldModelSerializer
from tenancy.api.serializers import NestedTenantSerializer from tenancy.api.serializers import NestedTenantSerializer
@ -10,14 +10,13 @@ from tenancy.api.serializers import NestedTenantSerializer
# Providers # Providers
# #
class ProviderSerializer(serializers.ModelSerializer): class ProviderSerializer(CustomFieldModelSerializer):
custom_field_values = CustomFieldValueSerializer(many=True)
class Meta: class Meta:
model = Provider model = Provider
fields = [ fields = [
'id', 'name', 'slug', 'asn', 'account', 'portal_url', 'noc_contact', 'admin_contact', 'comments', 'id', 'name', 'slug', 'asn', 'account', 'portal_url', 'noc_contact', 'admin_contact', 'comments',
'custom_field_values', 'custom_fields',
] ]
@ -61,17 +60,16 @@ class NestedCircuitTypeSerializer(serializers.ModelSerializer):
# Circuits # Circuits
# #
class CircuitSerializer(serializers.ModelSerializer): class CircuitSerializer(CustomFieldModelSerializer):
provider = NestedProviderSerializer() provider = NestedProviderSerializer()
type = NestedCircuitTypeSerializer() type = NestedCircuitTypeSerializer()
tenant = NestedTenantSerializer() tenant = NestedTenantSerializer()
custom_field_values = CustomFieldValueSerializer(many=True)
class Meta: class Meta:
model = Circuit model = Circuit
fields = [ fields = [
'id', 'cid', 'provider', 'type', 'tenant', 'install_date', 'commit_rate', 'description', 'comments', 'id', 'cid', 'provider', 'type', 'tenant', 'install_date', 'commit_rate', 'description', 'comments',
'custom_field_values', 'custom_fields',
] ]

View File

@ -8,7 +8,7 @@ from dcim.models import (
PowerPortTemplate, Rack, RackGroup, RackRole, RACK_FACE_CHOICES, RACK_TYPE_CHOICES, RACK_WIDTH_CHOICES, Site, PowerPortTemplate, Rack, RackGroup, RackRole, RACK_FACE_CHOICES, RACK_TYPE_CHOICES, RACK_WIDTH_CHOICES, Site,
STATUS_CHOICES, SUBDEVICE_ROLE_CHOICES, STATUS_CHOICES, SUBDEVICE_ROLE_CHOICES,
) )
from extras.api.serializers import CustomFieldValueSerializer from extras.api.serializers import CustomFieldModelSerializer
from tenancy.api.serializers import NestedTenantSerializer from tenancy.api.serializers import NestedTenantSerializer
from utilities.api import ChoiceFieldSerializer from utilities.api import ChoiceFieldSerializer
@ -17,15 +17,14 @@ from utilities.api import ChoiceFieldSerializer
# Sites # Sites
# #
class SiteSerializer(serializers.ModelSerializer): class SiteSerializer(CustomFieldModelSerializer):
tenant = NestedTenantSerializer() tenant = NestedTenantSerializer()
custom_field_values = CustomFieldValueSerializer(many=True)
class Meta: class Meta:
model = Site model = Site
fields = [ fields = [
'id', 'name', 'slug', 'tenant', 'facility', 'asn', 'physical_address', 'shipping_address', 'contact_name', 'id', 'name', 'slug', 'tenant', 'facility', 'asn', 'physical_address', 'shipping_address', 'contact_name',
'contact_phone', 'contact_email', 'comments', 'custom_field_values', 'count_prefixes', 'count_vlans', 'contact_phone', 'contact_email', 'comments', 'custom_fields', 'count_prefixes', 'count_vlans',
'count_racks', 'count_devices', 'count_circuits', 'count_racks', 'count_devices', 'count_circuits',
] ]
@ -99,20 +98,19 @@ class NestedRackRoleSerializer(serializers.ModelSerializer):
# #
class RackSerializer(serializers.ModelSerializer): class RackSerializer(CustomFieldModelSerializer):
site = NestedSiteSerializer() site = NestedSiteSerializer()
group = NestedRackGroupSerializer() group = NestedRackGroupSerializer()
tenant = NestedTenantSerializer() tenant = NestedTenantSerializer()
role = NestedRackRoleSerializer() role = NestedRackRoleSerializer()
type = ChoiceFieldSerializer(choices=RACK_TYPE_CHOICES) type = ChoiceFieldSerializer(choices=RACK_TYPE_CHOICES)
width = ChoiceFieldSerializer(choices=RACK_WIDTH_CHOICES) width = ChoiceFieldSerializer(choices=RACK_WIDTH_CHOICES)
custom_field_values = CustomFieldValueSerializer(many=True)
class Meta: class Meta:
model = Rack model = Rack
fields = [ fields = [
'id', 'name', 'facility_id', 'display_name', 'site', 'group', 'tenant', 'role', 'type', 'width', 'u_height', 'id', 'name', 'facility_id', 'display_name', 'site', 'group', 'tenant', 'role', 'type', 'width', 'u_height',
'desc_units', 'comments', 'custom_field_values', 'desc_units', 'comments', 'custom_fields',
] ]
@ -157,18 +155,17 @@ class NestedManufacturerSerializer(serializers.ModelSerializer):
# Device types # Device types
# #
class DeviceTypeSerializer(serializers.ModelSerializer): class DeviceTypeSerializer(CustomFieldModelSerializer):
manufacturer = NestedManufacturerSerializer() manufacturer = NestedManufacturerSerializer()
interface_ordering = ChoiceFieldSerializer(choices=IFACE_ORDERING_CHOICES) interface_ordering = ChoiceFieldSerializer(choices=IFACE_ORDERING_CHOICES)
subdevice_role = ChoiceFieldSerializer(choices=SUBDEVICE_ROLE_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)
class Meta: class Meta:
model = DeviceType model = DeviceType
fields = [ fields = [
'id', 'manufacturer', 'model', 'slug', 'part_number', 'u_height', 'is_full_depth', 'interface_ordering', 'id', 'manufacturer', 'model', 'slug', 'part_number', 'u_height', 'is_full_depth', 'interface_ordering',
'is_console_server', 'is_pdu', 'is_network_device', 'subdevice_role', 'comments', 'custom_field_values', 'is_console_server', 'is_pdu', 'is_network_device', 'subdevice_role', 'comments', 'custom_fields',
'instance_count', 'instance_count',
] ]
@ -358,7 +355,7 @@ class DeviceIPAddressSerializer(serializers.ModelSerializer):
fields = ['id', 'url', 'family', 'address'] fields = ['id', 'url', 'family', 'address']
class DeviceSerializer(serializers.ModelSerializer): class DeviceSerializer(CustomFieldModelSerializer):
device_type = NestedDeviceTypeSerializer() device_type = NestedDeviceTypeSerializer()
device_role = NestedDeviceRoleSerializer() device_role = NestedDeviceRoleSerializer()
tenant = NestedTenantSerializer() tenant = NestedTenantSerializer()
@ -370,14 +367,13 @@ class DeviceSerializer(serializers.ModelSerializer):
primary_ip4 = DeviceIPAddressSerializer() primary_ip4 = DeviceIPAddressSerializer()
primary_ip6 = DeviceIPAddressSerializer() primary_ip6 = DeviceIPAddressSerializer()
parent_device = serializers.SerializerMethodField() parent_device = serializers.SerializerMethodField()
custom_field_values = CustomFieldValueSerializer(many=True)
class Meta: class Meta:
model = Device model = Device
fields = [ fields = [
'id', 'name', 'display_name', 'device_type', 'device_role', 'tenant', 'platform', 'serial', 'asset_tag', 'id', 'name', 'display_name', 'device_type', 'device_role', 'tenant', 'platform', 'serial', 'asset_tag',
'rack', 'position', 'face', 'parent_device', 'status', 'primary_ip', 'primary_ip4', 'primary_ip6', 'rack', 'position', 'face', 'parent_device', 'status', 'primary_ip', 'primary_ip4', 'primary_ip6',
'comments', 'custom_field_values', 'comments', 'custom_fields',
] ]
def get_parent_device(self, obj): def get_parent_device(self, obj):

View File

@ -1,42 +1,37 @@
from django.contrib.contenttypes.models import ContentType
from rest_framework import serializers from rest_framework import serializers
from extras.models import CF_TYPE_SELECT, CustomFieldChoice, CustomFieldValue, Graph from extras.models import CustomField, CustomFieldChoice, Graph
# class CustomFieldSerializer(serializers.ModelSerializer): class CustomFieldSerializer(serializers.BaseSerializer):
# """ """
# Extends ModelSerializer to render any CustomFields and their values associated with an object. Extends ModelSerializer to render any CustomFields and their values associated with an object.
# """ """
# custom_fields = serializers.SerializerMethodField()
# def to_representation(self, manager):
# def get_custom_fields(self, obj):
# # Initialize custom fields dictionary
# # Gather all CustomFields applicable to this object data = {f.name: None for f in self.parent._custom_fields}
# fields = {cf.name: None for cf in self.context['custom_fields']}
# custom_field_choices = self.context['custom_field_choices'] # Assign CustomFieldValues from database
# for cfv in manager.all():
# # Attach any defined CustomFieldValues to their respective CustomFields data[cfv.field.name] = cfv.value
# for cfv in obj.custom_field_values.all():
# return data
# # Attempt to suppress database lookups for CustomFieldChoices by using the cached choice set from the view
# # context.
# if cfv.field.type == CF_TYPE_SELECT:
# cfc = {
# 'id': int(cfv.serialized_value),
# 'value': custom_field_choices[int(cfv.serialized_value)]
# }
# fields[cfv.field.name] = CustomFieldChoiceSerializer(instance=cfc).data
# else:
# fields[cfv.field.name] = cfv.value
#
# return fields
class CustomFieldValueSerializer(serializers.ModelSerializer): class CustomFieldModelSerializer(serializers.ModelSerializer):
custom_fields = CustomFieldSerializer(source='custom_field_values')
class Meta: def __init__(self, *args, **kwargs):
model = CustomFieldValue
fields = ['field', 'serialized_value'] super(CustomFieldModelSerializer, self).__init__(*args, **kwargs)
# Cache the list of custom fields for this model
content_type = ContentType.objects.get_for_model(self.Meta.model)
self._custom_fields = CustomField.objects.filter(obj_type=content_type)
class CustomFieldChoiceSerializer(serializers.ModelSerializer): class CustomFieldChoiceSerializer(serializers.ModelSerializer):

View File

@ -1,7 +1,7 @@
from rest_framework import serializers 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 CustomFieldModelSerializer
from ipam.models import ( from ipam.models import (
Aggregate, IPAddress, IPADDRESS_STATUS_CHOICES, IP_PROTOCOL_CHOICES, Prefix, PREFIX_STATUS_CHOICES, RIR, Role, Aggregate, IPAddress, IPADDRESS_STATUS_CHOICES, IP_PROTOCOL_CHOICES, Prefix, PREFIX_STATUS_CHOICES, RIR, Role,
Service, VLAN, VLAN_STATUS_CHOICES, VLANGroup, VRF, Service, VLAN, VLAN_STATUS_CHOICES, VLANGroup, VRF,
@ -14,13 +14,12 @@ from utilities.api import ChoiceFieldSerializer
# VRFs # VRFs
# #
class VRFSerializer(serializers.ModelSerializer): class VRFSerializer(CustomFieldModelSerializer):
tenant = NestedTenantSerializer() tenant = NestedTenantSerializer()
custom_field_values = CustomFieldValueSerializer(many=True)
class Meta: class Meta:
model = VRF model = VRF
fields = ['id', 'name', 'rd', 'tenant', 'enforce_unique', 'description', 'custom_field_values'] fields = ['id', 'name', 'rd', 'tenant', 'enforce_unique', 'description', 'custom_fields']
class NestedVRFSerializer(serializers.ModelSerializer): class NestedVRFSerializer(serializers.ModelSerializer):
@ -80,13 +79,12 @@ class NestedRIRSerializer(serializers.ModelSerializer):
# Aggregates # Aggregates
# #
class AggregateSerializer(serializers.ModelSerializer): class AggregateSerializer(CustomFieldModelSerializer):
rir = NestedRIRSerializer() rir = NestedRIRSerializer()
custom_field_values = CustomFieldValueSerializer(many=True)
class Meta: class Meta:
model = Aggregate model = Aggregate
fields = ['id', 'family', 'prefix', 'rir', 'date_added', 'description', 'custom_field_values'] fields = ['id', 'family', 'prefix', 'rir', 'date_added', 'description', 'custom_fields']
class NestedAggregateSerializer(serializers.ModelSerializer): class NestedAggregateSerializer(serializers.ModelSerializer):
@ -135,19 +133,18 @@ class WritableVLANGroupSerializer(serializers.ModelSerializer):
# VLANs # VLANs
# #
class VLANSerializer(serializers.ModelSerializer): class VLANSerializer(CustomFieldModelSerializer):
site = NestedSiteSerializer() site = NestedSiteSerializer()
group = NestedVLANGroupSerializer() group = NestedVLANGroupSerializer()
tenant = NestedTenantSerializer() tenant = NestedTenantSerializer()
status = ChoiceFieldSerializer(choices=VLAN_STATUS_CHOICES) status = ChoiceFieldSerializer(choices=VLAN_STATUS_CHOICES)
role = NestedRoleSerializer() role = NestedRoleSerializer()
custom_field_values = CustomFieldValueSerializer(many=True)
class Meta: class Meta:
model = VLAN model = VLAN
fields = [ fields = [
'id', 'site', 'group', 'vid', 'name', 'tenant', 'status', 'role', 'description', 'display_name', 'id', 'site', 'group', 'vid', 'name', 'tenant', 'status', 'role', 'description', 'display_name',
'custom_field_values', 'custom_fields',
] ]
@ -172,20 +169,19 @@ class WritableVLANSerializer(serializers.ModelSerializer):
# Prefixes # Prefixes
# #
class PrefixSerializer(serializers.ModelSerializer): class PrefixSerializer(CustomFieldModelSerializer):
site = NestedSiteSerializer() site = NestedSiteSerializer()
vrf = NestedVRFSerializer() vrf = NestedVRFSerializer()
tenant = NestedTenantSerializer() tenant = NestedTenantSerializer()
vlan = NestedVLANSerializer() vlan = NestedVLANSerializer()
status = ChoiceFieldSerializer(choices=PREFIX_STATUS_CHOICES) status = ChoiceFieldSerializer(choices=PREFIX_STATUS_CHOICES)
role = NestedRoleSerializer() role = NestedRoleSerializer()
custom_field_values = CustomFieldValueSerializer(many=True)
class Meta: class Meta:
model = Prefix model = Prefix
fields = [ fields = [
'id', 'family', 'prefix', 'site', 'vrf', 'tenant', 'vlan', 'status', 'role', 'is_pool', 'description', 'id', 'family', 'prefix', 'site', 'vrf', 'tenant', 'vlan', 'status', 'role', 'is_pool', 'description',
'custom_field_values', 'custom_fields',
] ]
@ -210,18 +206,17 @@ class WritablePrefixSerializer(serializers.ModelSerializer):
# IP addresses # IP addresses
# #
class IPAddressSerializer(serializers.ModelSerializer): class IPAddressSerializer(CustomFieldModelSerializer):
vrf = NestedVRFSerializer() vrf = NestedVRFSerializer()
tenant = NestedTenantSerializer() tenant = NestedTenantSerializer()
status = ChoiceFieldSerializer(choices=IPADDRESS_STATUS_CHOICES) status = ChoiceFieldSerializer(choices=IPADDRESS_STATUS_CHOICES)
interface = InterfaceSerializer() interface = InterfaceSerializer()
custom_field_values = CustomFieldValueSerializer(many=True)
class Meta: class Meta:
model = IPAddress model = IPAddress
fields = [ fields = [
'id', 'family', 'address', 'vrf', 'tenant', 'status', 'interface', 'description', 'nat_inside', 'id', 'family', 'address', 'vrf', 'tenant', 'status', 'interface', 'description', 'nat_inside',
'nat_outside', 'custom_field_values', 'nat_outside', 'custom_fields',
] ]

View File

@ -1,6 +1,6 @@
from rest_framework import serializers from rest_framework import serializers
from extras.api.serializers import CustomFieldValueSerializer from extras.api.serializers import CustomFieldModelSerializer
from tenancy.models import Tenant, TenantGroup from tenancy.models import Tenant, TenantGroup
@ -27,13 +27,12 @@ class NestedTenantGroupSerializer(serializers.ModelSerializer):
# Tenants # Tenants
# #
class TenantSerializer(serializers.ModelSerializer): class TenantSerializer(CustomFieldModelSerializer):
group = NestedTenantGroupSerializer() group = NestedTenantGroupSerializer()
custom_field_values = CustomFieldValueSerializer(many=True)
class Meta: class Meta:
model = Tenant model = Tenant
fields = ['id', 'name', 'slug', 'group', 'description', 'comments', 'custom_field_values'] fields = ['id', 'name', 'slug', 'group', 'description', 'comments', 'custom_fields']
class NestedTenantSerializer(serializers.ModelSerializer): class NestedTenantSerializer(serializers.ModelSerializer):