Add HostAsInet(Transform) to perform cast

This commit is contained in:
Brian Tiemann 2024-09-11 15:47:37 -04:00
parent d4a910e06a
commit 789ca6b560
3 changed files with 9 additions and 3 deletions

View File

@ -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):

View File

@ -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'

View File

@ -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(