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

Moved custom field serializers to their own module to avoid circular dependency

This commit is contained in:
Jeremy Stretch
2017-03-08 16:18:41 -05:00
parent f43fbffdf7
commit a6ceaf8d96
6 changed files with 53 additions and 50 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 CustomFieldModelSerializer from extras.api.customfields import CustomFieldModelSerializer
from tenancy.api.serializers import NestedTenantSerializer from tenancy.api.serializers import NestedTenantSerializer

View File

@ -8,7 +8,7 @@ from dcim.models import (
PowerPortTemplate, Rack, RackGroup, RackReservation, RackRole, RACK_FACE_CHOICES, RACK_TYPE_CHOICES, PowerPortTemplate, Rack, RackGroup, RackReservation, RackRole, RACK_FACE_CHOICES, RACK_TYPE_CHOICES,
RACK_WIDTH_CHOICES, Region, Site, STATUS_CHOICES, SUBDEVICE_ROLE_CHOICES, RACK_WIDTH_CHOICES, Region, Site, STATUS_CHOICES, SUBDEVICE_ROLE_CHOICES,
) )
from extras.api.serializers import CustomFieldModelSerializer from extras.api.customfields import CustomFieldModelSerializer
from tenancy.api.serializers import NestedTenantSerializer from tenancy.api.serializers import NestedTenantSerializer
from utilities.api import ChoiceFieldSerializer from utilities.api import ChoiceFieldSerializer

View File

@ -0,0 +1,45 @@
from django.contrib.contenttypes.models import ContentType
from rest_framework import serializers
from extras.models import CustomField, CustomFieldChoice
#
# Custom fields
#
class CustomFieldSerializer(serializers.BaseSerializer):
"""
Extends ModelSerializer to render any CustomFields and their values associated with an object.
"""
def to_representation(self, manager):
# Initialize custom fields dictionary
data = {f.name: None for f in self.parent._custom_fields}
# Assign CustomFieldValues from database
for cfv in manager.all():
data[cfv.field.name] = cfv.value
return data
class CustomFieldModelSerializer(serializers.ModelSerializer):
custom_fields = CustomFieldSerializer(source='custom_field_values')
def __init__(self, *args, **kwargs):
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 Meta:
model = CustomFieldChoice
fields = ['id', 'value']

View File

@ -1,49 +1,7 @@
from django.contrib.contenttypes.models import ContentType
from rest_framework import serializers from rest_framework import serializers
# from dcim.api.serializers import NestedSiteSerializer from dcim.api.serializers import NestedSiteSerializer
from extras.models import CustomField, CustomFieldChoice, Graph, TopologyMap from extras.models import Graph, TopologyMap
#
# Custom fields
#
class CustomFieldSerializer(serializers.BaseSerializer):
"""
Extends ModelSerializer to render any CustomFields and their values associated with an object.
"""
def to_representation(self, manager):
# Initialize custom fields dictionary
data = {f.name: None for f in self.parent._custom_fields}
# Assign CustomFieldValues from database
for cfv in manager.all():
data[cfv.field.name] = cfv.value
return data
class CustomFieldModelSerializer(serializers.ModelSerializer):
custom_fields = CustomFieldSerializer(source='custom_field_values')
def __init__(self, *args, **kwargs):
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 Meta:
model = CustomFieldChoice
fields = ['id', 'value']
# #
@ -69,8 +27,8 @@ class GraphSerializer(serializers.ModelSerializer):
# Topology maps # Topology maps
# #
class TopologyMapSerializer(CustomFieldModelSerializer): class TopologyMapSerializer(serializers.ModelSerializer):
# site = NestedSiteSerializer() site = NestedSiteSerializer()
class Meta: class Meta:
model = TopologyMap model = TopologyMap

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 CustomFieldModelSerializer from extras.api.customfields 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,

View File

@ -1,6 +1,6 @@
from rest_framework import serializers from rest_framework import serializers
from extras.api.serializers import CustomFieldModelSerializer from extras.api.customfields import CustomFieldModelSerializer
from tenancy.models import Tenant, TenantGroup from tenancy.models import Tenant, TenantGroup