From c084547dca8a07d339b39aefdaa875f841bd08bb Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 14 Jan 2020 12:07:45 -0500 Subject: [PATCH] Move IPAddressManager to a separate file --- netbox/ipam/managers.py | 16 ++++++++++++++++ netbox/ipam/models.py | 16 +--------------- 2 files changed, 17 insertions(+), 15 deletions(-) create mode 100644 netbox/ipam/managers.py diff --git a/netbox/ipam/managers.py b/netbox/ipam/managers.py new file mode 100644 index 000000000..8aebc60ce --- /dev/null +++ b/netbox/ipam/managers.py @@ -0,0 +1,16 @@ +from django.db import models +from django.db.models.expressions import RawSQL + + +class IPAddressManager(models.Manager): + + def get_queryset(self): + """ + By default, PostgreSQL will order INETs with shorter (larger) prefix lengths ahead of those with longer + (smaller) masks. This makes no sense when ordering IPs, which should be ordered solely by family and host + address. We can use HOST() to extract just the host portion of the address (ignoring its mask), but we must + then re-cast this value to INET() so that records will be ordered properly. We are essentially re-casting each + IP address as a /32 or /128. + """ + qs = super().get_queryset() + return qs.annotate(host=RawSQL('INET(HOST(ipam_ipaddress.address))', [])).order_by('family', 'host') diff --git a/netbox/ipam/models.py b/netbox/ipam/models.py index 988416e28..5c2a75482 100644 --- a/netbox/ipam/models.py +++ b/netbox/ipam/models.py @@ -5,7 +5,6 @@ from django.core.exceptions import ValidationError, ObjectDoesNotExist from django.core.validators import MaxValueValidator, MinValueValidator from django.db import models from django.db.models import F, Q -from django.db.models.expressions import RawSQL from django.urls import reverse from taggit.managers import TaggableManager @@ -17,6 +16,7 @@ from virtualization.models import VirtualMachine from .choices import * from .constants import IPADDRESS_ROLES_NONUNIQUE from .fields import IPNetworkField, IPAddressField +from .managers import IPAddressManager from .querysets import PrefixQuerySet from .validators import DNSValidator @@ -558,20 +558,6 @@ class Prefix(ChangeLoggedModel, CustomFieldModel): return int(float(child_count) / prefix_size * 100) -class IPAddressManager(models.Manager): - - def get_queryset(self): - """ - By default, PostgreSQL will order INETs with shorter (larger) prefix lengths ahead of those with longer - (smaller) masks. This makes no sense when ordering IPs, which should be ordered solely by family and host - address. We can use HOST() to extract just the host portion of the address (ignoring its mask), but we must - then re-cast this value to INET() so that records will be ordered properly. We are essentially re-casting each - IP address as a /32 or /128. - """ - qs = super().get_queryset() - return qs.annotate(host=RawSQL('INET(HOST(ipam_ipaddress.address))', [])).order_by('family', 'host') - - class IPAddress(ChangeLoggedModel, CustomFieldModel): """ An IPAddress represents an individual IPv4 or IPv6 address and its mask. The mask length should match what is