Work on 11507

* Add `rir` property method to model
* Add `aggregate` property method to model
* Add `rir` attribute to serializer
* Add `aggregate` attribute to serializer
* Add test for both rir and aggregate fields on API
This commit is contained in:
Daniel Sheppard 2025-03-17 21:52:08 -05:00
parent d4f8cb72aa
commit 1777d4228e
3 changed files with 41 additions and 3 deletions

View File

@ -44,6 +44,8 @@ class AggregateSerializer(NetBoxModelSerializer):
class PrefixSerializer(NetBoxModelSerializer):
aggregate = AggregateSerializer(nested=True, read_only=True, allow_null=True)
rir = RIRSerializer(nested=True, read_only=True, allow_null=True)
family = ChoiceField(choices=IPAddressFamilyChoices, read_only=True)
vrf = VRFSerializer(nested=True, required=False, allow_null=True)
scope_type = ContentTypeField(
@ -67,9 +69,9 @@ class PrefixSerializer(NetBoxModelSerializer):
class Meta:
model = Prefix
fields = [
'id', 'url', 'display_url', 'display', 'family', 'prefix', 'vrf', 'scope_type', 'scope_id', 'scope',
'tenant', 'vlan', 'status', 'role', 'is_pool', 'mark_utilized', 'description', 'comments', 'tags',
'custom_fields', 'created', 'last_updated', 'children', '_depth',
'id', 'url', 'display_url', 'display', 'aggregate', 'rir', 'family', 'prefix', 'vrf', 'scope_type',
'scope_id', 'scope', 'tenant', 'vlan', 'status', 'role', 'is_pool', 'mark_utilized', 'description',
'comments', 'tags', 'custom_fields', 'created', 'last_updated', 'children', '_depth',
]
brief_fields = ('id', 'url', 'display', 'family', 'prefix', 'description', '_depth')

View File

@ -322,6 +322,15 @@ class Prefix(ContactsMixin, GetAvailablePrefixesMixin, CachedScopeMixin, Primary
super().save(*args, **kwargs)
@property
def aggregate(self):
return Aggregate.objects.filter(prefix__net_contains_or_equals=self.prefix).first()
@property
def rir(self):
aggregate = self.aggregate
return aggregate.rir if aggregate else None
@property
def family(self):
return self.prefix.version if self.prefix else None

View File

@ -532,6 +532,33 @@ class PrefixTest(APIViewTestCases.APIViewTestCase):
self.assertHttpStatus(response, status.HTTP_201_CREATED)
self.assertEqual(len(response.data), 8)
def test_get_prefix_with_aggregate_and_rir(self):
self.add_permissions('ipam.view_prefix')
rir = RIR.objects.create(name='RFC 1918', slug='rfc-1918')
aggregate = Aggregate.objects.create(prefix=IPNetwork('192.168.0.0/16'), rir=rir)
prefixes = [
Prefix.objects.filter(prefix=IPNetwork('192.168.2.0/24')).first(),
Prefix.objects.create(prefix=IPNetwork('10.0.0.0/24'))
]
self.assertIsNotNone(prefixes[0])
url = self._get_detail_url(prefixes[0])
response = self.client.get(url, **self.header)
self.assertIsNotNone(prefixes[0].aggregate)
self.assertHttpStatus(response, status.HTTP_200_OK)
self.assertIsNotNone(response.data.get('aggregate'))
self.assertIsNotNone(response.data.get('rir'))
self.assertEqual(response.data.get('aggregate').get('id', None), aggregate.pk)
self.assertEqual(response.data.get('rir').get('id', None), rir.pk)
url = self._get_detail_url(prefixes[1])
response = self.client.get(url, **self.header)
self.assertIsNone(prefixes[1].aggregate)
self.assertHttpStatus(response, status.HTTP_200_OK)
self.assertIsNone(response.data.get('aggregate'))
self.assertIsNone(response.data.get('rir'))
class IPRangeTest(APIViewTestCases.APIViewTestCase):
model = IPRange