mirror of
https://github.com/netbox-community/netbox.git
synced 2025-07-25 01:48:38 -06:00
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:
parent
d4f8cb72aa
commit
1777d4228e
@ -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')
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user