From 789ca6b560b18777ad47898539fcbee7c4cbac26 Mon Sep 17 00:00:00 2001 From: Brian Tiemann Date: Wed, 11 Sep 2024 15:47:37 -0400 Subject: [PATCH] Add HostAsInet(Transform) to perform cast --- netbox/ipam/fields.py | 1 + netbox/ipam/lookups.py | 5 +++++ netbox/ipam/models/ip.py | 6 +++--- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/netbox/ipam/fields.py b/netbox/ipam/fields.py index a8682e600..99dff081a 100644 --- a/netbox/ipam/fields.py +++ b/netbox/ipam/fields.py @@ -109,6 +109,7 @@ IPAddressField.register_lookup(lookups.NetHostLessThan) IPAddressField.register_lookup(lookups.NetHostLessThanOrEqual) IPAddressField.register_lookup(lookups.NetHostGreaterThan) IPAddressField.register_lookup(lookups.NetHostGreaterThanOrEqual) +IPAddressField.register_lookup(lookups.HostAsInet) class ASNField(models.BigIntegerField): diff --git a/netbox/ipam/lookups.py b/netbox/ipam/lookups.py index 38cbbc8cf..4bb8e9b8d 100644 --- a/netbox/ipam/lookups.py +++ b/netbox/ipam/lookups.py @@ -207,6 +207,11 @@ class Host(Transform): lookup_name = 'host' +class HostAsInet(Transform): + lookup_name = 'host_as_inet' + template = 'CAST(HOST( %(expressions)s ) AS INET)' + + class Inet(Transform): function = 'INET' lookup_name = 'inet' diff --git a/netbox/ipam/models/ip.py b/netbox/ipam/models/ip.py index 09d0ba1e4..d6b563f72 100644 --- a/netbox/ipam/models/ip.py +++ b/netbox/ipam/models/ip.py @@ -581,9 +581,9 @@ class IPRange(ContactsMixin, PrimaryModel): # Check for overlapping ranges overlapping_ranges = IPRange.objects.exclude(pk=self.pk).filter(vrf=self.vrf).filter( - Q(start_address__net_host_gte=self.start_address.ip, start_address__net_host_lte=self.end_address.ip) | # Starts inside - Q(end_address__net_host_gte=self.start_address.ip, end_address__net_host_lte=self.end_address.ip) | # Ends inside - Q(start_address__net_host_lte=self.start_address.ip, end_address__net_host_gte=self.end_address.ip) # Starts & ends outside + Q(start_address__host_as_inet__gte=self.start_address.ip, start_address__host_as_inet__lte=self.end_address.ip) | # Starts inside + Q(end_address__host_as_inet__gte=self.start_address.ip, end_address__host_as_inet__lte=self.end_address.ip) | # Ends inside + Q(start_address__host_as_inet__lte=self.start_address.ip, end_address__host_as_inet__gte=self.end_address.ip) # Starts & ends outside ) if overlapping_ranges.exists(): raise ValidationError(