Пример #1
0
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"]
Пример #2
0
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
Пример #3
0
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