From 5187138547f561ce68137b633a82e5a242064585 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 4 Apr 2017 11:25:23 -0400 Subject: [PATCH] Refactored custom field serializers --- netbox/extras/api/customfields.py | 47 ++++++++++++++++--------------- 1 file changed, 25 insertions(+), 22 deletions(-) diff --git a/netbox/extras/api/customfields.py b/netbox/extras/api/customfields.py index e55aad3a7..70f35d036 100644 --- a/netbox/extras/api/customfields.py +++ b/netbox/extras/api/customfields.py @@ -2,47 +2,50 @@ from django.contrib.contenttypes.models import ContentType from rest_framework import serializers -from extras.models import CF_TYPE_SELECT, CustomField, CustomFieldChoice +from extras.models import CF_TYPE_SELECT, CustomField, CustomFieldChoice, CustomFieldValue # # Custom fields # -class CustomFieldSerializer(serializers.BaseSerializer): - """ - Extends ModelSerializer to render any CustomFields and their values associated with an object. - """ +class CustomFieldsSerializer(serializers.BaseSerializer): - 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(): - if cfv.field.type == CF_TYPE_SELECT: - data[cfv.field.name] = CustomFieldChoiceSerializer(cfv.value).data - else: - data[cfv.field.name] = cfv.value - - return data + def to_representation(self, obj): + return obj class CustomFieldModelSerializer(serializers.ModelSerializer): - custom_fields = CustomFieldSerializer(source='custom_field_values') + """ + Extends ModelSerializer to render any CustomFields and their values associated with an object. + """ + custom_fields = CustomFieldsSerializer() def __init__(self, *args, **kwargs): super(CustomFieldModelSerializer, self).__init__(*args, **kwargs) - # Cache the list of custom fields for this model + # Retrieve the set of CustomFields which apply to this type of object content_type = ContentType.objects.get_for_model(self.Meta.model) - self._custom_fields = CustomField.objects.filter(obj_type=content_type) + custom_fields = {f.name: None for f in CustomField.objects.filter(obj_type=content_type)} + + # Assign CustomFieldValues from database + for cfv in self.instance.custom_field_values.all(): + if cfv.field.type == CF_TYPE_SELECT: + custom_fields[cfv.field.name] = CustomFieldChoiceSerializer(cfv.value).data + else: + custom_fields[cfv.field.name] = cfv.value + + self.instance.custom_fields = custom_fields class CustomFieldChoiceSerializer(serializers.ModelSerializer): + """ + Imitate utilities.api.ChoiceFieldSerializer + """ + value = serializers.IntegerField(source='pk') + label = serializers.CharField(source='value') class Meta: model = CustomFieldChoice - fields = ['id', 'value'] + fields = ['value', 'label']