class AggregateSerializer(TaggedObjectSerializer, CustomFieldModelSerializer): url = serializers.HyperlinkedIdentityField(view_name="ipam-api:aggregate-detail") family = ChoiceField(choices=IPAddressFamilyChoices, read_only=True) prefix = IPFieldSerializer() rir = NestedRIRSerializer() tenant = NestedTenantSerializer(required=False, allow_null=True) class Meta: model = Aggregate fields = [ "id", "url", "family", "prefix", "rir", "tenant", "date_added", "description", "tags", "custom_fields", "created", "last_updated", ] read_only_fields = ["family"]
class DeviceSerializer(TaggedObjectSerializer, StatusModelSerializerMixin, CustomFieldModelSerializer): url = serializers.HyperlinkedIdentityField( view_name="dcim-api:device-detail") device_type = NestedDeviceTypeSerializer() device_role = NestedDeviceRoleSerializer() tenant = NestedTenantSerializer(required=False, allow_null=True) platform = NestedPlatformSerializer(required=False, allow_null=True) site = NestedSiteSerializer() rack = NestedRackSerializer(required=False, allow_null=True) face = ChoiceField(choices=DeviceFaceChoices, allow_blank=True, required=False) primary_ip = NestedIPAddressSerializer(read_only=True) primary_ip4 = NestedIPAddressSerializer(required=False, allow_null=True) primary_ip6 = NestedIPAddressSerializer(required=False, allow_null=True) parent_device = serializers.SerializerMethodField() cluster = NestedClusterSerializer(required=False, allow_null=True) virtual_chassis = NestedVirtualChassisSerializer(required=False, allow_null=True) local_context_schema = NestedConfigContextSchemaSerializer(required=False, allow_null=True) class Meta: model = Device fields = [ "id", "url", "name", "device_type", "device_role", "tenant", "platform", "serial", "asset_tag", "site", "rack", "position", "face", "parent_device", "status", "primary_ip", "primary_ip4", "primary_ip6", "cluster", "virtual_chassis", "vc_position", "vc_priority", "comments", "local_context_schema", "local_context_data", "tags", "custom_fields", "created", "last_updated", "computed_fields", ] opt_in_fields = ["computed_fields"] validators = [] def validate(self, data): # Validate uniqueness of (rack, position, face) since we omitted the automatically-created validator from Meta. if data.get("rack") and data.get("position") and data.get("face"): validator = UniqueTogetherValidator(queryset=Device.objects.all(), fields=("rack", "position", "face")) validator(data, self) # Enforce model validation super().validate(data) return data @swagger_serializer_method(serializer_or_field=NestedDeviceSerializer) def get_parent_device(self, obj): try: device_bay = obj.parent_bay except DeviceBay.DoesNotExist: return None context = {"request": self.context["request"]} data = NestedDeviceSerializer(instance=device_bay.device, context=context).data data["device_bay"] = NestedDeviceBaySerializer(instance=device_bay, context=context).data return data
class RackSerializer(TaggedObjectSerializer, StatusModelSerializerMixin, CustomFieldModelSerializer): url = serializers.HyperlinkedIdentityField( view_name="dcim-api:rack-detail") site = NestedSiteSerializer() group = NestedRackGroupSerializer(required=False, allow_null=True, default=None) tenant = NestedTenantSerializer(required=False, allow_null=True) role = NestedRackRoleSerializer(required=False, allow_null=True) type = ChoiceField(choices=RackTypeChoices, allow_blank=True, required=False) width = ChoiceField(choices=RackWidthChoices, required=False) outer_unit = ChoiceField(choices=RackDimensionUnitChoices, allow_blank=True, required=False) device_count = serializers.IntegerField(read_only=True) powerfeed_count = serializers.IntegerField(read_only=True) class Meta: model = Rack fields = [ "id", "url", "name", "facility_id", "site", "group", "tenant", "status", "role", "serial", "asset_tag", "type", "width", "u_height", "desc_units", "outer_width", "outer_depth", "outer_unit", "comments", "tags", "custom_fields", "created", "last_updated", "device_count", "powerfeed_count", "computed_fields", ] # Omit the UniqueTogetherValidator that would be automatically added to validate (group, facility_id). This # prevents facility_id from being interpreted as a required field. validators = [ UniqueTogetherValidator(queryset=Rack.objects.all(), fields=("group", "name")) ] opt_in_fields = ["computed_fields"] def validate(self, data): # Validate uniqueness of (group, facility_id) since we omitted the automatically-created validator from Meta. if data.get("facility_id", None): validator = UniqueTogetherValidator(queryset=Rack.objects.all(), fields=("group", "facility_id")) validator(data, self) # Enforce model validation super().validate(data) return data