Skip to content

Commit bb6b4d0

Browse files
12553 prefix serializer to IPAddress (#13592)
* 12553 prefix serializer to IPAddress * Introduce IPNetworkField to handle prefix serialization --------- Co-authored-by: Jeremy Stretch <[email protected]>
1 parent 2d1457b commit bb6b4d0

File tree

2 files changed

+30
-16
lines changed

2 files changed

+30
-16
lines changed

netbox/ipam/api/field_serializers.py

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,18 @@
11
from django.utils.translation import gettext_lazy as _
22
from rest_framework import serializers
33

4-
from ipam import models
54
from netaddr import AddrFormatError, IPNetwork
65

7-
__all__ = [
6+
__all__ = (
87
'IPAddressField',
9-
]
8+
'IPNetworkField',
9+
)
1010

1111

12-
#
13-
# IP address field
14-
#
15-
1612
class IPAddressField(serializers.CharField):
17-
"""IPAddressField with mask"""
18-
13+
"""
14+
An IPv4 or IPv6 address with optional mask
15+
"""
1916
default_error_messages = {
2017
'invalid': _('Enter a valid IPv4 or IPv6 address with optional mask.'),
2118
}
@@ -24,7 +21,27 @@ def to_internal_value(self, data):
2421
try:
2522
return IPNetwork(data)
2623
except AddrFormatError:
27-
raise serializers.ValidationError("Invalid IP address format: {}".format(data))
24+
raise serializers.ValidationError(_("Invalid IP address format: {data}").format(data))
25+
except (TypeError, ValueError) as e:
26+
raise serializers.ValidationError(e)
27+
28+
def to_representation(self, value):
29+
return str(value)
30+
31+
32+
class IPNetworkField(serializers.CharField):
33+
"""
34+
An IPv4 or IPv6 prefix
35+
"""
36+
default_error_messages = {
37+
'invalid': _('Enter a valid IPv4 or IPv6 prefix and mask in CIDR notation.'),
38+
}
39+
40+
def to_internal_value(self, data):
41+
try:
42+
return IPNetwork(data)
43+
except AddrFormatError:
44+
raise serializers.ValidationError(_("Invalid IP prefix format: {data}").format(data))
2845
except (TypeError, ValueError) as e:
2946
raise serializers.ValidationError(e)
3047

netbox/ipam/api/serializers.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
from utilities.api import get_serializer_for_model
1414
from virtualization.api.nested_serializers import NestedVirtualMachineSerializer
1515
from .nested_serializers import *
16-
from .field_serializers import IPAddressField
16+
from .field_serializers import IPAddressField, IPNetworkField
1717

1818

1919
#
@@ -138,15 +138,14 @@ class AggregateSerializer(NetBoxModelSerializer):
138138
family = ChoiceField(choices=IPAddressFamilyChoices, read_only=True)
139139
rir = NestedRIRSerializer()
140140
tenant = NestedTenantSerializer(required=False, allow_null=True)
141-
prefix = serializers.CharField()
141+
prefix = IPNetworkField()
142142

143143
class Meta:
144144
model = Aggregate
145145
fields = [
146146
'id', 'url', 'display', 'family', 'prefix', 'rir', 'tenant', 'date_added', 'description', 'comments',
147147
'tags', 'custom_fields', 'created', 'last_updated',
148148
]
149-
read_only_fields = ['family']
150149

151150

152151
#
@@ -306,7 +305,7 @@ class PrefixSerializer(NetBoxModelSerializer):
306305
role = NestedRoleSerializer(required=False, allow_null=True)
307306
children = serializers.IntegerField(read_only=True)
308307
_depth = serializers.IntegerField(read_only=True)
309-
prefix = serializers.CharField()
308+
prefix = IPNetworkField()
310309

311310
class Meta:
312311
model = Prefix
@@ -315,7 +314,6 @@ class Meta:
315314
'mark_utilized', 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', 'children',
316315
'_depth',
317316
]
318-
read_only_fields = ['family']
319317

320318

321319
class PrefixLengthSerializer(serializers.Serializer):
@@ -386,7 +384,6 @@ class Meta:
386384
'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated',
387385
'mark_utilized', 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated',
388386
]
389-
read_only_fields = ['family']
390387

391388

392389
#

0 commit comments

Comments
 (0)