|
@@ -2,7 +2,7 @@ from __future__ import unicode_literals
|
|
|
|
|
|
import django_filters
|
|
import django_filters
|
|
from django.db.models import Q
|
|
from django.db.models import Q
|
|
-from netaddr import IPNetwork
|
|
|
|
|
|
+import netaddr
|
|
from netaddr.core import AddrFormatError
|
|
from netaddr.core import AddrFormatError
|
|
|
|
|
|
from dcim.models import Site, Device, Interface
|
|
from dcim.models import Site, Device, Interface
|
|
@@ -79,7 +79,7 @@ class AggregateFilter(CustomFieldFilterSet, django_filters.FilterSet):
|
|
return queryset
|
|
return queryset
|
|
qs_filter = Q(description__icontains=value)
|
|
qs_filter = Q(description__icontains=value)
|
|
try:
|
|
try:
|
|
- prefix = str(IPNetwork(value.strip()).cidr)
|
|
|
|
|
|
+ prefix = str(netaddr.IPNetwork(value.strip()).cidr)
|
|
qs_filter |= Q(prefix__net_contains_or_equals=prefix)
|
|
qs_filter |= Q(prefix__net_contains_or_equals=prefix)
|
|
except (AddrFormatError, ValueError):
|
|
except (AddrFormatError, ValueError):
|
|
pass
|
|
pass
|
|
@@ -107,6 +107,10 @@ class PrefixFilter(CustomFieldFilterSet, django_filters.FilterSet):
|
|
method='search_within_include',
|
|
method='search_within_include',
|
|
label='Within and including prefix',
|
|
label='Within and including prefix',
|
|
)
|
|
)
|
|
|
|
+ contains = django_filters.CharFilter(
|
|
|
|
+ method='search_contains',
|
|
|
|
+ label='Prefixes which contain this prefix or IP',
|
|
|
|
+ )
|
|
mask_length = django_filters.NumberFilter(
|
|
mask_length = django_filters.NumberFilter(
|
|
method='filter_mask_length',
|
|
method='filter_mask_length',
|
|
label='Mask length',
|
|
label='Mask length',
|
|
@@ -173,7 +177,7 @@ class PrefixFilter(CustomFieldFilterSet, django_filters.FilterSet):
|
|
return queryset
|
|
return queryset
|
|
qs_filter = Q(description__icontains=value)
|
|
qs_filter = Q(description__icontains=value)
|
|
try:
|
|
try:
|
|
- prefix = str(IPNetwork(value.strip()).cidr)
|
|
|
|
|
|
+ prefix = str(netaddr.IPNetwork(value.strip()).cidr)
|
|
qs_filter |= Q(prefix__net_contains_or_equals=prefix)
|
|
qs_filter |= Q(prefix__net_contains_or_equals=prefix)
|
|
except (AddrFormatError, ValueError):
|
|
except (AddrFormatError, ValueError):
|
|
pass
|
|
pass
|
|
@@ -184,7 +188,7 @@ class PrefixFilter(CustomFieldFilterSet, django_filters.FilterSet):
|
|
if not value:
|
|
if not value:
|
|
return queryset
|
|
return queryset
|
|
try:
|
|
try:
|
|
- query = str(IPNetwork(value).cidr)
|
|
|
|
|
|
+ query = str(netaddr.IPNetwork(value).cidr)
|
|
return queryset.filter(prefix__net_contained=query)
|
|
return queryset.filter(prefix__net_contained=query)
|
|
except (AddrFormatError, ValueError):
|
|
except (AddrFormatError, ValueError):
|
|
return queryset.none()
|
|
return queryset.none()
|
|
@@ -194,11 +198,25 @@ class PrefixFilter(CustomFieldFilterSet, django_filters.FilterSet):
|
|
if not value:
|
|
if not value:
|
|
return queryset
|
|
return queryset
|
|
try:
|
|
try:
|
|
- query = str(IPNetwork(value).cidr)
|
|
|
|
|
|
+ query = str(netaddr.IPNetwork(value).cidr)
|
|
return queryset.filter(prefix__net_contained_or_equal=query)
|
|
return queryset.filter(prefix__net_contained_or_equal=query)
|
|
except (AddrFormatError, ValueError):
|
|
except (AddrFormatError, ValueError):
|
|
return queryset.none()
|
|
return queryset.none()
|
|
|
|
|
|
|
|
+ def search_contains(self, queryset, name, value):
|
|
|
|
+ value = value.strip()
|
|
|
|
+ if not value:
|
|
|
|
+ return queryset
|
|
|
|
+ try:
|
|
|
|
+ # Searching by prefix
|
|
|
|
+ if '/' in value:
|
|
|
|
+ return queryset.filter(prefix__net_contains_or_equals=str(netaddr.IPNetwork(value).cidr))
|
|
|
|
+ # Searching by IP address
|
|
|
|
+ else:
|
|
|
|
+ return queryset.filter(prefix__net_contains=str(netaddr.IPAddress(value)))
|
|
|
|
+ except (AddrFormatError, ValueError):
|
|
|
|
+ return queryset.none()
|
|
|
|
+
|
|
def filter_mask_length(self, queryset, name, value):
|
|
def filter_mask_length(self, queryset, name, value):
|
|
if not value:
|
|
if not value:
|
|
return queryset
|
|
return queryset
|
|
@@ -291,7 +309,7 @@ class IPAddressFilter(CustomFieldFilterSet, django_filters.FilterSet):
|
|
if not value:
|
|
if not value:
|
|
return queryset
|
|
return queryset
|
|
try:
|
|
try:
|
|
- query = str(IPNetwork(value.strip()).cidr)
|
|
|
|
|
|
+ query = str(netaddr.IPNetwork(value.strip()).cidr)
|
|
return queryset.filter(address__net_host_contained=query)
|
|
return queryset.filter(address__net_host_contained=query)
|
|
except (AddrFormatError, ValueError):
|
|
except (AddrFormatError, ValueError):
|
|
return queryset.none()
|
|
return queryset.none()
|