From fed6fc131b64303179f305283cb39c54b9b7f9a8 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 5 Dec 2017 16:10:45 -0500 Subject: [PATCH] Fixes #1751: Corrected filtering for IPv6 addresses containing letters --- netbox/ipam/fields.py | 55 +++++++++++++++++++++--------------------- netbox/ipam/lookups.py | 22 +++++++++++++---- 2 files changed, 44 insertions(+), 33 deletions(-) diff --git a/netbox/ipam/fields.py b/netbox/ipam/fields.py index 39895b52a..e0842d10b 100644 --- a/netbox/ipam/fields.py +++ b/netbox/ipam/fields.py @@ -5,10 +5,7 @@ from django.db import models from netaddr import IPNetwork from .formfields import IPFormField -from .lookups import ( - EndsWith, IEndsWith, IRegex, IStartsWith, NetContained, NetContainedOrEqual, NetContains, NetContainsOrEquals, - NetHost, NetHostContained, NetMaskLength, Regex, StartsWith, -) +from . import lookups def prefix_validator(prefix): @@ -57,17 +54,18 @@ class IPNetworkField(BaseIPField): return 'cidr' -IPNetworkField.register_lookup(EndsWith) -IPNetworkField.register_lookup(IEndsWith) -IPNetworkField.register_lookup(StartsWith) -IPNetworkField.register_lookup(IStartsWith) -IPNetworkField.register_lookup(Regex) -IPNetworkField.register_lookup(IRegex) -IPNetworkField.register_lookup(NetContained) -IPNetworkField.register_lookup(NetContainedOrEqual) -IPNetworkField.register_lookup(NetContains) -IPNetworkField.register_lookup(NetContainsOrEquals) -IPNetworkField.register_lookup(NetMaskLength) +IPNetworkField.register_lookup(lookups.IExact) +IPNetworkField.register_lookup(lookups.EndsWith) +IPNetworkField.register_lookup(lookups.IEndsWith) +IPNetworkField.register_lookup(lookups.StartsWith) +IPNetworkField.register_lookup(lookups.IStartsWith) +IPNetworkField.register_lookup(lookups.Regex) +IPNetworkField.register_lookup(lookups.IRegex) +IPNetworkField.register_lookup(lookups.NetContained) +IPNetworkField.register_lookup(lookups.NetContainedOrEqual) +IPNetworkField.register_lookup(lookups.NetContains) +IPNetworkField.register_lookup(lookups.NetContainsOrEquals) +IPNetworkField.register_lookup(lookups.NetMaskLength) class IPAddressField(BaseIPField): @@ -80,16 +78,17 @@ class IPAddressField(BaseIPField): return 'inet' -IPAddressField.register_lookup(EndsWith) -IPAddressField.register_lookup(IEndsWith) -IPAddressField.register_lookup(StartsWith) -IPAddressField.register_lookup(IStartsWith) -IPAddressField.register_lookup(Regex) -IPAddressField.register_lookup(IRegex) -IPAddressField.register_lookup(NetContained) -IPAddressField.register_lookup(NetContainedOrEqual) -IPAddressField.register_lookup(NetContains) -IPAddressField.register_lookup(NetContainsOrEquals) -IPAddressField.register_lookup(NetHost) -IPAddressField.register_lookup(NetHostContained) -IPAddressField.register_lookup(NetMaskLength) +IPAddressField.register_lookup(lookups.IExact) +IPAddressField.register_lookup(lookups.EndsWith) +IPAddressField.register_lookup(lookups.IEndsWith) +IPAddressField.register_lookup(lookups.StartsWith) +IPAddressField.register_lookup(lookups.IStartsWith) +IPAddressField.register_lookup(lookups.Regex) +IPAddressField.register_lookup(lookups.IRegex) +IPAddressField.register_lookup(lookups.NetContained) +IPAddressField.register_lookup(lookups.NetContainedOrEqual) +IPAddressField.register_lookup(lookups.NetContains) +IPAddressField.register_lookup(lookups.NetContainsOrEquals) +IPAddressField.register_lookup(lookups.NetHost) +IPAddressField.register_lookup(lookups.NetHostContained) +IPAddressField.register_lookup(lookups.NetMaskLength) diff --git a/netbox/ipam/lookups.py b/netbox/ipam/lookups.py index 59cd91ed8..9aca3c03b 100644 --- a/netbox/ipam/lookups.py +++ b/netbox/ipam/lookups.py @@ -13,12 +13,21 @@ class NetFieldDecoratorMixin(object): return lhs_string, lhs_params +class IExact(NetFieldDecoratorMixin, lookups.IExact): + + def get_rhs_op(self, connection, rhs): + return '= LOWER(%s)' % rhs + + class EndsWith(NetFieldDecoratorMixin, lookups.EndsWith): - lookup_name = 'endswith' + pass class IEndsWith(NetFieldDecoratorMixin, lookups.IEndsWith): - lookup_name = 'iendswith' + pass + + def get_rhs_op(self, connection, rhs): + return 'LIKE LOWER(%s)' % rhs class StartsWith(NetFieldDecoratorMixin, lookups.StartsWith): @@ -26,15 +35,18 @@ class StartsWith(NetFieldDecoratorMixin, lookups.StartsWith): class IStartsWith(NetFieldDecoratorMixin, lookups.IStartsWith): - lookup_name = 'istartswith' + pass + + def get_rhs_op(self, connection, rhs): + return 'LIKE LOWER(%s)' % rhs class Regex(NetFieldDecoratorMixin, lookups.Regex): - lookup_name = 'regex' + pass class IRegex(NetFieldDecoratorMixin, lookups.IRegex): - lookup_name = 'iregex' + pass class NetContainsOrEquals(Lookup):